* [PATCH v3 0/4] bus: mhi: host: Add lock to avoid race when ringing channel DB
@ 2023-11-07 7:16 Qiang Yu
2023-11-07 7:16 ` [PATCH v3 1/4] bus: mhi: host: Add spinlock to protect WP access when queueing TREs Qiang Yu
` (3 more replies)
0 siblings, 4 replies; 14+ messages in thread
From: Qiang Yu @ 2023-11-07 7:16 UTC (permalink / raw)
To: mani, quic_jhugo
Cc: mhi, linux-arm-msm, linux-kernel, quic_cang, quic_mrana, Qiang Yu
1. We need a write lock in mhi_gen_tre otherwise there is race of the WP
used for ringing channel DB between mhi_queue and M0 transition.
2. We can not invoke local_bh_enable() when irqs are disabled, so move
read_lock_irqsave() under the mhi_gen_tre() since we add write_lock_bh() in
mhi_gen_tre().
3. Unlock xfer_cb to prevent potential lockup
4. After re-lock, check mhi channel state again to stop processing of a
disabled or stopped channel.
v1 -> v2:
Added write_unlock_bh(&mhi_chan->lock) in mhi_gen_tre() before return
because of error process.
v2 -> v3:
1. split protecting WP and unlocking xfer_cb into two patches
2. Add a new patch to stop processing buffer and eventof a disabled or
stopped channel.
Bhaumik Bhatt (1):
bus: mhi: host: Add spinlock to protect WP access when queueing TREs
Hemant Kumar (1):
bus: mhi: host: Take irqsave lock after TRE is generated
Qiang Yu (2):
bus: mhi: host: Drop chan lock before queuing buffers
bus: mhi: host: Avoid processing buffer and event of a disable channel
drivers/bus/mhi/host/main.c | 30 +++++++++++++++++++++---------
1 file changed, 21 insertions(+), 9 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v3 1/4] bus: mhi: host: Add spinlock to protect WP access when queueing TREs
2023-11-07 7:16 [PATCH v3 0/4] bus: mhi: host: Add lock to avoid race when ringing channel DB Qiang Yu
@ 2023-11-07 7:16 ` Qiang Yu
2023-11-09 16:23 ` Manivannan Sadhasivam
2023-11-07 7:16 ` [PATCH v3 2/4] bus: mhi: host: Drop chan lock before queuing buffers Qiang Yu
` (2 subsequent siblings)
3 siblings, 1 reply; 14+ messages in thread
From: Qiang Yu @ 2023-11-07 7:16 UTC (permalink / raw)
To: mani, quic_jhugo
Cc: mhi, linux-arm-msm, linux-kernel, quic_cang, quic_mrana,
Bhaumik Bhatt, stable, Qiang Yu
From: Bhaumik Bhatt <bbhatt@codeaurora.org>
Protect WP accesses such that multiple threads queueing buffers for
incoming data do not race.
Cc: <stable@vger.kernel.org>
Fixes: 189ff97cca53 ("bus: mhi: core: Add support for data transfer")
Signed-off-by: Bhaumik Bhatt <bbhatt@codeaurora.org>
Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
---
drivers/bus/mhi/host/main.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c
index 6cf1145..c9415b0 100644
--- a/drivers/bus/mhi/host/main.c
+++ b/drivers/bus/mhi/host/main.c
@@ -1205,6 +1205,9 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
int eot, eob, chain, bei;
int ret;
+ /* Protect accesses for reading and incrementing WP */
+ write_lock_bh(&mhi_chan->lock);
+
buf_ring = &mhi_chan->buf_ring;
tre_ring = &mhi_chan->tre_ring;
@@ -1222,8 +1225,10 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
if (!info->pre_mapped) {
ret = mhi_cntrl->map_single(mhi_cntrl, buf_info);
- if (ret)
+ if (ret) {
+ write_unlock_bh(&mhi_chan->lock);
return ret;
+ }
}
eob = !!(flags & MHI_EOB);
@@ -1240,6 +1245,8 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
mhi_add_ring_element(mhi_cntrl, tre_ring);
mhi_add_ring_element(mhi_cntrl, buf_ring);
+ write_unlock_bh(&mhi_chan->lock);
+
return 0;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v3 2/4] bus: mhi: host: Drop chan lock before queuing buffers
2023-11-07 7:16 [PATCH v3 0/4] bus: mhi: host: Add lock to avoid race when ringing channel DB Qiang Yu
2023-11-07 7:16 ` [PATCH v3 1/4] bus: mhi: host: Add spinlock to protect WP access when queueing TREs Qiang Yu
@ 2023-11-07 7:16 ` Qiang Yu
2023-11-07 7:16 ` [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel Qiang Yu
2023-11-07 7:16 ` [PATCH v3 4/4] bus: mhi: host: Take irqsave lock after TRE is generated Qiang Yu
3 siblings, 0 replies; 14+ messages in thread
From: Qiang Yu @ 2023-11-07 7:16 UTC (permalink / raw)
To: mani, quic_jhugo
Cc: mhi, linux-arm-msm, linux-kernel, quic_cang, quic_mrana, Qiang Yu
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(+)
diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c
index c9415b0..a236dc2 100644
--- a/drivers/bus/mhi/host/main.c
+++ b/drivers/bus/mhi/host/main.c
@@ -643,6 +643,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);
@@ -668,6 +670,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
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
2023-11-07 7:16 [PATCH v3 0/4] bus: mhi: host: Add lock to avoid race when ringing channel DB Qiang Yu
2023-11-07 7:16 ` [PATCH v3 1/4] bus: mhi: host: Add spinlock to protect WP access when queueing TREs Qiang Yu
2023-11-07 7:16 ` [PATCH v3 2/4] bus: mhi: host: Drop chan lock before queuing buffers Qiang Yu
@ 2023-11-07 7:16 ` Qiang Yu
2023-11-08 6:48 ` Dan Carpenter
2023-11-09 16:32 ` Manivannan Sadhasivam
2023-11-07 7:16 ` [PATCH v3 4/4] bus: mhi: host: Take irqsave lock after TRE is generated Qiang Yu
3 siblings, 2 replies; 14+ messages in thread
From: Qiang Yu @ 2023-11-07 7:16 UTC (permalink / raw)
To: mani, quic_jhugo
Cc: mhi, linux-arm-msm, linux-kernel, quic_cang, quic_mrana, Qiang Yu
Ckeck mhi channel state after getting chan->lock to ensure that we only
queue buffer to an enabled channel and process event of an enabled channel.
Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
---
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 a236dc2..b137d54 100644
--- a/drivers/bus/mhi/host/main.c
+++ b/drivers/bus/mhi/host/main.c
@@ -672,6 +672,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl,
}
read_lock_bh(&mhi_chan->lock);
+ if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
+ goto end_process_tx_event;
}
break;
} /* CC_EOT */
@@ -1211,6 +1213,8 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
/* Protect accesses for reading and incrementing WP */
write_lock_bh(&mhi_chan->lock);
+ if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
+ return -EINVAL;
buf_ring = &mhi_chan->buf_ring;
tre_ring = &mhi_chan->tre_ring;
--
2.7.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v3 4/4] bus: mhi: host: Take irqsave lock after TRE is generated
2023-11-07 7:16 [PATCH v3 0/4] bus: mhi: host: Add lock to avoid race when ringing channel DB Qiang Yu
` (2 preceding siblings ...)
2023-11-07 7:16 ` [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel Qiang Yu
@ 2023-11-07 7:16 ` Qiang Yu
2023-11-09 16:29 ` Manivannan Sadhasivam
3 siblings, 1 reply; 14+ messages in thread
From: Qiang Yu @ 2023-11-07 7:16 UTC (permalink / raw)
To: mani, quic_jhugo
Cc: mhi, linux-arm-msm, linux-kernel, quic_cang, quic_mrana,
Hemant Kumar, Lazarus Motha, Qiang Yu
From: Hemant Kumar <quic_hemantk@quicinc.com>
Take irqsave lock after TRE is generated to avoid deadlock due to core
getting interrupts enabled as local_bh_enable must not be called with
irqs disabled based on upstream patch.
Signed-off-by: Hemant Kumar <quic_hemantk@quicinc.com>
Signed-off-by: Lazarus Motha <quic_lmotha@quicinc.com>
Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
---
drivers/bus/mhi/host/main.c | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c
index b137d54..93b5110 100644
--- a/drivers/bus/mhi/host/main.c
+++ b/drivers/bus/mhi/host/main.c
@@ -1129,17 +1129,15 @@ static int mhi_queue(struct mhi_device *mhi_dev, struct mhi_buf_info *buf_info,
if (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)))
return -EIO;
- read_lock_irqsave(&mhi_cntrl->pm_lock, flags);
-
ret = mhi_is_ring_full(mhi_cntrl, tre_ring);
- if (unlikely(ret)) {
- ret = -EAGAIN;
- goto exit_unlock;
- }
+ if (unlikely(ret))
+ return -EAGAIN;
ret = mhi_gen_tre(mhi_cntrl, mhi_chan, buf_info, mflags);
if (unlikely(ret))
- goto exit_unlock;
+ return ret;
+
+ read_lock_irqsave(&mhi_cntrl->pm_lock, flags);
/* Packet is queued, take a usage ref to exit M3 if necessary
* for host->device buffer, balanced put is done on buffer completion
@@ -1159,7 +1157,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, struct mhi_buf_info *buf_info,
if (dir == DMA_FROM_DEVICE)
mhi_cntrl->runtime_put(mhi_cntrl);
-exit_unlock:
read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags);
return ret;
--
2.7.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
2023-11-07 7:16 ` [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel Qiang Yu
@ 2023-11-08 6:48 ` Dan Carpenter
2023-11-10 3:40 ` Qiang Yu
2023-11-09 16:32 ` Manivannan Sadhasivam
1 sibling, 1 reply; 14+ messages in thread
From: Dan Carpenter @ 2023-11-08 6:48 UTC (permalink / raw)
To: oe-kbuild, Qiang Yu, mani, quic_jhugo
Cc: lkp, oe-kbuild-all, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana, Qiang Yu
Hi Qiang,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Qiang-Yu/bus-mhi-host-Add-spinlock-to-protect-WP-access-when-queueing-TREs/20231107-151918
base: https://git.kernel.org/pub/scm/linux/kernel/git/mani/mhi.git mhi-next
patch link: https://lore.kernel.org/r/1699341365-47737-4-git-send-email-quic_qianyu%40quicinc.com
patch subject: [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
config: x86_64-randconfig-161-20231107 (https://download.01.org/0day-ci/archive/20231108/202311080155.MiyREgoQ-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce: (https://download.01.org/0day-ci/archive/20231108/202311080155.MiyREgoQ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202311080155.MiyREgoQ-lkp@intel.com/
smatch warnings:
drivers/bus/mhi/host/main.c:1257 mhi_gen_tre() warn: inconsistent returns '&mhi_chan->lock'.
vim +1257 drivers/bus/mhi/host/main.c
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1204 int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1205 struct mhi_buf_info *info, enum mhi_flags flags)
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1206 {
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1207 struct mhi_ring *buf_ring, *tre_ring;
84f5f31f110e5e drivers/bus/mhi/host/main.c Manivannan Sadhasivam 2022-03-01 1208 struct mhi_ring_element *mhi_tre;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1209 struct mhi_buf_info *buf_info;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1210 int eot, eob, chain, bei;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1211 int ret;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1212
da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1213 /* Protect accesses for reading and incrementing WP */
da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1214 write_lock_bh(&mhi_chan->lock);
6025cde6ecb13c drivers/bus/mhi/host/main.c Qiang Yu 2023-11-07 1215 if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
6025cde6ecb13c drivers/bus/mhi/host/main.c Qiang Yu 2023-11-07 1216 return -EINVAL;
This looks like two people submitted patches on the same day?
We should unlock before returning?
da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1217
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1218 buf_ring = &mhi_chan->buf_ring;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1219 tre_ring = &mhi_chan->tre_ring;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1220
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1221 buf_info = buf_ring->wp;
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1222 WARN_ON(buf_info->used);
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1223 buf_info->pre_mapped = info->pre_mapped;
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1224 if (info->pre_mapped)
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1225 buf_info->p_addr = info->p_addr;
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1226 else
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1227 buf_info->v_addr = info->v_addr;
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1228 buf_info->cb_buf = info->cb_buf;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1229 buf_info->wp = tre_ring->wp;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1230 buf_info->dir = mhi_chan->dir;
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1231 buf_info->len = info->len;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1232
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1233 if (!info->pre_mapped) {
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1234 ret = mhi_cntrl->map_single(mhi_cntrl, buf_info);
da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1235 if (ret) {
da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1236 write_unlock_bh(&mhi_chan->lock);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1237 return ret;
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1238 }
da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1239 }
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1240
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1241 eob = !!(flags & MHI_EOB);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1242 eot = !!(flags & MHI_EOT);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1243 chain = !!(flags & MHI_CHAIN);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1244 bei = !!(mhi_chan->intmod);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1245
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1246 mhi_tre = tre_ring->wp;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1247 mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr);
cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1248 mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(info->len);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1249 mhi_tre->dword[1] = MHI_TRE_DATA_DWORD1(bei, eot, eob, chain);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1250
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1251 /* increment WP */
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1252 mhi_add_ring_element(mhi_cntrl, tre_ring);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1253 mhi_add_ring_element(mhi_cntrl, buf_ring);
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1254
da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1255 write_unlock_bh(&mhi_chan->lock);
da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1256
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 @1257 return 0;
189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1258 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 1/4] bus: mhi: host: Add spinlock to protect WP access when queueing TREs
2023-11-07 7:16 ` [PATCH v3 1/4] bus: mhi: host: Add spinlock to protect WP access when queueing TREs Qiang Yu
@ 2023-11-09 16:23 ` Manivannan Sadhasivam
0 siblings, 0 replies; 14+ messages in thread
From: Manivannan Sadhasivam @ 2023-11-09 16:23 UTC (permalink / raw)
To: Qiang Yu
Cc: quic_jhugo, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana, Bhaumik Bhatt, stable
On Tue, Nov 07, 2023 at 03:16:02PM +0800, Qiang Yu wrote:
> From: Bhaumik Bhatt <bbhatt@codeaurora.org>
>
> Protect WP accesses such that multiple threads queueing buffers for
> incoming data do not race.
>
> Cc: <stable@vger.kernel.org>
> Fixes: 189ff97cca53 ("bus: mhi: core: Add support for data transfer")
> Signed-off-by: Bhaumik Bhatt <bbhatt@codeaurora.org>
> Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
- Mani
> ---
> drivers/bus/mhi/host/main.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c
> index 6cf1145..c9415b0 100644
> --- a/drivers/bus/mhi/host/main.c
> +++ b/drivers/bus/mhi/host/main.c
> @@ -1205,6 +1205,9 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
> int eot, eob, chain, bei;
> int ret;
>
> + /* Protect accesses for reading and incrementing WP */
> + write_lock_bh(&mhi_chan->lock);
> +
> buf_ring = &mhi_chan->buf_ring;
> tre_ring = &mhi_chan->tre_ring;
>
> @@ -1222,8 +1225,10 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
>
> if (!info->pre_mapped) {
> ret = mhi_cntrl->map_single(mhi_cntrl, buf_info);
> - if (ret)
> + if (ret) {
> + write_unlock_bh(&mhi_chan->lock);
> return ret;
> + }
> }
>
> eob = !!(flags & MHI_EOB);
> @@ -1240,6 +1245,8 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
> mhi_add_ring_element(mhi_cntrl, tre_ring);
> mhi_add_ring_element(mhi_cntrl, buf_ring);
>
> + write_unlock_bh(&mhi_chan->lock);
> +
> return 0;
> }
>
> --
> 2.7.4
>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 4/4] bus: mhi: host: Take irqsave lock after TRE is generated
2023-11-07 7:16 ` [PATCH v3 4/4] bus: mhi: host: Take irqsave lock after TRE is generated Qiang Yu
@ 2023-11-09 16:29 ` Manivannan Sadhasivam
2023-11-10 3:42 ` Qiang Yu
0 siblings, 1 reply; 14+ messages in thread
From: Manivannan Sadhasivam @ 2023-11-09 16:29 UTC (permalink / raw)
To: Qiang Yu
Cc: quic_jhugo, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana, Hemant Kumar, Lazarus Motha
On Tue, Nov 07, 2023 at 03:16:05PM +0800, Qiang Yu wrote:
> From: Hemant Kumar <quic_hemantk@quicinc.com>
>
> Take irqsave lock after TRE is generated to avoid deadlock due to core
> getting interrupts enabled as local_bh_enable must not be called with
> irqs disabled based on upstream patch.
>
You still didn't address any of the comments provided by Jeff in v2.
- Mani
> Signed-off-by: Hemant Kumar <quic_hemantk@quicinc.com>
> Signed-off-by: Lazarus Motha <quic_lmotha@quicinc.com>
> Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
> ---
> drivers/bus/mhi/host/main.c | 13 +++++--------
> 1 file changed, 5 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c
> index b137d54..93b5110 100644
> --- a/drivers/bus/mhi/host/main.c
> +++ b/drivers/bus/mhi/host/main.c
> @@ -1129,17 +1129,15 @@ static int mhi_queue(struct mhi_device *mhi_dev, struct mhi_buf_info *buf_info,
> if (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)))
> return -EIO;
>
> - read_lock_irqsave(&mhi_cntrl->pm_lock, flags);
> -
> ret = mhi_is_ring_full(mhi_cntrl, tre_ring);
> - if (unlikely(ret)) {
> - ret = -EAGAIN;
> - goto exit_unlock;
> - }
> + if (unlikely(ret))
> + return -EAGAIN;
>
> ret = mhi_gen_tre(mhi_cntrl, mhi_chan, buf_info, mflags);
> if (unlikely(ret))
> - goto exit_unlock;
> + return ret;
> +
> + read_lock_irqsave(&mhi_cntrl->pm_lock, flags);
>
> /* Packet is queued, take a usage ref to exit M3 if necessary
> * for host->device buffer, balanced put is done on buffer completion
> @@ -1159,7 +1157,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, struct mhi_buf_info *buf_info,
> if (dir == DMA_FROM_DEVICE)
> mhi_cntrl->runtime_put(mhi_cntrl);
>
> -exit_unlock:
> read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags);
>
> return ret;
> --
> 2.7.4
>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
2023-11-07 7:16 ` [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel Qiang Yu
2023-11-08 6:48 ` Dan Carpenter
@ 2023-11-09 16:32 ` Manivannan Sadhasivam
2023-11-10 3:38 ` Qiang Yu
1 sibling, 1 reply; 14+ messages in thread
From: Manivannan Sadhasivam @ 2023-11-09 16:32 UTC (permalink / raw)
To: Qiang Yu
Cc: quic_jhugo, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana
On Tue, Nov 07, 2023 at 03:16:04PM +0800, Qiang Yu wrote:
> Ckeck mhi channel state after getting chan->lock to ensure that we only
> queue buffer to an enabled channel and process event of an enabled channel.
>
This commit message doesn't give proper explanation on how the channel can go to
disabled state in between parse_xfer_event() and mhi_gen_tre().
- Mani
> Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
> ---
> 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 a236dc2..b137d54 100644
> --- a/drivers/bus/mhi/host/main.c
> +++ b/drivers/bus/mhi/host/main.c
> @@ -672,6 +672,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl,
> }
>
> read_lock_bh(&mhi_chan->lock);
> + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
> + goto end_process_tx_event;
> }
> break;
> } /* CC_EOT */
> @@ -1211,6 +1213,8 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
>
> /* Protect accesses for reading and incrementing WP */
> write_lock_bh(&mhi_chan->lock);
> + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
> + return -EINVAL;
>
> buf_ring = &mhi_chan->buf_ring;
> tre_ring = &mhi_chan->tre_ring;
> --
> 2.7.4
>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
2023-11-09 16:32 ` Manivannan Sadhasivam
@ 2023-11-10 3:38 ` Qiang Yu
2023-11-14 6:17 ` Qiang Yu
2023-11-14 6:17 ` Qiang Yu
0 siblings, 2 replies; 14+ messages in thread
From: Qiang Yu @ 2023-11-10 3:38 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: quic_jhugo, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana
On 11/10/2023 12:32 AM, Manivannan Sadhasivam wrote:
> On Tue, Nov 07, 2023 at 03:16:04PM +0800, Qiang Yu wrote:
>> Ckeck mhi channel state after getting chan->lock to ensure that we only
>> queue buffer to an enabled channel and process event of an enabled channel.
>>
> This commit message doesn't give proper explanation on how the channel can go to
> disabled state in between parse_xfer_event() and mhi_gen_tre().
>
> - Mani
Hi Mani. How about following commit message
MHI channel state is protected by mhi_chan->lock. Hence, after core drops
mhi_chan->lock during processing xfer event, it can not prevent channel
state being changed if client closes channel or driver is removed at this
time. So let's check mhi channel state after getting chan->lock again to
avoid
queuing buffer to a disabled channel in xfer callback and stop processing
event of the disabled channel.
>> Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
>> ---
>> 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 a236dc2..b137d54 100644
>> --- a/drivers/bus/mhi/host/main.c
>> +++ b/drivers/bus/mhi/host/main.c
>> @@ -672,6 +672,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl,
>> }
>>
>> read_lock_bh(&mhi_chan->lock);
>> + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
>> + goto end_process_tx_event;
>> }
>> break;
>> } /* CC_EOT */
>> @@ -1211,6 +1213,8 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
>>
>> /* Protect accesses for reading and incrementing WP */
>> write_lock_bh(&mhi_chan->lock);
>> + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
>> + return -EINVAL;
>>
>> buf_ring = &mhi_chan->buf_ring;
>> tre_ring = &mhi_chan->tre_ring;
>> --
>> 2.7.4
>>
>>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
2023-11-08 6:48 ` Dan Carpenter
@ 2023-11-10 3:40 ` Qiang Yu
0 siblings, 0 replies; 14+ messages in thread
From: Qiang Yu @ 2023-11-10 3:40 UTC (permalink / raw)
To: Dan Carpenter, oe-kbuild, mani, quic_jhugo
Cc: lkp, oe-kbuild-all, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana
On 11/8/2023 2:48 PM, Dan Carpenter wrote:
> Hi Qiang,
>
> kernel test robot noticed the following build warnings:
>
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Qiang-Yu/bus-mhi-host-Add-spinlock-to-protect-WP-access-when-queueing-TREs/20231107-151918
> base: https://git.kernel.org/pub/scm/linux/kernel/git/mani/mhi.git mhi-next
> patch link: https://lore.kernel.org/r/1699341365-47737-4-git-send-email-quic_qianyu%40quicinc.com
> patch subject: [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
> config: x86_64-randconfig-161-20231107 (https://download.01.org/0day-ci/archive/20231108/202311080155.MiyREgoQ-lkp@intel.com/config)
> compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
> reproduce: (https://download.01.org/0day-ci/archive/20231108/202311080155.MiyREgoQ-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> | Closes: https://lore.kernel.org/r/202311080155.MiyREgoQ-lkp@intel.com/
>
> smatch warnings:
> drivers/bus/mhi/host/main.c:1257 mhi_gen_tre() warn: inconsistent returns '&mhi_chan->lock'.
>
> vim +1257 drivers/bus/mhi/host/main.c
>
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1204 int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1205 struct mhi_buf_info *info, enum mhi_flags flags)
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1206 {
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1207 struct mhi_ring *buf_ring, *tre_ring;
> 84f5f31f110e5e drivers/bus/mhi/host/main.c Manivannan Sadhasivam 2022-03-01 1208 struct mhi_ring_element *mhi_tre;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1209 struct mhi_buf_info *buf_info;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1210 int eot, eob, chain, bei;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1211 int ret;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1212
> da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1213 /* Protect accesses for reading and incrementing WP */
> da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1214 write_lock_bh(&mhi_chan->lock);
> 6025cde6ecb13c drivers/bus/mhi/host/main.c Qiang Yu 2023-11-07 1215 if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
> 6025cde6ecb13c drivers/bus/mhi/host/main.c Qiang Yu 2023-11-07 1216 return -EINVAL;
>
> This looks like two people submitted patches on the same day?
> We should unlock before returning?
Yes, we should unlock before return, will change in next version patch.
Thank you.
>
> da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1217
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1218 buf_ring = &mhi_chan->buf_ring;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1219 tre_ring = &mhi_chan->tre_ring;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1220
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1221 buf_info = buf_ring->wp;
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1222 WARN_ON(buf_info->used);
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1223 buf_info->pre_mapped = info->pre_mapped;
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1224 if (info->pre_mapped)
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1225 buf_info->p_addr = info->p_addr;
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1226 else
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1227 buf_info->v_addr = info->v_addr;
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1228 buf_info->cb_buf = info->cb_buf;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1229 buf_info->wp = tre_ring->wp;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1230 buf_info->dir = mhi_chan->dir;
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1231 buf_info->len = info->len;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1232
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1233 if (!info->pre_mapped) {
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1234 ret = mhi_cntrl->map_single(mhi_cntrl, buf_info);
> da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1235 if (ret) {
> da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1236 write_unlock_bh(&mhi_chan->lock);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1237 return ret;
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1238 }
> da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1239 }
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1240
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1241 eob = !!(flags & MHI_EOB);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1242 eot = !!(flags & MHI_EOT);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1243 chain = !!(flags & MHI_CHAIN);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1244 bei = !!(mhi_chan->intmod);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1245
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1246 mhi_tre = tre_ring->wp;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1247 mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr);
> cd116318803f5e drivers/bus/mhi/core/main.c Hemant Kumar 2020-05-21 1248 mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(info->len);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1249 mhi_tre->dword[1] = MHI_TRE_DATA_DWORD1(bei, eot, eob, chain);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1250
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1251 /* increment WP */
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1252 mhi_add_ring_element(mhi_cntrl, tre_ring);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1253 mhi_add_ring_element(mhi_cntrl, buf_ring);
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1254
> da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1255 write_unlock_bh(&mhi_chan->lock);
> da05b5d43f483c drivers/bus/mhi/host/main.c Bhaumik Bhatt 2023-11-07 1256
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 @1257 return 0;
> 189ff97cca53e3 drivers/bus/mhi/core/main.c Manivannan Sadhasivam 2020-02-20 1258 }
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 4/4] bus: mhi: host: Take irqsave lock after TRE is generated
2023-11-09 16:29 ` Manivannan Sadhasivam
@ 2023-11-10 3:42 ` Qiang Yu
0 siblings, 0 replies; 14+ messages in thread
From: Qiang Yu @ 2023-11-10 3:42 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: quic_jhugo, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana, Hemant Kumar, Lazarus Motha
On 11/10/2023 12:29 AM, Manivannan Sadhasivam wrote:
> On Tue, Nov 07, 2023 at 03:16:05PM +0800, Qiang Yu wrote:
>> From: Hemant Kumar <quic_hemantk@quicinc.com>
>>
>> Take irqsave lock after TRE is generated to avoid deadlock due to core
>> getting interrupts enabled as local_bh_enable must not be called with
>> irqs disabled based on upstream patch.
>>
> You still didn't address any of the comments provided by Jeff in v2.
>
> - Mani
Hi Mani, thanks for review. Sorry, missing this part. Will change to
following commit message.
If CONFIG_TRACE_IRQFLAGS is enabled, irq will be enabled once
__local_bh_enable_ip
is called as part of write_unlock_bh. Hence, let's take irqsave lock
after TRE is
generated to avoid running write_unlock_bh when irqsave lock is held.
>> Signed-off-by: Hemant Kumar <quic_hemantk@quicinc.com>
>> Signed-off-by: Lazarus Motha <quic_lmotha@quicinc.com>
>> Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
>> ---
>> drivers/bus/mhi/host/main.c | 13 +++++--------
>> 1 file changed, 5 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c
>> index b137d54..93b5110 100644
>> --- a/drivers/bus/mhi/host/main.c
>> +++ b/drivers/bus/mhi/host/main.c
>> @@ -1129,17 +1129,15 @@ static int mhi_queue(struct mhi_device *mhi_dev, struct mhi_buf_info *buf_info,
>> if (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)))
>> return -EIO;
>>
>> - read_lock_irqsave(&mhi_cntrl->pm_lock, flags);
>> -
>> ret = mhi_is_ring_full(mhi_cntrl, tre_ring);
>> - if (unlikely(ret)) {
>> - ret = -EAGAIN;
>> - goto exit_unlock;
>> - }
>> + if (unlikely(ret))
>> + return -EAGAIN;
>>
>> ret = mhi_gen_tre(mhi_cntrl, mhi_chan, buf_info, mflags);
>> if (unlikely(ret))
>> - goto exit_unlock;
>> + return ret;
>> +
>> + read_lock_irqsave(&mhi_cntrl->pm_lock, flags);
>>
>> /* Packet is queued, take a usage ref to exit M3 if necessary
>> * for host->device buffer, balanced put is done on buffer completion
>> @@ -1159,7 +1157,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, struct mhi_buf_info *buf_info,
>> if (dir == DMA_FROM_DEVICE)
>> mhi_cntrl->runtime_put(mhi_cntrl);
>>
>> -exit_unlock:
>> read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags);
>>
>> return ret;
>> --
>> 2.7.4
>>
>>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
2023-11-10 3:38 ` Qiang Yu
@ 2023-11-14 6:17 ` Qiang Yu
2023-11-14 6:17 ` Qiang Yu
1 sibling, 0 replies; 14+ messages in thread
From: Qiang Yu @ 2023-11-14 6:17 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: quic_jhugo, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana
On 11/10/2023 11:38 AM, Qiang Yu wrote:
>
> On 11/10/2023 12:32 AM, Manivannan Sadhasivam wrote:
>> On Tue, Nov 07, 2023 at 03:16:04PM +0800, Qiang Yu wrote:
>>> Ckeck mhi channel state after getting chan->lock to ensure that we only
>>> queue buffer to an enabled channel and process event of an enabled
>>> channel.
>>>
>> This commit message doesn't give proper explanation on how the
>> channel can go to
>> disabled state in between parse_xfer_event() and mhi_gen_tre().
>>
>> - Mani
>
> Hi Mani. How about following commit message
>
> MHI channel state is protected by mhi_chan->lock. Hence, after core drops
> mhi_chan->lock during processing xfer event, it can not prevent channel
> state being changed if client closes channel or driver is removed at this
> time. So let's check mhi channel state after getting chan->lock again
> to avoid
> queuing buffer to a disabled channel in xfer callback and stop processing
> event of the disabled channel.
Hi Mani, Have updated this commit message in V4 patch, hope get your
comments.
>
>>> Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
>>> ---
>>> 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 a236dc2..b137d54 100644
>>> --- a/drivers/bus/mhi/host/main.c
>>> +++ b/drivers/bus/mhi/host/main.c
>>> @@ -672,6 +672,8 @@ static int parse_xfer_event(struct
>>> mhi_controller *mhi_cntrl,
>>> }
>>> read_lock_bh(&mhi_chan->lock);
>>> + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
>>> + goto end_process_tx_event;
>>> }
>>> break;
>>> } /* CC_EOT */
>>> @@ -1211,6 +1213,8 @@ int mhi_gen_tre(struct mhi_controller
>>> *mhi_cntrl, struct mhi_chan *mhi_chan,
>>> /* Protect accesses for reading and incrementing WP */
>>> write_lock_bh(&mhi_chan->lock);
>>> + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
>>> + return -EINVAL;
>>> buf_ring = &mhi_chan->buf_ring;
>>> tre_ring = &mhi_chan->tre_ring;
>>> --
>>> 2.7.4
>>>
>>>
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel
2023-11-10 3:38 ` Qiang Yu
2023-11-14 6:17 ` Qiang Yu
@ 2023-11-14 6:17 ` Qiang Yu
1 sibling, 0 replies; 14+ messages in thread
From: Qiang Yu @ 2023-11-14 6:17 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: quic_jhugo, mhi, linux-arm-msm, linux-kernel, quic_cang,
quic_mrana
On 11/10/2023 11:38 AM, Qiang Yu wrote:
>
> On 11/10/2023 12:32 AM, Manivannan Sadhasivam wrote:
>> On Tue, Nov 07, 2023 at 03:16:04PM +0800, Qiang Yu wrote:
>>> Ckeck mhi channel state after getting chan->lock to ensure that we only
>>> queue buffer to an enabled channel and process event of an enabled
>>> channel.
>>>
>> This commit message doesn't give proper explanation on how the
>> channel can go to
>> disabled state in between parse_xfer_event() and mhi_gen_tre().
>>
>> - Mani
>
> Hi Mani. How about following commit message
>
> MHI channel state is protected by mhi_chan->lock. Hence, after core drops
> mhi_chan->lock during processing xfer event, it can not prevent channel
> state being changed if client closes channel or driver is removed at this
> time. So let's check mhi channel state after getting chan->lock again
> to avoid
> queuing buffer to a disabled channel in xfer callback and stop processing
> event of the disabled channel.
Hi Mani, Have updated this commit message in V4 patch, hope get your
comments.
>
>>> Signed-off-by: Qiang Yu <quic_qianyu@quicinc.com>
>>> ---
>>> 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 a236dc2..b137d54 100644
>>> --- a/drivers/bus/mhi/host/main.c
>>> +++ b/drivers/bus/mhi/host/main.c
>>> @@ -672,6 +672,8 @@ static int parse_xfer_event(struct
>>> mhi_controller *mhi_cntrl,
>>> }
>>> read_lock_bh(&mhi_chan->lock);
>>> + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
>>> + goto end_process_tx_event;
>>> }
>>> break;
>>> } /* CC_EOT */
>>> @@ -1211,6 +1213,8 @@ int mhi_gen_tre(struct mhi_controller
>>> *mhi_cntrl, struct mhi_chan *mhi_chan,
>>> /* Protect accesses for reading and incrementing WP */
>>> write_lock_bh(&mhi_chan->lock);
>>> + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)
>>> + return -EINVAL;
>>> buf_ring = &mhi_chan->buf_ring;
>>> tre_ring = &mhi_chan->tre_ring;
>>> --
>>> 2.7.4
>>>
>>>
>
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2023-11-14 6:17 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-07 7:16 [PATCH v3 0/4] bus: mhi: host: Add lock to avoid race when ringing channel DB Qiang Yu
2023-11-07 7:16 ` [PATCH v3 1/4] bus: mhi: host: Add spinlock to protect WP access when queueing TREs Qiang Yu
2023-11-09 16:23 ` Manivannan Sadhasivam
2023-11-07 7:16 ` [PATCH v3 2/4] bus: mhi: host: Drop chan lock before queuing buffers Qiang Yu
2023-11-07 7:16 ` [PATCH v3 3/4] bus: mhi: host: Avoid processing buffer and event of a disable channel Qiang Yu
2023-11-08 6:48 ` Dan Carpenter
2023-11-10 3:40 ` Qiang Yu
2023-11-09 16:32 ` Manivannan Sadhasivam
2023-11-10 3:38 ` Qiang Yu
2023-11-14 6:17 ` Qiang Yu
2023-11-14 6:17 ` Qiang Yu
2023-11-07 7:16 ` [PATCH v3 4/4] bus: mhi: host: Take irqsave lock after TRE is generated Qiang Yu
2023-11-09 16:29 ` Manivannan Sadhasivam
2023-11-10 3:42 ` Qiang Yu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox