]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
gpu: nvgpu: remove redundant busy()/idle() calls
authorDeepak Nibade <dnibade@nvidia.com>
Thu, 3 Jul 2014 13:02:20 +0000 (18:32 +0530)
committerMandar Padmawar <mpadmawar@nvidia.com>
Mon, 7 Jul 2014 08:42:02 +0000 (01:42 -0700)
gk20a_busy() call in channel_syncpt_incr() and corresponding
gk20a_idle() call in channel_update() are redundant since they
are already encapsulated inside another pair of busy/idle calls

This busy/idle pair will be called only from submit_gpfifo()
and submit_gpfifo() already has its own busy/idle which it
preserves for whole path and hence this redundant pair can be
removed

Also, this prevents a dead lock scenario while do_idle() is in
progress as follows :
- in submit_gpfifo() we call first gk20a_busy() which acquires
  busy read semaphore
- in do_idle() we acquire busy write semaphore and wait for
  current jobs to finish
- now submit_gpfifo() encounters second gk20a_busy() and requests
  busy read semaphore again
- this results in dead lock where do_idle() is waiting for
  submit_gpfifo() to complete and submit_gpfifo() is waiting for
  busy lock held by do_idle() and hence it cannot complete

bug 1529160

Change-Id: I96e4368352f693e93524f0f61689b4447e5331ea
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/434191
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Arto Merilainen <amerilainen@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
drivers/gpu/nvgpu/gk20a/channel_gk20a.c
drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c

index 99cd8727d74f0df46db5833758868ba39d04648b..cf6f119092afd12dc6cd0ac0111fa2d063149076 100644 (file)
@@ -1388,10 +1388,8 @@ static int gk20a_channel_add_job(struct channel_gk20a *c,
 
 void gk20a_channel_update(struct channel_gk20a *c, int nr_completed)
 {
-       struct gk20a *g = c->g;
        struct vm_gk20a *vm = c->vm;
        struct channel_gk20a_job *job, *n;
-       int i;
 
        wake_up(&c->submit_wq);
 
@@ -1410,12 +1408,9 @@ void gk20a_channel_update(struct channel_gk20a *c, int nr_completed)
 
                list_del_init(&job->list);
                kfree(job);
-               gk20a_idle(g->dev);
+               gk20a_idle(c->g->dev);
        }
        mutex_unlock(&c->jobs_lock);
-
-       for (i = 0; i < nr_completed; i++)
-               gk20a_idle(c->g->dev);
 }
 
 static int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
index 841ec5967be288df10c2c06af7d42afbf792ff60..eb435977e62dc19e2d9bad8f8e4e9e46f41ee9de 100644 (file)
@@ -226,16 +226,9 @@ static int __gk20a_channel_syncpt_incr(struct gk20a_channel_sync *s,
        thresh = nvhost_syncpt_incr_max_ext(sp->host1x_pdev, sp->id, 1);
 
        if (register_irq) {
-               /* nvhost action_gpfifo_submit_complete releases this ref. */
-               err = gk20a_busy(c->g->dev);
-
-               if (!err) {
-                       err = nvhost_intr_register_notifier(sp->host1x_pdev,
-                                       sp->id, thresh,
-                                       gk20a_channel_syncpt_update, c);
-                       if (err)
-                               gk20a_idle(c->g->dev);
-               }
+               err = nvhost_intr_register_notifier(sp->host1x_pdev,
+                               sp->id, thresh,
+                               gk20a_channel_syncpt_update, c);
 
                /* Adding interrupt action should never fail. A proper error
                 * handling here would require us to decrement the syncpt max