/* Queue @work to work processor @task for async execution. @task must have been created with kthread_worker_create(). Returns true if @work was successfully queued, false if it was already pending.  */
bool queue_kthread_work(struct kthread_worker *worker, struct kthread_work *work)
/* Queue @work to work processor @task for async execution. @task must have been created with kthread_worker_create(). Returns true if @work was successfully queued, false if it was already pending.  */
bool queue_kthread_work(struct kthread_worker *worker, struct kthread_work *work)
{
	bool ret = false;
	unsigned long flags;
	spin_lock_irqsave(&worker->lock, flags);
	if (list_empty(&work->node)) {
		list_add_tail(&work->node, &worker->work_list);
		work->queue_seq++;
		if (likely(worker->task))
			wake_up_process(worker->task);
		ret = true;
	}
	spin_unlock_irqrestore(&worker->lock, flags);
	return ret;
}