Heh. To be honest I don't really like 1-2 ;) Unfortunately, I do not see a better approach right now. Let me think until Monday, it is not that I think I will find a better solution, but I'd like to try anyway. Let me comment 3/3 for now. On 10/01, Jens Axboe wrote: > > +static void task_work_signal(struct task_struct *task) > +{ > +#ifndef TIF_TASKWORK > + unsigned long flags; > + > + /* > + * Only grab the sighand lock if we don't already have some > + * task_work pending. This pairs with the smp_store_mb() > + * in get_signal(), see comment there. > + */ > + if (!(READ_ONCE(task->jobctl) & JOBCTL_TASK_WORK) && > + lock_task_sighand(task, &flags)) { > + task->jobctl |= JOBCTL_TASK_WORK; > + signal_wake_up(task, 0); > + unlock_task_sighand(task, &flags); > + } > +#else > + set_tsk_thread_flag(task, TIF_TASKWORK); > + set_notify_resume(task); > +#endif Again, I can't understand. task_work_signal(task) should set TIF_TASKWORK to make signal_pending() = T _and_ wake/kick the target up, just like signal_wake_up() does. Why do we set TIF_NOTIFY_RESUME ? So I think that if we are going to add TIF_TASKWORK we should generalize this logic and turn it into TIF_NOTIFY_SIGNAL. Similar to TIF_NOTIFY_RESUME but implies signal_pending(). IOW, something like void set_notify_signal(task) { if (!test_and_set_tsk_thread_flag(task, TIF_NOTIFY_SIGNAL)) { if (!wake_up_state(task, TASK_INTERRUPTIBLE)) kick_process(t); } } // called by exit_to_user_mode_loop() if ti_work & _TIF_NOTIFY_SIGNAL void tracehook_notify_signal(regs) { clear_thread_flag(TIF_NOTIFY_SIGNAL); smp_mb__after_atomic(); if (unlikely(current->task_works)) task_work_run(); } This way task_work_run() doesn't need to clear TIF_NOTIFY_SIGNAL and it can have more users. What do you think? Oleg.