iommu/riscv: Convert to use struct iommu_pages_list
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 8 Apr 2025 16:53:57 +0000 (13:53 -0300)
committerJoerg Roedel <jroedel@suse.de>
Thu, 17 Apr 2025 14:22:41 +0000 (16:22 +0200)
Change the internal freelist to use struct iommu_pages_list.

riscv uses this page list to free page table levels that are replaced
with leaf ptes.

Reviewed-by: Tomasz Jeznach <tjeznach@rivosinc.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/9-v4-c8663abbb606+3f7-iommu_pages_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/riscv/iommu.c

index 4fe0734..2750f2e 100644 (file)
@@ -1085,7 +1085,8 @@ static void riscv_iommu_iotlb_sync(struct iommu_domain *iommu_domain,
 #define _io_pte_entry(pn, prot)        ((_PAGE_PFN_MASK & ((pn) << _PAGE_PFN_SHIFT)) | (prot))
 
 static void riscv_iommu_pte_free(struct riscv_iommu_domain *domain,
-                                unsigned long pte, struct list_head *freelist)
+                                unsigned long pte,
+                                struct iommu_pages_list *freelist)
 {
        unsigned long *ptr;
        int i;
@@ -1103,7 +1104,7 @@ static void riscv_iommu_pte_free(struct riscv_iommu_domain *domain,
        }
 
        if (freelist)
-               list_add_tail(&virt_to_page(ptr)->lru, freelist);
+               iommu_pages_list_add(freelist, ptr);
        else
                iommu_free_pages(ptr);
 }
@@ -1192,7 +1193,7 @@ static int riscv_iommu_map_pages(struct iommu_domain *iommu_domain,
        unsigned long *ptr;
        unsigned long pte, old, pte_prot;
        int rc = 0;
-       LIST_HEAD(freelist);
+       struct iommu_pages_list freelist = IOMMU_PAGES_LIST_INIT(freelist);
 
        if (!(prot & IOMMU_WRITE))
                pte_prot = _PAGE_BASE | _PAGE_READ;
@@ -1223,7 +1224,7 @@ static int riscv_iommu_map_pages(struct iommu_domain *iommu_domain,
 
        *mapped = size;
 
-       if (!list_empty(&freelist)) {
+       if (!iommu_pages_list_empty(&freelist)) {
                /*
                 * In 1.0 spec version, the smallest scope we can use to
                 * invalidate all levels of page table (i.e. leaf and non-leaf)