NACK.--b. On Tue, Jul 07, 2020 at 05:17:13PM +0200, Greg Kroah-Hartman wrote: > From: J. Bruce Fields <bfields@xxxxxxxxxx> > > [ Upstream commit 52782c92ac85c4e393eb4a903a62e6c24afa633f ] > > It's handy to keep the kthread_fn just as a unique cookie to identify > classes of kthreads. E.g. if you can verify that a given task is > running your thread_fn, then you may know what sort of type kthread_data > points to. > > We'll use this in nfsd to pass some information into the vfs. Note it > will need kthread_data() exported too. > > Original-patch-by: Tejun Heo <tj@xxxxxxxxxx> > Signed-off-by: J. Bruce Fields <bfields@xxxxxxxxxx> > Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx> > --- > include/linux/kthread.h | 1 + > kernel/kthread.c | 17 +++++++++++++++++ > 2 files changed, 18 insertions(+) > > diff --git a/include/linux/kthread.h b/include/linux/kthread.h > index 0f9da966934e2..59bbc63ff8637 100644 > --- a/include/linux/kthread.h > +++ b/include/linux/kthread.h > @@ -57,6 +57,7 @@ bool kthread_should_stop(void); > bool kthread_should_park(void); > bool __kthread_should_park(struct task_struct *k); > bool kthread_freezable_should_stop(bool *was_frozen); > +void *kthread_func(struct task_struct *k); > void *kthread_data(struct task_struct *k); > void *kthread_probe_data(struct task_struct *k); > int kthread_park(struct task_struct *k); > diff --git a/kernel/kthread.c b/kernel/kthread.c > index b262f47046ca4..543dff6b576c7 100644 > --- a/kernel/kthread.c > +++ b/kernel/kthread.c > @@ -46,6 +46,7 @@ struct kthread_create_info > struct kthread { > unsigned long flags; > unsigned int cpu; > + int (*threadfn)(void *); > void *data; > struct completion parked; > struct completion exited; > @@ -152,6 +153,20 @@ bool kthread_freezable_should_stop(bool *was_frozen) > } > EXPORT_SYMBOL_GPL(kthread_freezable_should_stop); > > +/** > + * kthread_func - return the function specified on kthread creation > + * @task: kthread task in question > + * > + * Returns NULL if the task is not a kthread. > + */ > +void *kthread_func(struct task_struct *task) > +{ > + if (task->flags & PF_KTHREAD) > + return to_kthread(task)->threadfn; > + return NULL; > +} > +EXPORT_SYMBOL_GPL(kthread_func); > + > /** > * kthread_data - return data value specified on kthread creation > * @task: kthread task in question > @@ -164,6 +179,7 @@ void *kthread_data(struct task_struct *task) > { > return to_kthread(task)->data; > } > +EXPORT_SYMBOL_GPL(kthread_data); > > /** > * kthread_probe_data - speculative version of kthread_data() > @@ -237,6 +253,7 @@ static int kthread(void *_create) > do_exit(-ENOMEM); > } > > + self->threadfn = threadfn; > self->data = data; > init_completion(&self->exited); > init_completion(&self->parked); > -- > 2.25.1 > > >