diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_job.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 18 | 
1 files changed, 8 insertions, 10 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index b9d08bc96581..100f04475943 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c @@ -102,8 +102,6 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)  		return DRM_GPU_SCHED_STAT_ENODEV;  	} -	adev->job_hang = true; -  	/*  	 * Do the coredump immediately after a job timeout to get a very  	 * close dump/snapshot/representation of GPU's current error status @@ -181,7 +179,6 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)  	}  exit: -	adev->job_hang = false;  	drm_dev_exit(idx);  	return DRM_GPU_SCHED_STAT_NOMINAL;  } @@ -197,11 +194,6 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	if (!*job)  		return -ENOMEM; -	/* -	 * Initialize the scheduler to at least some ring so that we always -	 * have a pointer to adev. -	 */ -	(*job)->base.sched = &adev->rings[0]->sched;  	(*job)->vm = vm;  	amdgpu_sync_create(&(*job)->explicit_sync); @@ -255,7 +247,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; @@ -268,7 +259,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(&job->ibs[i], f);  }  static void amdgpu_job_free_cb(struct drm_sched_job *s_job) @@ -367,6 +358,13 @@ amdgpu_job_prepare_job(struct drm_sched_job *sched_job,  			dev_err(ring->adev->dev, "Error getting VM ID (%d)\n", r);  			goto error;  		} +		/* +		 * The VM structure might be released after the VMID is +		 * assigned, we had multiple problems with people trying to use +		 * the VM pointer so better set it to NULL. +		 */ +		if (!fence) +			job->vm = NULL;  	}  	return fence; | 
