Skip to content

Commit 9f40ec8

Browse files
committed
xen/swiotlb: add alignment check for dma buffers
When checking a memory buffer to be consecutive in machine memory, the alignment needs to be checked, too. Failing to do so might result in DMA memory not being aligned according to its requested size, leading to error messages like: 4xxx 0000:2b:00.0: enabling device (0140 -> 0142) 4xxx 0000:2b:00.0: Ring address not aligned 4xxx 0000:2b:00.0: Failed to initialise service qat_crypto 4xxx 0000:2b:00.0: Resetting device qat_dev0 4xxx: probe of 0000:2b:00.0 failed with error -14 Fixes: 9435cce ("xen/swiotlb: Add support for 64KB page granularity") Signed-off-by: Juergen Gross <[email protected]> Reviewed-by: Stefano Stabellini <[email protected]> Signed-off-by: Juergen Gross <[email protected]>
1 parent a8d0b5e commit 9f40ec8

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

drivers/xen/swiotlb-xen.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,15 @@ static inline int range_straddles_page_boundary(phys_addr_t p, size_t size)
7878
{
7979
unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p);
8080
unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size);
81+
phys_addr_t algn = 1ULL << (get_order(size) + PAGE_SHIFT);
8182

8283
next_bfn = pfn_to_bfn(xen_pfn);
8384

85+
/* If buffer is physically aligned, ensure DMA alignment. */
86+
if (IS_ALIGNED(p, algn) &&
87+
!IS_ALIGNED((phys_addr_t)next_bfn << XEN_PAGE_SHIFT, algn))
88+
return 1;
89+
8490
for (i = 1; i < nr_pages; i++)
8591
if (pfn_to_bfn(++xen_pfn) != ++next_bfn)
8692
return 1;

0 commit comments

Comments
 (0)