[libvirt] [PATCH v5 00/13] PCI passthrough support on s390

Yi Min Zhao zyimin at linux.ibm.com
Tue Sep 4 08:39:42 UTC 2018


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:
2f6ff0da5b qemu: Don't overwrite stats in qemuDomainBlocksStatsGather

Change Log
==========
v4->v5:
1. Update the version number.
2. Fixup code style error.
3. Separate qemu code into single patch.
4. Rebase the patches to the new code of master branch.

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 (13):
  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
  qemu: Add zPCI address definition check
  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                             |  76 +++++
 src/conf/device_conf.h                             |   4 +
 src/conf/domain_addr.c                             | 330 +++++++++++++++++++++
 src/conf/domain_addr.h                             |  29 ++
 src/conf/domain_conf.c                             |   6 +
 src/libvirt_private.syms                           |   6 +
 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, 1523 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




More information about the libvir-list mailing list