msm: ipa3: Fix race condition during teardwon pipe

When endpoint in polling mode possible to pipe teardown trigger parallel
it leads to race condition. Adding changes to check in endpoint came out
of polling mode and continue to teardown the endpoint.

Change-Id: I0b22d6a7a1f5229acec2dbc9dd5cb76488c09faa
Signed-off-by: Ashok Vuyyuru <avuyyuru@codeaurora.org>
This commit is contained in:
Ashok Vuyyuru 2020-10-20 14:54:13 +05:30
commit 056ae77554
2 changed files with 10 additions and 5 deletions

View file

@ -4008,6 +4008,12 @@ int gsi_poll_n_channel(unsigned long chan_hdl,
return -GSI_STATUS_UNSUPPORTED_OP;
}
/* Before going to poll packet make sure it was in allocated state */
if (unlikely(ctx->state == GSI_CHAN_STATE_NOT_ALLOCATED)) {
GSIERR("bad state %d\n", ctx->state);
return -GSI_STATUS_UNSUPPORTED_OP;
}
if (!ctx->evtr) {
GSIERR("no event ring associated chan_hdl=%lu\n", chan_hdl);
return -GSI_STATUS_UNSUPPORTED_OP;

View file

@ -1479,11 +1479,10 @@ int ipa3_teardown_sys_pipe(u32 clnt_hdl)
return result;
}
if (ep->sys->napi_obj) {
do {
usleep_range(95, 105);
} while (atomic_read(&ep->sys->curr_polling_state));
}
/* Wait untill end point moving to interrupt mode before teardown */
do {
usleep_range(95, 105);
} while (atomic_read(&ep->sys->curr_polling_state));
if (IPA_CLIENT_IS_CONS(ep->client))
cancel_delayed_work_sync(&ep->sys->replenish_rx_work);