From owner-svn-src-head@FreeBSD.ORG Wed Dec 17 00:11:57 2008 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 DCDEA1065672; Wed, 17 Dec 2008 00:11:56 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C7EAF8FC1A; Wed, 17 Dec 2008 00:11:56 +0000 (UTC) (envelope-from kmacy@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 mBH0BusW051365; Wed, 17 Dec 2008 00:11:56 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBH0BuKk051362; Wed, 17 Dec 2008 00:11:56 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812170011.mBH0BuKk051362@svn.freebsd.org> From: Kip Macy Date: Wed, 17 Dec 2008 00:11:56 +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: r186199 - in head: . sys/net 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: Wed, 17 Dec 2008 00:11:57 -0000 Author: kmacy Date: Wed Dec 17 00:11:56 2008 New Revision: 186199 URL: http://svn.freebsd.org/changeset/base/186199 Log: convert ifnet and afdata locks from mutexes to rwlocks Modified: head/UPDATING head/sys/net/if.c head/sys/net/if_var.h Modified: head/UPDATING ============================================================================== --- head/UPDATING Tue Dec 16 23:56:24 2008 (r186198) +++ head/UPDATING Wed Dec 17 00:11:56 2008 (r186199) @@ -21,6 +21,9 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 8. developers choose to disable these features on build machines to maximize performance. (To disable malloc debugging, run ln -s aj /etc/malloc.conf.) +20081216: + The afdata and ifnet locks have been changed from mutexes to + rwlocks, network modules will need to be re-compiled. 20081214: __FreeBSD_version 800059 incorporates the new arp-v2 rewrite. Modified: head/sys/net/if.c ============================================================================== --- head/sys/net/if.c Tue Dec 16 23:56:24 2008 (r186198) +++ head/sys/net/if.c Wed Dec 17 00:11:56 2008 (r186199) @@ -158,7 +158,7 @@ static struct knlist ifklist; #endif int ifqmaxlen = IFQ_MAXLEN; -struct mtx ifnet_lock; +struct rwlock ifnet_lock; static if_com_alloc_t *if_com_alloc[256]; static if_com_free_t *if_com_free[256]; Modified: head/sys/net/if_var.h ============================================================================== --- head/sys/net/if_var.h Tue Dec 16 23:56:24 2008 (r186198) +++ head/sys/net/if_var.h Wed Dec 17 00:11:56 2008 (r186199) @@ -80,6 +80,7 @@ struct ifvlantrunk; #endif /* _KERNEL */ #include /* XXX */ #include /* XXX */ +#include /* XXX */ #include /* XXX */ #include @@ -175,7 +176,7 @@ struct ifnet { struct ifprefixhead if_prefixhead; /* list of prefixes per if */ void *if_afdata[AF_MAX]; int if_afdata_initialized; - struct mtx if_afdata_mtx; + struct rwlock if_afdata_lock; struct task if_starttask; /* task for IFF_NEEDSGIANT */ struct task if_linktask; /* task for link change events */ struct mtx if_addr_mtx; /* mutex to protect address lists */ @@ -185,8 +186,8 @@ struct ifnet { /* protected by if_addr_mtx */ void *if_pf_kif; void *if_lagg; /* lagg glue */ - void *if_pspare[8]; /* multiq/TOE 3; vimage 3; general use 4 */ - void (*if_qflush) /* flush any queues */ + void *if_pspare[8]; /* TOE 3; vimage 3; general use 4 */ + void (*if_qflush) /* flush any queues */ (struct ifnet *); int (*if_transmit) /* initiate output routine */ (struct ifnet *, struct mbuf *); @@ -358,14 +359,19 @@ typedef void (*group_change_event_handle EVENTHANDLER_DECLARE(group_change_event, group_change_event_handler_t); #define IF_AFDATA_LOCK_INIT(ifp) \ - mtx_init(&(ifp)->if_afdata_mtx, "if_afdata", NULL, MTX_DEF) -#define IF_AFDATA_LOCK(ifp) mtx_lock(&(ifp)->if_afdata_mtx) -#define IF_AFDATA_TRYLOCK(ifp) mtx_trylock(&(ifp)->if_afdata_mtx) -#define IF_AFDATA_UNLOCK(ifp) mtx_unlock(&(ifp)->if_afdata_mtx) -#define IF_AFDATA_DESTROY(ifp) mtx_destroy(&(ifp)->if_afdata_mtx) + rw_init(&(ifp)->if_afdata_lock, "if_afdata") -#define IF_AFDATA_LOCK_ASSERT(ifp) mtx_assert(&(ifp)->if_afdata_mtx, MA_OWNED) -#define IF_AFDATA_UNLOCK_ASSERT(ifp) mtx_assert(&(ifp)->if_afdata_mtx, MA_NOTOWNED) +#define IF_AFDATA_WLOCK(ifp) rw_wlock(&(ifp)->if_afdata_lock) +#define IF_AFDATA_RLOCK(ifp) rw_rlock(&(ifp)->if_afdata_lock) +#define IF_AFDATA_WUNLOCK(ifp) rw_wunlock(&(ifp)->if_afdata_lock) +#define IF_AFDATA_RUNLOCK(ifp) rw_runlock(&(ifp)->if_afdata_lock) +#define IF_AFDATA_LOCK(ifp) IF_AFDATA_WLOCK(ifp) +#define IF_AFDATA_UNLOCK(ifp) IF_AFDATA_WUNLOCK(ifp) +#define IF_AFDATA_TRYLOCK(ifp) rw_try_wlock(&(ifp)->if_afdata_lock) +#define IF_AFDATA_DESTROY(ifp) rw_destroy(&(ifp)->if_afdata_lock) + +#define IF_AFDATA_LOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_LOCKED) +#define IF_AFDATA_UNLOCK_ASSERT(ifp) rw_assert(&(ifp)->if_afdata_lock, RA_UNLOCKED) #define IFF_LOCKGIANT(ifp) do { \ if ((ifp)->if_flags & IFF_NEEDSGIANT) \ @@ -637,14 +643,14 @@ struct ifmultiaddr { IFA_UNLOCK(ifa); \ } while (0) -extern struct mtx ifnet_lock; +extern struct rwlock ifnet_lock; #define IFNET_LOCK_INIT() \ - mtx_init(&ifnet_lock, "ifnet", NULL, MTX_DEF | MTX_RECURSE) -#define IFNET_WLOCK() mtx_lock(&ifnet_lock) -#define IFNET_WUNLOCK() mtx_unlock(&ifnet_lock) -#define IFNET_WLOCK_ASSERT() mtx_assert(&ifnet_lock, MA_OWNED) -#define IFNET_RLOCK() IFNET_WLOCK() -#define IFNET_RUNLOCK() IFNET_WUNLOCK() + rw_init_flags(&ifnet_lock, "ifnet", RW_RECURSE) +#define IFNET_WLOCK() rw_wlock(&ifnet_lock) +#define IFNET_WUNLOCK() rw_wunlock(&ifnet_lock) +#define IFNET_WLOCK_ASSERT() rw_assert(&ifnet_lock, RA_LOCKED) +#define IFNET_RLOCK() rw_rlock(&ifnet_lock) +#define IFNET_RUNLOCK() rw_runlock(&ifnet_lock) struct ifindex_entry { struct ifnet *ife_ifnet;