Jason Gunthorpe <[email protected]> writes:

> The sashiko note does look legit though:
>
>       if (IS_ENABLED(CONFIG_DMA_DIRECT_REMAP) &&
>           !gfpflags_allow_blocking(gfp) && !coherent) {
>               page = dma_alloc_from_pool(dev, PAGE_ALIGN(size), &cpu_addr,
>                                          gfp, attrs, NULL);
>               if (!page)
>                       return NULL;
>
> I don't see anything doing the force_dma_unencrypted test along this
> callchain..
>
> I guess it should be done one step up in dma_alloc_attrs() instead of
> in dma_direct_alloc()?
>

I think we should do something similar to what dma_map_phys() does here,
considering that we only support DMA direct with 
DMA_ATTR_CC_SHARED/DMA_ATTR_ALLOC_CC_SHARED.

@@ -637,6 +637,7 @@ void *dma_alloc_attrs(struct device *dev, size_t size, 
dma_addr_t *dma_handle,
 {
        const struct dma_map_ops *ops = get_dma_ops(dev);
        void *cpu_addr;
+       bool is_cc_shared;
 
        WARN_ON_ONCE(!dev->coherent_dma_mask);
 
@@ -657,8 +658,17 @@ void *dma_alloc_attrs(struct device *dev, size_t size, 
dma_addr_t *dma_handle,
        /* let the implementation decide on the zone to allocate from: */
        flag &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
 
+       if (force_dma_unencrypted(dev))
+               attrs |= DMA_ATTR_ALLOC_CC_SHARED;
+
+       is_cc_shared = attrs & DMA_ATTR_CC_SHARED;
+
        if (dma_alloc_direct(dev, ops) || arch_dma_alloc_direct(dev)) {
                cpu_addr = dma_direct_alloc(dev, size, dma_handle, flag, attrs);
+       } else if (is_cc_shared) {
+               trace_dma_alloc(dev, NULL, 0, size, DMA_BIDIRECTIONAL, flag,
+                               attrs);
+               return NULL;
        } else if (use_dma_iommu(dev)) {
                cpu_addr = iommu_dma_alloc(dev, size, dma_handle, flag, attrs);
        } else if (ops->alloc) {

-aneesh

Reply via email to