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 <groverm@codeaurora.org>
This commit is contained in:
Mayank Grover 2020-12-09 16:05:25 +05:30 committed by Gerrit - the friendly Code Review server
parent aa01bdf5fa
commit 88201dd4ee

View File

@ -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)