Oleg Nesterov <oleg@xxxxxxxxxx> wrote: > Provide a simple mechanism that allows running code in the > (nonatomic) context of the arbitrary task. > > The caller does task_work_add(task, task_work) and this task > executes task_work->func() either from do_notify_resume() or > from do_exit(). The callback can rely on PF_EXITING to detect > the latter case. > > "struct task_work" can be embedded in another struct, still it > has "void *data" to handle the most common/simple case. > > This allows us to kill the ->replacement_session_keyring hack, > and potentially this can have more users. > > Performance-wise, this adds 2 "unlikely(!hlist_empty())" checks > into tracehook_notify_resume() and do_exit(). But at the same > time we can remove the "replacement_session_keyring != NULL" > checks from arch/*/signal.c and exit_creds(). > > Note: task_work_add/task_work_run abuses ->pi_lock. This is > only because this lock is already used by lookup_pi_state() to > synchronize with do_exit() setting PF_EXITING. Fortunately the > scope of this lock in task_work.c is really tiny, and the code > is unlikely anyway. > > v2: > - implement task_work_cancel(func), it removes the first > task_work with the same callback. > v3: > - task_work_add() gets the new arg, "bool notify" to > conditionalize set_notify_resume(), this makes it useable > for kthreads and task_work_add(notify => false) can > work without TIF_NOTIFY_RESUME. > > - don't add the dummy "ifndef TIF_NOTIFY_RESUME" inlines, > just add the simple check in task_work_add(). > v4: > - s/task_work_queue/task_work_add/ > v5: > - task_work_run() uses current explicitely > > Todo: > - move clear_thread_flag(TIF_NOTIFY_RESUME) from arch/ > to tracehook_notify_resume() > > - rename tracehook_notify_resume() and move it into > linux/task_work.h > > - m68k and xtensa don't have TIF_NOTIFY_RESUME and thus > task_work_add(notify => true) fails with -ENOTSUPP. > > However, ->replacement_session_keyring equally needs > this flag, task_work_add() is not worse. > > Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx> Acked-by: David Howells <dhowells@xxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html