[libvirt] [PATCH] Add support for multiple serial ports to Xen driver
Daniel P. Berrange
berrange at redhat.com
Thu Jan 20 13:53:20 UTC 2011
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
More information about the libvir-list
mailing list