|
|
@@ -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);
|