lkml.org 
[lkml]   [2016]   [Aug]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 06/11] kthread: Add kthread_destroy_worker()
    Date
    The current kthread worker users call flush() and stop() explicitly.
    This function does the same plus it frees the kthread_worker struct
    in one call.

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

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

    diff --git a/include/linux/kthread.h b/include/linux/kthread.h
    index daeb2befbabf..afc8939da861 100644
    --- a/include/linux/kthread.h
    +++ b/include/linux/kthread.h
    @@ -136,4 +136,6 @@ bool kthread_queue_work(struct kthread_worker *worker,
    void kthread_flush_work(struct kthread_work *work);
    void kthread_flush_worker(struct kthread_worker *worker);

    +void kthread_destroy_worker(struct kthread_worker *worker);
    +
    #endif /* _LINUX_KTHREAD_H */
    diff --git a/kernel/kthread.c b/kernel/kthread.c
    index d9ba5e229cd3..3dc7f26d84d7 100644
    --- a/kernel/kthread.c
    +++ b/kernel/kthread.c
    @@ -819,3 +819,26 @@ void kthread_flush_worker(struct kthread_worker *worker)
    wait_for_completion(&fwork.done);
    }
    EXPORT_SYMBOL_GPL(kthread_flush_worker);
    +
    +/**
    + * kthread_destroy_worker - destroy a kthread worker
    + * @worker: worker to be destroyed
    + *
    + * Flush and destroy @worker. The simple flush is enough because the kthread
    + * worker API is used only in trivial scenarios. There are no multi-step state
    + * machines needed.
    + */
    +void kthread_destroy_worker(struct kthread_worker *worker)
    +{
    + struct task_struct *task;
    +
    + task = worker->task;
    + if (WARN_ON(!task))
    + return;
    +
    + kthread_flush_worker(worker);
    + kthread_stop(task);
    + WARN_ON(!list_empty(&worker->work_list));
    + kfree(worker);
    +}
    +EXPORT_SYMBOL(kthread_destroy_worker);
    --
    1.8.5.6
    \
     
     \ /
      Last update: 2016-08-09 17:41    [W:3.016 / U:1.624 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site