diff mbox

[1/2] drm/radeon: fix the crash in benchmark functions

Message ID 1422596324-1737-1-git-send-email-ihadzic@research.bell-labs.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ilija Hadzic Jan. 30, 2015, 5:38 a.m. UTC
radeon_copy_dma and radeon_copy_blit must be called with
a valid reservation object. Otherwise a crash will be provoked.
We borrow the object from destination BO.

Cc: stable@vger.kernel.org
Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com>
---
 drivers/gpu/drm/radeon/radeon_benchmark.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

Comments

Christian König Jan. 30, 2015, 9:20 a.m. UTC | #1
Am 30.01.2015 um 06:38 schrieb Ilija Hadzic:
> radeon_copy_dma and radeon_copy_blit must be called with
> a valid reservation object. Otherwise a crash will be provoked.
> We borrow the object from destination BO.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com>

Ah, yes stumbled over that as well but didn't had time to make a patch 
for it. So thanks a lot for taking care.

Both patches are Reviewed-by: Christian König <christian.koenig@amd.com>

Regards,
Christian.

> ---
>   drivers/gpu/drm/radeon/radeon_benchmark.c | 13 ++++++++-----
>   1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
> index 9e7f23d..87d5fb2 100644
> --- a/drivers/gpu/drm/radeon/radeon_benchmark.c
> +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
> @@ -34,7 +34,8 @@
>   
>   static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size,
>   				    uint64_t saddr, uint64_t daddr,
> -				    int flag, int n)
> +				    int flag, int n,
> +				    struct reservation_object *resv)
>   {
>   	unsigned long start_jiffies;
>   	unsigned long end_jiffies;
> @@ -47,12 +48,12 @@ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size,
>   		case RADEON_BENCHMARK_COPY_DMA:
>   			fence = radeon_copy_dma(rdev, saddr, daddr,
>   						size / RADEON_GPU_PAGE_SIZE,
> -						NULL);
> +						resv);
>   			break;
>   		case RADEON_BENCHMARK_COPY_BLIT:
>   			fence = radeon_copy_blit(rdev, saddr, daddr,
>   						 size / RADEON_GPU_PAGE_SIZE,
> -						 NULL);
> +						 resv);
>   			break;
>   		default:
>   			DRM_ERROR("Unknown copy method\n");
> @@ -120,7 +121,8 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
>   
>   	if (rdev->asic->copy.dma) {
>   		time = radeon_benchmark_do_move(rdev, size, saddr, daddr,
> -						RADEON_BENCHMARK_COPY_DMA, n);
> +						RADEON_BENCHMARK_COPY_DMA, n,
> +						dobj->tbo.resv);
>   		if (time < 0)
>   			goto out_cleanup;
>   		if (time > 0)
> @@ -130,7 +132,8 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
>   
>   	if (rdev->asic->copy.blit) {
>   		time = radeon_benchmark_do_move(rdev, size, saddr, daddr,
> -						RADEON_BENCHMARK_COPY_BLIT, n);
> +						RADEON_BENCHMARK_COPY_BLIT, n,
> +						dobj->tbo.resv);
>   		if (time < 0)
>   			goto out_cleanup;
>   		if (time > 0)
Alex Deucher Jan. 30, 2015, 3:05 p.m. UTC | #2
On Fri, Jan 30, 2015 at 4:20 AM, Christian König
<deathsimple@vodafone.de> wrote:
> Am 30.01.2015 um 06:38 schrieb Ilija Hadzic:
>>
>> radeon_copy_dma and radeon_copy_blit must be called with
>> a valid reservation object. Otherwise a crash will be provoked.
>> We borrow the object from destination BO.
>>
>> Cc: stable@vger.kernel.org
>> Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com>
>
>
> Ah, yes stumbled over that as well but didn't had time to make a patch for
> it. So thanks a lot for taking care.
>
> Both patches are Reviewed-by: Christian König <christian.koenig@amd.com>

Applied to my fixes tree.  thanks.  Also noted the relevant bug:
https://bugs.freedesktop.org/show_bug.cgi?id=88464

Alex

