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