All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Andrey Vagin <avagin@openvz.org>
To: linux-kernel@vger.kernel.org
Cc: linux-api@vger.kernel.org, Andrey Vagin <avagin@openvz.org>,
	Oleg Nesterov <oleg@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Cyrill Gorcunov <gorcunov@openvz.org>,
	Pavel Emelyanov <xemul@parallels.com>,
	Roger Luethi <rl@hellgate.ch>, Arnd Bergmann <arnd@arndb.de>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	David Ahern <dsahern@gmail.com>,
	Andy Lutomirski <luto@amacapital.net>,
	Pavel Odintsov <pavel.odintsov@gmail.com>
Subject: [PATCH 08/24] proc: pick out a function to iterate task children
Date: Mon,  6 Jul 2015 11:47:09 +0300	[thread overview]
Message-ID: <1436172445-6979-9-git-send-email-avagin@openvz.org> (raw)
In-Reply-To: <1436172445-6979-1-git-send-email-avagin@openvz.org>

This function will be used in task_diag.

Signed-off-by: Andrey Vagin <avagin@openvz.org>
---
 fs/proc/array.c | 67 ++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 40 insertions(+), 27 deletions(-)

diff --git a/fs/proc/array.c b/fs/proc/array.c
index ce065cf..52c4a7b 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -578,31 +578,26 @@ int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns,
 }
 
 #ifdef CONFIG_PROC_CHILDREN
