[PATCH] pid: add do_each_pid_task
authorEric W. Biederman <ebiederm@xmission.com>
Mon, 2 Oct 2006 09:17:09 +0000 (02:17 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 2 Oct 2006 14:57:13 +0000 (07:57 -0700)
To avoid pid rollover confusion the kernel needs to work with struct pid *
instead of pid_t.  Currently there is not an iterator that walks through all
of the tasks of a given pid type starting with a struct pid.  This prevents us
replacing some pid_t instances with struct pid.  So this patch adds
do_each_pid_task which walks through the set of task for a given pid type
starting with a struct pid.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
include/linux/pid.h

index 359121086de1891b6dde0e7eeea0e9328f7fbde7..8cf9b11ed2649906542f9aa30b1464afd2c32338 100644 (file)
@@ -119,4 +119,17 @@ extern void FASTCALL(free_pid(struct pid *pid));
                                1; }) );                                \
        }
 
+#define do_each_pid_task(pid, type, task)                              \
+       if ((task = pid_task(pid, type))) {                             \
+               prefetch(pid_next(task, type));                         \
+               do {
+
+#define while_each_pid_task(pid, type, task)                           \
+               } while (pid_next(task, type) &&  ({                    \
+                               task = pid_next_task(task, type);       \
+                               rcu_dereference(task);                  \
+                               prefetch(pid_next(task, type));         \
+                               1; }) );                                \
+       }
+
 #endif /* _LINUX_PID_H */