>
> Regards,
> Christian.
>
>
>> ---
>>   drivers/gpu/drm/radeon/radeon_benchmark.c | 13 ++++++++-----
>>   1 file changed, 8 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c
>> b/drivers/gpu/drm/radeon/radeon_benchmark.c
>> index 9e7f23d..87d5fb2 100644
>> --- a/drivers/gpu/drm/radeon/radeon_benchmark.c
>> +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
>> @@ -34,7 +34,8 @@
>>     static int radeon_benchmark_do_move(struct radeon_device *rdev,
>> unsigned size,
>>                                     uint64_t saddr, uint64_t daddr,
>> -                                   int flag, int n)
>> +                                   int flag, int n,
>> +                                   struct reservation_object *resv)
>>   {
>>         unsigned long start_jiffies;
>>         unsigned long end_jiffies;
>> @@ -47,12 +48,12 @@ static int radeon_benchmark_do_move(struct
>> radeon_device *rdev, unsigned size,
>>                 case RADEON_BENCHMARK_COPY_DMA:
>>                         fence = radeon_copy_dma(rdev, saddr, daddr,
>>                                                 size /
>> RADEON_GPU_PAGE_SIZE,
>> -                                               NULL);
>> +                                               resv);
>>                         break;
>>                 case RADEON_BENCHMARK_COPY_BLIT:
>>                         fence = radeon_copy_blit(rdev, saddr, daddr,
>>                                                  size /
>> RADEON_GPU_PAGE_SIZE,
>> -                                                NULL);
>> +                                                resv);
>>                         break;
>>                 default:
>>                         DRM_ERROR("Unknown copy method\n");
>> @@ -120,7 +121,8 @@ static void radeon_benchmark_move(struct radeon_device
>> *rdev, unsigned size,
>>         if (rdev->asic->copy.dma) {
>>                 time = radeon_benchmark_do_move(rdev, size, saddr, daddr,
>> -                                               RADEON_BENCHMARK_COPY_DMA,
>> n);
>> +                                               RADEON_BENCHMARK_COPY_DMA,
>> n,
>> +                                               dobj->tbo.resv);
>>                 if (time < 0)
>>                         goto out_cleanup;
>>                 if (time > 0)
>> @@ -130,7 +132,8 @@ static void radeon_benchmark_move(struct radeon_device
>> *rdev, unsigned size,
>>         if (rdev->asic->copy.blit) {
>>                 time = radeon_benchmark_do_move(rdev, size, saddr, daddr,
>> -
>> RADEON_BENCHMARK_COPY_BLIT, n);
>> +
>> RADEON_BENCHMARK_COPY_BLIT, n,
>> +                                               dobj->tbo.resv);
>>                 if (time < 0)
>>                         goto out_cleanup;
>>                 if (time > 0)
>
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
index 9e7f23d..87d5fb2 100644
--- a/drivers/gpu/drm/radeon/radeon_benchmark.c
+++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
@@ -34,7 +34,8 @@ 
 
 static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size,
 				    uint64_t saddr, uint64_t daddr,
-				    int flag, int n)
+				    int flag, int n,
+				    struct reservation_object *resv)
 {
 	unsigned long start_jiffies;
 	unsigned long end_jiffies;
@@ -47,12 +48,12 @@  static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size,
 		case RADEON_BENCHMARK_COPY_DMA:
 			fence = radeon_copy_dma(rdev, saddr, daddr,
 						size / RADEON_GPU_PAGE_SIZE,
-						NULL);
+						resv);
 			break;
 		case RADEON_BENCHMARK_COPY_BLIT:
 			fence = radeon_copy_blit(rdev, saddr, daddr,
 						 size / RADEON_GPU_PAGE_SIZE,
-						 NULL);
+						 resv);
 			break;
 		default:
 			DRM_ERROR("Unknown copy method\n");
@@ -120,7 +121,8 @@  static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
 
 	if (rdev->asic->copy.dma) {
 		time = radeon_benchmark_do_move(rdev, size, saddr, daddr,
-						RADEON_BENCHMARK_COPY_DMA, n);
+						RADEON_BENCHMARK_COPY_DMA, n,
+						dobj->tbo.resv);
 		if (time < 0)
 			goto out_cleanup;
 		if (time > 0)
@@ -130,7 +132,8 @@  static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
 
 	if (rdev->asic->copy.blit) {
 		time = radeon_benchmark_do_move(rdev, size, saddr, daddr,
-						RADEON_BENCHMARK_COPY_BLIT, n);
+						RADEON_BENCHMARK_COPY_BLIT, n,
+						dobj->tbo.resv);
 		if (time < 0)
 			goto out_cleanup;
 		if (time > 0)