From f2197a20e8f7109c9b5035d5c640d3fbd4bc6a16 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Fri, 6 Nov 2020 14:37:02 -0800 Subject: [PATCH] soc: qcom: smp2p: Add memory barrier for irq_pending There is a very tight race where the irq_retrigger function is run on one cpu and the actual retrigger softirq is running on a second cpu. When this happens, there may be a chance that the second cpu will not see the updated irq_pending value from first cpu. Add a memory barrier to ensure that irq_pending is read correctly. Change-Id: I3dd185decc4f050bd57c0b6558f417ead2a3aa5a Signed-off-by: Chris Lew --- drivers/soc/qcom/smp2p.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c index 468de2dddfdb..f87af11fde98 100644 --- a/drivers/soc/qcom/smp2p.c +++ b/drivers/soc/qcom/smp2p.c @@ -270,6 +270,9 @@ static void qcom_smp2p_notify_in(struct qcom_smp2p *smp2p) status = val ^ entry->last_value; entry->last_value = val; + + /* Ensure irq_pending is read correctly */ + mb(); status |= *entry->irq_pending; SMP2P_INFO("%d:\t%s: status:%0lx val:%0x\n", @@ -391,6 +394,11 @@ static int smp2p_retrigger_irq(struct irq_data *irqd) SMP2P_INFO("%d: %s: %lu\n", entry->smp2p->remote_pid, entry->name, irq); set_bit(irq, entry->irq_pending); + /* Ensure irq_pending is visible to all cpus that retried interrupt + * can run on + */ + mb(); + return 0; }