Commit d387cae0 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds

[PATCH] pid: simplify pid iterators

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: default avatarOleg Nesterov <oleg@tv-sign.ru>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c88be3eb
...@@ -102,42 +102,29 @@ static inline pid_t pid_nr(struct pid *pid) ...@@ -102,42 +102,29 @@ static inline pid_t pid_nr(struct pid *pid)
return nr; return nr;
} }
#define pid_next(task, type) \
((task)->pids[(type)].node.next)
#define pid_next_task(task, type) \ #define do_each_task_pid(who, type, task) \
hlist_entry(pid_next(task, type), struct task_struct, \ do { \
pids[(type)].node) struct hlist_node *pos___; \
struct pid *pid___ = find_pid(who); \
if (pid___ != NULL) \
/* We could use hlist_for_each_entry_rcu here but it takes more arguments hlist_for_each_entry_rcu((task), pos___, \
* than the do_each_task_pid/while_each_task_pid. So we roll our own &pid___->tasks[type], pids[type].node) {
* to preserve the existing interface.
*/ #define while_each_task_pid(who, type, task) \
#define do_each_task_pid(who, type, task) \ } \
if ((task = find_task_by_pid_type(type, who))) { \ } while (0)
prefetch(pid_next(task, type)); \
do {
#define do_each_pid_task(pid, type, task) \
#define while_each_task_pid(who, type, task) \ do { \
} while (pid_next(task, type) && ({ \ struct hlist_node *pos___; \
task = pid_next_task(task, type); \ if (pid != NULL) \
rcu_dereference(task); \ hlist_for_each_entry_rcu((task), pos___, \
prefetch(pid_next(task, type)); \ &pid->tasks[type], pids[type].node) {
1; }) ); \
} #define while_each_pid_task(pid, type, task) \
} \
#define do_each_pid_task(pid, type, task) \ } while (0)
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 */ #endif /* _LINUX_PID_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment