PERFORCE change 193047 for review

Takuya ASADA syuu at FreeBSD.org
Fri May 13 09:56:24 UTC 2011


http://p4web.freebsd.org/@@193047?ac=10

Change 193047 by syuu at maitake2 on 2011/05/13 09:55:48

	bpfif changed from mtx to rwlock, untested

Affected files ...

.. //depot/projects/soc2011/multiqueue_bpf/sys/net/bpf.c#3 edit
.. //depot/projects/soc2011/multiqueue_bpf/sys/net/bpf.h#3 edit
.. //depot/projects/soc2011/multiqueue_bpf/sys/net/bpfdesc.h#3 edit

Differences ...

==== //depot/projects/soc2011/multiqueue_bpf/sys/net/bpf.c#3 (text+ko) ====

@@ -574,12 +574,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);
 }
@@ -595,7 +595,7 @@
 	struct ifnet *ifp;
 
 	bp = d->bd_bif;
-	BPFIF_LOCK(bp);
+	BPFIF_WLOCK(bp);
 	BPFD_LOCK(d);
 	ifp = d->bd_bif->bif_ifp;
 
@@ -607,7 +607,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);
 
@@ -1840,7 +1840,7 @@
 	int gottime;
 
 	gottime = BPF_TSTAMP_NONE;
-	BPFIF_LOCK(bp);
+	BPFIF_RLOCK(bp);
 	LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
 		BPFD_LOCK(d);
 		++d->bd_rcount;
@@ -1869,7 +1869,7 @@
 		}
 		BPFD_UNLOCK(d);
 	}
-	BPFIF_UNLOCK(bp);
+	BPFIF_RUNLOCK(bp);
 }
 
 #define	BPF_CHECK_DIRECTION(d, r, i)				\
@@ -1899,7 +1899,7 @@
 	pktlen = m_length(m, NULL);
 
 	gottime = BPF_TSTAMP_NONE;
-	BPFIF_LOCK(bp);
+	BPFIF_RLOCK(bp);
 	LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
 		if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
 			continue;
@@ -1927,7 +1927,7 @@
 		}
 		BPFD_UNLOCK(d);
 	}
-	BPFIF_UNLOCK(bp);
+	BPFIF_RUNLOCK(bp);
 }
 
 /*
@@ -1961,7 +1961,7 @@
 	pktlen += dlen;
 
 	gottime = BPF_TSTAMP_NONE;
-	BPFIF_LOCK(bp);
+	BPFIF_RLOCK(bp);
 	LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
 		if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
 			continue;
@@ -1982,7 +1982,7 @@
 		}
 		BPFD_UNLOCK(d);
 	}
-	BPFIF_UNLOCK(bp);
+	BPFIF_RUNLOCK(bp);
 }
 
 #undef	BPF_CHECK_DIRECTION
@@ -2253,7 +2253,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);
+	rw_init(&bp->bif_lock, "bpf interface lock");
 	KASSERT(*driverp == NULL, ("bpfattach2: driverp already initialized"));
 	*driverp = bp;
 
@@ -2303,7 +2303,7 @@
 		BPFD_UNLOCK(d);
 	}
 
-	mtx_destroy(&bp->bif_mtx);
+	rw_destroy(&bp->bif_lock);
 	free(bp, M_BPF);
 }
 
@@ -2404,7 +2404,7 @@
 
 	mtx_lock(&bpf_mtx);
 	LIST_FOREACH(bp, &bpf_iflist, bif_next) {
-		BPFIF_LOCK(bp);
+		BPFIF_RLOCK(bp);
 		LIST_FOREACH(bd, &bp->bif_dlist, bd_next) {
 			BPFD_LOCK(bd);
 			bd->bd_rcount = 0;
@@ -2415,7 +2415,7 @@
 			bd->bd_zcopy = 0;
 			BPFD_UNLOCK(bd);
 		}
-		BPFIF_UNLOCK(bp);
+		BPFIF_RUNLOCK(bp);
 	}
 	mtx_unlock(&bpf_mtx);
 }
@@ -2496,14 +2496,14 @@
 	}
 	index = 0;
 	LIST_FOREACH(bp, &bpf_iflist, bif_next) {
-		BPFIF_LOCK(bp);
+		BPFIF_RLOCK(bp);
 		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);
 	}
 	mtx_unlock(&bpf_mtx);
 	error = SYSCTL_OUT(req, xbdbuf, index * sizeof(*xbd));

==== //depot/projects/soc2011/multiqueue_bpf/sys/net/bpf.h#3 (text+ko) ====

@@ -40,6 +40,8 @@
 #ifndef _NET_BPF_H_
 #define _NET_BPF_H_
 
+#include <sys/rwlock.h>
+
 /* BSD style release date */
 #define	BPF_RELEASE 199606
 
@@ -1104,7 +1106,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 rwlock bif_lock;		/* rwlock for interface */
 };
 
 void	 bpf_bufheld(struct bpf_d *d);

==== //depot/projects/soc2011/multiqueue_bpf/sys/net/bpfdesc.h#3 (text+ko) ====

@@ -145,7 +145,10 @@
 	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_RLOCK(bif)	rw_rlock(&(bif)->bif_lock)
+#define BPFIF_RUNLOCK(bif)	rw_runlock(&(bif)->bif_lock)
+
+#define BPFIF_WLOCK(bif)	rw_wlock(&(bif)->bif_lock)
+#define BPFIF_WUNLOCK(bif)	rw_wunlock(&(bif)->bif_lock)
 
 #endif


More information about the p4-projects mailing list