dma-direct: optimize page freeing when it is not addressable
authorChen Yu <yu.c.chen@intel.com>
Sat, 31 Aug 2024 11:01:19 +0000 (19:01 +0800)
committerChristoph Hellwig <hch@lst.de>
Wed, 4 Sep 2024 04:08:51 +0000 (07:08 +0300)
When the CMA allocation succeeds but isn't addressable, its buffer has
already been released and the page is set to NULL.  So later when the
normal page allocation succeeds but isn't addressable, __free_pages()
can be used to free that normal page rather than using
dma_free_contiguous that does extra checks that are not needed.

Signed-off-by: Chen Yu <yu.c.chen@intel.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
kernel/dma/direct.c

index f2ba074..5b4e6d3 100644 (file)
@@ -140,7 +140,7 @@ again:
        if (!page)
                page = alloc_pages_node(node, gfp, get_order(size));
        if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) {
-               dma_free_contiguous(dev, page, size);
+               __free_pages(page, get_order(size));
                page = NULL;
 
                if (IS_ENABLED(CONFIG_ZONE_DMA32) &&