Re: [libvirt] [PATCH v3 03/12] conf: Introduce a new PCI address extension flag

2018-08-20 Thread Yi Min Zhao



在 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

2018-08-17 Thread Andrea Bolognani
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

2018-08-16 Thread Bjoern Walk
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

2018-08-16 Thread 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 

-- 
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

2018-08-07 Thread Yi Min Zhao
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,
+