[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] xen/swiotlb: add alignment check for dma buffers



On 13.09.2024 16:56, Juergen Gross wrote:
> --- a/drivers/xen/swiotlb-xen.c
> +++ b/drivers/xen/swiotlb-xen.c
> @@ -78,9 +78,15 @@ static inline int 
> range_straddles_page_boundary(phys_addr_t p, size_t size)
>  {
>       unsigned long next_bfn, xen_pfn = XEN_PFN_DOWN(p);
>       unsigned int i, nr_pages = XEN_PFN_UP(xen_offset_in_page(p) + size);
> +     unsigned int order = get_order(size);
>  
>       next_bfn = pfn_to_bfn(xen_pfn);
>  
> +     /* If buffer is physically aligned, ensure DMA alignment. */
> +     if (IS_ALIGNED(p, 1UL << (order + PAGE_SHIFT)) &&

Why this check? xen_swiotlb_alloc_coherent() guarantees it, while
xen_swiotlb_free_coherent() only checks properties of the original
allocation. And for xen_swiotlb_map_page() this looks actively
wrong to me, in case that function was called with offset non-zero.

Unrelated to this, but in related code: xen_swiotlb_alloc_coherent()
can't validly use XEN_PAGE_SHIFT, can it (in the way it does at
least)? If XEN_PAGE_SHIFT < PAGE_SHIFT, and with order calculated
from the latter, the used size will be too small afaict.

Jan



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.