From: Zhenzhong Duan <zhenzhong.duan@intel.com>
To: qemu-devel@nongnu.org
Cc: alex.williamson@redhat.com, clg@redhat.com, jgg@nvidia.com,
nicolinc@nvidia.com, joao.m.martins@oracle.com,
eric.auger@redhat.com, peterx@redhat.com, jasowang@redhat.com,
kevin.tian@intel.com, yi.l.liu@intel.com, yi.y.sun@intel.com,
chao.p.peng@intel.com, Zhenzhong Duan <zhenzhong.duan@intel.com>
Subject: [PATCH v3 31/37] vfio/pci: Adapt vfio pci hot reset support with iommufd BE
Date: Thu, 26 Oct 2023 18:30:58 +0800 [thread overview]
Message-ID: <20231026103104.1686921-32-zhenzhong.duan@intel.com> (raw)
In-Reply-To: <20231026103104.1686921-1-zhenzhong.duan@intel.com>
As pci hot reset path need to reference pci specific functions
and data structures, adding container level callback functions
for legacy and iommufd BE and referencing those pci specific
func/data is no better than implementing reset support with
iommufd BE directly in pci.c
This way we can also share the common bus reset and system reset
path for both BEs.
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
---
hw/vfio/pci.c | 156 ++++++++++++++++++++++++++++++++++++++++++-
hw/vfio/trace-events | 1 +
2 files changed, 156 insertions(+), 1 deletion(-)
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index c17e1f4376..d7a41c8def 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -42,6 +42,7 @@
#include "qapi/error.h"
#include "migration/blocker.h"
#include "migration/qemu-file.h"
+#include "linux/iommufd.h"
#define TYPE_VFIO_PCI_NOHOTPLUG "vfio-pci-nohotplug"
@@ -2497,7 +2498,7 @@ static int vfio_pci_get_pci_hot_reset_info(VFIOPCIDevice *vdev,
return 0;
}
-static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single)
+static int vfio_pci_hot_reset_legacy(VFIOPCIDevice *vdev, bool single)
{
VFIOGroup *group;
struct vfio_pci_hot_reset_info *info = NULL;
@@ -2661,6 +2662,159 @@ out_single:
return ret;
}
+#ifdef CONFIG_IOMMUFD
+static VFIODevice *vfio_pci_find_by_iommufd_devid(__u32 devid)
+{
+ VFIODevice *vbasedev_iter;
+
+ QLIST_FOREACH(vbasedev_iter, &vfio_device_list, global_next) {
+ if (vbasedev_iter->bcontainer->ops != &vfio_iommufd_ops) {
+ continue;
+ }
+ if (devid == vbasedev_iter->devid) {
+ return vbasedev_iter;
+ }
+ }
+ return NULL;
+}
+
+static int vfio_pci_hot_reset_iommufd(VFIOPCIDevice *vdev, bool single)
+{
+ struct vfio_pci_hot_reset_info *info = NULL;
+ struct vfio_pci_dependent_device *devices;
+ struct vfio_pci_hot_reset *reset;
+ int ret, i;
+ bool multi = false;
+
+ trace_vfio_pci_hot_reset(vdev->vbasedev.name, single ? "one" : "multi");
+
+ if (!single) {
+ vfio_pci_pre_reset(vdev);
+ }
+ vdev->vbasedev.needs_reset = false;
+
+ ret = vfio_pci_get_pci_hot_reset_info(vdev, &info);
+
+ if (ret) {
+ goto out_single;
+ }
+
+ assert(info->flags & VFIO_PCI_HOT_RESET_FLAG_DEV_ID);
+
+ devices = &info->devices[0];
+
+ if (!(info->flags & VFIO_PCI_HOT_RESET_FLAG_DEV_ID_OWNED)) {
+ if (!vdev->has_pm_reset) {
+ for (i = 0; i < info->count; i++) {
+ if (devices[i].devid == VFIO_PCI_DEVID_NOT_OWNED) {
+ error_report("vfio: Cannot reset device %s, "
+ "depends on device %04x:%02x:%02x.%x "
+ "which is not owned.",
+ vdev->vbasedev.name, devices[i].segment,
+ devices[i].bus, PCI_SLOT(devices[i].devfn),
+ PCI_FUNC(devices[i].devfn));
+ }
+ }
+ }
+ ret = -EPERM;
+ goto out_single;
+ }
+
+ trace_vfio_pci_hot_reset_has_dep_devices(vdev->vbasedev.name);
+
+ for (i = 0; i < info->count; i++) {
+ VFIOPCIDevice *tmp;
+ VFIODevice *vbasedev_iter;
+
+ trace_vfio_pci_hot_reset_dep_devices_iommufd(devices[i].segment,
+ devices[i].bus,
+ PCI_SLOT(devices[i].devfn),
+ PCI_FUNC(devices[i].devfn),
+ devices[i].devid);
+
+ /*
+ * If a VFIO cdev device is resettable, all the dependent devices
+ * are either bound to same iommufd or within same iommu_groups as
+ * one of the iommufd bound devices.
+ */
+ assert(devices[i].devid != VFIO_PCI_DEVID_NOT_OWNED);
+
+ if (devices[i].devid == vdev->vbasedev.devid ||
+ devices[i].devid == VFIO_PCI_DEVID_OWNED) {
+ continue;
+ }
+
+ vbasedev_iter = vfio_pci_find_by_iommufd_devid(devices[i].devid);
+ if (!vbasedev_iter || !vbasedev_iter->dev->realized ||
+ vbasedev_iter->type != VFIO_DEVICE_TYPE_PCI) {
+ continue;
+ }
+ tmp = container_of(vbasedev_iter, VFIOPCIDevice, vbasedev);
+ if (single) {
+ ret = -EINVAL;
+ goto out_single;
+ }
+ vfio_pci_pre_reset(tmp);
+ tmp->vbasedev.needs_reset = false;
+ multi = true;
+ }
+
+ if (!single && !multi) {
+ ret = -EINVAL;
+ goto out_single;
+ }
+
+ /* Use zero length array for hot reset with iommufd backend */
+ reset = g_malloc0(sizeof(*reset));
+ reset->argsz = sizeof(*reset);
+
+ /* Bus reset! */
+ ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_PCI_HOT_RESET, reset);
+ g_free(reset);
+
+ trace_vfio_pci_hot_reset_result(vdev->vbasedev.name,
+ ret ? strerror(errno) : "Success");
+
+ /* Re-enable INTx on affected devices */
+ for (i = 0; i < info->count; i++) {
+ VFIOPCIDevice *tmp;
+ VFIODevice *vbasedev_iter;
+
+ if (devices[i].devid == vdev->vbasedev.devid ||
+ devices[i].devid == VFIO_PCI_DEVID_OWNED) {
+ continue;
+ }
+
+ vbasedev_iter = vfio_pci_find_by_iommufd_devid(devices[i].devid);
+ if (!vbasedev_iter || !vbasedev_iter->dev->realized ||
+ vbasedev_iter->type != VFIO_DEVICE_TYPE_PCI) {
+ continue;
+ }
+ tmp = container_of(vbasedev_iter, VFIOPCIDevice, vbasedev);
+ vfio_pci_post_reset(tmp);
+ }
+out_single:
+ if (!single) {
+ vfio_pci_post_reset(vdev);
+ }
+ g_free(info);
+
+ return ret;
+}
+#endif
+
+static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single)
+{
+#ifdef CONFIG_IOMMUFD
+ if (vdev->vbasedev.iommufd) {
+ return vfio_pci_hot_reset_iommufd(vdev, single);
+ } else
+#endif
+ {
+ return vfio_pci_hot_reset_legacy(vdev, single);
+ }
+}
+
/*
* We want to differentiate hot reset of multiple in-use devices vs hot reset
* of a single in-use device. VFIO_DEVICE_RESET will already handle the case
diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
index 9b180cf77c..71c5840636 100644
--- a/hw/vfio/trace-events
+++ b/hw/vfio/trace-events
@@ -34,6 +34,7 @@ vfio_check_af_flr(const char *name) "%s Supports FLR via AF cap"
vfio_pci_hot_reset(const char *name, const char *type) " (%s) %s"
vfio_pci_hot_reset_has_dep_devices(const char *name) "%s: hot reset dependent devices:"
vfio_pci_hot_reset_dep_devices(int domain, int bus, int slot, int function, int group_id) "\t%04x:%02x:%02x.%x group %d"
+vfio_pci_hot_reset_dep_devices_iommufd(int domain, int bus, int slot, int function, int dev_id) "\t%04x:%02x:%02x.%x devid %d"
vfio_pci_hot_reset_result(const char *name, const char *result) "%s hot reset: %s"
vfio_populate_device_config(const char *name, unsigned long size, unsigned long offset, unsigned long flags) "Device %s config:\n size: 0x%lx, offset: 0x%lx, flags: 0x%lx"
vfio_populate_device_get_irq_info_failure(const char *errstr) "VFIO_DEVICE_GET_IRQ_INFO failure: %s"
--
2.34.1
next prev parent reply other threads:[~2023-10-26 10:52 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-26 10:30 [PATCH v3 00/37] vfio: Adopt iommufd Zhenzhong Duan
2023-10-26 10:30 ` [PATCH v3 01/37] vfio/container: Move IBM EEH related functions into spapr_pci_vfio.c Zhenzhong Duan
2023-10-26 14:23 ` Eric Farman
2023-10-27 9:19 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 02/37] vfio/container: Move vfio_container_add/del_section_window into spapr.c Zhenzhong Duan
2023-10-27 9:19 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 03/37] vfio/container: Move spapr specific init/deinit " Zhenzhong Duan
2023-10-27 9:27 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 04/37] vfio/spapr: Make vfio_spapr_create/remove_window static Zhenzhong Duan
2023-10-27 9:27 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 05/37] vfio/common: Move vfio_host_win_add/del into spapr.c Zhenzhong Duan
2023-10-27 9:30 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 06/37] vfio: Introduce base object for VFIOContainer and targetted interface Zhenzhong Duan
2023-10-27 14:02 ` Cédric Le Goater
2023-10-30 2:40 ` Duan, Zhenzhong
2023-10-31 7:57 ` Cédric Le Goater
2023-10-31 8:31 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 07/37] vfio/container: Introduce a empty VFIOIOMMUOps Zhenzhong Duan
2023-10-27 14:20 ` Cédric Le Goater
2023-10-30 2:43 ` Duan, Zhenzhong
2023-10-31 8:21 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 08/37] vfio/container: Switch to dma_map|unmap API Zhenzhong Duan
2023-10-27 14:26 ` Cédric Le Goater
2023-10-30 2:48 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 09/37] vfio/common: Move giommu_list in base container Zhenzhong Duan
2023-10-27 14:38 ` Cédric Le Goater
2023-10-30 2:48 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 10/37] vfio/container: Move space field to " Zhenzhong Duan
2023-10-27 14:46 ` Cédric Le Goater
2023-10-30 2:51 ` Duan, Zhenzhong
2023-10-31 8:24 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 11/37] vfio/container: Switch to IOMMU BE set_dirty_page_tracking/query_dirty_bitmap API Zhenzhong Duan
2023-10-27 14:53 ` Cédric Le Goater
2023-10-30 2:53 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 12/37] vfio/container: Move per container device list in base container Zhenzhong Duan
2023-10-27 15:03 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 13/37] vfio/container: Convert functions to " Zhenzhong Duan
2023-10-27 15:03 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 14/37] vfio/container: Move vrdl_list, pgsizes and dma_max_mappings " Zhenzhong Duan
2023-10-27 15:52 ` Cédric Le Goater
2023-10-30 3:14 ` Duan, Zhenzhong
2023-10-31 8:26 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 15/37] vfio/container: Move listener " Zhenzhong Duan
2023-10-26 10:30 ` [PATCH v3 16/37] vfio/container: Move dirty_pgsizes and max_dirty_bitmap_size " Zhenzhong Duan
2023-10-27 16:01 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 17/37] vfio/container: Move iova_ranges " Zhenzhong Duan
2023-10-26 10:30 ` [PATCH v3 18/37] vfio/container: Implement attach/detach_device Zhenzhong Duan
2023-10-27 16:04 ` Cédric Le Goater
2023-10-27 16:06 ` Cédric Le Goater
2023-10-30 3:20 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 19/37] vfio/spapr: Introduce spapr backend and target interface Zhenzhong Duan
2023-10-27 16:04 ` Cédric Le Goater
2023-10-30 3:15 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 20/37] vfio/spapr: switch to spapr IOMMU BE add/del_section_window Zhenzhong Duan
2023-10-26 10:30 ` [PATCH v3 21/37] vfio/spapr: Move prereg_listener into spapr container Zhenzhong Duan
2023-10-26 10:30 ` [PATCH v3 22/37] vfio/spapr: Move hostwin_list " Zhenzhong Duan
2023-10-26 10:30 ` [PATCH v3 23/37] Add iommufd configure option Zhenzhong Duan
2023-10-31 8:58 ` Cédric Le Goater
2023-10-31 10:52 ` Duan, Zhenzhong
2023-10-31 11:25 ` Cédric Le Goater
2023-10-26 10:30 ` [PATCH v3 24/37] backends/iommufd: Introduce the iommufd object Zhenzhong Duan
2023-10-26 13:27 ` Markus Armbruster
2023-10-27 7:50 ` Duan, Zhenzhong
2023-10-27 8:30 ` Markus Armbruster
2023-10-27 9:41 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 25/37] util/char_dev: Add open_cdev() Zhenzhong Duan
2023-10-30 14:53 ` Cédric Le Goater
2023-10-31 1:59 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 26/37] vfio/iommufd: Implement the iommufd backend Zhenzhong Duan
2023-10-26 10:30 ` [PATCH v3 27/37] vfio/iommufd: Switch to manual hwpt allocation Zhenzhong Duan
2023-10-30 13:52 ` Cédric Le Goater
2023-10-31 2:02 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 28/37] vfio/iommufd: Add support for iova_ranges Zhenzhong Duan
2023-10-26 10:30 ` [PATCH v3 29/37] vfio/iommufd: Bypass EEH if iommufd backend Zhenzhong Duan
2023-10-30 13:56 ` Cédric Le Goater
2023-10-31 2:26 ` Duan, Zhenzhong
2023-10-31 9:01 ` Cédric Le Goater
2023-10-31 9:06 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 30/37] vfio/pci: Extract out a helper vfio_pci_get_pci_hot_reset_info Zhenzhong Duan
2023-10-30 13:59 ` Cédric Le Goater
2023-10-31 2:30 ` Duan, Zhenzhong
2023-10-26 10:30 ` Zhenzhong Duan [this message]
2023-10-30 14:04 ` [PATCH v3 31/37] vfio/pci: Adapt vfio pci hot reset support with iommufd BE Cédric Le Goater
2023-10-31 2:27 ` Duan, Zhenzhong
2023-10-26 10:30 ` [PATCH v3 32/37] vfio/pci: Allow the selection of a given iommu backend Zhenzhong Duan
2023-10-26 10:31 ` [PATCH v3 33/37] vfio/pci: Make vfio cdev pre-openable by passing a file handle Zhenzhong Duan
2023-10-26 10:31 ` [PATCH v3 34/37] vfio: Allow the selection of a given iommu backend for platform ap and ccw Zhenzhong Duan
2023-10-26 10:31 ` [PATCH v3 35/37] vfio/platform: Make vfio cdev pre-openable by passing a file handle Zhenzhong Duan
2023-10-26 10:31 ` [PATCH v3 36/37] vfio/ap: " Zhenzhong Duan
2023-10-26 10:31 ` [PATCH v3 37/37] vfio/ccw: " Zhenzhong Duan
2023-10-26 13:27 ` [PATCH v3 00/37] vfio: Adopt iommufd Markus Armbruster
2023-10-27 6:17 ` Duan, Zhenzhong
2023-10-27 7:45 ` Cédric Le Goater
2023-10-27 8:16 ` Duan, Zhenzhong
2023-10-27 13:43 ` Cédric Le Goater
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231026103104.1686921-32-zhenzhong.duan@intel.com \
--to=zhenzhong.duan@intel.com \
--cc=alex.williamson@redhat.com \
--cc=chao.p.peng@intel.com \
--cc=clg@redhat.com \
--cc=eric.auger@redhat.com \
--cc=jasowang@redhat.com \
--cc=jgg@nvidia.com \
--cc=joao.m.martins@oracle.com \
--cc=kevin.tian@intel.com \
--cc=nicolinc@nvidia.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=yi.l.liu@intel.com \
--cc=yi.y.sun@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).