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>
This commit is contained in:
parent
fbae2d44aa
commit
35033fe9cb
@ -136,4 +136,6 @@ bool kthread_queue_work(struct kthread_worker *worker,
|
|||||||
void kthread_flush_work(struct kthread_work *work);
|
void kthread_flush_work(struct kthread_work *work);
|
||||||
void kthread_flush_worker(struct kthread_worker *worker);
|
void kthread_flush_worker(struct kthread_worker *worker);
|
||||||
|
|
||||||
|
void kthread_destroy_worker(struct kthread_worker *worker);
|
||||||
|
|
||||||
#endif /* _LINUX_KTHREAD_H */
|
#endif /* _LINUX_KTHREAD_H */
|
||||||
|
@ -823,3 +823,26 @@ void kthread_flush_worker(struct kthread_worker *worker)
|
|||||||
wait_for_completion(&fwork.done);
|
wait_for_completion(&fwork.done);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kthread_flush_worker);
|
EXPORT_SYMBOL_GPL(kthread_flush_worker);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kthread_destroy_worker - destroy a kthread worker
|
||||||
|
* @worker: worker to be destroyed
|
||||||
|
*
|
||||||
|
* Flush and destroy @worker. The simple flush is enough because the kthread
|
||||||
|
* worker API is used only in trivial scenarios. There are no multi-step state
|
||||||
|
* machines needed.
|
||||||
|
*/
|
||||||
|
void kthread_destroy_worker(struct kthread_worker *worker)
|
||||||
|
{
|
||||||
|
struct task_struct *task;
|
||||||
|
|
||||||
|
task = worker->task;
|
||||||
|
if (WARN_ON(!task))
|
||||||
|
return;
|
||||||
|
|
||||||
|
kthread_flush_worker(worker);
|
||||||
|
kthread_stop(task);
|
||||||
|
WARN_ON(!list_empty(&worker->work_list));
|
||||||
|
kfree(worker);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(kthread_destroy_worker);
|
||||||
|
Loading…
Reference in New Issue
Block a user