Hi, Here is my current wip on the throttle group support.
For the user interface I implemented Stefanha's idea proposed in Stuttgart. For the throttling algorithm I use a cooperative round robin scheduler. Classical round robin works with a fixed HZ ticks and it's totaly incompatible with the throttling algorithm. So the cooperative round robin scheduler is a way for each block device to decide if a pause must be done and a timer be armed and most important of all which other block device of the group must resume the work once the timer is fired. The advantages of this algorigthm are: -only one timer active at a given time (no more cpu usage than regular throttling) -no central place didacting the sheduling policy like a didactureship: we love collaboration isn't it ?:) -No need to deal with incoming queues to collect requests before scheduling then with and dispatchs queues -Compatible with the throttling code with almost no changes -As you go scheduling Best regards Benoît Benoît Canet (5): throttle: Extract timers from ThrottleState into a separate ThrottleTimers structure throttle: Add throttle group infrastructure. throttle: Add throttle group infrastructure tests throttle: Prepare to have multiple timers for one ThrottleState throttle: Add throttle group support. block.c | 173 +++++++++++++++++++++++++++++++----- block/qapi.c | 2 +- blockdev.c | 16 +++- hmp.c | 4 +- include/block/block.h | 2 +- include/block/block_int.h | 9 +- include/qemu/throttle-groups.h | 43 +++++++++ include/qemu/throttle.h | 42 ++++++--- qapi/block-core.json | 5 +- qemu-options.hx | 1 + qmp-commands.hx | 3 +- tests/test-throttle.c | 133 ++++++++++++++++++++-------- util/Makefile.objs | 1 + util/throttle-groups.c | 195 +++++++++++++++++++++++++++++++++++++++++ util/throttle.c | 103 +++++++++++++++------- 15 files changed, 616 insertions(+), 116 deletions(-) create mode 100644 include/qemu/throttle-groups.h create mode 100644 util/throttle-groups.c -- 2.1.0.rc1