On 2024/7/26 21:03, Peter Krempa wrote:
+static virDomainThrottleGroupDef *
+virDomainThrottleGroupDefParseXML(xmlNodePtr node,
+                                  xmlXPathContextPtr ctxt)
+{
+    g_autoptr(virDomainThrottleGroupDef) group = g_new0(virDomainThrottleGroupDef, 1);
+
+    VIR_XPATH_NODE_AUTORESTORE(ctxt)
+    ctxt->node = node;
+
+    PARSE_THROTTLEGROUP(total_bytes_sec);
+    PARSE_THROTTLEGROUP(read_bytes_sec);
+    PARSE_THROTTLEGROUP(write_bytes_sec);
+    PARSE_THROTTLEGROUP(total_iops_sec);
+    PARSE_THROTTLEGROUP(read_iops_sec);
+    PARSE_THROTTLEGROUP(write_iops_sec);
+
+    PARSE_THROTTLEGROUP(total_bytes_sec_max);
+    PARSE_THROTTLEGROUP(read_bytes_sec_max);
+    PARSE_THROTTLEGROUP(write_bytes_sec_max);
+    PARSE_THROTTLEGROUP(total_iops_sec_max);
+    PARSE_THROTTLEGROUP(read_iops_sec_max);
+    PARSE_THROTTLEGROUP(write_iops_sec_max);
+
+    PARSE_THROTTLEGROUP(size_iops_sec);
+
+    PARSE_THROTTLEGROUP(total_bytes_sec_max_length);
+    PARSE_THROTTLEGROUP(read_bytes_sec_max_length);
+    PARSE_THROTTLEGROUP(write_bytes_sec_max_length);
+    PARSE_THROTTLEGROUP(total_iops_sec_max_length);
+    PARSE_THROTTLEGROUP(read_iops_sec_max_length);
+    PARSE_THROTTLEGROUP(write_iops_sec_max_length);
I'd prefer if we had only one copy of the code parsing this and the
equivalent disk throttling data so that the code doesn't need to be
duplicated. The cleanup can be done as a followup though.

in v4 drafting, I am defining the following common macro to avoid duplication of iterating all options in all parsing and formatting codes for both iotune and throttlegroup:

#define FOR_EACH_IOTUNE_ULL_OPTION(process) \
    process(total_bytes_sec) \
    process(read_bytes_sec) \
    process(write_bytes_sec) \
    process(total_iops_sec) \
    process(read_iops_sec) \
    process(write_iops_sec) \
    process(total_bytes_sec_max) \
    process(read_bytes_sec_max) \
    process(write_bytes_sec_max) \
    process(total_iops_sec_max) \
    process(read_iops_sec_max) \
    process(write_iops_sec_max) \
    process(size_iops_sec) \
    process(total_bytes_sec_max_length) \
    process(read_bytes_sec_max_length) \
    process(write_bytes_sec_max_length) \
    process(total_iops_sec_max_length) \
    process(read_iops_sec_max_length) \
    process(write_iops_sec_max_length)

and define different "process" macro for parse and format, and this can be reused by iotune and format by just calling e.g. 

FOR_EACH_IOTUNE_ULL_OPTION(PARSE_IOTUNE);

FOR_EACH_IOTUNE_ULL_OPTION(FORMAT_IOTUNE);


-- 
Thanks and Regards,

Wu