Re: [PATCH v5 1/3] task_work_add: generic process-context callbacks
From: David Howells
Date: Mon Apr 30 2012 - 04:56:07 EST
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-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/