Compare commits

...

15 Commits

Author SHA1 Message Date
Peter Krempa
ab26247f46 qemuxml2xmltest: Merge DO_TEST macro into DO_TEST_CAPS_INTERNAL
Now all tests invoke a real-capability version. Remove DO_TEST.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2023-08-25 10:08:12 +02:00
Peter Krempa
42c09b68df qemuxml2xmltest: Modernize rest of 'seclabel-*' tests
Use real capabilities for these last few tests that were not modernized
due to use of 'WHEN_INACTIVE'.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2023-08-25 10:08:12 +02:00
Peter Krempa
cfb0294344 qemuxml2argvtest: Pass expected state via struct testQemuInfo's 'flags' member
Rather than having a separate argument to DO_TEST pass the state via
newly added flags 'FLAG_SKIP_CONFIG_ACTIVE'. The '_INACTIVE' equivalent
was not added as there's no test which'd use it.

Remove the old 'WHEN_' flags and move the decision logic out of the
DO_TEST macro as any addition to the logic makes the compiler take much
longer to compile qemuxml2xmltest.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2023-08-25 10:08:12 +02:00
Peter Krempa
c2fd8c2b29 qemuxml2xmltest: Use DO_TEST_CAPS_ARCH_LATEST_FULL for arm GIC tests
Use the new macro instead of open coding it.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2023-08-25 10:08:12 +02:00
Peter Krempa
1522e7f9b7 qemuxml2xmltest: Rework file name generation in 'testInfoSetPaths'
Pass the state-based suffix directly as string.

Document the logic how the filename is chosen.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2023-08-25 10:08:12 +02:00
Peter Krempa
7ef2846f9b virschematest: Validate files in 'chxml2xmlin' and 'chxml2xmlout' directories
The test files for the 'ch' driver were not validated against the schema
and thus also didn't conform to the schema.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2023-08-25 10:07:36 +02:00
Peter Krempa
27d1f9e404 tests: chxml2xmlin: Fix path format for fake paths
Our XML schema requires absolute paths for the <kernel> and disk source
values. Fix the 'ch' test to have absolute paths.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
2023-08-25 10:07:36 +02:00
Laine Stump
10e8a518a0 qemu: turn two multiline log messages into single line
Normally I wouldn't bother with a change like this, but I was touching
the function anyway, and wanted to leave it looking nice and tidy.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-08-24 23:36:18 -04:00
Laine Stump
24beaffec3 node_device: support binding other drivers with virNodeDeviceDetachFlags()
In the past, the only allowable values for the "driver" field of
virNodeDeviceDetachFlags() were "kvm" or "vfio" for the QEMU driver,
and "xen" for the libxl driver. Then "kvm" was deprecated and removed,
so the driver name became essentially irrelevant (because it is always
called via a particular hypervisor driver, and so the "xen" or "vfio"
can be (and almost always is) implied.

With the advent of VFIO variant drivers, the ability to explicitly
specify a driver name once again becomes useful - it can be used to
name the exact VFIO driver that we want bound to the device in place
of vfio-pci, so this patch allows those other names to be passed down
the call chain, where the code in virpci.c can make use of them.

The names "vfio", "kvm", and "xen" retain their special meaning, though:

  1) because there may be some application or configuration that still
     calls virNodeDeviceDetachFlags() with driverName="vfio", this
     single value is substituted with the synonym of NULL, which means
     "bind the default driver for this device and hypervisor". This
     will currently result in the vfio-pci driver being bound to the
     device.

  2) in the case of the libxl driver, "xen" means to use the standard
     driver used in the case of Xen ("pciback").

  3) "kvm" as a driver name always results in an error, as legacy KVM
     device assignment was removed from the kernel around 10 years ago.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-08-24 23:36:18 -04:00
Laine Stump
928296b044 util: honor stubDriverName when probing/binding stub driver for a device
Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-08-24 23:36:18 -04:00
Laine Stump
2d9c9445b9 util: probe stub driver from within function that binds to stub driver
virPCIProbeStubDriver() and virPCIDeviceBindToStub() both have
very similar code that locally sets a driver name (based on
stubDriverType). These two functions are each also called in just one
place (virPCIDeviceDetach()), with just a small bit of validation code
in between.

