summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorHarshitha Sai Neelati <hsaine@codeaurora.org>2020-09-25 15:14:37 +0530
committerGoshika Kiran Kumar <gkiranku@codeaurora.org>2020-10-20 22:33:54 +0530
commitd02e471d202aa70fe7a3e54d9944185bc73732e0 (patch)
treef6c1f6ed973fa94bd8e58bfd8087d6699d6d3757 /drivers/gpu
parentdce57d817758260a14181dece4a2c8b92887e6e9 (diff)
msm: kgsl: Don't wait for room in context queue when context is invalidated
In a condition where there is no room in the drawcontext queue and the context is invalidated while sleeping in wait_event_interruptible_timeout, we are now polling for room after wake up. This would lead to infinite looping. Hence, do not wait for room in context queue if context is invalidated. Change-Id: I12c80e71630da2f3316838bee37f13cfa3b8e7d9 Signed-off-by: Harshitha Sai Neelati <hsaine@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/msm/adreno_dispatch.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c
index 49b14fbf439c..da9d4e17b7c7 100644
--- a/drivers/gpu/msm/adreno_dispatch.c
+++ b/drivers/gpu/msm/adreno_dispatch.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2020, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1210,7 +1210,16 @@ static inline int _wait_for_room_in_context_queue(
spin_lock(&drawctxt->lock);
trace_adreno_drawctxt_wake(drawctxt);
- if (ret <= 0)
+ /*
+ * Account for the possibility that the context got invalidated
+ * while we were sleeping
+ */
+
+ if (ret > 0) {
+ ret = _check_context_state(&drawctxt->base);
+ if (ret)
+ return ret;
+ } else
return (ret == 0) ? -ETIMEDOUT : (int) ret;
}
@@ -1225,15 +1234,7 @@ static unsigned int _check_context_state_to_queue_cmds(
if (ret)
return ret;
- ret = _wait_for_room_in_context_queue(drawctxt);
- if (ret)
- return ret;
-
- /*
- * Account for the possiblity that the context got invalidated
- * while we were sleeping
- */
- return _check_context_state(&drawctxt->base);
+ return _wait_for_room_in_context_queue(drawctxt);
}
static void _queue_drawobj(struct adreno_context *drawctxt,