tty: serial: qcom_geni_serial: Unconditionally call dev_pm_opp_of_remove_table()
[linux-2.6-microblaze.git] / kernel / task_work.c
index 5c0848c..613b2d6 100644 (file)
@@ -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);