[RFC v3 1/2] Add the port allocation logic for isa-serial devices.
Divya Garg
divya.garg at nutanix.com
Tue Jan 11 12:19:40 UTC 2022
On 11/01/22 4:09 pm, Ani Sinha wrote:
> Please add SOB.
Yes Thankyou so much. Should I have a new version for it or on the same
thread send
the updated patches ?
>
> On Mon, 10 Jan 2022, Divya Garg wrote:
>
>> 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.
>> ---
>> 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 5d688e7748..295d75b768 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 b916f30412..850ebddf52 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 9b0b8b3e73..522f0184d3 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 75c6c7f5f4..d41f5ee03e 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 75c6c7f5f4..d41f5ee03e 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 670f282b84..2bf954bc9f 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 7fde19f283..de11465233 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
>>
>>
More information about the libvir-list
mailing list