Re: [PATCH v4 11/18] iommu: Restore and reattach preserved domains to devices

Samiullah Khawaja <[email protected]>
Newsgroups org.kernel.vger.kvm,dev.linux.lists.iommu,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Fri, Aug 14, 2026 at 04:59:50PM +0000, Ankit Soni wrote:
>On Sat, Aug 08, 2026 at 02:27:16AM +0000, Samiullah Khawaja wrote:
>> During default domain setup, restore the preserved domains by restoring
>> the page tables using restore() iommupt op. Associated the restored
>> domain with the iommu group of the preserved device, and reattach the
>> domain to the device.
>>
>> Signed-off-by: Samiullah Khawaja <[email protected]>
>> ---
>>  drivers/iommu/iommu.c            |  76 ++++++++++++++++++
>>  drivers/iommu/liveupdate.c       | 130 +++++++++++++++++++++++++++++++
>>  include/linux/iommu-liveupdate.h |  69 ++++++++++++++++
>>  3 files changed, 275 insertions(+)
>>
>
>../..
>
>> diff --git a/drivers/iommu/liveupdate.c b/drivers/iommu/liveupdate.c
>> index 20acf123b47a..04c0212cd81b 100644
>> --- a/drivers/iommu/liveupdate.c
>> +++ b/drivers/iommu/liveupdate.c
>> @@ -708,3 +708,133 @@ void iommu_unpreserve_device(struct iommu_domain *domain, struct device *dev)
>>  	liveupdate_flb_put_outgoing(&iommu_flb);
>>  }
>>  EXPORT_SYMBOL_GPL(iommu_unpreserve_device);
>> +
>> +static inline bool match_device_ser(struct iommu_device_ser *match,
>> +				    struct pci_dev *pdev)
>> +{
>> +	return match->devid == pci_dev_id(pdev) && match->pci_domain_nr == pci_domain_nr(pdev->bus);
>> +}
>> +
>> +/**
>> + * iommu_init_device_preserved_data() - Initialize preserved state for device
>> + * @dev: Target device
>> + *
>> + * Looks up incoming Live Update state for @dev and attaches it to the device if
>> + * found.
>> + */
>> +void iommu_init_device_preserved_data(struct device *dev)
>> +{
>> +	struct iommu_device_ser *device_ser = NULL;
>> +	struct iommu_device_array_ser *array;
>> +	struct iommu_flb_obj *flb_obj;
>> +	int ret, idx;
>> +
>> +	if (!dev_is_pci(dev))
>> +		return;
>> +
>> +	ret = iommu_liveupdate_flb_get_incoming(&flb_obj);
>> +	if (ret)
>> +		return;
>> +
>> +	mutex_lock(&flb_obj->lock);
>> +	array = phys_to_virt(flb_obj->ser->device_array_phys);
>> +	iommu_liveupdate_for_each_arr(array) {
>> +		iommu_liveupdate_for_each_obj(array, device_ser, idx) {
>> +			if (match_device_ser(device_ser, to_pci_dev(dev))) {
>> +				device_ser->hdr.flags |= IOMMU_SER_FLAG_INCOMING;
>> +				goto out;
>> +			}
>> +		}
>> +	}
>> +
>> +	device_ser = NULL;
>> +out:
>> +	WRITE_ONCE(dev->iommu->device_ser, device_ser);
>> +	mutex_unlock(&flb_obj->lock);
>> +	liveupdate_flb_put_incoming(&iommu_flb);
>> +}
>> +EXPORT_SYMBOL(iommu_init_device_preserved_data);
>> +
>> +/**
>> + * iommu_release_restored_device() - Release a restored device
>> + * @dev: Target device
>> + */
>> +void iommu_release_restored_device(struct device *dev)
>> +{
>> +	/*
>> +	 * We do not support releasing the restored devices that are not
>> +	 * reclaimed by the device drivers as they can fallback to the default
>> +	 * domain.
>> +	 */
>> +	BUG_ON(dev_iommu_restored_state(dev));
>
>Hi,

Hi,

Thanks for looking at this.

>After a successful live update this is one sysfs write away, and nothing in
>the series disarms it.
>
>At PCI probe, iommu_init_device_preserved_data() matches the incoming FLB on
>devid + pci_domain_nr and sets IOMMU_SER_FLAG_INCOMING.
>Nothing clears the flag or device_ser afterwards. The group is meanwhile owned
>on behalf of iommufd (iommu.c:3229-3231, "will be reclaimed later by the
>entity (iommufd) that preserved them"), and iommufd_liveupdate_retrieve() is
>-EOPNOTSUPP, so the reclaim that would end the restored state cannot happen
>yet. The device is left with the state permanently set.

Yes, these points are valid and this is intentional. The IOMMU
persistence support is split into two phases as mentioned in the cover
letter. The reclaim logic in iommufd will come later as a phase 2. The
preserved devices go to normal state when these are reclaimed through
iommufd.

https://lore.kernel.org/all/[email protected]/

Regarding the handling of sysfs, my concern is about it coming back and
going to default domain as mentioned in the comment. But I will evaluate
if we can allow device tear down here and reattach it to the preserved
domain.

Also please see the patchset breakdown here:
https://docs.google.com/document/d/1enDn-uPE9U77U-xHEnzn6HHGKiePSAtMIP8EDU3NO0M

Btw since this phase 1 is relatively stable and I don't expect many
changes in it. I have started reviving the Phase 2 patches and will be
sending them out as RFC soon if you want to experiment with it.

Sami
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.