Re: [PATCH v3 08/18] iommu/vt-d: clear unpreserved context entries during shutdown

From: Baolu Lu

Date: Sun Jun 21 2026 - 22:48:36 EST


On 6/15/26 07:37, Samiullah Khawaja wrote:
During normal shutdown the iommu translation is disabled. Since the root
table is preserved during live update, it needs to be cleaned up and the
context entries of the unpreserved devices and root entries for the
unpreserved context tables need to be cleared.

Signed-off-by: Samiullah Khawaja <skhawaja@xxxxxxxxxx>
---
drivers/iommu/intel/iommu.c | 9 ++--
drivers/iommu/intel/iommu.h | 6 +++
drivers/iommu/intel/liveupdate.c | 74 ++++++++++++++++++++++++++++++++
3 files changed, 86 insertions(+), 3 deletions(-)

Please tweak the commit title to: "iommu/vt-d: Clear unpreserved..."
(capitalize "Clear") to match the driver's commit history style.

A high-level question: have you looked at how the suspend/resume path
behaves with the iommu and device preservation? DMA translation is
disabled and re-enabled there. I don't see any immediate changes are
needed there, but it would be good to call it out explicitly if it was
overlooked.


diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 715b538e7efe..26258861e3bf 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -2374,8 +2374,11 @@ void intel_iommu_shutdown(void)
/* Disable PMRs explicitly here. */
iommu_disable_protect_mem_regions(iommu);
- /* Make sure the IOMMUs are switched off */
- iommu_disable_translation(iommu);
+ /* Make sure the IOMMUs are switched off if not preserved. */
+ if (iommu_preserved_state(&iommu->iommu))
+ clear_unpreserved_context_entries(iommu);

How are PCI devices handled during a live update kexec? Do they go
through the standard iommu_release_device() path?

I assume they do not, because if they did, the context entries for
preserved devices could be updated after preservation. If they do bypass
the release_device path, why not just explicitly invoke
iommu_release_device() for all devices that are not preserved?

Using iommu_release_device() for the unpreserved devices would naturally
erase their context entries and securely park those devices in a DMA
blocking state.

+ else
+ iommu_disable_translation(iommu);
}
}


[...]

Thanks,
baolu