Messages in this thread Patch in this message | | | Date | Thu, 28 May 2009 10:21:13 +0200 | From | Oleg Nesterov <> | Subject | [PATCH] ptrace: don't take tasklist to get/set ->last_siginfo |
| |
Change ptrace_getsiginfo/ptrace_setsiginfo to use lock_task_sighand() without tasklist_lock. Perhaps it makes sense to make a singler helper with "bool rw" argument.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
--- PTRACE/kernel/ptrace.c~SIGINFO 2009-05-28 10:03:01.000000000 +0200 +++ PTRACE/kernel/ptrace.c 2009-05-28 10:06:59.000000000 +0200 @@ -463,37 +463,33 @@ static int ptrace_setoptions static int ptrace_getsiginfo(struct task_struct *child, siginfo_t *info) { + unsigned long flags; int error = -ESRCH; - read_lock(&tasklist_lock); - if (likely(child->sighand != NULL)) { + if (lock_task_sighand(child, &flags)) { error = -EINVAL; - spin_lock_irq(&child->sighand->siglock); if (likely(child->last_siginfo != NULL)) { *info = *child->last_siginfo; error = 0; } - spin_unlock_irq(&child->sighand->siglock); + unlock_task_sighand(child, &flags); } - read_unlock(&tasklist_lock); return error; } static int ptrace_setsiginfo(struct task_struct *child, const siginfo_t *info) { + unsigned long flags; int error = -ESRCH; - read_lock(&tasklist_lock); - if (likely(child->sighand != NULL)) { + if (lock_task_sighand(child, &flags)) { error = -EINVAL; - spin_lock_irq(&child->sighand->siglock); if (likely(child->last_siginfo != NULL)) { *child->last_siginfo = *info; error = 0; } - spin_unlock_irq(&child->sighand->siglock); + unlock_task_sighand(child, &flags); } - read_unlock(&tasklist_lock); return error; }
| |