lkml.org 
[lkml]   [2015]   [Sep]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC v2 04/18] kthread: Add destroy_kthread_worker()
    Date
    The current kthread worker users call flush() and stop() explicitly.
    The new function will make it easier and will do it better. Also it
    frees the kthread_worker struct that has been allocated by
    create_kthread_worker().

    Note that flush() does not guarantee that the queue is empty. drain()
    is more safe. It returns when the queue is really empty. Also it warns
    when too many work is being queued when draining.

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

    diff --git a/include/linux/kthread.h b/include/linux/kthread.h
    index e390069a3f68..bef97e06d2b6 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 e6424cf17cbd..65c263336b8b 100644
    --- a/kernel/kthread.c
    +++ b/kernel/kthread.c
    @@ -809,3 +809,23 @@ 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
    + *
    + * Destroy @worker. It should be idle when this is called.
    + */
    +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-09-21 15:21    [W:2.193 / U:0.348 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site