mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 02:22:34 +03:00
gpu: nvgpu: remove redundant busy()/idle() calls
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 (cherry picked from commit c4315c6caa42bab72ba6017c7ded25f4e9363dec) Reviewed-on: http://git-master/r/435132 Reviewed-by: Sachin Nikam <snikam@nvidia.com> Tested-by: Sachin Nikam <snikam@nvidia.com>
This commit is contained in:
committed by
Dan Willemsen
parent
0b1f9e4272
commit
7c5404fa42
@@ -1414,10 +1414,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);
|
||||
|
||||
@@ -1442,7 +1440,7 @@ 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);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1460,9 +1458,6 @@ void gk20a_channel_update(struct channel_gk20a *c, int nr_completed)
|
||||
}
|
||||
mutex_unlock(&c->jobs_lock);
|
||||
mutex_unlock(&c->submit_lock);
|
||||
|
||||
for (i = 0; i < nr_completed; i++)
|
||||
gk20a_idle(c->g->dev);
|
||||
}
|
||||
|
||||
void add_wait_cmd(u32 *ptr, u32 id, u32 thresh)
|
||||
|
||||
@@ -233,16 +233,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
|
||||
|
||||
Reference in New Issue
Block a user