aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/kernel/task_work.c
diff options
context:
space:
mode:
authorThomas Zimmermann <tzimmermann@suse.de>2020-07-28 15:35:50 +0200
committerThomas Zimmermann <tzimmermann@suse.de>2020-07-28 15:35:50 +0200
commitf4a1692491b5cce8978cea19cb8946bc2c6f14bc (patch)
tree1865126859b5b9d613c49113a5aaafc78f79b99b /kernel/task_work.c
parentdrm: hold gem reference until object is no longer accessed (diff)
parentMerge branch 'linux-5.8' of git://github.com/skeggsb/linux into drm-fixes (diff)
downloadwireguard-linux-f4a1692491b5cce8978cea19cb8946bc2c6f14bc.tar.xz
wireguard-linux-f4a1692491b5cce8978cea19cb8946bc2c6f14bc.zip
Merge remote-tracking branch 'drm/drm-fixes' into drm-misc-fixes
Updating drm-misc-fixes to v5.8-rc7.
Diffstat (limited to 'kernel/task_work.c')
-rw-r--r--kernel/task_work.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/kernel/task_work.c b/kernel/task_work.c
index 825f28259a19..5c0848ca1287 100644
--- a/kernel/task_work.c
+++ b/kernel/task_work.c
@@ -25,9 +25,10 @@ static struct callback_head work_exited; /* all we need is ->next == NULL */
* 0 if succeeds or -ESRCH.
*/
int
-task_work_add(struct task_struct *task, struct callback_head *work, bool notify)
+task_work_add(struct task_struct *task, struct callback_head *work, int notify)
{
struct callback_head *head;
+ unsigned long flags;
do {
head = READ_ONCE(task->task_works);
@@ -36,8 +37,19 @@ task_work_add(struct task_struct *task, struct callback_head *work, bool notify)
work->next = head;
} while (cmpxchg(&task->task_works, head, work) != head);
- if (notify)
+ switch (notify) {
+ case TWA_RESUME:
set_notify_resume(task);
+ break;
+ case TWA_SIGNAL:
+ if (lock_task_sighand(task, &flags)) {
+ task->jobctl |= JOBCTL_TASK_WORK;
+ signal_wake_up(task, 0);
+ unlock_task_sighand(task, &flags);
+ }
+ break;
+ }
+
return 0;
}