From 88201dd4ee790f8928ff17ad437dad875471a72c Mon Sep 17 00:00:00 2001 From: Mayank Grover Date: Wed, 9 Dec 2020 16:05:25 +0530 Subject: [PATCH] soc: qcom: Avoid race shutdown and receive data for mbox channel In scenario where channel shutdown is in progress interrupt handler can call callback for mbox channel which might be free. Change to avoid race between mbox channel free and receive data. Change-Id: I07ef5f08aa1946be775de6b3e2f89d9069fa6ee3 Signed-off-by: Mayank Grover --- drivers/soc/qcom/qcom_rimps.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/soc/qcom/qcom_rimps.c b/drivers/soc/qcom/qcom_rimps.c index fd10a810a968..7e01b38a43c5 100644 --- a/drivers/soc/qcom/qcom_rimps.c +++ b/drivers/soc/qcom/qcom_rimps.c @@ -20,6 +20,7 @@ #define RIMPS_STATUS_IRQ_VAL BIT(3) #define RIMPS_CLOCK_DOMAIN_OFFSET 0x1000 +static DEFINE_SPINLOCK(mbox_chan_lock); /** * struct rimps_ipc ipc per channel @@ -41,6 +42,7 @@ struct qcom_rimps_ipc { static irqreturn_t qcom_rimps_rx_interrupt(int irq, void *p) { struct qcom_rimps_ipc *rimps_ipc; + unsigned long flags; u32 val; int i; @@ -59,9 +61,11 @@ static irqreturn_t qcom_rimps_rx_interrupt(int irq, void *p) /* Make sure register write is complete before proceeding */ mb(); + spin_lock_irqsave(&mbox_chan_lock, flags); if (rimps_ipc->chans[i].con_priv) mbox_chan_received_data(&rimps_ipc->chans[i] , NULL); + spin_unlock_irqrestore(&mbox_chan_lock, flags); } } @@ -70,7 +74,11 @@ static irqreturn_t qcom_rimps_rx_interrupt(int irq, void *p) static void qcom_rimps_mbox_shutdown(struct mbox_chan *chan) { + unsigned long flags; + + spin_lock_irqsave(&mbox_chan_lock, flags); chan->con_priv = NULL; + spin_unlock_irqrestore(&mbox_chan_lock, flags); } static int qcom_rimps_mbox_send_data(struct mbox_chan *chan, void *data)