qemu: command: add support to enable/disable hotplug on pci-root controller

This change adds qemu backend command line support for enabling or disabling
hotplug on the pci-root controller using the 'target' sub-element of the
pci-root controller as shown below:

<controller type='pci' model='pci-root'>
  <target hotplug='off'/>
</controller>

'<target hotplug='off/on'/>' is only valid for pc (i440fx-based x86)
machinetypes and turns on the following command line option that is passed
to qemu for x86 guests:

-global PIIX4_PM.acpi-root-pci-hotplug=<off/on>

Before introduction of this attribute, hotplug was always enabled for
pci-root of an i440fx-based machinetype, and since its introduction
the default setting has always been "on" for those machinetypes.

This change also adds the required qemuxml2argv unit tests in order to test
correct qemu arguments. Unit tests have also been added to test qemu capability
validation checks.

Signed-off-by: Ani Sinha <ani@anisinha.ca>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
This commit is contained in:
Ani Sinha 2021-10-01 14:59:47 +05:30 committed by Laine Stump
parent 8eadf82fb5
commit 133d7983d6
4 changed files with 52 additions and 0 deletions

View File

@ -2645,6 +2645,20 @@ qemuBuildSkipController(const virDomainControllerDef *controller,
return false;
}
static int
qemuBuildPMPCIRootHotplugCommandLine(virCommand *cmd,
const virDomainControllerDef *controller)
{
if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
controller->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT &&
controller->idx == 0 &&
controller->opts.pciopts.hotplug != VIR_TRISTATE_SWITCH_ABSENT) {
virCommandAddArg(cmd, "-global");
virCommandAddArgFormat(cmd, "PIIX4_PM.acpi-root-pci-hotplug=%s",
virTristateSwitchTypeToString(controller->opts.pciopts.hotplug));
}
return 0;
}
static int
qemuBuildControllersByTypeCommandLine(virCommand *cmd,
@ -2661,6 +2675,9 @@ qemuBuildControllersByTypeCommandLine(virCommand *cmd,
if (cont->type != type)
continue;
if (qemuBuildPMPCIRootHotplugCommandLine(cmd, cont))
continue;
if (qemuBuildSkipController(cont, def))
continue;

View File

@ -0,0 +1,31 @@
LC_ALL=C \
PATH=/bin \
HOME=/tmp/lib/domain--1-i440fx \
USER=test \
LOGNAME=test \
XDG_DATA_HOME=/tmp/lib/domain--1-i440fx/.local/share \
XDG_CACHE_HOME=/tmp/lib/domain--1-i440fx/.cache \
XDG_CONFIG_HOME=/tmp/lib/domain--1-i440fx/.config \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-x86_64 \
-name guest=i440fx,debug-threads=on \
-S \
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-i440fx/master-key.aes \
-machine pc-i440fx-2.5,accel=tcg,usb=off,dump-guest-core=off \
-m 1024 \
-realtime mlock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 56f5055c-1b8d-490c-844a-ad646a1caaaa \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-i440fx/monitor.sock,server=on,wait=off \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-no-acpi \
-boot strict=on \
-global PIIX4_PM.acpi-root-pci-hotplug=off \
-usb \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
-msg timestamp=on

View File

@ -0,0 +1 @@
unsupported configuration: setting the hotplug property on a 'pci-root' device is not supported by this QEMU binary

View File

@ -2571,6 +2571,9 @@ mymain(void)
QEMU_CAPS_DEVICE_IOH3420,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_ICH9_AHCI,
QEMU_CAPS_PIIX_DISABLE_S3, QEMU_CAPS_PIIX_DISABLE_S4);
DO_TEST("pc-i440fx-acpi-root-hotplug-disable",
QEMU_CAPS_PIIX_ACPI_ROOT_PCI_HOTPLUG);
DO_TEST_PARSE_ERROR_NOCAPS("pc-i440fx-acpi-root-hotplug-disable");
DO_TEST("q35-usb2",
QEMU_CAPS_DEVICE_PCI_BRIDGE,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,