dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/3] AMDGPU / RADEON / DRM Fix mapping of user pages
@ 2020-03-25  0:24 Shane Francis
  2020-03-25  0:24 ` [PATCH v3 1/3] drm/prime: use length macro when mapping sgl Shane Francis
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Shane Francis @ 2020-03-25  0:24 UTC (permalink / raw)
  To: dri-devel; +Cc: airlied, bigbeeshane, alexander.deucher, christian.koenig

This patch set is to fix a bug in amdgpu / radeon drm that results in
a crash when dma_map_sg combines elemnets within a scatterlist table. 

There are 2 shortfalls in the current kernel.

1) AMDGPU / RADEON assumes that the requested and created scatterlist
   table lengths using from dma_map_sg are equal. This may not be the
   case using the newer dma-iommu implementation

2) drm_prime does not fetch the length of the scatterlist
   via the correct dma macro, this can use the incorrect length
   being used (>0) in places where dma_map_sg has updated the table
   elements.

   The sg_dma_len macro is representative of the length of the sg item
   after dma_map_sg

Example Crash :
> [drm:amdgpu_ttm_backend_bind [amdgpu]] *ERROR* failed to pin userptr

This happens in OpenCL applications, causing them to crash or hang, on
either amdgpu-pro or ROCm OpenCL implementations

Shane Francis (3):
  drm/prime: use dma length macro when mapping sg to arrays
  drm/amdgpu: fix scatter-gather mapping with user pages
  drm/radeon: fix scatter-gather mapping with user pages

 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +-
 drivers/gpu/drm/drm_prime.c             | 4 +++-
 drivers/gpu/drm/radeon/radeon_ttm.c     | 2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)

-- 
2.26.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v3 1/3] drm/prime: use length macro when mapping sgl
  2020-03-25  0:24 [PATCH v3 0/3] AMDGPU / RADEON / DRM Fix mapping of user pages Shane Francis
@ 2020-03-25  0:24 ` Shane Francis
  2020-03-25  7:54   ` Christian König
  2020-03-25  0:24 ` [PATCH v3 2/3] drm/amdgpu: fix scatter-gather mapping with user pages Shane Francis
  2020-03-25  0:24 ` [PATCH v3 3/3] drm/radeon: " Shane Francis
  2 siblings, 1 reply; 5+ messages in thread
From: Shane Francis @ 2020-03-25  0:24 UTC (permalink / raw)
  To: dri-devel; +Cc: airlied, bigbeeshane, alexander.deucher, christian.koenig

As dma_map_sg can reorganize scatter-gather lists in a
way that can cause some later segments to be empty we should
always use the sg_dma_len macro to fetch the actual length.

This could now be 0 and not need to be mapped to a page or
address array

Signed-off-by: Shane Francis <bigbeeshane@gmail.com>
---
 drivers/gpu/drm/drm_prime.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 86d9b0e45c8c..e4eff5b84597 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -965,12 +965,14 @@ int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
 	u32 len, index;
 	dma_addr_t addr;
 
+
 	index = 0;
 	for_each_sg(sgt->sgl, sg, sgt->nents, count) {
-		len = sg->length;
+		len = sg_dma_len(sg);
 		page = sg_page(sg);
 		addr = sg_dma_address(sg);
 
+
 		while (len > 0) {
 			if (WARN_ON(index >= max_entries))
 				return -1;
-- 
2.26.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 2/3] drm/amdgpu: fix scatter-gather mapping with user pages
  2020-03-25  0:24 [PATCH v3 0/3] AMDGPU / RADEON / DRM Fix mapping of user pages Shane Francis
  2020-03-25  0:24 ` [PATCH v3 1/3] drm/prime: use length macro when mapping sgl Shane Francis
@ 2020-03-25  0:24 ` Shane Francis
  2020-03-25  0:24 ` [PATCH v3 3/3] drm/radeon: " Shane Francis
  2 siblings, 0 replies; 5+ messages in thread
From: Shane Francis @ 2020-03-25  0:24 UTC (permalink / raw)
  To: dri-devel; +Cc: airlied, bigbeeshane, alexander.deucher, christian.koenig

