Hello list, I plan to convert throttling to a block filter and write n way throttling support.
I discussed a bit with Stefan on the list and we came to the conclusion that the block filter API need group support. filter group: ------------- My current plan to implement this is to add the following fields to the BlockDriver structure. int bdrv_add_filter_group(const char *name, QDict options); int bdrv_reconfigure_filter_group(const char *name, QDict options); int bdrv_destroy_filter_group(const char *name); These three extra method would allow to create, reconfigure or destroy a block filter group. A block filter group contain the shared or non shared state of the blockfilter. For throttling it would contains the ThrottleState structure. Each block filter driver would contains a linked list of linked list where the BDS are registered grouped by filter groups state. The regular bdrv_open callback would be used to instantiate a block filter and add it to a filter group. This method would also take a new-node-name for the new filter. This node-name would become the name of the new filter. bdrv_close would cleanup and deregister from a filter group. An extra filter-group field in the option dict would allow the bdrv_open method to register the newly opened block filter in it's filter group. The BDS structure would have a direct pointer to it's filter group state. Utility methods to do the bdrv_add_filter_group bdrv_open then bdrv_swap to install a new filter can be provided by block.c. The same can be done for filter close and desinstallation. Legacy throttling QMP API ------------------------- The legacy throttling API would create throttling filters groups containing only one BDS. By default for every 1 way block filter block.c would create a filter group using the BDS id or node-name as group name. This allow for easy filer removal with the bds reference. Group throttling API -------------------- Commands would be added to create throttling filter groups reconfigure and remove them. Two additional commands would be added to create and insert a block filter in a given group or close and remove it. Before I start implementing something what are your thougths on this ? Best regards Benoît