mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-23 20:24:12 +08:00
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_worker(struct kthread_worker *worker);
|
||||
|
||||
void kthread_destroy_worker(struct kthread_worker *worker);
|
||||
|
||||
#endif /* _LINUX_KTHREAD_H */
|
||||
|
@ -823,3 +823,26 @@ void kthread_flush_worker(struct kthread_worker *worker)
|
||||
wait_for_completion(&fwork.done);
|
||||
}
|
||||
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