Skip to content

Commit c03e9c4

Browse files
committed
Merge tag 'dma-mapping-6.19-2026-01-20' of git://git.kernel.org/pub/scm/linux/kernel/git/mszyprowski/linux
Pull dma-mapping fixes from Marek Szyprowski: - minor fixes for the corner cases of the SWIOTLB pool management (Robin Murphy) * tag 'dma-mapping-6.19-2026-01-20' of git://git.kernel.org/pub/scm/linux/kernel/git/mszyprowski/linux: dma/pool: Avoid allocating redundant pools mm_zone: Generalise has_managed_dma() dma/pool: Improve pool lookup
2 parents 8f7537e + c6ccd09 commit c03e9c4

3 files changed

Lines changed: 25 additions & 19 deletions

File tree

include/linux/mmzone.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,14 +1648,15 @@ static inline int is_highmem(const struct zone *zone)
16481648
return is_highmem_idx(zone_idx(zone));
16491649
}
16501650

1651-
#ifdef CONFIG_ZONE_DMA
1652-
bool has_managed_dma(void);
1653-
#else
1651+
bool has_managed_zone(enum zone_type zone);
16541652
static inline bool has_managed_dma(void)
16551653
{
1654+
#ifdef CONFIG_ZONE_DMA
1655+
return has_managed_zone(ZONE_DMA);
1656+
#else
16561657
return false;
1657-
}
16581658
#endif
1659+
}
16591660

16601661

16611662
#ifndef CONFIG_NUMA

kernel/dma/pool.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,12 @@ static __init struct gen_pool *__dma_atomic_pool_init(size_t pool_size,
184184
return pool;
185185
}
186186

187+
#ifdef CONFIG_ZONE_DMA32
188+
#define has_managed_dma32 has_managed_zone(ZONE_DMA32)
189+
#else
190+
#define has_managed_dma32 false
191+
#endif
192+
187193
static int __init dma_atomic_pool_init(void)
188194
{
189195
int ret = 0;
@@ -199,17 +205,20 @@ static int __init dma_atomic_pool_init(void)
199205
}
200206
INIT_WORK(&atomic_pool_work, atomic_pool_work_fn);
201207

202-
atomic_pool_kernel = __dma_atomic_pool_init(atomic_pool_size,
208+
/* All memory might be in the DMA zone(s) to begin with */
209+
if (has_managed_zone(ZONE_NORMAL)) {
210+
atomic_pool_kernel = __dma_atomic_pool_init(atomic_pool_size,
203211
GFP_KERNEL);
204-
if (!atomic_pool_kernel)
205-
ret = -ENOMEM;
212+
if (!atomic_pool_kernel)
213+
ret = -ENOMEM;
214+
}
206215
if (has_managed_dma()) {
207216
atomic_pool_dma = __dma_atomic_pool_init(atomic_pool_size,
208217
GFP_KERNEL | GFP_DMA);
209218
if (!atomic_pool_dma)
210219
ret = -ENOMEM;
211220
}
212-
if (IS_ENABLED(CONFIG_ZONE_DMA32)) {
221+
if (has_managed_dma32) {
213222
atomic_pool_dma32 = __dma_atomic_pool_init(atomic_pool_size,
214223
GFP_KERNEL | GFP_DMA32);
215224
if (!atomic_pool_dma32)
@@ -224,11 +233,11 @@ postcore_initcall(dma_atomic_pool_init);
224233
static inline struct gen_pool *dma_guess_pool(struct gen_pool *prev, gfp_t gfp)
225234
{
226235
if (prev == NULL) {
227-
if (IS_ENABLED(CONFIG_ZONE_DMA32) && (gfp & GFP_DMA32))
228-
return atomic_pool_dma32;
229-
if (atomic_pool_dma && (gfp & GFP_DMA))
230-
return atomic_pool_dma;
231-
return atomic_pool_kernel;
236+
if (gfp & GFP_DMA)
237+
return atomic_pool_dma ?: atomic_pool_dma32 ?: atomic_pool_kernel;
238+
if (gfp & GFP_DMA32)
239+
return atomic_pool_dma32 ?: atomic_pool_dma ?: atomic_pool_kernel;
240+
return atomic_pool_kernel ?: atomic_pool_dma32 ?: atomic_pool_dma;
232241
}
233242
if (prev == atomic_pool_kernel)
234243
return atomic_pool_dma32 ? atomic_pool_dma32 : atomic_pool_dma;

mm/page_alloc.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7457,20 +7457,16 @@ bool put_page_back_buddy(struct page *page)
74577457
}
74587458
#endif
74597459

7460-
#ifdef CONFIG_ZONE_DMA
7461-
bool has_managed_dma(void)
7460+
bool has_managed_zone(enum zone_type zone)
74627461
{
74637462
struct pglist_data *pgdat;
74647463

74657464
for_each_online_pgdat(pgdat) {
7466-
struct zone *zone = &pgdat->node_zones[ZONE_DMA];
7467-
7468-
if (managed_zone(zone))
7465+
if (managed_zone(&pgdat->node_zones[zone]))
74697466
return true;
74707467
}
74717468
return false;
74727469
}
7473-
#endif /* CONFIG_ZONE_DMA */
74747470

74757471
#ifdef CONFIG_UNACCEPTED_MEMORY
74767472

0 commit comments

Comments
 (0)