Skip to content

Commit 0a35255

Browse files
drinkcattorvalds
authored andcommitted
iommu/io-pgtable-arm-v7s: request DMA32 memory, and improve debugging
IOMMUs using ARMv7 short-descriptor format require page tables (level 1 and 2) to be allocated within the first 4GB of RAM, even on 64-bit systems. For level 1/2 pages, ensure GFP_DMA32 is used if CONFIG_ZONE_DMA32 is defined (e.g. on arm64 platforms). For level 2 pages, allocate a slab cache in SLAB_CACHE_DMA32. Note that we do not explicitly pass GFP_DMA[32] to kmem_cache_zalloc, as this is not strictly necessary, and would cause a warning in mm/sl*b.c, as we did not update GFP_SLAB_BUG_MASK. Also, print an error when the physical address does not fit in 32-bit, to make debugging easier in the future. Link: http://lkml.kernel.org/r/[email protected] Fixes: ad67f5a ("arm64: replace ZONE_DMA with ZONE_DMA32") Signed-off-by: Nicolas Boichat <[email protected]> Acked-by: Will Deacon <[email protected]> Cc: Christoph Hellwig <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: David Rientjes <[email protected]> Cc: Hsin-Yi Wang <[email protected]> Cc: Huaisheng Ye <[email protected]> Cc: Joerg Roedel <[email protected]> Cc: Joonsoo Kim <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Matthias Brugger <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Pekka Enberg <[email protected]> Cc: Robin Murphy <[email protected]> Cc: Sasha Levin <[email protected]> Cc: Tomasz Figa <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: Yingjoe Chen <[email protected]> Cc: Yong Wu <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 6d6ea1e commit 0a35255

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

drivers/iommu/io-pgtable-arm-v7s.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@
160160

161161
#define ARM_V7S_TCR_PD1 BIT(5)
162162

163+
#ifdef CONFIG_ZONE_DMA32
164+
#define ARM_V7S_TABLE_GFP_DMA GFP_DMA32
165+
#define ARM_V7S_TABLE_SLAB_FLAGS SLAB_CACHE_DMA32
166+
#else
167+
#define ARM_V7S_TABLE_GFP_DMA GFP_DMA
168+
#define ARM_V7S_TABLE_SLAB_FLAGS SLAB_CACHE_DMA
169+
#endif
170+
163171
typedef u32 arm_v7s_iopte;
164172

165173
static bool selftest_running;
@@ -197,13 +205,16 @@ static void *__arm_v7s_alloc_table(int lvl, gfp_t gfp,
197205
void *table = NULL;
198206

199207
if (lvl == 1)
200-
table = (void *)__get_dma_pages(__GFP_ZERO, get_order(size));
208+
table = (void *)__get_free_pages(
209+
__GFP_ZERO | ARM_V7S_TABLE_GFP_DMA, get_order(size));
201210
else if (lvl == 2)
202-
table = kmem_cache_zalloc(data->l2_tables, gfp | GFP_DMA);
211+
table = kmem_cache_zalloc(data->l2_tables, gfp);
203212
phys = virt_to_phys(table);
204-
if (phys != (arm_v7s_iopte)phys)
213+
if (phys != (arm_v7s_iopte)phys) {
205214
/* Doesn't fit in PTE */
215+
dev_err(dev, "Page table does not fit in PTE: %pa", &phys);
206216
goto out_free;
217+
}
207218
if (table && !(cfg->quirks & IO_PGTABLE_QUIRK_NO_DMA)) {
208219
dma = dma_map_single(dev, table, size, DMA_TO_DEVICE);
209220
if (dma_mapping_error(dev, dma))
@@ -733,7 +744,7 @@ static struct io_pgtable *arm_v7s_alloc_pgtable(struct io_pgtable_cfg *cfg,
733744
data->l2_tables = kmem_cache_create("io-pgtable_armv7s_l2",
734745
ARM_V7S_TABLE_SIZE(2),
735746
ARM_V7S_TABLE_SIZE(2),
736-
SLAB_CACHE_DMA, NULL);
747+
ARM_V7S_TABLE_SLAB_FLAGS, NULL);
737748
if (!data->l2_tables)
738749
goto out_free_data;
739750

0 commit comments

Comments
 (0)