Skip to content

Commit

Permalink
msm: kgsl: Fix race condition in adreno_spin_idle()
Browse files Browse the repository at this point in the history
adreno_spin_idle spins for a timeout checking for gpu to idle.
Sometimes due to race conditions the timeout can occur before the
loop is executed. Change the logic to a do-while loop and add an
extra idle check after the timeout before returning failure.

CRs-Fixed: 955055
Change-Id: Idb92a0180dd8cc3e662b1ccf44d69e4bbafb29f1
Signed-off-by: Suman Tatiraju <[email protected]>
  • Loading branch information
Suman Tatiraju authored and kerneltoast committed Apr 2, 2016
1 parent 6a055e2 commit 1649034
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions drivers/gpu/msm/adreno.c
Original file line number Diff line number Diff line change
Expand Up @@ -3024,7 +3024,7 @@ int adreno_idle(struct kgsl_device *device)
adreno_getreg(adreno_dev, ADRENO_REG_RBBM_STATUS) << 2,
0x110, 0x110);

while (time_before(jiffies, wait)) {
do {
/*
* If we fault, stop waiting and return an error. The dispatcher
* will clean up the fault from the work queue, but we need to
Expand All @@ -3037,7 +3037,19 @@ int adreno_idle(struct kgsl_device *device)

if (adreno_isidle(device))
return 0;
}

} while (time_before(jiffies, wait));

/*
* Under rare conditions, preemption can cause the while loop to exit
* without checking if the gpu is idle. check one last time before we
* return failure.
*/
if (adreno_gpu_fault(adreno_dev) != 0)
return -EDEADLK;

if (adreno_isidle(device))
return 0;

return -ETIMEDOUT;
}
Expand Down

0 comments on commit 1649034

Please sign in to comment.