[libvirt] [PATCH] Add support for multiple serial ports to Xen driver

Daniel P. Berrange berrange at redhat.com
Thu Jan 20 14:18:59 UTC 2011


On Thu, Jan 20, 2011 at 03:07:55PM +0100, Michal Novotny wrote:
> On 01/20/2011 03:07 PM, Daniel P. Berrange wrote:
> >On Thu, Jan 20, 2011 at 03:06:11PM +0100, Michal Novotny wrote:
> >>On 01/20/2011 02:53 PM, Daniel P. Berrange wrote:
> >>>On Thu, Jan 20, 2011 at 01:20:50PM +0100, Michal Novotny wrote:
> >>>>Hi,
> >>>>this is the patch for to support multiple serial ports
> >>>>for Xen driver. The definition for Xen has been
> >>>>introduced in BZ #614004 and this is adding
> >>>>support to libvirt-based tools.
> >>>>
> >>>>The patch was originally written for RHEL-5 and libvirt
> >>>>0.8.2 (RHEL-5.6) where it has been tested using
> >>>>the virsh command and correct device creation has
> >>>>been confirmed in the xend.log to have the same data
> >>>>for serial ports using both `xm create` and `virsh
> >>>>start` commands. Also, domains with both single and
> >>>>multiple serial ports has been tested to confirm
> >>>>it won't introduce any regression and everything
> >>>>was working fine according to my testing. This patch
> >>>>is the forward-port of RHEL-5 version of the patch.
> >>>>
> >>>>Michal
> >>>>
> >>>>Signed-off-by: Michal Novotny<minovotn at redhat.com>
> >>>>---
> >>>>  src/xen/xend_internal.c |   19 ++++++++++++-
> >>>>  src/xen/xm_internal.c   |   66 +++++++++++++++++++++++++++++++++++++++--------
> >>>>  3 files changed, 73 insertions(+), 14 deletions(-)
> >>>>
> >>>>diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> >>>>index 44d5a22..35cdd3c 100644
> >>>>--- a/src/xen/xend_internal.c
> >>>>+++ b/src/xen/xend_internal.c
> >>>>@@ -5959,8 +5959,23 @@ xenDaemonFormatSxpr(virConnectPtr conn,
> >>>>              }
> >>>>              if (def->serials) {
> >>>>                  virBufferAddLit(&buf, "(serial ");
> >>>>-                if (xenDaemonFormatSxprChr(def->serials[0],&buf)<   0)
> >>>>-                    goto error;
> >>>>+                /*
> >>>>+                 * If domain doesn't have multiple serial ports defined we
> >>>>+                 * keep the old-style formatting not to fail the sexpr tests
> >>>>+                 */
> >>>>+                if (def->nserials>   1) {
> >>>>+                    for (i = 0; i<   def->nserials; i++) {
> >>>>+                        virBufferAddLit(&buf, "(");
> >>>>+                        if (xenDaemonFormatSxprChr(def->serials[i],&buf)<   0)
> >>>>+                            goto error;
> >>>>+                        virBufferAddLit(&buf, ")");
> >>>>+                    }
> >>>>+                }
> >>>>+                else {
> >>>>+                    if (xenDaemonFormatSxprChr(def->serials[0],&buf)<   0)
> >>>>+                        goto error;
> >>>>+                }
> >>>>+
> >>>>                  virBufferAddLit(&buf, ")");
> >>>>              } else {
> >>>>                  virBufferAddLit(&buf, "(serial none)");
> >>>>diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> >>>>index bfb6698..1bb62d7 100644
> >>>>--- a/src/xen/xm_internal.c
> >>>>+++ b/src/xen/xm_internal.c
> >>>>@@ -1432,20 +1432,64 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
> >>>>              chr = NULL;
> >>>>          }
> >>>>
> >>>>-        if (xenXMConfigGetString(conf, "serial",&str, NULL)<   0)
> >>>>-            goto cleanup;
> >>>>-        if (str&&   STRNEQ(str, "none")&&
> >>>>-            !(chr = xenDaemonParseSxprChar(str, NULL)))
> >>>>-            goto cleanup;
> >>>>+        /* Try to get the list of values to support multiple serial ports */
> >>>>+        list = virConfGetValue(conf, "serial");
> >>>>+        if (list&&   list->type == VIR_CONF_LIST) {
> >>>>+            list = list->list;
> >>>>+            while (list) {
> >>>>+                char *port;
> >>>>+
> >>>>+                if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
> >>>>+                    goto skipport;
> >>>>+
> >>>>+                port = list->str;
> >>>>+                if (VIR_ALLOC(chr)<   0)
> >>>>+                    goto no_memory;
> >>>>
> >>>>-        if (chr) {
> >>>>-            if (VIR_ALLOC_N(def->serials, 1)<   0) {
> >>>>+                if (!(chr = xenDaemonParseSxprChar(port, NULL)))
> >>>>+                    goto skipport;
> >>>>+
> >>>>+                if (VIR_REALLOC_N(def->serials, def->nserials+1)<   0)
> >>>>+                    goto no_memory;
> >>>>+
> >>>>+                chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
> >>>>+                chr->type = VIR_DOMAIN_CHR_TYPE_PTY;
> >>>>+
> >>>>+                /* Implement device type of serial port when appropriate */
> >>>>+                if (STRPREFIX(port, "/dev")) {
> >>>>+                    chr->type = VIR_DOMAIN_CHR_TYPE_DEV;
> >>>>+                    chr->target.port = def->nserials;
> >>>>+                    chr->data.file.path = strdup(port);
> >>>>+
> >>>>+                    if (!chr->data.file.path)
> >>>>+                        goto no_memory;
> >>>>+                }
> >>>>+
> >>>>+                def->serials[def->nserials++] = chr;
> >>>>+                chr = NULL;
> >>>>+
> >>>>+                skipport:
> >>>>+                list = list->next;
> >>>>                  virDomainChrDefFree(chr);
> >>>>-                goto no_memory;
> >>>>              }
> >>>>-            chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
> >>>>-            def->serials[0] = chr;
> >>>>-            def->nserials++;
> >>>>+        }
> >>>>+        /* If domain is not using multiple serial ports we parse data old way */
> >>>>+        else {
> >>>>+            if (xenXMConfigGetString(conf, "serial",&str, NULL)<   0)
> >>>>+                goto cleanup;
> >>>>+            if (str&&   STRNEQ(str, "none")&&
> >>>>+                !(chr = xenDaemonParseSxprChar(str, NULL)))
> >>>>+                goto cleanup;
> >>>>+
> >>>>+            if (chr) {
> >>>>+                if (VIR_ALLOC_N(def->serials, 1)<   0) {
> >>>>+                    virDomainChrDefFree(chr);
> >>>>+                    goto no_memory;
> >>>>+                }
> >>>>+                chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
> >>>>+                def->serials[0] = chr;
> >>>>+                def->nserials++;
> >>>>+            }
> >>>>          }
> >>>>      } else {
> >>>>          if (!(def->console = xenDaemonParseSxprChar("pty", NULL)))
> >>>Hmm, unless I'm missing something, this patch only seems
> >>>todo half the job. It lets you parse XM configs, or generate
> >>>SEXPRS, needed to start/create guests. It doesn't let you
> >>>parse SEXPRS to query XML, or write XM configs to save an
> >>>updated guest config.
> >>>
> >>>Daniel
> >>Good point Daniel. What's the good test for that? Just to issue
> >>virsh edit and try to change&  save something ?
> >The tests/ directory has   xmconfigtest, xensexpr2xmltest and
> >xenxml2sexprtest which can be used to validate all directions
> >by giving sample config files
> >
> >Daniel
> Well, those tests (all except xencapstest) passed the testing.

That would be because you didn't add any more config files
to actually test the multiple serial port style configs....

Daniel




More information about the libvir-list mailing list