lkml.org 
[lkml]   [2015]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 06/22] kthread: Add destroy_kthread_worker()
    Date
    The current kthread worker users call flush() and stop() explicitly.
    This function drains the worker, stops it, and frees the kthread_worker
    struct in one call.

    It is supposed to be used together with create_kthread_worker*() that
    allocates struct kthread_worker.

    Also note that drain() correctly handles self-queuing works in compare
    with flush().

    Signed-off-by: Petr Mladek <pmladek@suse.com>
    ---
    include/linux/kthread.h | 2 ++
    kernel/kthread.c | 21 +++++++++++++++++++++
    2 files changed, 23 insertions(+)

    diff --git a/include/linux/kthread.h b/include/linux/kthread.h
    index 943900c7ce35..c4a95a3ba500 100644
    --- a/include/linux/kthread.h
    +++ b/include/linux/kthread.h
    @@ -136,4 +136,6 @@ bool queue_kthread_work(struct kthread_worker *worker,
    void flush_kthread_work(struct kthread_work *work);
    void flush_kthread_worker(struct kthread_worker *worker);

    +void destroy_kthread_worker(struct kthread_worker *worker);
    +
    #endif /* _LINUX_KTHREAD_H */
    diff --git a/kernel/kthread.c b/kernel/kthread.c
    index a18ad3b58f61..1d41e0faef2d 100644
    --- a/kernel/kthread.c
    +++ b/kernel/kthread.c
    @@ -838,3 +838,24 @@ void drain_kthread_worker(struct kthread_worker *worker)
    spin_unlock_irq(&worker->lock);
    }
    EXPORT_SYMBOL(drain_kthread_worker);
    +
    +/**
    + * destroy_kthread_worker - destroy a kthread worker
    + * @worker: worker to be destroyed
    + *
    + * Drain and destroy @worker. It has the same conditions
    + * for use as drain_kthread_worker(), see above.
    + */
    +void destroy_kthread_worker(struct kthread_worker *worker)
    +{
    + struct task_struct *task;
    +
    + task = worker->task;
    + if (WARN_ON(!task))
    + return;
    +
    + drain_kthread_worker(worker);
    + kthread_stop(task);
    + kfree(worker);
    +}
    +EXPORT_SYMBOL(destroy_kthread_worker);
    --
    1.8.5.6


    \
     
     \ /
      Last update: 2015-11-18 15:01    [W:4.024 / U:0.888 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site