[PATCH 1/3] drm/amdgpu: don't access invalid sched

Christian König christian.koenig at amd.com
Thu Dec 12 09:28:44 UTC 2024


Am 11.12.24 um 18:10 schrieb Pierre-Eric Pelloux-Prayer:
> Since 2320c9e6a768 ("drm/sched: memset() 'job' in drm_sched_job_init()")
> accessing job->base.sched can produce unexpected results as the initialisation
> of (*job)->base.sched done in amdgpu_job_alloc is overwritten by the
> memset.
>
> This commit fixes an issue when a CS would fail validation and would
> be rejected after job->num_ibs is incremented. In this case,
> amdgpu_ib_free(ring->adev, ...) will be called, which would crash the
> machine because the ring value is bogus.
>
> To fix this, pass a NULL pointer to amdgpu_ib_free(): we can do this
> because the device is actually not used in this function.
>
> The next commit will remove the ring argument completely.
>
> Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>

I would squash patch #1 and #2 together, but that isn't a must have.

We should look out for potential issues with patch #3, but I still hope 
that we cleaned up all users of this pointer.

Series is Reviewed-by: Christian König <christian.koenig at amd.com>

Regards,
Christian.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 3 +--
>   1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> index 9b322569255e..9ec8d5a8e48c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> @@ -256,7 +256,6 @@ void amdgpu_job_set_resources(struct amdgpu_job *job, struct amdgpu_bo *gds,
>   
>   void amdgpu_job_free_resources(struct amdgpu_job *job)
>   {
> -	struct amdgpu_ring *ring = to_amdgpu_ring(job->base.sched);
>   	struct dma_fence *f;
>   	unsigned i;
>   
> @@ -269,7 +268,7 @@ void amdgpu_job_free_resources(struct amdgpu_job *job)
>   		f = NULL;
>   
>   	for (i = 0; i < job->num_ibs; ++i)
> -		amdgpu_ib_free(ring->adev, &job->ibs[i], f);
> +		amdgpu_ib_free(NULL, &job->ibs[i], f);
>   }
>   
>   static void amdgpu_job_free_cb(struct drm_sched_job *s_job)



More information about the amd-gfx mailing list