diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_job.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index eb0f7890401a..23468088a995 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
@@ -28,6 +28,12 @@ | |||
28 | #include "amdgpu.h" | 28 | #include "amdgpu.h" |
29 | #include "amdgpu_trace.h" | 29 | #include "amdgpu_trace.h" |
30 | 30 | ||
31 | static void amdgpu_job_free_handler(struct work_struct *ws) | ||
32 | { | ||
33 | struct amdgpu_job *job = container_of(ws, struct amdgpu_job, base.work_free_job); | ||
34 | kfree(job); | ||
35 | } | ||
36 | |||
31 | int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, | 37 | int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, |
32 | struct amdgpu_job **job) | 38 | struct amdgpu_job **job) |
33 | { | 39 | { |
@@ -45,6 +51,7 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, | |||
45 | (*job)->adev = adev; | 51 | (*job)->adev = adev; |
46 | (*job)->ibs = (void *)&(*job)[1]; | 52 | (*job)->ibs = (void *)&(*job)[1]; |
47 | (*job)->num_ibs = num_ibs; | 53 | (*job)->num_ibs = num_ibs; |
54 | INIT_WORK(&(*job)->base.work_free_job, amdgpu_job_free_handler); | ||
48 | 55 | ||
49 | amdgpu_sync_create(&(*job)->sync); | 56 | amdgpu_sync_create(&(*job)->sync); |
50 | 57 | ||
@@ -80,7 +87,9 @@ void amdgpu_job_free(struct amdgpu_job *job) | |||
80 | 87 | ||
81 | amdgpu_bo_unref(&job->uf.bo); | 88 | amdgpu_bo_unref(&job->uf.bo); |
82 | amdgpu_sync_free(&job->sync); | 89 | amdgpu_sync_free(&job->sync); |
83 | kfree(job); | 90 | |
91 | if (!job->base.use_sched) | ||
92 | kfree(job); | ||
84 | } | 93 | } |
85 | 94 | ||
86 | int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring, | 95 | int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring, |