Skip to content

Commit

Permalink
bus: mhi: core: Handle write lock properly in mhi_pm_m0_transition
Browse files Browse the repository at this point in the history
Take write lock only to protect db_mode member of mhi channel.
This allows rest of the mhi channels to just take read lock which
fine grains the locking. It prevents channel readers to starve if
they try to enter critical section after a writer.

Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/20200521170249.21795-14-manivannan.sadhasivam@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Hemant Kumar authored and Greg Kroah-Hartman committed May 22, 2020
1 parent 30b7892 commit 3bc1a5f
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions drivers/bus/mhi/core/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,14 +288,18 @@ int mhi_pm_m0_transition(struct mhi_controller *mhi_cntrl)
for (i = 0; i < mhi_cntrl->max_chan; i++, mhi_chan++) {
struct mhi_ring *tre_ring = &mhi_chan->tre_ring;

write_lock_irq(&mhi_chan->lock);
if (mhi_chan->db_cfg.reset_req)
if (mhi_chan->db_cfg.reset_req) {
write_lock_irq(&mhi_chan->lock);
mhi_chan->db_cfg.db_mode = true;
write_unlock_irq(&mhi_chan->lock);
}

read_lock_irq(&mhi_chan->lock);

/* Only ring DB if ring is not empty */
if (tre_ring->base && tre_ring->wp != tre_ring->rp)
mhi_ring_chan_db(mhi_cntrl, mhi_chan);
write_unlock_irq(&mhi_chan->lock);
read_unlock_irq(&mhi_chan->lock);
}

mhi_cntrl->wake_put(mhi_cntrl, false);
Expand Down

0 comments on commit 3bc1a5f

Please sign in to comment.