lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 28 Jul 2015 16:39:22 +0200 From: Petr Mladek <pmladek@...e.com> To: Andrew Morton <akpm@...ux-foundation.org>, Oleg Nesterov <oleg@...hat.com>, Tejun Heo <tj@...nel.org>, Ingo Molnar <mingo@...hat.com>, Peter Zijlstra <peterz@...radead.org> Cc: Steven Rostedt <rostedt@...dmis.org>, "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>, Josh Triplett <josh@...htriplett.org>, Thomas Gleixner <tglx@...utronix.de>, Linus Torvalds <torvalds@...ux-foundation.org>, Jiri Kosina <jkosina@...e.cz>, Borislav Petkov <bp@...e.de>, Michal Hocko <mhocko@...e.cz>, linux-mm@...ck.org, Vlastimil Babka <vbabka@...e.cz>, live-patching@...r.kernel.org, linux-api@...r.kernel.org, linux-kernel@...r.kernel.org, Petr Mladek <pmladek@...e.com> Subject: [RFC PATCH 05/14] kthread: Add wakeup_and_destroy_kthread_worker() 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@...e.com> --- 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 from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists