svn commit: r227114 - in projects/pseries/powerpc: ofw pseries

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sat Nov 5 17:43:03 UTC 2011


Author: nwhitehorn
Date: Sat Nov  5 17:43:02 2011
New Revision: 227114
URL: http://svn.freebsd.org/changeset/base/227114

Log:
  Fix thread-safety problems in xics, and convert the RTAS mutex to a spin
  lock so that it can be used from interrupt context.

Modified:
  projects/pseries/powerpc/ofw/rtas.c
  projects/pseries/powerpc/pseries/xics.c

Modified: projects/pseries/powerpc/ofw/rtas.c
==============================================================================
--- projects/pseries/powerpc/ofw/rtas.c	Sat Nov  5 17:29:28 2011	(r227113)
+++ projects/pseries/powerpc/ofw/rtas.c	Sat Nov  5 17:43:02 2011	(r227114)
@@ -93,7 +93,7 @@ rtas_setup(void *junk)
 		return;
 	}
 
-	mtx_init(&rtas_mtx, "RTAS", MTX_DEF, 0);
+	mtx_init(&rtas_mtx, "RTAS", NULL, MTX_SPIN);
 
 	/* RTAS must be called with everything turned off in MSR */
 	rtasmsr = mfmsr();
@@ -208,7 +208,7 @@ rtas_call_method(cell_t token, int nargs
 	args.token = token;
 	va_start(ap, nreturns);
 
-	mtx_lock(&rtas_mtx);
+	mtx_lock_spin(&rtas_mtx);
 	rtas_bounce_offset = 0;
 
 	args.nargs = nargs;
@@ -232,7 +232,7 @@ rtas_call_method(cell_t token, int nargs
 	__asm __volatile ("sync");
 
 	rtas_real_unmap(argsptr, &args, sizeof(args));
-	mtx_unlock(&rtas_mtx);
+	mtx_unlock_spin(&rtas_mtx);
 
 	if (result < 0)
 		return (result);

Modified: projects/pseries/powerpc/pseries/xics.c
==============================================================================
--- projects/pseries/powerpc/pseries/xics.c	Sat Nov  5 17:29:28 2011	(r227113)
+++ projects/pseries/powerpc/pseries/xics.c	Sat Nov  5 17:43:02 2011	(r227114)
@@ -81,6 +81,8 @@ static device_method_t  xics_methods[] =
 };
 
 struct xics_softc {
+	struct mtx sc_mtx;
+
 	int ibm_int_on;
 	int ibm_int_off;
 	int ibm_get_xive;
@@ -121,10 +123,11 @@ xics_probe(device_t dev)
 static int
 xics_attach(device_t dev)
 {
-	struct xics_softc *sc;
+	struct xics_softc *sc = device_get_softc(dev);
 
-	sc = device_get_softc(dev);
+	mtx_init(&sc->sc_mtx, "XICS", NULL, MTX_DEF);
 	sc->nintvecs = 0;
+
 	sc->ibm_int_on = rtas_token_lookup("ibm,int-on");
 	sc->ibm_int_off = rtas_token_lookup("ibm,int-off");
 	sc->ibm_set_xive = rtas_token_lookup("ibm,set-xive");
@@ -199,10 +202,12 @@ xics_enable(device_t dev, u_int irq, u_i
 	KASSERT(sc->nintvecs + 1 < sizeof(sc->intvecs)/sizeof(sc->intvecs[0]),
 	    ("Too many XICS interrupts"));
 
-	/* XXX: not thread safe */
+	mtx_lock(&sc->sc_mtx);
 	sc->intvecs[sc->nintvecs].irq = irq;
 	sc->intvecs[sc->nintvecs].vector = vector;
+	mb();
 	sc->nintvecs++;
+	mtx_unlock(&sc->sc_mtx);
 
 	/* IPIs are also enabled */
 	if (irq == MAX_XICS_IRQS)
@@ -246,7 +251,6 @@ xics_mask(device_t dev, u_int irq)
 	if (irq == MAX_XICS_IRQS)
 		return;
 
-	/* XXX: These RTAS calls are problematic, since RTAS needs locks */
 	rtas_call_method(sc->ibm_int_off, 1, 1, (uint64_t)irq, &status);
 }
 
@@ -259,6 +263,5 @@ xics_unmask(device_t dev, u_int irq)
 	if (irq == MAX_XICS_IRQS)
 		return;
 
-	/* XXX: These RTAS calls are problematic, since RTAS needs locks */
 	rtas_call_method(sc->ibm_int_on, 1, 1, (uint64_t)irq, &status);
 }


More information about the svn-src-projects mailing list