From: Divya Garg Date: Thu, 13 Jan 2022 07:33:40 +0000 (-0800) Subject: Add the port allocation logic for isa-serial devices. X-Git-Tag: v8.1.0-rc1~460 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=11ddab1daf7ba0f5593d8dafdf6584acfd50433a;p=thirdparty%2Flibvirt.git Add the port allocation logic for isa-serial devices. This commit takes care of following cases: -> Check availability of requested ports. ->The total number of requested ports should not be more than VIR_MAX_ISA_SERIAL_PORTS. ->The ports requested should be less than VIR_MAX_ISA_SERIAL_PORTS. ->VIR_MAX_ISA_SERIAL_PORTS should correspond to MAX_ISA_SERIAL_PORTS specified in QEMU code commit def337ffda34d331404bd7f1a42726b71500df22. -> Prevent duplicate device assignments to the same port. -> In case no ports are provided in the XML, this patch scans the list of unused isa-serial indices to automatically assign available ports for this VM. Signed-off-by: Divya Garg Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik --- diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5691b8d2d5..a805f7f6a3 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -5330,6 +5330,58 @@ virDomainHostdevDefPostParse(virDomainHostdevDef *dev, } +static int +virDomainChrIsaSerialDefPostParse(virDomainDef *def) +{ + size_t i; + size_t isa_serial_count = 0; + bool used_serial_port[VIR_MAX_ISA_SERIAL_PORTS] = { false }; + + /* Perform all the required checks. */ + for (i = 0; i < def->nserials; i++) { + if (def->serials[i]->targetType != VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL) + continue; + + if (isa_serial_count++ >= VIR_MAX_ISA_SERIAL_PORTS || + def->serials[i]->target.port >= VIR_MAX_ISA_SERIAL_PORTS) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Maximum supported number of ISA serial ports is '%d'"), + VIR_MAX_ISA_SERIAL_PORTS); + return -1; + } + + if (def->serials[i]->target.port != -1) { + if (used_serial_port[def->serials[i]->target.port]) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("target port '%d' already allocated"), + def->serials[i]->target.port); + return -1; + } + used_serial_port[def->serials[i]->target.port] = true; + } + } + + /* Assign the ports to the devices. */ + for (i = 0; i < def->nserials; i++) { + size_t j; + + if (def->serials[i]->targetType != VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL || + def->serials[i]->target.port != -1) + continue; + + for (j = 0; j < VIR_MAX_ISA_SERIAL_PORTS; j++) { + if (!used_serial_port[j]) { + def->serials[i]->target.port = j; + used_serial_port[j] = true; + break; + } + } + } + + return 0; +} + + static void virDomainChrDefPostParse(virDomainChrDef *chr, const virDomainDef *def) @@ -6197,6 +6249,9 @@ virDomainDefPostParse(virDomainDef *def, goto cleanup; } + if (virDomainChrIsaSerialDefPostParse(def) < 0) + return -1; + /* iterate the devices */ ret = virDomainDeviceInfoIterateFlags(def, virDomainDefPostParseDeviceIterator, @@ -19929,14 +19984,6 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, if (!chr) return NULL; - if (chr->target.port == -1) { - int maxport = -1; - for (j = 0; j < i; j++) { - if (def->serials[j]->target.port > maxport) - maxport = def->serials[j]->target.port; - } - chr->target.port = maxport + 1; - } def->serials[def->nserials++] = chr; } VIR_FREE(nodes); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 144ba4dd12..3cd0617c0f 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1187,6 +1187,12 @@ typedef enum { VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST } virDomainChrConsoleTargetType; +/* + * The value of VIR_MAX_ISA_SERIAL_PORTS corresponds to MAX_ISA_SERIAL_PORTS + * set in QEMU code base. + */ +#define VIR_MAX_ISA_SERIAL_PORTS 4 + typedef enum { VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE = 0, VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL, diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live+console-virtio.xml b/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live+console-virtio.xml index 38311b188c..72516555a0 100644 --- a/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live+console-virtio.xml +++ b/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live+console-virtio.xml @@ -74,7 +74,7 @@ - + @@ -82,7 +82,7 @@ - + diff --git a/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live.xml b/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live.xml index 3fe205430c..6197a2bfe3 100644 --- a/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live.xml +++ b/tests/qemuhotplugtestdomains/qemuhotplug-console-compat-2-live.xml @@ -74,7 +74,7 @@ - + @@ -82,7 +82,7 @@ - + diff --git a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.xml b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.xml index f27b119270..16734d9cce 100644 --- a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.xml +++ b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-notls.xml @@ -37,7 +37,7 @@ - + diff --git a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.xml b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.xml index be58ccc1da..15ce29c67d 100644 --- a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.xml +++ b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev-verify.xml @@ -29,7 +29,7 @@ - + diff --git a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.xml b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.xml index be58ccc1da..15ce29c67d 100644 --- a/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.xml +++ b/tests/qemuxml2argvdata/serial-tcp-tlsx509-chardev.xml @@ -29,7 +29,7 @@ - + diff --git a/tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.xml b/tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.xml index 8e44dea365..8bb7cbefae 100644 --- a/tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.xml +++ b/tests/qemuxml2argvdata/serial-tcp-tlsx509-secret-chardev.xml @@ -34,7 +34,7 @@ - + diff --git a/tests/qemuxml2xmloutdata/serial-tcp-tlsx509-chardev.xml b/tests/qemuxml2xmloutdata/serial-tcp-tlsx509-chardev.xml index aefd3513ce..4cdefed63d 100644 --- a/tests/qemuxml2xmloutdata/serial-tcp-tlsx509-chardev.xml +++ b/tests/qemuxml2xmloutdata/serial-tcp-tlsx509-chardev.xml @@ -37,7 +37,7 @@ - +