summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBharat Nihalani <bnihalani@nvidia.com>2016-08-09 09:00:12 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-08-31 17:04:10 -0400
commita3452ea763d666410e7b898e40b24f07e2cb1045 (patch)
treeebeb7d92518c2cb096677f2c2886a457a441b237 /drivers
parent91241ca8e975dd9352e31e06ca408618477fac91 (diff)
gpu: nvgpu: gk20a: Use spin_lock for jobs_lock
This is done to boost performance of the GPU submit time, which is critical for compute use-cases. Bug 200215465 Bug 1804898 Conflicts: drivers/gpu/nvgpu/gk20a/channel_gk20a.c Change-Id: Ic4884ee4eac910b92b84a47fdc1b2e9f26b2f1f0 Signed-off-by: Bharat Nihalani <bnihalani@nvidia.com> Reviewed-on: http://git-master/r/1199860 Reviewed-on: http://git-master/r/1209834 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/gk20a/cde_gk20a.c4
-rw-r--r--drivers/gpu/nvgpu/gk20a/ce2_gk20a.c4
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_gk20a.c24
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_gk20a.h2
4 files changed, 17 insertions, 17 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
index f5b68e72..6f8c160c 100644
--- a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c
@@ -1125,9 +1125,9 @@ __releases(&cde_app->mutex)
1125 struct gk20a_cde_app *cde_app = &g->cde_app; 1125 struct gk20a_cde_app *cde_app = &g->cde_app;
1126 bool channel_idle; 1126 bool channel_idle;
1127 1127
1128 mutex_lock(&ch->jobs_lock); 1128 spin_lock(&ch->jobs_lock);
1129 channel_idle = list_empty(&ch->jobs); 1129 channel_idle = list_empty(&ch->jobs);
1130 mutex_unlock(&ch->jobs_lock); 1130 spin_unlock(&ch->jobs_lock);
1131 1131
1132 if (!channel_idle) 1132 if (!channel_idle)
1133 return; 1133 return;
diff --git a/drivers/gpu/nvgpu/gk20a/ce2_gk20a.c b/drivers/gpu/nvgpu/gk20a/ce2_gk20a.c
index 8ea0b2d5..9be37a5e 100644
--- a/drivers/gpu/nvgpu/gk20a/ce2_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/ce2_gk20a.c
@@ -126,9 +126,9 @@ static void gk20a_ce_finished_ctx_cb(struct channel_gk20a *ch, void *data)
126 bool channel_idle; 126 bool channel_idle;
127 u32 event; 127 u32 event;
128 128
129 mutex_lock(&ch->jobs_lock); 129 spin_lock(&ch->jobs_lock);
130 channel_idle = list_empty(&ch->jobs); 130 channel_idle = list_empty(&ch->jobs);
131 mutex_unlock(&ch->jobs_lock); 131 spin_unlock(&ch->jobs_lock);
132 132
133 if (!channel_idle) 133 if (!channel_idle)
134 return; 134 return;
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
index d4cf6915..e45f7501 100644
--- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
@@ -472,14 +472,14 @@ void gk20a_channel_abort_clean_up(struct channel_gk20a *ch)
472 472
473 /* release all job semaphores (applies only to jobs that use 473 /* release all job semaphores (applies only to jobs that use
474 semaphore synchronization) */ 474 semaphore synchronization) */
475 mutex_lock(&ch->jobs_lock); 475 spin_lock(&ch->jobs_lock);
476 list_for_each_entry_safe(job, n, &ch->jobs, list) { 476 list_for_each_entry_safe(job, n, &ch->jobs, list) {
477 if (job->post_fence->semaphore) { 477 if (job->post_fence->semaphore) {
478 gk20a_semaphore_release(job->post_fence->semaphore); 478 gk20a_semaphore_release(job->post_fence->semaphore);
479 released_job_semaphore = true; 479 released_job_semaphore = true;
480 } 480 }
481 } 481 }
482 mutex_unlock(&ch->jobs_lock); 482 spin_unlock(&ch->jobs_lock);
483 483
484 if (released_job_semaphore) 484 if (released_job_semaphore)
485 wake_up_interruptible_all(&ch->semaphore_wq); 485 wake_up_interruptible_all(&ch->semaphore_wq);
@@ -512,9 +512,9 @@ int gk20a_wait_channel_idle(struct channel_gk20a *ch)
512 msecs_to_jiffies(gk20a_get_gr_idle_timeout(ch->g)); 512 msecs_to_jiffies(gk20a_get_gr_idle_timeout(ch->g));
513 513
514 do { 514 do {
515 mutex_lock(&ch->jobs_lock); 515 spin_lock(&ch->jobs_lock);
516 channel_idle = list_empty(&ch->jobs); 516 channel_idle = list_empty(&ch->jobs);
517 mutex_unlock(&ch->jobs_lock); 517 spin_unlock(&ch->jobs_lock);
518 if (channel_idle) 518 if (channel_idle)
519 break; 519 break;
520 520
@@ -1850,9 +1850,9 @@ static int gk20a_channel_add_job(struct channel_gk20a *c,
1850 1850
1851 gk20a_channel_timeout_start(c, job); 1851 gk20a_channel_timeout_start(c, job);
1852 1852
1853 mutex_lock(&c->jobs_lock); 1853 spin_lock(&c->jobs_lock);
1854 list_add_tail(&job->list, &c->jobs); 1854 list_add_tail(&job->list, &c->jobs);
1855 mutex_unlock(&c->jobs_lock); 1855 spin_unlock(&c->jobs_lock);
1856 } else { 1856 } else {
1857 err = -ETIMEDOUT; 1857 err = -ETIMEDOUT;
1858 goto err_free_job; 1858 goto err_free_job;
@@ -1898,14 +1898,14 @@ static void gk20a_channel_clean_up_jobs(struct work_struct *work)
1898 while (1) { 1898 while (1) {
1899 bool completed; 1899 bool completed;
1900 1900
1901 mutex_lock(&c->jobs_lock); 1901 spin_lock(&c->jobs_lock);
1902 if (list_empty(&c->jobs)) { 1902 if (list_empty(&c->jobs)) {
1903 mutex_unlock(&c->jobs_lock); 1903 spin_unlock(&c->jobs_lock);
1904 break; 1904 break;
1905 } 1905 }
1906 job = list_first_entry(&c->jobs, 1906 job = list_first_entry(&c->jobs,
1907 struct channel_gk20a_job, list); 1907 struct channel_gk20a_job, list);
1908 mutex_unlock(&c->jobs_lock); 1908 spin_unlock(&c->jobs_lock);
1909 1909
1910 completed = gk20a_fence_is_expired(job->post_fence); 1910 completed = gk20a_fence_is_expired(job->post_fence);
1911 if (!completed) { 1911 if (!completed) {
@@ -1948,9 +1948,9 @@ static void gk20a_channel_clean_up_jobs(struct work_struct *work)
1948 * so this wouldn't get freed here. */ 1948 * so this wouldn't get freed here. */
1949 gk20a_channel_put(c); 1949 gk20a_channel_put(c);
1950 1950
1951 mutex_lock(&c->jobs_lock); 1951 spin_lock(&c->jobs_lock);
1952 list_del_init(&job->list); 1952 list_del_init(&job->list);
1953 mutex_unlock(&c->jobs_lock); 1953 spin_unlock(&c->jobs_lock);
1954 1954
1955 kfree(job); 1955 kfree(job);
1956 job_finished = 1; 1956 job_finished = 1;
@@ -2331,7 +2331,7 @@ int gk20a_init_channel_support(struct gk20a *g, u32 chid)
2331 c->referenceable = false; 2331 c->referenceable = false;
2332 init_waitqueue_head(&c->ref_count_dec_wq); 2332 init_waitqueue_head(&c->ref_count_dec_wq);
2333 mutex_init(&c->ioctl_lock); 2333 mutex_init(&c->ioctl_lock);
2334 mutex_init(&c->jobs_lock); 2334 spin_lock_init(&c->jobs_lock);
2335 mutex_init(&c->last_submit.fence_lock); 2335 mutex_init(&c->last_submit.fence_lock);
2336 mutex_init(&c->timeout.lock); 2336 mutex_init(&c->timeout.lock);
2337 mutex_init(&c->sync_lock); 2337 mutex_init(&c->sync_lock);
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h
index 6469603b..4b2019dd 100644
--- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.h
@@ -124,7 +124,7 @@ struct channel_gk20a {
124 struct list_head ch_entry; /* channel's entry in TSG */ 124 struct list_head ch_entry; /* channel's entry in TSG */
125 125
126 struct list_head jobs; 126 struct list_head jobs;
127 struct mutex jobs_lock; 127 spinlock_t jobs_lock;
128 128
129 struct vm_gk20a *vm; 129 struct vm_gk20a *vm;
130 130