To eliminate the "duplicated" code (which is going to be expanded
slightly in upcoming patches to support manually or automatically
picking a VFIO variant driver), this patch modifies
virPCIProbeStubDriver() to take the driver name as an argument
(rather than the virPCIDevice object), and calls it from within
virPCIDeviceBindToStub() (rather than from that function's caller),
using the driverName it has just figured out with the
now-not-duplicated code.

(NB: Since it could be used to probe *any* driver module, the name is
changed to virPCIProbeDriver()).

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-08-24 23:36:18 -04:00
Laine Stump
6ce071f609 util: permit existing binding to VFIO variant driver
Before a PCI device can be assigned to a guest with VFIO, that device
must be bound to the vfio-pci driver rather than to the device's
normal host driver. The vfio-pci driver provides APIs that permit QEMU
to perform all the necessary operations to make the device accessible
to the guest.

In the past vfio-pci was the only driver that supplied these APIs, but
there are now vendor/device-specific "VFIO variant" drivers that
provide the basic vfio-pci driver functionality/API while adding
support for device-specific operations (for example these
device-specific drivers may support live migration of certain
devices).  All that is needed to make this functionality available is
to bind the vendor-specific "VFIO variant" driver to the device
(rather than the generic vfio-pci driver, which will continue to work,
just without the extra functionality).

But until now libvirt has required that all PCI devices being assigned
to a guest with VFIO specifically have the "vfio-pci" driver bound to
the device. So even if the user manually binds a shiny new
vendor-specific VFIO variant driver to the device (and puts
"managed='no'" in the config to prevent libvirt from changing the
binding), libvirt will just fail during startup of the guest (or
during hotplug) because the driver bound to the device isn't exactly
"vfio-pci".

Beginning with kernel 6.1, it's possible to determine from the sysfs
directory for a device whether the currently-bound driver is the
vfio-pci driver or a VFIO variant - the device directory will have a
subdirectory called "vfio-dev". We can use that to appropriately widen
the list of drivers that libvirt will allow for VFIO device
assignment.

This patch doesn't remove the explicit check for the exact "vfio-pci"
driver (since that would cause systems with pre-6.1 kernels to behave
incorrectly), but adds an additional check for the vfio-dev directory,
so that any VFIO variant driver is acceptable for libvirt to continue
setting up for VFIO device assignment.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-08-24 23:36:18 -04:00
Laine Stump
222b66974e util: rename virPCIDeviceGetDriverPathAndName
Instead, call it virPCIDeviceGetCurrentDriverPathAndName() to avoid
confusion with the device name that is stored in the virPCIDevice
object - that one is not necessarily the name of the current driver
for the device, but could instead be the driver that we want to be
bound to the device in the future.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-08-24 23:36:18 -04:00
Laine Stump
1bb9617971 util: add stub driver name to virPCIDevice object
There can be many different drivers that are of the type "VFIO", so
add the driver name to the object and allow getting/setting it.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-08-24 23:36:18 -04:00
Laine Stump
cd2843f546 util: use "stubDriverType" instead of just "stubDriver"
In the past we just kept track of the type of the "stub driver" (the
driver that is bound to a device in order to assign it to a
guest). The next commit will add a stubDriverName to go along with
type, so lets use stubDriverType for the existing enum to make it
easier to keep track of whether we're talking about the name or the
type.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-08-24 23:36:18 -04:00
20 changed files with 269 additions and 205 deletions

View File

@ -462,6 +462,7 @@ virDomainDriverNodeDeviceReAttach(virNodeDevicePtr dev,
int
virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
virHostdevManager *hostdevMgr,
virPCIStubDriver driverType,
const char *driverName)
{
g_autoptr(virPCIDevice) pci = NULL;
@ -471,8 +472,10 @@ virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
g_autoptr(virConnect) nodeconn = NULL;
g_autoptr(virNodeDevice) nodedev = NULL;
if (!driverName)
if (driverType == VIR_PCI_STUB_DRIVER_NONE) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("driver type not set"));
return -1;
}
if (!(nodeconn = virGetConnectNodeDev()))
return -1;
@ -504,10 +507,8 @@ virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
if (!pci)
return -1;
if (STREQ(driverName, "vfio"))
virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
else if (STREQ(driverName, "xen"))
virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_XEN);
virPCIDeviceSetStubDriverType(pci, driverType);
virPCIDeviceSetStubDriverName(pci, driverName);
return virHostdevPCINodeDeviceDetach(hostdevMgr, pci);
}

View File

