Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+23 −36
Original line number Diff line number Diff line
@@ -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 {
	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 (pid_next(task, type) &&  ({			\
				task = pid_next_task(task, type);	\
				rcu_dereference(task);			\
				prefetch(pid_next(task, type));		\
				1; }) );				\
	}
			}							\
	} while (0)


#define do_each_pid_task(pid, type, task)					\
	if ((task = pid_task(pid, type))) {				\
		prefetch(pid_next(task, type));				\
		do {
	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 (pid_next(task, type) &&  ({			\
				task = pid_next_task(task, type);	\
				rcu_dereference(task);			\
				prefetch(pid_next(task, type));		\
				1; }) );				\
	}
			}							\
	} while (0)

#endif /* _LINUX_PID_H */