[libvirt] [PATCH v4 00/12] PCI passthrough support on s390

Abstract ======== The PCI representation in QEMU has recently been extended for S390 allowing configuration of zPCI attributes like uid (user-defined identifier) and fid (PCI function identifier). The details can be found here: https://lists.gnu.org/archive/html/qemu-devel/2016-06/msg07262.html To support the new zPCI feature of the S390 platform, two new XML attributes, @uid and @fid, are introduced for device addresses of type 'pci', i.e.: <hostdev mode='subsystem' type='pci'> <driver name='vfio'/> <source> <address domain='0x0001' bus='0x00' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' uid='0x0003' fid='0x00000027'/> </hostdev> uid and fid are optional attributes. If they are defined by the user, unique values within the guest domain must be used. If they are not specified and the architecture requires them, they are automatically generated with non-conflicting values. Current implementation is the most seamless one for the user as it unites the address specific data of a PCI device on one XML element. It could accommodate both specifying our special parameters (uid and fid) and re-using standard statements (domain, bus, slot and function) for PCI devices. User can still specify bus/slot/function for the virtualized PCI devices in the XML. Thus uid/fid act as an extension to the PCI address and are stored in a new structure 'virZPCIDeviceAddress' which is a member of common PCI Address structure. Additionally, two hashtables are used for assignment and reservation of uid/fid. In support of extending the PCI address, a new PCI address extension flag is introduced. This extension flag allows is not only dedicated for the S390 platform but also other architectures needing certain extensions to PCI address space. Code Base ========= commit in master: 3b89e1f962 docs: api_extension: Don't encourage other tools than git Change Log ========== v3->v4: 1. Update docs. 2. Format code style. 3. Optimize zPCI support check. 4. Move the check of zPCI defined in xml but unsupported by Qemu to qemuDomainDeviceDefValidate(). 5. Change zpci address member of PCI address struct from pointer to instance. 6. Modify zpci address definition principle. Currently the user must either define both of uid and fid or not. v2->v3: 1. Revise code style. 2. Update test cases. 3. Introduce qemuDomainCollectPCIAddressExtension() to collect PCI extension addresses. 4. Introduce virDeviceInfoPCIAddressExtensionPresent() to check if zPCI address exists. 5. Optimize zPCI address check logic. 6. Optimize passed parameters of zPCI addr alloc/release/reserve functions. 7. Report enum range error in qemuDomainDeviceSupportZPCI(). 8. Update commit messages. v1->v2: 1. Separate test commit and merge testcases into corresponding commits that introduce the functionalities firstly. 2. Spare some checks for zpci device. 3. Add vsock and controller support. 4. Add uin32 type schema. 5. Rename zpciuid and zpcifid to zpci_uid and zpci_fid. 6. Always return multibus support on S390. Yi Min Zhao (12): conf: Add definitions for 'uid' and 'fid' PCI address attributes qemu: Introduce zPCI capability conf: Introduce a new PCI address extension flag qemu: Enable PCI multi bus for S390 guests qemu: Auto add pci-root for s390/s390x guests conf: Introduce address caching for PCI extensions conf: Introduce parser, formatter for uid and fid conf: Allocate/release 'uid' and 'fid' in PCI address qemu: Generate and use zPCI device in QEMU command line qemu: Add hotpluging support for PCI devices on S390 guests docs: Add 'uid' and 'fid' information news: Update news for PCI address extension attributes cfg.mk | 1 + docs/formatdomain.html.in | 9 +- docs/news.xml | 10 + docs/schemas/basictypes.rng | 23 ++ docs/schemas/domaincommon.rng | 1 + src/conf/device_conf.c | 62 ++++ src/conf/device_conf.h | 14 + src/conf/domain_addr.c | 331 +++++++++++++++++++++ src/conf/domain_addr.h | 29 ++ src/conf/domain_conf.c | 6 + src/libvirt_private.syms | 4 + src/qemu/qemu_capabilities.c | 6 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 95 ++++++ src/qemu/qemu_command.h | 2 + src/qemu/qemu_domain.c | 27 ++ src/qemu/qemu_domain_address.c | 205 ++++++++++++- src/qemu/qemu_hotplug.c | 151 +++++++++- src/util/virpci.h | 11 + tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml | 1 + tests/qemuxml2argvdata/disk-virtio-s390-zpci.args | 26 ++ tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml | 17 ++ .../hostdev-vfio-zpci-autogenerate.args | 25 ++ .../hostdev-vfio-zpci-autogenerate.xml | 18 ++ .../hostdev-vfio-zpci-boundaries.args | 29 ++ .../hostdev-vfio-zpci-boundaries.xml | 26 ++ .../hostdev-vfio-zpci-multidomain-many.args | 39 +++ .../hostdev-vfio-zpci-multidomain-many.xml | 67 +++++ tests/qemuxml2argvdata/hostdev-vfio-zpci.args | 25 ++ tests/qemuxml2argvdata/hostdev-vfio-zpci.xml | 19 ++ tests/qemuxml2argvtest.c | 20 ++ tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml | 29 ++ .../hostdev-vfio-zpci-autogenerate.xml | 30 ++ .../hostdev-vfio-zpci-boundaries.xml | 42 +++ .../hostdev-vfio-zpci-multidomain-many.xml | 79 +++++ tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml | 30 ++ tests/qemuxml2xmltest.c | 17 ++ 42 files changed, 1518 insertions(+), 14 deletions(-) create mode 100644 tests/qemuxml2argvdata/disk-virtio-s390-zpci.args create mode 100644 tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci.xml create mode 100644 tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-autogenerate.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-boundaries.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-multidomain-many.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml -- Yi Min

Add zPCI definitions in preparation of extending the PCI address with parameters uid (user-defined identifier) and fid (PCI function identifier). Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- cfg.mk | 1 + src/util/virpci.h | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/cfg.mk b/cfg.mk index 609ae869c2..1116feb299 100644 --- a/cfg.mk +++ b/cfg.mk @@ -472,6 +472,7 @@ sc_prohibit_canonicalize_file_name: # Insist on correct types for [pug]id. sc_correct_id_types: @prohibit='\<(int|long) *[pug]id\>' \ + exclude='exempt from syntax-check' \ halt='use pid_t for pid, uid_t for uid, gid_t for gid' \ $(_sc_search_regexp) diff --git a/src/util/virpci.h b/src/util/virpci.h index 2ac87694df..b7bcfa6d9f 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -37,12 +37,20 @@ typedef virPCIDeviceAddress *virPCIDeviceAddressPtr; typedef struct _virPCIDeviceList virPCIDeviceList; typedef virPCIDeviceList *virPCIDeviceListPtr; +typedef struct _virZPCIDeviceAddress virZPCIDeviceAddress; +typedef virZPCIDeviceAddress *virZPCIDeviceAddressPtr; +struct _virZPCIDeviceAddress { + unsigned int uid; /* exempt from syntax-check */ + unsigned int fid; +}; + struct _virPCIDeviceAddress { unsigned int domain; unsigned int bus; unsigned int slot; unsigned int function; int multi; /* virTristateSwitch */ + virZPCIDeviceAddress zpci; }; typedef enum { -- Yi Min

Let's introduce zPCI capability. Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Reviewed-by: Andrea Bolognani <abologna@redhat.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml | 1 + 8 files changed, 9 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index c258053834..406a62e3bf 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -508,6 +508,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, /* 315 */ "vfio-pci.display", "blockdev", + "zpci", ); @@ -1147,6 +1148,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "vhost-vsock-device", QEMU_CAPS_DEVICE_VHOST_VSOCK }, { "mch", QEMU_CAPS_DEVICE_MCH }, { "sev-guest", QEMU_CAPS_SEV_GUEST }, + { "zpci", QEMU_CAPS_DEVICE_ZPCI }, }; static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioBalloon[] = { diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index fdfbde48fe..87e1f5aa7e 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -492,6 +492,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 315 */ QEMU_CAPS_VFIO_PCI_DISPLAY, /* -device vfio-pci.display */ QEMU_CAPS_BLOCKDEV, /* -blockdev and blockdev-add are supported */ + QEMU_CAPS_DEVICE_ZPCI, /* -device zpci */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml index aa61a331b8..9bf1a1a625 100644 --- a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml @@ -118,6 +118,7 @@ <flag name='blockdev-del'/> <flag name='vhost-vsock'/> <flag name='egl-headless'/> + <flag name='zpci'/> <version>2010000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>307493</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml index 2bb4a767e4..2ba3eeced0 100644 --- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml @@ -125,6 +125,7 @@ <flag name='vhost-vsock'/> <flag name='tpm-emulator'/> <flag name='egl-headless'/> + <flag name='zpci'/> <version>2011000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>346345</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml index d1d9353f35..ccb41fa486 100644 --- a/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml @@ -133,6 +133,7 @@ <flag name='tpm-emulator'/> <flag name='egl-headless'/> <flag name='vfio-pci.display'/> + <flag name='zpci'/> <version>2012000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>375593</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml index 945afab5c4..d08b30cfd7 100644 --- a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml @@ -105,6 +105,7 @@ <flag name='nbd-tls'/> <flag name='virtual-css-bridge'/> <flag name='sdl-gl'/> + <flag name='zpci'/> <version>2007000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>220386</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml index 00549630c1..5dc736ccc4 100644 --- a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml @@ -108,6 +108,7 @@ <flag name='virtual-css-bridge'/> <flag name='sdl-gl'/> <flag name='vhost-vsock'/> + <flag name='zpci'/> <version>2007093</version> <kvmVersion>0</kvmVersion> <microcodeVersion>245800</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml index 789279e24d..cb4ce1229d 100644 --- a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml @@ -112,6 +112,7 @@ <flag name='sdl-gl'/> <flag name='blockdev-del'/> <flag name='vhost-vsock'/> + <flag name='zpci'/> <version>2009000</version> <kvmVersion>0</kvmVersion> <microcodeVersion>269219</microcodeVersion> -- Yi Min

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> Reviewed-by: Andrea Bolognani <abologna@redhat.com> --- src/conf/device_conf.h | 1 + src/conf/domain_addr.h | 5 ++ src/qemu/qemu_domain_address.c | 142 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 146 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 29a1def24c..e4642ffaf9 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -509,6 +509,64 @@ qemuDomainAssignVirtioMMIOAddresses(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: + default: + 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: * @@ -991,6 +1049,56 @@ 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 @@ -1265,6 +1373,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) @@ -2400,6 +2531,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; @@ -2435,7 +2569,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; @@ -2472,7 +2607,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 @@ -2989,6 +3125,8 @@ qemuDomainEnsurePCIAddress(virDomainObjPtr obj, qemuDomainFillDevicePCIConnectFlags(obj->def, dev, priv->qemuCaps, driver); + qemuDomainFillDevicePCIExtensionFlags(dev, priv->qemuCaps); + return virDomainPCIAddressEnsureAddr(priv->pciaddrs, info, info->pciConnectFlags); } -- Yi Min

QEMU on s390 supports PCI multibus since forever. Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Reviewed-by: Andrea Bolognani <abologna@redhat.com> --- src/qemu/qemu_capabilities.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 406a62e3bf..6df2321e28 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1790,6 +1790,10 @@ bool virQEMUCapsHasPCIMultiBus(virQEMUCapsPtr qemuCaps, return false; } + /* S390 supports PCI-multibus. */ + if (ARCH_IS_S390(def->os.arch)) + return true; + /* If ARM 'virt' supports PCI, it supports multibus. * No extra conditions here for simplicity. */ -- Yi Min

The pci-root depends on zpci capability. So autogenerate pci-root if zpci exists. Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Reviewed-by: Andrea Bolognani <abologna@redhat.com> --- src/qemu/qemu_domain.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 886e3fbb72..a6e143dc33 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3284,6 +3284,7 @@ qemuDomainDefAddDefaultDevices(virDomainDefPtr def, case VIR_ARCH_S390X: addDefaultUSB = false; addPanicDevice = true; + addPCIRoot = virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI); break; case VIR_ARCH_SPARC: -- Yi Min

This patch provides a caching mechanism for the device address extensions uid and fid on S390. For efficient sparse address allocation, we introduce two hash tables for uid/fid which hold the address set information per domain. Also in order to improve performance of searching available value, we introduce our own callbacks for the two hashtables. In this way, uid/fid is saved in hash key and hash value could be any non-NULL pointer due to no operation on hash value. That is also the reason why we don't introduce hash value free callback. Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- src/conf/domain_addr.c | 85 ++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_addr.h | 9 +++++ src/libvirt_private.syms | 1 + src/qemu/qemu_domain_address.c | 7 ++++ 4 files changed, 102 insertions(+) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 16f7ffa928..8d3e75f19a 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -27,11 +27,23 @@ #include "virlog.h" #include "virstring.h" #include "domain_addr.h" +#include "virhashcode.h" #define VIR_FROM_THIS VIR_FROM_DOMAIN VIR_LOG_INIT("conf.domain_addr"); +static void +virDomainPCIAddressSetExtensionFree(virDomainPCIAddressSetPtr addrs) +{ + if (!addrs || !addrs->zpciIds) + return; + + virHashFree(addrs->zpciIds->uids); + virHashFree(addrs->zpciIds->fids); + VIR_FREE(addrs->zpciIds); +} + virDomainPCIConnectFlags virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model) { @@ -741,6 +753,78 @@ virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, addrs->buses[addr->bus].slot[addr->slot].functions &= ~(1 << addr->function); } + +static uint32_t +virZPCIAddrCode(const void *name, + uint32_t seed) +{ + unsigned int value = *((unsigned int *)name); + return virHashCodeGen(&value, sizeof(value), seed); +} + + +static bool +virZPCIAddrEqual(const void *namea, + const void *nameb) +{ + return *((unsigned int *)namea) == *((unsigned int *)nameb); +} + + +static void * +virZPCIAddrCopy(const void *name) +{ + unsigned int *copy; + + if (VIR_ALLOC(copy) < 0) + return NULL; + + *copy = *((unsigned int *)name); + return (void *)copy; +} + + +static void +virZPCIAddrKeyFree(void *name) +{ + VIR_FREE(name); +} + + +int +virDomainPCIAddressSetExtensionAlloc(virDomainPCIAddressSetPtr addrs, + virDomainPCIAddressExtensionFlags extFlags) +{ + if (extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { + if (addrs->zpciIds) + return 0; + + if (VIR_ALLOC(addrs->zpciIds) < 0) + return -1; + + if (!(addrs->zpciIds->uids = virHashCreateFull(10, NULL, + virZPCIAddrCode, + virZPCIAddrEqual, + virZPCIAddrCopy, + virZPCIAddrKeyFree))) + goto error; + + if (!(addrs->zpciIds->fids = virHashCreateFull(10, NULL, + virZPCIAddrCode, + virZPCIAddrEqual, + virZPCIAddrCopy, + virZPCIAddrKeyFree))) + goto error; + } + + return 0; + + error: + virDomainPCIAddressSetExtensionFree(addrs); + return -1; +} + + virDomainPCIAddressSetPtr virDomainPCIAddressSetAlloc(unsigned int nbuses) { @@ -767,6 +851,7 @@ virDomainPCIAddressSetFree(virDomainPCIAddressSetPtr addrs) if (!addrs) return; + virDomainPCIAddressSetExtensionFree(addrs); VIR_FREE(addrs->buses); VIR_FREE(addrs); } diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index 5219d2f208..d1ec869da4 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -116,6 +116,11 @@ typedef struct { } virDomainPCIAddressBus; typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr; +typedef struct { + virHashTablePtr uids, fids; +} virDomainZPCIAddressIds; +typedef virDomainZPCIAddressIds *virDomainZPCIAddressIdsPtr; + struct _virDomainPCIAddressSet { virDomainPCIAddressBus *buses; size_t nbuses; @@ -125,6 +130,7 @@ struct _virDomainPCIAddressSet { bool areMultipleRootsSupported; /* If true, the guest can use the pcie-to-pci-bridge controller */ bool isPCIeToPCIBridgeSupported; + virDomainZPCIAddressIdsPtr zpciIds; }; typedef struct _virDomainPCIAddressSet virDomainPCIAddressSet; typedef virDomainPCIAddressSet *virDomainPCIAddressSetPtr; @@ -132,6 +138,9 @@ typedef virDomainPCIAddressSet *virDomainPCIAddressSetPtr; char *virDomainPCIAddressAsString(virPCIDeviceAddressPtr addr) ATTRIBUTE_NONNULL(1); +int virDomainPCIAddressSetExtensionAlloc(virDomainPCIAddressSetPtr addrs, + virDomainPCIAddressExtensionFlags extFlags); + virDomainPCIAddressSetPtr virDomainPCIAddressSetAlloc(unsigned int nbuses); void virDomainPCIAddressSetFree(virDomainPCIAddressSetPtr addrs); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 47ea35f864..0e9c02922e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -116,6 +116,7 @@ virDomainPCIAddressReserveAddr; virDomainPCIAddressReserveNextAddr; virDomainPCIAddressSetAllMulti; virDomainPCIAddressSetAlloc; +virDomainPCIAddressSetExtensionAlloc; virDomainPCIAddressSetFree; virDomainPCIAddressSlotInUse; virDomainPCIAddressValidate; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e4642ffaf9..2eea2ab77f 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -1514,6 +1514,13 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, addrs->dryRun = dryRun; + /* create zpci address set for s390 domain */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI) && + virDomainPCIAddressSetExtensionAlloc(addrs, + VIR_PCI_ADDRESS_EXTENSION_ZPCI)) { + goto error; + } + /* pSeries domains support multiple pci-root controllers */ if (qemuDomainIsPSeries(def)) addrs->areMultipleRootsSupported = true; -- Yi Min

This patch introduces new XML parser/formatter functions. Uid is 16-bit and non-zero. Fid is 32-bit. They are added as two new attributes of PCI address, and parsed/formatted along with PCI address parser/formatter. The related test is also added. Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- docs/schemas/basictypes.rng | 23 ++++++++ docs/schemas/domaincommon.rng | 1 + src/conf/device_conf.c | 62 ++++++++++++++++++++++ src/conf/device_conf.h | 6 +++ src/conf/domain_addr.c | 3 ++ src/conf/domain_conf.c | 6 +++ src/qemu/qemu_domain.c | 26 +++++++++ src/util/virpci.h | 3 ++ tests/qemuxml2argvdata/disk-virtio-s390-zpci.args | 25 +++++++++ tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml | 17 ++++++ tests/qemuxml2argvdata/hostdev-vfio-zpci.args | 23 ++++++++ tests/qemuxml2argvdata/hostdev-vfio-zpci.xml | 19 +++++++ tests/qemuxml2argvtest.c | 7 +++ tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml | 29 ++++++++++ tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml | 30 +++++++++++ tests/qemuxml2xmltest.c | 6 +++ 16 files changed, 286 insertions(+) create mode 100644 tests/qemuxml2argvdata/disk-virtio-s390-zpci.args create mode 100644 tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci.xml create mode 100644 tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng index 14a3670e5c..3defb56316 100644 --- a/docs/schemas/basictypes.rng +++ b/docs/schemas/basictypes.rng @@ -65,6 +65,17 @@ </data> </choice> </define> + <define name="uint32"> + <choice> + <data type="string"> + <param name="pattern">(0x)?[0-9a-fA-F]{1,8}</param> + </data> + <data type="unsignedInt"> + <param name="minInclusive">0</param> + <param name="maxInclusive">4294967295</param> + </data> + </choice> + </define> <define name="UUID"> <choice> @@ -111,6 +122,18 @@ </attribute> </optional> </define> + <define name="zpciaddress"> + <optional> + <attribute name="uid"> + <ref name="uint16"/> + </attribute> + </optional> + <optional> + <attribute name="fid"> + <ref name="uint32"/> + </attribute> + </optional> + </define> <!-- a 6 byte MAC address in ASCII-hex format, eg "12:34:56:78:9A:BC" --> <!-- The lowest bit of the 1st byte is the "multicast" bit. a --> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index f176538195..e74180af79 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -5219,6 +5219,7 @@ <value>pci</value> </attribute> <ref name="pciaddress"/> + <ref name="zpciaddress"/> </group> <group> <attribute name="type"> diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c index d69f94fadf..192526e95d 100644 --- a/src/conf/device_conf.c +++ b/src/conf/device_conf.c @@ -32,6 +32,65 @@ #define VIR_FROM_THIS VIR_FROM_DEVICE +static int +virZPCIDeviceAddressIsValid(virZPCIDeviceAddressPtr zpci) +{ + /* We don't need to check fid because fid covers + * all range of uint32 type. + */ + if (zpci->uid > VIR_DOMAIN_DEVICE_ZPCI_MAX_UID || + zpci->uid == 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Invalid PCI address uid='0x%x', " + "must be > 0x0 and <= 0x%x"), + zpci->uid, + VIR_DOMAIN_DEVICE_ZPCI_MAX_UID); + return 0; + } + + return 1; +} + +static int +virZPCIDeviceAddressParseXML(xmlNodePtr node, + virPCIDeviceAddressPtr addr) +{ + char *uid, *fid; + int ret = -1; + virZPCIDeviceAddress def = { 0 }; + + uid = virXMLPropString(node, "uid"); + fid = virXMLPropString(node, "fid"); + + if (uid) { + if (virStrToLong_uip(uid, NULL, 0, &def.uid) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Cannot parse <address> 'uid' attribute")); + goto cleanup; + } + } + + if (fid) { + if (virStrToLong_uip(fid, NULL, 0, &def.fid) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Cannot parse <address> 'fid' attribute")); + goto cleanup; + } + } + + if (!virZPCIDeviceAddressIsEmpty(&def) && + !virZPCIDeviceAddressIsValid(&def)) + goto cleanup; + + addr->zpci = def; + ret = 0; + + cleanup: + VIR_FREE(uid); + VIR_FREE(fid); + return ret; +} + int virDomainDeviceInfoCopy(virDomainDeviceInfoPtr dst, virDomainDeviceInfoPtr src) @@ -245,6 +304,9 @@ virPCIDeviceAddressParseXML(xmlNodePtr node, if (!virPCIDeviceAddressIsEmpty(addr) && !virPCIDeviceAddressIsValid(addr, true)) goto cleanup; + if (virZPCIDeviceAddressParseXML(node, addr) < 0) + goto cleanup; + ret = 0; cleanup: diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h index 6f926dff1d..1e787d3752 100644 --- a/src/conf/device_conf.h +++ b/src/conf/device_conf.h @@ -211,6 +211,12 @@ virDeviceInfoPCIAddressPresent(const virDomainDeviceInfo *info) !virPCIDeviceAddressIsEmpty(&info->addr.pci); } +static inline bool +virZPCIDeviceAddressIsEmpty(const virZPCIDeviceAddress *addr) +{ + return !(addr->uid || addr->fid); +} + int virPCIDeviceAddressParseXML(xmlNodePtr node, virPCIDeviceAddressPtr addr); diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 8d3e75f19a..90d8abc1f4 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -1044,6 +1044,9 @@ virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, dev->isolationGroup, function) < 0) return -1; + if (dev->pciAddressExtFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) + addr.zpci = dev->addr.pci.zpci; + if (virDomainPCIAddressReserveAddrInternal(addrs, &addr, flags, dev->isolationGroup, false) < 0) return -1; diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bde9fef914..591c85759d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -6509,6 +6509,12 @@ virDomainDeviceInfoFormat(virBufferPtr buf, info->addr.pci.slot, info->addr.pci.function); } + if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci)) { + virBufferAsprintf(buf, " uid='0x%.4x'", + info->addr.pci.zpci.uid); + virBufferAsprintf(buf, " fid='0x%.8x'", + info->addr.pci.zpci.fid); + } if (info->addr.pci.multi) { virBufferAsprintf(buf, " multifunction='%s'", virTristateSwitchTypeToString(info->addr.pci.multi)); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a6e143dc33..d437c432e3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5716,6 +5716,27 @@ qemuDomainDeviceDefValidateGraphics(const virDomainGraphicsDef *graphics, } +static int +qemuDomainZPCIAddressDefValidate(virDomainDeviceDef *dev, + virQEMUCapsPtr qemuCaps) +{ + virDomainDeviceInfoPtr info = virDomainDeviceGetInfo(dev); + + if (!info || (info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)) + return 0; + + if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", + _("This QEMU binary doesn't support zPCI.")); + return -1; + } + + return 0; +} + + static int qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def, @@ -5729,6 +5750,10 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, def->emulator))) return -1; + ret = qemuDomainZPCIAddressDefValidate((virDomainDeviceDef *)dev, qemuCaps); + if (ret < 0) + goto out; + switch ((virDomainDeviceType)dev->type) { case VIR_DOMAIN_DEVICE_NET: ret = qemuDomainDeviceDefValidateNetwork(dev->data.net); @@ -5804,6 +5829,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, break; } + out: virObjectUnref(qemuCaps); return ret; } diff --git a/src/util/virpci.h b/src/util/virpci.h index b7bcfa6d9f..e2ffe11625 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -37,6 +37,9 @@ typedef virPCIDeviceAddress *virPCIDeviceAddressPtr; typedef struct _virPCIDeviceList virPCIDeviceList; typedef virPCIDeviceList *virPCIDeviceListPtr; +# define VIR_DOMAIN_DEVICE_ZPCI_MAX_UID UINT16_MAX +# define VIR_DOMAIN_DEVICE_ZPCI_MAX_FID UINT32_MAX + typedef struct _virZPCIDeviceAddress virZPCIDeviceAddress; typedef virZPCIDeviceAddress *virZPCIDeviceAddressPtr; struct _virZPCIDeviceAddress { diff --git a/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args new file mode 100644 index 0000000000..8ac435cb3e --- /dev/null +++ b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args @@ -0,0 +1,25 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-s390x \ +-name QEMUGuest1 \ +-S \ +-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-virtio-disk0 \ +-device virtio-blk-pci,bus=pci.0,addr=0x8,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0000 diff --git a/tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml new file mode 100644 index 0000000000..7887b97b2c --- /dev/null +++ b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml @@ -0,0 +1,17 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + </os> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' uid='0x0019' fid='0x0000001f'/> + </disk> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci.args b/tests/qemuxml2argvdata/hostdev-vfio-zpci.args new file mode 100644 index 0000000000..d6b1520c47 --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci.args @@ -0,0 +1,23 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-s390x \ +-name QEMUGuest1 \ +-S \ +-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-device vfio-pci,host=00:00.0,id=hostdev0,bus=pci.0,addr=0x8 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x1 diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci.xml b/tests/qemuxml2argvdata/hostdev-vfio-zpci.xml new file mode 100644 index 0000000000..cde333e220 --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci.xml @@ -0,0 +1,19 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219100</memory> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + </os> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0000' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' uid='0x0019' fid='0x0000001f'/> + </hostdev> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 82b5b7bbea..5297dd80e0 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1058,6 +1058,10 @@ mymain(void) QEMU_CAPS_CCW, QEMU_CAPS_VIRTIO_S390); DO_TEST("disk-virtio-scsi-ccw", QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_CCW, QEMU_CAPS_VIRTIO_S390); + DO_TEST("disk-virtio-s390-zpci", + QEMU_CAPS_DEVICE_ZPCI, + QEMU_CAPS_CCW, + QEMU_CAPS_VIRTIO_S390); DO_TEST("disk-order", QEMU_CAPS_VIRTIO_BLK_SCSI); DO_TEST("disk-virtio-queues", QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES); @@ -1651,6 +1655,9 @@ mymain(void) DO_TEST_PARSE_ERROR("hostdev-mdev-display-missing-graphics", QEMU_CAPS_DEVICE_VFIO_PCI, QEMU_CAPS_VFIO_PCI_DISPLAY); + DO_TEST("hostdev-vfio-zpci", + QEMU_CAPS_DEVICE_VFIO_PCI, + QEMU_CAPS_DEVICE_ZPCI); DO_TEST("pci-rom", NONE); DO_TEST("pci-rom-disabled", NONE); DO_TEST("pci-rom-disabled-invalid", NONE); diff --git a/tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml b/tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml new file mode 100644 index 0000000000..39b5acdf3b --- /dev/null +++ b/tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml @@ -0,0 +1,29 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <disk type='block' device='disk'> + <driver name='qemu' type='raw'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' uid='0x0019' fid='0x0000001f'/> + </disk> + <controller type='pci' index='0' model='pci-root'/> + <memballoon model='virtio'> + <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml new file mode 100644 index 0000000000..1f48c44e30 --- /dev/null +++ b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml @@ -0,0 +1,30 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0000' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' uid='0x0019' fid='0x0000001f'/> + </hostdev> + <memballoon model='virtio'> + <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 43fd4e5f0f..47f3b9431b 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -379,6 +379,9 @@ mymain(void) QEMU_CAPS_VIRTIO_SCSI); DO_TEST("disk-virtio-scsi-ioeventfd", QEMU_CAPS_VIRTIO_SCSI); + DO_TEST("disk-virtio-s390-zpci", + QEMU_CAPS_DEVICE_ZPCI, + QEMU_CAPS_CCW); DO_TEST("disk-scsi-megasas", QEMU_CAPS_SCSI_MEGASAS); DO_TEST("disk-scsi-mptsas1068", @@ -460,6 +463,9 @@ mymain(void) DO_TEST("hostdev-usb-address", NONE); DO_TEST("hostdev-pci-address", NONE); DO_TEST("hostdev-vfio", NONE); + DO_TEST("hostdev-vfio-zpci", + QEMU_CAPS_DEVICE_ZPCI, + QEMU_CAPS_CCW); DO_TEST("hostdev-mdev-precreated", NONE); DO_TEST("hostdev-mdev-display", QEMU_CAPS_VFIO_PCI_DISPLAY); DO_TEST("pci-rom", NONE); -- Yi Min

