/* * Queue work on a workqueue. Return non-zero if it was successfully * added. * * We queue the work to the CPU it was submitted, but there is no * guarantee that it will be processed by that CPU. */ int queue_work(struct workqueue_struct *wq, struct work_struct *work) { unsigned long flags; int ret = 0, cpu = get_cpu(); struct cpu_workqueue_struct *cwq = wq->cpu_wq + cpu; if (!test_and_set_bit(0, &work->pending)) { BUG_ON(!list_empty(&work->entry)); work->wq_data = cwq; spin_lock_irqsave(&cwq->lock, flags); list_add_tail(&work->entry, &cwq->worklist); cwq->insert_sequence++; wake_up(&cwq->more_work); spin_unlock_irqrestore(&cwq->lock, flags); ret = 1; } put_cpu(); return ret; }