[libvirt] [PATCH v3 1/4] libxl: support serial list

Add support for multi serial devices, after this patch virsh can be used to connect different serial devices of running domains. E.g. vish # console <xxx> --devname serial<xxx> Note: This depends on a xen/libxl bug fix to have libxl_console_get_tty(...) correctly returning the tty path (as opposed to always returning the first one). [0] https://lists.xen.org/archives/html/xen-devel/2016-08/msg00438.html Signed-off-by: Bob Liu <bob.liu@oracle.com> --- v3: Comments from Jim. v2: Add #ifdef LIBXL_HAVE_BUILDINFO_SERIAL_LIST. --- src/libxl/libxl_conf.c | 23 ++++++++++++++++++++--- src/libxl/libxl_domain.c | 29 ++++++++++++++++++++++++++--- src/libxl/libxl_driver.c | 17 +++++++++-------- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 146e08a..32db975 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -431,14 +431,31 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, } if (def->nserials) { - if (def->nserials > 1) { + if (def->nserials == 1) { + if (libxlMakeChrdevStr(def->serials[0], &b_info->u.hvm.serial) < + 0) + return -1; + } else { +#ifdef LIBXL_HAVE_BUILDINFO_SERIAL_LIST + if (VIR_ALLOC_N(b_info->u.hvm.serial_list, def->nserials + 1) < + 0) + return -1; + for (i = 0; i < def->nserials; i++) { + if (libxlMakeChrdevStr(def->serials[i], + &b_info->u.hvm.serial_list[i]) < 0) + { + libxl_string_list_dispose(&b_info->u.hvm.serial_list); + return -1; + } + } + b_info->u.hvm.serial_list[i] = NULL; +#else virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Only one serial device is supported by libxl")); return -1; +#endif } - if (libxlMakeChrdevStr(def->serials[0], &b_info->u.hvm.serial) < 0) - return -1; } if (def->nparallels) { diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 0e26b91..f529a2e 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -960,18 +960,20 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) { virDomainObjPtr vm = for_callback; size_t i; + virDomainChrDefPtr chr; + char *console = NULL; + int ret; virObjectLock(vm); for (i = 0; i < vm->def->nconsoles; i++) { - virDomainChrDefPtr chr = vm->def->consoles[i]; + chr = vm->def->consoles[i]; + if (i == 0 && chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) chr = vm->def->serials[0]; if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { libxl_console_type console_type; - char *console = NULL; - int ret; console_type = (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL ? @@ -989,6 +991,27 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) VIR_FREE(console); } } + for (i = 0; i < vm->def->nserials; i++) { + chr = vm->def->serials[i]; + + ignore_value(virAsprintf(&chr->info.alias, "serial%zd", i)); + if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { + if (chr->source.data.file.path) + continue; + ret = libxl_console_get_tty(ctx, ev->domid, + chr->target.port, + LIBXL_CONSOLE_TYPE_SERIAL, + &console); + if (!ret) { + VIR_FREE(chr->source.data.file.path); + if (console && console[0] != '\0') { + ignore_value(VIR_STRDUP(chr->source.data.file.path, + console)); + } + } + VIR_FREE(console); + } + } virObjectUnlock(vm); libxl_event_free(ctx, ev); } diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index f153f69..a34eb02 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -4450,13 +4450,6 @@ libxlDomainOpenConsole(virDomainPtr dom, virCheckFlags(VIR_DOMAIN_CONSOLE_FORCE, -1); - if (dev_name) { - /* XXX support device aliases in future */ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Named device aliases are not supported")); - goto cleanup; - } - if (!(vm = libxlDomObjFromDomain(dom))) goto cleanup; @@ -4472,8 +4465,16 @@ libxlDomainOpenConsole(virDomainPtr dom, } priv = vm->privateData; + if (dev_name) { + size_t i; - if (vm->def->nconsoles) { + for (i = 0; !chr && i < vm->def->nserials; i++) { + if (STREQ(dev_name, vm->def->serials[i]->info.alias)) { + chr = vm->def->serials[i]; + break; + } + } + } else if (vm->def->nconsoles) { chr = vm->def->consoles[0]; if (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) chr = vm->def->serials[0]; -- 2.6.5

