From 265e6924f569431d431981c4c0d8d68baf0fb2a2 Mon Sep 17 00:00:00 2001 From: Suyang Chen Date: Wed, 13 Mar 2019 21:54:31 -0600 Subject: [PATCH] conf: Introduce virDomainDefCputuneValidate helper Introduce a simple validation helper to perform the cputune period and quota checks so that we can get rid of those repetitive chunks. Since this is a validation helper, this patch also moves the checks from the 'parse' phase into the 'validation' phase. Signed-off-by: Suyang Chen Reviewed-by: Erik Skultety --- src/conf/domain_conf.c | 114 ++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 69 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b77f536ca5..114d7edf4f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -6566,6 +6566,48 @@ virDomainDefLifecycleActionValidate(const virDomainDef *def) } +#define CPUTUNE_VALIDATE_PERIOD(name) \ + do { \ + if (def->cputune.name > 0 && \ + (def->cputune.name < 1000 || def->cputune.name > 1000000)) { \ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ + _("Value of cputune '%s' must be in range " \ + "[1000, 1000000]"), #name); \ + return -1; \ + } \ + } while (0) + +#define CPUTUNE_VALIDATE_QUOTA(name) \ + do { \ + if (def->cputune.name > 0 && \ + (def->cputune.name < 1000 || \ + def->cputune.name > 18446744073709551LL)) { \ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \ + _("Value of cputune '%s' must be in range " \ + "[1000, 18446744073709551]"), #name); \ + return -1; \ + } \ + } while (0) + +static int +virDomainDefCputuneValidate(const virDomainDef *def) +{ + CPUTUNE_VALIDATE_PERIOD(period); + CPUTUNE_VALIDATE_PERIOD(global_period); + CPUTUNE_VALIDATE_PERIOD(emulator_period); + CPUTUNE_VALIDATE_PERIOD(iothread_period); + + CPUTUNE_VALIDATE_QUOTA(quota); + CPUTUNE_VALIDATE_QUOTA(global_quota); + CPUTUNE_VALIDATE_QUOTA(emulator_quota); + CPUTUNE_VALIDATE_QUOTA(iothread_quota); + + return 0; +} +#undef CPUTUNE_VALIDATE_PERIOD +#undef CPUTUNE_VALIDATE_QUOTA + + static int virDomainDefMemtuneValidate(const virDomainDef *def) { @@ -6685,6 +6727,9 @@ virDomainDefValidateInternal(const virDomainDef *def, if (virDomainDefOSValidate(def, xmlopt) < 0) return -1; + if (virDomainDefCputuneValidate(def) < 0) + return -1; + return 0; } @@ -19673,14 +19718,6 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } - if (def->cputune.period > 0 && - (def->cputune.period < 1000 || def->cputune.period > 1000000)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Value of cputune period must be in range " - "[1000, 1000000]")); - goto error; - } - if (virXPathLongLong("string(./cputune/quota[1])", ctxt, &def->cputune.quota) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -19688,15 +19725,6 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } - if (def->cputune.quota > 0 && - (def->cputune.quota < 1000 || - def->cputune.quota > 18446744073709551LL)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Value of cputune quota must be in range " - "[1000, 18446744073709551]")); - goto error; - } - if (virXPathULongLong("string(./cputune/global_period[1])", ctxt, &def->cputune.global_period) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -19704,14 +19732,6 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } - if (def->cputune.global_period > 0 && - (def->cputune.global_period < 1000 || def->cputune.global_period > 1000000)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Value of cputune global period must be in range " - "[1000, 1000000]")); - goto error; - } - if (virXPathLongLong("string(./cputune/global_quota[1])", ctxt, &def->cputune.global_quota) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -19719,15 +19739,6 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } - if (def->cputune.global_quota > 0 && - (def->cputune.global_quota < 1000 || - def->cputune.global_quota > 18446744073709551LL)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Value of cputune global quota must be in range " - "[1000, 18446744073709551]")); - goto error; - } - if (virXPathULongLong("string(./cputune/emulator_period[1])", ctxt, &def->cputune.emulator_period) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -19735,15 +19746,6 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } - if (def->cputune.emulator_period > 0 && - (def->cputune.emulator_period < 1000 || - def->cputune.emulator_period > 1000000)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Value of cputune emulator_period must be in range " - "[1000, 1000000]")); - goto error; - } - if (virXPathLongLong("string(./cputune/emulator_quota[1])", ctxt, &def->cputune.emulator_quota) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -19751,14 +19753,6 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } - if (def->cputune.emulator_quota > 0 && - (def->cputune.emulator_quota < 1000 || - def->cputune.emulator_quota > 18446744073709551LL)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Value of cputune emulator_quota must be in range " - "[1000, 18446744073709551]")); - goto error; - } if (virXPathULongLong("string(./cputune/iothread_period[1])", ctxt, &def->cputune.iothread_period) < -1) { @@ -19767,15 +19761,6 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } - if (def->cputune.iothread_period > 0 && - (def->cputune.iothread_period < 1000 || - def->cputune.iothread_period > 1000000)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Value of cputune iothread_period must be in range " - "[1000, 1000000]")); - goto error; - } - if (virXPathLongLong("string(./cputune/iothread_quota[1])", ctxt, &def->cputune.iothread_quota) < -1) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -19783,15 +19768,6 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } - if (def->cputune.iothread_quota > 0 && - (def->cputune.iothread_quota < 1000 || - def->cputune.iothread_quota > 18446744073709551LL)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Value of cputune iothread_quota must be in range " - "[1000, 18446744073709551]")); - goto error; - } - if ((n = virXPathNodeSet("./cputune/vcpupin", ctxt, &nodes)) < 0) goto error;