-static struct pid *
-get_children_pid(struct inode *inode, struct pid *pid_prev, loff_t pos)
+static struct task_struct *
+task_next_child(struct task_struct *parent, struct task_struct *prev, unsigned int pos)
 {
-	struct task_struct *start, *task;
-	struct pid *pid = NULL;
+	struct task_struct *task;
 
 	read_lock(&tasklist_lock);
-
-	start = pid_task(proc_pid(inode), PIDTYPE_PID);
-	if (!start)
-		goto out;
-
 	/*
 	 * Lets try to continue searching first, this gives
 	 * us significant speedup on children-rich processes.
 	 */
-	if (pid_prev) {
-		task = pid_task(pid_prev, PIDTYPE_PID);
-		if (task && task->real_parent == start &&
+	if (prev) {
+		task = prev;
+		if (task && task->real_parent == parent &&
 		    !(list_empty(&task->sibling))) {
-			if (list_is_last(&task->sibling, &start->children))
+			if (list_is_last(&task->sibling, &parent->children)) {
+				task = NULL;
 				goto out;
+			}
 			task = list_first_entry(&task->sibling,
 						struct task_struct, sibling);
-			pid = get_pid(task_pid(task));
 			goto out;
 		}
 	}
@@ -622,16 +617,34 @@ get_children_pid(struct inode *inode, struct pid *pid_prev, loff_t pos)
 	 * So one need to stop or freeze the leader and all
 	 * its children to get a precise result.
 	 */
-	list_for_each_entry(task, &start->children, sibling) {
-		if (pos-- == 0) {
-			pid = get_pid(task_pid(task));
-			break;
-		}
+	list_for_each_entry(task, &parent->children, sibling) {
+		if (pos-- == 0)
+			goto out;
 	}
-
+	task = NULL;
 out:
+	if (prev)
+		put_task_struct(prev);
+	if (task)
+		get_task_struct(task);
 	read_unlock(&tasklist_lock);
-	return pid;
+	return task;
+}
+
+static struct task_struct *
+get_children_pid(struct inode *inode, struct task_struct *prev, loff_t pos)
+{
+	struct task_struct *start, *task = NULL;
+
+	start = get_proc_task(inode);
+	if (!start)
+		goto out;
+
+	task = task_next_child(start, prev, pos);
+
+	put_task_struct(start);
+out:
+	return task;
 }
 
 static int children_seq_show(struct seq_file *seq, void *v)
@@ -639,7 +652,7 @@ static int children_seq_show(struct seq_file *seq, void *v)
 	struct inode *inode = seq->private;
 	pid_t pid;
 
-	pid = pid_nr_ns(v, inode->i_sb->s_fs_info);
+	pid = task_pid_nr_ns(v, inode->i_sb->s_fs_info);
 	seq_printf(seq, "%d ", pid);
 
 	return 0;
@@ -652,18 +665,18 @@ static void *children_seq_start(struct seq_file *seq, loff_t *pos)
 
 static void *children_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
-	struct pid *pid;
+	struct task_struct *task;
 
-	pid = get_children_pid(seq->private, v, *pos + 1);
-	put_pid(v);
+	task = get_children_pid(seq->private, v, *pos + 1);
 
 	++*pos;
-	return pid;
+	return task;
 }
 
 static void children_seq_stop(struct seq_file *seq, void *v)
 {
-	put_pid(v);
+	if (v)
+		put_task_struct(v);
 }
 
 static const struct seq_operations children_seq_ops = {
-- 
2.1.0


WARNING: multiple messages have this Message-ID (diff)
From: Andrey Vagin <avagin-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	Andrey Vagin <avagin-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>,
	Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	Andrew Morton
	<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
	Cyrill Gorcunov
	<gorcunov-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>,
	Pavel Emelyanov <xemul-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>,
	Roger Luethi <rl-7uj+XXdSDtwfv37vnLkPlQ@public.gmane.org>,
	Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>,
	Arnaldo Carvalho de Melo
	<acme-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	David Ahern <dsahern-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Andy Lutomirski <luto-kltTT9wpgjJwATOyAt5JVQ@public.gmane.org>,
	Pavel Odintsov
	<pavel.odintsov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: [PATCH 08/24] proc: pick out a function to iterate task children
Date: Mon,  6 Jul 2015 11:47:09 +0300	[thread overview]
Message-ID: <1436172445-6979-9-git-send-email-avagin@openvz.org> (raw)
In-Reply-To: <1436172445-6979-1-git-send-email-avagin-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>

This function will be used in task_diag.

Signed-off-by: Andrey Vagin <avagin-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
---
 fs/proc/array.c | 67 ++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 40 insertions(+), 27 deletions(-)

diff --git a/fs/proc/array.c b/fs/proc/array.c
index ce065cf..52c4a7b 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -578,31 +578,26 @@ int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns,
 }
 
 #ifdef CONFIG_PROC_CHILDREN
-static struct pid *
-get_children_pid(struct inode *inode, struct pid *pid_prev, loff_t pos)
+static struct task_struct *
+task_next_child(struct task_struct *parent, struct task_struct *prev, unsigned int pos)
 {
-	struct task_struct *start, *task;
-	struct pid *pid = NULL;
+	struct task_struct *task;
 
 	read_lock(&tasklist_lock);
-
-	start = pid_task(proc_pid(inode), PIDTYPE_PID);
-	if (!start)
-		goto out;
-
 	/*
 	 * Lets try to continue searching first, this gives
 	 * us significant speedup on children-rich processes.
 	 */
-	if (pid_prev) {
-		task = pid_task(pid_prev, PIDTYPE_PID);
-		if (task && task->real_parent == start &&
+	if (prev) {
+		task = prev;
+		if (task && task->real_parent == parent &&
 		    !(list_empty(&task->sibling))) {
-			if (list_is_last(&task->sibling, &start->children))
+			if (list_is_last(&task->sibling, &parent->children)) {
+				task = NULL;
 				goto out;
+			}
 			task = list_first_entry(&task->sibling,
 						struct task_struct, sibling);
-			pid = get_pid(task_pid(task));
 			goto out;
 		}
 	}
@@ -622,16 +617,34 @@ get_children_pid(struct inode *inode, struct pid *pid_prev, loff_t pos)
 	 * So one need to stop or freeze the leader and all
 	 * its children to get a precise result.
 	 */
-	list_for_each_entry(task, &start->children, sibling) {
-		if (pos-- == 0) {
-			pid = get_pid(task_pid(task));
-			break;
-		}
+	list_for_each_entry(task, &parent->children, sibling) {
+		if (pos-- == 0)
+			goto out;
 	}
-
+	task = NULL;
 out:
+	if (prev)
+		put_task_struct(prev);
+	if (task)
+		get_task_struct(task);
 	read_unlock(&tasklist_lock);
-	return pid;
+	return task;
+}
+
+static struct task_struct *
+get_children_pid(struct inode *inode, struct task_struct *prev, loff_t pos)
+{
+	struct task_struct *start, *task = NULL;
+
+	start = get_proc_task(inode);
+	if (!start)
+		goto out;
+
+	task = task_next_child(start, prev, pos);
+
+	put_task_struct(start);
+out:
+	return task;
 }
 
 static int children_seq_show(struct seq_file *seq, void *v)
@@ -639,7 +652,7 @@ static int children_seq_show(struct seq_file *seq, void *v)
 	struct inode *inode = seq->private;
 	pid_t pid;
 
-	pid = pid_nr_ns(v, inode->i_sb->s_fs_info);
+	pid = task_pid_nr_ns(v, inode->i_sb->s_fs_info);
 	seq_printf(seq, "%d ", pid);
 
 	return 0;
@@ -652,18 +665,18 @@ static void *children_seq_start(struct seq_file *seq, loff_t *pos)
 
 static void *children_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
-	struct pid *pid;
+	struct task_struct *task;
 
-	pid = get_children_pid(seq->private, v, *pos + 1);
-	put_pid(v);
+	task = get_children_pid(seq->private, v, *pos + 1);
 
 	++*pos;
-	return pid;
+	return task;
 }
 
 static void children_seq_stop(struct seq_file *seq, void *v)
 {
-	put_pid(v);
+	if (v)
+		put_task_struct(v);
 }
 
 static const struct seq_operations children_seq_ops = {
-- 
2.1.0

  parent reply	other threads:[~2015-07-06  8:56 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-06  8:47 [PATCH 0/24] kernel: add a netlink interface to get information about processes (v2) Andrey Vagin
2015-07-06  8:47 ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 01/24] kernel: define taststats commands in the one place Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 02/24] kernel: add a netlink interface to get information about tasks (v2) Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 03/24] kernel: make taskstats available from all net namespaces Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 04/24] kernel: move next_tgid from fs/proc Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 05/24] task_diag: add ability to get information about all tasks Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 06/24] task_diag: add ability to split per-task data on a few netlink messages Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 07/24] task_diag: add a new group to get process credentials Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` Andrey Vagin [this message]
2015-07-06  8:47   ` [PATCH 08/24] proc: pick out a function to iterate task children Andrey Vagin
2015-07-14 18:02   ` Oleg Nesterov
2015-07-14 18:02     ` Oleg Nesterov
2015-07-17 15:57     ` Andrew Vagin
2015-07-17 15:57       ` Andrew Vagin
2015-07-18 21:22       ` Oleg Nesterov
2015-07-18 21:22         ` Oleg Nesterov
2015-07-06  8:47 ` [PATCH 09/24] proc: move task_next_child() from fs/proc Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 10/24] task_diag: add ability to dump children (v2) Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 11/24] task_diag: add a new group to get task statistics Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 12/24] task_diag: add a new group to get tasks memory mappings (v2) Andrey Vagin
2015-07-14 18:08   ` Oleg Nesterov
2015-07-14 18:08     ` Oleg Nesterov
2015-07-15  2:02     ` David Ahern
2015-07-15  2:02       ` David Ahern
2015-07-06  8:47 ` [PATCH 13/24] task_diag: shows memory consumption for " Andrey Vagin
2015-07-06  8:47 ` [PATCH 14/24] task_diag: add a marcos to enumirate memory mappings Andrey Vagin
2015-07-06  8:47 ` [PATCH 15/24] proc: give task_struct instead of pid into first_tid Andrey Vagin
2015-07-14 18:11   ` Oleg Nesterov
2015-07-06  8:47 ` [PATCH 16/24] proc: move first_tid and next_tid out of proc Andrey Vagin
2015-07-06  8:47 ` [PATCH 17/24] task_diag: add ability to dump theads Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06  8:47 ` [PATCH 18/24] task_diag: add ability to handle one task in a continious mode Andrey Vagin
2015-07-06  8:47 ` [PATCH 19/24] task_diag: Add option to dump all threads for all tasks Andrey Vagin
2015-07-06  8:47 ` [PATCH 20/24] task_diag: Only add VMAs for thread_group leader Andrey Vagin
2015-07-14 17:47   ` Oleg Nesterov
2015-07-14 17:47     ` Oleg Nesterov
2015-07-15  2:01     ` David Ahern
2015-07-15 13:31       ` Oleg Nesterov
2015-07-15 13:31         ` Oleg Nesterov
2015-07-06  8:47 ` [PATCH 21/24] task diag: Add support for TGID attribute Andrey Vagin
2015-07-06  8:47 ` [PATCH 22/24] Documentation: add documentation for task_diag Andrey Vagin
2015-07-06  8:47 ` [PATCH 23/24] selftest: check the task_diag functinonality Andrey Vagin
2015-07-06  8:47 ` [PATCH 24/24] task_diag: Enhance fork tool to spawn threads Andrey Vagin
2015-07-06  8:47   ` Andrey Vagin
2015-07-06 17:10 ` [PATCH 0/24] kernel: add a netlink interface to get information about processes (v2) Andy Lutomirski
2015-07-07 15:43   ` Andrew Vagin
2015-07-07 15:56     ` Andy Lutomirski
2015-07-07 15:56       ` Andy Lutomirski
2015-07-07 16:17       ` David Ahern
2015-07-07 16:17         ` David Ahern
2015-07-07 16:24         ` Andy Lutomirski
2015-07-07 16:41           ` David Ahern
2015-07-07 16:41             ` David Ahern
2015-07-08 16:10       ` Andrew Vagin
2015-07-08 16:10         ` Andrew Vagin
2015-07-08 17:39         ` Andy Lutomirski
2015-07-08 22:49           ` Andrey Vagin
2015-07-08 23:48             ` Andy Lutomirski
2015-07-08 23:48               ` Andy Lutomirski
2015-07-07 16:25     ` Arnaldo Carvalho de Melo
2015-07-07 16:25       ` Arnaldo Carvalho de Melo
2015-07-07 16:27       ` Andy Lutomirski
2015-07-07 16:27         ` Andy Lutomirski
2015-07-07 16:56         ` David Ahern
2015-07-07 16:56           ` David Ahern
2015-11-24 15:18 ` Andrew Vagin
2015-11-24 15:18   ` Andrew Vagin
2015-12-03 23:20   ` Andy Lutomirski
2015-12-03 23:20     ` Andy Lutomirski
2015-12-03 23:43     ` Arnd Bergmann
2015-12-14  8:05       ` Andrew Vagin
2015-12-14  8:05         ` Andrew Vagin
2015-12-14  7:52     ` Andrew Vagin
2015-12-14  7:52       ` Andrew Vagin
2015-12-14 22:38       ` Andy Lutomirski
2015-12-15 15:53         ` Andrew Vagin
2015-12-15 15:53           ` Andrew Vagin
2015-12-15 16:43           ` Andy Lutomirski
2015-12-15 16:43             ` Andy Lutomirski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1436172445-6979-9-git-send-email-avagin@openvz.org \
    --to=avagin@openvz.org \
    --cc=acme@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=dsahern@gmail.com \
    --cc=gorcunov@openvz.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=oleg@redhat.com \
    --cc=pavel.odintsov@gmail.com \
    --cc=rl@hellgate.ch \
    --cc=xemul@parallels.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.