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 <pmladek@xxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html