Re: [libvirt] [PATCH v3 03/12] conf: Introduce a new PCI address extension flag
在 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 Thanks! -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 03/12] conf: Introduce a new PCI address extension flag
On Fri, 2018-08-17 at 06:41 +0200, Bjoern Walk wrote: > Andrea Bolognani [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
Re: [libvirt] [PATCH v3 03/12] conf: Introduce a new PCI address extension flag
Andrea Bolognani [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? signature.asc Description: PGP signature -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 03/12] conf: Introduce a new PCI address extension flag
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 -- Andrea Bolognani / Red Hat / Virtualization -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v3 03/12] conf: Introduce a new PCI address extension flag
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 Reviewed-by: Boris Fiuczynski Reviewed-by: Ján Tomko --- 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, +