Hi Chengfeng, On 6/24/2023 12:36 PM, YE Chengfeng wrote: > iproc_i2c_rd_reg and iproc_i2c_wr_reg are called from both > interrupt context (e.g. bcm_iproc_i2c_isr) and process context > (e.g. bcm_iproc_i2c_suspend). Therefore, interrupts should be > disabled to avoid potential deadlock. To prevent this deadlock, > use spin_lock_irqsave. > > Signed-off-by: Chengfeng Ye <cyeaa@xxxxxxxxxxxxxx> > --- > drivers/i2c/busses/i2c-bcm-iproc.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-bcm-iproc.c b/drivers/i2c/busses/i2c-bcm-iproc.c > index 85d8a6b04885..d02245e4db8c 100644 > --- a/drivers/i2c/busses/i2c-bcm-iproc.c > +++ b/drivers/i2c/busses/i2c-bcm-iproc.c > @@ -233,13 +233,14 @@ static inline u32 iproc_i2c_rd_reg(struct bcm_iproc_i2c_dev *iproc_i2c, > u32 offset) > { > u32 val; > + unsigned long flags; > > if (iproc_i2c->idm_base) { > - spin_lock(&iproc_i2c->idm_lock); > + spin_lock_irqsave(&iproc_i2c->idm_lock, flags); > writel(iproc_i2c->ape_addr_mask, > iproc_i2c->idm_base + IDM_CTRL_DIRECT_OFFSET); > val = readl(iproc_i2c->base + offset); > - spin_unlock(&iproc_i2c->idm_lock); > + spin_unlock_irqrestore(&iproc_i2c->idm_lock, flags); > } else { > val = readl(iproc_i2c->base + offset); > } > @@ -250,12 +251,13 @@ static inline u32 iproc_i2c_rd_reg(struct bcm_iproc_i2c_dev *iproc_i2c, > static inline void iproc_i2c_wr_reg(struct bcm_iproc_i2c_dev *iproc_i2c, > u32 offset, u32 val) > { > + unsigned long flags; > if (iproc_i2c->idm_base) { > - spin_lock(&iproc_i2c->idm_lock); > + spin_lock_irqsave(&iproc_i2c->idm_lock, flags); > writel(iproc_i2c->ape_addr_mask, > iproc_i2c->idm_base + IDM_CTRL_DIRECT_OFFSET); > writel(val, iproc_i2c->base + offset); > - spin_unlock(&iproc_i2c->idm_lock); > + spin_unlock_irqrestore(&iproc_i2c->idm_lock, flags); > } else { > writel(val, iproc_i2c->base + offset); > } > -- > 2.17.1 This fix looks good to me. Thanks. Just curious, did you actually see a race condition issue as a result of this, or the fix is done completely based on the analysis of the code? Acked-by: Ray Jui <ray.jui@xxxxxxxxxxxx>
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature