diff options
| author | Mark Brown <broonie@kernel.org> | 2017-09-19 14:12:47 +0100 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2017-09-19 14:12:47 +0100 |
| commit | e9331ee9b164d58b4dd0abc882ba7e23d2f404b3 (patch) | |
| tree | 903d078e53a59ed65708193f2486ad0b9a8109d8 /kernel/task_work.c | |
| parent | e7251484f3bc3bd9203a2c39555ca7d53e988cf6 (diff) | |
| parent | 2bd6bf03f4c1c59381d62c61d03f6cc3fe71f66e (diff) | |
Merge tag 'v4.14-rc1' into asoc-rockchip
Linux 4.14-rc1
Diffstat (limited to 'kernel/task_work.c')
| -rw-r--r-- | kernel/task_work.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/kernel/task_work.c b/kernel/task_work.c index d513051fcca2..836a72a66fba 100644 --- a/kernel/task_work.c +++ b/kernel/task_work.c @@ -96,20 +96,16 @@ void task_work_run(void) * work->func() can do task_work_add(), do not set * work_exited unless the list is empty. */ + raw_spin_lock_irq(&task->pi_lock); do { work = READ_ONCE(task->task_works); head = !work && (task->flags & PF_EXITING) ? &work_exited : NULL; } while (cmpxchg(&task->task_works, work, head) != work); + raw_spin_unlock_irq(&task->pi_lock); if (!work) break; - /* - * Synchronize with task_work_cancel(). It can't remove - * the first entry == work, cmpxchg(task_works) should - * fail, but it can play with *work and other entries. - */ - raw_spin_unlock_wait(&task->pi_lock); do { next = work->next; |
