ARM: dma-api: fix off-by-one error in __dma_supported()
authorRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 10 Mar 2015 16:41:35 +0000 (16:41 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 10 Mar 2015 19:48:35 +0000 (19:48 +0000)
When validating the mask against the amount of memory we have available
(so that we can trap 32-bit DMA addresses with >32-bits memory), we had
not taken account of the fact that max_pfn is the maximum PFN number
plus one that would be in the system.

There are several references in the code which bear this out:

mm/page_owner.c:
for (; pfn < max_pfn; pfn++) {
}

arch/x86/kernel/setup.c:
high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1)

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mm/dma-mapping.c

index 170a116d1b298c1befb81efdeaee49735362fd26..c27447653903f1134594fe309dc885285ea43bb3 100644 (file)
@@ -171,7 +171,7 @@ static int __dma_supported(struct device *dev, u64 mask, bool warn)
         */
        if (sizeof(mask) != sizeof(dma_addr_t) &&
            mask > (dma_addr_t)~0 &&
-           dma_to_pfn(dev, ~0) < max_pfn) {
+           dma_to_pfn(dev, ~0) < max_pfn - 1) {
                if (warn) {
                        dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n",
                                 mask);