diff options
| author | Petr Mladek <pmladek@suse.com> | 2016-10-11 16:55:33 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-10-11 18:06:33 -0400 |
| commit | 35033fe9cbbf18415dfeb7e27f0d4228dfc7458a (patch) | |
| tree | 8f7f5456f8ec120624d7a8c3a250e5972249d30f /kernel | |
| parent | fbae2d44aa1df72d0154be77eb4d71e1e34c0f8f (diff) | |
kthread: add kthread_destroy_worker()
The current kthread worker users call flush() and stop() explicitly.
This function does the same plus it frees the kthread_worker struct
in one call.
It is supposed to be used together with kthread_create_worker*() that
allocates struct kthread_worker.
Link: http://lkml.kernel.org/r/1470754545-17632-7-git-send-email-pmladek@suse.com
Signed-off-by: Petr Mladek <pmladek@suse.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jiri Kosina <jkosina@suse.cz>
Cc: Borislav Petkov <bp@suse.de>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kthread.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/kernel/kthread.c b/kernel/kthread.c index 12695e68ed00..f874300dfce5 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c | |||
| @@ -823,3 +823,26 @@ void kthread_flush_worker(struct kthread_worker *worker) | |||
| 823 | wait_for_completion(&fwork.done); | 823 | wait_for_completion(&fwork.done); |
| 824 | } | 824 | } |
| 825 | EXPORT_SYMBOL_GPL(kthread_flush_worker); | 825 | EXPORT_SYMBOL_GPL(kthread_flush_worker); |
| 826 | |||
| 827 | /** | ||
| 828 | * kthread_destroy_worker - destroy a kthread worker | ||
| 829 | * @worker: worker to be destroyed | ||
| 830 | * | ||
| 831 | * Flush and destroy @worker. The simple flush is enough because the kthread | ||
| 832 | * worker API is used only in trivial scenarios. There are no multi-step state | ||
| 833 | * machines needed. | ||
| 834 | */ | ||
| 835 | void kthread_destroy_worker(struct kthread_worker *worker) | ||
| 836 | { | ||
| 837 | struct task_struct *task; | ||
| 838 | |||
| 839 | task = worker->task; | ||
| 840 | if (WARN_ON(!task)) | ||
| 841 | return; | ||
| 842 | |||
| 843 | kthread_flush_worker(worker); | ||
| 844 | kthread_stop(task); | ||
| 845 | WARN_ON(!list_empty(&worker->work_list)); | ||
| 846 | kfree(worker); | ||
| 847 | } | ||
| 848 | EXPORT_SYMBOL(kthread_destroy_worker); | ||
