diff options
author | Christian König <christian.koenig@amd.com> | 2017-10-09 09:51:10 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-10-19 15:27:05 -0400 |
commit | 7a0a48ddf63bc9944b9690c6fa043ea4305f7f79 (patch) | |
tree | d46685fc1706f888223b0284affb3955f461e584 /drivers/gpu/drm/amd/amdgpu | |
parent | e55f2b646df3318e24f12b8388ab6e5cccb3e92d (diff) |
drm/amdgpu: set -ECANCELED when dropping jobs
And return from the wait functions the fence error code.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index b355189533d2..2ae5d523ca10 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -1298,6 +1298,8 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, | |||
1298 | r = PTR_ERR(fence); | 1298 | r = PTR_ERR(fence); |
1299 | else if (fence) { | 1299 | else if (fence) { |
1300 | r = dma_fence_wait_timeout(fence, true, timeout); | 1300 | r = dma_fence_wait_timeout(fence, true, timeout); |
1301 | if (r > 0 && fence->error) | ||
1302 | r = fence->error; | ||
1301 | dma_fence_put(fence); | 1303 | dma_fence_put(fence); |
1302 | } else | 1304 | } else |
1303 | r = 1; | 1305 | r = 1; |
@@ -1435,6 +1437,9 @@ static int amdgpu_cs_wait_all_fences(struct amdgpu_device *adev, | |||
1435 | 1437 | ||
1436 | if (r == 0) | 1438 | if (r == 0) |
1437 | break; | 1439 | break; |
1440 | |||
1441 | if (fence->error) | ||
1442 | return fence->error; | ||
1438 | } | 1443 | } |
1439 | 1444 | ||
1440 | memset(wait, 0, sizeof(*wait)); | 1445 | memset(wait, 0, sizeof(*wait)); |
@@ -1495,7 +1500,7 @@ out: | |||
1495 | wait->out.status = (r > 0); | 1500 | wait->out.status = (r > 0); |
1496 | wait->out.first_signaled = first; | 1501 | wait->out.first_signaled = first; |
1497 | /* set return value 0 to indicate success */ | 1502 | /* set return value 0 to indicate success */ |
1498 | r = 0; | 1503 | r = array[first]->error; |
1499 | 1504 | ||
1500 | err_free_fence_array: | 1505 | err_free_fence_array: |
1501 | for (i = 0; i < fence_count; i++) | 1506 | for (i = 0; i < fence_count; i++) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index 4f2b5acc8743..a8357885776e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
@@ -197,6 +197,7 @@ static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job) | |||
197 | trace_amdgpu_sched_run_job(job); | 197 | trace_amdgpu_sched_run_job(job); |
198 | /* skip ib schedule when vram is lost */ | 198 | /* skip ib schedule when vram is lost */ |
199 | if (job->vram_lost_counter != atomic_read(&adev->vram_lost_counter)) { | 199 | if (job->vram_lost_counter != atomic_read(&adev->vram_lost_counter)) { |
200 | dma_fence_set_error(&job->base.s_fence->finished, -ECANCELED); | ||
200 | DRM_ERROR("Skip scheduling IBs!\n"); | 201 | DRM_ERROR("Skip scheduling IBs!\n"); |
201 | } else { | 202 | } else { |
202 | r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job, | 203 | r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job, |