The kopald thread handles opal events as they appear, but by polling a
static bit-vector in last_outstanding_events. Annotate these data races
accordingly. We are not at risk of missing events, but use of READ_ONCE,
WRITE_ONCE will assist readers in seeing that kopald only consumes the
events it is aware of when it is scheduled. Also removes extraneous
KCSAN warnings.

Signed-off-by: Rohan McLure <rmcl...@linux.ibm.com>
Reviewed-by: Nicholas Piggin <npig...@gmail.com>
---
 arch/powerpc/platforms/powernv/opal-irqchip.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/platforms/powernv/opal-irqchip.c 
b/arch/powerpc/platforms/powernv/opal-irqchip.c
index d55652b5f6fa..f9a7001dacb7 100644
--- a/arch/powerpc/platforms/powernv/opal-irqchip.c
+++ b/arch/powerpc/platforms/powernv/opal-irqchip.c
@@ -59,7 +59,7 @@ void opal_handle_events(void)
 
                cond_resched();
        }
-       last_outstanding_events = 0;
+       WRITE_ONCE(last_outstanding_events, 0);
        if (opal_poll_events(&events) != OPAL_SUCCESS)
                return;
        e = be64_to_cpu(events) & opal_event_irqchip.mask;
@@ -69,7 +69,7 @@ void opal_handle_events(void)
 
 bool opal_have_pending_events(void)
 {
-       if (last_outstanding_events & opal_event_irqchip.mask)
+       if (READ_ONCE(last_outstanding_events) & opal_event_irqchip.mask)
                return true;
        return false;
 }
@@ -124,7 +124,7 @@ static irqreturn_t opal_interrupt(int irq, void *data)
        __be64 events;
 
        opal_handle_interrupt(virq_to_hw(irq), &events);
-       last_outstanding_events = be64_to_cpu(events);
+       WRITE_ONCE(last_outstanding_events, be64_to_cpu(events));
        if (opal_have_pending_events())
                opal_wake_poller();
 
-- 
2.37.2

Reply via email to