xen-xm doesn't support multi serial at all, this patch drop the domXML <-> xl.cfg conversions. Signed-off-by: Bob Liu <bob.liu@oracle.com> --- src/xenconfig/xen_common.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index 8447990..f532dd9 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -723,7 +723,7 @@ xenParseVfb(virConfPtr conf, virDomainDefPtr def) static int -xenParseCharDev(virConfPtr conf, virDomainDefPtr def) +xenParseCharDev(virConfPtr conf, virDomainDefPtr def, const char *nativeFormat) { const char *str; virConfValuePtr value = NULL; @@ -751,6 +751,12 @@ xenParseCharDev(virConfPtr conf, virDomainDefPtr def) if (value && value->type == VIR_CONF_LIST) { int portnum = -1; + if (STREQ(nativeFormat, XEN_CONFIG_FORMAT_XM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Multi serial is not supported by xen-xm")); + goto cleanup; + } + value = value->list; while (value) { char *port = NULL; @@ -1095,7 +1101,7 @@ xenParseConfigCommon(virConfPtr conf, if (xenParseVfb(conf, def) < 0) return -1; - if (xenParseCharDev(conf, def) < 0) + if (xenParseCharDev(conf, def, nativeFormat) < 0) return -1; return 0; @@ -1453,7 +1459,8 @@ xenFormatEventActions(virConfPtr conf, virDomainDefPtr def) static int -xenFormatCharDev(virConfPtr conf, virDomainDefPtr def) +xenFormatCharDev(virConfPtr conf, virDomainDefPtr def, + const char *nativeFormat) { size_t i; @@ -1493,6 +1500,12 @@ xenFormatCharDev(virConfPtr conf, virDomainDefPtr def) int maxport = -1, port; virConfValuePtr serialVal = NULL; + if (STREQ(nativeFormat, XEN_CONFIG_FORMAT_XM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Multi serial is not supported by xen-xm")); + return -1; + } + if (VIR_ALLOC(serialVal) < 0) return -1; @@ -1849,7 +1862,7 @@ xenFormatConfigCommon(virConfPtr conf, if (xenFormatPCI(conf, def) < 0) return -1; - if (xenFormatCharDev(conf, def) < 0) + if (xenFormatCharDev(conf, def, nativeFormat) < 0) return -1; if (xenFormatSound(conf, def) < 0) -- 2.6.5

