iommu/amd: Use iommu_alloc_pages_node_sz() for the IRT
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 8 Apr 2025 16:54:10 +0000 (13:54 -0300)
committerJoerg Roedel <jroedel@suse.de>
Thu, 17 Apr 2025 14:22:53 +0000 (16:22 +0200)
Use the actual size of the irq_table allocation, limiting to 128 due to
the HW alignment needs.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/22-v4-c8663abbb606+3f7-iommu_pages_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/amd_iommu_types.h
drivers/iommu/amd/iommu.c

index 5ea73f0..bc9f0bb 100644 (file)
 #define DTE_IRQ_REMAP_INTCTL    (2ULL << 60)
 #define DTE_IRQ_REMAP_ENABLE    1ULL
 
+#define DTE_INTTAB_ALIGNMENT    128
 #define DTE_INTTABLEN_MASK      (0xfULL << 1)
 #define DTE_INTTABLEN_VALUE_512 9ULL
 #define DTE_INTTABLEN_512       (DTE_INTTABLEN_VALUE_512 << 1)
index ed04d14..dea0fed 100644 (file)
@@ -3129,7 +3129,7 @@ static struct irq_remap_table *get_irq_table(struct amd_iommu *iommu, u16 devid)
        return table;
 }
 
-static struct irq_remap_table *__alloc_irq_table(int nid, int order)
+static struct irq_remap_table *__alloc_irq_table(int nid, size_t size)
 {
        struct irq_remap_table *table;
 
@@ -3137,7 +3137,8 @@ static struct irq_remap_table *__alloc_irq_table(int nid, int order)
        if (!table)
                return NULL;
 
-       table->table = iommu_alloc_pages_node(nid, GFP_KERNEL, order);
+       table->table = iommu_alloc_pages_node_sz(
+               nid, GFP_KERNEL, max(DTE_INTTAB_ALIGNMENT, size));
        if (!table->table) {
                kfree(table);
                return NULL;
@@ -3191,7 +3192,6 @@ static struct irq_remap_table *alloc_irq_table(struct amd_iommu *iommu,
        struct irq_remap_table *new_table = NULL;
        struct amd_iommu_pci_seg *pci_seg;
        unsigned long flags;
-       int order = get_order(get_irq_table_size(max_irqs));
        int nid = iommu && iommu->dev ? dev_to_node(&iommu->dev->dev) : NUMA_NO_NODE;
        u16 alias;
 
@@ -3211,7 +3211,7 @@ static struct irq_remap_table *alloc_irq_table(struct amd_iommu *iommu,
        spin_unlock_irqrestore(&iommu_table_lock, flags);
 
        /* Nothing there yet, allocate new irq remapping table */
-       new_table = __alloc_irq_table(nid, order);
+       new_table = __alloc_irq_table(nid, get_irq_table_size(max_irqs));
        if (!new_table)
                return NULL;