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>
This commit is contained in:
Harshitha Sai Neelati 2020-09-25 15:14:37 +05:30
commit d8d0a5138d
2 changed files with 22 additions and 20 deletions

View file

@ -1181,7 +1181,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;
}
@ -1196,15 +1205,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,

View file

@ -704,7 +704,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;
}
@ -719,15 +728,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,