diff options
author | Dhoat Harpal <hdhoat@codeaurora.org> | 2016-02-04 16:18:04 +0530 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:20:10 -0700 |
commit | 981288388203c0c520d997071e28992a3a467e8b (patch) | |
tree | c11f4d0b0f5c11cc39b31b8d17a61f1673f0ab71 | |
parent | 96adc9685e202d44043bfa9a9a3792dc7aac6ef5 (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.c | 21 |
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); |