summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorLakshmanan M <lm@nvidia.com>2016-08-23 05:40:58 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-09-01 12:11:35 -0400
commit8de995d4af1916a47a50b0b13965058c9873f962 (patch)
tree6a286c36c71c3bcc4283eb4d65f740c6741a63a9 /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parent89d1075f26f22d81965b5fc0643c0a79ff9fbddf (diff)
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 <lm@nvidia.com> Reviewed-on: http://git-master/r/1206265 (cherry picked from commit d3ef533942487785d84d109f985ae648eb3c2434) Reviewed-on: http://git-master/r/1210955 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c22
1 files changed, 18 insertions, 4 deletions
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)
831 } 831 }
832 832
833 if (gk20a_fence_out) { 833 if (gk20a_fence_out) {
834 err = gk20a_fence_wait(gk20a_fence_out, 834 unsigned long end_jiffies = jiffies +
835 gk20a_get_gr_idle_timeout(g)); 835 msecs_to_jiffies(gk20a_get_gr_idle_timeout(g));
836
837 do {
838 unsigned int timeout = jiffies_to_msecs(end_jiffies - jiffies);
839 err = gk20a_fence_wait(gk20a_fence_out,
840 timeout);
841 } while ((err == -ERESTARTSYS) && time_before(jiffies, end_jiffies));
842
836 gk20a_fence_put(gk20a_fence_out); 843 gk20a_fence_put(gk20a_fence_out);
837 if (err) { 844 if (err) {
838 gk20a_err(g->dev, 845 gk20a_err(g->dev,
@@ -2880,8 +2887,15 @@ static int gk20a_gmmu_clear_vidmem_mem(struct gk20a *g, struct mem_desc *mem)
2880 } 2887 }
2881 2888
2882 if (gk20a_last_fence) { 2889 if (gk20a_last_fence) {
2883 err = gk20a_fence_wait(gk20a_last_fence, 2890 unsigned long end_jiffies = jiffies +
2884 gk20a_get_gr_idle_timeout(g)); 2891 msecs_to_jiffies(gk20a_get_gr_idle_timeout(g));
2892
2893 do {
2894 unsigned int timeout = jiffies_to_msecs(end_jiffies - jiffies);
2895 err = gk20a_fence_wait(gk20a_last_fence,
2896 timeout);
2897 } while ((err == -ERESTARTSYS) && time_before(jiffies, end_jiffies));
2898
2885 gk20a_fence_put(gk20a_last_fence); 2899 gk20a_fence_put(gk20a_last_fence);
2886 if (err) 2900 if (err)
2887 gk20a_err(g->dev, 2901 gk20a_err(g->dev,