Date: Sat, 5 Nov 2011 17:43:03 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r227114 - in projects/pseries/powerpc: ofw pseries Message-ID: <201111051743.pA5Hh3gr078073@svn.freebsd.org>
index | next in thread | raw e-mail
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); }help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201111051743.pA5Hh3gr078073>
