On Fri, Aug 23, 2024 at 14:00:25 +0800, Chun Feng Wu wrote: > > 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: I was referring to the fact that the code that parses the old throttling XML is not refactored to use this new helper, thus keeping duplications. > > #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); Please do not do this. Do not hide this any deeper into macros. It's hard to understand and harder to debug.