+
+ /*
+ * Keep one work entry for ourself. This ensures forward
+ * progress amongst stealing co-workers. This also ensures that
+ * when a worker grab some work from the global workqueue, it
+ * will have at least one work item to deal with.
+ */
+ if (worker->own == NULL) {
+ if (!steal) {
+ /*
+ * Try to grab own work from worker workqueue to
+ * preserve FIFO order.
+ */
+ node = cds_wfcq_dequeue_blocking(&worker->head,
+ &worker->tail);
+ if (node)
+ goto got_node;
+ }
+ node = __cds_wfcq_dequeue_blocking(&tmp_head, &tmp_tail);
+ assert(node != NULL);
+got_node:
+ worker->own = caa_container_of(node, struct urcu_work, node);
+ }
+
+ /* Splice into worker workqueue. */
+ splice_ret = __cds_wfcq_splice_blocking(&worker->head,