On 10/2/20 9:52 AM, Jens Axboe wrote: > On 10/2/20 9:31 AM, Thomas Gleixner wrote: >> On Fri, Oct 02 2020 at 17:14, Oleg Nesterov wrote: >>> Heh. To be honest I don't really like 1-2 ;) >> >> I do not like any of this :) >> >>> 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. >> >> I think it's fundamentaly wrong that we have several places and several >> flags which handle task_work_run() instead of having exactly one place >> and one flag. > > I don't disagree with that. I know it's not happening in this series, but > if we to the TIF_NOTIFY_SIGNAL route and get all archs supporting that, > then we can kill the signal and notify resume part of running task_work. > And that leaves us with exactly one place that runs it. > > So we can potentially improve the current situation in that regard. I re-spun (and re-tested) the series, now based on TIF_NOTIFY_SIGNAL instead. I won't be sending this one out before we've discussed it some more, but wanted to let you know what it currently looks like: https://git.kernel.dk/cgit/linux-block/log/?h=tif-task_work -- Jens Axboe