dma-direct: factor the swiotlb code out of __dma_direct_alloc_pages
authorChristoph Hellwig <hch@lst.de>
Thu, 21 Oct 2021 07:39:12 +0000 (09:39 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 7 Dec 2021 11:50:10 +0000 (12:50 +0100)
Add a new helper to deal with the swiotlb case.  This keeps the code
nicely boundled and removes the not required call to
dma_direct_optimal_gfp_mask for the swiotlb case.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Robin Murphy <robin.murphy@arm.com>
kernel/dma/direct.c

index cf75bfb..924937c 100644 (file)
@@ -102,6 +102,18 @@ static void __dma_direct_free_pages(struct device *dev, struct page *page,
        dma_free_contiguous(dev, page, size);
 }
 
+static struct page *dma_direct_alloc_swiotlb(struct device *dev, size_t size)
+{
+       struct page *page = swiotlb_alloc(dev, size);
+
+       if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) {
+               swiotlb_free(dev, page, size);
+               return NULL;
+       }
+
+       return page;
+}
+
 static struct page *__dma_direct_alloc_pages(struct device *dev, size_t size,
                gfp_t gfp)
 {
@@ -111,17 +123,11 @@ static struct page *__dma_direct_alloc_pages(struct device *dev, size_t size,
 
        WARN_ON_ONCE(!PAGE_ALIGNED(size));
 
+       if (is_swiotlb_for_alloc(dev))
+               return dma_direct_alloc_swiotlb(dev, size);
+
        gfp |= dma_direct_optimal_gfp_mask(dev, dev->coherent_dma_mask,
                                           &phys_limit);
-       if (is_swiotlb_for_alloc(dev)) {
-               page = swiotlb_alloc(dev, size);
-               if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) {
-                       __dma_direct_free_pages(dev, page, size);
-                       return NULL;
-               }
-               return page;
-       }
-
        page = dma_alloc_contiguous(dev, size, gfp);
        if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) {
                dma_free_contiguous(dev, page, size);