Simpler signal-exit concurrency handling
PATCH 1/1 Simpler signal-exit concurrency handling
Hello!
Some simplification in checking signal delivery against concurrent exit. Instead of using get_task_struct_rcu(), which increments the task_struct reference count, check the reference count after acquiring sighand lock.
Signed-off-by <[email protected]>
---
signal.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-)
kernel/signal.c +6 -6
@@ -1150,19 +1150,19 @@ int group_send_sig_info(int sig, struct retry: ret =check_kill_permission (sig, info, p); -if (!ret && sig && (sp = p->sighand)) { -if (!get_task_struct_rcu (p)) { -return -ESRCH ; - } +if (!ret && sig && (sp =rcu_dereference (p->sighand))) {spin_lock_irqsave (&sp->siglock, flags);if (p->sighand != sp) {spin_unlock_irqrestore (&sp->siglock, flags); -put_task_struct (p); goto retry; } +if ((atomic_read (&sp->count) ==0 ) || + (atomic_read (&p->usage) ==0 )) { +spin_unlock_irqrestore (&sp->siglock, flags); +return -ESRCH ; + } ret =__group_send_sig_info (sig, info, p);spin_unlock_irqrestore (&sp->siglock, flags); -put_task_struct (p); }return ret;