• Jens Axboe's avatar
    task_work: only grab task signal lock when needed · ebf0d100
    Jens Axboe authored
    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: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    ebf0d100
task_work.c 3.81 KB