Message ID | 20230508020120.218494-11-rmclure@linux.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | powerpc: KCSAN fix warnings and mark accesses | expand |
On Mon May 8, 2023 at 12:01 PM AEST, Rohan McLure wrote: > 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. This code is fairly crap, which I can say because I wrote it :( But this at least is an improvement. Thanks. Reviewed-by: Nicholas Piggin <npiggin@gmail.com> > > Signed-off-by: Rohan McLure <rmclure@linux.ibm.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
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();
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 <rmclure@linux.ibm.com> --- arch/powerpc/platforms/powernv/opal-irqchip.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)