Module Name:    src
Committed By:   riastradh
Date:           Wed Mar 23 23:24:21 UTC 2022

Modified Files:
        src/sys/arch/mips/cavium: octeon_intr.c

Log Message:
mips/cavium: Fix membars around establishing interrupt handlers.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/mips/cavium/octeon_intr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/cavium/octeon_intr.c
diff -u src/sys/arch/mips/cavium/octeon_intr.c:1.24 src/sys/arch/mips/cavium/octeon_intr.c:1.25
--- src/sys/arch/mips/cavium/octeon_intr.c:1.24	Tue Aug 18 07:41:41 2020
+++ src/sys/arch/mips/cavium/octeon_intr.c	Wed Mar 23 23:24:21 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: octeon_intr.c,v 1.24 2020/08/18 07:41:41 skrll Exp $	*/
+/*	$NetBSD: octeon_intr.c,v 1.25 2022/03/23 23:24:21 riastradh Exp $	*/
 /*
  * Copyright 2001, 2002 Wasabi Systems, Inc.
  * All rights reserved.
@@ -44,7 +44,7 @@
 #define __INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: octeon_intr.c,v 1.24 2020/08/18 07:41:41 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: octeon_intr.c,v 1.25 2022/03/23 23:24:21 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -54,6 +54,7 @@ __KERNEL_RCSID(0, "$NetBSD: octeon_intr.
 #include <sys/kernel.h>
 #include <sys/kmem.h>
 #include <sys/atomic.h>
+#include <sys/xcall.h>
 
 #include <lib/libkern/libkern.h>
 
@@ -353,6 +354,14 @@ octeon_intr_establish(int irq, int ipl, 
 	ih->ih_irq = irq;
 	ih->ih_ipl = ipl;
 
+	/*
+	 * Make sure the initialization is visible on all CPUs before
+	 * we expose it in octciu_intrs.  This way we don't need to
+	 * issue any membar for a load-acquire when handling the
+	 * interrupt.
+	 */
+	xc_barrier(0);
+
 	mutex_enter(&octeon_intr_lock);
 
 	/*
@@ -361,8 +370,7 @@ octeon_intr_establish(int irq, int ipl, 
 	KASSERTMSG(octciu_intrs[irq] == NULL, "irq %d in use! (%p)",
 	    irq, octciu_intrs[irq]);
 
-	octciu_intrs[irq] = ih;
-	membar_producer();
+	atomic_store_relaxed(&octciu_intrs[irq], ih);
 
 	/*
 	 * Now enable it.
@@ -462,13 +470,15 @@ octeon_intr_disestablish(void *cookie)
 		break;
 	}
 
-	/*
-	 * Now remove it since we shouldn't get interrupts for it.
-	 */
-	octciu_intrs[irq] = NULL;
+	atomic_store_relaxed(&octciu_intrs[irq], NULL);
 
 	mutex_exit(&octeon_intr_lock);
 
+	/*
+	 * Wait until the interrupt handler is no longer running on all
+	 * CPUs before freeing ih and returning.
+	 */
+	xc_barrier(0);
 	kmem_free(ih, sizeof(*ih));
 }
 
@@ -507,7 +517,8 @@ octeon_iointr(int ipl, vaddr_t pc, uint3
 			const int irq = (bank * 64) + bit;
 			hwpend[bank] &= ~__BIT(bit);
 
-			struct octeon_intrhand * const ih = octciu_intrs[irq];
+			struct octeon_intrhand * const ih =
+			    atomic_load_relaxed(&octciu_intrs[irq]);
 			cpu->cpu_intr_evs[irq].ev_count++;
 			if (__predict_true(ih != NULL)) {
 #ifdef MULTIPROCESSOR

Reply via email to