From nobody Mon Feb 9 09:18:21 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1653311362; cv=none; d=zohomail.com; s=zohoarc; b=TYgAxZp2RHLesd2QHkrmVxthHYxYc6vCyIsfHsBxVz8FqDqnb0vTAPggPIH6AjWWpyUXcibOu855fr+o3ED8oIPH6G3AeARE0Yl45bbsvYmto5Q7ywDOLkrkEqCELzDhpiIJRFmfc1E2GreZ2Zjeq0LqpUv6lkxoXfR1e4ZRj7w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1653311362; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=nsXx0fWc6MUGAzaLxbK9Ma0o9pXc5dV4cHjIErg8om4=; b=l9E1/c1QvpYngmWsJgYW7SvcZ3SJM6ot3l2UYHX3gwm8HotADal+soEYV0aU+OeBMWfp/Wm47Ca4pFVQIbRTyI8flO2PU3U3aDFqi7pw3B6Ujo0WghRAKAQ91jWPQvdO7/2aNEDLtOOnXeJgdh6+QZ9aUK9xXnKcuWldocsP0WU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 165331136200652.085877127738854; Mon, 23 May 2022 06:09:22 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-122-QMxX9XysO06VwPtSNf2PqA-1; Mon, 23 May 2022 09:09:15 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C169281B547; Mon, 23 May 2022 13:09:09 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id A81C8112131B; Mon, 23 May 2022 13:09:09 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 2E788194706F; Mon, 23 May 2022 13:09:09 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 03FD3194705A for ; Mon, 23 May 2022 13:09:06 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id ED36C40C1438; Mon, 23 May 2022 13:09:05 +0000 (UTC) Received: from maggie.redhat.com (unknown [10.43.2.180]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9375E400E115 for ; Mon, 23 May 2022 13:09:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1653311360; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=nsXx0fWc6MUGAzaLxbK9Ma0o9pXc5dV4cHjIErg8om4=; b=RugTZ+9YO/bt9gTRiJTKCVnJUbBML4De3BxVrI5jcdtC3tg51w1ZxpR0jLe8o0FGfCNek2 4dmhAPBmZ9HMRgKZ9Le7XKsV7gZLoF4C3R+JArS8EykDfjtnCpjyXG1OZwguReRvZGya3c abcE+TWkStZMW2EMEQs+o0MA20uX/qo= X-MC-Unique: QMxX9XysO06VwPtSNf2PqA-1 X-Original-To: libvir-list@listman.corp.redhat.com From: Michal Privoznik To: libvir-list@redhat.com Subject: [PATCH 17/17] virDomainTimerDefParseXML: Switch to virXMLPropEnumDefault() Date: Mon, 23 May 2022 15:08:52 +0200 Message-Id: <06f122a92676516f119b0b12b94b9f46bdfe9565.1653311262.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1653311362673100011 Content-Type: text/plain; charset="utf-8"; x-default="true" The virDomainTimerDefParseXML() function uses old style of parsing XML (virXMLPropString + str2enum conversion). Use virXMLPropEnumDefault() which encapsulates those steps. Signed-off-by: Michal Privoznik --- src/conf/domain_conf.c | 105 +++++++++++++-------------------------- src/conf/domain_conf.h | 14 +++--- src/libxl/libxl_conf.c | 6 ++- src/libxl/xen_common.c | 6 ++- src/lxc/lxc_cgroup.c | 2 +- src/lxc/lxc_controller.c | 2 +- src/qemu/qemu_command.c | 11 +++- src/qemu/qemu_validate.c | 8 ++- 8 files changed, 69 insertions(+), 85 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 52a34cd131..27fe6c9fbf 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -11962,98 +11962,61 @@ virDomainTimerDefParseXML(xmlNodePtr node, virDomainTimerDef *def; VIR_XPATH_NODE_AUTORESTORE(ctxt) xmlNodePtr catchup; - int ret; - g_autofree char *name =3D NULL; - g_autofree char *tickpolicy =3D NULL; - g_autofree char *track =3D NULL; - g_autofree char *mode =3D NULL; =20 def =3D g_new0(virDomainTimerDef, 1); =20 ctxt->node =3D node; =20 - name =3D virXMLPropString(node, "name"); - if (name =3D=3D NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("missing timer name")); + if (virXMLPropEnum(node, "name", + virDomainTimerNameTypeFromString, + VIR_XML_PROP_REQUIRED, + &def->name) < 0) goto error; - } - if ((def->name =3D virDomainTimerNameTypeFromString(name)) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown timer name '%s'"), name); - goto error; - } =20 if (virXMLPropTristateBool(node, "present", VIR_XML_PROP_NONE, &def->present) < 0) goto error; =20 - tickpolicy =3D virXMLPropString(node, "tickpolicy"); - if (tickpolicy !=3D NULL) { - if ((def->tickpolicy =3D virDomainTimerTickpolicyTypeFromString(ti= ckpolicy)) <=3D 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown timer tickpolicy '%s'"), tickpolicy); - goto error; - } - } + if (virXMLPropEnum(node, "tickpolicy", + virDomainTimerTickpolicyTypeFromString, + VIR_XML_PROP_NONZERO, + &def->tickpolicy) < 0) + goto error; =20 - track =3D virXMLPropString(node, "track"); - if (track !=3D NULL) { - if ((def->track =3D virDomainTimerTrackTypeFromString(track)) <=3D= 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown timer track '%s'"), track); - goto error; - } - } + if (virXMLPropEnum(node, "track", + virDomainTimerTrackTypeFromString, + VIR_XML_PROP_NONZERO, + &def->track) < 0) + goto error; =20 - ret =3D virXPathULongLong("string(./@frequency)", ctxt, &def->frequenc= y); - if (ret =3D=3D -1) { - def->frequency =3D 0; - } else if (ret < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("invalid timer frequency")); + if (virXMLPropULongLong(node, "frequency", 10, + VIR_XML_PROP_NONE, + &def->frequency) < 0) goto error; - } =20 - mode =3D virXMLPropString(node, "mode"); - if (mode !=3D NULL) { - if ((def->mode =3D virDomainTimerModeTypeFromString(mode)) <=3D 0)= { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown timer mode '%s'"), mode); - goto error; - } - } + if (virXMLPropEnum(node, "mode", + virDomainTimerModeTypeFromString, + VIR_XML_PROP_NONZERO, + &def->mode) < 0) + goto error; =20 catchup =3D virXPathNode("./catchup", ctxt); if (catchup !=3D NULL) { - ret =3D virXPathULong("string(./catchup/@threshold)", ctxt, - &def->catchup.threshold); - if (ret =3D=3D -1) { - def->catchup.threshold =3D 0; - } else if (ret < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("invalid catchup threshold")); + if (virXMLPropUInt(catchup, "threshold", 10, + VIR_XML_PROP_NONE, + &def->catchup.threshold) < 0) goto error; - } =20 - ret =3D virXPathULong("string(./catchup/@slew)", ctxt, &def->catch= up.slew); - if (ret =3D=3D -1) { - def->catchup.slew =3D 0; - } else if (ret < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("invalid catchup slew")); + if (virXMLPropUInt(catchup, "slew", 10, + VIR_XML_PROP_NONE, + &def->catchup.slew) < 0) goto error; - } =20 - ret =3D virXPathULong("string(./catchup/@limit)", ctxt, &def->catc= hup.limit); - if (ret =3D=3D -1) { - def->catchup.limit =3D 0; - } else if (ret < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("invalid catchup limit")); + if (virXMLPropUInt(catchup, "limit", 10, + VIR_XML_PROP_NONE, + &def->catchup.limit) < 0) goto error; - } } =20 return def; @@ -26197,11 +26160,11 @@ virDomainTimerDefFormat(virBuffer *buf, } =20 if (def->catchup.threshold > 0) - virBufferAsprintf(&catchupAttr, " threshold=3D'%lu'", def->catchup= .threshold); + virBufferAsprintf(&catchupAttr, " threshold=3D'%u'", def->catchup.= threshold); if (def->catchup.slew > 0) - virBufferAsprintf(&catchupAttr, " slew=3D'%lu'", def->catchup.slew= ); + virBufferAsprintf(&catchupAttr, " slew=3D'%u'", def->catchup.slew); if (def->catchup.limit > 0) - virBufferAsprintf(&catchupAttr, " limit=3D'%lu'", def->catchup.lim= it); + virBufferAsprintf(&catchupAttr, " limit=3D'%u'", def->catchup.limi= t); =20 virXMLFormatElement(&timerChld, "catchup", &catchupAttr, NULL); virXMLFormatElement(buf, "timer", &timerAttr, &timerChld); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index cad19a3d5d..a6acffb4a4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2442,24 +2442,24 @@ struct _virDomainThreadSchedParam { }; =20 struct _virDomainTimerCatchupDef { - unsigned long threshold; - unsigned long slew; - unsigned long limit; + unsigned int threshold; + unsigned int slew; + unsigned int limit; }; =20 struct _virDomainTimerDef { - int name; + virDomainTimerNameType name; virTristateBool present; - int tickpolicy; /* enum virDomainTimerTickpolicyType */ + virDomainTimerTickpolicyType tickpolicy; =20 virDomainTimerCatchupDef catchup; =20 /* track is only valid for name=3D'platform|rtc' */ - int track; /* enum virDomainTimerTrackType */ + virDomainTimerTrackType track; =20 /* frequency & mode are only valid for name=3D'tsc' */ unsigned long long frequency; /* in Hz, unspecified =3D 0 */ - int mode; /* enum virDomainTimerModeType */ + virDomainTimerModeType mode; }; =20 typedef enum { diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 82af406e2d..6aba458281 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -406,7 +406,7 @@ libxlMakeDomBuildInfo(virDomainDef *def, } =20 for (i =3D 0; i < clock.ntimers; i++) { - switch ((virDomainTimerNameType) clock.timers[i]->name) { + switch (clock.timers[i]->name) { case VIR_DOMAIN_TIMER_NAME_TSC: switch (clock.timers[i]->mode) { case VIR_DOMAIN_TIMER_MODE_NATIVE: @@ -418,6 +418,10 @@ libxlMakeDomBuildInfo(virDomainDef *def, case VIR_DOMAIN_TIMER_MODE_EMULATE: b_info->tsc_mode =3D LIBXL_TSC_MODE_ALWAYS_EMULATE; break; + case VIR_DOMAIN_TIMER_MODE_NONE: + case VIR_DOMAIN_TIMER_MODE_AUTO: + case VIR_DOMAIN_TIMER_MODE_SMPSAFE: + case VIR_DOMAIN_TIMER_MODE_LAST: default: b_info->tsc_mode =3D LIBXL_TSC_MODE_DEFAULT; } diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c index 6487cb63df..f8c63d5f92 100644 --- a/src/libxl/xen_common.c +++ b/src/libxl/xen_common.c @@ -2106,7 +2106,7 @@ xenFormatHypervisorFeatures(virConf *conf, virDomainD= ef *def) } =20 for (i =3D 0; i < def->clock.ntimers; i++) { - switch ((virDomainTimerNameType)def->clock.timers[i]->name) { + switch (def->clock.timers[i]->name) { case VIR_DOMAIN_TIMER_NAME_TSC: switch (def->clock.timers[i]->mode) { case VIR_DOMAIN_TIMER_MODE_NATIVE: @@ -2121,6 +2121,10 @@ xenFormatHypervisorFeatures(virConf *conf, virDomain= Def *def) if (xenConfigSetString(conf, "tsc_mode", "always_emulate")= < 0) return -1; break; + case VIR_DOMAIN_TIMER_MODE_NONE: + case VIR_DOMAIN_TIMER_MODE_AUTO: + case VIR_DOMAIN_TIMER_MODE_SMPSAFE: + case VIR_DOMAIN_TIMER_MODE_LAST: default: if (xenConfigSetString(conf, "tsc_mode", "default") < 0) return -1; diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c index d31fff5f98..420ec07650 100644 --- a/src/lxc/lxc_cgroup.c +++ b/src/lxc/lxc_cgroup.c @@ -335,7 +335,7 @@ static int virLXCCgroupSetupDeviceACL(virDomainDef *def, if (timer->present =3D=3D VIR_TRISTATE_BOOL_NO) continue; =20 - switch ((virDomainTimerNameType)timer->name) { + switch (timer->name) { case VIR_DOMAIN_TIMER_NAME_PLATFORM: case VIR_DOMAIN_TIMER_NAME_TSC: case VIR_DOMAIN_TIMER_NAME_KVMCLOCK: diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index d936f34793..42356eb1c9 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -1506,7 +1506,7 @@ virLXCControllerSetupTimers(virLXCController *ctrl) if (timer->present =3D=3D VIR_TRISTATE_BOOL_NO) continue; =20 - switch ((virDomainTimerNameType)timer->name) { + switch (timer->name) { case VIR_DOMAIN_TIMER_NAME_PLATFORM: case VIR_DOMAIN_TIMER_NAME_TSC: case VIR_DOMAIN_TIMER_NAME_KVMCLOCK: diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b863fd1c32..6574c4c58b 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6200,6 +6200,8 @@ qemuBuildClockArgStr(virDomainClockDef *def) case VIR_DOMAIN_TIMER_TRACK_REALTIME: virBufferAddLit(&buf, ",clock=3Drt"); break; + case VIR_DOMAIN_TIMER_TRACK_LAST: + break; } =20 switch (def->timers[i]->tickpolicy) { @@ -6215,6 +6217,8 @@ qemuBuildClockArgStr(virDomainClockDef *def) case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD: return NULL; + case VIR_DOMAIN_TIMER_TICKPOLICY_LAST: + break; } break; /* no need to check other timers - there is only one rt= c */ } @@ -6246,7 +6250,7 @@ qemuBuildClockCommandLine(virCommand *cmd, } =20 for (i =3D 0; i < def->clock.ntimers; i++) { - switch ((virDomainTimerNameType)def->clock.timers[i]->name) { + switch (def->clock.timers[i]->name) { case VIR_DOMAIN_TIMER_NAME_PLATFORM: /* qemuDomainDefValidateClockTimers will handle this * error condition */ @@ -6286,6 +6290,8 @@ qemuBuildClockCommandLine(virCommand *cmd, case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: /* no way to support this mode for pit in qemu */ return -1; + case VIR_DOMAIN_TIMER_TICKPOLICY_LAST: + return -1; } break; =20 @@ -6640,7 +6646,7 @@ qemuBuildCpuCommandLine(virCommand *cmd, for (i =3D 0; i < def->clock.ntimers; i++) { virDomainTimerDef *timer =3D def->clock.timers[i]; =20 - switch ((virDomainTimerNameType)timer->name) { + switch (timer->name) { case VIR_DOMAIN_TIMER_NAME_KVMCLOCK: if (timer->present !=3D VIR_TRISTATE_BOOL_ABSENT) { /* QEMU expects on/off -> virTristateSwitch. */ @@ -6667,6 +6673,7 @@ qemuBuildCpuCommandLine(virCommand *cmd, case VIR_DOMAIN_TIMER_TICKPOLICY_NONE: case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP: case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: + case VIR_DOMAIN_TIMER_TICKPOLICY_LAST: break; } break; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index f54b4587c0..a48b81c9c6 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -393,7 +393,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *de= f, for (i =3D 0; i < def->clock.ntimers; i++) { virDomainTimerDef *timer =3D def->clock.timers[i]; =20 - switch ((virDomainTimerNameType)timer->name) { + switch (timer->name) { case VIR_DOMAIN_TIMER_NAME_PLATFORM: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported timer type (name) '%s'"), @@ -426,6 +426,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *de= f, case VIR_DOMAIN_TIMER_TRACK_REALTIME: break; case VIR_DOMAIN_TIMER_TRACK_BOOT: + case VIR_DOMAIN_TIMER_TRACK_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported rtc timer track '%s'"), virDomainTimerTrackTypeToString(timer->trac= k)); @@ -443,6 +444,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *de= f, break; case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE: case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD: + case VIR_DOMAIN_TIMER_TICKPOLICY_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported rtc timer tickpolicy '%s'"), virDomainTimerTickpolicyTypeToString( @@ -474,6 +476,8 @@ qemuValidateDomainDefClockTimers(const virDomainDef *de= f, virDomainTimerTickpolicyTypeToString( timer->tickpolicy)); return -1; + case VIR_DOMAIN_TIMER_TICKPOLICY_LAST: + break; } break; =20 @@ -526,6 +530,8 @@ qemuValidateDomainDefClockTimers(const virDomainDef *de= f, virDomainTimerNameTypeToString(timer->name), virDomainTimerTickpolicyTypeToString(timer-= >tickpolicy)); return -1; + case VIR_DOMAIN_TIMER_TICKPOLICY_LAST: + break; } break; } --=20 2.35.1