Hi, I have written an implementation of a workqueue based on wfcqueue (fifo workqueue), wfstack (lifo wait queue) including a work-stealing scheme. I think this could scale very naturally to large workloads, and it skips the overhead of sys_futex when wakees are already running. Since the wakeup scheme is very lightweight when work is ongoing, we use it extensively.
It also makes extensive use of wfcqueue "splice" operation to move work batch in bulk amongst queue and worker threads. It is a O(1) operation which does not need to touch the content of the queue. RCU is used to lookup the sibling worker threads for work stealing and to wake the siblings of a thread busy handling work. It's at: git://git.urcu.so/urcu.git branch: urcu/workqueue-wakeup or gitweb of the top commit: http://git.lttng.org/?p=userspace-rcu.git;a=commit;h=2c6a5414ed2ab44be24211d15a5d9f1f40dbfc74 Note that this is work in progress, compile-tested only. I also need to write extensive tests. Feedback is welcome, Thanks! Mathieu -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
