Re: [PATCH v2 2/4] drivers/iommu: Add calls for IOMMU_DEBUG_PAGEALLOC

From: Will Deacon

Date: Thu Nov 13 2025 - 06:00:22 EST


On Thu, Nov 06, 2025 at 04:39:51PM +0000, Mostafa Saleh wrote:
> Add calls for the new iommu debug config IOMMU_DEBUG_PAGEALLOC:
> - iommu_debug_init: Enable the debug mode if configured by the user.
> - iommu_debug_map: Track iommu pages mapped, using physical address.
> - iommu_debug_unmap: Track iommu pages unmapped, using IO virtual
> address.
> - iommu_debug_remap: Track iommu pages, already mapped using IOVA.
>
> We have to do the unmap/remap as once pages are unmapped we lose the
> information of the physical address.
> This is racy, but the API is racy by construction as it uses refcounts
> and doesn't attempt to lock/synchronize with the IOMMU API as that will
> be costly, meaning that possibility of false negative exists.
>
> Signed-off-by: Mostafa Saleh <smostafa@xxxxxxxxxx>
> Tested-by: Qinxin Xia <xiaqinxin@xxxxxxxxxx>
> ---
> drivers/iommu/iommu-debug-pagealloc.c | 23 ++++++++++++
> drivers/iommu/iommu.c | 14 ++++++-
> include/linux/iommu-debug-pagealloc.h | 54 +++++++++++++++++++++++++++
> 3 files changed, 89 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iommu/iommu-debug-pagealloc.c b/drivers/iommu/iommu-debug-pagealloc.c
> index 385c8bfae02b..a6a2f844b09d 100644
> --- a/drivers/iommu/iommu-debug-pagealloc.c
> +++ b/drivers/iommu/iommu-debug-pagealloc.c
> @@ -5,11 +5,13 @@
> * IOMMU API debug page alloc sanitizer
> */
> #include <linux/atomic.h>
> +#include <linux/iommu.h>
> #include <linux/iommu-debug-pagealloc.h>
> #include <linux/kernel.h>
> #include <linux/page_ext.h>
>
> static bool needed;
> +DEFINE_STATIC_KEY_FALSE(iommu_debug_initialized);
>
> struct iommu_debug_metadate {
> atomic_t ref;
> @@ -25,6 +27,27 @@ struct page_ext_operations page_iommu_debug_ops = {
> .need = need_iommu_debug,
> };
>
> +void __iommu_debug_map(struct iommu_domain *domain, phys_addr_t phys, size_t size)
> +{
> +}
> +
> +void __iommu_debug_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
> +{
> +}
> +
> +void __iommu_debug_remap(struct iommu_domain *domain, unsigned long iova, size_t size)
> +{
> +}

Since the IOMMU API doesn't really have a "remap" operation, I wonder
whether it would be clearer to have unmap_begin() and unmap_end()
functions instead? You'd probably want to call them as a pair, so the
check for unmapped < size would move into unmap_end().

Will