From: Baolu Lu <baolu.lu@linux.intel.com>
To: Samiullah Khawaja <skhawaja@google.com>,
Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
Jason Gunthorpe <jgg@ziepe.ca>,
David Woodhouse <dwmw2@infradead.org>
Cc: baolu.lu@linux.intel.com, Robin Murphy <robin.murphy@arm.com>,
Kevin Tian <kevin.tian@intel.com>,
Alex Williamson <alex@shazbot.org>, Shuah Khan <shuah@kernel.org>,
iommu@lists.linux.dev, linux-kernel@vger.kernel.org,
kvm@vger.kernel.org, Pratyush Yadav <pratyush@kernel.org>,
Pasha Tatashin <pasha.tatashin@soleen.com>,
David Matlack <dmatlack@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
Pranjal Shrivastava <praan@google.com>,
Vipin Sharma <vipinsh@google.com>,
Ankit Soni <Ankit.Soni@amd.com>,
Nicolin Chen <nicolinc@nvidia.com>, John Starks <dev@jstarks.net>
Subject: Re: [PATCH v6 05/18] iommu: Implement device and IOMMU HW preservation
Date: Fri, 30 Oct 2026 13:12:31 +0800 [thread overview]
Message-ID: <df75f891-05a0-4d47-8705-d6a00c81ff97@linux.intel.com> (raw)
In-Reply-To: <20261025021930.674647-6-skhawaja@google.com>
On 10/25/2026 10:19 AM, Samiullah Khawaja wrote:
> Add IOMMU ops to preserve/unpreserve the device state handled by the
> IOMMU driver. This is IOMMU specific state of the device that needs to
> be preserved for liveupdate. These ops can be implemented by the IOMMU
> drivers that support preservation of devices that have their IOMMU
> domains preserved. During device preservation the state of the
> associated IOMMU is also preserved as dependency.
>
> Signed-off-by: Samiullah Khawaja <skhawaja@google.com>
> ---
> drivers/iommu/iommu-priv.h | 2 +
> drivers/iommu/iommu.c | 72 +++++++++++-
> drivers/iommu/liveupdate.c | 189 +++++++++++++++++++++++++++++++
> include/linux/iommu-liveupdate.h | 76 +++++++++++++
> include/linux/iommu.h | 33 ++++++
> 5 files changed, 371 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/iommu/iommu-priv.h b/drivers/iommu/iommu-priv.h
> index 1f9f886b2c10..6b0ef210b32f 100644
> --- a/drivers/iommu/iommu-priv.h
> +++ b/drivers/iommu/iommu-priv.h
> @@ -21,6 +21,8 @@ static inline const struct iommu_ops *dev_iommu_ops(struct device *dev)
>
> void dev_iommu_free(struct device *dev);
>
> +bool iommu_group_is_singleton(struct iommu_group *group);
> +
> const struct iommu_ops *iommu_ops_from_fwnode(const struct fwnode_handle *fwnode);
>
> static inline const struct iommu_ops *iommu_fwspec_ops(struct iommu_fwspec *fwspec)
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index b486b8bbd1fc..a66363789ca9 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -18,6 +18,7 @@
> #include <linux/errno.h>
> #include <linux/host1x_context_bus.h>
> #include <linux/iommu.h>
> +#include <linux/iommu-liveupdate.h>
> #include <linux/iommufd.h>
> #include <linux/idr.h>
> #include <linux/err.h>
> @@ -328,6 +329,47 @@ void iommu_device_unregister(struct iommu_device *iommu)
> }
> EXPORT_SYMBOL_GPL(iommu_device_unregister);
>
> +struct iommu_dev_iter {
> + struct iommu_device *iommu;
> + iommu_dev_iter_fn fn;
> +};
> +
> +static int _iommu_for_each_dev_cb(struct device *dev, void *data)
> +{
> + struct iommu_dev_iter *iter = data;
> +
> + if (dev->iommu && dev->iommu->iommu_dev == iter->iommu)
> + return iter->fn(dev, iter->iommu);
> +
> + return 0;
> +}
> +
> +/**
> + * iommu_for_each_dev() - Iterate over all devices attached to an IOMMU
> + * @iommu: IOMMU instance
> + * @fn: Callback to call for each device attached to @iommu
> + *
> + * Return: 0 on success, or negative error code.
> + */
> +int iommu_for_each_dev(struct iommu_device *iommu, iommu_dev_iter_fn fn)
> +{
> + struct iommu_dev_iter iter = {
> + .iommu = iommu,
> + .fn = fn,
> + };
> + int ret;
> +
> + for (int i = 0; i < ARRAY_SIZE(iommu_buses); i++) {
> + ret = bus_for_each_dev(iommu_buses[i], NULL, &iter,
> + _iommu_for_each_dev_cb);
> + if (ret)
> + return ret;
> + }
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(iommu_for_each_dev);
The function has no locking against iommu probe or release, so the
callback can read dev->iommu while it is being freed or before it is
fully set up.
> +
> #if IS_ENABLED(CONFIG_IOMMUFD_TEST)
> void iommu_device_unregister_bus(struct iommu_device *iommu,
> const struct bus_type *bus,
> @@ -626,8 +668,8 @@ DEFINE_MUTEX(iommu_probe_device_lock);
>
> static int __iommu_probe_device(struct device *dev, struct list_head *group_list)
> {
> + struct group_device *gdev, *gdev2;
> struct iommu_group *group;
> - struct group_device *gdev;
> int ret;
>
> /*
> @@ -661,6 +703,13 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list
> goto err_put_group;
> }
>
> + for_each_group_device(group, gdev2) {
> + if (dev_iommu_has_preserved_state(gdev2->dev)) {
> + ret = -EBUSY;
> + goto err_free_gdev;
> + }
> + }
> +
> /*
> * The gdev must be in the list before calling
> * iommu_setup_default_domain()
> @@ -697,6 +746,7 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list
>
> err_remove_gdev:
> list_del(&gdev->list);
> +err_free_gdev:
> __iommu_group_free_device(group, gdev);
> err_put_group:
> iommu_deinit_device(dev);
> @@ -3543,6 +3593,26 @@ bool iommu_group_dma_owner_claimed(struct iommu_group *group)
> }
> EXPORT_SYMBOL_GPL(iommu_group_dma_owner_claimed);
>
> +/**
> + * iommu_group_is_singleton() - Query if group contains exactly one device
> + * @group: The group.
> + *
> + * Return: true if group contains exactly 1 device, false otherwise.
> + */
We discussed this interface before, and the consensus was that such an
interface is not feasible, because the membership of an iommu_group is
not fixed, given the hot-plug support of buses like PCI.
I am fine with the usage model of ensuring the iommu group of a
preserved device to be a singleton, but I don't think we even need such
a kAPI. It should be handled case by case.
> +bool iommu_group_is_singleton(struct iommu_group *group)
> +{
> + bool ret;
> +
> + if (!group)
> + return false;
> +
> + mutex_lock(&group->mutex);
> + ret = (list_count_nodes(&group->devices) == 1);
> + mutex_unlock(&group->mutex);
> +
> + return ret;
> +}
> +
> static void iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid,
> struct iommu_domain *domain)
> {
> diff --git a/drivers/iommu/liveupdate.c b/drivers/iommu/liveupdate.c
> index b7eda5615189..d1d11b28ae79 100644
> --- a/drivers/iommu/liveupdate.c
> +++ b/drivers/iommu/liveupdate.c
> @@ -43,6 +43,9 @@
> #include <linux/kexec_handover.h>
> #include <linux/kho_block.h>
> #include <linux/liveupdate.h>
> +#include <linux/pci.h>
> +
> +#include "iommu-priv.h"
>
> /**
> * struct iommu_ser_set - Set of serialized objects of one type
> @@ -358,3 +361,189 @@ void iommu_unpreserve_domain(struct iommu_domain *domain)
> liveupdate_flb_put_outgoing(&iommu_flb);
> }
> EXPORT_SYMBOL_GPL(iommu_unpreserve_domain);
> +
> +static int iommu_preserve_locked(struct iommu_device *iommu,
> + struct iommu_flb_obj *flb_obj)
> +{
> + struct iommu_hw_ser *iommu_hw_ser;
> + int ret;
> +
> + if (!iommu->ops->preserve || !iommu->ops->unpreserve)
> + return -EOPNOTSUPP;
> +
> + lockdep_assert_held(&flb_obj->lock);
> + if (iommu->iommu_ser) {
> + iommu->iommu_ser->hdr.ref_count++;
> + return 0;
> + }
> +
> + iommu_hw_ser = iommu_ser_set_alloc(&flb_obj->iommu_set);
> + if (IS_ERR(iommu_hw_ser))
> + return PTR_ERR(iommu_hw_ser);
> +
> + ret = iommu->ops->preserve(iommu, iommu_hw_ser);
> + if (ret) {
> + iommu_hw_ser->hdr.flags |= IOMMU_SER_FLAG_DELETED;
> + return ret;
> + }
> +
> + iommu->iommu_ser = iommu_hw_ser;
> + return ret;
> +}
> +
> +static void iommu_unpreserve_locked(struct iommu_device *iommu,
> + struct iommu_flb_obj *flb_obj)
> +{
> + struct iommu_hw_ser *iommu_hw_ser = iommu->iommu_ser;
> +
> + lockdep_assert_held(&flb_obj->lock);
> + if (WARN_ON(!iommu_hw_ser))
> + return;
> +
> + if (WARN_ON_ONCE(!iommu->ops->preserve ||
> + !iommu->ops->unpreserve))
> + return;
> +
> + iommu_hw_ser->hdr.ref_count--;
> + if (iommu_hw_ser->hdr.ref_count)
> + return;
> +
> + iommu->iommu_ser = NULL;
> + iommu->ops->unpreserve(iommu, iommu_hw_ser);
> + iommu_hw_ser->hdr.flags |= IOMMU_SER_FLAG_DELETED;
> +}
> +
> +/**
> + * iommu_preserve_device() - Preserve device state across live update
> + * @domain: Associated IOMMU domain
> + * @dev: Device to preserve
> + * @dma_owner_token: Token to identify DMA owner of this device
> + *
> + * Return: 0 on success, or negative error code.
> + */
> +int iommu_preserve_device(struct iommu_domain *domain,
> + struct device *dev, u64 dma_owner_token)
> +{
> + struct iommu_device_ser *device_ser;
> + struct iommu_flb_obj *flb_obj;
> + struct dev_iommu *iommu;
> + struct pci_dev *pdev;
> + int ret;
> +
> + if (!dev_is_pci(dev))
> + return -EOPNOTSUPP;
> +
> + if (!iommu_group_dma_owner_claimed(dev->iommu_group))
> + return -EINVAL;
> +
> + if (!iommu_group_is_singleton(dev->iommu_group))
> + return -EOPNOTSUPP;
> +
> + pdev = to_pci_dev(dev);
> + iommu = dev->iommu;
> + if (!iommu->iommu_dev->ops->preserve_device ||
> + !iommu->iommu_dev->ops->unpreserve_device ||
> + !iommu->iommu_dev->ops->preserve ||
> + !iommu->iommu_dev->ops->unpreserve)
> + return -EOPNOTSUPP;
> +
> + ret = liveupdate_flb_get_outgoing(&iommu_flb, (void **)&flb_obj);
> + if (ret)
> + return ret;
> +
> + mutex_lock(&flb_obj->lock);
> + if (!domain->domain_ser) {
> + ret = -EINVAL;
> + goto out_unlock;
> + }
Should we check that @domain is actually attached to the device? The
iommu core tracks the device's domain attachment, so what happens if
the caller's @domain doesn't match what the iommu core has recorded?
> +
> + if (dev_iommu_preserved_state(dev)) {
> + ret = -EBUSY;
> + goto out_unlock;
> + }
> +
> + device_ser = iommu_ser_set_alloc(&flb_obj->device_set);
> + if (IS_ERR(device_ser)) {
> + ret = PTR_ERR(device_ser);
> + goto out_unlock;
> + }
> +
> + ret = iommu_preserve_locked(iommu->iommu_dev, flb_obj);
> + if (ret) {
> + device_ser->hdr.flags |= IOMMU_SER_FLAG_DELETED;
> + goto out_unlock;
> + }
> +
> + device_ser->attachment.domain_phys = virt_to_phys(domain->domain_ser);
> + device_ser->iommu_phys = virt_to_phys(iommu->iommu_dev->iommu_ser);
> + device_ser->devid = pci_dev_id(pdev);
> + device_ser->pci_domain_nr = pci_domain_nr(pdev->bus);
> + device_ser->dma_owner_token = dma_owner_token;
> +
> + ret = iommu->iommu_dev->ops->preserve_device(dev, device_ser);
> + if (!ret) {
> + WRITE_ONCE(dev->iommu->device_ser, device_ser);
> +
> + /* Validate that no sibling device was added concurrently */
> + if (!iommu_group_is_singleton(dev->iommu_group)) {
> + iommu->iommu_dev->ops->unpreserve_device(dev, device_ser);
> + WRITE_ONCE(dev->iommu->device_ser, NULL);
> + ret = -EOPNOTSUPP;
> + }
> + }
> +
> + if (ret) {
> + device_ser->hdr.flags |= IOMMU_SER_FLAG_DELETED;
> + iommu_unpreserve_locked(iommu->iommu_dev, flb_obj);
> + goto out_unlock;
> + }
> +
> +out_unlock:
> + mutex_unlock(&flb_obj->lock);
> + liveupdate_flb_put_outgoing(&iommu_flb);
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(iommu_preserve_device);
> +
> +/**
> + * iommu_unpreserve_device() - Unpreserve device state
> + * @domain: Associated IOMMU domain
@domain is not used anywhere in this function. Why is it needed?
> + * @dev: Device to unpreserve
> + */
> +void iommu_unpreserve_device(struct iommu_domain *domain, struct device *dev)
> +{
> + struct iommu_device_ser *iommu_device_ser;
> + struct iommu_flb_obj *flb_obj;
> + struct dev_iommu *iommu;
> + int ret;
> +
> + if (!dev_is_pci(dev))
> + return;
> +
> + if (!iommu_group_dma_owner_claimed(dev->iommu_group))
> + return;
> +
> + iommu = dev->iommu;
> + if (WARN_ON(!iommu->iommu_dev->ops->unpreserve_device ||
> + !iommu->iommu_dev->ops->unpreserve))
> + return;
> +
> + ret = liveupdate_flb_get_outgoing(&iommu_flb, (void **)&flb_obj);
> + if (WARN_ON(ret))
> + return;
> +
> + mutex_lock(&flb_obj->lock);
> + iommu_device_ser = dev_iommu_preserved_state(dev);
> + if (WARN_ON(!iommu_device_ser))
> + goto out_unlock;
> +
> + iommu_device_ser->hdr.flags |= IOMMU_SER_FLAG_DELETED;
> + iommu->iommu_dev->ops->unpreserve_device(dev, iommu_device_ser);
> + WRITE_ONCE(dev->iommu->device_ser, NULL);
> +
> + iommu_unpreserve_locked(iommu->iommu_dev, flb_obj);
> +out_unlock:
> + mutex_unlock(&flb_obj->lock);
> + liveupdate_flb_put_outgoing(&iommu_flb);
> +}
> +EXPORT_SYMBOL_GPL(iommu_unpreserve_device);
> diff --git a/include/linux/iommu-liveupdate.h b/include/linux/iommu-liveupdate.h
> index caa9778eee2d..cdf8a82b7f1d 100644
> --- a/include/linux/iommu-liveupdate.h
> +++ b/include/linux/iommu-liveupdate.h
> @@ -8,6 +8,7 @@
> #ifndef _LINUX_IOMMU_LIVEUPDATE_H
> #define _LINUX_IOMMU_LIVEUPDATE_H
>
> +#include <linux/device.h>
> #include <linux/iommu.h>
> #include <linux/liveupdate.h>
> #include <linux/kho/abi/iommu.h>
> @@ -15,8 +16,58 @@
> #ifdef CONFIG_IOMMU_LIVEUPDATE
> int iommu_liveupdate_register_flb(struct liveupdate_file_handler *handler);
> void iommu_liveupdate_unregister_flb(struct liveupdate_file_handler *handler);
> +
> +/**
> + * dev_iommu_has_preserved_state() - Check if a device has live update state
> + * @dev: Target device
> + *
> + * Unlike dev_iommu_preserved_state() and dev_iommu_restored_state(), this does
> + * not dereference the serialized state, so it is safe to call without holding
> + * a reference on the live update FLB.
> + *
> + * Return: true if @dev has preserved (outgoing) or restored (incoming) state.
> + */
> +static inline bool dev_iommu_has_preserved_state(struct device *dev)
> +{
> + return dev->iommu && READ_ONCE(dev->iommu->device_ser);
> +}
> +
> +/**
> + * dev_iommu_preserved_state() - Get preserved state of a device
> + * @dev: Target device
> + *
> + * Return: Pointer to preserved device state, or NULL if not preserved.
> + */
> +static inline void *dev_iommu_preserved_state(struct device *dev)
> +{
> + struct iommu_device_ser *ser;
> +
> + if (!dev->iommu)
> + return NULL;
> +
> + ser = READ_ONCE(dev->iommu->device_ser);
> + if (ser && !(ser->hdr.flags & IOMMU_SER_FLAG_INCOMING))
> + return ser;
> +
> + return NULL;
> +}
> +
> int iommu_preserve_domain(struct iommu_domain *domain, struct iommu_domain_ser **ser);
> void iommu_unpreserve_domain(struct iommu_domain *domain);
> +int iommu_preserve_device(struct iommu_domain *domain,
> + struct device *dev, u64 dma_owner_token);
> +void iommu_unpreserve_device(struct iommu_domain *domain, struct device *dev);
> +
> +/**
> + * iommu_preserved_state() - Get preserved state of an IOMMU instance
> + * @iommu: IOMMU hardware instance
> + *
> + * Return: Pointer to preserved state, or NULL if not preserved.
> + */
> +static inline void *iommu_preserved_state(struct iommu_device *iommu)
> +{
> + return iommu->iommu_ser;
> +}
> #else
> static inline int iommu_liveupdate_register_flb(struct liveupdate_file_handler *handler)
> {
> @@ -27,6 +78,16 @@ static inline void iommu_liveupdate_unregister_flb(struct liveupdate_file_handle
> {
> }
>
> +static inline bool dev_iommu_has_preserved_state(struct device *dev)
> +{
> + return false;
> +}
> +
> +static inline void *dev_iommu_preserved_state(struct device *dev)
> +{
> + return NULL;
> +}
> +
> static inline int iommu_preserve_domain(struct iommu_domain *domain, struct iommu_domain_ser **ser)
> {
> return -EOPNOTSUPP;
> @@ -35,5 +96,20 @@ static inline int iommu_preserve_domain(struct iommu_domain *domain, struct iomm
> static inline void iommu_unpreserve_domain(struct iommu_domain *domain)
> {
> }
> +
> +static inline int iommu_preserve_device(struct iommu_domain *domain,
> + struct device *dev, u64 dma_owner_token)
> +{
> + return -EOPNOTSUPP;
> +}
> +
> +static inline void iommu_unpreserve_device(struct iommu_domain *domain, struct device *dev)
> +{
> +}
> +
> +static inline void *iommu_preserved_state(struct iommu_device *iommu)
> +{
> + return NULL;
> +}
> #endif
> #endif /* _LINUX_IOMMU_LIVEUPDATE_H */
> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
> index 71e73c5181b5..35d028fe7126 100644
> --- a/include/linux/iommu.h
> +++ b/include/linux/iommu.h
> @@ -684,6 +684,10 @@ __iommu_copy_struct_to_user(const struct iommu_user_data *dst_data,
> * resources shared/passed to user space IOMMU instance. Associate
> * it with a nesting @parent_domain. It is required for driver to
> * set @viommu->ops pointing to its own viommu_ops
> + * @preserve_device: Preserve state of a device for liveupdate.
> + * @unpreserve_device: Unpreserve state that was preserved earlier.
> + * @preserve: Preserve state of iommu translation hardware for liveupdate.
> + * @unpreserve: Unpreserve state of iommu that was preserved earlier.
> * @owner: Driver module providing these ops
> * @identity_domain: An always available, always attachable identity
> * translation.
> @@ -740,6 +744,13 @@ struct iommu_ops {
> struct iommu_domain *parent_domain,
> const struct iommu_user_data *user_data);
>
> +#ifdef CONFIG_IOMMU_LIVEUPDATE
> + int (*preserve_device)(struct device *dev, struct iommu_device_ser *device_ser);
> + void (*unpreserve_device)(struct device *dev, struct iommu_device_ser *device_ser);
> + int (*preserve)(struct iommu_device *iommu, struct iommu_hw_ser *iommu_ser);
> + void (*unpreserve)(struct iommu_device *iommu, struct iommu_hw_ser *iommu_ser);
> +#endif
> +
> const struct iommu_domain_ops *default_domain_ops;
> struct module *owner;
> struct iommu_domain *identity_domain;
> @@ -827,6 +838,7 @@ struct iommu_domain_ops {
> * @singleton_group: Used internally for drivers that have only one group
> * @max_pasids: number of supported PASIDs
> * @ready: set once iommu_device_register() has completed successfully
> + * @iommu_ser: preserved iommu state of outgoing kernel for liveupdate.
> */
> struct iommu_device {
> struct list_head list;
> @@ -836,6 +848,10 @@ struct iommu_device {
> struct iommu_group *singleton_group;
> u32 max_pasids;
> bool ready;
> +
> +#ifdef CONFIG_IOMMU_LIVEUPDATE
> + struct iommu_hw_ser *iommu_ser;
> +#endif
> };
>
> /**
> @@ -875,6 +891,8 @@ struct iommu_fault_param {
> * @pci_32bit_workaround: Limit DMA allocations to 32-bit IOVAs
> * @require_direct: device requires IOMMU_RESV_DIRECT regions
> * @shadow_on_flush: IOTLB flushes are used to sync shadow tables
> + * @device_ser: preserved (outgoing) or restored (incoming) liveupdate state
> + * of this device
> *
> * TODO: migrate other per device data pointers under iommu_dev_data, e.g.
> * struct iommu_group *iommu_group;
> @@ -890,6 +908,9 @@ struct dev_iommu {
> u32 pci_32bit_workaround:1;
> u32 require_direct:1;
> u32 shadow_on_flush:1;
> +#ifdef CONFIG_IOMMU_LIVEUPDATE
> + struct iommu_device_ser *device_ser;
> +#endif
> };
>
> int iommu_device_register(struct iommu_device *iommu,
> @@ -1204,6 +1225,18 @@ static inline void *dev_iommu_priv_get(struct device *dev)
>
> void dev_iommu_priv_set(struct device *dev, void *priv);
>
> +/**
> + * typedef iommu_dev_iter_fn - Callback for iterating IOMMU attached devices
> + * @dev: Attached device
> + * @iommu: IOMMU instance
> + *
> + * Return: 0 on success, or negative error code.
> + */
> +typedef int (*iommu_dev_iter_fn)(struct device *dev,
> + struct iommu_device *iommu);
> +
> +int iommu_for_each_dev(struct iommu_device *iommu, iommu_dev_iter_fn fn);
> +
> extern struct mutex iommu_probe_device_lock;
> int iommu_probe_device(struct device *dev);
>
Thanks,
baolu
next prev parent reply other threads:[~2026-10-30 5:12 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-25 2:19 [PATCH v6 00/18] iommu: Add live update state preservation Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 01/18] iommu: Implement IOMMU Live update FLB callbacks Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 02/18] iommu/pages: Add APIs to preserve/unpreserve/restore iommu pages Samiullah Khawaja
2026-10-30 1:26 ` Baolu Lu
2026-10-25 2:19 ` [PATCH v6 03/18] iommupt: Implement preserve/unpreserve/restore callbacks Samiullah Khawaja
2026-10-30 3:07 ` Baolu Lu
2026-10-25 2:19 ` [PATCH v6 04/18] iommu: Implement IOMMU domain preservation Samiullah Khawaja
2026-10-30 4:24 ` Baolu Lu
2026-10-25 2:19 ` [PATCH v6 05/18] iommu: Implement device and IOMMU HW preservation Samiullah Khawaja
2026-10-30 5:12 ` Baolu Lu [this message]
2026-10-25 2:19 ` [PATCH v6 06/18] iommu/vt-d: Implement device and iommu preserve/unpreserve ops Samiullah Khawaja
2026-10-28 1:51 ` Baolu Lu
2026-10-28 3:10 ` Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 07/18] iommu/vt-d: Clear unpreserved context entries during shutdown Samiullah Khawaja
2026-10-28 3:18 ` Baolu Lu
2026-10-29 0:34 ` Samiullah Khawaja
2026-10-29 3:18 ` Baolu Lu
2026-10-29 22:00 ` Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 08/18] iommu: Add APIs to get iommu and device preserved state Samiullah Khawaja
2026-10-30 6:03 ` Baolu Lu
2026-10-25 2:19 ` [PATCH v6 09/18] iommu/vt-d: Combine disable_dmar_iommu() and free_dmar_iommu() Samiullah Khawaja
2026-10-28 6:01 ` Baolu Lu
2026-10-29 0:33 ` Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 10/18] iommu/vt-d: Restore IOMMU state and reclaimed domain ids Samiullah Khawaja
2026-10-28 7:14 ` Baolu Lu
2026-10-29 0:32 ` Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 11/18] iommu/vt-d: Preserve PASID table of preserved device Samiullah Khawaja
2026-10-29 7:42 ` Baolu Lu
2026-10-25 2:19 ` [PATCH v6 12/18] iommu: Restore and reattach preserved domains to devices Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 13/18] iommu/vt-d: Handle reattach of the restored domain Samiullah Khawaja
2026-10-29 8:28 ` Baolu Lu
2026-10-29 22:34 ` Samiullah Khawaja
2026-10-29 23:38 ` Baolu Lu
2026-10-25 2:19 ` [PATCH v6 14/18] iommufd: Implement ioctl to mark HWPT for preservation Samiullah Khawaja
2026-10-30 7:20 ` Baolu Lu
2026-10-25 2:19 ` [PATCH v6 15/18] iommufd: Persist iommu hardware pagetables for live update Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 16/18] iommufd: Add APIs to preserve/unpreserve a vfio cdev Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 17/18] vfio/pci: Preserve the iommufd state of the " Samiullah Khawaja
2026-10-25 2:19 ` [PATCH v6 18/18] iommufd/selftest: Add test to verify iommufd preservation Samiullah Khawaja
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=df75f891-05a0-4d47-8705-d6a00c81ff97@linux.intel.com \
--to=baolu.lu@linux.intel.com \
--cc=Ankit.Soni@amd.com \
--cc=akpm@linux-foundation.org \
--cc=alex@shazbot.org \
--cc=dev@jstarks.net \
--cc=dmatlack@google.com \
--cc=dwmw2@infradead.org \
--cc=iommu@lists.linux.dev \
--cc=jgg@ziepe.ca \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nicolinc@nvidia.com \
--cc=pasha.tatashin@soleen.com \
--cc=praan@google.com \
--cc=pratyush@kernel.org \
--cc=robin.murphy@arm.com \
--cc=shuah@kernel.org \
--cc=skhawaja@google.com \
--cc=vipinsh@google.com \
--cc=will@kernel.org \
/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
all inboxes | Powered by JetHome®