在 2018/8/27 下午1:48, Yi Min Zhao 写道:
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a6e143dc33..d437c432e3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5716,6 +5716,27 @@ qemuDomainDeviceDefValidateGraphics(const virDomainGraphicsDef *graphics, }
+static int +qemuDomainZPCIAddressDefValidate(virDomainDeviceDef *dev, + virQEMUCapsPtr qemuCaps) +{ + virDomainDeviceInfoPtr info = virDomainDeviceGetInfo(dev); + + if (!info || (info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)) + return 0; + + if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci) && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ZPCI)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", + _("This QEMU binary doesn't support zPCI.")); + return -1; + } + + return 0; +} + + static int qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def, @@ -5729,6 +5750,10 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, def->emulator))) return -1;
+ ret = qemuDomainZPCIAddressDefValidate((virDomainDeviceDef *)dev, qemuCaps); + if (ret < 0) + goto out; + switch ((virDomainDeviceType)dev->type) { case VIR_DOMAIN_DEVICE_NET: ret = qemuDomainDeviceDefValidateNetwork(dev->data.net); @@ -5804,6 +5829,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, break; }
+ out: virObjectUnref(qemuCaps); return ret; } I think this should be separated into single patch. Right?

This patch adds new functions for reservation, assignment and release to handle the uid/fid. If the uid/fid is defined in the domain XML, they will be reserved directly in collecting phase. If any of them is not defined, we will find out an available value for it from zPCI address hashtable, and reserve it. For hotplug case, there might be or not zPCI definition. So allocate and reserve uid/fid for undefined case. Assign if needed and reserve uid/fid for defined case. If the user define zPCI extension address but zPCI capability doesn't exist, an error will be reported. 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 | 7 ++ src/conf/domain_addr.c | 243 +++++++++++++++++++++++++++++++++++++++++ src/conf/domain_addr.h | 15 +++ src/libvirt_private.syms | 3 + src/qemu/qemu_domain_address.c | 56 +++++++++- 5 files changed, 323 insertions(+), 1 deletion(-) diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h index 1e787d3752..8f17619f3f 100644 --- a/src/conf/device_conf.h +++ b/src/conf/device_conf.h @@ -217,6 +217,13 @@ virZPCIDeviceAddressIsEmpty(const virZPCIDeviceAddress *addr) return !(addr->uid || addr->fid); } +static inline bool +virDeviceInfoPCIAddressExtensionIsPresent(const virDomainDeviceInfo *info) +{ + return info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && + !virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci); +} + int virPCIDeviceAddressParseXML(xmlNodePtr node, virPCIDeviceAddressPtr addr); diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 90d8abc1f4..8af1943ff2 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -33,6 +33,152 @@ VIR_LOG_INIT("conf.domain_addr"); +static int +virDomainZPCIAddressReserveId(virHashTablePtr set, + unsigned int id, + const char *name) +{ + if (virHashLookup(set, &id)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("zPCI %s %u is already reserved"), + name, id); + return -1; + } + + if (virHashAddEntry(set, &id, (void*)1) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to reserve %s %u"), + name, id); + return -1; + } + + return 0; +} + + +static int +virDomainZPCIAddressReserveUid(virHashTablePtr set, + virZPCIDeviceAddressPtr addr) +{ + return virDomainZPCIAddressReserveId(set, addr->uid, "uid"); +} + + +static int +virDomainZPCIAddressReserveFid(virHashTablePtr set, + virZPCIDeviceAddressPtr addr) +{ + return virDomainZPCIAddressReserveId(set, addr->fid, "fid"); +} + + +static int +virDomainZPCIAddressAssignId(virHashTablePtr set, + unsigned int *id, + unsigned int min, + unsigned int max, + const char *name) +{ + while (virHashLookup(set, &min)) { + if (min == max) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("There is no more free %s."), + name); + return -1; + } + ++min; + } + *id = min; + + return 0; +} + + +static int +virDomainZPCIAddressAssignUid(virHashTablePtr set, + virZPCIDeviceAddressPtr addr) +{ + return virDomainZPCIAddressAssignId(set, &addr->uid, 1, + VIR_DOMAIN_DEVICE_ZPCI_MAX_UID, "uid"); +} + + +static int +virDomainZPCIAddressAssignFid(virHashTablePtr set, + virZPCIDeviceAddressPtr addr) +{ + return virDomainZPCIAddressAssignId(set, &addr->fid, 0, + VIR_DOMAIN_DEVICE_ZPCI_MAX_FID, "fid"); +} + + +static void +virDomainZPCIAddressReleaseUid(virHashTablePtr set, + virZPCIDeviceAddressPtr addr) +{ + if (virHashRemoveEntry(set, &addr->uid) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Release uid %u failed"), addr->uid); + } + + addr->uid = 0; +} + + +static void +virDomainZPCIAddressReleaseFid(virHashTablePtr set, + virZPCIDeviceAddressPtr addr) +{ + if (virHashRemoveEntry(set, &addr->fid) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Release fid %u failed"), addr->fid); + } + + addr->fid = 0; +} + + +static void +virDomainZPCIAddressReleaseIds(virDomainZPCIAddressIdsPtr zpciIds, + virZPCIDeviceAddressPtr addr) +{ + if (!zpciIds || virZPCIDeviceAddressIsEmpty(addr)) + return; + + virDomainZPCIAddressReleaseUid(zpciIds->uids, addr); + + virDomainZPCIAddressReleaseFid(zpciIds->fids, addr); +} + + +static int +virDomainZPCIAddressReserveNextUid(virHashTablePtr uids, + virZPCIDeviceAddressPtr zpci) +{ + if (virDomainZPCIAddressAssignUid(uids, zpci) < 0) + return -1; + + if (virDomainZPCIAddressReserveUid(uids, zpci) < 0) + return -1; + + return 0; +} + + +static int +virDomainZPCIAddressReserveNextFid(virHashTablePtr fids, + virZPCIDeviceAddressPtr zpci) +{ + if (virDomainZPCIAddressAssignFid(fids, zpci) < 0) + return -1; + + if (virDomainZPCIAddressReserveFid(fids, zpci) < 0) + return -1; + + return 0; +} + + static void virDomainPCIAddressSetExtensionFree(virDomainPCIAddressSetPtr addrs) { @@ -44,6 +190,91 @@ virDomainPCIAddressSetExtensionFree(virDomainPCIAddressSetPtr addrs) VIR_FREE(addrs->zpciIds); } + +static int +virDomainZPCIAddressReserveAddr(virDomainZPCIAddressIdsPtr zpciIds, + virZPCIDeviceAddressPtr addr) +{ + if (virDomainZPCIAddressReserveUid(zpciIds->uids, addr) < 0) { + return -1; + } + + if (virDomainZPCIAddressReserveFid(zpciIds->fids, addr) < 0) { + virDomainZPCIAddressReleaseUid(zpciIds->uids, addr); + return -1; + } + + return 0; +} + + +static int +virDomainZPCIAddressReserveNextAddr(virDomainZPCIAddressIdsPtr zpciIds, + virZPCIDeviceAddressPtr addr) +{ + if (virDomainZPCIAddressReserveNextUid(zpciIds->uids, addr) < 0) + return -1; + + if (virDomainZPCIAddressReserveNextFid(zpciIds->fids, addr) < 0) { + virDomainZPCIAddressReleaseUid(zpciIds->uids, addr); + return -1; + } + + return 0; +} + + +int +virDomainPCIAddressExtensionReserveAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr, + virDomainPCIAddressExtensionFlags extFlags) +{ + if (extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { + /* Reserve uid/fid to ZPCI device which has defined uid/fid + * in the domain. + */ + return virDomainZPCIAddressReserveAddr(addrs->zpciIds, &addr->zpci); + } + + return 0; +} + + +int +virDomainPCIAddressExtensionReserveNextAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr dev, + virDomainPCIAddressExtensionFlags extFlags) +{ + if ((extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) && + virZPCIDeviceAddressIsEmpty(&dev->zpci)) { + virZPCIDeviceAddress zpci = { 0 }; + + if (virDomainZPCIAddressReserveNextAddr(addrs->zpciIds, &zpci) < 0) + return -1; + + if (!addrs->dryRun) + dev->zpci = zpci; + } + + return 0; +} + +static int +virDomainPCIAddressExtensionEnsureAddr(virDomainPCIAddressSetPtr addrs, + virDomainDeviceInfoPtr dev) +{ + if (dev->pciAddressExtFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI) { + virZPCIDeviceAddressPtr zpci = &dev->addr.pci.zpci; + + if (virZPCIDeviceAddressIsEmpty(zpci)) + return virDomainZPCIAddressReserveNextAddr(addrs->zpciIds, zpci); + else + return virDomainZPCIAddressReserveAddr(addrs->zpciIds, zpci); + } + + return 0; +} + virDomainPCIConnectFlags virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model) { @@ -740,12 +971,24 @@ virDomainPCIAddressEnsureAddr(virDomainPCIAddressSetPtr addrs, ret = virDomainPCIAddressReserveNextAddr(addrs, dev, flags, -1); } + ret = virDomainPCIAddressExtensionEnsureAddr(addrs, dev); + cleanup: VIR_FREE(addrStr); return ret; } +void +virDomainPCIAddressExtensionReleaseAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr, + int extFlags) +{ + if ((extFlags & VIR_PCI_ADDRESS_EXTENSION_ZPCI)) + virDomainZPCIAddressReleaseIds(addrs->zpciIds, &addr->zpci); +} + + void virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr) diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h index d1ec869da4..a1f71f15f4 100644 --- a/src/conf/domain_addr.h +++ b/src/conf/domain_addr.h @@ -164,6 +164,16 @@ bool virDomainPCIAddressSlotInUse(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +int virDomainPCIAddressExtensionReserveAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr, + virDomainPCIAddressExtensionFlags extFlags) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + +int virDomainPCIAddressExtensionReserveNextAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr, + virDomainPCIAddressExtensionFlags extFlags) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + int virDomainPCIAddressReserveAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr, virDomainPCIConnectFlags flags, @@ -185,6 +195,11 @@ void virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs, virPCIDeviceAddressPtr addr) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +void virDomainPCIAddressExtensionReleaseAddr(virDomainPCIAddressSetPtr addrs, + virPCIDeviceAddressPtr addr, + int extFlags) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + void virDomainPCIAddressSetAllMulti(virDomainDefPtr def) ATTRIBUTE_NONNULL(1); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 0e9c02922e..f3e23d048f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -111,6 +111,9 @@ virDomainPCIAddressAsString; virDomainPCIAddressBusIsFullyReserved; virDomainPCIAddressBusSetModel; virDomainPCIAddressEnsureAddr; +virDomainPCIAddressExtensionReleaseAddr; +virDomainPCIAddressExtensionReserveAddr; +virDomainPCIAddressExtensionReserveNextAddr; virDomainPCIAddressReleaseAddr; virDomainPCIAddressReserveAddr; virDomainPCIAddressReserveNextAddr; diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 2eea2ab77f..f1afea53fe 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -1405,6 +1405,22 @@ qemuDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs, } +static int +qemuDomainAssignPCIAddressExtension(virDomainDefPtr def ATTRIBUTE_UNUSED, + virDomainDeviceDefPtr device ATTRIBUTE_UNUSED, + virDomainDeviceInfoPtr info, + void *opaque) +{ + virDomainPCIAddressSetPtr addrs = opaque; + virPCIDeviceAddressPtr addr = &info->addr.pci; + virDomainPCIAddressExtensionFlags extFlags = info->pciAddressExtFlags; + + if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) + return virDomainPCIAddressExtensionReserveNextAddr(addrs, addr, extFlags); + + return 0; +} + static int qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, virDomainDeviceDefPtr device, @@ -1498,6 +1514,29 @@ qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, return ret; } +static int +qemuDomainCollectPCIAddressExtension(virDomainDefPtr def ATTRIBUTE_UNUSED, + virDomainDeviceDefPtr device, + virDomainDeviceInfoPtr info, + void *opaque) +{ + virDomainPCIAddressSetPtr addrs = opaque; + virPCIDeviceAddressPtr addr = &info->addr.pci; + + if (!virDeviceInfoPCIAddressExtensionIsPresent(info) || + ((device->type == VIR_DOMAIN_DEVICE_HOSTDEV) && + (device->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE))) { + /* If a hostdev has a parent, its info will be a part of the + * parent, and will have its address collected during the scan + * of the parent's device type. + */ + return 0; + } + + return virDomainPCIAddressExtensionReserveAddr(addrs, addr, + info->pciAddressExtFlags); +} + static virDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, @@ -1592,6 +1631,12 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def, if (virDomainDeviceInfoIterate(def, qemuDomainCollectPCIAddress, addrs) < 0) goto error; + if (virDomainDeviceInfoIterate(def, + qemuDomainCollectPCIAddressExtension, + addrs) < 0) { + goto error; + } + return addrs; error: @@ -2595,6 +2640,9 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (qemuDomainAssignDevicePCISlots(def, qemuCaps, addrs) < 0) goto cleanup; + if (virDomainDeviceInfoIterate(def, qemuDomainAssignPCIAddressExtension, addrs) < 0) + goto cleanup; + /* Only for *new* domains with pcie-root (and no other * manually specified PCI controllers in the definition): If, * after assigning addresses/reserving slots for all devices, @@ -2689,6 +2737,9 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, if (qemuDomainAssignDevicePCISlots(def, qemuCaps, addrs) < 0) goto cleanup; + if (virDomainDeviceInfoIterate(def, qemuDomainAssignPCIAddressExtension, addrs) < 0) + goto cleanup; + /* set multi attribute for devices at function 0 of * any slot that has multiple functions in use */ @@ -3148,8 +3199,11 @@ qemuDomainReleaseDeviceAddress(virDomainObjPtr vm, if (!devstr) devstr = info->alias; - if (virDeviceInfoPCIAddressPresent(info)) + if (virDeviceInfoPCIAddressPresent(info)) { virDomainPCIAddressReleaseAddr(priv->pciaddrs, &info->addr.pci); + virDomainPCIAddressExtensionReleaseAddr(priv->pciaddrs, &info->addr.pci, + info->pciAddressExtFlags); + } if (virDomainUSBAddressRelease(priv->usbaddrs, info) < 0) VIR_WARN("Unable to release USB address on %s", NULLSTR(devstr)); -- Yi Min

在 2018/8/27 下午1:48, Yi Min Zhao 写道:
+ +static int +virDomainZPCIAddressReserveAddr(virDomainZPCIAddressIdsPtr zpciIds, + virZPCIDeviceAddressPtr addr) +{ + if (virDomainZPCIAddressReserveUid(zpciIds->uids, addr) < 0) { + return -1; + } Here, should remove curly brackets. + + if (virDomainZPCIAddressReserveFid(zpciIds->fids, addr) < 0) { + virDomainZPCIAddressReleaseUid(zpciIds->uids, addr); + return -1; + } + + return 0; +} +

Add new functions to generate zPCI command string and append it to QEMU command line. And the related tests are added. Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_command.c | 95 ++++++++++++++++++++++ src/qemu/qemu_command.h | 2 + tests/qemuxml2argvdata/disk-virtio-s390-zpci.args | 1 + .../hostdev-vfio-zpci-autogenerate.args | 25 ++++++ .../hostdev-vfio-zpci-autogenerate.xml | 18 ++++ .../hostdev-vfio-zpci-boundaries.args | 29 +++++++ .../hostdev-vfio-zpci-boundaries.xml | 26 ++++++ .../hostdev-vfio-zpci-multidomain-many.args | 39 +++++++++ .../hostdev-vfio-zpci-multidomain-many.xml | 67 +++++++++++++++ tests/qemuxml2argvdata/hostdev-vfio-zpci.args | 2 + tests/qemuxml2argvtest.c | 13 +++ .../hostdev-vfio-zpci-autogenerate.xml | 30 +++++++ .../hostdev-vfio-zpci-boundaries.xml | 42 ++++++++++ .../hostdev-vfio-zpci-multidomain-many.xml | 79 ++++++++++++++++++ tests/qemuxml2xmltest.c | 11 +++ 15 files changed, 479 insertions(+) create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-autogenerate.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-boundaries.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-multidomain-many.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index fd9e58fd5d..7c7d767655 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2155,6 +2155,50 @@ qemuBuildDiskDeviceStr(const virDomainDef *def, return NULL; } +char * +qemuBuildZPCIDevStr(virDomainDeviceInfoPtr dev) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + + virBufferAddLit(&buf, "zpci"); + virBufferAsprintf(&buf, ",uid=%u", dev->addr.pci.zpci.uid); + virBufferAsprintf(&buf, ",fid=%u", dev->addr.pci.zpci.fid); + virBufferAsprintf(&buf, ",target=%s", dev->alias); + virBufferAsprintf(&buf, ",id=zpci%u", dev->addr.pci.zpci.uid); + + if (virBufferCheckError(&buf) < 0) { + virBufferFreeAndReset(&buf); + return NULL; + } + + return virBufferContentAndReset(&buf); +} + +static int +qemuAppendZPCIDevStr(virCommandPtr cmd, + virDomainDeviceInfoPtr dev) +{ + char *devstr = NULL; + + virCommandAddArg(cmd, "-device"); + if (!(devstr = qemuBuildZPCIDevStr(dev))) + return -1; + + virCommandAddArg(cmd, devstr); + + VIR_FREE(devstr); + return 0; +} + +static int +qemuBuildExtensionCommandLine(virCommandPtr cmd, + virDomainDeviceInfoPtr dev) +{ + if (!virZPCIDeviceAddressIsEmpty(&dev->addr.pci.zpci)) + return qemuAppendZPCIDevStr(cmd, dev); + + return 0; +} static int qemuBuildFloppyCommandLineControllerOptions(virCommandPtr cmd, @@ -2391,6 +2435,9 @@ qemuBuildDiskCommandLine(virCommandPtr cmd, if (!qemuDiskBusNeedsDriveArg(disk->bus)) { if (disk->bus != VIR_DOMAIN_DISK_BUS_FDC || virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) { + if (qemuBuildExtensionCommandLine(cmd, &disk->info) < 0) + return -1; + virCommandAddArg(cmd, "-device"); if (!(optstr = qemuBuildDiskDeviceStr(def, disk, bootindex, @@ -2591,6 +2638,9 @@ qemuBuildFSDevCommandLine(virCommandPtr cmd, virCommandAddArg(cmd, optstr); VIR_FREE(optstr); + if (qemuBuildExtensionCommandLine(cmd, &fs->info) < 0) + return -1; + virCommandAddArg(cmd, "-device"); if (!(optstr = qemuBuildFSDevStr(def, fs, qemuCaps))) return -1; @@ -3075,6 +3125,10 @@ qemuBuildControllerDevCommandLine(virCommandPtr cmd, goto cleanup; if (devstr) { + if (qemuBuildExtensionCommandLine(cmd, &cont->info) < 0) { + VIR_FREE(devstr); + goto cleanup; + } virCommandAddArg(cmd, "-device"); virCommandAddArg(cmd, devstr); VIR_FREE(devstr); @@ -3878,6 +3932,9 @@ qemuBuildWatchdogCommandLine(virCommandPtr cmd, if (!def->watchdog) return 0; + if (qemuBuildExtensionCommandLine(cmd, &def->watchdog->info) < 0) + return -1; + virCommandAddArg(cmd, "-device"); optstr = qemuBuildWatchdogDevStr(def, watchdog, qemuCaps); @@ -3962,6 +4019,9 @@ qemuBuildMemballoonCommandLine(virCommandPtr cmd, if (qemuBuildVirtioOptionsStr(&buf, def->memballoon->virtio, qemuCaps) < 0) goto error; + if (qemuBuildExtensionCommandLine(cmd, &def->memballoon->info) < 0) + goto error; + virCommandAddArg(cmd, "-device"); virCommandAddArgBuffer(cmd, &buf); return 0; @@ -4184,6 +4244,9 @@ qemuBuildInputCommandLine(virCommandPtr cmd, virDomainInputDefPtr input = def->inputs[i]; char *devstr = NULL; + if (qemuBuildExtensionCommandLine(cmd, &input->info) < 0) + return -1; + if (qemuBuildInputDevStr(&devstr, def, input, qemuCaps) < 0) return -1; @@ -4325,6 +4388,9 @@ qemuBuildSoundCommandLine(virCommandPtr cmd, if (sound->model == VIR_DOMAIN_SOUND_MODEL_PCSPK) { virCommandAddArgList(cmd, "-soundhw", "pcspk", NULL); } else { + if (qemuBuildExtensionCommandLine(cmd, &sound->info) < 0) + return -1; + virCommandAddArg(cmd, "-device"); if (!(str = qemuBuildSoundDevStr(def, sound, qemuCaps))) return -1; @@ -4564,6 +4630,9 @@ qemuBuildVideoCommandLine(virCommandPtr cmd, if (video->primary) { if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY)) { + if (qemuBuildExtensionCommandLine(cmd, + &def->videos[i]->info) < 0) + return -1; virCommandAddArg(cmd, "-device"); if (!(str = qemuBuildDeviceVideoStr(def, video, qemuCaps))) @@ -4576,6 +4645,9 @@ qemuBuildVideoCommandLine(virCommandPtr cmd, return -1; } } else { + if (qemuBuildExtensionCommandLine(cmd, &def->videos[i]->info) < 0) + return -1; + virCommandAddArg(cmd, "-device"); if (!(str = qemuBuildDeviceVideoStr(def, video, qemuCaps))) @@ -5447,6 +5519,10 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); } } + + if (qemuBuildExtensionCommandLine(cmd, hostdev->info) < 0) + return -1; + virCommandAddArg(cmd, "-device"); devstr = qemuBuildPCIHostdevDevStr(def, hostdev, bootIndex, configfd_name, qemuCaps); @@ -5913,6 +5989,9 @@ qemuBuildRNGCommandLine(virLogManagerPtr logManager, virCommandAddArgBuffer(cmd, &buf); /* add the device */ + if (qemuBuildExtensionCommandLine(cmd, &rng->info) < 0) + return -1; + if (!(tmp = qemuBuildRNGDevStr(def, rng, qemuCaps))) return -1; virCommandAddArgList(cmd, "-device", tmp, NULL); @@ -8383,6 +8462,9 @@ qemuBuildVhostuserCommandLine(virQEMUDriverPtr driver, virCommandAddArg(cmd, "-netdev"); virCommandAddArg(cmd, netdev); + if (qemuBuildExtensionCommandLine(cmd, &net->info) < 0) + goto cleanup; + if (!(nic = qemuBuildNicDevStr(def, net, bootindex, queues, qemuCaps))) { goto cleanup; @@ -8664,6 +8746,9 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, * New way: -netdev type=tap,id=netdev1 -device e1000,id=netdev1 */ if (qemuDomainSupportsNicdev(def, net)) { + if (qemuBuildExtensionCommandLine(cmd, &net->info) < 0) + goto cleanup; + if (!(nic = qemuBuildNicDevStr(def, net, bootindex, vhostfdSize, qemuCaps))) goto cleanup; @@ -9084,6 +9169,9 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager, switch ((virDomainShmemModel)shmem->model) { case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM: + if (qemuBuildExtensionCommandLine(cmd, &shmem->info) < 0) + return -1; + devstr = qemuBuildShmemDevLegacyStr(def, shmem, qemuCaps); break; @@ -9102,6 +9190,9 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager, ATTRIBUTE_FALLTHROUGH; case VIR_DOMAIN_SHMEM_MODEL_IVSHMEM_DOORBELL: + if (qemuBuildExtensionCommandLine(cmd, &shmem->info) < 0) + return -1; + devstr = qemuBuildShmemDevStr(def, shmem, qemuCaps); break; @@ -10274,6 +10365,10 @@ qemuBuildVsockCommandLine(virCommandPtr cmd, virCommandPassFD(cmd, priv->vhostfd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); priv->vhostfd = -1; + + if (qemuBuildExtensionCommandLine(cmd, &vsock->info) < 0) + goto cleanup; + virCommandAddArgList(cmd, "-device", devstr, NULL); ret = 0; diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 98d4ac90b5..d382cd592a 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -174,6 +174,8 @@ char *qemuBuildRedirdevDevStr(const virDomainDef *def, virDomainRedirdevDefPtr dev, virQEMUCapsPtr qemuCaps); +char *qemuBuildZPCIDevStr(virDomainDeviceInfoPtr dev); + int qemuNetworkPrepareDevices(virDomainDefPtr def); int qemuGetDriveSourceString(virStorageSourcePtr src, diff --git a/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args index 8ac435cb3e..3daa8316b6 100644 --- a/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args +++ b/tests/qemuxml2argvdata/disk-virtio-s390-zpci.args @@ -20,6 +20,7 @@ server,nowait \ -rtc base=utc \ -no-shutdown \ -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-virtio-disk0 \ +-device zpci,uid=25,fid=31,target=virtio-disk0,id=zpci25 \ -device virtio-blk-pci,bus=pci.0,addr=0x8,drive=drive-virtio-disk0,\ id=virtio-disk0,bootindex=1 \ -device virtio-balloon-ccw,id=balloon0,devno=fe.0.0000 diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.args b/tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.args new file mode 100644 index 0000000000..4309cdf2be --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.args @@ -0,0 +1,25 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-s390x \ +-name QEMUGuest1 \ +-S \ +-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-device zpci,uid=1,fid=0,target=hostdev0,id=zpci1 \ +-device vfio-pci,host=00:00.0,id=hostdev0,bus=pci.0,addr=0x1 \ +-device zpci,uid=2,fid=1,target=balloon0,id=zpci2 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.xml b/tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.xml new file mode 100644 index 0000000000..36161006ab --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.xml @@ -0,0 +1,18 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219100</memory> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + </os> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0000' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci'/> + </hostdev> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.args b/tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.args new file mode 100644 index 0000000000..01b06837c8 --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.args @@ -0,0 +1,29 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-s390x \ +-name QEMUGuest1 \ +-S \ +-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-device zpci,uid=3,fid=2,target=pci.1,id=zpci3 \ +-device pci-bridge,chassis_nr=1,id=pci.1,bus=pci.0,addr=0x1 \ +-device zpci,uid=65535,fid=4294967295,target=hostdev0,id=zpci65535 \ +-device vfio-pci,host=ffff:00:00.0,id=hostdev0,bus=pci.1,addr=0x1f \ +-device zpci,uid=1,fid=0,target=hostdev1,id=zpci1 \ +-device vfio-pci,host=00:00.0,id=hostdev1,bus=pci.0,addr=0x2 \ +-device zpci,uid=2,fid=1,target=balloon0,id=zpci2 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.xml b/tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.xml new file mode 100644 index 0000000000..779eb12ac2 --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.xml @@ -0,0 +1,26 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219100</memory> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + </os> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0xffff' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x01' slot='0x1f' function='0x0' fid='0xffffffff' uid='0xffff'/> + </hostdev> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0000' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' fid='0x00000000' uid='0x0001'/> + </hostdev> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.args b/tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.args new file mode 100644 index 0000000000..60b6a2e0d2 --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.args @@ -0,0 +1,39 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-s390x \ +-name QEMUGuest1 \ +-S \ +-machine s390-ccw-virtio,accel=tcg,usb=off,dump-guest-core=off \ +-m 214 \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-device zpci,uid=35,fid=63,target=hostdev0,id=zpci35 \ +-device vfio-pci,host=0001:00:00.0,id=hostdev0,bus=pci.0,addr=0x3 \ +-device zpci,uid=53,fid=104,target=hostdev1,id=zpci53 \ +-device vfio-pci,host=0002:00:00.0,id=hostdev1,bus=pci.0,addr=0x1 \ +-device zpci,uid=1,fid=1,target=hostdev2,id=zpci1 \ +-device vfio-pci,host=0003:00:00.0,id=hostdev2,bus=pci.0,addr=0x2 \ +-device zpci,uid=2,fid=2,target=hostdev3,id=zpci2 \ +-device vfio-pci,host=0004:00:00.0,id=hostdev3,bus=pci.0,addr=0x5 \ +-device zpci,uid=83,fid=0,target=hostdev4,id=zpci83 \ +-device vfio-pci,host=0005:00:00.0,id=hostdev4,bus=pci.0,addr=0x7 \ +-device zpci,uid=3,fid=114,target=hostdev5,id=zpci3 \ +-device vfio-pci,host=0006:00:00.0,id=hostdev5,bus=pci.0,addr=0x9 \ +-device zpci,uid=23,fid=3,target=hostdev6,id=zpci23 \ +-device vfio-pci,host=0007:00:00.0,id=hostdev6,bus=pci.0,addr=0x4 \ +-device zpci,uid=4,fid=40,target=hostdev7,id=zpci4 \ +-device vfio-pci,host=0008:00:00.0,id=hostdev7,bus=pci.0,addr=0x6 \ +-device zpci,uid=5,fid=4,target=balloon0,id=zpci5 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.xml b/tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.xml new file mode 100644 index 0000000000..a6c36e1f12 --- /dev/null +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.xml @@ -0,0 +1,67 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219100</memory> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + </os> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0001' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' uid='0x0023' fid='0x0000003f'/> + </hostdev> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0002' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' uid='0x0035' fid='0x00000068'/> + </hostdev> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0003' bus='0x00' slot='0x00' function='0x0'/> + </source> + </hostdev> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0004' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </hostdev> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0005' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0' uid='0x0053'/> + </hostdev> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0006' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0' uid='0x0003' fid='0x00000072'/> + </hostdev> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0007' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' uid='0x0017' fid='0x00000003'/> + </hostdev> + <hostdev mode='subsystem' type='pci'> + <driver name='vfio'/> + <source> + <address domain='0x0008' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' uid='0x0004' fid='0x00000028'/> + </hostdev> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/hostdev-vfio-zpci.args b/tests/qemuxml2argvdata/hostdev-vfio-zpci.args index d6b1520c47..7ca4257a34 100644 --- a/tests/qemuxml2argvdata/hostdev-vfio-zpci.args +++ b/tests/qemuxml2argvdata/hostdev-vfio-zpci.args @@ -19,5 +19,7 @@ server,nowait \ -mon chardev=charmonitor,id=monitor,mode=control \ -rtc base=utc \ -no-shutdown \ +-device zpci,uid=25,fid=31,target=hostdev0,id=zpci25 \ -device vfio-pci,host=00:00.0,id=hostdev0,bus=pci.0,addr=0x8 \ +-device zpci,uid=1,fid=0,target=balloon0,id=zpci1 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x1 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5297dd80e0..2fee2e1d85 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1658,6 +1658,19 @@ mymain(void) DO_TEST("hostdev-vfio-zpci", QEMU_CAPS_DEVICE_VFIO_PCI, QEMU_CAPS_DEVICE_ZPCI); + DO_TEST("hostdev-vfio-zpci-multidomain-many", + QEMU_CAPS_DEVICE_VFIO_PCI, + QEMU_CAPS_DEVICE_PCI_BRIDGE, + QEMU_CAPS_DEVICE_ZPCI); + DO_TEST("hostdev-vfio-zpci-autogenerate", + QEMU_CAPS_DEVICE_VFIO_PCI, + QEMU_CAPS_DEVICE_ZPCI); + DO_TEST("hostdev-vfio-zpci-boundaries", + QEMU_CAPS_DEVICE_VFIO_PCI, + QEMU_CAPS_DEVICE_PCI_BRIDGE, + QEMU_CAPS_DEVICE_ZPCI); + DO_TEST_PARSE_ERROR("hostdev-vfio-zpci", + QEMU_CAPS_DEVICE_VFIO_PCI); DO_TEST("pci-rom", NONE); DO_TEST("pci-rom-disabled", NONE); DO_TEST("pci-rom-disabled-invalid", NONE); diff --git a/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-autogenerate.xml b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-autogenerate.xml new file mode 100644 index 0000000000..8647cab1fc --- /dev/null +++ b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-autogenerate.xml @@ -0,0 +1,30 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0000' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' uid='0x0001' fid='0x00000000'/> + </hostdev> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' uid='0x0002' fid='0x00000001'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-boundaries.xml b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-boundaries.xml new file mode 100644 index 0000000000..0b48c7658a --- /dev/null +++ b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-boundaries.xml @@ -0,0 +1,42 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <controller type='pci' index='1' model='pci-bridge'> + <model name='pci-bridge'/> + <target chassisNr='1'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0xffff' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x01' slot='0x1f' function='0x0' uid='0xffff' fid='0xffffffff'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0000' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' uid='0x0001' fid='0x00000000'/> + </hostdev> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' uid='0x0002' fid='0x00000001'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-multidomain-many.xml b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-multidomain-many.xml new file mode 100644 index 0000000000..2197493393 --- /dev/null +++ b/tests/qemuxml2xmloutdata/hostdev-vfio-zpci-multidomain-many.xml @@ -0,0 +1,79 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0001' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' uid='0x0023' fid='0x0000003f'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0002' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' uid='0x0035' fid='0x00000068'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0003' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' uid='0x0001' fid='0x00000001'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0004' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' uid='0x0002' fid='0x00000002'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0005' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0' uid='0x0053' fid='0x00000000'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0006' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0' uid='0x0003' fid='0x00000072'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0007' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' uid='0x0017' fid='0x00000003'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <driver name='vfio'/> + <source> + <address domain='0x0008' bus='0x00' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0' uid='0x0004' fid='0x00000028'/> + </hostdev> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' uid='0x0005' fid='0x00000004'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 47f3b9431b..96820a1f6b 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -466,6 +466,17 @@ mymain(void) DO_TEST("hostdev-vfio-zpci", QEMU_CAPS_DEVICE_ZPCI, QEMU_CAPS_CCW); + DO_TEST("hostdev-vfio-zpci-multidomain-many", + QEMU_CAPS_DEVICE_VFIO_PCI, + QEMU_CAPS_DEVICE_PCI_BRIDGE, + QEMU_CAPS_DEVICE_ZPCI); + DO_TEST("hostdev-vfio-zpci-autogenerate", + QEMU_CAPS_DEVICE_VFIO_PCI, + QEMU_CAPS_DEVICE_ZPCI); + DO_TEST("hostdev-vfio-zpci-boundaries", + QEMU_CAPS_DEVICE_VFIO_PCI, + QEMU_CAPS_DEVICE_PCI_BRIDGE, + QEMU_CAPS_DEVICE_ZPCI); DO_TEST("hostdev-mdev-precreated", NONE); DO_TEST("hostdev-mdev-display", QEMU_CAPS_VFIO_PCI_DISPLAY); DO_TEST("pci-rom", NONE); -- Yi Min

This commit adds hotplug support for PCI devices on S390 guests. There's no need to implement hot unplug for zPCI as QEMU implements an unplug callback which will unplug both PCI and zPCI device in a cascaded way. Currently, the following PCI devices are supported: virtio-blk-pci virtio-net-pci virtio-rng-pci virtio-input-host-pci virtio-keyboard-pci virtio-mouse-pci virtio-tablet-pci vfio-pci SCSIVhost device Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Bjoern Walk <bwalk@linux.vnet.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_hotplug.c | 151 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 141 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 0b84a503bb..594e43304a 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -154,6 +154,70 @@ qemuHotplugPrepareDiskAccess(virQEMUDriverPtr driver, } +static int +qemuDomainAttachZPCIDevice(qemuMonitorPtr mon, + virDomainDeviceInfoPtr info) +{ + int ret = -1; + char *devstr_zpci = NULL; + + if (!(devstr_zpci = qemuBuildZPCIDevStr(info))) + goto cleanup; + + if (qemuMonitorAddDevice(mon, devstr_zpci) < 0) + goto cleanup; + + ret = 0; + + cleanup: + VIR_FREE(devstr_zpci); + return ret; +} + + +static int +qemuDomainDetachZPCIDevice(qemuMonitorPtr mon, + virDomainDeviceInfoPtr info) +{ + char *zpciAlias = NULL; + int ret = -1; + + if (virAsprintf(&zpciAlias, "zpci%d", info->addr.pci.zpci.uid) < 0) + goto cleanup; + + if (qemuMonitorDelDevice(mon, zpciAlias) < 0) + goto cleanup; + + ret = 0; + + cleanup: + VIR_FREE(zpciAlias); + return ret; +} + + +static int +qemuDomainAttachExtensionDevice(qemuMonitorPtr mon, + virDomainDeviceInfoPtr info) +{ + if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci)) + return qemuDomainAttachZPCIDevice(mon, info); + + return 0; +} + + +static int +qemuDomainDetachExtensionDevice(qemuMonitorPtr mon, + virDomainDeviceInfoPtr info) +{ + if (!virZPCIDeviceAddressIsEmpty(&info->addr.pci.zpci)) + return qemuDomainDetachZPCIDevice(mon, info); + + return 0; +} + + static int qemuHotplugWaitForTrayEject(virDomainObjPtr vm, virDomainDiskDefPtr disk) @@ -805,8 +869,13 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, if (qemuHotplugDiskSourceAttach(priv->mon, diskdata) < 0) goto exit_monitor; - if (qemuMonitorAddDevice(priv->mon, devstr) < 0) + if (qemuDomainAttachExtensionDevice(priv->mon, &disk->info) < 0) + goto exit_monitor; + + if (qemuMonitorAddDevice(priv->mon, devstr) < 0) { + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &disk->info)); goto exit_monitor; + } if (qemuDomainObjExitMonitor(driver, vm) < 0) { ret = -2; @@ -913,7 +982,15 @@ int qemuDomainAttachControllerDevice(virQEMUDriverPtr driver, goto cleanup; qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorAddDevice(priv->mon, devstr); + + if (qemuDomainAttachExtensionDevice(priv->mon, &controller->info) < 0) { + ignore_value(qemuDomainObjExitMonitor(driver, vm)); + goto cleanup; + } + + if ((ret = qemuMonitorAddDevice(priv->mon, devstr)) < 0) + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &controller->info)); + if (qemuDomainObjExitMonitor(driver, vm) < 0) { releaseaddr = false; ret = -1; @@ -1377,7 +1454,8 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, goto cleanup; } - if (qemuDomainIsS390CCW(vm->def) && + if (net->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && + qemuDomainIsS390CCW(vm->def) && virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CCW)) { net->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW; if (!(ccwaddrs = virDomainCCWAddressSetCreateFromDomain(vm->def))) @@ -1447,7 +1525,15 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, goto try_remove; qemuDomainObjEnterMonitor(driver, vm); + + if (qemuDomainAttachExtensionDevice(priv->mon, &net->info) < 0) { + ignore_value(qemuDomainObjExitMonitor(driver, vm)); + virDomainAuditNet(vm, NULL, net, "attach", false); + goto try_remove; + } + if (qemuMonitorAddDevice(priv->mon, nicstr) < 0) { + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &net->info)); ignore_value(qemuDomainObjExitMonitor(driver, vm)); virDomainAuditNet(vm, NULL, net, "attach", false); goto try_remove; @@ -1665,8 +1751,15 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver, goto error; qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr, - configfd, configfd_name); + + if ((ret = qemuDomainAttachExtensionDevice(priv->mon, hostdev->info)) < 0) + goto exit_monitor; + + if ((ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr, + configfd, configfd_name)) < 0) + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, hostdev->info)); + + exit_monitor: if (qemuDomainObjExitMonitor(driver, vm) < 0) goto error; @@ -2322,8 +2415,13 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, if (qemuMonitorAddObject(priv->mon, &props, &objAlias) < 0) goto exit_monitor; - if (qemuMonitorAddDevice(priv->mon, devstr) < 0) + if (qemuDomainAttachExtensionDevice(priv->mon, &rng->info) < 0) + goto exit_monitor; + + if (qemuMonitorAddDevice(priv->mon, devstr) < 0) { + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &rng->info)); goto exit_monitor; + } if (qemuDomainObjExitMonitor(driver, vm) < 0) { releaseaddr = false; @@ -2816,8 +2914,16 @@ qemuDomainAttachSCSIVHostDevice(virQEMUDriverPtr driver, qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr, vhostfd, vhostfdName); + if ((ret = qemuDomainAttachExtensionDevice(priv->mon, hostdev->info)) < 0) + goto exit_monitor; + + if ((ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr, vhostfd, + vhostfdName)) < 0) { + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, hostdev->info)); + goto exit_monitor; + } + exit_monitor: if (qemuDomainObjExitMonitor(driver, vm) < 0 || ret < 0) goto audit; @@ -3062,9 +3168,14 @@ qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, release_backing = true; - if (qemuMonitorAddDevice(priv->mon, shmstr) < 0) + if (qemuDomainAttachExtensionDevice(priv->mon, &shmem->info) < 0) goto exit_monitor; + if (qemuMonitorAddDevice(priv->mon, shmstr) < 0) { + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &shmem->info)); + goto exit_monitor; + } + if (qemuDomainObjExitMonitor(driver, vm) < 0) { release_address = false; goto cleanup; @@ -3236,8 +3347,17 @@ qemuDomainAttachInputDevice(virQEMUDriverPtr driver, goto cleanup; qemuDomainObjEnterMonitor(driver, vm); - if (qemuMonitorAddDevice(priv->mon, devstr) < 0) + + if (input->bus == VIR_DOMAIN_INPUT_BUS_VIRTIO) { + if (qemuDomainAttachExtensionDevice(priv->mon, &input->info) < 0) + goto exit_monitor; + } + + if (qemuMonitorAddDevice(priv->mon, devstr) < 0) { + if (input->bus == VIR_DOMAIN_INPUT_BUS_VIRTIO) + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &input->info)); goto exit_monitor; + } if (qemuDomainObjExitMonitor(driver, vm) < 0) { releaseaddr = false; @@ -3315,9 +3435,15 @@ qemuDomainAttachVsockDevice(virQEMUDriverPtr driver, goto cleanup; qemuDomainObjEnterMonitor(driver, vm); - if (qemuMonitorAddDeviceWithFd(priv->mon, devstr, vsockPriv->vhostfd, fdname) < 0) + + if (qemuDomainAttachExtensionDevice(priv->mon, &vsock->info) < 0) goto exit_monitor; + if (qemuMonitorAddDeviceWithFd(priv->mon, devstr, vsockPriv->vhostfd, fdname) < 0) { + ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &vsock->info)); + goto exit_monitor; + } + if (qemuDomainObjExitMonitor(driver, vm) < 0) { releaseaddr = false; goto cleanup; @@ -5286,6 +5412,11 @@ int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver, qemuDomainMarkDeviceForRemoval(vm, &detach->info); qemuDomainObjEnterMonitor(driver, vm); + if (detach->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && + qemuDomainDetachExtensionDevice(priv->mon, &detach->info)) { + ignore_value(qemuDomainObjExitMonitor(driver, vm)); + goto cleanup; + } if (qemuMonitorDelDevice(priv->mon, detach->info.alias)) { ignore_value(qemuDomainObjExitMonitor(driver, vm)); goto cleanup; -- Yi Min

Update 'Device address' section to describe the 'uid' and 'fid' attributes. Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Reviewed-by: Andrea Bolognani <abologna@redhat.com> --- docs/formatdomain.html.in | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 0cbf570a13..50881a9ff7 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3921,7 +3921,14 @@ (<span class="since">since 0.9.7, requires QEMU 0.13</span>). <code>multifunction</code> defaults to 'off', but should be set to 'on' for function 0 of a slot that will - have multiple functions used.<br/> + have multiple functions used. (<span class="since">Since 4.7.0 + </span>), PCI address extensions depending on the architecture + are supported. E.g. for S390 guests, PCI addresses have + additional attributes: <code>uid</code> (a hex value between + 0x1 and 0xffff, inclusive), and <code>fid</code> (a hex value + between 0x00000000 and 0xffffffff, inclusive), which are used + by PCI devices on S390 for User-defined Identifiers and + Function Identifiers.<br/> <span class="since">Since 1.3.5</span>, some hypervisor drivers may accept an <code><address type='pci'/></code> element with no other attributes as an explicit request to -- Yi Min

Signed-off-by: Yi Min Zhao <zyimin@linux.ibm.com> Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com> Reviewed-by: Stefan Zimmermann <stzi@linux.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- docs/news.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/news.xml b/docs/news.xml index 2b6d08dc02..a3f5afba11 100644 --- a/docs/news.xml +++ b/docs/news.xml @@ -61,6 +61,16 @@ riscv32 and riscv64 guest architectures are now supported. </description> </change> + <change> + <summary> + qemu: Added support for PCI device passthrough on S390 + </summary> + <description> + PCI addresses can now include the new uid (user-defined identifier) + and fid (PCI function identifier) attributes, which make the + corresponding devices usable by S390 guests. + </description> + </change> </section> <section title="Improvements"> <change> -- Yi Min

Hi, This series was run against 'syntax-check' test by patchew.org, which failed, please find the details below: Type: series Message-id: 20180827054813.68439-1-zyimin@linux.ibm.com Subject: [libvirt] [PATCH v4 00/12] PCI passthrough support on s390 === TEST SCRIPT BEGIN === #!/bin/bash # Testing script will be invoked under the git checkout with # HEAD pointing to a commit that has the patches applied on top of "base" # branch time bash -c './autogen.sh && make syntax-check' === TEST SCRIPT END === Updating bcb55ab053bc79561b55d0394490f4b64e0f2d01 >From https://github.com/patchew-project/libvirt * [new tag] patchew/20180827054813.68439-1-zyimin@linux.ibm.com -> patchew/20180827054813.68439-1-zyimin@linux.ibm.com Switched to a new branch 'test' fdb4f1fcde news: Update news for PCI address extension attributes 82c22fc18d docs: Add 'uid' and 'fid' information dab44ebae7 qemu: Add hotpluging support for PCI devices on S390 guests 9eae47f2ea qemu: Generate and use zPCI device in QEMU command line 0e2b913a52 conf: Allocate/release 'uid' and 'fid' in PCI address 7934559e87 conf: Introduce parser, formatter for uid and fid b40bca6c8b conf: Introduce address caching for PCI extensions cb2e1e3aa8 qemu: Auto add pci-root for s390/s390x guests 887f2c9750 qemu: Enable PCI multi bus for S390 guests 8a10535299 conf: Introduce a new PCI address extension flag 5b809e3f52 qemu: Introduce zPCI capability 271099959e conf: Add definitions for 'uid' and 'fid' PCI address attributes === OUTPUT BEGIN === Updating submodules... Submodule 'gnulib' (https://git.savannah.gnu.org/git/gnulib.git/) registered for path '.gnulib' Submodule 'keycodemapdb' (https://gitlab.com/keycodemap/keycodemapdb.git) registered for path 'src/keycodemapdb' Cloning into '/var/tmp/patchew-tester-tmp-rvz3l73s/src/.gnulib'... Cloning into '/var/tmp/patchew-tester-tmp-rvz3l73s/src/src/keycodemapdb'... Submodule path '.gnulib': checked out '68df637b5f1b5c10370f6981d2a43a5cf74368df' Submodule path 'src/keycodemapdb': checked out '16e5b0787687d8904dad2c026107409eb9bfcb95' Running bootstrap... ./bootstrap: Bootstrapping from checked-out libvirt sources... ./bootstrap: consider installing git-merge-changelog from gnulib ./bootstrap: getting gnulib files... running: libtoolize --install --copy libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'build-aux'. libtoolize: copying file 'build-aux/config.guess' libtoolize: copying file 'build-aux/config.sub' libtoolize: copying file 'build-aux/install-sh' libtoolize: copying file 'build-aux/ltmain.sh' libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'. libtoolize: copying file 'm4/libtool.m4' libtoolize: copying file 'm4/ltoptions.m4' libtoolize: copying file 'm4/ltsugar.m4' libtoolize: copying file 'm4/ltversion.m4' libtoolize: copying file 'm4/lt~obsolete.m4' ./bootstrap: .gnulib/gnulib-tool --no-changelog --aux-dir=build-aux --doc-base=doc --lib=libgnu --m4-base=m4/ --source-base=gnulib/lib/ --tests-base=gnulib/tests --local-dir=gnulib/local --lgpl=2 --with-tests --makefile-name=gnulib.mk --avoid=pt_chown --avoid=lock-tests --libtool --import ... Module list with included dependencies (indented): absolute-header accept accept-tests alloca alloca-opt alloca-opt-tests allocator areadlink areadlink-tests arpa_inet arpa_inet-tests assure autobuild base64 base64-tests binary-io binary-io-tests bind bind-tests bitrotate bitrotate-tests btowc btowc-tests builtin-expect byteswap byteswap-tests c-ctype c-ctype-tests c-strcase c-strcase-tests c-strcasestr c-strcasestr-tests calloc-posix canonicalize-lgpl canonicalize-lgpl-tests careadlinkat chown chown-tests clock-time cloexec cloexec-tests close close-tests configmake connect connect-tests count-leading-zeros count-leading-zeros-tests count-one-bits count-one-bits-tests ctype ctype-tests dirname-lgpl dosname double-slash-root dup dup-tests dup2 dup2-tests environ environ-tests errno errno-tests error execinfo exitfail extensions extern-inline fatal-signal fclose fclose-tests fcntl fcntl-h fcntl-h-tests fcntl-tests fd-hook fdatasync fdatasync-tests fdopen fdopen-tests fflush fflush-tests ffs ffs-tests ffsl ffsl-tests fgetc-tests filename flexmember float float-tests fnmatch fnmatch-tests fpieee fpucw fpurge fpurge-tests fputc-tests fread-tests freading freading-tests fseek fseek-tests fseeko fseeko-tests fstat fstat-tests fsync fsync-tests ftell ftell-tests ftello ftello-tests ftruncate ftruncate-tests func func-tests fwrite-tests getaddrinfo getaddrinfo-tests getcwd-lgpl getcwd-lgpl-tests getdelim getdelim-tests getdtablesize getdtablesize-tests getgroups getgroups-tests gethostname gethostname-tests getline getline-tests getopt-posix getopt-posix-tests getpagesize getpass getpeername getpeername-tests getprogname getprogname-tests getsockname getsockname-tests getsockopt getsockopt-tests gettext-h gettimeofday gettimeofday-tests getugroups gitlog-to-changelog gnumakefile grantpt grantpt-tests hard-locale havelib host-cpu-c-abi hostent ignore-value ignore-value-tests include_next inet_ntop inet_ntop-tests inet_pton inet_pton-tests intprops intprops-tests inttypes inttypes-incomplete inttypes-tests ioctl ioctl-tests isatty isatty-tests isblank isblank-tests isnand-nolibm isnand-nolibm-tests isnanf-nolibm isnanf-nolibm-tests isnanl-nolibm isnanl-nolibm-tests langinfo langinfo-tests largefile ldexp ldexp-tests limits-h limits-h-tests listen listen-tests localcharset localcharset-tests locale locale-tests localeconv localeconv-tests localename localename-tests localtime-buffer lock lseek lseek-tests lstat lstat-tests maintainer-makefile malloc-posix malloca malloca-tests manywarnings math math-tests mbrtowc mbrtowc-tests mbsinit mbsinit-tests mbsrtowcs mbsrtowcs-tests mbtowc memchr memchr-tests mgetgroups mkdtemp mkostemp mkostemps mktempd mktime mktime-internal msvc-inval msvc-nothrow multiarch nanosleep nanosleep-tests net_if net_if-tests netdb netdb-tests netinet_in netinet_in-tests nl_langinfo nl_langinfo-tests nocrash nonblocking nonblocking-pipe-tests nonblocking-socket-tests nonblocking-tests open open-tests openpty openpty-tests passfd passfd-tests pathmax pathmax-tests perror perror-tests physmem pipe-posix pipe-posix-tests pipe2 pipe2-tests poll poll-h poll-h-tests poll-tests posix-shell posix_openpt posix_openpt-tests posix_spawn-internal posix_spawn_file_actions_addclose posix_spawn_file_actions_addclose-tests posix_spawn_file_actions_adddup2 posix_spawn_file_actions_adddup2-tests posix_spawn_file_actions_addopen posix_spawn_file_actions_addopen-tests posix_spawn_file_actions_destroy posix_spawn_file_actions_init posix_spawnattr_destroy posix_spawnattr_init posix_spawnattr_setflags posix_spawnattr_setsigmask posix_spawnp posix_spawnp-tests pthread pthread_sigmask pthread_sigmask-tests ptsname ptsname-tests ptsname_r ptsname_r-tests pty pty-tests putenv raise raise-tests rawmemchr rawmemchr-tests read read-tests readlink readlink-tests realloc-posix recv recv-tests regex regex-tests same-inode sched sched-tests secure_getenv select select-tests send send-tests servent setenv setenv-tests setlocale setlocale-tests setsockopt setsockopt-tests sigaction sigaction-tests signal-h signal-h-tests signbit signbit-tests sigpipe sigpipe-tests sigprocmask sigprocmask-tests size_max sleep sleep-tests snippet/_Noreturn snippet/arg-nonnull snippet/c++defs snippet/unused-parameter snippet/warn-on-use snprintf snprintf-tests socket socketlib sockets sockets-tests socklen spawn spawn-tests ssize_t stat stat-tests stat-time stat-time-tests stdalign stdalign-tests stdarg stdbool stdbool-tests stddef stddef-tests stdint stdint-tests stdio stdio-tests stdlib stdlib-tests stpcpy strcase strchrnul strchrnul-tests strdup-posix streq strerror strerror-override strerror-tests strerror_r-posix strerror_r-posix-tests string string-tests strings strings-tests strndup strnlen strnlen-tests strnlen1 strptime strsep strtok_r symlink symlink-tests sys_ioctl sys_ioctl-tests sys_select sys_select-tests sys_socket sys_socket-tests sys_stat sys_stat-tests sys_time sys_time-tests sys_types sys_types-tests sys_uio sys_uio-tests sys_utsname sys_utsname-tests sys_wait sys_wait-tests tempname termios termios-tests test-framework-sh test-framework-sh-tests thread thread-tests threadlib time time-tests time_r timegm ttyname_r ttyname_r-tests uname uname-tests unistd unistd-tests unlockpt unlockpt-tests unsetenv unsetenv-tests useless-if-before-free usleep usleep-tests vasnprintf vasnprintf-tests vasprintf vasprintf-tests vc-list-files vc-list-files-tests verify verify-tests vsnprintf vsnprintf-tests wait-process waitpid warnings wchar wchar-tests wcrtomb wcrtomb-tests wctob wctomb wctype-h wctype-h-tests write write-tests xalloc xalloc-die xalloc-die-tests xalloc-oversized xsize Notice from module vasprintf: If you are using GNU gettext version 0.16.1 or older, add the following options to XGETTEXT_OPTIONS in your po/Makevars: --flag=asprintf:2:c-format --flag=vasprintf:2:c-format File list: build-aux/config.rpath build-aux/gitlog-to-changelog build-aux/mktempd build-aux/useless-if-before-free build-aux/vc-list-files lib/_Noreturn.h lib/accept.c lib/alloca.c lib/alloca.in.h lib/allocator.c lib/allocator.h lib/areadlink.c lib/areadlink.h lib/arg-nonnull.h lib/arpa_inet.in.h lib/asnprintf.c lib/asprintf.c lib/assure.h lib/base64.c lib/base64.h lib/basename-lgpl.c lib/binary-io.c lib/binary-io.h lib/bind.c lib/bitrotate.c lib/bitrotate.h lib/btowc.c lib/byteswap.in.h lib/c++defs.h lib/c-ctype.c lib/c-ctype.h lib/c-strcase.h lib/c-strcasecmp.c lib/c-strcasestr.c lib/c-strcasestr.h lib/c-strncasecmp.c lib/calloc.c lib/canonicalize-lgpl.c lib/careadlinkat.c lib/careadlinkat.h lib/chown.c lib/cloexec.c lib/cloexec.h lib/close.c lib/connect.c lib/count-leading-zeros.c lib/count-leading-zeros.h lib/count-one-bits.c lib/count-one-bits.h lib/dirname-lgpl.c lib/dirname.h lib/dosname.h lib/dup2.c lib/errno.in.h lib/execinfo.c lib/execinfo.in.h lib/fchown-stub.c lib/fclose.c lib/fcntl.c lib/fcntl.in.h lib/fd-hook.c lib/fd-hook.h lib/fdatasync.c lib/fflush.c lib/ffs.c lib/ffsl.c lib/ffsl.h lib/filename.h lib/flexmember.h lib/float+.h lib/float.c lib/float.in.h lib/fnmatch.c lib/fnmatch.in.h lib/fnmatch_loop.c lib/fpurge.c lib/freading.c lib/freading.h lib/fseek.c lib/fseeko.c lib/fstat.c lib/fsync.c lib/ftell.c lib/ftello.c lib/gai_strerror.c lib/getaddrinfo.c lib/getcwd-lgpl.c lib/getdelim.c lib/getdtablesize.c lib/getgroups.c lib/gethostname.c lib/getline.c lib/getopt-cdefs.in.h lib/getopt-core.h lib/getopt-ext.h lib/getopt-pfx-core.h lib/getopt-pfx-ext.h lib/getopt.c lib/getopt.in.h lib/getopt1.c lib/getopt_int.h lib/getpass.c lib/getpass.h lib/getpeername.c lib/getsockname.c lib/gettext.h lib/gettimeofday.c lib/getugroups.c lib/getugroups.h lib/glthread/lock.c lib/glthread/lock.h lib/glthread/threadlib.c lib/hard-locale.c lib/hard-locale.h lib/ignore-value.h lib/inet_ntop.c lib/inet_pton.c lib/intprops.h lib/ioctl.c lib/isatty.c lib/itold.c lib/langinfo.in.h lib/limits.in.h lib/listen.c lib/localcharset.c lib/localcharset.h lib/locale.in.h lib/localeconv.c lib/localtime-buffer.c lib/localtime-buffer.h lib/lseek.c lib/lstat.c lib/malloc.c lib/malloca.c lib/malloca.h lib/mbrtowc.c lib/mbsinit.c lib/mbsrtowcs-impl.h lib/mbsrtowcs-state.c lib/mbsrtowcs.c lib/mbtowc-impl.h lib/mbtowc.c lib/memchr.c lib/memchr.valgrind lib/mgetgroups.c lib/mgetgroups.h lib/mkdtemp.c lib/mkostemp.c lib/mkostemps.c lib/mktime-internal.h lib/mktime.c lib/msvc-inval.c lib/msvc-inval.h lib/msvc-nothrow.c lib/msvc-nothrow.h lib/net_if.in.h lib/netdb.in.h lib/netinet_in.in.h lib/nl_langinfo.c lib/nonblocking.c lib/nonblocking.h lib/open.c lib/openpty.c lib/passfd.c lib/passfd.h lib/pathmax.h lib/perror.c lib/physmem.c lib/physmem.h lib/pipe.c lib/pipe2.c lib/poll.c lib/poll.in.h lib/posix_openpt.c lib/printf-args.c lib/printf-args.h lib/printf-parse.c lib/printf-parse.h lib/pthread.c lib/pthread.in.h lib/pthread_sigmask.c lib/pty.in.h lib/raise.c lib/rawmemchr.c lib/rawmemchr.valgrind lib/readlink.c lib/realloc.c lib/recv.c lib/regcomp.c lib/regex.c lib/regex.h lib/regex_internal.c lib/regex_internal.h lib/regexec.c lib/sched.in.h lib/secure_getenv.c lib/select.c lib/send.c lib/setenv.c lib/setsockopt.c lib/sig-handler.c lib/sig-handler.h lib/sigaction.c lib/signal.in.h lib/sigprocmask.c lib/size_max.h lib/sleep.c lib/snprintf.c lib/socket.c lib/sockets.c lib/sockets.h lib/stat-time.c lib/stat-time.h lib/stat-w32.c lib/stat-w32.h lib/stat.c lib/stdalign.in.h lib/stdarg.in.h lib/stdbool.in.h lib/stddef.in.h lib/stdint.in.h lib/stdio-impl.h lib/stdio-read.c lib/stdio-write.c lib/stdio.in.h lib/stdlib.in.h lib/stpcpy.c lib/str-two-way.h lib/strcasecmp.c lib/strchrnul.c lib/strchrnul.valgrind lib/strdup.c lib/streq.h lib/strerror-override.c lib/strerror-override.h lib/strerror.c lib/strerror_r.c lib/string.in.h lib/strings.in.h lib/stripslash.c lib/strncasecmp.c lib/strndup.c lib/strnlen.c lib/strnlen1.c lib/strnlen1.h lib/strptime.c lib/strsep.c lib/strtok_r.c lib/sys_ioctl.in.h lib/sys_select.in.h lib/sys_socket.c lib/sys_socket.in.h lib/sys_stat.in.h lib/sys_time.in.h lib/sys_types.in.h lib/sys_uio.in.h lib/sys_utsname.in.h lib/sys_wait.in.h lib/tempname.c lib/tempname.h lib/termios.in.h lib/time.in.h lib/time_r.c lib/timegm.c lib/ttyname_r.c lib/uname.c lib/unistd.c lib/unistd.in.h lib/unsetenv.c lib/unused-parameter.h lib/usleep.c lib/vasnprintf.c lib/vasnprintf.h lib/vasprintf.c lib/verify.h lib/vsnprintf.c lib/w32sock.h lib/waitpid.c lib/warn-on-use.h lib/wchar.in.h lib/wcrtomb.c lib/wctype-h.c lib/wctype.in.h lib/xalloc-oversized.h lib/xsize.c lib/xsize.h m4/00gnulib.m4 m4/absolute-header.m4 m4/alloca.m4 m4/arpa_inet_h.m4 m4/asm-underscore.m4 m4/autobuild.m4 m4/base64.m4 m4/btowc.m4 m4/builtin-expect.m4 m4/byteswap.m4 m4/calloc.m4 m4/canonicalize.m4 m4/chown.m4 m4/clock_time.m4 m4/close.m4 m4/codeset.m4 m4/configmake.m4 m4/count-leading-zeros.m4 m4/count-one-bits.m4 m4/ctype.m4 m4/dirname.m4 m4/double-slash-root.m4 m4/dup.m4 m4/dup2.m4 m4/eealloc.m4 m4/environ.m4 m4/errno_h.m4 m4/error.m4 m4/execinfo.m4 m4/exponentd.m4 m4/exponentf.m4 m4/exponentl.m4 m4/extensions.m4 m4/extern-inline.m4 m4/fatal-signal.m4 m4/fclose.m4 m4/fcntl-o.m4 m4/fcntl.m4 m4/fcntl_h.m4 m4/fdatasync.m4 m4/fdopen.m4 m4/fflush.m4 m4/ffs.m4 m4/ffsl.m4 m4/flexmember.m4 m4/float_h.m4 m4/fnmatch.m4 m4/fpieee.m4 m4/fpurge.m4 m4/freading.m4 m4/fseek.m4 m4/fseeko.m4 m4/fstat.m4 m4/fsync.m4 m4/ftell.m4 m4/ftello.m4 m4/ftruncate.m4 m4/func.m4 m4/getaddrinfo.m4 m4/getcwd.m4 m4/getdelim.m4 m4/getdtablesize.m4 m4/getgroups.m4 m4/gethostname.m4 m4/getline.m4 m4/getopt.m4 m4/getpagesize.m4 m4/getpass.m4 m4/getprogname.m4 m4/gettimeofday.m4 m4/getugroups.m4 m4/glibc21.m4 m4/gnulib-common.m4 m4/grantpt.m4 m4/host-cpu-c-abi.m4 m4/hostent.m4 m4/include_next.m4 m4/inet_ntop.m4 m4/inet_pton.m4 m4/intlmacosx.m4 m4/intmax_t.m4 m4/inttypes-pri.m4 m4/inttypes.m4 m4/inttypes_h.m4 m4/ioctl.m4 m4/isatty.m4 m4/isblank.m4 m4/isnand.m4 m4/isnanf.m4 m4/isnanl.m4 m4/langinfo_h.m4 m4/largefile.m4 m4/lcmessage.m4 m4/ldexp.m4 m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/limits-h.m4 m4/localcharset.m4 m4/locale-fr.m4 m4/locale-ja.m4 m4/locale-tr.m4 m4/locale-zh.m4 m4/locale_h.m4 m4/localeconv.m4 m4/localename.m4 m4/localtime-buffer.m4 m4/lock.m4 m4/longlong.m4 m4/lseek.m4 m4/lstat.m4 m4/malloc.m4 m4/malloca.m4 m4/manywarnings-c++.m4 m4/manywarnings.m4 m4/math_h.m4 m4/mbrtowc.m4 m4/mbsinit.m4 m4/mbsrtowcs.m4 m4/mbstate_t.m4 m4/mbtowc.m4 m4/memchr.m4 m4/mgetgroups.m4 m4/mkdtemp.m4 m4/mkostemp.m4 m4/mkostemps.m4 m4/mktime.m4 m4/mmap-anon.m4 m4/mode_t.m4 m4/msvc-inval.m4 m4/msvc-nothrow.m4 m4/multiarch.m4 m4/nanosleep.m4 m4/net_if_h.m4 m4/netdb_h.m4 m4/netinet_in_h.m4 m4/nl_langinfo.m4 m4/nocrash.m4 m4/nonblocking.m4 m4/off_t.m4 m4/onceonly.m4 m4/open-cloexec.m4 m4/open.m4 m4/passfd.m4 m4/pathmax.m4 m4/perror.m4 m4/physmem.m4 m4/pipe.m4 m4/pipe2.m4 m4/poll.m4 m4/poll_h.m4 m4/posix-shell.m4 m4/posix_openpt.m4 m4/posix_spawn.m4 m4/printf.m4 m4/pthread.m4 m4/pthread_rwlock_rdlock.m4 m4/pthread_sigmask.m4 m4/ptsname.m4 m4/ptsname_r.m4 m4/pty.m4 m4/pty_h.m4 m4/putenv.m4 m4/raise.m4 m4/rawmemchr.m4 m4/read.m4 m4/readlink.m4 m4/realloc.m4 m4/regex.m4 m4/sched_h.m4 m4/secure_getenv.m4 m4/select.m4 m4/servent.m4 m4/setenv.m4 m4/setlocale.m4 m4/sig_atomic_t.m4 m4/sigaction.m4 m4/signal_h.m4 m4/signalblocking.m4 m4/signbit.m4 m4/sigpipe.m4 m4/size_max.m4 m4/sleep.m4 m4/snprintf.m4 m4/socketlib.m4 m4/sockets.m4 m4/socklen.m4 m4/sockpfaf.m4 m4/spawn_h.m4 m4/ssize_t.m4 m4/stat-time.m4 m4/stat.m4 m4/stdalign.m4 m4/stdarg.m4 m4/stdbool.m4 m4/stddef_h.m4 m4/stdint.m4 m4/stdint_h.m4 m4/stdio_h.m4 m4/stdlib_h.m4 m4/stpcpy.m4 m4/strcase.m4 m4/strchrnul.m4 m4/strdup.m4 m4/strerror.m4 m4/strerror_r.m4 m4/string_h.m4 m4/strings_h.m4 m4/strndup.m4 m4/strnlen.m4 m4/strptime.m4 m4/strsep.m4 m4/strtok_r.m4 m4/symlink.m4 m4/sys_ioctl_h.m4 m4/sys_select_h.m4 m4/sys_socket_h.m4 m4/sys_stat_h.m4 m4/sys_time_h.m4 m4/sys_types_h.m4 m4/sys_uio_h.m4 m4/sys_utsname_h.m4 m4/sys_wait_h.m4 m4/tempname.m4 m4/termios_h.m4 m4/thread.m4 m4/threadlib.m4 m4/time_h.m4 m4/time_r.m4 m4/timegm.m4 m4/tm_gmtoff.m4 m4/ttyname_r.m4 m4/uname.m4 m4/ungetc.m4 m4/unistd_h.m4 m4/unlockpt.m4 m4/usleep.m4 m4/vasnprintf.m4 m4/vasprintf.m4 m4/vsnprintf.m4 m4/wait-process.m4 m4/waitpid.m4 m4/warn-on-use.m4 m4/warnings.m4 m4/wchar_h.m4 m4/wchar_t.m4 m4/wcrtomb.m4 m4/wctob.m4 m4/wctomb.m4 m4/wctype_h.m4 m4/wint_t.m4 m4/write.m4 m4/xalloc.m4 m4/xsize.m4 tests/infinity.h tests/init.sh tests/macros.h tests/minus-zero.h tests/nan.h tests/nap.h tests/null-ptr.h tests/randomd.c tests/signature.h tests/socket-client.h tests/socket-server.h tests/test-accept.c tests/test-alloca-opt.c tests/test-areadlink.c tests/test-areadlink.h tests/test-arpa_inet.c tests/test-base64.c tests/test-binary-io.c tests/test-binary-io.sh tests/test-bind.c tests/test-bitrotate.c tests/test-btowc.c tests/test-btowc1.sh tests/test-btowc2.sh tests/test-byteswap.c tests/test-c-ctype.c tests/test-c-strcase.sh tests/test-c-strcasecmp.c tests/test-c-strcasestr.c tests/test-c-strncasecmp.c tests/test-canonicalize-lgpl.c tests/test-chown.c tests/test-chown.h tests/test-cloexec.c tests/test-close.c tests/test-connect.c tests/test-count-leading-zeros.c tests/test-count-one-bits.c tests/test-ctype.c tests/test-dup.c tests/test-dup2.c tests/test-environ.c tests/test-errno.c tests/test-fclose.c tests/test-fcntl-h.c tests/test-fcntl.c tests/test-fdatasync.c tests/test-fdopen.c tests/test-fflush.c tests/test-fflush2.c tests/test-fflush2.sh tests/test-ffs.c tests/test-ffsl.c tests/test-fgetc.c tests/test-float.c tests/test-fnmatch.c tests/test-fpurge.c tests/test-fputc.c tests/test-fread.c tests/test-freading.c tests/test-fseek.c tests/test-fseek.sh tests/test-fseek2.sh tests/test-fseeko.c tests/test-fseeko.sh tests/test-fseeko2.sh tests/test-fseeko3.c tests/test-fseeko3.sh tests/test-fseeko4.c tests/test-fseeko4.sh tests/test-fstat.c tests/test-fsync.c tests/test-ftell.c tests/test-ftell.sh tests/test-ftell2.sh tests/test-ftell3.c tests/test-ftello.c tests/test-ftello.sh tests/test-ftello2.sh tests/test-ftello3.c tests/test-ftello4.c tests/test-ftello4.sh tests/test-ftruncate.c tests/test-ftruncate.sh tests/test-func.c tests/test-fwrite.c tests/test-getaddrinfo.c tests/test-getcwd-lgpl.c tests/test-getdelim.c tests/test-getdtablesize.c tests/test-getgroups.c tests/test-gethostname.c tests/test-getline.c tests/test-getopt-main.h tests/test-getopt-posix.c tests/test-getopt.h tests/test-getpeername.c tests/test-getprogname.c tests/test-getsockname.c tests/test-getsockopt.c tests/test-gettimeofday.c tests/test-grantpt.c tests/test-ignore-value.c tests/test-inet_ntop.c tests/test-inet_pton.c tests/test-init.sh tests/test-intprops.c tests/test-inttypes.c tests/test-ioctl.c tests/test-isatty.c tests/test-isblank.c tests/test-isnand-nolibm.c tests/test-isnand.h tests/test-isnanf-nolibm.c tests/test-isnanf.h tests/test-isnanl-nolibm.c tests/test-isnanl.h tests/test-langinfo.c tests/test-ldexp.c tests/test-ldexp.h tests/test-limits-h.c tests/test-listen.c tests/test-localcharset.c tests/test-locale.c tests/test-localeconv.c tests/test-localename.c tests/test-lseek.c tests/test-lseek.sh tests/test-lstat.c tests/test-lstat.h tests/test-malloca.c tests/test-math.c tests/test-mbrtowc-w32-1.sh tests/test-mbrtowc-w32-2.sh tests/test-mbrtowc-w32-3.sh tests/test-mbrtowc-w32-4.sh tests/test-mbrtowc-w32-5.sh tests/test-mbrtowc-w32.c tests/test-mbrtowc.c tests/test-mbrtowc1.sh tests/test-mbrtowc2.sh tests/test-mbrtowc3.sh tests/test-mbrtowc4.sh tests/test-mbrtowc5.sh tests/test-mbsinit.c tests/test-mbsinit.sh tests/test-mbsrtowcs.c tests/test-mbsrtowcs1.sh tests/test-mbsrtowcs2.sh tests/test-mbsrtowcs3.sh tests/test-mbsrtowcs4.sh tests/test-memchr.c tests/test-nanosleep.c tests/test-net_if.c tests/test-netdb.c tests/test-netinet_in.c tests/test-nl_langinfo.c tests/test-nl_langinfo.sh tests/test-nonblocking-misc.h tests/test-nonblocking-pipe-child.c tests/test-nonblocking-pipe-main.c tests/test-nonblocking-pipe.h tests/test-nonblocking-pipe.sh tests/test-nonblocking-reader.h tests/test-nonblocking-socket-child.c tests/test-nonblocking-socket-main.c tests/test-nonblocking-socket.h tests/test-nonblocking-socket.sh tests/test-nonblocking-writer.h tests/test-nonblocking.c tests/test-open.c tests/test-open.h tests/test-openpty.c tests/test-passfd.c tests/test-pathmax.c tests/test-perror.c tests/test-perror.sh tests/test-perror2.c tests/test-pipe.c tests/test-pipe2.c tests/test-poll-h.c tests/test-poll.c tests/test-posix_openpt.c tests/test-posix_spawn1.c tests/test-posix_spawn1.in.sh tests/test-posix_spawn2.c tests/test-posix_spawn2.in.sh tests/test-posix_spawn_file_actions_addclose.c tests/test-posix_spawn_file_actions_adddup2.c tests/test-posix_spawn_file_actions_addopen.c tests/test-pthread_sigmask1.c tests/test-pthread_sigmask2.c tests/test-ptsname.c tests/test-ptsname_r.c tests/test-raise.c tests/test-rawmemchr.c tests/test-read.c tests/test-readlink.c tests/test-readlink.h tests/test-recv.c tests/test-regex.c tests/test-sched.c tests/test-select-fd.c tests/test-select-in.sh tests/test-select-out.sh tests/test-select-stdin.c tests/test-select.c tests/test-select.h tests/test-send.c tests/test-setenv.c tests/test-setlocale1.c tests/test-setlocale1.sh tests/test-setlocale2.c tests/test-setlocale2.sh tests/test-setsockopt.c tests/test-sigaction.c tests/test-signal-h.c tests/test-signbit.c tests/test-sigpipe.c tests/test-sigpipe.sh tests/test-sigprocmask.c tests/test-sleep.c tests/test-snprintf.c tests/test-sockets.c tests/test-spawn.c tests/test-stat-time.c tests/test-stat.c tests/test-stat.h tests/test-stdalign.c tests/test-stdbool.c tests/test-stddef.c tests/test-stdint.c tests/test-stdio.c tests/test-stdlib.c tests/test-strchrnul.c tests/test-strerror.c tests/test-strerror_r.c tests/test-string.c tests/test-strings.c tests/test-strnlen.c tests/test-symlink.c tests/test-symlink.h tests/test-sys_ioctl.c tests/test-sys_select.c tests/test-sys_socket.c tests/test-sys_stat.c tests/test-sys_time.c tests/test-sys_types.c tests/test-sys_uio.c tests/test-sys_utsname.c tests/test-sys_wait.c tests/test-sys_wait.h tests/test-termios.c tests/test-thread_create.c tests/test-thread_self.c tests/test-time.c tests/test-ttyname_r.c tests/test-uname.c tests/test-unistd.c tests/test-unlockpt.c tests/test-unsetenv.c tests/test-usleep.c tests/test-vasnprintf.c tests/test-vasprintf.c tests/test-vc-list-files-cvs.sh tests/test-vc-list-files-git.sh tests/test-verify-try.c tests/test-verify.c tests/test-verify.sh tests/test-vsnprintf.c tests/test-wchar.c tests/test-wcrtomb-w32-1.sh tests/test-wcrtomb-w32-2.sh tests/test-wcrtomb-w32-3.sh tests/test-wcrtomb-w32-4.sh tests/test-wcrtomb-w32-5.sh tests/test-wcrtomb-w32.c tests/test-wcrtomb.c tests/test-wcrtomb.sh tests/test-wctype-h.c tests/test-write.c tests/test-xalloc-die.c tests/test-xalloc-die.sh tests/zerosize-ptr.h lib/_Noreturn.h -> tests/_Noreturn.h lib/arg-nonnull.h -> tests/arg-nonnull.h lib/c++defs.h -> tests/c++defs.h lib/ctype.in.h -> tests/ctype.in.h lib/dup.c -> tests/dup.c lib/error.c -> tests/error.c lib/error.h -> tests/error.h lib/exitfail.c -> tests/exitfail.c lib/exitfail.h -> tests/exitfail.h lib/fatal-signal.c -> tests/fatal-signal.c lib/fatal-signal.h -> tests/fatal-signal.h lib/fdopen.c -> tests/fdopen.c lib/float+.h -> tests/float+.h lib/fpucw.h -> tests/fpucw.h lib/ftruncate.c -> tests/ftruncate.c lib/getpagesize.c -> tests/getpagesize.c lib/getprogname.c -> tests/getprogname.c lib/getprogname.h -> tests/getprogname.h lib/getsockopt.c -> tests/getsockopt.c lib/glthread/thread.c -> tests/glthread/thread.c lib/glthread/thread.h -> tests/glthread/thread.h lib/grantpt.c -> tests/grantpt.c lib/inttypes.in.h -> tests/inttypes.in.h lib/isblank.c -> tests/isblank.c lib/isnan.c -> tests/isnan.c lib/isnand-nolibm.h -> tests/isnand-nolibm.h lib/isnand.c -> tests/isnand.c lib/isnanf-nolibm.h -> tests/isnanf-nolibm.h lib/isnanf.c -> tests/isnanf.c lib/isnanl-nolibm.h -> tests/isnanl-nolibm.h lib/isnanl.c -> tests/isnanl.c lib/localename.c -> tests/localename.c lib/localename.h -> tests/localename.h lib/math.c -> tests/math.c lib/math.in.h -> tests/math.in.h lib/nanosleep.c -> tests/nanosleep.c lib/ptsname.c -> tests/ptsname.c lib/ptsname_r.c -> tests/ptsname_r.c lib/pty-private.h -> tests/pty-private.h lib/putenv.c -> tests/putenv.c lib/read.c -> tests/read.c lib/same-inode.h -> tests/same-inode.h lib/setlocale.c -> tests/setlocale.c lib/signbitd.c -> tests/signbitd.c lib/signbitf.c -> tests/signbitf.c lib/signbitl.c -> tests/signbitl.c lib/spawn.in.h -> tests/spawn.in.h lib/spawn_faction_addclose.c -> tests/spawn_faction_addclose.c lib/spawn_faction_adddup2.c -> tests/spawn_faction_adddup2.c lib/spawn_faction_addopen.c -> tests/spawn_faction_addopen.c lib/spawn_faction_destroy.c -> tests/spawn_faction_destroy.c lib/spawn_faction_init.c -> tests/spawn_faction_init.c lib/spawn_int.h -> tests/spawn_int.h lib/spawnattr_destroy.c -> tests/spawnattr_destroy.c lib/spawnattr_init.c -> tests/spawnattr_init.c lib/spawnattr_setflags.c -> tests/spawnattr_setflags.c lib/spawnattr_setsigmask.c -> tests/spawnattr_setsigmask.c lib/spawni.c -> tests/spawni.c lib/spawnp.c -> tests/spawnp.c lib/symlink.c -> tests/symlink.c lib/unlockpt.c -> tests/unlockpt.c lib/unused-parameter.h -> tests/unused-parameter.h lib/w32sock.h -> tests/w32sock.h lib/wait-process.c -> tests/wait-process.c lib/wait-process.h -> tests/wait-process.h lib/warn-on-use.h -> tests/warn-on-use.h lib/wctob.c -> tests/wctob.c lib/wctomb-impl.h -> tests/wctomb-impl.h lib/wctomb.c -> tests/wctomb.c lib/write.c -> tests/write.c lib/xalloc-die.c -> tests/xalloc-die.c lib/xalloc.h -> tests/xalloc.h lib/xmalloc.c -> tests/xmalloc.c top/GNUmakefile top/maint.mk Creating directory ./gnulib/lib/glthread Creating directory ./gnulib/tests/glthread Copying file GNUmakefile Copying file build-aux/config.rpath Copying file build-aux/gitlog-to-changelog Copying file build-aux/mktempd Copying file build-aux/useless-if-before-free Copying file build-aux/vc-list-files Copying file gnulib/lib/_Noreturn.h Copying file gnulib/lib/accept.c Copying file gnulib/lib/alloca.c Copying file gnulib/lib/alloca.in.h Copying file gnulib/lib/allocator.c Copying file gnulib/lib/allocator.h Copying file gnulib/lib/areadlink.c Copying file gnulib/lib/areadlink.h Copying file gnulib/lib/arg-nonnull.h Copying file gnulib/lib/arpa_inet.in.h Copying file gnulib/lib/asnprintf.c Copying file gnulib/lib/asprintf.c Copying file gnulib/lib/assure.h Copying file gnulib/lib/base64.c Copying file gnulib/lib/base64.h Copying file gnulib/lib/basename-lgpl.c Copying file gnulib/lib/binary-io.c Copying file gnulib/lib/binary-io.h Copying file gnulib/lib/bind.c Copying file gnulib/lib/bitrotate.c Copying file gnulib/lib/bitrotate.h Copying file gnulib/lib/btowc.c Copying file gnulib/lib/byteswap.in.h Copying file gnulib/lib/c++defs.h Copying file gnulib/lib/c-ctype.c Copying file gnulib/lib/c-ctype.h Copying file gnulib/lib/c-strcase.h Copying file gnulib/lib/c-strcasecmp.c Copying file gnulib/lib/c-strcasestr.c Copying file gnulib/lib/c-strcasestr.h Copying file gnulib/lib/c-strncasecmp.c Copying file gnulib/lib/calloc.c Copying file gnulib/lib/canonicalize-lgpl.c Copying file gnulib/lib/careadlinkat.c Copying file gnulib/lib/careadlinkat.h Copying file gnulib/lib/chown.c Copying file gnulib/lib/cloexec.c Copying file gnulib/lib/cloexec.h Copying file gnulib/lib/close.c Copying file gnulib/lib/connect.c Copying file gnulib/lib/count-leading-zeros.c Copying file gnulib/lib/count-leading-zeros.h Copying file gnulib/lib/count-one-bits.c Copying file gnulib/lib/count-one-bits.h Copying file gnulib/lib/dirname-lgpl.c Copying file gnulib/lib/dirname.h Copying file gnulib/lib/dosname.h Copying file gnulib/lib/dup2.c Copying file gnulib/lib/errno.in.h Copying file gnulib/lib/execinfo.c Copying file gnulib/lib/execinfo.in.h Copying file gnulib/lib/fchown-stub.c Copying file gnulib/lib/fclose.c Copying file gnulib/lib/fcntl.c Copying file gnulib/lib/fcntl.in.h Copying file gnulib/lib/fd-hook.c Copying file gnulib/lib/fd-hook.h Copying file gnulib/lib/fdatasync.c Copying file gnulib/lib/fflush.c Copying file gnulib/lib/ffs.c Copying file gnulib/lib/ffsl.c Copying file gnulib/lib/ffsl.h Copying file gnulib/lib/filename.h Copying file gnulib/lib/flexmember.h Copying file gnulib/lib/float+.h Copying file gnulib/lib/float.c Copying file gnulib/lib/float.in.h Copying file gnulib/lib/fnmatch.c Copying file gnulib/lib/fnmatch.in.h Copying file gnulib/lib/fnmatch_loop.c Copying file gnulib/lib/fpurge.c Copying file gnulib/lib/freading.c Copying file gnulib/lib/freading.h Copying file gnulib/lib/fseek.c Copying file gnulib/lib/fseeko.c Copying file gnulib/lib/fstat.c Copying file gnulib/lib/fsync.c Copying file gnulib/lib/ftell.c Copying file gnulib/lib/ftello.c Copying file gnulib/lib/gai_strerror.c Copying file gnulib/lib/getaddrinfo.c Copying file gnulib/lib/getcwd-lgpl.c Copying file gnulib/lib/getdelim.c Copying file gnulib/lib/getdtablesize.c Copying file gnulib/lib/getgroups.c Copying file gnulib/lib/gethostname.c Copying file gnulib/lib/getline.c Copying file gnulib/lib/getopt-cdefs.in.h Copying file gnulib/lib/getopt-core.h Copying file gnulib/lib/getopt-ext.h Copying file gnulib/lib/getopt-pfx-core.h Copying file gnulib/lib/getopt-pfx-ext.h Copying file gnulib/lib/getopt.c Copying file gnulib/lib/getopt.in.h Copying file gnulib/lib/getopt1.c Copying file gnulib/lib/getopt_int.h Copying file gnulib/lib/getpass.c Copying file gnulib/lib/getpass.h Copying file gnulib/lib/getpeername.c Copying file gnulib/lib/getsockname.c Copying file gnulib/lib/gettext.h Copying file gnulib/lib/gettimeofday.c Copying file gnulib/lib/getugroups.c Copying file gnulib/lib/getugroups.h Copying file gnulib/lib/glthread/lock.c Copying file gnulib/lib/glthread/lock.h Copying file gnulib/lib/glthread/threadlib.c Copying file gnulib/lib/hard-locale.c Copying file gnulib/lib/hard-locale.h Copying file gnulib/lib/ignore-value.h Copying file gnulib/lib/inet_ntop.c Copying file gnulib/lib/inet_pton.c Copying file gnulib/lib/intprops.h Copying file gnulib/lib/ioctl.c Copying file gnulib/lib/isatty.c Copying file gnulib/lib/itold.c Copying file gnulib/lib/langinfo.in.h Copying file gnulib/lib/limits.in.h Copying file gnulib/lib/listen.c Copying file gnulib/lib/localcharset.c Copying file gnulib/lib/localcharset.h Copying file gnulib/lib/locale.in.h Copying file gnulib/lib/localeconv.c Copying file gnulib/lib/localtime-buffer.c Copying file gnulib/lib/localtime-buffer.h Copying file gnulib/lib/lseek.c Copying file gnulib/lib/lstat.c Copying file gnulib/lib/malloc.c Copying file gnulib/lib/malloca.c Copying file gnulib/lib/malloca.h Copying file gnulib/lib/mbrtowc.c Copying file gnulib/lib/mbsinit.c Copying file gnulib/lib/mbsrtowcs-impl.h Copying file gnulib/lib/mbsrtowcs-state.c Copying file gnulib/lib/mbsrtowcs.c Copying file gnulib/lib/mbtowc-impl.h Copying file gnulib/lib/mbtowc.c Copying file gnulib/lib/memchr.c Copying file gnulib/lib/memchr.valgrind Copying file gnulib/lib/mgetgroups.c Copying file gnulib/lib/mgetgroups.h Copying file gnulib/lib/mkdtemp.c Copying file gnulib/lib/mkostemp.c Copying file gnulib/lib/mkostemps.c Copying file gnulib/lib/mktime-internal.h Copying file gnulib/lib/mktime.c Copying file gnulib/lib/msvc-inval.c Copying file gnulib/lib/msvc-inval.h Copying file gnulib/lib/msvc-nothrow.c Copying file gnulib/lib/msvc-nothrow.h Copying file gnulib/lib/net_if.in.h Copying file gnulib/lib/netdb.in.h Copying file gnulib/lib/netinet_in.in.h Copying file gnulib/lib/nl_langinfo.c Copying file gnulib/lib/nonblocking.c Copying file gnulib/lib/nonblocking.h Copying file gnulib/lib/open.c Copying file gnulib/lib/openpty.c Copying file gnulib/lib/passfd.c Copying file gnulib/lib/passfd.h Copying file gnulib/lib/pathmax.h Copying file gnulib/lib/perror.c Copying file gnulib/lib/physmem.c Copying file gnulib/lib/physmem.h Copying file gnulib/lib/pipe.c Copying file gnulib/lib/pipe2.c Copying file gnulib/lib/poll.c Copying file gnulib/lib/poll.in.h Copying file gnulib/lib/posix_openpt.c Copying file gnulib/lib/printf-args.c Copying file gnulib/lib/printf-args.h Copying file gnulib/lib/printf-parse.c Copying file gnulib/lib/printf-parse.h Copying file gnulib/lib/pthread.c Copying file gnulib/lib/pthread.in.h Copying file gnulib/lib/pthread_sigmask.c Copying file gnulib/lib/pty.in.h Copying file gnulib/lib/raise.c Copying file gnulib/lib/rawmemchr.c Copying file gnulib/lib/rawmemchr.valgrind Copying file gnulib/lib/readlink.c Copying file gnulib/lib/realloc.c Copying file gnulib/lib/recv.c Copying file gnulib/lib/regcomp.c Copying file gnulib/lib/regex.c Copying file gnulib/lib/regex.h Copying file gnulib/lib/regex_internal.c Copying file gnulib/lib/regex_internal.h Copying file gnulib/lib/regexec.c Copying file gnulib/lib/sched.in.h Copying file gnulib/lib/secure_getenv.c Copying file gnulib/lib/select.c Copying file gnulib/lib/send.c Copying file gnulib/lib/setenv.c Copying file gnulib/lib/setsockopt.c Copying file gnulib/lib/sig-handler.c Copying file gnulib/lib/sig-handler.h Copying file gnulib/lib/sigaction.c Copying file gnulib/lib/signal.in.h Copying file gnulib/lib/sigprocmask.c Copying file gnulib/lib/size_max.h Copying file gnulib/lib/sleep.c Copying file gnulib/lib/snprintf.c Copying file gnulib/lib/socket.c Copying file gnulib/lib/sockets.c Copying file gnulib/lib/sockets.h Copying file gnulib/lib/stat-time.c Copying file gnulib/lib/stat-time.h Copying file gnulib/lib/stat-w32.c Copying file gnulib/lib/stat-w32.h Copying file gnulib/lib/stat.c Copying file gnulib/lib/stdalign.in.h Copying file gnulib/lib/stdarg.in.h Copying file gnulib/lib/stdbool.in.h Copying file gnulib/lib/stddef.in.h Copying file gnulib/lib/stdint.in.h Copying file gnulib/lib/stdio-impl.h Copying file gnulib/lib/stdio-read.c Copying file gnulib/lib/stdio-write.c Copying file gnulib/lib/stdio.in.h Copying file gnulib/lib/stdlib.in.h Copying file gnulib/lib/stpcpy.c Copying file gnulib/lib/str-two-way.h Copying file gnulib/lib/strcasecmp.c Copying file gnulib/lib/strchrnul.c Copying file gnulib/lib/strchrnul.valgrind Copying file gnulib/lib/strdup.c Copying file gnulib/lib/streq.h Copying file gnulib/lib/strerror-override.c Copying file gnulib/lib/strerror-override.h Copying file gnulib/lib/strerror.c Copying file gnulib/lib/strerror_r.c Copying file gnulib/lib/string.in.h Copying file gnulib/lib/strings.in.h Copying file gnulib/lib/stripslash.c Copying file gnulib/lib/strncasecmp.c Copying file gnulib/lib/strndup.c Copying file gnulib/lib/strnlen.c Copying file gnulib/lib/strnlen1.c Copying file gnulib/lib/strnlen1.h Copying file gnulib/lib/strptime.c Copying file gnulib/lib/strsep.c Copying file gnulib/lib/strtok_r.c Copying file gnulib/lib/sys_ioctl.in.h Copying file gnulib/lib/sys_select.in.h Copying file gnulib/lib/sys_socket.c Copying file gnulib/lib/sys_socket.in.h Copying file gnulib/lib/sys_stat.in.h Copying file gnulib/lib/sys_time.in.h Copying file gnulib/lib/sys_types.in.h Copying file gnulib/lib/sys_uio.in.h Copying file gnulib/lib/sys_utsname.in.h Copying file gnulib/lib/sys_wait.in.h Copying file gnulib/lib/tempname.c Copying file gnulib/lib/tempname.h Copying file gnulib/lib/termios.in.h Copying file gnulib/lib/time.in.h Copying file gnulib/lib/time_r.c Copying file gnulib/lib/timegm.c Copying file gnulib/lib/ttyname_r.c Copying file gnulib/lib/uname.c Copying file gnulib/lib/unistd.c Copying file gnulib/lib/unistd.in.h Copying file gnulib/lib/unsetenv.c Copying file gnulib/lib/unused-parameter.h Copying file gnulib/lib/usleep.c Copying file gnulib/lib/vasnprintf.c Copying file gnulib/lib/vasnprintf.h Copying file gnulib/lib/vasprintf.c Copying file gnulib/lib/verify.h Copying file gnulib/lib/vsnprintf.c Copying file gnulib/lib/w32sock.h Copying file gnulib/lib/waitpid.c Copying file gnulib/lib/warn-on-use.h Copying file gnulib/lib/wchar.in.h Copying file gnulib/lib/wcrtomb.c Copying file gnulib/lib/wctype-h.c Copying file gnulib/lib/wctype.in.h Copying file gnulib/lib/xalloc-oversized.h Copying file gnulib/lib/xsize.c Copying file gnulib/lib/xsize.h Copying file gnulib/tests/_Noreturn.h Copying file gnulib/tests/arg-nonnull.h Copying file gnulib/tests/c++defs.h Copying file gnulib/tests/ctype.in.h Copying file gnulib/tests/dup.c Copying file gnulib/tests/error.c Copying file gnulib/tests/error.h Copying file gnulib/tests/exitfail.c Copying file gnulib/tests/exitfail.h Copying file gnulib/tests/fatal-signal.c Copying file gnulib/tests/fatal-signal.h Copying file gnulib/tests/fdopen.c Copying file gnulib/tests/float+.h Copying file gnulib/tests/fpucw.h Copying file gnulib/tests/ftruncate.c Copying file gnulib/tests/getpagesize.c Copying file gnulib/tests/getprogname.c Copying file gnulib/tests/getprogname.h Copying file gnulib/tests/getsockopt.c Copying file gnulib/tests/glthread/thread.c Copying file gnulib/tests/glthread/thread.h Copying file gnulib/tests/grantpt.c Copying file gnulib/tests/infinity.h Copying file gnulib/tests/init.sh Copying file gnulib/tests/inttypes.in.h Copying file gnulib/tests/isblank.c Copying file gnulib/tests/isnan.c Copying file gnulib/tests/isnand-nolibm.h Copying file gnulib/tests/isnand.c Copying file gnulib/tests/isnanf-nolibm.h Copying file gnulib/tests/isnanf.c Copying file gnulib/tests/isnanl-nolibm.h Copying file gnulib/tests/isnanl.c Copying file gnulib/tests/localename.c Copying file gnulib/tests/localename.h Copying file gnulib/tests/macros.h Copying file gnulib/tests/math.c Copying file gnulib/tests/math.in.h Copying file gnulib/tests/minus-zero.h Copying file gnulib/tests/nan.h Copying file gnulib/tests/nanosleep.c Copying file gnulib/tests/nap.h Copying file gnulib/tests/null-ptr.h Copying file gnulib/tests/ptsname.c Copying file gnulib/tests/ptsname_r.c Copying file gnulib/tests/pty-private.h Copying file gnulib/tests/putenv.c Copying file gnulib/tests/randomd.c Copying file gnulib/tests/read.c Copying file gnulib/tests/same-inode.h Copying file gnulib/tests/setlocale.c Copying file gnulib/tests/signature.h Copying file gnulib/tests/signbitd.c Copying file gnulib/tests/signbitf.c Copying file gnulib/tests/signbitl.c Copying file gnulib/tests/socket-client.h Copying file gnulib/tests/socket-server.h Copying file gnulib/tests/spawn.in.h Copying file gnulib/tests/spawn_faction_addclose.c Copying file gnulib/tests/spawn_faction_adddup2.c Copying file gnulib/tests/spawn_faction_addopen.c Copying file gnulib/tests/spawn_faction_destroy.c Copying file gnulib/tests/spawn_faction_init.c Copying file gnulib/tests/spawn_int.h Copying file gnulib/tests/spawnattr_destroy.c Copying file gnulib/tests/spawnattr_init.c Copying file gnulib/tests/spawnattr_setflags.c Copying file gnulib/tests/spawnattr_setsigmask.c Copying file gnulib/tests/spawni.c Copying file gnulib/tests/spawnp.c Copying file gnulib/tests/symlink.c Copying file gnulib/tests/test-accept.c Copying file gnulib/tests/test-alloca-opt.c Copying file gnulib/tests/test-areadlink.c Copying file gnulib/tests/test-areadlink.h Copying file gnulib/tests/test-arpa_inet.c Copying file gnulib/tests/test-base64.c Copying file gnulib/tests/test-binary-io.c Copying file gnulib/tests/test-binary-io.sh Copying file gnulib/tests/test-bind.c Copying file gnulib/tests/test-bitrotate.c Copying file gnulib/tests/test-btowc.c Copying file gnulib/tests/test-btowc1.sh Copying file gnulib/tests/test-btowc2.sh Copying file gnulib/tests/test-byteswap.c Copying file gnulib/tests/test-c-ctype.c Copying file gnulib/tests/test-c-strcase.sh Copying file gnulib/tests/test-c-strcasecmp.c Copying file gnulib/tests/test-c-strcasestr.c Copying file gnulib/tests/test-c-strncasecmp.c Copying file gnulib/tests/test-canonicalize-lgpl.c Copying file gnulib/tests/test-chown.c Copying file gnulib/tests/test-chown.h Copying file gnulib/tests/test-cloexec.c Copying file gnulib/tests/test-close.c Copying file gnulib/tests/test-connect.c Copying file gnulib/tests/test-count-leading-zeros.c Copying file gnulib/tests/test-count-one-bits.c Copying file gnulib/tests/test-ctype.c Copying file gnulib/tests/test-dup.c Copying file gnulib/tests/test-dup2.c Copying file gnulib/tests/test-environ.c Copying file gnulib/tests/test-errno.c Copying file gnulib/tests/test-fclose.c Copying file gnulib/tests/test-fcntl-h.c Copying file gnulib/tests/test-fcntl.c Copying file gnulib/tests/test-fdatasync.c Copying file gnulib/tests/test-fdopen.c Copying file gnulib/tests/test-fflush.c Copying file gnulib/tests/test-fflush2.c Copying file gnulib/tests/test-fflush2.sh Copying file gnulib/tests/test-ffs.c Copying file gnulib/tests/test-ffsl.c Copying file gnulib/tests/test-fgetc.c Copying file gnulib/tests/test-float.c Copying file gnulib/tests/test-fnmatch.c Copying file gnulib/tests/test-fpurge.c Copying file gnulib/tests/test-fputc.c Copying file gnulib/tests/test-fread.c Copying file gnulib/tests/test-freading.c Copying file gnulib/tests/test-fseek.c Copying file gnulib/tests/test-fseek.sh Copying file gnulib/tests/test-fseek2.sh Copying file gnulib/tests/test-fseeko.c Copying file gnulib/tests/test-fseeko.sh Copying file gnulib/tests/test-fseeko2.sh Copying file gnulib/tests/test-fseeko3.c Copying file gnulib/tests/test-fseeko3.sh Copying file gnulib/tests/test-fseeko4.c Copying file gnulib/tests/test-fseeko4.sh Copying file gnulib/tests/test-fstat.c Copying file gnulib/tests/test-fsync.c Copying file gnulib/tests/test-ftell.c Copying file gnulib/tests/test-ftell.sh Copying file gnulib/tests/test-ftell2.sh Copying file gnulib/tests/test-ftell3.c Copying file gnulib/tests/test-ftello.c Copying file gnulib/tests/test-ftello.sh Copying file gnulib/tests/test-ftello2.sh Copying file gnulib/tests/test-ftello3.c Copying file gnulib/tests/test-ftello4.c Copying file gnulib/tests/test-ftello4.sh Copying file gnulib/tests/test-ftruncate.c Copying file gnulib/tests/test-ftruncate.sh Copying file gnulib/tests/test-func.c Copying file gnulib/tests/test-fwrite.c Copying file gnulib/tests/test-getaddrinfo.c Copying file gnulib/tests/test-getcwd-lgpl.c Copying file gnulib/tests/test-getdelim.c Copying file gnulib/tests/test-getdtablesize.c Copying file gnulib/tests/test-getgroups.c Copying file gnulib/tests/test-gethostname.c Copying file gnulib/tests/test-getline.c Copying file gnulib/tests/test-getopt-main.h Copying file gnulib/tests/test-getopt-posix.c Copying file gnulib/tests/test-getopt.h Copying file gnulib/tests/test-getpeername.c Copying file gnulib/tests/test-getprogname.c Copying file gnulib/tests/test-getsockname.c Copying file gnulib/tests/test-getsockopt.c Copying file gnulib/tests/test-gettimeofday.c Copying file gnulib/tests/test-grantpt.c Copying file gnulib/tests/test-ignore-value.c Copying file gnulib/tests/test-inet_ntop.c Copying file gnulib/tests/test-inet_pton.c Copying file gnulib/tests/test-init.sh Copying file gnulib/tests/test-intprops.c Copying file gnulib/tests/test-inttypes.c Copying file gnulib/tests/test-ioctl.c Copying file gnulib/tests/test-isatty.c Copying file gnulib/tests/test-isblank.c Copying file gnulib/tests/test-isnand-nolibm.c Copying file gnulib/tests/test-isnand.h Copying file gnulib/tests/test-isnanf-nolibm.c Copying file gnulib/tests/test-isnanf.h Copying file gnulib/tests/test-isnanl-nolibm.c Copying file gnulib/tests/test-isnanl.h Copying file gnulib/tests/test-langinfo.c Copying file gnulib/tests/test-ldexp.c Copying file gnulib/tests/test-ldexp.h Copying file gnulib/tests/test-limits-h.c Copying file gnulib/tests/test-listen.c Copying file gnulib/tests/test-localcharset.c Copying file gnulib/tests/test-locale.c Copying file gnulib/tests/test-localeconv.c Copying file gnulib/tests/test-localename.c Copying file gnulib/tests/test-lseek.c Copying file gnulib/tests/test-lseek.sh Copying file gnulib/tests/test-lstat.c Copying file gnulib/tests/test-lstat.h Copying file gnulib/tests/test-malloca.c Copying file gnulib/tests/test-math.c Copying file gnulib/tests/test-mbrtowc-w32-1.sh Copying file gnulib/tests/test-mbrtowc-w32-2.sh Copying file gnulib/tests/test-mbrtowc-w32-3.sh Copying file gnulib/tests/test-mbrtowc-w32-4.sh Copying file gnulib/tests/test-mbrtowc-w32-5.sh Copying file gnulib/tests/test-mbrtowc-w32.c Copying file gnulib/tests/test-mbrtowc.c Copying file gnulib/tests/test-mbrtowc1.sh Copying file gnulib/tests/test-mbrtowc2.sh Copying file gnulib/tests/test-mbrtowc3.sh Copying file gnulib/tests/test-mbrtowc4.sh Copying file gnulib/tests/test-mbrtowc5.sh Copying file gnulib/tests/test-mbsinit.c Copying file gnulib/tests/test-mbsinit.sh Copying file gnulib/tests/test-mbsrtowcs.c Copying file gnulib/tests/test-mbsrtowcs1.sh Copying file gnulib/tests/test-mbsrtowcs2.sh Copying file gnulib/tests/test-mbsrtowcs3.sh Copying file gnulib/tests/test-mbsrtowcs4.sh Copying file gnulib/tests/test-memchr.c Copying file gnulib/tests/test-nanosleep.c Copying file gnulib/tests/test-net_if.c Copying file gnulib/tests/test-netdb.c Copying file gnulib/tests/test-netinet_in.c Copying file gnulib/tests/test-nl_langinfo.c Copying file gnulib/tests/test-nl_langinfo.sh Copying file gnulib/tests/test-nonblocking-misc.h Copying file gnulib/tests/test-nonblocking-pipe-child.c Copying file gnulib/tests/test-nonblocking-pipe-main.c Copying file gnulib/tests/test-nonblocking-pipe.h Copying file gnulib/tests/test-nonblocking-pipe.sh Copying file gnulib/tests/test-nonblocking-reader.h Copying file gnulib/tests/test-nonblocking-socket-child.c Copying file gnulib/tests/test-nonblocking-socket-main.c Copying file gnulib/tests/test-nonblocking-socket.h Copying file gnulib/tests/test-nonblocking-socket.sh Copying file gnulib/tests/test-nonblocking-writer.h Copying file gnulib/tests/test-nonblocking.c Copying file gnulib/tests/test-open.c Copying file gnulib/tests/test-open.h Copying file gnulib/tests/test-openpty.c Copying file gnulib/tests/test-passfd.c Copying file gnulib/tests/test-pathmax.c Copying file gnulib/tests/test-perror.c Copying file gnulib/tests/test-perror.sh Copying file gnulib/tests/test-perror2.c Copying file gnulib/tests/test-pipe.c Copying file gnulib/tests/test-pipe2.c Copying file gnulib/tests/test-poll-h.c Copying file gnulib/tests/test-poll.c Copying file gnulib/tests/test-posix_openpt.c Copying file gnulib/tests/test-posix_spawn1.c Copying file gnulib/tests/test-posix_spawn1.in.sh Copying file gnulib/tests/test-posix_spawn2.c Copying file gnulib/tests/test-posix_spawn2.in.sh Copying file gnulib/tests/test-posix_spawn_file_actions_addclose.c Copying file gnulib/tests/test-posix_spawn_file_actions_adddup2.c Copying file gnulib/tests/test-posix_spawn_file_actions_addopen.c Copying file gnulib/tests/test-pthread_sigmask1.c Copying file gnulib/tests/test-pthread_sigmask2.c Copying file gnulib/tests/test-ptsname.c Copying file gnulib/tests/test-ptsname_r.c Copying file gnulib/tests/test-raise.c Copying file gnulib/tests/test-rawmemchr.c Copying file gnulib/tests/test-read.c Copying file gnulib/tests/test-readlink.c Copying file gnulib/tests/test-readlink.h Copying file gnulib/tests/test-recv.c Copying file gnulib/tests/test-regex.c Copying file gnulib/tests/test-sched.c Copying file gnulib/tests/test-select-fd.c Copying file gnulib/tests/test-select-in.sh Copying file gnulib/tests/test-select-out.sh Copying file gnulib/tests/test-select-stdin.c Copying file gnulib/tests/test-select.c Copying file gnulib/tests/test-select.h Copying file gnulib/tests/test-send.c Copying file gnulib/tests/test-setenv.c Copying file gnulib/tests/test-setlocale1.c Copying file gnulib/tests/test-setlocale1.sh Copying file gnulib/tests/test-setlocale2.c Copying file gnulib/tests/test-setlocale2.sh Copying file gnulib/tests/test-setsockopt.c Copying file gnulib/tests/test-sigaction.c Copying file gnulib/tests/test-signal-h.c Copying file gnulib/tests/test-signbit.c Copying file gnulib/tests/test-sigpipe.c Copying file gnulib/tests/test-sigpipe.sh Copying file gnulib/tests/test-sigprocmask.c Copying file gnulib/tests/test-sleep.c Copying file gnulib/tests/test-snprintf.c Copying file gnulib/tests/test-sockets.c Copying file gnulib/tests/test-spawn.c Copying file gnulib/tests/test-stat-time.c Copying file gnulib/tests/test-stat.c Copying file gnulib/tests/test-stat.h Copying file gnulib/tests/test-stdalign.c Copying file gnulib/tests/test-stdbool.c Copying file gnulib/tests/test-stddef.c Copying file gnulib/tests/test-stdint.c Copying file gnulib/tests/test-stdio.c Copying file gnulib/tests/test-stdlib.c Copying file gnulib/tests/test-strchrnul.c Copying file gnulib/tests/test-strerror.c Copying file gnulib/tests/test-strerror_r.c Copying file gnulib/tests/test-string.c Copying file gnulib/tests/test-strings.c Copying file gnulib/tests/test-strnlen.c Copying file gnulib/tests/test-symlink.c Copying file gnulib/tests/test-symlink.h Copying file gnulib/tests/test-sys_ioctl.c Copying file gnulib/tests/test-sys_select.c Copying file gnulib/tests/test-sys_socket.c Copying file gnulib/tests/test-sys_stat.c Copying file gnulib/tests/test-sys_time.c Copying file gnulib/tests/test-sys_types.c Copying file gnulib/tests/test-sys_uio.c Copying file gnulib/tests/test-sys_utsname.c Copying file gnulib/tests/test-sys_wait.c Copying file gnulib/tests/test-sys_wait.h Copying file gnulib/tests/test-termios.c Copying file gnulib/tests/test-thread_create.c Copying file gnulib/tests/test-thread_self.c Copying file gnulib/tests/test-time.c Copying file gnulib/tests/test-ttyname_r.c Copying file gnulib/tests/test-uname.c Copying file gnulib/tests/test-unistd.c Copying file gnulib/tests/test-unlockpt.c Copying file gnulib/tests/test-unsetenv.c Copying file gnulib/tests/test-usleep.c Copying file gnulib/tests/test-vasnprintf.c Copying file gnulib/tests/test-vasprintf.c Copying file gnulib/tests/test-vc-list-files-cvs.sh Copying file gnulib/tests/test-vc-list-files-git.sh Copying file gnulib/tests/test-verify-try.c Copying file gnulib/tests/test-verify.c Copying file gnulib/tests/test-verify.sh Copying file gnulib/tests/test-vsnprintf.c Copying file gnulib/tests/test-wchar.c Copying file gnulib/tests/test-wcrtomb-w32-1.sh Copying file gnulib/tests/test-wcrtomb-w32-2.sh Copying file gnulib/tests/test-wcrtomb-w32-3.sh Copying file gnulib/tests/test-wcrtomb-w32-4.sh Copying file gnulib/tests/test-wcrtomb-w32-5.sh Copying file gnulib/tests/test-wcrtomb-w32.c Copying file gnulib/tests/test-wcrtomb.c Copying file gnulib/tests/test-wcrtomb.sh Copying file gnulib/tests/test-wctype-h.c Copying file gnulib/tests/test-write.c Copying file gnulib/tests/test-xalloc-die.c Copying file gnulib/tests/test-xalloc-die.sh Copying file gnulib/tests/unlockpt.c Copying file gnulib/tests/unused-parameter.h Copying file gnulib/tests/w32sock.h Copying file gnulib/tests/wait-process.c Copying file gnulib/tests/wait-process.h Copying file gnulib/tests/warn-on-use.h Copying file gnulib/tests/wctob.c Copying file gnulib/tests/wctomb-impl.h Copying file gnulib/tests/wctomb.c Copying file gnulib/tests/write.c Copying file gnulib/tests/xalloc-die.c Copying file gnulib/tests/xalloc.h Copying file gnulib/tests/xmalloc.c Copying file gnulib/tests/zerosize-ptr.h Copying file m4/00gnulib.m4 Copying file m4/absolute-header.m4 Copying file m4/alloca.m4 Copying file m4/arpa_inet_h.m4 Copying file m4/asm-underscore.m4 Copying file m4/autobuild.m4 Copying file m4/base64.m4 Copying file m4/btowc.m4 Copying file m4/builtin-expect.m4 Copying file m4/byteswap.m4 Copying file m4/calloc.m4 Copying file m4/canonicalize.m4 Copying file m4/chown.m4 Copying file m4/clock_time.m4 Copying file m4/close.m4 Copying file m4/codeset.m4 Copying file m4/configmake.m4 Copying file m4/count-leading-zeros.m4 Copying file m4/count-one-bits.m4 Copying file m4/ctype.m4 Copying file m4/dirname.m4 Copying file m4/double-slash-root.m4 Copying file m4/dup.m4 Copying file m4/dup2.m4 Copying file m4/eealloc.m4 Copying file m4/environ.m4 Copying file m4/errno_h.m4 Copying file m4/error.m4 Copying file m4/execinfo.m4 Copying file m4/exponentd.m4 Copying file m4/exponentf.m4 Copying file m4/exponentl.m4 Copying file m4/extensions.m4 Copying file m4/extern-inline.m4 Copying file m4/fatal-signal.m4 Copying file m4/fclose.m4 Copying file m4/fcntl-o.m4 Copying file m4/fcntl.m4 Copying file m4/fcntl_h.m4 Copying file m4/fdatasync.m4 Copying file m4/fdopen.m4 Copying file m4/fflush.m4 Copying file m4/ffs.m4 Copying file m4/ffsl.m4 Copying file m4/flexmember.m4 Copying file m4/float_h.m4 Copying file m4/fnmatch.m4 Copying file m4/fpieee.m4 Copying file m4/fpurge.m4 Copying file m4/freading.m4 Copying file m4/fseek.m4 Copying file m4/fseeko.m4 Copying file m4/fstat.m4 Copying file m4/fsync.m4 Copying file m4/ftell.m4 Copying file m4/ftello.m4 Copying file m4/ftruncate.m4 Copying file m4/func.m4 Copying file m4/getaddrinfo.m4 Copying file m4/getcwd.m4 Copying file m4/getdelim.m4 Copying file m4/getdtablesize.m4 Copying file m4/getgroups.m4 Copying file m4/gethostname.m4 Copying file m4/getline.m4 Copying file m4/getopt.m4 Copying file m4/getpagesize.m4 Copying file m4/getpass.m4 Copying file m4/getprogname.m4 Copying file m4/gettimeofday.m4 Copying file m4/getugroups.m4 Copying file m4/glibc21.m4 Copying file m4/gnulib-common.m4 Copying file m4/gnulib-tool.m4 Copying file m4/grantpt.m4 Copying file m4/host-cpu-c-abi.m4 Copying file m4/hostent.m4 Copying file m4/include_next.m4 Copying file m4/inet_ntop.m4 Copying file m4/inet_pton.m4 Copying file m4/intlmacosx.m4 Copying file m4/intmax_t.m4 Copying file m4/inttypes-pri.m4 Copying file m4/inttypes.m4 Copying file m4/inttypes_h.m4 Copying file m4/ioctl.m4 Copying file m4/isatty.m4 Copying file m4/isblank.m4 Copying file m4/isnand.m4 Copying file m4/isnanf.m4 Copying file m4/isnanl.m4 Copying file m4/langinfo_h.m4 Copying file m4/largefile.m4 Copying file m4/lcmessage.m4 Copying file m4/ldexp.m4 Copying file m4/lib-ld.m4 Copying file m4/lib-link.m4 Copying file m4/lib-prefix.m4 Copying file m4/limits-h.m4 Copying file m4/localcharset.m4 Copying file m4/locale-fr.m4 Copying file m4/locale-ja.m4 Copying file m4/locale-tr.m4 Copying file m4/locale-zh.m4 Copying file m4/locale_h.m4 Copying file m4/localeconv.m4 Copying file m4/localename.m4 Copying file m4/localtime-buffer.m4 Copying file m4/lock.m4 Copying file m4/longlong.m4 Copying file m4/lseek.m4 Copying file m4/lstat.m4 Copying file m4/malloc.m4 Copying file m4/malloca.m4 Copying file m4/manywarnings-c++.m4 Copying file m4/manywarnings.m4 Copying file m4/math_h.m4 Copying file m4/mbrtowc.m4 Copying file m4/mbsinit.m4 Copying file m4/mbsrtowcs.m4 Copying file m4/mbstate_t.m4 Copying file m4/mbtowc.m4 Copying file m4/memchr.m4 Copying file m4/mgetgroups.m4 Copying file m4/mkdtemp.m4 Copying file m4/mkostemp.m4 Copying file m4/mkostemps.m4 Copying file m4/mktime.m4 Copying file m4/mmap-anon.m4 Copying file m4/mode_t.m4 Copying file m4/msvc-inval.m4 Copying file m4/msvc-nothrow.m4 Copying file m4/multiarch.m4 Copying file m4/nanosleep.m4 Copying file m4/net_if_h.m4 Copying file m4/netdb_h.m4 Copying file m4/netinet_in_h.m4 Copying file m4/nl_langinfo.m4 Copying file m4/nocrash.m4 Copying file m4/nonblocking.m4 Copying file m4/off_t.m4 Copying file m4/onceonly.m4 Copying file m4/open-cloexec.m4 Copying file m4/open.m4 Copying file m4/passfd.m4 Copying file m4/pathmax.m4 Copying file m4/perror.m4 Copying file m4/physmem.m4 Copying file m4/pipe.m4 Copying file m4/pipe2.m4 Copying file m4/poll.m4 Copying file m4/poll_h.m4 Copying file m4/posix-shell.m4 Copying file m4/posix_openpt.m4 Copying file m4/posix_spawn.m4 Copying file m4/printf.m4 Copying file m4/pthread.m4 Copying file m4/pthread_rwlock_rdlock.m4 Copying file m4/pthread_sigmask.m4 Copying file m4/ptsname.m4 Copying file m4/ptsname_r.m4 Copying file m4/pty.m4 Copying file m4/pty_h.m4 Copying file m4/putenv.m4 Copying file m4/raise.m4 Copying file m4/rawmemchr.m4 Copying file m4/read.m4 Copying file m4/readlink.m4 Copying file m4/realloc.m4 Copying file m4/regex.m4 Copying file m4/sched_h.m4 Copying file m4/secure_getenv.m4 Copying file m4/select.m4 Copying file m4/servent.m4 Copying file m4/setenv.m4 Copying file m4/setlocale.m4 Copying file m4/sig_atomic_t.m4 Copying file m4/sigaction.m4 Copying file m4/signal_h.m4 Copying file m4/signalblocking.m4 Copying file m4/signbit.m4 Copying file m4/sigpipe.m4 Copying file m4/size_max.m4 Copying file m4/sleep.m4 Copying file m4/snprintf.m4 Copying file m4/socketlib.m4 Copying file m4/sockets.m4 Copying file m4/socklen.m4 Copying file m4/sockpfaf.m4 Copying file m4/spawn_h.m4 Copying file m4/ssize_t.m4 Copying file m4/stat-time.m4 Copying file m4/stat.m4 Copying file m4/stdalign.m4 Copying file m4/stdarg.m4 Copying file m4/stdbool.m4 Copying file m4/stddef_h.m4 Copying file m4/stdint.m4 Copying file m4/stdint_h.m4 Copying file m4/stdio_h.m4 Copying file m4/stdlib_h.m4 Copying file m4/stpcpy.m4 Copying file m4/strcase.m4 Copying file m4/strchrnul.m4 Copying file m4/strdup.m4 Copying file m4/strerror.m4 Copying file m4/strerror_r.m4 Copying file m4/string_h.m4 Copying file m4/strings_h.m4 Copying file m4/strndup.m4 Copying file m4/strnlen.m4 Copying file m4/strptime.m4 Copying file m4/strsep.m4 Copying file m4/strtok_r.m4 Copying file m4/symlink.m4 Copying file m4/sys_ioctl_h.m4 Copying file m4/sys_select_h.m4 Copying file m4/sys_socket_h.m4 Copying file m4/sys_stat_h.m4 Copying file m4/sys_time_h.m4 Copying file m4/sys_types_h.m4 Copying file m4/sys_uio_h.m4 Copying file m4/sys_utsname_h.m4 Copying file m4/sys_wait_h.m4 Copying file m4/tempname.m4 Copying file m4/termios_h.m4 Copying file m4/thread.m4 Copying file m4/threadlib.m4 Copying file m4/time_h.m4 Copying file m4/time_r.m4 Copying file m4/timegm.m4 Copying file m4/tm_gmtoff.m4 Copying file m4/ttyname_r.m4 Copying file m4/uname.m4 Copying file m4/ungetc.m4 Copying file m4/unistd_h.m4 Copying file m4/unlockpt.m4 Copying file m4/usleep.m4 Copying file m4/vasnprintf.m4 Copying file m4/vasprintf.m4 Copying file m4/vsnprintf.m4 Copying file m4/wait-process.m4 Copying file m4/waitpid.m4 Copying file m4/warn-on-use.m4 Copying file m4/warnings.m4 Copying file m4/wchar_h.m4 Copying file m4/wchar_t.m4 Copying file m4/wcrtomb.m4 Copying file m4/wctob.m4 Copying file m4/wctomb.m4 Copying file m4/wctype_h.m4 Copying file m4/wint_t.m4 Copying file m4/write.m4 Copying file m4/xalloc.m4 Copying file m4/xsize.m4 Copying file maint.mk Creating gnulib/lib/gnulib.mk Creating m4/gnulib-cache.m4 Creating m4/gnulib-comp.m4 Creating gnulib/tests/gnulib.mk Updating ./build-aux/.gitignore (backup in ./build-aux/.gitignore~) Creating ./gnulib/lib/.gitignore Creating ./gnulib/lib/glthread/.gitignore Creating ./gnulib/tests/.gitignore Creating ./gnulib/tests/glthread/.gitignore Updating ./m4/.gitignore (backup in ./m4/.gitignore~) Finished. You may need to add #include directives for the following .h files. #include <arpa/inet.h> #include <byteswap.h> #include <execinfo.h> #include <fcntl.h> #include <fnmatch.h> #include <locale.h> #include <math.h> #include <net/if.h> #include <netdb.h> #include <poll.h> #include <pthread.h> #include <pty.h> #include <regex.h> #include <sched.h> #include <signal.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/utsname.h> #include <sys/wait.h> #include <termios.h> #include <time.h> #include <unistd.h> /* Include only after all system include files. */ #include "areadlink.h" #include "base64.h" #include "bitrotate.h" #include "c-ctype.h" #include "c-strcase.h" #include "c-strcasestr.h" #include "configmake.h" #include "count-leading-zeros.h" #include "count-one-bits.h" #include "dirname.h" #include "getpass.h" #include "ignore-value.h" #include "intprops.h" #include "mgetgroups.h" #include "nonblocking.h" #include "passfd.h" #include "physmem.h" #include "stat-time.h" #include "verify.h" You may need to use the following Makefile variables when linking. Use them in <program>_LDADD when linking a program, or in <library>_a_LDFLAGS or <library>_la_LDFLAGS when linking a library. $(GETADDRINFO_LIB) $(GETHOSTNAME_LIB) $(HOSTENT_LIB) $(INET_NTOP_LIB) $(INET_PTON_LIB) $(LDEXP_LIBM) $(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_EXECINFO) $(LIB_FDATASYNC) $(LIB_POLL) $(LIB_PTHREAD) $(LIB_PTHREAD_SIGMASK) $(LIB_SELECT) $(LTLIBINTL) when linking with libtool, $(LIBINTL) otherwise $(LTLIBTHREAD) when linking with libtool, $(LIBTHREAD) otherwise $(PTY_LIB) $(SERVENT_LIB) Don't forget to - "include gnulib.mk" from within "gnulib/lib/Makefile.am", - "include gnulib.mk" from within "gnulib/tests/Makefile.am", - mention "-I m4" in ACLOCAL_AMFLAGS in Makefile.am, - mention "m4/gnulib-cache.m4" in EXTRA_DIST in Makefile.am, - invoke gl_EARLY in ./configure.ac, right after AC_PROG_CC, - invoke gl_INIT in ./configure.ac. running: AUTOPOINT=true LIBTOOLIZE=true autoreconf --verbose --install --force -I m4 --no-recursive autoreconf: Entering directory `.' autoreconf: configure.ac: not using Gettext autoreconf: running: aclocal -I m4 --force -I m4 autoreconf: configure.ac: tracing autoreconf: running: true --copy --force autoreconf: running: /usr/bin/autoconf --include=m4 --force autoreconf: running: /usr/bin/autoheader --include=m4 --force autoreconf: running: automake --add-missing --copy --force-missing configure.ac:116: installing 'build-aux/compile' configure.ac:27: installing 'build-aux/missing' Makefile.am: installing './INSTALL' examples/Makefile.am: installing 'build-aux/depcomp' parallel-tests: installing 'build-aux/test-driver' autoreconf: Leaving directory `.' ./bootstrap: ln -fs ../.gnulib/build-aux/install-sh build-aux/install-sh ./bootstrap: ln -fs ../.gnulib/build-aux/depcomp build-aux/depcomp ./bootstrap: ln -fs ../.gnulib/build-aux/config.guess build-aux/config.guess ./bootstrap: ln -fs ../.gnulib/build-aux/config.sub build-aux/config.sub ./bootstrap: ln -fs .gnulib/doc/INSTALL INSTALL ./bootstrap: done. Now you can run './configure'. I am going to run configure with no arguments - if you wish to pass any to it, please specify them on the ./autogen.sh command line. checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether make supports nested variables... yes checking how to create a pax tar archive... gnutar checking whether make supports nested variables... (cached) yes checking build system type... x86_64-pc-linux-gnu checking host system type... x86_64-pc-linux-gnu checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking whether gcc understands -c and -o together... yes checking for style of include used by make... GNU checking dependency style of gcc... gcc3 checking how to run the C preprocessor... gcc -E checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking minix/config.h usability... no checking minix/config.h presence... no checking for minix/config.h... no checking whether it is safe to define __EXTENSIONS__... yes checking whether _XOPEN_SOURCE should be defined... no checking for Minix Amsterdam compiler... no checking for ar... ar checking for ranlib... ranlib checking for _LARGEFILE_SOURCE value needed for large files... no checking for special C compiler options needed for large files... no checking for _FILE_OFFSET_BITS value needed for large files... no checking for gcc option to accept ISO C99... none needed checking for gcc option to accept ISO Standard C... (cached) none needed configure: autobuild project... libvirt configure: autobuild revision... v2.1.0-rc1-7126-gfdb4f1fcde configure: autobuild hostname... patchew-fedora configure: autobuild timestamp... 20180827T060432Z checking sys/socket.h usability... yes checking sys/socket.h presence... yes checking for sys/socket.h... yes checking arpa/inet.h usability... yes checking arpa/inet.h presence... yes checking for arpa/inet.h... yes checking features.h usability... yes checking features.h presence... yes checking for features.h... yes checking sys/param.h usability... yes checking sys/param.h presence... yes checking for sys/param.h... yes checking for unistd.h... (cached) yes checking execinfo.h usability... yes checking execinfo.h presence... yes checking for execinfo.h... yes checking wctype.h usability... yes checking wctype.h presence... yes checking for wctype.h... yes checking for sys/stat.h... (cached) yes checking netdb.h usability... yes checking netdb.h presence... yes checking for netdb.h... yes checking netinet/in.h usability... yes checking netinet/in.h presence... yes checking for netinet/in.h... yes checking getopt.h usability... yes checking getopt.h presence... yes checking for getopt.h... yes checking sys/cdefs.h usability... yes checking sys/cdefs.h presence... yes checking for sys/cdefs.h... yes checking stdio_ext.h usability... yes checking stdio_ext.h presence... yes checking for stdio_ext.h... yes checking termios.h usability... yes checking termios.h presence... yes checking for termios.h... yes checking sys/time.h usability... yes checking sys/time.h presence... yes checking for sys/time.h... yes checking grp.h usability... yes checking grp.h presence... yes checking for grp.h... yes checking langinfo.h usability... yes checking langinfo.h presence... yes checking for langinfo.h... yes checking limits.h usability... yes checking limits.h presence... yes checking for limits.h... yes checking xlocale.h usability... yes checking xlocale.h presence... yes checking for xlocale.h... yes checking sys/mman.h usability... yes checking sys/mman.h presence... yes checking for sys/mman.h... yes checking pty.h usability... yes checking pty.h presence... yes checking for pty.h... yes checking poll.h usability... yes checking poll.h presence... yes checking for poll.h... yes checking sys/ioctl.h usability... yes checking sys/ioctl.h presence... yes checking for sys/ioctl.h... yes checking sys/filio.h usability... no checking sys/filio.h presence... no checking for sys/filio.h... no checking pthread.h usability... yes checking pthread.h presence... yes checking for pthread.h... yes checking malloc.h usability... yes checking malloc.h presence... yes checking for malloc.h... yes checking sys/select.h usability... yes checking sys/select.h presence... yes checking for sys/select.h... yes checking wchar.h usability... yes checking wchar.h presence... yes checking for wchar.h... yes checking for stdint.h... (cached) yes checking for strings.h... (cached) yes checking sys/uio.h usability... yes checking sys/uio.h presence... yes checking for sys/uio.h... yes checking sys/utsname.h usability... yes checking sys/utsname.h presence... yes checking for sys/utsname.h... yes checking sys/wait.h usability... yes checking sys/wait.h presence... yes checking for sys/wait.h... yes checking crtdefs.h usability... no checking crtdefs.h presence... no checking for crtdefs.h... no checking for inttypes.h... (cached) yes checking math.h usability... yes checking math.h presence... yes checking for math.h... yes checking for sys/types.h... (cached) yes checking spawn.h usability... yes checking spawn.h presence... yes checking for spawn.h... yes checking whether the preprocessor supports include_next... yes checking whether system header files limit the line length... no checking whether <sys/socket.h> is self-contained... yes checking for shutdown... yes checking whether <sys/socket.h> defines the SHUT_* macros... yes checking for struct sockaddr_storage... yes checking for sa_family_t... yes checking for struct sockaddr_storage.ss_family... yes checking for size_t... yes checking for working alloca.h... yes checking for alloca... yes checking for C/C++ restrict keyword... __restrict checking whether <wchar.h> uses 'inline' correctly... yes checking for btowc... yes checking for canonicalize_file_name... yes checking for getcwd... yes checking for readlink... yes checking for realpath... yes checking for readlinkat... yes checking for chown... yes checking for fchown... yes checking for _set_invalid_parameter_handler... no checking for fcntl... yes checking for symlink... yes checking for ffsl... yes checking for isblank... yes checking for iswctype... yes checking for mbsrtowcs... yes checking for mempcpy... yes checking for wmemchr... yes checking for wmemcpy... yes checking for wmempcpy... yes checking for fpurge... no checking for __fpurge... yes checking for __freading... yes checking for fsync... yes checking for getdelim... yes checking for getdtablesize... yes checking for __fsetlocking... yes checking for gettimeofday... yes checking for lstat... yes checking for mbsinit... yes checking for mbrtowc... yes checking for mprotect... yes checking for getgrouplist... yes checking for mkostemp... yes checking for mkostemps... yes checking for tzset... yes checking for nl_langinfo... yes checking for recvmsg... yes checking for sendmsg... yes checking for strerror_r... yes checking for __xpg_strerror_r... yes checking for pipe... yes checking for pipe2... yes checking for posix_openpt... yes checking for pthread_sigmask... no checking for secure_getenv... yes checking for getuid... yes checking for geteuid... yes checking for getgid... yes checking for getegid... yes checking for setenv... yes checking for sigaction... yes checking for sigaltstack... yes checking for siginterrupt... yes checking for sleep... yes checking for snprintf... yes checking for strdup... yes checking for catgets... yes checking for strndup... yes checking for strptime... yes checking for localtime_r... yes checking for timegm... yes checking for usleep... yes checking for vasnprintf... no checking for wcrtomb... yes checking for iswcntrl... yes checking for ftruncate... yes checking for getprogname... no checking for getexecname... no checking for newlocale... yes checking for socketpair... yes checking for ptsname_r... yes checking for shutdown... (cached) yes checking for wctob... yes checking for cfmakeraw... yes checking for fallocate... yes checking for getgrnam_r... yes checking for getmntent_r... yes checking for getpwuid_r... yes checking for getrlimit... yes checking for if_indextoname... yes checking for kill... yes checking for mmap... yes checking for posix_fallocate... yes checking for posix_memalign... yes checking for prlimit... yes checking for regexec... yes checking for sched_getaffinity... yes checking for setgroups... yes checking for setns... yes checking for setrlimit... yes checking for sysctlbyname... no checking for getifaddrs... yes checking for sched_setscheduler... yes checking for unshare... yes checking for nl_langinfo and CODESET... yes checking for a traditional french locale... fr_FR checking whether malloc, realloc, calloc are POSIX compliant... yes checking whether // is distinct from /... no checking whether realpath works... yes checking for uid_t in sys/types.h... yes checking for unistd.h... (cached) yes checking for working chown... yes checking whether chown dereferences symlinks... yes checking whether chown honors trailing slash... yes checking whether chown always updates ctime... yes checking for unsigned long long int... yes checking if environ is properly declared... yes checking for complete errno.h... yes checking for working fcntl.h... yes checking for pid_t... yes checking for mode_t... yes checking whether fdatasync is declared... yes checking for mbstate_t... yes checking whether stdin defaults to large file offsets... yes checking whether fseeko is declared... yes checking for fseeko... yes checking whether fflush works on input streams... no checking whether stat file-mode macros are broken... no checking for nlink_t... yes checking whether ftello is declared... yes checking for ftello... yes checking whether ftello works... yes checking for library containing gethostbyname... none required checking for gethostbyname... yes checking for library containing getservbyname... none required checking for getservbyname... yes checking for library containing inet_ntop... none required checking whether inet_ntop is declared... yes checking for IPv4 sockets... yes checking for IPv6 sockets... yes checking whether getcwd (NULL, 0) allocates memory for result... yes checking for getcwd with POSIX signature... yes checking whether getdelim is declared... yes checking whether getdtablesize is declared... yes checking type of array argument to getgroups... gid_t checking whether getline is declared... yes checking whether getopt is POSIX compatible... yes checking whether getpass is declared... yes checking whether fflush_unlocked is declared... yes checking whether flockfile is declared... yes checking whether fputs_unlocked is declared... yes checking whether funlockfile is declared... yes checking whether putc_unlocked is declared... yes checking for struct timeval... yes checking for wide-enough struct timeval.tv_sec member... yes checking host CPU and C ABI... x86_64 checking whether ldexp() can be used without linking with libm... yes checking whether limits.h has ULLONG_WIDTH etc.... yes checking for wchar_t... yes checking for max_align_t... yes checking whether NULL can be used in arbitrary expressions... yes checking for ld used by gcc... /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld... yes checking for shared library run path origin... done checking for the common suffixes of directories in the library search path... lib64,lib64 checking whether imported symbols can be declared weak... yes checking whether the linker supports --as-needed... yes checking whether the linker supports --push-state... yes checking for pthread.h... (cached) yes checking for multithread API to use... posix checking whether lstat correctly handles trailing slash... yes checking for a sed that does not truncate output... /usr/bin/sed checking for stdlib.h... (cached) yes checking for GNU libc compatible malloc... yes checking for long long int... yes checking for a traditional japanese locale... ja_JP checking for a transitional chinese locale... zh_CN.GB18030 checking for a french Unicode locale... fr_FR.UTF-8 checking for inline... inline checking for mmap... (cached) yes checking for MAP_ANONYMOUS... yes checking whether memchr works... yes checking whether time_t is signed... yes checking whether alarm is declared... yes checking for working mktime... yes checking whether C symbols are prefixed with underscore at the linker level... no checking for O_CLOEXEC... yes checking for promoted mode_t type... mode_t checking for library containing forkpty... -lutil checking whether strerror(0) succeeds... yes checking for strerror_r with POSIX signature... no checking whether __xpg_strerror_r works... yes checking whether strerror_r is declared... yes checking for external symbol _system_configuration... no checking for library containing setsockopt... none needed checking for sigset_t... yes checking for SIGPIPE... yes checking whether we are using the GNU C Library >= 2.1 or uClibc... yes checking whether <sys/select.h> is self-contained... yes checking whether setenv is declared... yes checking search.h usability... yes checking search.h presence... yes checking for search.h... yes checking for tsearch... yes checking whether snprintf returns a byte count as in C99... yes checking whether snprintf is declared... yes checking for stdbool.h that conforms to C99... yes checking for _Bool... yes checking for wint_t... yes checking whether wint_t is too small... no checking whether stdint.h conforms to C99... yes checking whether stdint.h predates C++11... no checking whether stdint.h has UINTMAX_WIDTH etc.... yes checking whether strdup is declared... yes checking whether strndup is declared... yes checking whether strnlen is declared... yes checking for struct tm.tm_gmtoff... yes checking whether strtok_r is declared... yes checking for struct timespec in <time.h>... yes checking whether ttyname_r is declared... yes checking whether unsetenv is declared... yes checking for inttypes.h... yes checking for stdint.h... yes checking for intmax_t... yes checking where to find the exponent in a 'double'... word 1 bit 20 checking for snprintf... (cached) yes checking for strnlen... yes checking for wcslen... yes checking for wcsnlen... yes checking for mbrtowc... (cached) yes checking for wcrtomb... (cached) yes checking whether _snprintf is declared... no checking whether vsnprintf is declared... yes checking whether strerror_r is declared... (cached) yes checking for strerror_r... (cached) yes checking whether strerror_r returns char *... yes checking for sig_atomic_t... yes checking whether ungetc works on arbitrary bytes... yes checking for inttypes.h... (cached) yes checking whether the inttypes.h PRIxNN macros are broken... no checking where to find the exponent in a 'float'... word 0 bit 23 checking whether byte ordering is bigendian... no checking whether long double and double are the same... no checking for LC_MESSAGES... yes checking for CFPreferencesCopyAppValue... no checking for CFLocaleCopyCurrent... no checking for library containing posix_spawn... none required checking for posix_spawn... yes checking whether posix_spawn works... yes checking whether posix_spawnattr_setschedpolicy is supported... yes checking whether posix_spawnattr_setschedparam is supported... yes checking sys/mkdev.h usability... no checking sys/mkdev.h presence... no checking for sys/mkdev.h... no checking sys/sysmacros.h usability... yes checking sys/sysmacros.h presence... yes checking for sys/sysmacros.h... yes checking for alloca as a compiler built-in... yes checking whether btowc(0) is correct... yes checking whether btowc(EOF) is correct... yes checking for __builtin_expect... yes checking byteswap.h usability... yes checking byteswap.h presence... yes checking for byteswap.h... yes checking for library containing clock_gettime... none required checking for clock_gettime... yes checking for clock_settime... yes checking whether // is distinct from /... (cached) no checking whether dup2 works... yes checking for library containing backtrace_symbols_fd... none required checking whether fflush works on input streams... (cached) no checking whether fcntl handles F_DUPFD correctly... yes checking whether fcntl understands F_DUPFD_CLOEXEC... needs runtime check checking for library containing fdatasync... none required checking whether fflush works on input streams... (cached) no checking for ffs... yes checking for flexible array member... yes checking whether conversion from 'int' to 'long double' works... yes checking for working POSIX fnmatch... yes checking whether fpurge is declared... no checking for fseeko... (cached) yes checking whether fflush works on input streams... (cached) no checking for _fseeki64... no checking for ftello... (cached) yes checking whether ftello works... (cached) yes checking whether __func__ is available... yes checking how to do getaddrinfo, freeaddrinfo and getnameinfo... checking for library containing getaddrinfo... none required checking for getaddrinfo... yes checking whether gai_strerror is declared... yes checking whether gai_strerrorA is declared... no checking for gai_strerror with POSIX signature... yes checking for struct sockaddr.sa_len... no checking whether getaddrinfo is declared... yes checking whether freeaddrinfo is declared... yes checking whether getnameinfo is declared... yes checking for struct addrinfo... yes checking for working getdelim function... yes checking whether getdtablesize works... yes checking for getgroups... yes checking for working getgroups... yes checking whether getgroups handles negative values... yes checking for gethostname... yes checking for HOST_NAME_MAX... yes checking for getline... yes checking for working getline function... yes checking for getpass... yes checking whether gettimeofday clobbers localtime buffer... no checking for gettimeofday with POSIX signature... almost checking for library containing gethostbyname... (cached) none required checking for gethostbyname... (cached) yes checking for library containing inet_ntop... (cached) none required checking whether inet_ntop is declared... (cached) yes checking for library containing inet_pton... none required checking whether inet_pton is declared... yes checking for ioctl... yes checking for ioctl with POSIX signature... no checking whether langinfo.h defines CODESET... yes checking whether langinfo.h defines T_FMT_AMPM... yes checking whether langinfo.h defines ALTMON_1... no checking whether langinfo.h defines ERA... yes checking whether langinfo.h defines YESEXPR... yes checking whether locale.h conforms to POSIX:2001... yes checking whether locale.h defines locale_t... yes checking whether struct lconv is properly defined... yes checking for pthread_rwlock_t... yes checking whether pthread_rwlock_rdlock prefers a writer to a reader... no checking whether lseek detects pipes... yes checking whether mbrtowc handles incomplete characters... yes checking whether mbrtowc works as well as mbtowc... yes checking whether mbrtowc handles a NULL pwc argument... yes checking whether mbrtowc handles a NULL string argument... yes checking whether mbrtowc has a correct return value... yes checking whether mbrtowc returns 0 when parsing a NUL character... yes checking whether mbrtowc works on empty input... yes checking whether the C locale is free of encoding errors... no checking whether mbrtowc handles incomplete characters... (cached) yes checking whether mbrtowc works as well as mbtowc... (cached) yes checking whether mbrtowc handles incomplete characters... (cached) yes checking whether mbrtowc works as well as mbtowc... (cached) yes checking whether mbsrtowcs works... yes checking for mkdtemp... yes checking for __mktime_internal... no checking whether <net/if.h> is self-contained... yes checking whether <netinet/in.h> is self-contained... yes checking whether YESEXPR works... yes checking whether open recognizes a trailing slash... yes checking whether openpty is declared... yes checking for const-safe openpty signature... yes checking for struct msghdr.msg_accrights... no checking whether perror matches strerror... yes checking for sys/pstat.h... no checking for sys/sysmp.h... no checking for sys/sysinfo.h... yes checking for machine/hal_sysinfo.h... no checking for sys/table.h... no checking for sys/param.h... (cached) yes checking for sys/systemcfg.h... no checking for sys/sysctl.h... yes checking for pstat_getstatic... no checking for pstat_getdynamic... no checking for sysmp... no checking for getsysinfo... no checking for sysctl... yes checking for table... no checking for sysinfo... yes checking for struct sysinfo.mem_unit... yes checking for poll... yes checking for a shell that conforms to POSIX... /bin/sh checking whether <pthread.h> pollutes the namespace... no checking for pthread_t... yes checking for pthread_spinlock_t... yes checking for library containing pthread_create and pthread_join... -pthread checking for pthread_sigmask in -pthread -Wl,--push-state -Wl,--no-as-needed -lpthread -Wl,--pop-state... yes checking whether pthread_sigmask is only a macro... no checking whether pthread_sigmask returns error numbers... yes checking whether pthread_sigmask unblocks signals correctly... guessing yes checking for raise... yes checking for sigprocmask... yes checking for rawmemchr... yes checking whether readlink signature is correct... yes checking whether readlink handles trailing slash correctly... yes checking for working re_compile_pattern... yes checking whether select supports a 0 argument... yes checking whether select detects invalid fds... yes checking for library containing getservbyname... (cached) none required checking for getservbyname... (cached) yes checking whether setenv validates arguments... yes checking for struct sigaction.sa_sigaction... yes checking for volatile sig_atomic_t... yes checking for sighandler_t... yes checking for sigprocmask... (cached) yes checking for stdint.h... (cached) yes checking for SIZE_MAX... yes checking whether sleep is declared... yes checking for working sleep... yes checking for snprintf... (cached) yes checking whether snprintf respects a size of 1... yes checking whether printf supports POSIX/XSI format strings with positions... yes checking for socklen_t... yes checking for ssize_t... yes checking whether stat handles trailing slashes on files... yes checking for struct stat.st_atim.tv_nsec... yes checking whether struct stat.st_atim is of type struct timespec... yes checking for struct stat.st_birthtimespec.tv_nsec... no checking for struct stat.st_birthtimensec... no checking for struct stat.st_birthtim.tv_nsec... no checking for working stdalign.h... yes checking for va_copy... yes checking for max_align_t... (cached) yes checking whether NULL can be used in arbitrary expressions... (cached) yes checking which flavor of printf attribute matches inttypes macros... system checking for stpcpy... yes checking for strcasecmp... yes checking for strncasecmp... yes checking whether strncasecmp is declared... yes checking for strchrnul... yes checking whether strchrnul works... yes checking for working strerror function... yes checking for working strndup... yes checking for working strnlen... yes checking for strsep... yes checking for strtok_r... yes checking whether strtok_r works... yes checking whether <sys/ioctl.h> declares ioctl... yes checking for nlink_t... (cached) yes checking for struct utsname... yes checking whether localtime_r is declared... yes checking whether localtime_r is compatible with its POSIX signature... yes checking for ttyname_r... yes checking whether ttyname_r is compatible with its POSIX signature... yes checking whether ttyname_r works with small buffers... guessing yes checking for uname... yes checking for unsetenv... yes checking for unsetenv() return type... int checking whether unsetenv obeys POSIX... yes checking for useconds_t... yes checking whether usleep allows large arguments... yes checking for ptrdiff_t... yes checking for vasprintf... yes checking for vsnprintf... yes checking whether snprintf respects a size of 1... (cached) yes checking whether printf supports POSIX/XSI format strings with positions... (cached) yes checking whether mbrtowc handles incomplete characters... (cached) yes checking whether mbrtowc works as well as mbtowc... (cached) yes checking whether wcrtomb return value is correct... yes checking whether iswcntrl works... yes checking for towlower... yes checking for wctype_t... yes checking for wctrans_t... yes checking for stdint.h... (cached) yes checking for a traditional french locale... (cached) fr_FR checking for a french Unicode locale... (cached) fr_FR.UTF-8 checking for a traditional french locale... (cached) fr_FR checking for a turkish Unicode locale... tr_TR.UTF-8 checking whether dup works... yes checking for error_at_line... yes checking whether fdopen sets errno... yes checking for getpagesize... yes checking whether getpagesize is declared... yes checking whether program_invocation_name is declared... yes checking whether program_invocation_short_name is declared... yes checking whether __argv is declared... no checking for grantpt... yes checking whether byte ordering is bigendian... (cached) no checking whether byte ordering is bigendian... (cached) no checking whether INT32_MAX < INTMAX_MAX... yes checking whether INT64_MAX == LONG_MAX... yes checking whether UINT32_MAX < UINTMAX_MAX... yes checking whether UINT64_MAX == ULONG_MAX... yes checking whether isnan(double) can be used without linking with libm... yes checking where to find the exponent in a 'double'... (cached) word 1 bit 20 checking whether isnan(float) can be used without linking with libm... yes checking whether isnan(float) works... yes checking where to find the exponent in a 'float'... (cached) word 0 bit 23 checking whether isnan(long double) can be used without linking with libm... yes checking whether isnanl works... yes checking where to find the exponent in a 'long double'... word 2 bit 0 checking for setlocale... yes checking for uselocale... yes checking for getlocalename_l... no checking whether NAN macro works... yes checking whether HUGE_VAL works... yes checking for a traditional french locale... (cached) fr_FR checking for a french Unicode locale... (cached) fr_FR.UTF-8 checking for a traditional japanese locale... (cached) ja_JP checking for a transitional chinese locale... (cached) zh_CN.GB18030 checking for a french Unicode locale... (cached) fr_FR.UTF-8 checking for a traditional french locale... (cached) fr_FR checking for a french Unicode locale... (cached) fr_FR.UTF-8 checking for a traditional japanese locale... (cached) ja_JP checking for a transitional chinese locale... (cached) zh_CN.GB18030 checking for mmap... (cached) yes checking for MAP_ANONYMOUS... yes checking for library containing nanosleep... none required checking for working nanosleep... no (mishandles large arguments) checking for library containing if_nameindex... none required checking for a traditional french locale... (cached) fr_FR checking for a french Unicode locale... (cached) fr_FR.UTF-8 checking whether posix_spawn_file_actions_addclose works... yes checking whether posix_spawn_file_actions_adddup2 works... yes checking whether posix_spawn_file_actions_addopen works... yes checking for ptsname... yes checking whether ptsname sets errno on failure... yes checking whether ptsname_r has the same signature as in glibc... yes checking for putenv compatible with GNU and SVID... yes checking for mmap... (cached) yes checking for MAP_ANONYMOUS... yes checking for a traditional french locale... (cached) fr_FR checking for a french Unicode locale... (cached) fr_FR.UTF-8 checking for a traditional japanese locale... (cached) ja_JP checking for a transitional chinese locale... (cached) zh_CN.GB18030 checking for signbit macro... yes checking for signbit compiler built-ins... yes checking for posix_spawnattr_t... yes checking for posix_spawn_file_actions_t... yes checking for mmap... (cached) yes checking for MAP_ANONYMOUS... yes checking whether symlink handles trailing slash correctly... yes checking for pthread_atfork... yes checking for unlockpt... yes checking for waitid... yes checking for a traditional french locale... (cached) fr_FR checking for a french Unicode locale... (cached) fr_FR.UTF-8 checking for a traditional japanese locale... (cached) ja_JP checking for a transitional chinese locale... (cached) zh_CN.GB18030 checking whether wctob works... yes checking whether wctob is declared... yes checking for uid_t in sys/types.h... (cached) yes checking for sys/mkdev.h... (cached) no checking for sys/sysmacros.h... (cached) yes checking how to print strings... printf checking for a sed that does not truncate output... (cached) /usr/bin/sed checking for fgrep... /usr/bin/grep -F checking for ld used by gcc... /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld... yes checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B checking the name lister (/usr/bin/nm -B) interface... BSD nm checking whether ln -s works... yes checking the maximum length of command line arguments... 1572864 checking how to convert x86_64-pc-linux-gnu file names to x86_64-pc-linux-gnu format... func_convert_file_noop checking how to convert x86_64-pc-linux-gnu file names to toolchain format... func_convert_file_noop checking for /usr/bin/ld option to reload object files... -r checking for objdump... objdump checking how to recognize dependent libraries... pass_all checking for dlltool... dlltool checking how to associate runtime and link libraries... printf %s\n checking for archiver @FILE support... @ checking for strip... strip checking for ranlib... (cached) ranlib checking command to parse /usr/bin/nm -B output from gcc object... ok checking for sysroot... no checking for a working dd... /usr/bin/dd checking how to truncate binary pipes... /usr/bin/dd bs=4096 count=1 checking for mt... no checking if : is a manifest tool... no checking for dlfcn.h... yes checking for objdir... .libs checking if gcc supports -fno-rtti -fno-exceptions... no checking for gcc option to produce PIC... -fPIC -DPIC checking if gcc PIC flag -fPIC -DPIC works... yes checking if gcc static flag -static works... no checking if gcc supports -c -o file.o... yes checking if gcc supports -c -o file.o... (cached) yes checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes checking whether -lc should be explicitly linked in... no checking dynamic linker characteristics... GNU/Linux ld.so checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... no checking for ld used by gcc... (cached) /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld... (cached) yes checking for how to mark DSO non-deletable at runtime... -Wl,-z -Wl,nodelete checking for how to set DSO symbol versions... -Wl,--version-script= checking whether C compiler handles -Werror -Wunknown-warning-option... no checking whether the C compiler's -Wformat allows NULL strings... yes checking whether pragma GCC diagnostic push works... yes checking whether the C compiler's -Wlogical-op gives bogus warnings... no checking whether gcc gives bogus warnings for -Wlogical-op... yes checking whether clang gives bogus warnings for -Wdouble-promotion... no checking whether -Wno-missing-field-initializers is supported... yes checking whether -Wno-missing-field-initializers is needed... no checking whether -Wuninitialized is supported... yes checking max safe object size... 9223372036854775807 checking whether C compiler handles -Wframe-larger-than=4096... yes checking whether C compiler handles -Wframe-larger-than=32768... yes checking whether C compiler handles -fno-common... yes checking whether C compiler handles -W... yes checking whether C compiler handles -Waddress... yes checking whether C compiler handles -Waggressive-loop-optimizations... yes checking whether C compiler handles -Wall... yes checking whether C compiler handles -Wattribute-alias... no checking whether C compiler handles -Wattributes... yes checking whether C compiler handles -Wbad-function-cast... yes checking whether C compiler handles -Wbool-compare... yes checking whether C compiler handles -Wbool-operation... yes checking whether C compiler handles -Wbuiltin-declaration-mismatch... yes checking whether C compiler handles -Wbuiltin-macro-redefined... yes checking whether C compiler handles -Wcast-align... yes checking whether C compiler handles -Wcast-align=strict... no checking whether C compiler handles -Wcast-function-type... no checking whether C compiler handles -Wchar-subscripts... yes checking whether C compiler handles -Wclobbered... yes checking whether C compiler handles -Wcomment... yes checking whether C compiler handles -Wcomments... yes checking whether C compiler handles -Wcoverage-mismatch... yes checking whether C compiler handles -Wcpp... yes checking whether C compiler handles -Wdangling-else... yes checking whether C compiler handles -Wdate-time... yes checking whether C compiler handles -Wdeprecated-declarations... yes checking whether C compiler handles -Wdesignated-init... yes checking whether C compiler handles -Wdiscarded-array-qualifiers... yes checking whether C compiler handles -Wdiscarded-qualifiers... yes checking whether C compiler handles -Wdiv-by-zero... yes checking whether C compiler handles -Wdouble-promotion... yes checking whether C compiler handles -Wduplicated-cond... yes checking whether C compiler handles -Wduplicate-decl-specifier... yes checking whether C compiler handles -Wempty-body... yes checking whether C compiler handles -Wendif-labels... yes checking whether C compiler handles -Wexpansion-to-defined... yes checking whether C compiler handles -Wextra... yes checking whether C compiler handles -Wformat-contains-nul... yes checking whether C compiler handles -Wformat-extra-args... yes checking whether C compiler handles -Wformat-security... yes checking whether C compiler handles -Wformat-y2k... yes checking whether C compiler handles -Wformat-zero-length... yes checking whether C compiler handles -Wframe-address... yes checking whether C compiler handles -Wfree-nonheap-object... yes checking whether C compiler handles -Whsa... yes checking whether C compiler handles -Wif-not-aligned... no checking whether C compiler handles -Wignored-attributes... yes checking whether C compiler handles -Wignored-qualifiers... yes checking whether C compiler handles -Wimplicit... yes checking whether C compiler handles -Wimplicit-function-declaration... yes checking whether C compiler handles -Wimplicit-int... yes checking whether C compiler handles -Wincompatible-pointer-types... yes checking whether C compiler handles -Winit-self... yes checking whether C compiler handles -Winline... yes checking whether C compiler handles -Wint-conversion... yes checking whether C compiler handles -Wint-in-bool-context... yes checking whether C compiler handles -Wint-to-pointer-cast... yes checking whether C compiler handles -Winvalid-memory-model... yes checking whether C compiler handles -Winvalid-pch... yes checking whether C compiler handles -Wlogical-not-parentheses... yes checking whether C compiler handles -Wlogical-op... yes checking whether C compiler handles -Wmain... yes checking whether C compiler handles -Wmaybe-uninitialized... yes checking whether C compiler handles -Wmemset-elt-size... yes checking whether C compiler handles -Wmemset-transposed-args... yes checking whether C compiler handles -Wmisleading-indentation... yes checking whether C compiler handles -Wmissing-attributes... no checking whether C compiler handles -Wmissing-braces... yes checking whether C compiler handles -Wmissing-declarations... yes checking whether C compiler handles -Wmissing-field-initializers... yes checking whether C compiler handles -Wmissing-include-dirs... yes checking whether C compiler handles -Wmissing-parameter-type... yes checking whether C compiler handles -Wmissing-prototypes... yes checking whether C compiler handles -Wmultichar... yes checking whether C compiler handles -Wmultistatement-macros... no checking whether C compiler handles -Wnarrowing... yes checking whether C compiler handles -Wnested-externs... yes checking whether C compiler handles -Wnonnull... yes checking whether C compiler handles -Wnonnull-compare... yes checking whether C compiler handles -Wnull-dereference... yes checking whether C compiler handles -Wodr... yes checking whether C compiler handles -Wold-style-declaration... yes checking whether C compiler handles -Wold-style-definition... yes checking whether C compiler handles -Wopenmp-simd... yes checking whether C compiler handles -Woverflow... yes checking whether C compiler handles -Woverride-init... yes checking whether C compiler handles -Wpacked-bitfield-compat... yes checking whether C compiler handles -Wpacked-not-aligned... no checking whether C compiler handles -Wparentheses... yes checking whether C compiler handles -Wpointer-arith... yes checking whether C compiler handles -Wpointer-compare... yes checking whether C compiler handles -Wpointer-sign... yes checking whether C compiler handles -Wpointer-to-int-cast... yes checking whether C compiler handles -Wpragmas... yes checking whether C compiler handles -Wpsabi... yes checking whether C compiler handles -Wrestrict... yes checking whether C compiler handles -Wreturn-local-addr... yes checking whether C compiler handles -Wreturn-type... yes checking whether C compiler handles -Wscalar-storage-order... yes checking whether C compiler handles -Wsequence-point... yes checking whether C compiler handles -Wshadow... yes checking whether C compiler handles -Wshift-count-negative... yes checking whether C compiler handles -Wshift-count-overflow... yes checking whether C compiler handles -Wshift-negative-value... yes checking whether C compiler handles -Wsizeof-array-argument... yes checking whether C compiler handles -Wsizeof-pointer-div... no checking whether C compiler handles -Wsizeof-pointer-memaccess... yes checking whether C compiler handles -Wstrict-aliasing... yes checking whether C compiler handles -Wstrict-prototypes... yes checking whether C compiler handles -Wstringop-truncation... no checking whether C compiler handles -Wsuggest-attribute=cold... no checking whether C compiler handles -Wsuggest-attribute=const... yes checking whether C compiler handles -Wsuggest-attribute=format... yes checking whether C compiler handles -Wsuggest-attribute=malloc... no checking whether C compiler handles -Wsuggest-attribute=noreturn... yes checking whether C compiler handles -Wsuggest-attribute=pure... yes checking whether C compiler handles -Wsuggest-final-methods... yes checking whether C compiler handles -Wsuggest-final-types... yes checking whether C compiler handles -Wswitch... yes checking whether C compiler handles -Wswitch-bool... yes checking whether C compiler handles -Wswitch-unreachable... yes checking whether C compiler handles -Wsync-nand... yes checking whether C compiler handles -Wtautological-compare... yes checking whether C compiler handles -Wtrampolines... yes checking whether C compiler handles -Wtrigraphs... yes checking whether C compiler handles -Wtype-limits... yes checking whether C compiler handles -Wuninitialized... yes checking whether C compiler handles -Wunknown-pragmas... yes checking whether C compiler handles -Wunused... yes checking whether C compiler handles -Wunused-but-set-parameter... yes checking whether C compiler handles -Wunused-but-set-variable... yes checking whether C compiler handles -Wunused-function... yes checking whether C compiler handles -Wunused-label... yes checking whether C compiler handles -Wunused-local-typedefs... yes checking whether C compiler handles -Wunused-parameter... yes checking whether C compiler handles -Wunused-result... yes checking whether C compiler handles -Wunused-value... yes checking whether C compiler handles -Wunused-variable... yes checking whether C compiler handles -Wvarargs... yes checking whether C compiler handles -Wvariadic-macros... yes checking whether C compiler handles -Wvector-operation-performance... yes checking whether C compiler handles -Wvolatile-register-var... yes checking whether C compiler handles -Wwrite-strings... yes checking whether C compiler handles -Walloc-size-larger-than=9223372036854775807... yes checking whether C compiler handles -Warray-bounds=2... yes checking whether C compiler handles -Wformat-overflow=2... yes checking whether C compiler handles -Wformat-truncation=2... yes checking whether C compiler handles -Wimplicit-fallthrough=5... yes checking whether C compiler handles -Wnormalized=nfc... yes checking whether C compiler handles -Wshift-overflow=2... yes checking whether C compiler handles -Wstringop-overflow=2... yes checking whether C compiler handles -Wunused-const-variable=2... yes checking whether C compiler handles -Wvla-larger-than=4031... yes checking whether C compiler handles -Wno-sign-compare... yes checking whether C compiler handles -Wno-cast-function-type... no checking whether C compiler handles -Wjump-misses-init... yes checking whether C compiler handles -Wswitch-enum... yes checking whether C compiler handles -Wno-format-nonliteral... yes checking whether C compiler handles -Wno-format-truncation... yes checking whether C compiler handles -fstack-protector-strong... yes checking whether C compiler handles -fexceptions... yes checking whether C compiler handles -fasynchronous-unwind-tables... yes checking whether C compiler handles -fipa-pure-const... yes checking whether C compiler handles -Wno-suggest-attribute=pure... yes checking whether C compiler handles -Wno-suggest-attribute=const... yes checking whether C compiler handles -Werror... yes checking whether C compiler handles -fPIE -DPIE -pie... yes checking for how to force completely read-only GOT table... -Wl,-z -Wl,relro -Wl,-z -Wl,now checking for how to avoid indirect lib deps... -Wl,--no-copy-dt-needed-entries checking for how to stop undefined symbols at link time... -Wl,-z -Wl,defs checking sys/acl.h usability... yes checking sys/acl.h presence... yes checking for sys/acl.h... yes checking for aa_change_profile in -lapparmor... no checking for pthread_mutexattr_init... yes checking for pthread.h... (cached) yes checking whether pthread_sigmask does anything... yes checking for atomic ops implementation... gcc checking for getxattr in -lattr... yes checking sys/xattr.h usability... yes checking sys/xattr.h presence... yes checking for sys/xattr.h... yes checking for audit_encode_nv_string in -laudit... yes checking libaudit.h usability... yes checking libaudit.h presence... yes checking for libaudit.h... yes checking for pkg-config... /usr/bin/pkg-config checking pkg-config is at least version 0.9.0... yes checking for AVAHI... yes checking for library containing tgetent... -lncurses checking whether rl_completion_quote_character is declared... yes checking for readline in -lreadline... yes checking readline/readline.h usability... yes checking readline/readline.h presence... yes checking for readline/readline.h... yes checking for rl_initialize in -lreadline... yes checking for BASH_COMPLETION... no checking for BLKID... yes checking for capng_updatev in -lcap-ng... yes checking cap-ng.h usability... yes checking cap-ng.h presence... yes checking for cap-ng.h... yes checking for CURL... yes checking for DBUS... yes checking for dbus_watch_get_unix_fd... yes checking for DBusBasicValue... yes checking for DEVMAPPER... yes checking for dlfcn.h... (cached) yes checking for library containing dlopen... -ldl checking for FUSE... yes checking for GLUSTERFS... yes checking for GNUTLS... yes checking for HAL... no checking for LIBISCSI... no checking for NETCF... yes checking for ncf_change_begin... yes checking whether to compile with macvtap support... yes checking whether MACVLAN_MODE_PASSTHRU is declared... yes checking for LIBNL... yes checking for LIBNL_ROUTE3... yes checking for LIBPARTED... yes checking for parted... /sbin/parted checking libpcap pcap-config >= 1.0.0 ... yes checking for LIBSSH... yes checking for ssh_get_server_publickey... no checking for LIBXML... yes checking for struct _xmlURI.query_raw... yes checking whether to compile with macvtap support... yes checking whether MACVLAN_MODE_PASSTHRU is declared... (cached) yes checking for NETCF... yes checking for ncf_change_begin... (cached) yes checking for gettext... yes checking libintl.h usability... yes checking libintl.h presence... yes checking for libintl.h... yes checking for xgettext... xgettext checking for msgfmt... msgfmt checking for msgmerge... msgmerge checking msgfmt is GNU tool... yes checking for numa_available in -lnuma... yes checking numa.h usability... yes checking numa.h presence... yes checking for numa.h... yes checking for numa_bitmask_isbitset in -lnuma... yes checking for OPENWSMAN... yes checking for PCIACCESS... yes checking for init script type... systemd checking for pkcheck... /usr/bin/pkcheck checking for pthread_mutexattr_init... (cached) yes checking for pthread.h... (cached) yes checking whether pthread_sigmask does anything... (cached) yes checking for library containing tgetent... (cached) -lncurses checking whether rl_completion_quote_character is declared... (cached) yes checking for readline in -lreadline... (cached) yes checking for readline/readline.h... (cached) yes checking for rl_initialize in -lreadline... (cached) yes checking for sanlock_init in -lsanlock_client... yes checking sanlock.h usability... yes checking sanlock.h presence... yes checking for sanlock.h... yes checking whether SANLK_INQ_WAIT is declared... yes checking for sanlock_killpath in -lsanlock_client... yes checking for sanlock_inq_lockspace in -lsanlock_client... yes checking for sanlock_write_lockspace in -lsanlock_client... yes checking for sanlock_strerror in -lsanlock_client... yes checking for sasl_client_init in -lsasl2... yes checking sasl/sasl.h usability... yes checking sasl/sasl.h presence... yes checking for sasl/sasl.h... yes checking for fgetfilecon_raw in -lselinux... yes checking selinux/selinux.h usability... yes checking selinux/selinux.h presence... yes checking for selinux/selinux.h... yes checking for selinux setcon parameter type... const checking for selinux selabel_open parameter type... const checking SELinux mount point... /selinux checking selinux/label.h usability... yes checking selinux/label.h presence... yes checking for selinux/label.h... yes checking for SSH2... yes checking for UDEV... yes checking for udev_monitor_set_receive_buffer_size... yes checking whether to compile with virtual port support... yes checking for WIRESHARK_DISSECTOR... yes checking for xdrmem_create in -lportablexdr... no checking for library containing xdrmem_create... none required checking for xdr_u_int64_t... no checking where to find <rpc/rpc.h>... none checking for qemu-kvm... no checking for qemu... no checking for kvm... no checking for qemu-system-x86_64... no checking for yajl_parse_complete in -lyajl... no checking for yajl_tree_parse in -lyajl... yes checking yajl/yajl_common.h usability... yes checking yajl/yajl_common.h presence... yes checking for yajl/yajl_common.h... yes checking size of long... 8 checking pwd.h usability... yes checking pwd.h presence... yes checking for pwd.h... yes checking regex.h usability... yes checking regex.h presence... yes checking for regex.h... yes checking sys/un.h usability... yes checking sys/un.h presence... yes checking for sys/un.h... yes checking sys/poll.h usability... yes checking sys/poll.h presence... yes checking for sys/poll.h... yes checking syslog.h usability... yes checking syslog.h presence... yes checking for syslog.h... yes checking mntent.h usability... yes checking mntent.h presence... yes checking for mntent.h... yes checking net/ethernet.h usability... yes checking net/ethernet.h presence... yes checking for net/ethernet.h... yes checking linux/magic.h usability... yes checking linux/magic.h presence... yes checking for linux/magic.h... yes checking for sys/un.h... (cached) yes checking sys/syscall.h usability... yes checking sys/syscall.h presence... yes checking for sys/syscall.h... yes checking for sys/sysctl.h... (cached) yes checking netinet/tcp.h usability... yes checking netinet/tcp.h presence... yes checking for netinet/tcp.h... yes checking ifaddrs.h usability... yes checking ifaddrs.h presence... yes checking for ifaddrs.h... yes checking libtasn1.h usability... yes checking libtasn1.h presence... yes checking for libtasn1.h... yes checking sys/ucred.h usability... no checking sys/ucred.h presence... no checking for sys/ucred.h... no checking sys/mount.h usability... yes checking sys/mount.h presence... yes checking for sys/mount.h... yes checking stdarg.h usability... yes checking stdarg.h presence... yes checking for stdarg.h... yes checking whether htole64 is declared... yes checking for stat... yes checking for stat64... yes checking for __xstat... yes checking for __xstat64... yes checking for lstat... (cached) yes checking for lstat64... yes checking for __lxstat... yes checking for __lxstat64... yes checking for struct ifreq... yes checking for struct sockpeercred... no checking whether ETH_FLAG_TXVLAN is declared... yes checking whether ETH_FLAG_NTUPLE is declared... yes checking whether ETH_FLAG_RXHASH is declared... yes checking whether ETH_FLAG_LRO is declared... yes checking whether ETHTOOL_GGSO is declared... yes checking whether ETHTOOL_GGRO is declared... yes checking whether ETHTOOL_GFLAGS is declared... yes checking whether ETHTOOL_GFEATURES is declared... yes checking whether ETHTOOL_SCOALESCE is declared... yes checking whether ETHTOOL_GCOALESCE is declared... yes checking whether SEEK_HOLE is declared... yes checking for gettext in -lintl... no checking for rpcgen... /usr/bin/rpcgen checking for xmllint... /usr/bin/xmllint checking for xsltproc... /usr/bin/xsltproc checking for augparse... /usr/bin/augparse checking whether ln -s works... yes checking for dmidecode... dmidecode checking for dnsmasq... /sbin/dnsmasq checking for radvd... /sbin/radvd checking for tc... tc checking for udevadm... /usr/bin/udevadm checking for udevsettle... no checking for modprobe... /sbin/modprobe checking for rmmod... /sbin/rmmod checking for mm-ctl... mm-ctl checking for ovs-vsctl... ovs-vsctl checking for scrub... /usr/bin/scrub checking for addr2line... /usr/bin/addr2line checking for ip... /sbin/ip checking for iptables... /sbin/iptables checking for ip6tables... /sbin/ip6tables checking for ebtables... /sbin/ebtables checking for qemu-bridge-helper... /usr/libexec/qemu-bridge-helper checking for qemu-pr-helper... /usr/bin/qemu-pr-helper checking for xen_vm_start in -lxenserver... no checking for LIBXL... no checking for libxl_ctx_alloc in -lxenlight... yes checking libxl.h usability... yes checking libxl.h presence... yes checking for libxl.h... yes checking libxlutil.h usability... yes checking libxlutil.h presence... yes checking for libxlutil.h... yes checking for xtl_createlogger_stdiostream in -lxentoollog... yes checking for libxl_domain_config_from_json... yes checking for PARALLELS_SDK... no checking for bhyve... no checking for bhyvectl... no checking for bhyveload... no checking sys/inotify.h usability... yes checking sys/inotify.h presence... yes checking for sys/inotify.h... yes checking for dtrace... /usr/bin/dtrace checking for numad... /usr/bin/numad checking for init script type... systemd checking for whether to install sysctl config... yes checking nss.h usability... yes checking nss.h presence... yes checking for nss.h... yes checking for struct gaih_addrtuple... yes checking for ns_mtab... no checking for nss_module_unregister_fn... no checking linux/kvm.h usability... yes checking linux/kvm.h presence... yes checking for linux/kvm.h... yes checking whether <linux/*.h> and <netinet/*.h> headers are compatible... yes checking for linux/param.h... yes checking for linux/sockios.h... yes checking for linux/if_bridge.h... yes checking for linux/if_tun.h... yes checking for pkg-config... (cached) /usr/bin/pkg-config checking pkg-config is at least version 0.9.0... yes checking for selinux_virtual_domain_context_path... yes checking for selinux_virtual_image_context_path... yes checking for selinux_lxc_contexts_path... yes checking for mntent.h... (cached) yes checking for mount... /usr/bin/mount checking for umount... /usr/bin/umount checking for mkfs... /sbin/mkfs checking for showmount... /sbin/showmount checking for pvcreate... /sbin/pvcreate checking for vgcreate... /sbin/vgcreate checking for lvcreate... /sbin/lvcreate checking for pvremove... /sbin/pvremove checking for vgremove... /sbin/vgremove checking for lvremove... /sbin/lvremove checking for lvchange... /sbin/lvchange checking for vgchange... /sbin/vgchange checking for vgscan... /sbin/vgscan checking for pvs... /sbin/pvs checking for vgs... /sbin/vgs checking for lvs... /sbin/lvs checking for iscsiadm... /sbin/iscsiadm checking rbd/librbd.h usability... yes checking rbd/librbd.h presence... yes checking for rbd/librbd.h... yes checking for rbd_get_features... yes checking for collie... no checking for dog... /usr/bin/dog checking for zfs... /sbin/zfs checking for zpool... /sbin/zpool checking for vstorage... no checking for vstorage-mount... no checking for umount... (cached) /usr/bin/umount checking linux/btrfs.h usability... yes checking linux/btrfs.h presence... yes checking for linux/btrfs.h... yes checking xfs/xfs.h usability... no checking xfs/xfs.h presence... no checking for xfs/xfs.h... no checking linux/devlink.h usability... yes checking linux/devlink.h presence... yes checking for linux/devlink.h... yes checking whether DEVLINK_CMD_ESWITCH_GET is declared... yes checking whether VHOST_VSOCK_SET_GUEST_CID is declared... yes checking for python3... /usr/bin/python3 checking for perl... /usr/bin/perl checking Whether to build test suite by default... yes checking whether GET_VLAN_VID_CMD is declared... yes checking for struct ifreq.ifr_newname... yes checking for struct ifreq.ifr_ifindex... yes checking for struct ifreq.ifr_index... no checking for struct ifreq.ifr_hwaddr... yes checking whether BRDGSFD is declared... no checking whether BRDGADD is declared... no checking whether BRDGDEL is declared... no checking whether cpuset_getaffinity is declared... no checking for struct if_data.ifi_oqdrops... no checking whether clock_serv_t is declared... no checking whether host_get_clock_service is declared... no checking whether clock_get_time is declared... no checking whether this build is done by a static analysis tool... no checking that generated files are newer than configure... done configure: creating ./config.status config.status: creating run config.status: creating Makefile config.status: creating src/Makefile config.status: creating include/libvirt/Makefile config.status: creating docs/Makefile config.status: creating gnulib/lib/Makefile config.status: creating gnulib/tests/Makefile config.status: creating .color_coded config.status: creating .ycm_extra_conf.py config.status: creating libvirt.pc config.status: creating libvirt-qemu.pc config.status: creating libvirt-lxc.pc config.status: creating libvirt-admin.pc config.status: creating src/libvirt.pc config.status: creating src/libvirt-qemu.pc config.status: creating src/libvirt-lxc.pc config.status: creating libvirt.spec config.status: creating mingw-libvirt.spec config.status: creating po/Makefile config.status: creating include/libvirt/libvirt-common.h config.status: creating examples/Makefile config.status: creating tests/Makefile config.status: creating tools/Makefile config.status: creating config.h config.status: executing depfiles commands config.status: executing libtool commands configure: configure: Configuration summary configure: ===================== configure: configure: Drivers configure: configure: QEMU: yes configure: UML: yes configure: OpenVZ: yes configure: VMware: yes configure: VBox: yes configure: XenAPI: no configure: libxl: yes configure: LXC: yes configure: PHYP: yes configure: ESX: yes configure: Hyper-V: yes configure: vz: no configure: Bhyve: no configure: Test: yes configure: Remote: yes configure: Network: yes configure: Libvirtd: yes configure: Interface: yes configure: configure: Storage Drivers configure: configure: Dir: yes configure: FS: yes configure: NetFS: yes configure: LVM: yes configure: iSCSI: yes configure: iscsi-direct: no configure: SCSI: yes configure: mpath: yes configure: Disk: yes configure: RBD: yes configure: Sheepdog: yes configure: Gluster: yes configure: ZFS: yes configure: Virtuozzo storage: no configure: configure: Security Drivers configure: configure: SELinux: yes configure: AppArmor: no configure: configure: Driver Loadable Modules configure: configure: driver_modules: yes (CFLAGS='' LIBS='-ldl') configure: configure: Libraries configure: configure: acl: yes (CFLAGS='' LIBS='-lacl') configure: apparmor: no configure: attr: yes (CFLAGS='' LIBS='-lattr') configure: audit: yes (CFLAGS='' LIBS='-laudit') configure: avahi: yes (CFLAGS='-D_REENTRANT ' LIBS='-lavahi-common -lavahi-client ') configure: bash_completion: no configure: blkid: yes (CFLAGS='-I/usr/include/blkid -I/usr/include/uuid ' LIBS='-lblkid ') configure: capng: yes (CFLAGS='' LIBS='-lcap-ng') configure: curl: yes (CFLAGS='-DCURL_DISABLE_TYPECHECK ' LIBS='-lcurl ') configure: dbus: yes (CFLAGS='-I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include ' LIBS='-ldbus-1 ') configure: dlopen: yes (CFLAGS='' LIBS='-ldl') configure: firewalld: yes (CFLAGS='' LIBS='') configure: fuse: yes (CFLAGS='-I/usr/include/fuse -D_FILE_OFFSET_BITS=64 ' LIBS='-lfuse -pthread ') configure: glusterfs: yes (CFLAGS='-I/usr/include/glusterfs -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -DUSE_POSIX_ACLS=1 -I/usr/include/uuid ' LIBS='-lacl -lgfapi -lglusterfs -lgfrpc -lgfxdr -luuid ') configure: gnutls: yes (CFLAGS='-I/usr/include/p11-kit-1 ' LIBS='-lgnutls ') configure: hal: no configure: libiscsi: no configure: libnl: yes (CFLAGS='-I/usr/include/libnl3 -I/usr/include/libnl3 ' LIBS='-lnl-3 -lnl-route-3 -lnl-3 ') configure: libpcap: yes (CFLAGS='' LIBS='-lpcap') configure: libssh: yes (CFLAGS='' LIBS='-lssh ') configure: libxl: yes (CFLAGS=' -DLIBXL_API_VERSION=0x040400' LIBS='-lxenlight -lxlutil -lxenstore -lxentoollog') configure: libxml: yes (CFLAGS='-I/usr/include/libxml2 ' LIBS='-lxml2 ') configure: macvtap: yes (CFLAGS='' LIBS='') configure: netcf: yes (CFLAGS='' LIBS='-lnetcf ') configure: NLS: yes configure: nss: yes configure: numactl: yes (CFLAGS='' LIBS='-lnuma') configure: openwsman: yes (CFLAGS='-I/usr/include/openwsman ' LIBS='-lwsman -lwsman_client -lwsman_curl_client_transport ') configure: pciaccess: yes (CFLAGS='' LIBS='-lpciaccess ') configure: pm_utils: no configure: polkit: yes configure: rbd: yes (CFLAGS='' LIBS='-lrbd -lrados') configure: readline: yes (CFLAGS='-D_FUNCTION_DEF ' LIBS='-lreadline') configure: sanlock: yes (CFLAGS='' LIBS='-lsanlock_client') configure: sasl: yes (CFLAGS='' LIBS='-lsasl2') configure: selinux: yes (CFLAGS='' LIBS='-lselinux') configure: ssh2: yes (CFLAGS='' LIBS='-lssh2 ') configure: udev: yes (CFLAGS='' LIBS='-ludev ') configure: virtualport: yes (CFLAGS='' LIBS='') configure: xdr: yes (CFLAGS='' LIBS='') configure: xenapi: no configure: yajl: yes (CFLAGS='' LIBS='-lyajl') configure: configure: Windows configure: configure: Cygwin: no configure: MinGW: no configure: MSVC: no configure: windres: no configure: configure: Test suite configure: configure: Coverage: no configure: Alloc OOM: no configure: configure: Miscellaneous configure: configure: Debug: yes configure: Use -Werror: yes configure: Warning Flags: -fno-common -W -Waddress -Waggressive-loop-optimizations -Wall -Wattributes -Wbad-function-cast -Wbool-compare -Wbool-operation -Wbuiltin-declaration-mismatch -Wbuiltin-macro-redefined -Wcast-align -Wchar-subscripts -Wclobbered -Wcomment -Wcomments -Wcoverage-mismatch -Wcpp -Wdangling-else -Wdate-time -Wdeprecated-declarations -Wdesignated-init -Wdiscarded-array-qualifiers -Wdiscarded-qualifiers -Wdiv-by-zero -Wdouble-promotion -Wduplicated-cond -Wduplicate-decl-specifier -Wempty-body -Wendif-labels -Wexpansion-to-defined -Wextra -Wformat-contains-nul -Wformat-extra-args -Wformat-security -Wformat-y2k -Wformat-zero-length -Wframe-address -Wfree-nonheap-object -Whsa -Wignored-attributes -Wignored-qualifiers -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wincompatible-pointer-types -Winit-self -Winline -Wint-conversion -Wint-in-bool-context -Wint-to-pointer-cast -Winvalid-memory-model -Winvalid-pch -Wlogical-not-parentheses -Wlogical-op -Wmain -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation -Wmissing-braces -Wmissing-declarations -Wmissing-field-initializers -Wmissing-include-dirs -Wmissing-parameter-type -Wmissing-prototypes -Wmultichar -Wnarrowing -Wnested-externs -Wnonnull -Wnonnull-compare -Wnull-dereference -Wodr -Wold-style-declaration -Wold-style-definition -Wopenmp-simd -Woverflow -Woverride-init -Wpacked-bitfield-compat -Wparentheses -Wpointer-arith -Wpointer-compare -Wpointer-sign -Wpointer-to-int-cast -Wpragmas -Wpsabi -Wrestrict -Wreturn-local-addr -Wreturn-type -Wscalar-storage-order -Wsequence-point -Wshadow -Wshift-count-negative -Wshift-count-overflow -Wshift-negative-value -Wsizeof-array-argument -Wsizeof-pointer-memaccess -Wstrict-aliasing -Wstrict-prototypes -Wsuggest-attribute=const -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wsuggest-attribute=pure -Wsuggest-final-methods -Wsuggest-final-types -Wswitch -Wswitch-bool -Wswitch-unreachable -Wsync-nand -Wtautological-compare -Wtrampolines -Wtrigraphs -Wtype-limits -Wuninitialized -Wunknown-pragmas -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-parameter -Wunused-result -Wunused-value -Wunused-variable -Wvarargs -Wvariadic-macros -Wvector-operation-performance -Wvolatile-register-var -Wwrite-strings -Walloc-size-larger-than=9223372036854775807 -Warray-bounds=2 -Wformat-overflow=2 -Wformat-truncation=2 -Wimplicit-fallthrough=5 -Wnormalized=nfc -Wshift-overflow=2 -Wstringop-overflow=2 -Wunused-const-variable=2 -Wvla-larger-than=4031 -Wno-sign-compare -Wjump-misses-init -Wswitch-enum -Wno-format-nonliteral -Wno-format-truncation -fstack-protector-strong -fexceptions -fasynchronous-unwind-tables -fipa-pure-const -Wno-suggest-attribute=pure -Wno-suggest-attribute=const -Werror configure: DTrace: yes configure: numad: yes configure: Init script: systemd configure: Char device locks: /var/lock configure: Default Editor: vi configure: Loader/NVRAM: configure: virt-login-shell: yes configure: virt-host-validate: yes configure: TLS priority: NORMAL configure: configure: Developer Tools configure: configure: wireshark_dissector: yes (CFLAGS='-I/usr/include/wireshark -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -pthread ' LIBS='-lwireshark -Wl,--export-dynamic -lgmodule-2.0 -lgthread-2.0 -pthread -lglib-2.0 ') configure: configure: Privileges configure: configure: QEMU: root:root configure: Now type 'make' to compile libvirt. GEN spacing-check Curly brackets around single-line body: src/conf/domain_addr.c:198-200: if (virDomainZPCIAddressReserveUid(zpciIds->uids, addr) < 0) { return -1; } maint.mk: incorrect formatting make: *** [cfg.mk:1129: spacing-check] Error 1 real 10m43.680s user 9m0.399s sys 3m55.869s === OUTPUT END === Test command exited with code: 2 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@redhat.com

Hi @Andrea, Is there any chance that these patches catch up with 4.7.0 release? I see it's entering freeze. Expecting your comments. Thanks very much! Yi Min 在 2018/8/27 下午1:48, Yi Min Zhao 写道:
Abstract ======== The PCI representation in QEMU has recently been extended for S390 allowing configuration of zPCI attributes like uid (user-defined identifier) and fid (PCI function identifier). The details can be found here: https://lists.gnu.org/archive/html/qemu-devel/2016-06/msg07262.html
To support the new zPCI feature of the S390 platform, two new XML attributes, @uid and @fid, are introduced for device addresses of type 'pci', i.e.: <hostdev mode='subsystem' type='pci'> <driver name='vfio'/> <source> <address domain='0x0001' bus='0x00' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' uid='0x0003' fid='0x00000027'/> </hostdev>
uid and fid are optional attributes. If they are defined by the user, unique values within the guest domain must be used. If they are not specified and the architecture requires them, they are automatically generated with non-conflicting values.
Current implementation is the most seamless one for the user as it unites the address specific data of a PCI device on one XML element. It could accommodate both specifying our special parameters (uid and fid) and re-using standard statements (domain, bus, slot and function) for PCI devices. User can still specify bus/slot/function for the virtualized PCI devices in the XML.
Thus uid/fid act as an extension to the PCI address and are stored in a new structure 'virZPCIDeviceAddress' which is a member of common PCI Address structure. Additionally, two hashtables are used for assignment and reservation of uid/fid.
In support of extending the PCI address, a new PCI address extension flag is introduced. This extension flag allows is not only dedicated for the S390 platform but also other architectures needing certain extensions to PCI address space.
Code Base ========= commit in master: 3b89e1f962 docs: api_extension: Don't encourage other tools than git
Change Log ========== v3->v4: 1. Update docs. 2. Format code style. 3. Optimize zPCI support check. 4. Move the check of zPCI defined in xml but unsupported by Qemu to qemuDomainDeviceDefValidate(). 5. Change zpci address member of PCI address struct from pointer to instance. 6. Modify zpci address definition principle. Currently the user must either define both of uid and fid or not.
v2->v3: 1. Revise code style. 2. Update test cases. 3. Introduce qemuDomainCollectPCIAddressExtension() to collect PCI extension addresses. 4. Introduce virDeviceInfoPCIAddressExtensionPresent() to check if zPCI address exists. 5. Optimize zPCI address check logic. 6. Optimize passed parameters of zPCI addr alloc/release/reserve functions. 7. Report enum range error in qemuDomainDeviceSupportZPCI(). 8. Update commit messages.
v1->v2: 1. Separate test commit and merge testcases into corresponding commits that introduce the functionalities firstly. 2. Spare some checks for zpci device. 3. Add vsock and controller support. 4. Add uin32 type schema. 5. Rename zpciuid and zpcifid to zpci_uid and zpci_fid. 6. Always return multibus support on S390.
Yi Min Zhao (12): conf: Add definitions for 'uid' and 'fid' PCI address attributes qemu: Introduce zPCI capability conf: Introduce a new PCI address extension flag qemu: Enable PCI multi bus for S390 guests qemu: Auto add pci-root for s390/s390x guests conf: Introduce address caching for PCI extensions conf: Introduce parser, formatter for uid and fid conf: Allocate/release 'uid' and 'fid' in PCI address qemu: Generate and use zPCI device in QEMU command line qemu: Add hotpluging support for PCI devices on S390 guests docs: Add 'uid' and 'fid' information news: Update news for PCI address extension attributes
cfg.mk | 1 + docs/formatdomain.html.in | 9 +- docs/news.xml | 10 + docs/schemas/basictypes.rng | 23 ++ docs/schemas/domaincommon.rng | 1 + src/conf/device_conf.c | 62 ++++ src/conf/device_conf.h | 14 + src/conf/domain_addr.c | 331 +++++++++++++++++++++ src/conf/domain_addr.h | 29 ++ src/conf/domain_conf.c | 6 + src/libvirt_private.syms | 4 + src/qemu/qemu_capabilities.c | 6 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 95 ++++++ src/qemu/qemu_command.h | 2 + src/qemu/qemu_domain.c | 27 ++ src/qemu/qemu_domain_address.c | 205 ++++++++++++- src/qemu/qemu_hotplug.c | 151 +++++++++- src/util/virpci.h | 11 + tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.12.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml | 1 + tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml | 1 + tests/qemuxml2argvdata/disk-virtio-s390-zpci.args | 26 ++ tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml | 17 ++ .../hostdev-vfio-zpci-autogenerate.args | 25 ++ .../hostdev-vfio-zpci-autogenerate.xml | 18 ++ .../hostdev-vfio-zpci-boundaries.args | 29 ++ .../hostdev-vfio-zpci-boundaries.xml | 26 ++ .../hostdev-vfio-zpci-multidomain-many.args | 39 +++ .../hostdev-vfio-zpci-multidomain-many.xml | 67 +++++ tests/qemuxml2argvdata/hostdev-vfio-zpci.args | 25 ++ tests/qemuxml2argvdata/hostdev-vfio-zpci.xml | 19 ++ tests/qemuxml2argvtest.c | 20 ++ tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml | 29 ++ .../hostdev-vfio-zpci-autogenerate.xml | 30 ++ .../hostdev-vfio-zpci-boundaries.xml | 42 +++ .../hostdev-vfio-zpci-multidomain-many.xml | 79 +++++ tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml | 30 ++ tests/qemuxml2xmltest.c | 17 ++ 42 files changed, 1518 insertions(+), 14 deletions(-) create mode 100644 tests/qemuxml2argvdata/disk-virtio-s390-zpci.args create mode 100644 tests/qemuxml2argvdata/disk-virtio-s390-zpci.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-autogenerate.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-boundaries.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci-multidomain-many.xml create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci.args create mode 100644 tests/qemuxml2argvdata/hostdev-vfio-zpci.xml create mode 100644 tests/qemuxml2xmloutdata/disk-virtio-s390-zpci.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-autogenerate.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-boundaries.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci-multidomain-many.xml create mode 100644 tests/qemuxml2xmloutdata/hostdev-vfio-zpci.xml
-- Yi Min

On Wed, 2018-08-29 at 13:32 +0800, Yi Min Zhao wrote:
Hi @Andrea,
Is there any chance that these patches catch up with 4.7.0 release?
I see it's entering freeze.
We're already frozen, which means only fixes can be merged. I'll review the patches in the next few days and if everything is fine we can push them as soon as the tree opens again, which is good because it gives us plenty of time to spot any lingering issues. -- Andrea Bolognani / Red Hat / Virtualization

在 2018/8/29 下午4:19, Andrea Bolognani 写道:
On Wed, 2018-08-29 at 13:32 +0800, Yi Min Zhao wrote:
Hi @Andrea,
Is there any chance that these patches catch up with 4.7.0 release?
I see it's entering freeze. We're already frozen, which means only fixes can be merged.
I'll review the patches in the next few days and if everything is fine we can push them as soon as the tree opens again, which is good because it gives us plenty of time to spot any lingering issues.
Got it. Thanks for your effort! -- Yi Min
participants (3)
-
Andrea Bolognani
-
no-reply@patchew.org
-
Yi Min Zhao