瀏覽代碼

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 <[email protected]>
Ashok Vuyyuru 4 年之前
父節點
當前提交
b708bca845
共有 2 個文件被更改,包括 10 次插入5 次删除
  1. 6 0
      drivers/platform/msm/gsi/gsi.c
  2. 4 5
      drivers/platform/msm/ipa/ipa_v3/ipa_dp.c

+ 6 - 0
drivers/platform/msm/gsi/gsi.c

@@ -3983,6 +3983,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;

+ 4 - 5
drivers/platform/msm/ipa/ipa_v3/ipa_dp.c

@@ -1480,11 +1480,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);