From owner-svn-src-projects@FreeBSD.ORG Sat Nov 5 17:43:03 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3D6E01065672; Sat, 5 Nov 2011 17:43:03 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 23CFA8FC19; Sat, 5 Nov 2011 17:43:03 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pA5Hh3lQ078076; Sat, 5 Nov 2011 17:43:03 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pA5Hh3gr078073; Sat, 5 Nov 2011 17:43:03 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201111051743.pA5Hh3gr078073@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 5 Nov 2011 17:43:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r227114 - in projects/pseries/powerpc: ofw pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Nov 2011 17:43:03 -0000 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); }