diff options
author | Will Deacon <will@kernel.org> | 2024-03-08 15:28:25 +0000 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2024-03-13 11:39:22 -0700 |
commit | 823353b7cf0ea9dfb09f5181d5fb2825d727200b (patch) | |
tree | 26da8a6c2a3eef07150016a861b31105783a2602 /kernel/dma | |
parent | 04867a7a33324c9c562ee7949dbcaab7aaad1fb4 (diff) | |
download | linux-823353b7cf0ea9dfb09f5181d5fb2825d727200b.tar.gz linux-823353b7cf0ea9dfb09f5181d5fb2825d727200b.tar.bz2 linux-823353b7cf0ea9dfb09f5181d5fb2825d727200b.zip |
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>
Diffstat (limited to 'kernel/dma')
-rw-r--r-- | kernel/dma/swiotlb.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c index 980a7ec70418..88114433f1e6 100644 --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -1689,6 +1689,12 @@ struct page *swiotlb_alloc(struct device *dev, size_t size) return NULL; tlb_addr = slot_addr(pool->start, index); + if (unlikely(!PAGE_ALIGNED(tlb_addr))) { + dev_WARN_ONCE(dev, 1, "Cannot allocate pages from non page-aligned swiotlb addr 0x%pa.\n", + &tlb_addr); + swiotlb_release_slots(dev, tlb_addr); + return NULL; + } return pfn_to_page(PFN_DOWN(tlb_addr)); } |