Rework the code in a set of 3 macros that will use the "base" of
'bytes' or 'iops' and build up the prefixes of 'total_',
'read_',
and 'write_' before adding the postfixes of '_sec', '_sec_max',
and '_sec_max_length' and making the param->field comparison and
adding of the field.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
NB: Hopefully this applies - my branch is based off of the git head
which I refreshed prior to sending the patch
Since I missed 2.3, I figured why not try to make the change.
src/qemu/qemu_driver.c | 216 +++++++++++--------------------------------------
1 file changed, 45 insertions(+), 171 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2b5b6fc..cbf9483 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -17321,6 +17321,41 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
VIR_DOMAIN_TUNABLE_BLKDEV_DISK, path) < 0)
goto endjob;
+#define SET_IOTUNE_FIELD(FIELD, BOOL, CONST) \
+ do { \
+ info.FIELD = params->value.ul; \
+ BOOL = true; \
+ if (virTypedParamsAddULLong(&eventParams, &eventNparams, \
+ &eventMaxparams, \
+ VIR_DOMAIN_TUNABLE_BLKDEV_##CONST, \
+ param->value.ul) < 0) \
+ goto endjob; \
+ } while (0);
+
+/* Taking a prefix build by CHECK_SET_IOTUNE, add the postfix of "_sec",
+ * "_sec_max", and "_sec_max_length" to each of the variables in
order to
+ * in order to check each of the ways one of these can be used. The boolean
+ * doesn't care if "total_", "read_", or "write_" is
the prefix. */
+#define CHECK_IOTUNE(FIELD, BOOL, CONST) \
+ if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_##CONST##_SEC)) { \
+ SET_IOTUNE_FIELD(FIELD##_sec, set_##BOOL, CONST##_SEC); \
+ } else if (STREQ(param->field, \
+ VIR_DOMAIN_BLOCK_IOTUNE_##CONST##_SEC_MAX)) { \
+ SET_IOTUNE_FIELD(FIELD##_sec_max, set_##BOOL##_max, CONST##_SEC_MAX); \
+ } else if (STREQ(param->field, \
+ VIR_DOMAIN_BLOCK_IOTUNE_##CONST##_SEC_MAX_LENGTH)) { \
+ SET_IOTUNE_FIELD(FIELD##_sec_max_length, set_##BOOL##_max_length, \
+ CONST##_SEC_MAX_LENGTH); \
+ }
+
+/* For "bytes" and "tune", prepend the "total_",
"read_", and "write_" onto
+ * the field/const names, but also passing the "base" field to be used as the
+ * basis of the boolean. */
+#define CHECK_SET_IOTUNE(FIELD, CONST) \
+ CHECK_IOTUNE(total_##FIELD, FIELD, TOTAL_##CONST); \
+ CHECK_IOTUNE(read_##FIELD, FIELD, READ_##CONST); \
+ CHECK_IOTUNE(write_##FIELD, FIELD, WRITE_##CONST);
+
for (i = 0; i < nparams; i++) {
virTypedParameterPtr param = ¶ms[i];
@@ -17331,178 +17366,17 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
goto endjob;
}
- if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC)) {
- info.total_bytes_sec = param->value.ul;
- set_bytes = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC)) {
- info.read_bytes_sec = param->value.ul;
- set_bytes = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC)) {
- info.write_bytes_sec = param->value.ul;
- set_bytes = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC)) {
- info.total_iops_sec = param->value.ul;
- set_iops = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC)) {
- info.read_iops_sec = param->value.ul;
- set_iops = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC)) {
- info.write_iops_sec = param->value.ul;
- set_iops = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX)) {
- info.total_bytes_sec_max = param->value.ul;
- set_bytes_max = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC_MAX,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX)) {
- info.read_bytes_sec_max = param->value.ul;
- set_bytes_max = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC_MAX,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX)) {
- info.write_bytes_sec_max = param->value.ul;
- set_bytes_max = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC_MAX,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX)) {
- info.total_iops_sec_max = param->value.ul;
- set_iops_max = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC_MAX,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX)) {
- info.read_iops_sec_max = param->value.ul;
- set_iops_max = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC_MAX,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX)) {
- info.write_iops_sec_max = param->value.ul;
- set_iops_max = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC_MAX,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_SIZE_IOPS_SEC)) {
- info.size_iops_sec = param->value.ul;
- set_size_iops = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
- VIR_DOMAIN_TUNABLE_BLKDEV_SIZE_IOPS_SEC,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX_LENGTH)) {
- info.total_bytes_sec_max_length = param->value.ul;
- set_bytes_max_length = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
-
VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC_MAX_LENGTH,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX_LENGTH)) {
- info.read_bytes_sec_max_length = param->value.ul;
- set_bytes_max_length = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
-
VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC_MAX_LENGTH,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX_LENGTH)) {
- info.write_bytes_sec_max_length = param->value.ul;
- set_bytes_max_length = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
-
VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC_MAX_LENGTH,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX_LENGTH)) {
- info.total_iops_sec_max_length = param->value.ul;
- set_iops_max_length = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
-
VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC_MAX_LENGTH,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX_LENGTH)) {
- info.read_iops_sec_max_length = param->value.ul;
- set_iops_max_length = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
-
VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC_MAX_LENGTH,
- param->value.ul) < 0)
- goto endjob;
- } else if (STREQ(param->field,
- VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX_LENGTH)) {
- info.write_iops_sec_max_length = param->value.ul;
- set_iops_max_length = true;
- if (virTypedParamsAddULLong(&eventParams, &eventNparams,
- &eventMaxparams,
-
VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC_MAX_LENGTH,
- param->value.ul) < 0)
- goto endjob;
- }
+ /* Use the macros to check the different fields that can be set for
+ * bytes and iops. In the end 18 different combinations are tried. */
+ CHECK_SET_IOTUNE(bytes, BYTES);
+ CHECK_SET_IOTUNE(iops, IOPS);
+ if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_SIZE_IOPS_SEC))
+ SET_IOTUNE_FIELD(size_iops_sec, set_size_iops, SIZE_IOPS_SEC);
+
}
+#undef SET_IOTUNE_FIELD
+#undef CHECK_IOTUNE
+#undef CHECK_SET_IOTUNE
if ((info.total_bytes_sec && info.read_bytes_sec) ||
(info.total_bytes_sec && info.write_bytes_sec)) {
--
2.7.4