X-Git-Url: http://git.monstr.eu/?a=blobdiff_plain;f=kernel%2Ftask_work.c;h=613b2d634af82fb6c3d4505df7159c9396e10e89;hb=98477740630f270aecf648f1d6a9dbc6027d4ff1;hp=5c0848ca1287df065303b3abbc3b4e3cb5fffa81;hpb=d7806bbd22cabc3e3b0a985cfcffa29cf156bb30;p=linux-2.6-microblaze.git diff --git a/kernel/task_work.c b/kernel/task_work.c index 5c0848ca1287..613b2d634af8 100644 --- a/kernel/task_work.c +++ b/kernel/task_work.c @@ -42,7 +42,13 @@ task_work_add(struct task_struct *task, struct callback_head *work, int notify) set_notify_resume(task); break; case TWA_SIGNAL: - if (lock_task_sighand(task, &flags)) { + /* + * Only grab the sighand lock if we don't already have some + * task_work pending. This pairs with the smp_store_mb() + * in get_signal(), see comment there. + */ + if (!(READ_ONCE(task->jobctl) & JOBCTL_TASK_WORK) && + lock_task_sighand(task, &flags)) { task->jobctl |= JOBCTL_TASK_WORK; signal_wake_up(task, 0); unlock_task_sighand(task, &flags);