From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756856AbbIUNFX (ORCPT ); Mon, 21 Sep 2015 09:05:23 -0400 Received: from mx2.suse.de ([195.135.220.15]:52267 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756829AbbIUNFR (ORCPT ); Mon, 21 Sep 2015 09:05:17 -0400 From: Petr Mladek To: Andrew Morton , Oleg Nesterov , Tejun Heo , Ingo Molnar , Peter Zijlstra Cc: Steven Rostedt , "Paul E. McKenney" , Josh Triplett , Thomas Gleixner , Linus Torvalds , Jiri Kosina , Borislav Petkov , Michal Hocko , linux-mm@kvack.org, Vlastimil Babka , live-patching@vger.kernel.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org, Petr Mladek Subject: [RFC v2 04/18] kthread: Add destroy_kthread_worker() Date: Mon, 21 Sep 2015 15:03:45 +0200 Message-Id: <1442840639-6963-5-git-send-email-pmladek@suse.com> X-Mailer: git-send-email 1.8.5.6 In-Reply-To: <1442840639-6963-1-git-send-email-pmladek@suse.com> References: <1442840639-6963-1-git-send-email-pmladek@suse.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The current kthread worker users call flush() and stop() explicitly. The new function will make it easier and will do it better. Also it frees the kthread_worker struct that has been allocated by create_kthread_worker(). Note that flush() does not guarantee that the queue is empty. drain() is more safe. It returns when the queue is really empty. Also it warns when too many work is being queued when draining. Signed-off-by: Petr Mladek --- include/linux/kthread.h | 2 ++ kernel/kthread.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/linux/kthread.h b/include/linux/kthread.h index e390069a3f68..bef97e06d2b6 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -136,4 +136,6 @@ bool queue_kthread_work(struct kthread_worker *worker, void flush_kthread_work(struct kthread_work *work); void flush_kthread_worker(struct kthread_worker *worker); +void destroy_kthread_worker(struct kthread_worker *worker); + #endif /* _LINUX_KTHREAD_H */ diff --git a/kernel/kthread.c b/kernel/kthread.c index e6424cf17cbd..65c263336b8b 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -809,3 +809,23 @@ void drain_kthread_worker(struct kthread_worker *worker) spin_unlock_irq(&worker->lock); } EXPORT_SYMBOL(drain_kthread_worker); + +/** + * destroy_kthread_worker - destroy a kthread worker + * @worker: worker to be destroyed + * + * Destroy @worker. It should be idle when this is called. + */ +void destroy_kthread_worker(struct kthread_worker *worker) +{ + struct task_struct *task; + + task = worker->task; + if (WARN_ON(!task)) + return; + + drain_kthread_worker(worker); + kthread_stop(task); + kfree(worker); +} +EXPORT_SYMBOL(destroy_kthread_worker); -- 1.8.5.6