Currently, the timers run on iothread within BQL, so virtio-block dataplane can not use throttle, as Stefan Hajnoczi pointed out in his patches to port dataplane onto block layer.(Thanks, Stefan) To enable this feature, I plan to enable timers to run on AioContext's thread. And maybe in future, hpet can run with its dedicated thread too.
Also, I see Alex Bligh is on the same effort by another method,(it is a good idea) "[RFC] aio/async: Add timed bottom-halves". So I think it is better to post my series for discussion, although I have not thought very clearly point, e.g. sigaction This series ports two parts of timer stuff onto AioContext: alarm timer and timer list. Currently I worked based on Stefanha's git tree https://github.com/stefanha/qemu.git dataplane-block-layer. --- Open issue: The thread safe problem on timer list. To resolve that, I plan to adopt the bh model. (Not sure about this, maybe Stefan's solution in another thread is better) Although leave most of the race issue unresolved, patch 4 has tried to fix one of them as Jan Kiszka points out that vm_clock can be read outside BQL, thanks Jan :) Liu Ping Fan (8): timer: associate alarm_timer with AioContext timer: pick out timer list info from QemuClock timer: make timers_state static timer: protect timers_state with lock timer: associate timer with AioContext timer: run timers on aio_poll block: associate BlockDriverState with AioContext block: enable throttle with aiocontext aio-posix.c | 2 + async.c | 12 ++ block.c | 13 ++- cpus.c | 29 ++++- hw/block/dataplane/virtio-blk.c | 1 + include/block/aio.h | 14 +++ include/block/block.h | 1 + include/block/block_int.h | 1 + include/qemu/timer.h | 24 +++- main-loop.c | 6 - qemu-timer.c | 237 +++++++++++++++++++++++++++------------- 11 files changed, 253 insertions(+), 87 deletions(-) -- 1.8.1.4