diff options
| author | David S. Miller <davem@davemloft.net> | 2020-07-11 00:46:00 -0700 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2020-07-11 00:46:00 -0700 |
| commit | 71930d61025e7d0254f3c682cb1b5242e0499cf3 (patch) | |
| tree | 43b642f15d33ae6ba08a31ddf2d50e2915868a5e /kernel/task_work.c | |
| parent | a594920f8747fa032c784c3660d6cd5a8ab291f8 (diff) | |
| parent | 1df0d8960499e58963fd6c8ac75e544f2b417b29 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
All conflicts seemed rather trivial, with some guidance from
Saeed Mameed on the tc_ct.c one.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'kernel/task_work.c')
| -rw-r--r-- | kernel/task_work.c | 16 |
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; } |
