Message ID | 1702276972-41296-3-git-send-email-quic_qianyu@quicinc.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | bus: mhi: host: Add lock to avoid race when ringing channel DB | expand |
On 12/10/2023 11:42 PM, Qiang Yu wrote: > Ensure read and write locks for the channel are not taken in succession by > dropping the read lock from parse_xfer_event() such that a callback given > to client can potentially queue buffers and acquire the write lock in that > process. Any queueing of buffers should be done without channel read lock > acquired as it can result in multiple locks and a soft lockup. > > Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com> Seems to work fine for AIC100 Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com> Tested-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
On Mon, Dec 11, 2023 at 02:42:52PM +0800, Qiang Yu wrote: > Ensure read and write locks for the channel are not taken in succession by > dropping the read lock from parse_xfer_event() such that a callback given > to client can potentially queue buffers and acquire the write lock in that > process. Any queueing of buffers should be done without channel read lock > acquired as it can result in multiple locks and a soft lockup. > Cc: <stable@vger.kernel.org> # 5.7 Fixes: 1d3173a3bae7 ("bus: mhi: core: Add support for processing events from client device") > Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> - Mani > --- > drivers/bus/mhi/host/main.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c > index 32021fe..25f98d6 100644 > --- a/drivers/bus/mhi/host/main.c > +++ b/drivers/bus/mhi/host/main.c > @@ -642,6 +642,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, > mhi_del_ring_element(mhi_cntrl, tre_ring); > local_rp = tre_ring->rp; > > + read_unlock_bh(&mhi_chan->lock); > + > /* notify client */ > mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result); > > @@ -667,6 +669,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, > kfree(buf_info->cb_buf); > } > } > + > + read_lock_bh(&mhi_chan->lock); > } > break; > } /* CC_EOT */ > -- > 2.7.4 > >
diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c index 32021fe..25f98d6 100644 --- a/drivers/bus/mhi/host/main.c +++ b/drivers/bus/mhi/host/main.c @@ -642,6 +642,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, mhi_del_ring_element(mhi_cntrl, tre_ring); local_rp = tre_ring->rp; + read_unlock_bh(&mhi_chan->lock); + /* notify client */ mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result); @@ -667,6 +669,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, kfree(buf_info->cb_buf); } } + + read_lock_bh(&mhi_chan->lock); } break; } /* CC_EOT */
Ensure read and write locks for the channel are not taken in succession by dropping the read lock from parse_xfer_event() such that a callback given to client can potentially queue buffers and acquire the write lock in that process. Any queueing of buffers should be done without channel read lock acquired as it can result in multiple locks and a soft lockup. Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com> --- drivers/bus/mhi/host/main.c | 4 ++++ 1 file changed, 4 insertions(+)