Hello, On Tue, May 05, 2020 at 05:01:18PM -0400, J. Bruce Fields wrote: > On Mon, May 04, 2020 at 10:15:14PM -0400, J. Bruce Fields wrote: > > Though now I'm feeling greedy: it would be nice to have both some kind > > of global flag, *and* keep kthread->data pointing to svc_rqst (as that > > would give me a simpler and quicker way to figure out which client is > > conflicting). Could I take a flag bit in kthread->flags, maybe? > > Would something like this be too hacky?:
It's not the end of the world but a bit hacky. I wonder whether something like the following would work better for identifying worker type so that you can do sth like if (kthread_fn(current) == nfsd) return kthread_data(current); else return NULL; Thanks. diff --git a/kernel/kthread.c b/kernel/kthread.c index bfbfa481be3a..4f3ab9f2c994 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,13 @@ bool kthread_freezable_should_stop(bool *was_frozen) } EXPORT_SYMBOL_GPL(kthread_freezable_should_stop); +void *kthread_fn(struct task_struct *task) +{ + if (task->flags & PF_KTHREAD) + return to_kthread(task)->threadfn; + return NULL; +} + /** * kthread_data - return data value specified on kthread creation * @task: kthread task in question @@ -244,6 +252,7 @@ static int kthread(void *_create) do_exit(-ENOMEM); } + self->threadfn = threadfn; self->data = data; init_completion(&self->exited); init_completion(&self->parked); -- tejun