Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88201dd4 authored by Mayank Grover's avatar Mayank Grover Committed by Gerrit - the friendly Code Review server
Browse files

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: default avatarMayank Grover <groverm@codeaurora.org>
parent aa01bdf5
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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)