From owner-svn-src-projects@FreeBSD.ORG Fri May 29 19:27:52 2009 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 F1D2C106566B; Fri, 29 May 2009 19:27:52 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E067E8FC1B; Fri, 29 May 2009 19:27:52 +0000 (UTC) (envelope-from rwatson@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 n4TJRqDg084287; Fri, 29 May 2009 19:27:52 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n4TJRqNS084286; Fri, 29 May 2009 19:27:52 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200905291927.n4TJRqNS084286@svn.freebsd.org> From: Robert Watson Date: Fri, 29 May 2009 19:27:52 +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: r193052 - projects/pnet/sys/net 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: Fri, 29 May 2009 19:27:53 -0000 Author: rwatson Date: Fri May 29 19:27:52 2009 New Revision: 193052 URL: http://svn.freebsd.org/changeset/base/193052 Log: Ifdef locking the packet-dispatch and -processing paths so that the performance impact of that locking can be better characterized. Close a sched_pin() leak. Modified: projects/pnet/sys/net/netisr2.c Modified: projects/pnet/sys/net/netisr2.c ============================================================================== --- projects/pnet/sys/net/netisr2.c Fri May 29 19:18:41 2009 (r193051) +++ projects/pnet/sys/net/netisr2.c Fri May 29 19:27:52 2009 (r193052) @@ -106,6 +106,12 @@ static struct rmlock netisr_rmlock; #define NETISR_WLOCK() rm_wlock(&netisr_rmlock) #define NETISR_WUNLOCK() rm_wunlock(&netisr_rmlock) +/* + * Temporary define to determine whether we acquire the global read lock + * around packet dispatch and processing. + */ +/* #define NETISR2_LOCKING */ + SYSCTL_NODE(_net, OID_AUTO, isr2, CTLFLAG_RW, 0, "netisr2"); /*- @@ -699,7 +705,9 @@ netisr2_process_workstream_proto(struct static void swi_net(void *arg) { +#ifdef NETISR2_LOCKING struct rm_priotracker tracker; +#endif struct netisr_workstream *nwsp; u_int bits, prot; @@ -711,7 +719,9 @@ swi_net(void *arg) netisr_poll(); #endif +#ifdef NETISR2_LOCKING NETISR_RLOCK(&tracker); +#endif NWS_LOCK(nwsp); KASSERT(!(nwsp->nws_flags & NWS_RUNNING), ("swi_net: running")); if (nwsp->nws_flags & NWS_DISPATCHING) @@ -729,7 +739,9 @@ swi_net(void *arg) nwsp->nws_flags &= ~NWS_RUNNING; out: NWS_UNLOCK(nwsp); +#ifdef NETISR2_LOCKING NETISR_RUNLOCK(&tracker); +#endif #ifdef DEVICE_POLLING netisr_pollmore(); @@ -776,7 +788,9 @@ netisr2_queue_internal(u_int proto, stru struct netisr_work *npwp; int dosignal, error; +#ifdef NETISR2_LOCKING NETISR_LOCK_ASSERT(); +#endif KASSERT(cpuid < MAXCPU, ("netisr2_queue_internal: cpuid too big " "(%u, %u)", cpuid, MAXCPU)); @@ -795,13 +809,17 @@ netisr2_queue_internal(u_int proto, stru int netisr2_queue_src(u_int proto, uintptr_t source, struct mbuf *m) { +#ifdef NETISR2_LOCKING struct rm_priotracker tracker; +#endif u_int cpuid, error; KASSERT(proto < NETISR_MAXPROT, ("netisr2_queue_src: invalid proto %d", proto)); +#ifdef NETISR2_LOCKING NETISR_RLOCK(&tracker); +#endif KASSERT(np[proto].np_handler != NULL, ("netisr2_queue_src: invalid proto %d", proto)); @@ -810,7 +828,9 @@ netisr2_queue_src(u_int proto, uintptr_t error = netisr2_queue_internal(proto, m, cpuid); else error = ENOBUFS; +#ifdef NETISR2_LOCKING NETISR_RUNLOCK(&tracker); +#endif return (error); } @@ -837,7 +857,9 @@ netisr_queue(int proto, struct mbuf *m) int netisr2_dispatch_src(u_int proto, uintptr_t source, struct mbuf *m) { +#ifdef NETISR2_LOCKING struct rm_priotracker tracker; +#endif struct netisr_workstream *nwsp; struct netisr_work *npwp; int dosignal, error; @@ -851,7 +873,9 @@ netisr2_dispatch_src(u_int proto, uintpt KASSERT(proto < NETISR_MAXPROT, ("netisr2_dispatch_src: invalid proto %u", proto)); +#ifdef NETISR2_LOCKING NETISR_RLOCK(&tracker); +#endif KASSERT(np[proto].np_handler != NULL, ("netisr2_dispatch_src: invalid proto %u", proto)); @@ -866,8 +890,8 @@ netisr2_dispatch_src(u_int proto, uintpt npwp->nw_dispatched++; npwp->nw_handled++; np[proto].np_handler(m); - NETISR_RUNLOCK(&tracker); - return (0); + error = 0; + goto out_unlock; } /* @@ -877,8 +901,8 @@ netisr2_dispatch_src(u_int proto, uintpt */ m = netisr2_select_cpuid(&np[proto], source, m, &cpuid); if (m == NULL) { - NETISR_RUNLOCK(&tracker); - return (ENOBUFS); + error = ENOBUFS; + goto out_unlock; } sched_pin(); if (!netisr_hybridxcpu_enable && (cpuid != curcpu)) @@ -900,9 +924,7 @@ netisr2_dispatch_src(u_int proto, uintpt NWS_UNLOCK(nws); if (dosignal) NWS_SIGNAL(nwsp); - sched_unpin(); - NETISR_RUNLOCK(&tracker); - return (error); + goto out_unpin; } /* @@ -938,13 +960,17 @@ netisr2_dispatch_src(u_int proto, uintpt NWS_UNLOCK(nwsp); if (dosignal) NWS_SIGNAL(nwsp); - NETISR_RUNLOCK(&tracker); - return (0); + error = 0; + goto out_unpin; queue_fallback: error = netisr2_queue_internal(proto, m, cpuid); +out_unpin: sched_unpin(); +out_unlock: +#ifdef NETISR2_LOCKING NETISR_RUNLOCK(&tracker); +#endif return (error); }