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