[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251202230303.1017519-20-skhawaja@google.com>
Date: Tue, 2 Dec 2025 23:02:49 +0000
From: Samiullah Khawaja <skhawaja@...gle.com>
To: David Woodhouse <dwmw2@...radead.org>, Lu Baolu <baolu.lu@...ux.intel.com>,
Joerg Roedel <joro@...tes.org>, Will Deacon <will@...nel.org>,
Pasha Tatashin <pasha.tatashin@...een.com>, Jason Gunthorpe <jgg@...pe.ca>, iommu@...ts.linux.dev
Cc: Samiullah Khawaja <skhawaja@...gle.com>, Robin Murphy <robin.murphy@....com>,
Pratyush Yadav <pratyush@...nel.org>, Kevin Tian <kevin.tian@...el.com>,
Alex Williamson <alex@...zbot.org>, linux-kernel@...r.kernel.org,
Saeed Mahameed <saeedm@...dia.com>, Adithya Jayachandran <ajayachandra@...dia.com>,
Parav Pandit <parav@...dia.com>, Leon Romanovsky <leonro@...dia.com>, William Tu <witu@...dia.com>,
Vipin Sharma <vipinsh@...gle.com>, dmatlack@...gle.com, YiFei Zhu <zhuyifei@...gle.com>,
Chris Li <chrisl@...nel.org>, praan@...gle.com
Subject: [RFC PATCH v2 19/32] vfio/pci: Preserve the iommufd state of the vfio cdev
If the vfio cdev is attached to an iommufd, preserve the state of the
attached iommufd also. Basically preserve the iommu state of the device
and also the attached domain. The token returned by the preservation API
will be used to restore/rebind to the iommufd state.
Signed-off-by: Samiullah Khawaja <skhawaja@...gle.com>
---
drivers/vfio/pci/vfio_pci_liveupdate.c | 23 +++++++++++++++++++----
include/linux/kho/abi/vfio_pci.h | 10 ++++++++++
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/drivers/vfio/pci/vfio_pci_liveupdate.c b/drivers/vfio/pci/vfio_pci_liveupdate.c
index bcaf9de8a823..b721080599d5 100644
--- a/drivers/vfio/pci/vfio_pci_liveupdate.c
+++ b/drivers/vfio/pci/vfio_pci_liveupdate.c
@@ -15,6 +15,7 @@
#include <linux/liveupdate.h>
#include <linux/errno.h>
#include <linux/vfio.h>
+#include <linux/iommufd.h>
#include "vfio_pci_priv.h"
@@ -38,9 +39,9 @@ static int vfio_pci_liveupdate_preserve(struct liveupdate_file_op_args *args)
struct vfio_device *device = vfio_device_from_file(args->file);
struct vfio_pci_core_device_ser *ser;
struct vfio_pci_core_device *vdev;
+ int err, iommufd_token;
struct pci_dev *pdev;
struct folio *folio;
- int err;
vdev = container_of(device, struct vfio_pci_core_device, vdev);
pdev = vdev->pdev;
@@ -51,15 +52,26 @@ static int vfio_pci_liveupdate_preserve(struct liveupdate_file_op_args *args)
if (vfio_pci_is_intel_display(pdev))
return -EINVAL;
+ /* If iommufd is attached, preserve the underlying domain */
+ if (device->iommufd_attached) {
+ iommufd_token = iommufd_device_preserve(device->iommufd_device,
+ IOMMU_NO_PASID);
+ if (iommufd_token < 0)
+ return iommufd_token;
+ }
+
folio = folio_alloc(GFP_KERNEL | __GFP_ZERO, get_order(sizeof(*ser)));
- if (!folio)
- return -ENOMEM;
+ if (!folio) {
+ err = -ENOMEM;
+ goto error_folio;
+ }
ser = folio_address(folio);
ser->bdf = pci_dev_id(pdev);
ser->domain = pci_domain_nr(pdev->bus);
ser->reset_works = vdev->reset_works;
+ ser->iommufd_ser.token = iommufd_token;
err = kho_preserve_folio(folio);
if (err)
@@ -69,8 +81,11 @@ static int vfio_pci_liveupdate_preserve(struct liveupdate_file_op_args *args)
args->serialized_data = virt_to_phys(ser);
return 0;
-error:
+error_folio:
folio_put(folio);
+error:
+ if (device->iommufd_attached)
+ iommufd_device_unpreserve(device->iommufd_device);
return err;
}
diff --git a/include/linux/kho/abi/vfio_pci.h b/include/linux/kho/abi/vfio_pci.h
index 6c3d3c6dfc09..28d6eac5fd65 100644
--- a/include/linux/kho/abi/vfio_pci.h
+++ b/include/linux/kho/abi/vfio_pci.h
@@ -28,6 +28,15 @@
#define VFIO_PCI_LUO_FH_COMPATIBLE "vfio-pci-v1"
+/**
+ * struct vfio_iommufd_ser - Serialized state relevant attached iommufd.
+ *
+ * @token: The token of the bound iommufd state.
+ */
+struct vfio_iommufd_ser {
+ u32 token;
+} __packed;
+
/**
* struct vfio_pci_core_device_ser - Serialized state of a single VFIO PCI
* device.
@@ -40,6 +49,7 @@ struct vfio_pci_core_device_ser {
u16 bdf;
u16 domain;
u8 reset_works;
+ struct vfio_iommufd_ser iommufd_ser;
} __packed;
#endif /* _LINUX_LIVEUPDATE_ABI_VFIO_PCI_H */
--
2.52.0.158.g65b55ccf14-goog
Powered by blists - more mailing lists