Most kthreads are sleeping lots of time. They do some job either in regular intervals or when there is an event. Many of them combine the two approaches. The job is either a "single" operation, e.g. check and make a huge page. Or the kthread is serving several requests, e.g. handling several NFS callbacks. Anyway, the single thread could process only one request at a time and there might be more pending requests. Some kthreads use a more complex algorithms to prioritize the pending work, e.g. a red-black tree used by dmcrypt_write(). I want to say that only some kthreads can be solved the "ideal" way when a work is queued when it is needed. Instead, many kthreads will use self-queuing works that will monitor the state and wait for the job inside the work. It means that we will need to wakeup the currently processing job when the worker is going to be destroyed. This is where this function will be useful. Signed-off-by: Petr Mladek <pmladek@xxxxxxxx> --- include/linux/kthread.h | 1 + kernel/kthread.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/linux/kthread.h b/include/linux/kthread.h index a0b811c95c75..24d72bac27db 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -138,5 +138,6 @@ void flush_kthread_work(struct kthread_work *work); void flush_kthread_worker(struct kthread_worker *worker); void destroy_kthread_worker(struct kthread_worker *worker); +void wakeup_and_destroy_kthread_worker(struct kthread_worker *worker); #endif /* _LINUX_KTHREAD_H */ diff --git a/kernel/kthread.c b/kernel/kthread.c index 4f6b20710eb3..053c9dfa58ac 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -875,3 +875,28 @@ void destroy_kthread_worker(struct kthread_worker *worker) WARN_ON(kthread_stop(task)); } EXPORT_SYMBOL(destroy_kthread_worker); + +/** + * wakeup_and_destroy_kthread_worker - wake up and destroy a kthread worker + * @worker: worker to be destroyed + * + * Wakeup potentially sleeping work and destroy the @worker. All users should + * be aware that they should not produce more work anymore. It is especially + * useful for self-queuing works that are waiting for some job inside the work. + * They are supposed to wake up, check the situation, and stop re-queuing. + */ +void wakeup_and_destroy_kthread_worker(struct kthread_worker *worker) +{ + struct task_struct *task = worker->task; + + if (WARN_ON(!task)) + return; + + spin_lock_irq(&worker->lock); + if (worker->current_work) + wake_up_process(worker->task); + spin_unlock_irq(&worker->lock); + + destroy_kthread_worker(worker); +} +EXPORT_SYMBOL(wakeup_and_destroy_kthread_worker); -- 1.8.5.6 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>