]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
dma-direct: fix use of max_pfn
authorPetr Tesarik <ptesarik@suse.com>
Fri, 10 Apr 2026 11:35:06 +0000 (13:35 +0200)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Thu, 30 Apr 2026 06:21:34 +0000 (08:21 +0200)
Calculate the correct physical address of the last byte of memory. Since
max_pfn is in fact "the PFN of the first page after the highest system RAM
in physical address space", the highest address that might be used for a
DMA buffer is one byte below max_pfn << PAGE_SHIFT.

This fix is unlikely to make any difference in practice. It's just that the
current formula is slightly confusing.

Signed-off-by: Petr Tesarik <ptesarik@suse.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20260410113506.262579-1-ptesarik@suse.com
kernel/dma/direct.c

index ec887f443741835d8bae31df223862268a562dd8..583c5922bca2dac2910037685ec1aaa85665b871 100644 (file)
@@ -39,7 +39,7 @@ static inline struct page *dma_direct_to_page(struct device *dev,
 
 u64 dma_direct_get_required_mask(struct device *dev)
 {
-       phys_addr_t phys = (phys_addr_t)(max_pfn - 1) << PAGE_SHIFT;
+       phys_addr_t phys = ((phys_addr_t)max_pfn << PAGE_SHIFT) - 1;
        u64 max_dma = phys_to_dma_direct(dev, phys);
 
        return (1ULL << (fls64(max_dma) - 1)) * 2 - 1;
@@ -553,7 +553,7 @@ int dma_direct_mmap(struct device *dev, struct vm_area_struct *vma,
 
 int dma_direct_supported(struct device *dev, u64 mask)
 {
-       u64 min_mask = (max_pfn - 1) << PAGE_SHIFT;
+       u64 min_mask = ((u64)max_pfn << PAGE_SHIFT) - 1;
 
        /*
         * Because 32-bit DMA masks are so common we expect every architecture