Commit 823353b7 authored by Will Deacon's avatar Will Deacon Committed by Christoph Hellwig
Browse files

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: default avatarWill Deacon <will@kernel.org>
Reviewed-by: default avatarMichael Kelley <mhklinux@outlook.com>
Reviewed-by: default avatarPetr Tesarik <petr.tesarik1@huawei-partners.com>
Tested-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Tested-by: default avatarMichael Kelley <mhklinux@outlook.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 04867a7a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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));
}