Skip to content

Commit 823353b

Browse files
willdeaconChristoph Hellwig
authored andcommitted
swiotlb: Enforce page alignment in swiotlb_alloc()
When allocating pages from a restricted DMA pool in swiotlb_alloc(), the buffer address is blindly converted to a 'struct page *' that is returned to the caller. In the unlikely event of an allocation bug, page-unaligned addresses are not detected and slots can silently be double-allocated. Add a simple check of the buffer alignment in swiotlb_alloc() to make debugging a little easier if something has gone wonky. Signed-off-by: Will Deacon <will@kernel.org> Reviewed-by: Michael Kelley <mhklinux@outlook.com> Reviewed-by: Petr Tesarik <petr.tesarik1@huawei-partners.com> Tested-by: Nicolin Chen <nicolinc@nvidia.com> Tested-by: Michael Kelley <mhklinux@outlook.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
1 parent 04867a7 commit 823353b

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

kernel/dma/swiotlb.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,6 +1689,12 @@ struct page *swiotlb_alloc(struct device *dev, size_t size)
16891689
return NULL;
16901690

16911691
tlb_addr = slot_addr(pool->start, index);
1692+
if (unlikely(!PAGE_ALIGNED(tlb_addr))) {
1693+
dev_WARN_ONCE(dev, 1, "Cannot allocate pages from non page-aligned swiotlb addr 0x%pa.\n",
1694+
&tlb_addr);
1695+
swiotlb_release_slots(dev, tlb_addr);
1696+
return NULL;
1697+
}
16921698

16931699
return pfn_to_page(PFN_DOWN(tlb_addr));
16941700
}

0 commit comments

Comments
 (0)