Skip to content

Commit

Permalink
[PATCH] pid: simplify pid iterators
Browse files Browse the repository at this point in the history
I think it is hardly possible to read the current do_each_task_pid().  The
new version is much simpler and makes the code smaller.

Only the do_each_task_pid change is tested, the do_each_pid_task isn't.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Oleg Nesterov authored and Linus Torvalds committed Oct 2, 2006
1 parent c88be3e commit d387cae
Showing 1 changed file with 23 additions and 36 deletions.
59 changes: 23 additions & 36 deletions include/linux/pid.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,42 +102,29 @@ static inline pid_t pid_nr(struct pid *pid)
return nr;
}

#define pid_next(task, type) \
((task)->pids[(type)].node.next)

#define pid_next_task(task, type) \
hlist_entry(pid_next(task, type), struct task_struct, \
pids[(type)].node)


/* We could use hlist_for_each_entry_rcu here but it takes more arguments
* than the do_each_task_pid/while_each_task_pid. So we roll our own
* to preserve the existing interface.
*/
#define do_each_task_pid(who, type, task) \
if ((task = find_task_by_pid_type(type, who))) { \
prefetch(pid_next(task, type)); \
do {

#define while_each_task_pid(who, type, task) \
} while (pid_next(task, type) && ({ \
task = pid_next_task(task, type); \
rcu_dereference(task); \
prefetch(pid_next(task, type)); \
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; }) ); \
}
#define do_each_task_pid(who, type, task) \
do { \
struct hlist_node *pos___; \
struct pid *pid___ = find_pid(who); \
if (pid___ != NULL) \
hlist_for_each_entry_rcu((task), pos___, \
&pid___->tasks[type], pids[type].node) {

#define while_each_task_pid(who, type, task) \
} \
} while (0)


#define do_each_pid_task(pid, type, task) \
do { \
struct hlist_node *pos___; \
if (pid != NULL) \
hlist_for_each_entry_rcu((task), pos___, \
&pid->tasks[type], pids[type].node) {

#define while_each_pid_task(pid, type, task) \
} \
} while (0)

#endif /* _LINUX_PID_H */

0 comments on commit d387cae

Please sign in to comment.