diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-09-27 04:51:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-27 11:26:19 -0400 |
commit | c18258c6f0848f97e85287f6271c511a092bb784 (patch) | |
tree | 16c057a171b7623895ee208459392c1104193b84 /kernel/pid.c | |
parent | 35fa2048ab13d1be846be612e395c15c200bd51c (diff) |
[PATCH] pid: Implement transfer_pid and use it to simplify de_thread
In de_thread we move pids from one process to another, a rather ugly case.
The function transfer_pid makes it clear what we are doing, and makes the
action atomic. This is useful we ever want to atomically traverse the
process group and session lists, in a rcu safe manner.
Even if the atomic properties this change should be a win as transfer_pid
should be less code to execute than executing both attach_pid and
detach_pid, and this should make de_thread slightly smaller as only a
single function call needs to be emitted. The only downside is that the
code might be slower to execute as the odds are against transfer_pid being
in cache.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/pid.c')
-rw-r--r-- | kernel/pid.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/pid.c b/kernel/pid.c index 93e212f20671..6db82b68e2f8 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
@@ -252,6 +252,15 @@ void fastcall detach_pid(struct task_struct *task, enum pid_type type) | |||
252 | free_pid(pid); | 252 | free_pid(pid); |
253 | } | 253 | } |
254 | 254 | ||
255 | /* transfer_pid is an optimization of attach_pid(new), detach_pid(old) */ | ||
256 | void fastcall transfer_pid(struct task_struct *old, struct task_struct *new, | ||
257 | enum pid_type type) | ||
258 | { | ||
259 | new->pids[type].pid = old->pids[type].pid; | ||
260 | hlist_replace_rcu(&old->pids[type].node, &new->pids[type].node); | ||
261 | old->pids[type].pid = NULL; | ||
262 | } | ||
263 | |||
255 | struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type) | 264 | struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type) |
256 | { | 265 | { |
257 | struct task_struct *result = NULL; | 266 | struct task_struct *result = NULL; |