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 <divya.garg@xxxxxxxxxxx> --- src/conf/domain_conf.c | 61 ++++++++++++++++--- src/conf/domain_conf.h | 6 ++ ...g-console-compat-2-live+console-virtio.xml | 4 +- .../qemuhotplug-console-compat-2-live.xml | 4 +- .../serial-tcp-tlsx509-chardev-notls.xml | 2 +- .../serial-tcp-tlsx509-chardev-verify.xml | 2 +- .../serial-tcp-tlsx509-chardev.xml | 2 +- .../serial-tcp-tlsx509-secret-chardev.xml | 2 +- .../serial-tcp-tlsx509-chardev.xml | 2 +- 9 files changed, 68 insertions(+), 17 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5691b8d2d5..e468e98045 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -5330,6 +5330,56 @@ virDomainHostdevDefPostParse(virDomainHostdevDef *dev, } +static int +virDomainChrIsaSerialDefPostParse(virDomainDef *def) +{ + size_t i, j; + 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++) { + + 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 +6247,9 @@ virDomainDefPostParse(virDomainDef *def, goto cleanup; } + if (virDomainChrIsaSerialDefPostParse(def) < 0) + return -1; + /* iterate the devices */ ret = virDomainDeviceInfoIterateFlags(def, virDomainDefPostParseDeviceIterator, @@ -19929,14 +19982,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..a8f41dc8c2 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 @@ <alias name='serial0'/> </serial> <serial type='pty'> - <target type='isa-serial' port='0'> + <target type='isa-serial' port='1'> <model name='isa-serial'/> </target> <alias name='serial1'/> @@ -82,7 +82,7 @@ <serial type='tcp'> <source mode='bind' host='0.0.0.0' service='2445'/> <protocol type='raw'/> - <target type='isa-serial' port='1'> + <target type='isa-serial' port='2'> <model name='isa-serial'/> </target> <alias name='serial2'/> 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 @@ <alias name='serial0'/> </serial> <serial type='pty'> - <target type='isa-serial' port='0'> + <target type='isa-serial' port='1'> <model name='isa-serial'/> </target> <alias name='serial1'/> @@ -82,7 +82,7 @@ <serial type='tcp'> <source mode='bind' host='0.0.0.0' service='2445'/> <protocol type='raw'/> - <target type='isa-serial' port='1'> + <target type='isa-serial' port='2'> <model name='isa-serial'/> </target> <alias name='serial2'/> 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 @@ <serial type='tcp'> <source mode='connect' host='127.0.0.1' service='5555' tls='no'/> <protocol type='raw'/> - <target type='isa-serial' port='0'> + <target type='isa-serial' port='1'> <model name='isa-serial'/> </target> </serial> 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 @@ <serial type='tcp'> <source mode='connect' host='127.0.0.1' service='5555'/> <protocol type='raw'/> - <target port='0'/> + <target port='1'/> </serial> <console type='udp'> <source mode='bind' host='127.0.0.1' service='1111'/> 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 @@ <serial type='tcp'> <source mode='connect' host='127.0.0.1' service='5555'/> <protocol type='raw'/> - <target port='0'/> + <target port='1'/> </serial> <console type='udp'> <source mode='bind' host='127.0.0.1' service='1111'/> 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 @@ <serial type='tcp'> <source mode='connect' host='127.0.0.1' service='5555'/> <protocol type='raw'/> - <target port='0'/> + <target port='1'/> </serial> <console type='udp'> <source mode='bind' host='127.0.0.1' service='1111'/> 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 @@ <serial type='tcp'> <source mode='connect' host='127.0.0.1' service='5555'/> <protocol type='raw'/> - <target type='isa-serial' port='0'> + <target type='isa-serial' port='1'> <model name='isa-serial'/> </target> </serial> -- 2.25.1