On 08/17/2016 08:20 PM, Bob Liu wrote:
xen-xm doesn't support multi serial at all, this patch drop the domXML <-> xl.cfg conversions.
Signed-off-by: Bob Liu <bob.liu@oracle.com> --- src/xenconfig/xen_common.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index 8447990..f532dd9 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -723,7 +723,7 @@ xenParseVfb(virConfPtr conf, virDomainDefPtr def)
static int -xenParseCharDev(virConfPtr conf, virDomainDefPtr def) +xenParseCharDev(virConfPtr conf, virDomainDefPtr def, const char *nativeFormat) { const char *str; virConfValuePtr value = NULL; @@ -751,6 +751,12 @@ xenParseCharDev(virConfPtr conf, virDomainDefPtr def) if (value && value->type == VIR_CONF_LIST) { int portnum = -1;
+ if (STREQ(nativeFormat, XEN_CONFIG_FORMAT_XM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Multi serial is not supported by xen-xm"));
Nit: I've changed the error message to "Multiple serial devices are not supported by xen-xm".
+ goto cleanup; + } + value = value->list; while (value) { char *port = NULL; @@ -1095,7 +1101,7 @@ xenParseConfigCommon(virConfPtr conf, if (xenParseVfb(conf, def) < 0) return -1;
- if (xenParseCharDev(conf, def) < 0) + if (xenParseCharDev(conf, def, nativeFormat) < 0) return -1;
return 0; @@ -1453,7 +1459,8 @@ xenFormatEventActions(virConfPtr conf, virDomainDefPtr def)
static int -xenFormatCharDev(virConfPtr conf, virDomainDefPtr def) +xenFormatCharDev(virConfPtr conf, virDomainDefPtr def, + const char *nativeFormat) { size_t i;
@@ -1493,6 +1500,12 @@ xenFormatCharDev(virConfPtr conf, virDomainDefPtr def) int maxport = -1, port; virConfValuePtr serialVal = NULL;
+ if (STREQ(nativeFormat, XEN_CONFIG_FORMAT_XM)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Multi serial is not supported by xen-xm"));
Same here. Regards, Jim
+ return -1; + } + if (VIR_ALLOC(serialVal) < 0) return -1;
@@ -1849,7 +1862,7 @@ xenFormatConfigCommon(virConfPtr conf, if (xenFormatPCI(conf, def) < 0) return -1;
- if (xenFormatCharDev(conf, def) < 0) + if (xenFormatCharDev(conf, def, nativeFormat) < 0) return -1;
if (xenFormatSound(conf, def) < 0)

Adding tests for domXML <-> xl.cfg conversions containing multiple serial devices. Signed-off-by: Bob Liu <bob.liu@oracle.com> --- tests/xlconfigdata/test-fullvirt-multiserial.cfg | 25 +++++++++ tests/xlconfigdata/test-fullvirt-multiserial.xml | 64 ++++++++++++++++++++++++ tests/xlconfigtest.c | 3 ++ 3 files changed, 92 insertions(+) create mode 100644 tests/xlconfigdata/test-fullvirt-multiserial.cfg create mode 100644 tests/xlconfigdata/test-fullvirt-multiserial.xml diff --git a/tests/xlconfigdata/test-fullvirt-multiserial.cfg b/tests/xlconfigdata/test-fullvirt-multiserial.cfg new file mode 100644 index 0000000..1fd765b --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-multiserial.cfg @@ -0,0 +1,25 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +viridian = 0 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] +parallel = "none" +serial = [ "pty", "pty", "pty" ] +builder = "hvm" +boot = "d" +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] diff --git a/tests/xlconfigdata/test-fullvirt-multiserial.xml b/tests/xlconfigdata/test-fullvirt-multiserial.xml new file mode 100644 index 0000000..1a7cc84 --- /dev/null +++ b/tests/xlconfigdata/test-fullvirt-multiserial.xml @@ -0,0 +1,64 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + </features> + <clock offset='variable' adjustment='0' basis='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <serial type='pty'> + <target port='0'/> + </serial> + <serial type='pty'> + <target port='1'/> + </serial> + <serial type='pty'> + <target port='2'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + </console> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/xlconfigtest.c b/tests/xlconfigtest.c index 4248da1..ef566ac 100644 --- a/tests/xlconfigtest.c +++ b/tests/xlconfigtest.c @@ -268,6 +268,9 @@ mymain(void) DO_TEST_FORMAT("paravirt-cmdline-bogus-extra-root", false); DO_TEST("rbd-multihost-noauth"); +#ifdef LIBXL_HAVE_BUILDINFO_SERIAL_LIST + DO_TEST("fullvirt-multiserial"); +#endif #ifdef LIBXL_HAVE_BUILDINFO_USBDEVICE_LIST DO_TEST("fullvirt-multiusb"); #endif -- 2.6.5

xen-xm doesn't support mult serial devices at all, so these tests are meaningless. Signed-off-by: Bob Liu <bob.liu@oracle.com> --- v2: Also delete the test case from xmconfigtest. --- .../test-fullvirt-serial-dev-2-ports.cfg | 27 --------- .../test-fullvirt-serial-dev-2-ports.xml | 65 ---------------------- .../test-fullvirt-serial-dev-2nd-port.cfg | 27 --------- .../test-fullvirt-serial-dev-2nd-port.xml | 61 -------------------- tests/xmconfigtest.c | 2 - 5 files changed, 182 deletions(-) delete mode 100644 tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.cfg delete mode 100644 tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.xml delete mode 100644 tests/xmconfigdata/test-fullvirt-serial-dev-2nd-port.cfg delete mode 100644 tests/xmconfigdata/test-fullvirt-serial-dev-2nd-port.xml diff --git a/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.cfg b/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.cfg deleted file mode 100644 index f4963e1..0000000 --- a/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.cfg +++ /dev/null @@ -1,27 +0,0 @@ -name = "XenGuest2" -uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" -maxmem = 579 -memory = 394 -vcpus = 1 -pae = 1 -acpi = 1 -apic = 1 -viridian = 0 -rtc_timeoffset = 0 -localtime = 0 -on_poweroff = "destroy" -on_reboot = "restart" -on_crash = "restart" -device_model = "/usr/lib/xen/bin/qemu-dm" -sdl = 0 -vnc = 1 -vncunused = 1 -vnclisten = "127.0.0.1" -vncpasswd = "123poi" -vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] -parallel = "none" -serial = [ "/dev/ttyS0", "/dev/ttyS1" ] -builder = "hvm" -kernel = "/usr/lib/xen/boot/hvmloader" -boot = "d" -disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ] diff --git a/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.xml b/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.xml deleted file mode 100644 index 753043d..0000000 --- a/tests/xmconfigdata/test-fullvirt-serial-dev-2-ports.xml +++ /dev/null @@ -1,65 +0,0 @@ -<domain type='xen'> - <name>XenGuest2</name> - <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> - <memory unit='KiB'>592896</memory> - <currentMemory unit='KiB'>403456</currentMemory> - <vcpu placement='static'>1</vcpu> - <os> - <type arch='i686' machine='xenfv'>hvm</type> - <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> - <boot dev='cdrom'/> - </os> - <features> - <acpi/> - <apic/> - <pae/> - </features> - <clock offset='variable' adjustment='0' basis='utc'/> - <on_poweroff>destroy</on_poweroff> - <on_reboot>restart</on_reboot> - <on_crash>restart</on_crash> - <devices> - <emulator>/usr/lib/xen/bin/qemu-dm</emulator> - <disk type='block' device='disk'> - <driver name='phy'/> - <source dev='/dev/HostVG/XenGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> - <disk type='file' device='cdrom'> - <driver name='file'/> - <source file='/root/boot.iso'/> - <target dev='hdc' bus='ide'/> - <readonly/> - <address type='drive' controller='0' bus='1' target='0' unit='0'/> - </disk> - <controller type='ide' index='0'/> - <interface type='bridge'> - <mac address='00:16:3e:66:92:9c'/> - <source bridge='xenbr1'/> - <script path='vif-bridge'/> - <model type='e1000'/> - </interface> - <serial type='dev'> - <source path='/dev/ttyS0'/> - <target port='0'/> - </serial> - <serial type='dev'> - <source path='/dev/ttyS1'/> - <target port='1'/> - </serial> - <console type='dev'> - <source path='/dev/ttyS0'/> - <target type='serial' port='0'/> - </console> - <input type='mouse' bus='ps2'/> - <input type='keyboard' bus='ps2'/> - <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' passwd='123poi'> - <listen type='address' address='127.0.0.1'/> - </graphics> - <video> - <model type='cirrus' vram='16384' heads='1' primary='yes'/> - </video> - <memballoon model='xen'/> - </devices> -</domain> diff --git a/tests/xmconfigdata/test-fullvirt-serial-dev-2nd-port.cfg b/tests/xmconfigdata/test-fullvirt-serial-dev-2nd-port.cfg deleted file mode 100644 index 2dc3258..0000000 --- a/tests/xmconfigdata/test-fullvirt-serial-dev-2nd-port.cfg +++ /dev/null @@ -1,27 +0,0 @@ -name = "XenGuest2" -uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" -maxmem = 579 -memory = 394 -vcpus = 1 -pae = 1 -acpi = 1 -apic = 1 -viridian = 0 -rtc_timeoffset = 0 -localtime = 0 -on_poweroff = "destroy" -on_reboot = "restart" -on_crash = "restart" -device_model = "/usr/lib/xen/bin/qemu-dm" -sdl = 0 -vnc = 1 -vncunused = 1 -vnclisten = "127.0.0.1" -vncpasswd = "123poi" -vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000" ] -parallel = "none" -serial = [ "none", "/dev/ttyS1" ] -builder = "hvm" -kernel = "/usr/lib/xen/boot/hvmloader" -boot = "d" -disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ] diff --git a/tests/xmconfigdata/test-fullvirt-serial-dev-2nd-port.xml b/tests/xmconfigdata/test-fullvirt-serial-dev-2nd-port.xml deleted file mode 100644 index a104c6f..0000000 --- a/tests/xmconfigdata/test-fullvirt-serial-dev-2nd-port.xml +++ /dev/null @@ -1,61 +0,0 @@ -<domain type='xen'> - <name>XenGuest2</name> - <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> - <memory unit='KiB'>592896</memory> - <currentMemory unit='KiB'>403456</currentMemory> - <vcpu placement='static'>1</vcpu> - <os> - <type arch='i686' machine='xenfv'>hvm</type> - <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> - <boot dev='cdrom'/> - </os> - <features> - <acpi/> - <apic/> - <pae/> - </features> - <clock offset='variable' adjustment='0' basis='utc'/> - <on_poweroff>destroy</on_poweroff> - <on_reboot>restart</on_reboot> - <on_crash>restart</on_crash> - <devices> - <emulator>/usr/lib/xen/bin/qemu-dm</emulator> - <disk type='block' device='disk'> - <driver name='phy'/> - <source dev='/dev/HostVG/XenGuest2'/> - <target dev='hda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> - </disk> - <disk type='file' device='cdrom'> - <driver name='file'/> - <source file='/root/boot.iso'/> - <target dev='hdc' bus='ide'/> - <readonly/> - <address type='drive' controller='0' bus='1' target='0' unit='0'/> - </disk> - <controller type='ide' index='0'/> - <interface type='bridge'> - <mac address='00:16:3e:66:92:9c'/> - <source bridge='xenbr1'/> - <script path='vif-bridge'/> - <model type='e1000'/> - </interface> - <serial type='dev'> - <source path='/dev/ttyS1'/> - <target port='1'/> - </serial> - <console type='dev'> - <source path='/dev/ttyS1'/> - <target type='serial' port='1'/> - </console> - <input type='mouse' bus='ps2'/> - <input type='keyboard' bus='ps2'/> - <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' passwd='123poi'> - <listen type='address' address='127.0.0.1'/> - </graphics> - <video> - <model type='cirrus' vram='16384' heads='1' primary='yes'/> - </video> - <memballoon model='xen'/> - </devices> -</domain> diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c index 7032d43..96990ee 100644 --- a/tests/xmconfigtest.c +++ b/tests/xmconfigtest.c @@ -222,8 +222,6 @@ mymain(void) DO_TEST("fullvirt-usbtablet"); DO_TEST("fullvirt-usbmouse"); DO_TEST("fullvirt-serial-file"); - DO_TEST("fullvirt-serial-dev-2-ports"); - DO_TEST("fullvirt-serial-dev-2nd-port"); DO_TEST("fullvirt-serial-null"); DO_TEST("fullvirt-serial-pipe"); DO_TEST("fullvirt-serial-pty"); -- 2.6.5

On 08/17/2016 08:20 PM, Bob Liu wrote:
Add support for multi serial devices, after this patch virsh can be used to connect different serial devices of running domains. E.g. vish # console <xxx> --devname serial<xxx>
Note: This depends on a xen/libxl bug fix to have libxl_console_get_tty(...) correctly returning the tty path (as opposed to always returning the first one). [0] https://lists.xen.org/archives/html/xen-devel/2016-08/msg00438.html
Signed-off-by: Bob Liu <bob.liu@oracle.com> --- v3: Comments from Jim. v2: Add #ifdef LIBXL_HAVE_BUILDINFO_SERIAL_LIST.
Not that it matters much, but I guess this is actually V4 since Joao had a review comment on V3 :-). With the exception of a small nit in patch 2, which I've already fixed in my branch, V4 looks good to me and works fine in my testing - ACK. But we'll have to wait until 2.2.0 is released before pushing. Thanks for your patience! Regards, Jim
--- src/libxl/libxl_conf.c | 23 ++++++++++++++++++++--- src/libxl/libxl_domain.c | 29 ++++++++++++++++++++++++++--- src/libxl/libxl_driver.c | 17 +++++++++-------- 3 files changed, 55 insertions(+), 14 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 146e08a..32db975 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -431,14 +431,31 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, }
if (def->nserials) { - if (def->nserials > 1) { + if (def->nserials == 1) { + if (libxlMakeChrdevStr(def->serials[0], &b_info->u.hvm.serial) < + 0) + return -1; + } else { +#ifdef LIBXL_HAVE_BUILDINFO_SERIAL_LIST + if (VIR_ALLOC_N(b_info->u.hvm.serial_list, def->nserials + 1) < + 0) + return -1; + for (i = 0; i < def->nserials; i++) { + if (libxlMakeChrdevStr(def->serials[i], + &b_info->u.hvm.serial_list[i]) < 0) + { + libxl_string_list_dispose(&b_info->u.hvm.serial_list); + return -1; + } + } + b_info->u.hvm.serial_list[i] = NULL; +#else virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Only one serial device is supported by libxl")); return -1; +#endif } - if (libxlMakeChrdevStr(def->serials[0], &b_info->u.hvm.serial) < 0) - return -1; }
if (def->nparallels) { diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 0e26b91..f529a2e 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -960,18 +960,20 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) { virDomainObjPtr vm = for_callback; size_t i; + virDomainChrDefPtr chr; + char *console = NULL; + int ret;
virObjectLock(vm); for (i = 0; i < vm->def->nconsoles; i++) { - virDomainChrDefPtr chr = vm->def->consoles[i]; + chr = vm->def->consoles[i]; + if (i == 0 && chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) chr = vm->def->serials[0];
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { libxl_console_type console_type; - char *console = NULL; - int ret;
console_type = (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL ? @@ -989,6 +991,27 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback) VIR_FREE(console); } } + for (i = 0; i < vm->def->nserials; i++) { + chr = vm->def->serials[i]; + + ignore_value(virAsprintf(&chr->info.alias, "serial%zd", i)); + if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { + if (chr->source.data.file.path) + continue; + ret = libxl_console_get_tty(ctx, ev->domid, + chr->target.port, + LIBXL_CONSOLE_TYPE_SERIAL, + &console); + if (!ret) { + VIR_FREE(chr->source.data.file.path); + if (console && console[0] != '\0') { + ignore_value(VIR_STRDUP(chr->source.data.file.path, + console)); + } + } + VIR_FREE(console); + } + } virObjectUnlock(vm); libxl_event_free(ctx, ev); } diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index f153f69..a34eb02 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -4450,13 +4450,6 @@ libxlDomainOpenConsole(virDomainPtr dom,
virCheckFlags(VIR_DOMAIN_CONSOLE_FORCE, -1);
- if (dev_name) { - /* XXX support device aliases in future */ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Named device aliases are not supported")); - goto cleanup; - } - if (!(vm = libxlDomObjFromDomain(dom))) goto cleanup;
@@ -4472,8 +4465,16 @@ libxlDomainOpenConsole(virDomainPtr dom, }
priv = vm->privateData; + if (dev_name) { + size_t i;
- if (vm->def->nconsoles) { + for (i = 0; !chr && i < vm->def->nserials; i++) { + if (STREQ(dev_name, vm->def->serials[i]->info.alias)) { + chr = vm->def->serials[i]; + break; + } + } + } else if (vm->def->nconsoles) { chr = vm->def->consoles[0]; if (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) chr = vm->def->serials[0];

On 08/31/2016 08:36 PM, Jim Fehlig wrote:
On 08/17/2016 08:20 PM, Bob Liu wrote:
Add support for multi serial devices, after this patch virsh can be used to connect different serial devices of running domains. E.g. vish # console <xxx> --devname serial<xxx>
Note: This depends on a xen/libxl bug fix to have libxl_console_get_tty(...) correctly returning the tty path (as opposed to always returning the first one). [0] https://lists.xen.org/archives/html/xen-devel/2016-08/msg00438.html
Signed-off-by: Bob Liu <bob.liu@oracle.com> --- v3: Comments from Jim. v2: Add #ifdef LIBXL_HAVE_BUILDINFO_SERIAL_LIST. Not that it matters much, but I guess this is actually V4 since Joao had a review comment on V3 :-).
With the exception of a small nit in patch 2, which I've already fixed in my branch, V4 looks good to me and works fine in my testing - ACK. But we'll have to wait until 2.2.0 is released before pushing. Thanks for your patience!
Pushed now that the release is out. Regards, Jim
participants (2)
-
Bob Liu
-
Jim Fehlig