From owner-p4-projects@FreeBSD.ORG Mon Jun 20 18:16:56 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C9A6E1065670; Mon, 20 Jun 2011 18:16:56 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7E705106566C for ; Mon, 20 Jun 2011 18:16:56 +0000 (UTC) (envelope-from syuu@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 6BFF78FC12 for ; Mon, 20 Jun 2011 18:16:56 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5KIGuNI069263 for ; Mon, 20 Jun 2011 18:16:56 GMT (envelope-from syuu@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5KIGuow069260 for perforce@freebsd.org; Mon, 20 Jun 2011 18:16:56 GMT (envelope-from syuu@FreeBSD.org) Date: Mon, 20 Jun 2011 18:16:56 GMT Message-Id: <201106201816.p5KIGuow069260@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to syuu@FreeBSD.org using -f From: Takuya ASADA To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195044 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Jun 2011 18:16:57 -0000 http://p4web.freebsd.org/@@195044?ac=10 Change 195044 by syuu@kikurage on 2011/06/20 18:16:04 rmlock on BPFIF_LOCK looks working now Affected files ... .. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#9 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.h#5 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/bpfdesc.h#4 edit Differences ... ==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#9 (text+ko) ==== @@ -603,12 +603,12 @@ * Finally, point the driver's bpf cookie at the interface so * it will divert packets to bpf. */ - BPFIF_LOCK(bp); + BPFIF_WLOCK(bp); d->bd_bif = bp; LIST_INSERT_HEAD(&bp->bif_dlist, d, bd_next); bpf_bpfd_cnt++; - BPFIF_UNLOCK(bp); + BPFIF_WUNLOCK(bp); EVENTHANDLER_INVOKE(bpf_track, bp->bif_ifp, bp->bif_dlt, 1); } @@ -624,7 +624,7 @@ struct ifnet *ifp; bp = d->bd_bif; - BPFIF_LOCK(bp); + BPFIF_WLOCK(bp); BPFD_LOCK(d); ifp = d->bd_bif->bif_ifp; @@ -636,7 +636,7 @@ bpf_bpfd_cnt--; d->bd_bif = NULL; BPFD_UNLOCK(d); - BPFIF_UNLOCK(bp); + BPFIF_WUNLOCK(bp); EVENTHANDLER_INVOKE(bpf_track, ifp, bp->bif_dlt, 0); @@ -2249,9 +2249,10 @@ #endif u_int slen; int gottime; + struct rm_priotracker tracker; gottime = BPF_TSTAMP_NONE; - BPFIF_LOCK(bp); + BPFIF_RLOCK(bp, &tracker); LIST_FOREACH(d, &bp->bif_dlist, bd_next) { if (d->bd_qmask.qm_enabled) { SDT_PROBE2(bpf, functions, bpf_tap, entry, d, d->bd_qmask.qm_other_mask); @@ -2286,7 +2287,7 @@ } BPFD_UNLOCK(d); } - BPFIF_UNLOCK(bp); + BPFIF_RUNLOCK(bp, &tracker); } #define BPF_CHECK_DIRECTION(d, r, i) \ @@ -2303,6 +2304,7 @@ #endif u_int pktlen, slen; int gottime; + struct rm_priotracker tracker; /* Skip outgoing duplicate packets. */ if ((m->m_flags & M_PROMISC) != 0 && m->m_pkthdr.rcvif == NULL) { @@ -2313,7 +2315,7 @@ pktlen = m_length(m, NULL); gottime = BPF_TSTAMP_NONE; - BPFIF_LOCK(bp); + BPFIF_RLOCK(bp, &tracker); LIST_FOREACH(d, &bp->bif_dlist, bd_next) { if (d->bd_qmask.qm_enabled) { if (!(m->m_flags & M_FLOWID)) { @@ -2365,7 +2367,7 @@ } BPFD_UNLOCK(d); } - BPFIF_UNLOCK(bp); + BPFIF_RUNLOCK(bp, &tracker); } /* @@ -2380,6 +2382,7 @@ struct bpf_d *d; u_int pktlen, slen; int gottime; + struct rm_priotracker tracker; /* Skip outgoing duplicate packets. */ if ((m->m_flags & M_PROMISC) != 0 && m->m_pkthdr.rcvif == NULL) { @@ -2399,7 +2402,7 @@ pktlen += dlen; gottime = BPF_TSTAMP_NONE; - BPFIF_LOCK(bp); + BPFIF_RLOCK(bp, &tracker); LIST_FOREACH(d, &bp->bif_dlist, bd_next) { if (d->bd_qmask.qm_enabled) { SDT_PROBE3(bpf, functions, bpf_mtap2_rx, entry, d, m->m_pkthdr.rxqid, bp->bif_ifp->if_rxq_num); @@ -2429,7 +2432,7 @@ } BPFD_UNLOCK(d); } - BPFIF_UNLOCK(bp); + BPFIF_RUNLOCK(bp, &tracker); } #undef BPF_CHECK_DIRECTION @@ -2706,7 +2709,7 @@ LIST_INIT(&bp->bif_dlist); bp->bif_ifp = ifp; bp->bif_dlt = dlt; - mtx_init(&bp->bif_mtx, "bpf interface lock", NULL, MTX_DEF); + BPFIF_LOCK_INIT(bp, "bpf interface lock"); KASSERT(*driverp == NULL, ("bpfattach2: driverp already initialized")); *driverp = bp; @@ -2756,7 +2759,7 @@ BPFD_UNLOCK(d); } - mtx_destroy(&bp->bif_mtx); + BPFIF_LOCK_DESTROY(bp); free(bp, M_BPF); } @@ -2854,10 +2857,11 @@ { struct bpf_if *bp; struct bpf_d *bd; + struct rm_priotracker tracker; mtx_lock(&bpf_mtx); LIST_FOREACH(bp, &bpf_iflist, bif_next) { - BPFIF_LOCK(bp); + BPFIF_RLOCK(bp, &tracker); LIST_FOREACH(bd, &bp->bif_dlist, bd_next) { BPFD_LOCK(bd); bd->bd_rcount = 0; @@ -2868,7 +2872,7 @@ bd->bd_zcopy = 0; BPFD_UNLOCK(bd); } - BPFIF_UNLOCK(bp); + BPFIF_RUNLOCK(bp, &tracker); } mtx_unlock(&bpf_mtx); } @@ -2911,6 +2915,7 @@ int index, error; struct bpf_if *bp; struct bpf_d *bd; + struct rm_priotracker tracker; /* * XXX This is not technically correct. It is possible for non @@ -2949,14 +2954,14 @@ } index = 0; LIST_FOREACH(bp, &bpf_iflist, bif_next) { - BPFIF_LOCK(bp); + BPFIF_RLOCK(bp, &tracker); LIST_FOREACH(bd, &bp->bif_dlist, bd_next) { xbd = &xbdbuf[index++]; BPFD_LOCK(bd); bpfstats_fill_xbpf(xbd, bd); BPFD_UNLOCK(bd); } - BPFIF_UNLOCK(bp); + BPFIF_RUNLOCK(bp, &tracker); } mtx_unlock(&bpf_mtx); error = SYSCTL_OUT(req, xbdbuf, index * sizeof(*xbd)); ==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.h#5 (text+ko) ==== @@ -40,6 +40,9 @@ #ifndef _NET_BPF_H_ #define _NET_BPF_H_ +#include +#include + /* BSD style release date */ #define BPF_RELEASE 199606 @@ -1114,7 +1117,7 @@ u_int bif_dlt; /* link layer type */ u_int bif_hdrlen; /* length of link header */ struct ifnet *bif_ifp; /* corresponding interface */ - struct mtx bif_mtx; /* mutex for interface */ + struct rmlock bif_lock; /* rmlock for interface */ }; void bpf_bufheld(struct bpf_d *d); ==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpfdesc.h#4 (text+ko) ==== @@ -152,7 +152,12 @@ u_int64_t bd_spare[4]; }; -#define BPFIF_LOCK(bif) mtx_lock(&(bif)->bif_mtx) -#define BPFIF_UNLOCK(bif) mtx_unlock(&(bif)->bif_mtx) +#define BPFIF_LOCK_INIT(bif, d) \ + rm_init_flags(&(bif)->bif_lock, (d), RM_NOWITNESS | RM_RECURSE); +#define BPFIF_LOCK_DESTROY(bif) rm_destroy(&(bif)->bif_lock) +#define BPFIF_RLOCK(bif, tracker) rm_rlock(&(bif)->bif_lock, tracker) +#define BPFIF_RUNLOCK(bif, tracker) rm_runlock(&(bif)->bif_lock, tracker) +#define BPFIF_WLOCK(bif) rm_wlock(&(bif)->bif_lock) +#define BPFIF_WUNLOCK(bif) rm_wunlock(&(bif)->bif_lock) #endif