diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c index dcf4a8aca680..438c05254695 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/sched.h> | 26 | #include <linux/sched.h> |
27 | #include <drm/drmP.h> | 27 | #include <drm/drmP.h> |
28 | #include "amdgpu.h" | 28 | #include "amdgpu.h" |
29 | #include "amdgpu_trace.h" | ||
29 | 30 | ||
30 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) | 31 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) |
31 | { | 32 | { |
@@ -44,11 +45,8 @@ static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job) | |||
44 | return NULL; | 45 | return NULL; |
45 | } | 46 | } |
46 | job = to_amdgpu_job(sched_job); | 47 | job = to_amdgpu_job(sched_job); |
47 | mutex_lock(&job->job_lock); | 48 | trace_amdgpu_sched_run_job(job); |
48 | r = amdgpu_ib_schedule(job->adev, | 49 | r = amdgpu_ib_schedule(job->adev, job->num_ibs, job->ibs, job->owner); |
49 | job->num_ibs, | ||
50 | job->ibs, | ||
51 | job->base.owner); | ||
52 | if (r) { | 50 | if (r) { |
53 | DRM_ERROR("Error scheduling IBs (%d)\n", r); | 51 | DRM_ERROR("Error scheduling IBs (%d)\n", r); |
54 | goto err; | 52 | goto err; |
@@ -61,8 +59,6 @@ err: | |||
61 | if (job->free_job) | 59 | if (job->free_job) |
62 | job->free_job(job); | 60 | job->free_job(job); |
63 | 61 | ||
64 | mutex_unlock(&job->job_lock); | ||
65 | fence_put(&job->base.s_fence->base); | ||
66 | kfree(job); | 62 | kfree(job); |
67 | return fence ? &fence->base : NULL; | 63 | return fence ? &fence->base : NULL; |
68 | } | 64 | } |
@@ -88,21 +84,19 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, | |||
88 | return -ENOMEM; | 84 | return -ENOMEM; |
89 | job->base.sched = &ring->sched; | 85 | job->base.sched = &ring->sched; |
90 | job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; | 86 | job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; |
87 | job->base.s_fence = amd_sched_fence_create(job->base.s_entity, owner); | ||
88 | if (!job->base.s_fence) { | ||
89 | kfree(job); | ||
90 | return -ENOMEM; | ||
91 | } | ||
92 | *f = fence_get(&job->base.s_fence->base); | ||
93 | |||
91 | job->adev = adev; | 94 | job->adev = adev; |
92 | job->ibs = ibs; | 95 | job->ibs = ibs; |
93 | job->num_ibs = num_ibs; | 96 | job->num_ibs = num_ibs; |
94 | job->base.owner = owner; | 97 | job->owner = owner; |
95 | mutex_init(&job->job_lock); | ||
96 | job->free_job = free_job; | 98 | job->free_job = free_job; |
97 | mutex_lock(&job->job_lock); | 99 | amd_sched_entity_push_job(&job->base); |
98 | r = amd_sched_entity_push_job(&job->base); | ||
99 | if (r) { | ||
100 | mutex_unlock(&job->job_lock); | ||
101 | kfree(job); | ||
102 | return r; | ||
103 | } | ||
104 | *f = fence_get(&job->base.s_fence->base); | ||
105 | mutex_unlock(&job->job_lock); | ||
106 | } else { | 100 | } else { |
107 | r = amdgpu_ib_schedule(adev, num_ibs, ibs, owner); | 101 | r = amdgpu_ib_schedule(adev, num_ibs, ibs, owner); |
108 | if (r) | 102 | if (r) |