mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 01:45:17 +00:00
spicevmc: support older -device spicevmc of qemu 0.13.0
qemu 0.13.0 (at least as built for Fedora 14, and also backported to RHEL 6.0 qemu) supported an older syntax for a spicevmc channel; it's not as flexible (it has an implicit name and hides the chardev aspect), but now that we support spicevmc, we might as well target both variants. * src/qemu/qemu_capabilities.h (QEMUD_CMD_FLAG_DEVICE_SPICEVMC): New flag. * src/qemu/qemu_capabilities.c (qemuCapsParseDeviceStr): Set it correctly. * src/qemu/qemu_command.h (qemuBuildVirtioSerialPortDevStr): Drop declaration. * src/qemu/qemu_command.c (qemuBuildVirtioSerialPortDevStr): Alter signature, check flag. (qemuBuildCommandLine): Adjust caller and check flag. * tests/qemuhelptest.c (mymain): Update test. * tests/qemuxml2argvtest.c (mymain): New test. * tests/qemuxml2argvdata/qemuxml2argv-channel-spicevmc-old.xml: New file. * tests/qemuxml2argvdata/qemuxml2argv-channel-spicevmc-old.args: Likewise.
This commit is contained in:
parent
79f9267f4b
commit
5a3ec56ba3
@ -1091,6 +1091,10 @@ qemuCapsParseDeviceStr(const char *str, unsigned long long *flags)
|
||||
*flags |= QEMUD_CMD_FLAG_CCID_EMULATED;
|
||||
if (strstr(str, "name \"ccid-card-passthru\""))
|
||||
*flags |= QEMUD_CMD_FLAG_CCID_PASSTHRU;
|
||||
/* Prefer -chardev spicevmc (detected earlier) over -device spicevmc */
|
||||
if (!(*flags & QEMUD_CMD_FLAG_CHARDEV_SPICEVMC) &&
|
||||
strstr(str, "name \"spicevmc\""))
|
||||
*flags |= QEMUD_CMD_FLAG_DEVICE_SPICEVMC;
|
||||
|
||||
/* Features of given devices. */
|
||||
if (strstr(str, "pci-assign.configfd"))
|
||||
|
@ -90,7 +90,8 @@ enum qemuCapsFlags {
|
||||
QEMUD_CMD_FLAG_PCI_BOOTINDEX = (1LL << 53), /* pci-assign.bootindex */
|
||||
QEMUD_CMD_FLAG_CCID_EMULATED = (1LL << 54), /* -device ccid-card-emulated */
|
||||
QEMUD_CMD_FLAG_CCID_PASSTHRU = (1LL << 55), /* -device ccid-card-passthru */
|
||||
QEMUD_CMD_FLAG_CHARDEV_SPICEVMC = (1LL << 56), /* -chardev spicevmc */
|
||||
QEMUD_CMD_FLAG_CHARDEV_SPICEVMC = (1LL << 56), /* newer -chardev spicevmc */
|
||||
QEMUD_CMD_FLAG_DEVICE_SPICEVMC = (1LL << 57), /* older -device spicevmc*/
|
||||
};
|
||||
|
||||
virCapsPtr qemuCapsInit(virCapsPtr old_caps);
|
||||
|
@ -2183,12 +2183,16 @@ error:
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev)
|
||||
static char *
|
||||
qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev,
|
||||
unsigned long long qemuCmdFlags)
|
||||
{
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE)
|
||||
virBufferAddLit(&buf, "virtconsole");
|
||||
else if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE_SPICEVMC) &&
|
||||
dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC)
|
||||
virBufferAddLit(&buf, "spicevmc");
|
||||
else
|
||||
virBufferAddLit(&buf, "virtserialport");
|
||||
|
||||
@ -2211,8 +2215,6 @@ qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev)
|
||||
dev->info.addr.vioserial.port);
|
||||
}
|
||||
|
||||
virBufferVSprintf(&buf, ",chardev=char%s,id=%s",
|
||||
dev->info.alias, dev->info.alias);
|
||||
if (dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC &&
|
||||
dev->target.name &&
|
||||
STRNEQ(dev->target.name, "com.redhat.spice.0")) {
|
||||
@ -2221,9 +2223,16 @@ qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev)
|
||||
dev->target.name);
|
||||
goto error;
|
||||
}
|
||||
if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE_SPICEVMC) &&
|
||||
dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
|
||||
virBufferVSprintf(&buf, ",id=%s", dev->info.alias);
|
||||
} else {
|
||||
virBufferVSprintf(&buf, ",chardev=char%s,id=%s",
|
||||
dev->info.alias, dev->info.alias);
|
||||
if (dev->target.name) {
|
||||
virBufferVSprintf(&buf, ",name=%s", dev->target.name);
|
||||
}
|
||||
}
|
||||
if (virBufferError(&buf)) {
|
||||
virReportOOMError();
|
||||
goto error;
|
||||
@ -3681,6 +3690,13 @@ qemuBuildCommandLine(virConnectPtr conn,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE_SPICEVMC) &&
|
||||
channel->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
|
||||
/* spicevmc was originally introduced via a -device
|
||||
* with a backend internal to qemu; although we prefer
|
||||
* the newer -chardev interface. */
|
||||
;
|
||||
} else {
|
||||
virCommandAddArg(cmd, "-chardev");
|
||||
if (!(devstr = qemuBuildChrChardevStr(&channel->source,
|
||||
channel->info.alias,
|
||||
@ -3688,9 +3704,11 @@ qemuBuildCommandLine(virConnectPtr conn,
|
||||
goto error;
|
||||
virCommandAddArg(cmd, devstr);
|
||||
VIR_FREE(devstr);
|
||||
}
|
||||
|
||||
virCommandAddArg(cmd, "-device");
|
||||
if (!(devstr = qemuBuildVirtioSerialPortDevStr(channel)))
|
||||
if (!(devstr = qemuBuildVirtioSerialPortDevStr(channel,
|
||||
qemuCmdFlags)))
|
||||
goto error;
|
||||
virCommandAddArg(cmd, devstr);
|
||||
VIR_FREE(devstr);
|
||||
@ -3720,7 +3738,8 @@ qemuBuildCommandLine(virConnectPtr conn,
|
||||
VIR_FREE(devstr);
|
||||
|
||||
virCommandAddArg(cmd, "-device");
|
||||
if (!(devstr = qemuBuildVirtioSerialPortDevStr(console)))
|
||||
if (!(devstr = qemuBuildVirtioSerialPortDevStr(console,
|
||||
qemuCmdFlags)))
|
||||
goto error;
|
||||
virCommandAddArg(cmd, devstr);
|
||||
VIR_FREE(devstr);
|
||||
|
@ -105,8 +105,6 @@ char * qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev,
|
||||
|
||||
int qemuOpenPCIConfig(virDomainHostdevDefPtr dev);
|
||||
|
||||
char * qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev);
|
||||
|
||||
/* Legacy, pre device support */
|
||||
char * qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev);
|
||||
/* Current, best practice */
|
||||
|
@ -351,7 +351,8 @@ mymain(int argc, char **argv)
|
||||
QEMUD_CMD_FLAG_SPICE |
|
||||
QEMUD_CMD_FLAG_VGA_NONE |
|
||||
QEMUD_CMD_FLAG_MIGRATE_QEMU_FD |
|
||||
QEMUD_CMD_FLAG_DRIVE_AIO,
|
||||
QEMUD_CMD_FLAG_DRIVE_AIO |
|
||||
QEMUD_CMD_FLAG_DEVICE_SPICEVMC,
|
||||
12001, 1, 0);
|
||||
DO_TEST("qemu-kvm-0.12.3",
|
||||
QEMUD_CMD_FLAG_VNC_COLON |
|
||||
@ -435,7 +436,8 @@ mymain(int argc, char **argv)
|
||||
QEMUD_CMD_FLAG_SPICE |
|
||||
QEMUD_CMD_FLAG_VGA_NONE |
|
||||
QEMUD_CMD_FLAG_MIGRATE_QEMU_FD |
|
||||
QEMUD_CMD_FLAG_DRIVE_AIO,
|
||||
QEMUD_CMD_FLAG_DRIVE_AIO |
|
||||
QEMUD_CMD_FLAG_DEVICE_SPICEVMC,
|
||||
13000, 1, 0);
|
||||
DO_TEST("qemu-kvm-0.12.1.2-rhel61",
|
||||
QEMUD_CMD_FLAG_VNC_COLON |
|
||||
|
@ -0,0 +1,8 @@
|
||||
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=spice \
|
||||
/usr/bin/qemu -S -M pc -m 214 -smp 1 -nodefconfig -nodefaults \
|
||||
-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -device \
|
||||
virtio-serial-pci,id=virtio-serial1,bus=pci.0,addr=0xa -hda \
|
||||
/dev/HostVG/QEMUGuest1 -device spicevmc,bus=virtio-serial1.0,nr=3,id=channel0 \
|
||||
-usb -spice port=5903,tls-port=5904,addr=127.0.0.1,\
|
||||
x509-dir=/etc/pki/libvirt-spice,tls-channel=main -device \
|
||||
virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
|
34
tests/qemuxml2argvdata/qemuxml2argv-channel-spicevmc-old.xml
Normal file
34
tests/qemuxml2argvdata/qemuxml2argv-channel-spicevmc-old.xml
Normal file
@ -0,0 +1,34 @@
|
||||
<domain type='qemu'>
|
||||
<name>QEMUGuest1</name>
|
||||
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||
<memory>219136</memory>
|
||||
<vcpu cpuset='1-4,8-20,525'>1</vcpu>
|
||||
<os>
|
||||
<type arch='i686' machine='pc'>hvm</type>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu</emulator>
|
||||
<disk type='block' device='disk'>
|
||||
<source dev='/dev/HostVG/QEMUGuest1'/>
|
||||
<target dev='hda' bus='ide'/>
|
||||
<address type='drive' controller='0' bus='0' unit='0'/>
|
||||
</disk>
|
||||
<controller type='ide' index='0'/>
|
||||
<controller type='virtio-serial' index='1'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
|
||||
</controller>
|
||||
<graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'>
|
||||
<channel name='main' mode='secure'/>
|
||||
</graphics>
|
||||
<channel type='spicevmc'>
|
||||
<target type='virtio' name='com.redhat.spice.0'/>
|
||||
<address type='virtio-serial' controller='1' bus='0' port='3'/>
|
||||
</channel>
|
||||
<memballoon model='virtio'/>
|
||||
</devices>
|
||||
</domain>
|
@ -410,6 +410,9 @@ mymain(int argc, char **argv)
|
||||
DO_TEST("channel-spicevmc", QEMUD_CMD_FLAG_DEVICE |
|
||||
QEMUD_CMD_FLAG_NODEFCONFIG | QEMUD_CMD_FLAG_SPICE |
|
||||
QEMUD_CMD_FLAG_CHARDEV_SPICEVMC, false);
|
||||
DO_TEST("channel-spicevmc-old", QEMUD_CMD_FLAG_DEVICE |
|
||||
QEMUD_CMD_FLAG_NODEFCONFIG | QEMUD_CMD_FLAG_SPICE |
|
||||
QEMUD_CMD_FLAG_DEVICE_SPICEVMC, false);
|
||||
|
||||
DO_TEST("smartcard-host",
|
||||
QEMUD_CMD_FLAG_CHARDEV | QEMUD_CMD_FLAG_DEVICE |
|
||||
|
Loading…
x
Reference in New Issue
Block a user