Calls to dma_map_sg may return segments / entries than requested
if they fall on page bounderies. The old implementation did not
support this use case.

Signed-off-by: Shane Francis <bigbeeshane@gmail.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index dee446278417..c6e9885c071f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -974,7 +974,7 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm)
 	/* Map SG to device */
 	r = -ENOMEM;
 	nents = dma_map_sg(adev->dev, ttm->sg->sgl, ttm->sg->nents, direction);
-	if (nents != ttm->sg->nents)
+	if (nents == 0)
 		goto release_sg;
 
 	/* convert SG to linear array of pages and dma addresses */
-- 
2.26.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 3/3] drm/radeon: fix scatter-gather mapping with user pages
  2020-03-25  0:24 [PATCH v3 0/3] AMDGPU / RADEON / DRM Fix mapping of user pages Shane Francis
  2020-03-25  0:24 ` [PATCH v3 1/3] drm/prime: use length macro when mapping sgl Shane Francis
  2020-03-25  0:24 ` [PATCH v3 2/3] drm/amdgpu: fix scatter-gather mapping with user pages Shane Francis
@ 2020-03-25  0:24 ` Shane Francis
  2 siblings, 0 replies; 5+ messages in thread
From: Shane Francis @ 2020-03-25  0:24 UTC (permalink / raw)
  To: dri-devel; +Cc: airlied, bigbeeshane, alexander.deucher, christian.koenig

Calls to dma_map_sg may return segments / entries than requested
if they fall on page bounderies. The old implementation did not
support this use case.

Signed-off-by: Shane Francis <bigbeeshane@gmail.com>
---
 drivers/gpu/drm/radeon/radeon_ttm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 3b92311d30b9..b3380ffab4c2 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -528,7 +528,7 @@ static int radeon_ttm_tt_pin_userptr(struct ttm_tt *ttm)
 
 	r = -ENOMEM;
 	nents = dma_map_sg(rdev->dev, ttm->sg->sgl, ttm->sg->nents, direction);
-	if (nents != ttm->sg->nents)
+	if (nents == 0)
 		goto release_sg;
 
 	drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
-- 
2.26.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 1/3] drm/prime: use length macro when mapping sgl
  2020-03-25  0:24 ` [PATCH v3 1/3] drm/prime: use length macro when mapping sgl Shane Francis
@ 2020-03-25  7:54   ` Christian König
  0 siblings, 0 replies; 5+ messages in thread
From: Christian König @ 2020-03-25  7:54 UTC (permalink / raw)
  To: Shane Francis, dri-devel; +Cc: alexander.deucher, airlied

Am 25.03.20 um 01:24 schrieb Shane Francis:
> As dma_map_sg can reorganize scatter-gather lists in a
> way that can cause some later segments to be empty we should
> always use the sg_dma_len macro to fetch the actual length.
>
> This could now be 0 and not need to be mapped to a page or
> address array
>
> Signed-off-by: Shane Francis <bigbeeshane@gmail.com>
> ---
>   drivers/gpu/drm/drm_prime.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index 86d9b0e45c8c..e4eff5b84597 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -965,12 +965,14 @@ int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
>   	u32 len, index;
>   	dma_addr_t addr;
>   
> +

Unrelated newline change, apart from that the patch looks good to me.

Christian.

>   	index = 0;
>   	for_each_sg(sgt->sgl, sg, sgt->nents, count) {
> -		len = sg->length;
> +		len = sg_dma_len(sg);
>   		page = sg_page(sg);
>   		addr = sg_dma_address(sg);
>   
> +
>   		while (len > 0) {
>   			if (WARN_ON(index >= max_entries))
>   				return -1;

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-03-25  7:54 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-25  0:24 [PATCH v3 0/3] AMDGPU / RADEON / DRM Fix mapping of user pages Shane Francis
2020-03-25  0:24 ` [PATCH v3 1/3] drm/prime: use length macro when mapping sgl Shane Francis
2020-03-25  7:54   ` Christian König
2020-03-25  0:24 ` [PATCH v3 2/3] drm/amdgpu: fix scatter-gather mapping with user pages Shane Francis
2020-03-25  0:24 ` [PATCH v3 3/3] drm/radeon: " Shane Francis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).