On Thu, Jun 16, 2016 at 01:17:25PM +0200, Petr Mladek wrote: > +/** > + * kthread_drain_worker - drain a kthread worker > + * @worker: worker to be drained > + * > + * Wait until there is no work queued for the given kthread worker. > + * @worker is flushed repeatedly until it becomes empty. The number > + * of flushing is determined by the depth of chaining and should > + * be relatively short. Whine if it takes too long. > + *
> + * The caller is responsible for blocking all users of this kthread > + * worker from queuing new works. Also it is responsible for blocking > + * the already queued works from an infinite re-queuing! This, I really dislike that. And it makes the kthread_destroy_worker() from the next patch unnecessarily fragile. Why not add a kthread_worker::blocked flag somewhere and refuse/WARN kthread_queue_work() when that is set. > + */ > +void kthread_drain_worker(struct kthread_worker *worker) > +{ > + int flush_cnt = 0; > + > + spin_lock_irq(&worker->lock); > + > + while (!list_empty(&worker->work_list)) { > + spin_unlock_irq(&worker->lock); > + > + kthread_flush_worker(worker); > + WARN_ONCE(flush_cnt++ > 10, > + "kthread worker %s: kthread_drain_worker() isn't > complete after %u tries\n", > + worker->task->comm, flush_cnt); > + > + spin_lock_irq(&worker->lock); > + } > + > + spin_unlock_irq(&worker->lock); > +} > +EXPORT_SYMBOL(kthread_drain_worker); > -- > 1.8.5.6 >