drm/nouveau/kms/nv50-: Use downstream DP clock limits for mode validation
[linux-2.6-microblaze.git] / kernel / signal.c
index ee22ec7..42b67d2 100644 (file)
@@ -719,7 +719,7 @@ static int dequeue_synchronous_signal(kernel_siginfo_t *info)
         * Return the first synchronous signal in the queue.
         */
        list_for_each_entry(q, &pending->list, list) {
-               /* Synchronous signals have a postive si_code */
+               /* Synchronous signals have a positive si_code */
                if ((q->info.si_code > SI_USER) &&
                    (sigmask(q->info.si_signo) & SYNCHRONOUS_MASK)) {
                        sync = q;
@@ -2541,7 +2541,21 @@ bool get_signal(struct ksignal *ksig)
 
 relock:
        spin_lock_irq(&sighand->siglock);
-       current->jobctl &= ~JOBCTL_TASK_WORK;
+       /*
+        * Make sure we can safely read ->jobctl() in task_work add. As Oleg
+        * states:
+        *
+        * It pairs with mb (implied by cmpxchg) before READ_ONCE. So we
+        * roughly have
+        *
+        *      task_work_add:                          get_signal:
+        *      STORE(task->task_works, new_work);      STORE(task->jobctl);
+        *      mb();                                   mb();
+        *      LOAD(task->jobctl);                     LOAD(task->task_works);
+        *
+        * and we can rely on STORE-MB-LOAD [ in task_work_add].
+        */
+       smp_store_mb(current->jobctl, current->jobctl & ~JOBCTL_TASK_WORK);
        if (unlikely(current->task_works)) {
                spin_unlock_irq(&sighand->siglock);
                task_work_run();