Skip to content

Commit 9f683df

Browse files
ptesarikmszyprow
authored andcommitted
dma-direct: clean up the logic in __dma_direct_alloc_pages()
Convert a goto-based loop to a while() loop. To allow the simplification, return early when allocation from CMA is successful. As a bonus, this early return avoids a repeated dma_coherent_ok() check. No functional change. Signed-off-by: Petr Tesarik <ptesarik@suse.com> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Link: https://lore.kernel.org/r/20250710083829.1853466-1-ptesarik@suse.com
1 parent 8f5ae30 commit 9f683df

1 file changed

Lines changed: 13 additions & 18 deletions

File tree

kernel/dma/direct.c

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ static struct page *__dma_direct_alloc_pages(struct device *dev, size_t size,
120120
gfp_t gfp, bool allow_highmem)
121121
{
122122
int node = dev_to_node(dev);
123-
struct page *page = NULL;
123+
struct page *page;
124124
u64 phys_limit;
125125

126126
WARN_ON_ONCE(!PAGE_ALIGNED(size));
@@ -131,30 +131,25 @@ static struct page *__dma_direct_alloc_pages(struct device *dev, size_t size,
131131
gfp |= dma_direct_optimal_gfp_mask(dev, &phys_limit);
132132
page = dma_alloc_contiguous(dev, size, gfp);
133133
if (page) {
134-
if (!dma_coherent_ok(dev, page_to_phys(page), size) ||
135-
(!allow_highmem && PageHighMem(page))) {
136-
dma_free_contiguous(dev, page, size);
137-
page = NULL;
138-
}
134+
if (dma_coherent_ok(dev, page_to_phys(page), size) &&
135+
(allow_highmem || !PageHighMem(page)))
136+
return page;
137+
138+
dma_free_contiguous(dev, page, size);
139139
}
140-
again:
141-
if (!page)
142-
page = alloc_pages_node(node, gfp, get_order(size));
143-
if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) {
140+
141+
while ((page = alloc_pages_node(node, gfp, get_order(size)))
142+
&& !dma_coherent_ok(dev, page_to_phys(page), size)) {
144143
__free_pages(page, get_order(size));
145-
page = NULL;
146144

147145
if (IS_ENABLED(CONFIG_ZONE_DMA32) &&
148146
phys_limit < DMA_BIT_MASK(64) &&
149-
!(gfp & (GFP_DMA32 | GFP_DMA))) {
147+
!(gfp & (GFP_DMA32 | GFP_DMA)))
150148
gfp |= GFP_DMA32;
151-
goto again;
152-
}
153-
154-
if (IS_ENABLED(CONFIG_ZONE_DMA) && !(gfp & GFP_DMA)) {
149+
else if (IS_ENABLED(CONFIG_ZONE_DMA) && !(gfp & GFP_DMA))
155150
gfp = (gfp & ~GFP_DMA32) | GFP_DMA;
156-
goto again;
157-
}
151+
else
152+
return NULL;
158153
}
159154

160155
return page;

0 commit comments

Comments
 (0)