Re: [RFC v3 1/2] Add the port allocation logic for isa-serial devices.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




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






[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux