This patch introduces a new attribute PCI address extension flag
to deal with the extension PCI attributes such as 'uid' and 'fid'
on the S390 platform.
Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
---
src/conf/device_conf.h | 1 +
src/conf/domain_addr.h | 5 ++
src/qemu/qemu_domain_address.c | 139 ++++++++++++++++++++++++++++++++++++++++-
3 files changed, 143 insertions(+), 2 deletions(-)
diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
index a31ce9c376..6f926dff1d 100644
--- a/src/conf/device_conf.h
+++ b/src/conf/device_conf.h
@@ -164,6 +164,7 @@ struct _virDomainDeviceInfo {
* assignment, never saved and never reported.
*/
int pciConnectFlags; /* enum virDomainPCIConnectFlags */
+ int pciAddressExtFlags; /* enum virDomainPCIAddressExtensionFlags */
char *loadparm;
/* PCI devices will only be automatically placed on a PCI bus
diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
index 5ad9d8ef3d..5219d2f208 100644
--- a/src/conf/domain_addr.h
+++ b/src/conf/domain_addr.h
@@ -29,6 +29,11 @@
# define VIR_PCI_ADDRESS_SLOT_LAST 31
# define VIR_PCI_ADDRESS_FUNCTION_LAST 7
+typedef enum {
+ VIR_PCI_ADDRESS_EXTENSION_NONE = 0, /* no extension */
+ VIR_PCI_ADDRESS_EXTENSION_ZPCI = 1 << 0, /* zpci support */
+} virDomainPCIAddressExtensionFlags;
+
typedef enum {
VIR_PCI_CONNECT_HOTPLUGGABLE = 1 << 0, /* is hotplug needed/supported */
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 0d27e6ce9c..c582a531db 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -480,6 +480,62 @@ qemuDomainAssignARMVirtioMMIOAddresses(virDomainDefPtr def,
}
+static bool
+qemuDomainDeviceSupportZPCI(virDomainDeviceDefPtr device)
+{
+ switch ((virDomainDeviceType) device->type) {
+ case VIR_DOMAIN_DEVICE_CHR:
+ return false;
+
+ case VIR_DOMAIN_DEVICE_CONTROLLER:
+ case VIR_DOMAIN_DEVICE_DISK:
+ case VIR_DOMAIN_DEVICE_LEASE:
+ case VIR_DOMAIN_DEVICE_FS:
+ case VIR_DOMAIN_DEVICE_NET:
+ case VIR_DOMAIN_DEVICE_INPUT:
+ case VIR_DOMAIN_DEVICE_SOUND:
+ case VIR_DOMAIN_DEVICE_VIDEO:
+ case VIR_DOMAIN_DEVICE_HOSTDEV:
+ case VIR_DOMAIN_DEVICE_WATCHDOG:
+ case VIR_DOMAIN_DEVICE_GRAPHICS:
+ case VIR_DOMAIN_DEVICE_HUB:
+ case VIR_DOMAIN_DEVICE_REDIRDEV:
+ case VIR_DOMAIN_DEVICE_SMARTCARD:
+ case VIR_DOMAIN_DEVICE_MEMBALLOON:
+ case VIR_DOMAIN_DEVICE_NVRAM:
+ case VIR_DOMAIN_DEVICE_RNG:
+ case VIR_DOMAIN_DEVICE_SHMEM:
+ case VIR_DOMAIN_DEVICE_TPM:
+ case VIR_DOMAIN_DEVICE_PANIC:
+ case VIR_DOMAIN_DEVICE_MEMORY:
+ case VIR_DOMAIN_DEVICE_IOMMU:
+ case VIR_DOMAIN_DEVICE_VSOCK:
+ break;
+
+ case VIR_DOMAIN_DEVICE_NONE:
+ case VIR_DOMAIN_DEVICE_LAST:
+ virReportEnumRangeError(virDomainDeviceType, device->type);
+ return false;
+ }
+ return true;
+}
+
+
+static virDomainPCIAddressExtensionFlags
+qemuDomainDeviceCalculatePCIAddressExtensionFlags(virQEMUCapsPtr qemuCaps,
+ virDomainDeviceDefPtr dev)
+{
+ virDomainPCIAddressExtensionFlags extFlags = 0;
+
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI) &&
+ qemuDomainDeviceSupportZPCI(dev)) {
+ extFlags |= VIR_PCI_ADDRESS_EXTENSION_ZPCI;
+ }
+
+ return extFlags;
+}
+
+
/**
* qemuDomainDeviceCalculatePCIConnectFlags:
*
@@ -962,6 +1018,55 @@ qemuDomainFillAllPCIConnectFlags(virDomainDefPtr def,
}
+/**
+ * qemuDomainFillDevicePCIExtensionFlagsIter:
+ *
+ * @def: the entire DomainDef
+ * @dev: The device to be checked
+ * @info: virDomainDeviceInfo within the device
+ * @opaque: qemu capabilities
+ *
+ * Sets the pciAddressExtFlags for a single device's info. Has properly
+ * formatted arguments to be called by virDomainDeviceInfoIterate().
+ *
+ * Always returns 0 - there is no failure.
+ */
+static int
+qemuDomainFillDevicePCIExtensionFlagsIter(virDomainDefPtr def ATTRIBUTE_UNUSED,
+ virDomainDeviceDefPtr dev,
+ virDomainDeviceInfoPtr info,
+ void *opaque)
+{
+ virQEMUCapsPtr qemuCaps = opaque;
+
+ info->pciAddressExtFlags
+ = qemuDomainDeviceCalculatePCIAddressExtensionFlags(qemuCaps, dev);
+ return 0;
+}
+
+
+/**
+ * qemuDomainFillAllPCIExtensionFlags:
+ *
+ * @def: the entire DomainDef
+ * @qemuCaps: as you'd expect
+ *
+ * Set the info->pciAddressExtFlags for all devices in the domain.
+ *
+ * Returns 0 on success or -1 on failure (the only possibility of
+ * failure would be some internal problem with
+ * virDomainDeviceInfoIterate())
+ */
+static int
+qemuDomainFillAllPCIExtensionFlags(virDomainDefPtr def,
+ virQEMUCapsPtr qemuCaps)
+{
+ return virDomainDeviceInfoIterate(def,
+ qemuDomainFillDevicePCIExtensionFlagsIter,
+ qemuCaps);
+}
+
+
/**
* qemuDomainFindUnusedIsolationGroupIter:
* @def: domain definition
@@ -1236,6 +1341,29 @@ qemuDomainFillDevicePCIConnectFlags(virDomainDefPtr def,
}
+/**
+ * qemuDomainFillDevicePCIExtensionFlags:
+ *
+ * @dev: The device to be checked
+ * @qemuCaps: as you'd expect
+ *
+ * Set the info->pciAddressExtFlags for a single device.
+ *
+ * No return value.
+ */
+static void
+qemuDomainFillDevicePCIExtensionFlags(virDomainDeviceDefPtr dev,
+ virQEMUCapsPtr qemuCaps)
+{
+ virDomainDeviceInfoPtr info = virDomainDeviceGetInfo(dev);
+
+ if (info) {
+ info->pciAddressExtFlags
+ = qemuDomainDeviceCalculatePCIAddressExtensionFlags(qemuCaps, dev);
+ }
+}
+
+
static int
qemuDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
virDomainDeviceInfoPtr dev)
@@ -2369,6 +2497,9 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
if (qemuDomainFillAllPCIConnectFlags(def, qemuCaps, driver) < 0)
goto cleanup;
+ if (qemuDomainFillAllPCIExtensionFlags(def, qemuCaps) < 0)
+ goto cleanup;
+
if (qemuDomainSetupIsolationGroups(def) < 0)
goto cleanup;
@@ -2404,7 +2535,8 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
*/
virDomainDeviceInfo info = {
.pciConnectFlags = (VIR_PCI_CONNECT_HOTPLUGGABLE |
- VIR_PCI_CONNECT_TYPE_PCI_DEVICE)
+ VIR_PCI_CONNECT_TYPE_PCI_DEVICE),
+ .pciAddressExtFlags = VIR_PCI_ADDRESS_EXTENSION_NONE
};
bool buses_reserved = true;
@@ -2441,7 +2573,8 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
qemuDomainHasPCIeRoot(def)) {
virDomainDeviceInfo info = {
.pciConnectFlags = (VIR_PCI_CONNECT_HOTPLUGGABLE |
- VIR_PCI_CONNECT_TYPE_PCIE_DEVICE)
+ VIR_PCI_CONNECT_TYPE_PCIE_DEVICE),
+ .pciAddressExtFlags = VIR_PCI_ADDRESS_EXTENSION_NONE
};
/* if there isn't an empty pcie-root-port, this will
@@ -2958,6 +3091,8 @@ qemuDomainEnsurePCIAddress(virDomainObjPtr obj,
qemuDomainFillDevicePCIConnectFlags(obj->def, dev, priv->qemuCaps, driver);
+ qemuDomainFillDevicePCIExtensionFlags(dev, priv->qemuCaps);
+
return virDomainPCIAddressEnsureAddr(priv->pciaddrs, info,
info->pciConnectFlags);
}
--
Yi Min
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Tue, 2018-08-07 at 17:10 +0800, Yi Min Zhao wrote:
[...]
> +qemuDomainDeviceSupportZPCI(virDomainDeviceDefPtr device)
> +{
> + switch ((virDomainDeviceType) device->type) {
> + case VIR_DOMAIN_DEVICE_CHR:
> + return false;
> +
> + case VIR_DOMAIN_DEVICE_CONTROLLER:
> + case VIR_DOMAIN_DEVICE_DISK:
> + case VIR_DOMAIN_DEVICE_LEASE:
> + case VIR_DOMAIN_DEVICE_FS:
> + case VIR_DOMAIN_DEVICE_NET:
> + case VIR_DOMAIN_DEVICE_INPUT:
> + case VIR_DOMAIN_DEVICE_SOUND:
> + case VIR_DOMAIN_DEVICE_VIDEO:
> + case VIR_DOMAIN_DEVICE_HOSTDEV:
> + case VIR_DOMAIN_DEVICE_WATCHDOG:
> + case VIR_DOMAIN_DEVICE_GRAPHICS:
> + case VIR_DOMAIN_DEVICE_HUB:
> + case VIR_DOMAIN_DEVICE_REDIRDEV:
> + case VIR_DOMAIN_DEVICE_SMARTCARD:
> + case VIR_DOMAIN_DEVICE_MEMBALLOON:
> + case VIR_DOMAIN_DEVICE_NVRAM:
> + case VIR_DOMAIN_DEVICE_RNG:
> + case VIR_DOMAIN_DEVICE_SHMEM:
> + case VIR_DOMAIN_DEVICE_TPM:
> + case VIR_DOMAIN_DEVICE_PANIC:
> + case VIR_DOMAIN_DEVICE_MEMORY:
> + case VIR_DOMAIN_DEVICE_IOMMU:
> + case VIR_DOMAIN_DEVICE_VSOCK:
> + break;
> +
> + case VIR_DOMAIN_DEVICE_NONE:
> + case VIR_DOMAIN_DEVICE_LAST:
Missing 'default' case.
> + virReportEnumRangeError(virDomainDeviceType, device->type);
> + return false;
> + }
Add an empty line here.
> + return true;
> +}
[...]
> +static int
> +qemuDomainFillDevicePCIExtensionFlagsIter(virDomainDefPtr def ATTRIBUTE_UNUSED,
> + virDomainDeviceDefPtr dev,
> + virDomainDeviceInfoPtr info,
> + void *opaque)
> +{
> + virQEMUCapsPtr qemuCaps = opaque;
> +
> + info->pciAddressExtFlags
> + = qemuDomainDeviceCalculatePCIAddressExtensionFlags(qemuCaps, dev);
Add an empty line here.
> + return 0;
> +}
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
--
Andrea Bolognani / Red Hat / Virtualization
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Andrea Bolognani <abologna@redhat.com> [2018-08-16, 04:44PM +0200]:
> On Tue, 2018-08-07 at 17:10 +0800, Yi Min Zhao wrote:
> [...]
> > +qemuDomainDeviceSupportZPCI(virDomainDeviceDefPtr device)
> > +{
> > + switch ((virDomainDeviceType) device->type) {
> > + case VIR_DOMAIN_DEVICE_CHR:
> > + return false;
> > +
> > + case VIR_DOMAIN_DEVICE_CONTROLLER:
> > + case VIR_DOMAIN_DEVICE_DISK:
> > + case VIR_DOMAIN_DEVICE_LEASE:
> > + case VIR_DOMAIN_DEVICE_FS:
> > + case VIR_DOMAIN_DEVICE_NET:
> > + case VIR_DOMAIN_DEVICE_INPUT:
> > + case VIR_DOMAIN_DEVICE_SOUND:
> > + case VIR_DOMAIN_DEVICE_VIDEO:
> > + case VIR_DOMAIN_DEVICE_HOSTDEV:
> > + case VIR_DOMAIN_DEVICE_WATCHDOG:
> > + case VIR_DOMAIN_DEVICE_GRAPHICS:
> > + case VIR_DOMAIN_DEVICE_HUB:
> > + case VIR_DOMAIN_DEVICE_REDIRDEV:
> > + case VIR_DOMAIN_DEVICE_SMARTCARD:
> > + case VIR_DOMAIN_DEVICE_MEMBALLOON:
> > + case VIR_DOMAIN_DEVICE_NVRAM:
> > + case VIR_DOMAIN_DEVICE_RNG:
> > + case VIR_DOMAIN_DEVICE_SHMEM:
> > + case VIR_DOMAIN_DEVICE_TPM:
> > + case VIR_DOMAIN_DEVICE_PANIC:
> > + case VIR_DOMAIN_DEVICE_MEMORY:
> > + case VIR_DOMAIN_DEVICE_IOMMU:
> > + case VIR_DOMAIN_DEVICE_VSOCK:
> > + break;
> > +
> > + case VIR_DOMAIN_DEVICE_NONE:
> > + case VIR_DOMAIN_DEVICE_LAST:
>
> Missing 'default' case.
I thought we explicitly don't want a default case so that the compiler
can catch this is another enum entry is added?
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Fri, 2018-08-17 at 06:41 +0200, Bjoern Walk wrote: > Andrea Bolognani <abologna@redhat.com> [2018-08-16, 04:44PM +0200]: > > On Tue, 2018-08-07 at 17:10 +0800, Yi Min Zhao wrote: > > > + case VIR_DOMAIN_DEVICE_NONE: > > > + case VIR_DOMAIN_DEVICE_LAST: > > > > Missing 'default' case. > > I thought we explicitly don't want a default case so that the compiler > can catch this is another enum entry is added? The compiler can still catch that even when the 'default' case is present, and having it will catch cases when a random number has been assigned to the variable. We added 'default' cases to all switch statements a while back. -- Andrea Bolognani / Red Hat / Virtualization -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
在 2018/8/16 下午10:44, Andrea Bolognani 写道:
> On Tue, 2018-08-07 at 17:10 +0800, Yi Min Zhao wrote:
> [...]
>> +qemuDomainDeviceSupportZPCI(virDomainDeviceDefPtr device)
>> +{
>> + switch ((virDomainDeviceType) device->type) {
>> + case VIR_DOMAIN_DEVICE_CHR:
>> + return false;
>> +
>> + case VIR_DOMAIN_DEVICE_CONTROLLER:
>> + case VIR_DOMAIN_DEVICE_DISK:
>> + case VIR_DOMAIN_DEVICE_LEASE:
>> + case VIR_DOMAIN_DEVICE_FS:
>> + case VIR_DOMAIN_DEVICE_NET:
>> + case VIR_DOMAIN_DEVICE_INPUT:
>> + case VIR_DOMAIN_DEVICE_SOUND:
>> + case VIR_DOMAIN_DEVICE_VIDEO:
>> + case VIR_DOMAIN_DEVICE_HOSTDEV:
>> + case VIR_DOMAIN_DEVICE_WATCHDOG:
>> + case VIR_DOMAIN_DEVICE_GRAPHICS:
>> + case VIR_DOMAIN_DEVICE_HUB:
>> + case VIR_DOMAIN_DEVICE_REDIRDEV:
>> + case VIR_DOMAIN_DEVICE_SMARTCARD:
>> + case VIR_DOMAIN_DEVICE_MEMBALLOON:
>> + case VIR_DOMAIN_DEVICE_NVRAM:
>> + case VIR_DOMAIN_DEVICE_RNG:
>> + case VIR_DOMAIN_DEVICE_SHMEM:
>> + case VIR_DOMAIN_DEVICE_TPM:
>> + case VIR_DOMAIN_DEVICE_PANIC:
>> + case VIR_DOMAIN_DEVICE_MEMORY:
>> + case VIR_DOMAIN_DEVICE_IOMMU:
>> + case VIR_DOMAIN_DEVICE_VSOCK:
>> + break;
>> +
>> + case VIR_DOMAIN_DEVICE_NONE:
>> + case VIR_DOMAIN_DEVICE_LAST:
> Missing 'default' case.
>
>> + virReportEnumRangeError(virDomainDeviceType, device->type);
>> + return false;
>> + }
> Add an empty line here.
>
>> + return true;
>> +}
> [...]
>> +static int
>> +qemuDomainFillDevicePCIExtensionFlagsIter(virDomainDefPtr def ATTRIBUTE_UNUSED,
>> + virDomainDeviceDefPtr dev,
>> + virDomainDeviceInfoPtr info,
>> + void *opaque)
>> +{
>> + virQEMUCapsPtr qemuCaps = opaque;
>> +
>> + info->pciAddressExtFlags
>> + = qemuDomainDeviceCalculatePCIAddressExtensionFlags(qemuCaps, dev);
> Add an empty line here.
>
>> + return 0;
>> +}
> Reviewed-by: Andrea Bolognani <abologna@redhat.com>
>
Thanks!
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2026 Red Hat, Inc.