From owner-svn-src-head@FreeBSD.ORG Mon Apr 20 12:40:29 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 203A810656D2; Mon, 20 Apr 2009 12:40:29 +0000 (UTC) (envelope-from raj@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E8C6E8FC13; Mon, 20 Apr 2009 12:40:28 +0000 (UTC) (envelope-from raj@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n3KCeSEW046332; Mon, 20 Apr 2009 12:40:28 GMT (envelope-from raj@svn.freebsd.org) Received: (from raj@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n3KCeSAC046331; Mon, 20 Apr 2009 12:40:28 GMT (envelope-from raj@svn.freebsd.org) Message-Id: <200904201240.n3KCeSAC046331@svn.freebsd.org> From: Rafal Jaworowski Date: Mon, 20 Apr 2009 12:40:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r191307 - head/sys/powerpc/powerpc X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Apr 2009 12:40:29 -0000 Author: raj Date: Mon Apr 20 12:40:28 2009 New Revision: 191307 URL: http://svn.freebsd.org/changeset/base/191307 Log: Provide locking for PowerPC interrupt sources config. Reviewed by: attilio Modified: head/sys/powerpc/powerpc/intr_machdep.c Modified: head/sys/powerpc/powerpc/intr_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/intr_machdep.c Mon Apr 20 11:51:35 2009 (r191306) +++ head/sys/powerpc/powerpc/intr_machdep.c Mon Apr 20 12:40:28 2009 (r191307) @@ -96,6 +96,7 @@ struct powerpc_intr { u_int vector; }; +static struct mtx intr_table_lock; static struct powerpc_intr *powerpc_intrs[INTR_VECTORS]; static u_int nvectors; /* Allocated vectors */ static u_int stray_count; @@ -109,8 +110,17 @@ static u_int ipi_irq; device_t pic; static void +intr_init(void *dummy __unused) +{ + + mtx_init(&intr_table_lock, "intr sources lock", NULL, MTX_DEF); +} +SYSINIT(intr_init, SI_SUB_INTR, SI_ORDER_FIRST, intr_init, NULL); + +static void intrcnt_setname(const char *name, int index) { + snprintf(intrnames + (MAXCOMLEN + 1) * index, MAXCOMLEN + 1, "%-*s", MAXCOMLEN, name); } @@ -122,11 +132,15 @@ intr_lookup(u_int irq) struct powerpc_intr *i, *iscan; int vector; + mtx_lock(&intr_table_lock); for (vector = 0; vector < nvectors; vector++) { i = powerpc_intrs[vector]; - if (i != NULL && i->irq == irq) + if (i != NULL && i->irq == irq) { + mtx_unlock(&intr_table_lock); return (i); + } } + mtx_unlock(&intr_table_lock); i = malloc(sizeof(*i), M_INTR, M_NOWAIT); if (i == NULL) @@ -139,8 +153,7 @@ intr_lookup(u_int irq) i->irq = irq; i->vector = -1; - /* XXX LOCK */ - + mtx_lock(&intr_table_lock); for (vector = 0; vector < INTR_VECTORS && vector <= nvectors; vector++) { iscan = powerpc_intrs[vector]; @@ -157,8 +170,7 @@ intr_lookup(u_int irq) intrcnt_setname(intrname, i->vector); nvectors++; } - - /* XXX UNLOCK */ + mtx_unlock(&intr_table_lock); if (iscan != NULL || i->vector == -1) { free(i, M_INTR); @@ -263,7 +275,10 @@ powerpc_setup_intr(const char *name, u_i error = intr_event_add_handler(i->event, name, filter, handler, arg, intr_priority(flags), flags, cookiep); + + mtx_lock(&intr_table_lock); intrcnt_setname(i->event->ie_fullname, i->vector); + mtx_unlock(&intr_table_lock); if (!cold && enable) PIC_ENABLE(pic, i->irq, i->vector);