@ -22,6 +22,7 @@
#include "node_device_conf.h"
#include "virhostdev.h"
#include "virpci.h"
char *
virDomainDriverGenerateRootHash(const char *drivername,
@ -58,6 +59,7 @@ int virDomainDriverNodeDeviceReAttach(virNodeDevicePtr dev,
int virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
virHostdevManager *hostdevMgr,
virPCIStubDriver driverType,
const char *driverName);
int virDomainDriverAddIOThreadCheck(virDomainDef *def,

View File

@ -244,9 +244,9 @@ virHostdevGetPCIHostDevice(const virDomainHostdevDef *hostdev,
virPCIDeviceSetManaged(actual, hostdev->managed);
if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_VFIO);
virPCIDeviceSetStubDriverType(actual, VIR_PCI_STUB_DRIVER_VFIO);
} else if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN) {
virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_XEN);
virPCIDeviceSetStubDriverType(actual, VIR_PCI_STUB_DRIVER_XEN);
} else {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("pci backend driver '%1$s' is not supported"),
@ -679,7 +679,7 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) {
virPCIDevice *pci = virPCIDeviceListGet(pcidevs, i);
bool strict_acs_check = !!(flags & VIR_HOSTDEV_STRICT_ACS_CHECK);
bool usesVFIO = (virPCIDeviceGetStubDriver(pci) == VIR_PCI_STUB_DRIVER_VFIO);
bool usesVFIO = (virPCIDeviceGetStubDriverType(pci) == VIR_PCI_STUB_DRIVER_VFIO);
struct virHostdevIsPCINodeDeviceUsedData data = {mgr, drv_name, dom_name, false};
int hdrType = -1;
@ -743,9 +743,8 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
mgr->inactivePCIHostdevs) < 0)
goto reattachdevs;
} else {
g_autofree char *driverPath = NULL;
g_autofree char *driverName = NULL;
int stub;
g_autofree char *drvName = NULL;
virPCIStubDriver drvType;
/* Unmanaged devices should already have been marked as
* inactive: if that's the case, we can simply move on */
@ -765,18 +764,17 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
* information about active / inactive device across
* daemon restarts has been implemented */
if (virPCIDeviceGetDriverPathAndName(pci,
&driverPath, &driverName) < 0)
if (virPCIDeviceGetCurrentDriverNameAndType(pci, &drvName,
&drvType) < 0) {
goto reattachdevs;
}
stub = virPCIStubDriverTypeFromString(driverName);
if (stub > VIR_PCI_STUB_DRIVER_NONE &&
stub < VIR_PCI_STUB_DRIVER_LAST) {
if (drvType > VIR_PCI_STUB_DRIVER_NONE) {
/* The device is bound to a known stub driver: store this
* information and add a copy to the inactive list */
virPCIDeviceSetStubDriver(pci, stub);
virPCIDeviceSetStubDriverType(pci, drvType);
virPCIDeviceSetStubDriverName(pci, drvName);
VIR_DEBUG("Adding PCI device %s to inactive list",
virPCIDeviceGetName(pci));
@ -2290,18 +2288,13 @@ virHostdevPrepareOneNVMeDevice(virHostdevManager *hostdev_mgr,
/* Let's check if all PCI devices are NVMe disks. */
for (i = 0; i < virPCIDeviceListCount(pciDevices); i++) {
virPCIDevice *pci = virPCIDeviceListGet(pciDevices, i);
g_autofree char *drvPath = NULL;
g_autofree char *drvName = NULL;
int stub = VIR_PCI_STUB_DRIVER_NONE;
virPCIStubDriver drvType;
if (virPCIDeviceGetDriverPathAndName(pci, &drvPath, &drvName) < 0)
if (virPCIDeviceGetCurrentDriverNameAndType(pci, &drvName, &drvType) < 0)
goto cleanup;
if (drvName)
stub = virPCIStubDriverTypeFromString(drvName);
if (stub == VIR_PCI_STUB_DRIVER_VFIO ||
STREQ_NULLABLE(drvName, "nvme"))
if (drvType == VIR_PCI_STUB_DRIVER_VFIO || STREQ_NULLABLE(drvName, "nvme"))
continue;
VIR_WARN("Suspicious NVMe disk assignment. PCI device "

View File

@ -3074,7 +3074,8 @@ virPCIDeviceFileIterate;
virPCIDeviceFree;
virPCIDeviceGetAddress;
virPCIDeviceGetConfigPath;
virPCIDeviceGetDriverPathAndName;
virPCIDeviceGetCurrentDriverNameAndType;
virPCIDeviceGetCurrentDriverPathAndName;
virPCIDeviceGetIOMMUGroupDev;
virPCIDeviceGetIOMMUGroupList;
virPCIDeviceGetLinkCapSta;
@ -3082,7 +3083,8 @@ virPCIDeviceGetManaged;
virPCIDeviceGetName;
virPCIDeviceGetRemoveSlot;
virPCIDeviceGetReprobe;
virPCIDeviceGetStubDriver;
virPCIDeviceGetStubDriverName;
virPCIDeviceGetStubDriverType;
virPCIDeviceGetUnbindFromStub;
virPCIDeviceGetUsedBy;
virPCIDeviceGetVPD;
@ -3108,7 +3110,8 @@ virPCIDeviceReset;
virPCIDeviceSetManaged;
virPCIDeviceSetRemoveSlot;
virPCIDeviceSetReprobe;
virPCIDeviceSetStubDriver;
virPCIDeviceSetStubDriverName;
virPCIDeviceSetStubDriverType;
virPCIDeviceSetUnbindFromStub;
virPCIDeviceSetUsedBy;
virPCIDeviceUnbind;

View File

@ -5876,7 +5876,8 @@ libxlNodeDeviceDetachFlags(virNodeDevicePtr dev,
/* virNodeDeviceDetachFlagsEnsureACL() is being called by
* virDomainDriverNodeDeviceDetachFlags() */
return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr, driverName);
return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr,
VIR_PCI_STUB_DRIVER_XEN, NULL);
}
static int

View File

@ -70,7 +70,6 @@
#include "domain_driver.h"
#include "domain_postparse.h"
#include "domain_validate.h"
#include "virpci.h"
#include "virpidfile.h"
#include "virprocess.h"
#include "libvirt_internal.h"
@ -11407,34 +11406,38 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
virCheckFlags(0, -1);
if (!driverName)
driverName = "vfio";
/* For historical reasons, if driverName is "vfio", that is the
* same as NULL, i.e. the default vfio driver for this device
*/
if (STREQ_NULLABLE(driverName, "vfio"))
driverName = NULL;
/* Only the 'vfio' driver is supported and a special error message for
* the previously supported 'kvm' driver is provided below. */
if (STRNEQ(driverName, "vfio") && STRNEQ(driverName, "kvm")) {
virReportError(VIR_ERR_INVALID_ARG,
_("unknown driver name '%1$s'"), driverName);
return -1;
}
if (STREQ(driverName, "kvm")) {
/* the "kvm" driver name was used a very long time ago to force
* "legacy KVM device assignment", which hasn't been supported in
* over 10 years.
*/
if (STREQ_NULLABLE(driverName, "kvm")) {
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
_("KVM device assignment is no longer "
"supported on this system"));
_("'legacy KVM' device assignment is no longer supported on this system"));
return -1;
}
/* for any other driver, we can't know whether or not it is a VFIO
* driver until the device has been bound to it, so we will defer
* further validation until then.
*/
if (!qemuHostdevHostSupportsPassthroughVFIO()) {
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
_("VFIO device assignment is currently not "
"supported on this system"));
_("VFIO device assignment is currently not supported on this system"));
return -1;
}
/* virNodeDeviceDetachFlagsEnsureACL() is being called by
* virDomainDriverNodeDeviceDetachFlags() */
return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr, driverName);
return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr,
VIR_PCI_STUB_DRIVER_VFIO,
driverName);
}
static int

View File

@ -292,7 +292,7 @@ virNVMeDeviceCreatePCIDevice(const virNVMeDevice *nvme)
return NULL;
/* NVMe devices must be bound to vfio */
virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
virPCIDeviceSetStubDriverType(pci, VIR_PCI_STUB_DRIVER_VFIO);
virPCIDeviceSetManaged(pci, nvme->managed);
return g_steal_pointer(&pci);

View File

@ -87,7 +87,8 @@ struct _virPCIDevice {
bool managed;
virPCIStubDriver stubDriver;
virPCIStubDriver stubDriverType;
char *stubDriverName; /* if blank, use default for type */
/* used by reattach function */
bool unbind_from_stub;
@ -227,7 +228,7 @@ virPCIFile(const char *device, const char *file)
}
/* virPCIDeviceGetDriverPathAndName - put the path to the driver
/* virPCIDeviceGetCurrentDriverPathAndName - put the path to the driver
* directory of the driver in use for this device in @path and the
* name of the driver in @name. Both could be NULL if it's not bound
* to any driver.
@ -235,7 +236,9 @@ virPCIFile(const char *device, const char *file)
* Return 0 for success, -1 for error.
*/
int
virPCIDeviceGetDriverPathAndName(virPCIDevice *dev, char **path, char **name)
virPCIDeviceGetCurrentDriverPathAndName(virPCIDevice *dev,
char **path,
char **name)
{
int ret = -1;
g_autofree char *drvlink = NULL;
@ -277,6 +280,73 @@ virPCIDeviceGetDriverPathAndName(virPCIDevice *dev, char **path, char **name)
}
/**
* virPCIDeviceGetCurrentDriverNameAndType:
* @dev: virPCIDevice object to examine
* @drvName: returns name of driver bound to this device (if any)
* @drvType: returns type of driver if it is a known stub driver type
*
* Find the name of the driver bound to @dev (if any) and the type of
* the driver if it is a known/recognized "stub" driver (based on the
* driver name).
*
* There are vfio "variant" drivers that provide all the basic
* functionality of the standard vfio-pci driver as well as additional
* stuff. As of kernel 6.1, the vfio-pci driver and all vfio variant
* drivers can be identified (once the driver has been bound to a
* device) by looking for the subdirectory "vfio-dev" in the device's
* sysfs directory; for example, if the directory
* /sys/bus/pci/devices/0000:04:11.4/vfio-dev exists, then the driver
* that is currently bound to PCI device 0000:04:11.4 is either
* vfio-pci, or a vfio-pci variant driver.
*
* Return 0 on success, -1 on failure. If -1 is returned, then an error
* message has been logged.
*/
int
virPCIDeviceGetCurrentDriverNameAndType(virPCIDevice *dev,
char **drvName,
virPCIStubDriver *drvType)
{
g_autofree char *drvPath = NULL;
g_autofree char *vfioDevDir = NULL;
int tmpType;
if (virPCIDeviceGetCurrentDriverPathAndName(dev, &drvPath, drvName) < 0)
return -1;
if (!*drvName) {
*drvType = VIR_PCI_STUB_DRIVER_NONE;
return 0;
}
tmpType = virPCIStubDriverTypeFromString(*drvName);
if (tmpType > VIR_PCI_STUB_DRIVER_NONE) {
*drvType = tmpType;
return 0; /* exact match of a known driver name (or no name) */
}
/* If the sysfs directory of this device contains a directory
* named "vfio-dev" then the currently-bound driver is a vfio
* variant driver.
*/
vfioDevDir = virPCIFile(dev->name, "vfio-dev");
if (virFileIsDir(vfioDevDir)) {
VIR_DEBUG("Driver %s is a vfio_pci driver", *drvName);
*drvType = VIR_PCI_STUB_DRIVER_VFIO;
} else {
VIR_DEBUG("Driver %s is NOT a vfio_pci driver, or kernel is too old",
*drvName);
*drvType = VIR_PCI_STUB_DRIVER_NONE;
}
return 0;
}
static int
virPCIDeviceConfigOpenInternal(virPCIDevice *dev, bool readonly, bool fatal)
{
@ -1004,8 +1074,8 @@ virPCIDeviceReset(virPCIDevice *dev,
virPCIDeviceList *activeDevs,
virPCIDeviceList *inactiveDevs)
{
g_autofree char *drvPath = NULL;
g_autofree char *drvName = NULL;
virPCIStubDriver drvType;
int ret = -1;
int fd = -1;
int hdrType = -1;
@ -1031,15 +1101,16 @@ virPCIDeviceReset(virPCIDevice *dev,
* reset it whenever appropriate, so doing it ourselves would just
* be redundant.
*/
if (virPCIDeviceGetDriverPathAndName(dev, &drvPath, &drvName) < 0)
if (virPCIDeviceGetCurrentDriverNameAndType(dev, &drvName, &drvType) < 0)
goto cleanup;
if (virPCIStubDriverTypeFromString(drvName) == VIR_PCI_STUB_DRIVER_VFIO) {
VIR_DEBUG("Device %s is bound to vfio-pci - skip reset",
dev->name);
if (drvType == VIR_PCI_STUB_DRIVER_VFIO) {
VIR_DEBUG("Device %s is bound to %s - skip reset", dev->name, drvName);
ret = 0;
goto cleanup;
}
VIR_DEBUG("Resetting device %s", dev->name);
if ((fd = virPCIDeviceConfigOpenWrite(dev)) < 0)
@ -1083,28 +1154,19 @@ virPCIDeviceReset(virPCIDevice *dev,
static int
virPCIProbeStubDriver(virPCIStubDriver driver)
virPCIProbeDriver(const char *driverName)
{
const char *drvname = NULL;
g_autofree char *drvpath = NULL;
g_autofree char *errbuf = NULL;
if (driver == VIR_PCI_STUB_DRIVER_NONE ||
!(drvname = virPCIStubDriverTypeToString(driver))) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s",
_("Attempting to use unknown stub driver"));
return -1;
}
drvpath = virPCIDriverDir(drvname);
drvpath = virPCIDriverDir(driverName);
/* driver previously loaded, return */
if (virFileExists(drvpath))
return 0;
if ((errbuf = virKModLoad(drvname))) {
VIR_WARN("failed to load driver %s: %s", drvname, errbuf);
if ((errbuf = virKModLoad(driverName))) {
VIR_WARN("failed to load driver %s: %s", driverName, errbuf);
goto cleanup;
}
@ -1116,14 +1178,14 @@ virPCIProbeStubDriver(virPCIStubDriver driver)
/* If we know failure was because of admin config, let's report that;
* otherwise, report a more generic failure message
*/
if (virKModIsProhibited(drvname)) {
if (virKModIsProhibited(driverName)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to load PCI stub module %1$s: administratively prohibited"),
drvname);
_("Failed to load PCI driver module %1$s: administratively prohibited"),
driverName);
} else {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to load PCI stub module %1$s"),
drvname);
_("Failed to load PCI driver module %1$s"),
driverName);
}
return -1;
@ -1136,7 +1198,7 @@ virPCIDeviceUnbind(virPCIDevice *dev)
g_autofree char *drvpath = NULL;
g_autofree char *driver = NULL;
if (virPCIDeviceGetDriverPathAndName(dev, &drvpath, &driver) < 0)
if (virPCIDeviceGetCurrentDriverPathAndName(dev, &drvpath, &driver) < 0)
return -1;
if (!driver)
@ -1228,23 +1290,29 @@ virPCIDeviceUnbindFromStub(virPCIDevice *dev)
static int
virPCIDeviceBindToStub(virPCIDevice *dev)
{
const char *stubDriverName;
const char *stubDriverName = dev->stubDriverName;
g_autofree char *stubDriverPath = NULL;
g_autofree char *driverLink = NULL;
/* Check the device is configured to use one of the known stub drivers */
if (dev->stubDriver == VIR_PCI_STUB_DRIVER_NONE) {
if (dev->stubDriverType == VIR_PCI_STUB_DRIVER_NONE) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("No stub driver configured for PCI device %1$s"),
dev->name);
return -1;
} else if (!(stubDriverName = virPCIStubDriverTypeToString(dev->stubDriver))) {
}
if (!stubDriverName
&& !(stubDriverName = virPCIStubDriverTypeToString(dev->stubDriverType))) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unknown stub driver configured for PCI device %1$s"),
dev->name);
return -1;
}
if (virPCIProbeDriver(stubDriverName) < 0)
return -1;
stubDriverPath = virPCIDriverDir(stubDriverName);
driverLink = virPCIFile(dev->name, "driver");
@ -1267,9 +1335,10 @@ virPCIDeviceBindToStub(virPCIDevice *dev)
/* virPCIDeviceDetach:
*
* Detach this device from the host driver, attach it to the stub
* driver (previously set with virPCIDeviceSetStubDriver(), and add *a
* copy* of the object to the inactiveDevs list (if provided). This
* function will *never* consume dev, so the caller should free it.
* driver (previously set with virPCIDeviceSetStubDriverType(), and
* add *a copy* of the object to the inactiveDevs list (if provided).
* This function will *never* consume dev, so the caller should free
* it.
*
* Returns 0 on success, -1 on failure (will fail if the device is
* already in the activeDevs list, but will be a NOP if the device is
@ -1287,9 +1356,6 @@ virPCIDeviceDetach(virPCIDevice *dev,
virPCIDeviceList *activeDevs,
virPCIDeviceList *inactiveDevs)
{
if (virPCIProbeStubDriver(dev->stubDriver) < 0)
return -1;
if (activeDevs && virPCIDeviceListFind(activeDevs, &dev->address)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Not detaching active device %1$s"), dev->name);
@ -1507,6 +1573,7 @@ virPCIDeviceCopy(virPCIDevice *dev)
copy->path = g_strdup(dev->path);
copy->used_by_drvname = g_strdup(dev->used_by_drvname);
copy->used_by_domname = g_strdup(dev->used_by_domname);
copy->stubDriverName = g_strdup(dev->stubDriverName);
return copy;
}
@ -1521,6 +1588,7 @@ virPCIDeviceFree(virPCIDevice *dev)
g_free(dev->path);
g_free(dev->used_by_drvname);
g_free(dev->used_by_domname);
g_free(dev->stubDriverName);
g_free(dev);
}
@ -1569,15 +1637,29 @@ virPCIDeviceGetManaged(virPCIDevice *dev)
}
void
virPCIDeviceSetStubDriver(virPCIDevice *dev, virPCIStubDriver driver)
virPCIDeviceSetStubDriverType(virPCIDevice *dev, virPCIStubDriver driverType)
{
dev->stubDriver = driver;
dev->stubDriverType = driverType;
}
virPCIStubDriver
virPCIDeviceGetStubDriver(virPCIDevice *dev)
virPCIDeviceGetStubDriverType(virPCIDevice *dev)
{
return dev->stubDriver;
return dev->stubDriverType;
}
void
virPCIDeviceSetStubDriverName(virPCIDevice *dev,
const char *driverName)
{
g_free(dev->stubDriverName);
dev->stubDriverName = g_strdup(driverName);
}
const char *
virPCIDeviceGetStubDriverName(virPCIDevice *dev)
{
return dev->stubDriverName;
}
bool

View File

@ -134,9 +134,12 @@ int virPCIDeviceReset(virPCIDevice *dev,
void virPCIDeviceSetManaged(virPCIDevice *dev,
bool managed);
bool virPCIDeviceGetManaged(virPCIDevice *dev);
void virPCIDeviceSetStubDriver(virPCIDevice *dev,
virPCIStubDriver driver);
virPCIStubDriver virPCIDeviceGetStubDriver(virPCIDevice *dev);
void virPCIDeviceSetStubDriverType(virPCIDevice *dev,
virPCIStubDriver driverType);
virPCIStubDriver virPCIDeviceGetStubDriverType(virPCIDevice *dev);
void virPCIDeviceSetStubDriverName(virPCIDevice *dev,
const char *driverName);
const char *virPCIDeviceGetStubDriverName(virPCIDevice *dev);
virPCIDeviceAddress *virPCIDeviceGetAddress(virPCIDevice *dev);
int virPCIDeviceSetUsedBy(virPCIDevice *dev,
const char *drv_name,
@ -277,9 +280,12 @@ virPCIVPDResource * virPCIDeviceGetVPD(virPCIDevice *dev);
int virPCIDeviceUnbind(virPCIDevice *dev);
int virPCIDeviceRebind(virPCIDevice *dev);
int virPCIDeviceGetDriverPathAndName(virPCIDevice *dev,
char **path,
char **name);
int virPCIDeviceGetCurrentDriverPathAndName(virPCIDevice *dev,
char **path,
char **name);
int virPCIDeviceGetCurrentDriverNameAndType(virPCIDevice *dev,
char **drvName,
virPCIStubDriver *drvType);
int virPCIDeviceIsPCIExpress(virPCIDevice *dev);
int virPCIDeviceHasPCIExpressLink(virPCIDevice *dev);

View File

@ -6,7 +6,7 @@
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64'>hvm</type>
<kernel>hypervisor-fw</kernel>
<kernel>/path/to/hypervisor-fw</kernel>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
@ -16,7 +16,7 @@
<devices>
<emulator>/usr/local/bin/cloud-hypervisor</emulator>
<disk type='file' device='disk'>
<source file='disk.raw'/>
<source file='/path/to/disk.raw'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='ethernet'>

View File

@ -8,6 +8,9 @@
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
@ -20,7 +23,7 @@
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
<controller type='usb' index='0' model='piix3-uhci'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>

View File

@ -8,6 +8,9 @@
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
@ -20,7 +23,7 @@
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
<controller type='usb' index='0' model='piix3-uhci'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>

View File

@ -16,13 +16,16 @@
<features>
<acpi/>
</features>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0'>
<controller type='usb' index='0' model='piix3-uhci'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='virtio-serial' index='0'>

View File

@ -8,6 +8,9 @@
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
@ -32,7 +35,7 @@
<target dev='hdb' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<controller type='usb' index='0'>
<controller type='usb' index='0' model='piix3-uhci'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>

View File

@ -8,6 +8,9 @@
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
@ -20,7 +23,7 @@
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
<controller type='usb' index='0' model='piix3-uhci'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>

View File

@ -19,13 +19,6 @@
static virQEMUDriver driver;
enum {
WHEN_INACTIVE = 1,
WHEN_ACTIVE = 2,
WHEN_BOTH = 3,
};
static int
testXML2XMLCommon(const struct testQemuInfo *info)
{
@ -46,6 +39,9 @@ testXML2XMLActive(const void *opaque)
{
const struct testQemuInfo *info = opaque;
if (info->flags & FLAG_SKIP_CONFIG_ACTIVE)
return EXIT_AM_SKIP;
if (testXML2XMLCommon(info) < 0 ||
testCompareDomXML2XMLFiles(driver.caps, driver.xmlopt,
info->infile, info->outfile, true,
@ -75,10 +71,22 @@ testXML2XMLInactive(const void *opaque)
}
/**
* testInfoSetPaths:
* @info: test info structure to populate
* @suffix: suffix used to create output file name e.g. ".x86-64_latest"
* @statesuffix: suffix to create output file name based on tested state ("active" | "inactive")
*
* This function populates @info with the correct input and output file paths.
*
* The output file is chosen based on whether a version with @statesuffix exists.
* If yes, it's used, if no the @statesuffix is omitted and it's expected that
* both the "active" and "inactive" versions are the same.
*/
static void
testInfoSetPaths(struct testQemuInfo *info,
const char *suffix,
int when)
const char *statesuffix)
{
VIR_FREE(info->infile);
VIR_FREE(info->outfile);
@ -88,7 +96,7 @@ testInfoSetPaths(struct testQemuInfo *info,
info->outfile = g_strdup_printf("%s/qemuxml2xmloutdata/%s-%s%s.xml",
abs_srcdir, info->name,
when == WHEN_ACTIVE ? "active" : "inactive", suffix);
statesuffix, suffix);
if (!virFileExists(info->outfile)) {
VIR_FREE(info->outfile);
@ -138,32 +146,24 @@ mymain(void)
virSetConnectSecret(conn);
virSetConnectStorage(conn);
#define DO_TEST_FULL(_name, suffix, when, ...) \
#define DO_TEST_CAPS_INTERNAL(_name, arch, ver, ...) \
do { \
static struct testQemuInfo info = { \
.name = _name, \
}; \
testQemuInfoSetArgs(&info, &testConf, __VA_ARGS__); \
testQemuInfoSetArgs(&info, &testConf, \
ARG_CAPS_ARCH, arch, \
ARG_CAPS_VER, ver, \
__VA_ARGS__, ARG_END); \
\
if (when & WHEN_INACTIVE) { \
testInfoSetPaths(&info, suffix, WHEN_INACTIVE); \
virTestRunLog(&ret, "QEMU XML-2-XML-inactive " _name, testXML2XMLInactive, &info); \
} \
testInfoSetPaths(&info, "." arch "-" ver, "inactive"); \
virTestRunLog(&ret, "QEMU XML-2-XML-inactive " _name, testXML2XMLInactive, &info); \
\
if (when & WHEN_ACTIVE) { \
testInfoSetPaths(&info, suffix, WHEN_ACTIVE); \
virTestRunLog(&ret, "QEMU XML-2-XML-active " _name, testXML2XMLActive, &info); \
} \
testInfoSetPaths(&info, "." arch "-" ver, "active"); \
virTestRunLog(&ret, "QEMU XML-2-XML-active " _name, testXML2XMLActive, &info); \
testQemuInfoClear(&info); \
} while (0)
#define DO_TEST_CAPS_INTERNAL(name, arch, ver, ...) \
DO_TEST_FULL(name, "." arch "-" ver, WHEN_BOTH, \
ARG_CAPS_ARCH, arch, \
ARG_CAPS_VER, ver, \
__VA_ARGS__, \
ARG_END)
#define DO_TEST_CAPS_ARCH_LATEST_FULL(name, arch, ...) \
DO_TEST_CAPS_INTERNAL(name, arch, "latest", __VA_ARGS__)
@ -499,20 +499,17 @@ mymain(void)
DO_TEST_CAPS_ARCH_LATEST("ppc64-tpmproxy-single", "ppc64");
DO_TEST_CAPS_ARCH_LATEST("ppc64-tpmproxy-with-tpm", "ppc64");
DO_TEST_FULL("seclabel-dynamic-baselabel", "", WHEN_INACTIVE, ARG_END);
DO_TEST_FULL("seclabel-dynamic-override", "", WHEN_INACTIVE, ARG_END);
DO_TEST_FULL("seclabel-dynamic-labelskip", "", WHEN_INACTIVE, ARG_END);
DO_TEST_FULL("seclabel-dynamic-relabel", "", WHEN_INACTIVE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("seclabel-dynamic-baselabel", "x86_64", ARG_FLAGS, FLAG_SKIP_CONFIG_ACTIVE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("seclabel-dynamic-override", "x86_64", ARG_FLAGS, FLAG_SKIP_CONFIG_ACTIVE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("seclabel-dynamic-labelskip", "x86_64", ARG_FLAGS, FLAG_SKIP_CONFIG_ACTIVE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("seclabel-dynamic-relabel", "x86_64", ARG_FLAGS, FLAG_SKIP_CONFIG_ACTIVE, ARG_END);
DO_TEST_CAPS_LATEST("seclabel-static");
DO_TEST_CAPS_LATEST("seclabel-static-labelskip");
DO_TEST_CAPS_LATEST("seclabel-none");
DO_TEST_CAPS_LATEST("seclabel-dac-none");
DO_TEST_CAPS_LATEST("seclabel-dynamic-none");
DO_TEST_CAPS_LATEST("seclabel-device-multiple");
DO_TEST_FULL("seclabel-dynamic-none-relabel", "", WHEN_INACTIVE,
ARG_QEMU_CAPS, QEMU_CAPS_DEVICE_CIRRUS_VGA,
QEMU_CAPS_SPICE, QEMU_CAPS_LAST,
ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("seclabel-dynamic-none-relabel", "x86_64", ARG_FLAGS, FLAG_SKIP_CONFIG_ACTIVE, ARG_END);
DO_TEST_CAPS_LATEST("numad-static-vcpu-no-numatune");
DO_TEST_CAPS_LATEST("disk-scsi-disk-vpd");
@ -770,69 +767,27 @@ mymain(void)
DO_TEST_CAPS_ARCH_LATEST("aarch64-traditional-pci", "aarch64");
DO_TEST_CAPS_ARCH_LATEST("aarch64-video-default", "aarch64");
DO_TEST_FULL("aarch64-gic-none", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_FULL("aarch64-gic-none-v2", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V2, ARG_END);
DO_TEST_FULL("aarch64-gic-none-v3", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V3, ARG_END);
DO_TEST_FULL("aarch64-gic-none-both", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_FULL("aarch64-gic-none-tcg", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_FULL("aarch64-gic-default", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_FULL("aarch64-gic-default-v2", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V2, ARG_END);
DO_TEST_FULL("aarch64-gic-default-v3", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V3, ARG_END);
DO_TEST_FULL("aarch64-gic-default-both", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_FULL("aarch64-gic-v2", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_FULL("aarch64-gic-v2", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V2, ARG_END);
DO_TEST_FULL("aarch64-gic-v2", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V3, ARG_END);
DO_TEST_FULL("aarch64-gic-v2", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_FULL("aarch64-gic-v3", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_FULL("aarch64-gic-v3", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V2, ARG_END);
DO_TEST_FULL("aarch64-gic-v3", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V3, ARG_END);
DO_TEST_FULL("aarch64-gic-v3", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_FULL("aarch64-gic-host", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_FULL("aarch64-gic-host", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V2, ARG_END);
DO_TEST_FULL("aarch64-gic-host", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_V3, ARG_END);
DO_TEST_FULL("aarch64-gic-host", ".aarch64-latest", WHEN_BOTH,
ARG_CAPS_ARCH, "aarch64", ARG_CAPS_VER, "latest",
ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-none", "aarch64", ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-none-v2", "aarch64", ARG_GIC, GIC_V2, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-none-v3", "aarch64", ARG_GIC, GIC_V3, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-none-both", "aarch64", ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-none-tcg", "aarch64", ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-default", "aarch64", ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-default-v2", "aarch64", ARG_GIC, GIC_V2, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-default-v3", "aarch64", ARG_GIC, GIC_V3, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-default-both", "aarch64", ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-v2", "aarch64", ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-v2", "aarch64", ARG_GIC, GIC_V2, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-v2", "aarch64", ARG_GIC, GIC_V3, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-v2", "aarch64", ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-v3", "aarch64", ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-v3", "aarch64", ARG_GIC, GIC_V2, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-v3", "aarch64", ARG_GIC, GIC_V3, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-v3", "aarch64", ARG_GIC, GIC_BOTH, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-host", "aarch64", ARG_GIC, GIC_NONE, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-host", "aarch64", ARG_GIC, GIC_V2, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-host", "aarch64", ARG_GIC, GIC_V3, ARG_END);
DO_TEST_CAPS_ARCH_LATEST_FULL("aarch64-gic-host", "aarch64", ARG_GIC, GIC_BOTH, ARG_END);
/* SVE aarch64 CPU features work on modern QEMU */
DO_TEST_CAPS_ARCH_LATEST("aarch64-features-sve", "aarch64");

View File

@ -59,6 +59,7 @@ typedef enum {
FLAG_REAL_CAPS = 1 << 3,
FLAG_SKIP_LEGACY_CPUS = 1 << 4,
FLAG_SLIRP_HELPER = 1 << 5,
FLAG_SKIP_CONFIG_ACTIVE = 1 << 6, /* Skip 'active' config test in qemuxml2xmltest */
} testQemuInfoFlags;
struct testQemuConf {

View File

@ -142,7 +142,7 @@ myInit(void)
if (!(dev[i] = virPCIDeviceNew(&subsys->u.pci.addr)))
goto cleanup;
virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
virPCIDeviceSetStubDriverType(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
}
for (i = 0; i < ndisks; i++) {

View File

@ -37,7 +37,7 @@ testVirPCIDeviceCheckDriver(virPCIDevice *dev, const char *expected)
g_autofree char *path = NULL;
g_autofree char *driver = NULL;
if (virPCIDeviceGetDriverPathAndName(dev, &path, &driver) < 0)
if (virPCIDeviceGetCurrentDriverPathAndName(dev, &path, &driver) < 0)
return -1;
if (STRNEQ_NULLABLE(driver, expected)) {
@ -107,7 +107,7 @@ testVirPCIDeviceDetach(const void *opaque G_GNUC_UNUSED)
if (!(dev[i] = virPCIDeviceNew(&devAddr)))
goto cleanup;
virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
virPCIDeviceSetStubDriverType(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
if (virPCIDeviceDetach(dev[i], activeDevs, inactiveDevs) < 0)
goto cleanup;
@ -149,7 +149,7 @@ testVirPCIDeviceReset(const void *opaque G_GNUC_UNUSED)
if (!(dev[i] = virPCIDeviceNew(&devAddr)))
goto cleanup;
virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
virPCIDeviceSetStubDriverType(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
if (virPCIDeviceReset(dev[i], activeDevs, inactiveDevs) < 0)
goto cleanup;
@ -190,7 +190,7 @@ testVirPCIDeviceReattach(const void *opaque G_GNUC_UNUSED)
CHECK_LIST_COUNT(activeDevs, 0);
CHECK_LIST_COUNT(inactiveDevs, i + 1);
virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
virPCIDeviceSetStubDriverType(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
}
CHECK_LIST_COUNT(activeDevs, 0);
@ -249,7 +249,7 @@ testVirPCIDeviceDetachSingle(const void *opaque)
if (!dev)
goto cleanup;
virPCIDeviceSetStubDriver(dev, VIR_PCI_STUB_DRIVER_VFIO);
virPCIDeviceSetStubDriverType(dev, VIR_PCI_STUB_DRIVER_VFIO);
if (virPCIDeviceDetach(dev, NULL, NULL) < 0)
goto cleanup;

View File

@ -237,6 +237,8 @@ static const struct testSchemaEntry schemaDomain[] = {
{ .dir = "tests/xml2vmxdata" },
{ .dir = "tests/bhyveargv2xmldata" },
{ .dir = "tests/qemuagentdata" },
{ .dir = "tests/chxml2xmlin" },
{ .dir = "tests/chxml2xmlout" },
};
static const struct testSchemaEntry schemaDomainCaps[] = {