Return-Path: Received: from cantor2.suse.de ([195.135.220.15]:58217 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932787AbbFEPCA (ORCPT ); Fri, 5 Jun 2015 11:02:00 -0400 From: Petr Mladek To: Andrew Morton , Oleg Nesterov , Tejun Heo , Ingo Molnar , Peter Zijlstra Cc: Richard Weinberger , Steven Rostedt , David Woodhouse , linux-mtd@lists.infradead.org, Trond Myklebust , Anna Schumaker , linux-nfs@vger.kernel.org, Chris Mason , "Paul E. McKenney" , Thomas Gleixner , Linus Torvalds , Jiri Kosina , Borislav Petkov , Michal Hocko , live-patching@vger.kernel.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org, Petr Mladek Subject: [RFC PATCH 08/18] kthread: Allow to get struct kthread_iterant from task_struct Date: Fri, 5 Jun 2015 17:01:07 +0200 Message-Id: <1433516477-5153-9-git-send-email-pmladek@suse.cz> In-Reply-To: <1433516477-5153-1-git-send-email-pmladek@suse.cz> References: <1433516477-5153-1-git-send-email-pmladek@suse.cz> Sender: linux-nfs-owner@vger.kernel.org List-ID: It is easy to make a mistake when one implements sleeping between kthread iterations. We will want to do it a more uniform way. For this we will want to set some flags in struct kthread_iterant from the current task (kthread). This patch adds the basic infrastructure to make it possible. Signed-off-by: Petr Mladek --- kernel/kthread.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/kernel/kthread.c b/kernel/kthread.c index e34f67cb8ecf..41fb6a43a1f1 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -44,6 +44,7 @@ struct kthread { void *data; struct completion parked; struct completion exited; + struct kthread_iterant *kti; }; enum KTHREAD_BITS { @@ -69,6 +70,11 @@ static struct kthread *to_live_kthread(struct task_struct *k) return NULL; } +static struct kthread_iterant *to_kthread_iterant(struct task_struct *k) +{ + return __to_kthread(k->vfork_done)->kti; +} + /** * kthread_stop_current - make the current kthread to terminate a safe way * @@ -199,6 +205,7 @@ static int kthread(void *_create) self.data = data; init_completion(&self.exited); init_completion(&self.parked); + self.kti = NULL; current->vfork_done = &self.exited; /* If user was SIGKILLed, I release the structure. */ @@ -421,9 +428,12 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data), */ static int kthread_iterant_fn(void *kti_ptr) { + struct kthread *kt = to_kthread(current); struct kthread_iterant *kti = kti_ptr; void *data = kti->data; + kt->kti = kti; + set_freezable(); if (kti->init) -- 1.8.5.6