summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDhoat Harpal <hdhoat@codeaurora.org>2016-02-04 16:18:04 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:20:10 -0700
commit981288388203c0c520d997071e28992a3a467e8b (patch)
treec11f4d0b0f5c11cc39b31b8d17a61f1673f0ab71
parent96adc9685e202d44043bfa9a9a3792dc7aac6ef5 (diff)
soc: qcom: glink_smd_xprt: Fix race condition of open ack
Open ack is received in separate work queue than process_open_event. It causes race condition since process_open_event and process_status_event might get scheduled before glink is notified about open ack. Glink will be notified about ack in process_open_event. CRs-Fixed: 974508 Change-Id: Ie03a4914c2655ae5140a740cde73b06bb6d43291 Signed-off-by: Dhoat Harpal <hdhoat@codeaurora.org>
-rw-r--r--drivers/soc/qcom/glink_smd_xprt.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/soc/qcom/glink_smd_xprt.c b/drivers/soc/qcom/glink_smd_xprt.c
index c4ac66f81af4..1e71189036e4 100644
--- a/drivers/soc/qcom/glink_smd_xprt.c
+++ b/drivers/soc/qcom/glink_smd_xprt.c
@@ -155,6 +155,8 @@ struct channel {
bool remote_legacy;
size_t intent_req_size;
spinlock_t rx_data_lock;
+ uint32_t priority;
+ bool open_ack_received;
bool streaming_ch;
bool tx_resume_needed;
};
@@ -408,13 +410,9 @@ static void process_ctl_event(struct work_struct *work)
continue;
}
+ ch->open_ack_received = true;
+ ch->priority = cmd.priority;
add_platform_driver(ch);
- mutex_lock(&einfo->rx_cmd_lock);
- einfo->xprt_if.glink_core_if_ptr->rx_cmd_ch_open_ack(
- &einfo->xprt_if,
- cmd.id,
- cmd.priority);
- mutex_unlock(&einfo->rx_cmd_lock);
} else if (cmd.cmd == CMD_CLOSE) {
SMDXPRT_INFO(einfo, "%s RX REMOTE CLOSE rcid %u\n",
__func__, cmd.id);
@@ -598,6 +596,15 @@ static void process_open_event(struct work_struct *work)
ch->name,
SMD_TRANS_XPRT_ID);
mutex_unlock(&einfo->rx_cmd_lock);
+ } else if (ch->open_ack_received) {
+ SMDXPRT_INFO(einfo, "%s RX OPEN ACK lcid %u; xprt_req %u\n",
+ __func__, ch->lcid, ch->priority);
+ mutex_lock(&einfo->rx_cmd_lock);
+ einfo->xprt_if.glink_core_if_ptr->rx_cmd_ch_open_ack(
+ &einfo->xprt_if,
+ ch->lcid,
+ ch->priority);
+ mutex_unlock(&einfo->rx_cmd_lock);
}
kfree(ch_work);
}
@@ -1211,7 +1218,7 @@ static int tx_cmd_ch_open(struct glink_transport_if *if_ptr, uint32_t lcid,
ch->tx_resume_needed = false;
ch->lcid = lcid;
-
+ ch->open_ack_received = false;
if (einfo->smd_ctl_ch_open) {
SMDXPRT_INFO(einfo, "%s TX OPEN '%s' lcid %u reqxprt %u\n",
__func__, name, lcid, req_xprt);