aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/kernel/task_work.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-07-20 09:43:40 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-07-20 09:43:40 +0200
commitc4d41d00552754cc8cdd66a52da9b7c203884d49 (patch)
tree60be0f3d543ad6d300a033d91dc313bc595cd737 /kernel/task_work.c
parenthpilo: Replace one-element array with flexible-array member (diff)
parentLinux 5.8-rc6 (diff)
downloadwireguard-linux-c4d41d00552754cc8cdd66a52da9b7c203884d49.tar.xz
wireguard-linux-c4d41d00552754cc8cdd66a52da9b7c203884d49.zip
Merge v5.8-rc6 into char-misc-next
We need the char/misc fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
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;
}