On 05/05/2020 09:45, Marek Szyprowski wrote:
The Documentation/DMA-API-HOWTO.txt states that dma_map_sg returns the
numer of the created entries in the DMA address space. However the
subsequent calls to dma_sync_sg_for_{device,cpu} and dma_unmap_sg must be
called with the original number of the entries passed to dma_map_sg. The
sg_table->nents in turn holds the result of the dma_map_sg call as stated
in include/linux/scatterlist.h. A common mistake was to ignore a result
of the dma_map_sg function and don't use the sg_table->orig_nents at all.

To avoid such issues, lets use common dma-mapping wrappers operating
directly on the struct sg_table objects and adjust references to the
nents and orig_nents respectively.

Signed-off-by: Marek Szyprowski <m.szyprow...@samsung.com>

The change looks good to me:

Reviewed-by: Steven Price <steven.pr...@arm.com>

Although I would have appreciated the commit message being modified to match the specifics of Panfrost - the return of dma_mpa_sg() wasn't being ignored, but the use of orig_nents/nents was indeed wrong.

Steve

---
For more information, see '[PATCH v3 00/25] DRM: fix struct sg_table nents
vs. orig_nents misuse' thread: https://lkml.org/lkml/2020/5/5/187
---
  drivers/gpu/drm/panfrost/panfrost_gem.c | 4 ++--
  drivers/gpu/drm/panfrost/panfrost_mmu.c | 5 ++---
  2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c 
b/drivers/gpu/drm/panfrost/panfrost_gem.c
index 17b654e..95d7e80 100644
--- a/drivers/gpu/drm/panfrost/panfrost_gem.c
+++ b/drivers/gpu/drm/panfrost/panfrost_gem.c
@@ -41,8 +41,8 @@ static void panfrost_gem_free_object(struct drm_gem_object 
*obj)
for (i = 0; i < n_sgt; i++) {
                        if (bo->sgts[i].sgl) {
-                               dma_unmap_sg(pfdev->dev, bo->sgts[i].sgl,
-                                            bo->sgts[i].nents, 
DMA_BIDIRECTIONAL);
+                               dma_unmap_sgtable(pfdev->dev, &bo->sgts[i],
+                                                 DMA_BIDIRECTIONAL);
                                sg_free_table(&bo->sgts[i]);
                        }
                }
diff --git a/drivers/gpu/drm/panfrost/panfrost_mmu.c 
b/drivers/gpu/drm/panfrost/panfrost_mmu.c
index ed28aeb..9926111 100644
--- a/drivers/gpu/drm/panfrost/panfrost_mmu.c
+++ b/drivers/gpu/drm/panfrost/panfrost_mmu.c
@@ -517,10 +517,9 @@ static int panfrost_mmu_map_fault_addr(struct 
panfrost_device *pfdev, int as,
        if (ret)
                goto err_pages;
- if (!dma_map_sg(pfdev->dev, sgt->sgl, sgt->nents, DMA_BIDIRECTIONAL)) {
-               ret = -EINVAL;
+       ret = dma_map_sgtable(pfdev->dev, sgt, DMA_BIDIRECTIONAL);
+       if (ret)
                goto err_map;
-       }
mmu_map_sg(pfdev, bomapping->mmu, addr,
                   IOMMU_WRITE | IOMMU_READ | IOMMU_NOEXEC, sgt);


_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to