lkml.org 
[lkml]   [2020]   [May]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 0/4] allow multiple kthreadd's
    On Tue, May 05, 2020 at 05:25:27PM -0400, J. Bruce Fields wrote:
    > On Tue, May 05, 2020 at 05:09:56PM -0400, Tejun Heo wrote:
    > > 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;
    >
    > Yes, definitely more generic, looks good to me.

    This is what I'm testing with.

    If it's OK with you, could I add your Signed-off-by and take it through
    the nfsd tree? I'll have some other patches that will depend on it.

    --b.


    commit 379bfe5257b6
    Author: Tejun Heo <tj@kernel.org>
    Date: Tue May 5 21:26:07 2020 -0400

    kthread: save thread function

    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.

    Signed-off-by: J. Bruce Fields <bfields@redhat.com>

    diff --git a/include/linux/kthread.h b/include/linux/kthread.h
    index 8bbcaad7ef0f..c00ee443833f 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_fn(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 bfbfa481be3a..b87c4a9ba91d 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_fn - return the function specified on kthread creation
    + * @task: kthread task in question
    + *
    + * Returns NULL if the task is not a kthread.
    + */
    +void *kthread_fn(struct task_struct *task)
    +{
    + if (task->flags & PF_KTHREAD)
    + return to_kthread(task)->threadfn;
    + return NULL;
    +}
    +EXPORT_SYMBOL_GPL(kthread_fn);
    +
    /**
    * 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()
    @@ -244,6 +260,7 @@ static int kthread(void *_create)
    do_exit(-ENOMEM);
    }

    + self->threadfn = threadfn;
    self->data = data;
    init_completion(&self->exited);
    init_completion(&self->parked);
    \
     
     \ /
      Last update: 2020-05-06 17:38    [W:2.620 / U:0.380 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site