From 8de995d4af1916a47a50b0b13965058c9873f962 Mon Sep 17 00:00:00 2001 From: Lakshmanan M Date: Tue, 23 Aug 2016 15:10:58 +0530 Subject: gpu: nvgpu: Add proper timeout handling for vidmem clear operations gk20a_fence_wait() api may be interrupted by a signal before actual its timeout elapsed. This CL does retry (-ERESTARTSYS) mechanism if gk20a_fence_wait() return before its timeout elapsed. Bug 200230544 Change-Id: I347ed2004935a8b9413f95dcb6fca2b74bf49f2a Signed-off-by: Lakshmanan M Reviewed-on: http://git-master/r/1206265 (cherry picked from commit d3ef533942487785d84d109f985ae648eb3c2434) Reviewed-on: http://git-master/r/1210955 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'drivers/gpu') diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index 179e6fc1..4872bb95 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -831,8 +831,15 @@ static int gk20a_vidmem_clear_all(struct gk20a *g) } if (gk20a_fence_out) { - err = gk20a_fence_wait(gk20a_fence_out, - gk20a_get_gr_idle_timeout(g)); + unsigned long end_jiffies = jiffies + + msecs_to_jiffies(gk20a_get_gr_idle_timeout(g)); + + do { + unsigned int timeout = jiffies_to_msecs(end_jiffies - jiffies); + err = gk20a_fence_wait(gk20a_fence_out, + timeout); + } while ((err == -ERESTARTSYS) && time_before(jiffies, end_jiffies)); + gk20a_fence_put(gk20a_fence_out); if (err) { gk20a_err(g->dev, @@ -2880,8 +2887,15 @@ static int gk20a_gmmu_clear_vidmem_mem(struct gk20a *g, struct mem_desc *mem) } if (gk20a_last_fence) { - err = gk20a_fence_wait(gk20a_last_fence, - gk20a_get_gr_idle_timeout(g)); + unsigned long end_jiffies = jiffies + + msecs_to_jiffies(gk20a_get_gr_idle_timeout(g)); + + do { + unsigned int timeout = jiffies_to_msecs(end_jiffies - jiffies); + err = gk20a_fence_wait(gk20a_last_fence, + timeout); + } while ((err == -ERESTARTSYS) && time_before(jiffies, end_jiffies)); + gk20a_fence_put(gk20a_last_fence); if (err) gk20a_err(g->dev, -- cgit v1.2.2