On Wed, Sep 23, 2026 at 05:19:52PM +0530, Aneesh Kumar K.V wrote:
> Catalin Marinas <[email protected]> writes:
> > On Mon, Sep 21, 2026 at 08:18:40PM +0530, Aneesh Kumar K.V (Arm) wrote:
> >> @@ -125,7 +126,8 @@ static inline int 
> >> dma_contiguous_reserve_area(phys_addr_t size,
> >>    return -ENOSYS;
> >>  }
> >>  static inline struct page *dma_alloc_from_contiguous(struct device *dev,
> >> -          size_t count, unsigned int order, bool no_warn)
> >> +          size_t count, unsigned int order, unsigned int required_order,
> >> +          bool no_warn)
> >>  {
> >>    return NULL;
> >>  }
> >> @@ -136,7 +138,7 @@ static inline bool dma_release_from_contiguous(struct 
> >> device *dev,
> >>  }
> >>  /* Use fallback alloc() and free() when CONFIG_DMA_CMA=n */
> >>  static inline struct page *dma_alloc_contiguous(struct device *dev, 
> >> size_t size,
> >> -          gfp_t gfp)
> >> +          gfp_t gfp, unsigned int align_order)
> >
> > Can we not just bake the alignment further down in these functions
> > rather than getting the callers to pass the {required,align}_order?
> >
> 
> But, we need this to be conditional on CoCo shared allocations. We could
> derive that from attrs and pass attrs instead of align_order, i.e.
> something like:
> 
> 
>  struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
> -             unsigned int align, unsigned int required_align, bool no_warn)
> +             unsigned int align, unsigned long attrs, bool no_warn)
>  {
> -     if (required_align > CONFIG_CMA_ALIGNMENT)
> +     if (!dma_contiguous_resolve_alignment(attrs, &align))
>               return NULL;
> -     align = min(max(align, required_align), CONFIG_CMA_ALIGNMENT);
>  
>       return cma_alloc(dev_get_cma_area(dev), count, align, no_warn);
>  }
> 
> 
> with
> 
> +static bool dma_contiguous_resolve_alignment(unsigned long attrs,
> +                                          unsigned int *align)
> +{
> +     unsigned int required_align = 0;
> +
> +     if (attrs & __DMA_ATTR_ALLOC_CC_SHARED)
> +             required_align = get_order(cc_shared_granule_size());
> +     if (required_align > CONFIG_CMA_ALIGNMENT)
> +             return false;
> +
> +     *align = min(max(*align, required_align), CONFIG_CMA_ALIGNMENT);
> +     return true;
> +}

Yes, I think this would work.

-- 
Catalin

Reply via email to