diff options
author | Jens Axboe <axboe@kernel.dk> | 2020-08-13 09:01:38 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-08-13 09:01:38 -0600 |
commit | ebf0d100df0731901c16632f78d78d35f4123bc4 (patch) | |
tree | 75defc3ec0621de7306f54a658c8797b34cab263 /fs | |
parent | f254ac04c8744cf7bfed012717eac34eacc65dfb (diff) |
task_work: only grab task signal lock when needed
If JOBCTL_TASK_WORK is already set on the targeted task, then we need
not go through {lock,unlock}_task_sighand() to set it again and queue
a signal wakeup. This is safe as we're checking it _after_ adding the
new task_work with cmpxchg().
The ordering is as follows:
task_work_add() get_signal()
--------------------------------------------------------------
STORE(task->task_works, new_work); STORE(task->jobctl);
mb(); mb();
LOAD(task->jobctl); LOAD(task->task_works);
This speeds up TWA_SIGNAL handling quite a bit, which is important now
that io_uring is relying on it for all task_work deliveries.
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Jann Horn <jannh@google.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs')
0 files changed, 0 insertions, 0 deletions