![]() [ Upstream commit 51b30ecb73b481d5fac6ccf2ecb4a309c9ee3310 ]
Nicolin reports that swiotlb buffer allocations fail for an NVME device
behind an IOMMU using 64KiB pages. This is because we end up with a
minimum allocation alignment of 64KiB (for the IOMMU to map the buffer
safely) but a minimum DMA alignment mask corresponding to a 4KiB NVME
page (i.e. preserving the 4KiB page offset from the original allocation).
If the original address is not 4KiB-aligned, the allocation will fail
because swiotlb_search_pool_area() erroneously compares these unmasked
bits with the 64KiB-aligned candidate allocation.
Tweak swiotlb_search_pool_area() so that the DMA alignment mask is
reduced based on the required alignment of the allocation.
Fixes:
|
||
---|---|---|
.. | ||
Kconfig | ||
Makefile | ||
coherent.c | ||
contiguous.c | ||
debug.c | ||
debug.h | ||
direct.c | ||
direct.h | ||
dummy.c | ||
map_benchmark.c | ||
mapping.c | ||
ops_helpers.c | ||
pool.c | ||
remap.c | ||
swiotlb.c |