PERFORCE change 196464 for review
Takuya ASADA
syuu at FreeBSD.org
Wed Jul 20 23:19:59 UTC 2011
http://p4web.freebsd.org/@@196464?ac=10
Change 196464 by syuu at kikurage on 2011/07/20 23:19:09
Rewrite BPFIF_LOCK to rwlock, rwlock for bpf_qmask added, tests moved to src/tools/regression/bpf/mq_bpf.
Affected files ...
.. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#17 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.h#8 edit
.. //depot/projects/soc2011/mq_bpf/src/sys/net/bpfdesc.h#7 edit
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_ifqueue/Makefile#1 add
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_ifqueue/test_ifqueue.c#1 add
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_mqbpf/Makefile#1 add
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_mqbpf/test_mqbpf.c#1 add
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_sqbpf/Makefile#1 add
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_sqbpf/test_sqbpf.c#1 add
.. //depot/projects/soc2011/mq_bpf/tests/Makefile#4 delete
.. //depot/projects/soc2011/mq_bpf/tests/test_ifqueue.c#2 delete
.. //depot/projects/soc2011/mq_bpf/tests/test_mqbpf.c#5 delete
.. //depot/projects/soc2011/mq_bpf/tests/test_sqbpf.c#4 delete
Differences ...
==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#17 (text+ko) ====
@@ -695,6 +695,7 @@
d->bd_qmask.qm_rxq_mask = NULL;
d->bd_qmask.qm_txq_mask = NULL;
d->bd_qmask.qm_other_mask = FALSE;
+ BPFQ_LOCK_INIT(&d->bd_qmask, "qmask lock");
#ifdef MAC
mac_bpfdesc_init(d);
mac_bpfdesc_create(td->td_ucred, d);
@@ -1520,19 +1521,18 @@
{
struct ifnet *ifp;
- BPFD_LOCK(d);
if (d->bd_bif == NULL) {
log(LOG_ERR, "d->bd_bif == NULL\n");
/*
* No interface attached yet.
*/
- BPFD_UNLOCK(d);
error = EINVAL;
break;
}
+ BPFQ_WLOCK(&d->bd_qmask);
if (d->bd_qmask.qm_enabled) {
log(LOG_ERR, "d->bd_qmask.qm_enabled\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1540,7 +1540,7 @@
if (!(ifp->if_capabilities &
(IFCAP_MULTIQUEUE | IFCAP_SOFT_MULTIQUEUE))) {
log(LOG_ERR, "if doesn't support multiqueue\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1554,25 +1554,24 @@
malloc(ifp->if_get_txqueue_len(ifp) * sizeof(boolean_t), M_BPF,
M_WAITOK | M_ZERO);
d->bd_qmask.qm_other_mask = FALSE;
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
case BIOCDISQMASK:
{
- BPFD_LOCK(d);
if (d->bd_bif == NULL) {
log(LOG_ERR, "d->bd_bif == NULL\n");
/*
* No interface attached yet.
*/
- BPFD_UNLOCK(d);
error = EINVAL;
break;
}
+ BPFQ_WLOCK(&d->bd_qmask);
if (!d->bd_qmask.qm_enabled) {
log(LOG_ERR, "!d->bd_qmask.qm_enabled\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1582,7 +1581,7 @@
free(d->bd_qmask.qm_rxq_mask, M_BPF);
if (d->bd_qmask.qm_txq_mask != NULL)
free(d->bd_qmask.qm_txq_mask, M_BPF);
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
@@ -1591,19 +1590,18 @@
struct ifnet *ifp;
int index;
- BPFD_LOCK(d);
if (d->bd_bif == NULL) {
log(LOG_ERR, "d->bd_bif == NULL\n");
/*
* No interface attached yet.
*/
- BPFD_UNLOCK(d);
error = EINVAL;
break;
}
+ BPFQ_WLOCK(&d->bd_qmask);
if (!d->bd_qmask.qm_enabled) {
log(LOG_ERR, "!d->bd_qmask.qm_enabled\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1611,12 +1609,12 @@
index = *(uint32_t *)addr;
if (index > ifp->if_get_rxqueue_len(ifp)) {
log(LOG_ERR, "BIOCSTRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_get_rxqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
d->bd_qmask.qm_rxq_mask[index] = TRUE;
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
@@ -1625,19 +1623,18 @@
int index;
struct ifnet *ifp;
- BPFD_LOCK(d);
if (d->bd_bif == NULL) {
log(LOG_ERR, "d->bd_bif == NULL\n");
/*
* No interface attached yet.
*/
- BPFD_UNLOCK(d);
error = EINVAL;
break;
}
+ BPFQ_WLOCK(&d->bd_qmask);
if (!d->bd_qmask.qm_enabled) {
log(LOG_ERR, "!d->bd_qmask.qm_enabled\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1645,12 +1642,12 @@
index = *(uint32_t *)addr;
if (index > ifp->if_get_rxqueue_len(ifp)) {
log(LOG_ERR, "BIOCCRRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_get_rxqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
d->bd_qmask.qm_rxq_mask[index] = FALSE;
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
@@ -1659,19 +1656,18 @@
int index;
struct ifnet *ifp;
- BPFD_LOCK(d);
if (d->bd_bif == NULL) {
log(LOG_ERR, "d->bd_bif == NULL\n");
/*
* No interface attached yet.
*/
- BPFD_UNLOCK(d);
error = EINVAL;
break;
}
+ BPFQ_WLOCK(&d->bd_qmask);
if (!d->bd_qmask.qm_enabled) {
log(LOG_ERR, "!d->bd_qmask.qm_enabled\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1679,12 +1675,12 @@
index = *(uint32_t *)addr;
if (index > ifp->if_get_rxqueue_len(ifp)) {
log(LOG_ERR, "BIOCGTRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_get_rxqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
*(uint32_t *)addr = d->bd_qmask.qm_rxq_mask[index];
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
@@ -1693,19 +1689,18 @@
struct ifnet *ifp;
int index;
- BPFD_LOCK(d);
if (d->bd_bif == NULL) {
log(LOG_ERR, "d->bd_bif == NULL\n");
/*
* No interface attached yet.
*/
- BPFD_UNLOCK(d);
error = EINVAL;
break;
}
+ BPFQ_WLOCK(&d->bd_qmask);
if (!d->bd_qmask.qm_enabled) {
log(LOG_ERR, "!d->bd_qmask.qm_enabled\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1714,12 +1709,12 @@
index = *(uint32_t *)addr;
if (index > ifp->if_get_txqueue_len(ifp)) {
log(LOG_ERR, "BIOCSTTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_get_txqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
d->bd_qmask.qm_txq_mask[index] = TRUE;
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
@@ -1728,19 +1723,18 @@
struct ifnet *ifp;
int index;
- BPFD_LOCK(d);
if (d->bd_bif == NULL) {
log(LOG_ERR, "d->bd_bif == NULL\n");
/*
* No interface attached yet.
*/
- BPFD_UNLOCK(d);
error = EINVAL;
break;
}
+ BPFQ_WLOCK(&d->bd_qmask);
if (!d->bd_qmask.qm_enabled) {
log(LOG_ERR, "!d->bd_qmask.qm_enabled\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1749,12 +1743,12 @@
index = *(uint32_t *)addr;
if (index > ifp->if_get_txqueue_len(ifp)) {
log(LOG_ERR, "BIOCCRTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_get_txqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
d->bd_qmask.qm_txq_mask[index] = FALSE;
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
@@ -1763,19 +1757,18 @@
int index;
struct ifnet *ifp;
- BPFD_LOCK(d);
if (d->bd_bif == NULL) {
log(LOG_ERR, "d->bd_bif == NULL\n");
/*
* No interface attached yet.
*/
- BPFD_UNLOCK(d);
error = EINVAL;
break;
}
+ BPFQ_WLOCK(&d->bd_qmask);
if (!d->bd_qmask.qm_enabled) {
log(LOG_ERR, "!d->bd_qmask.qm_enabled\n");
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
@@ -1783,31 +1776,31 @@
index = *(uint32_t *)addr;
if (index > ifp->if_get_txqueue_len(ifp)) {
log(LOG_ERR, "BIOCGTTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_get_txqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
error = EINVAL;
break;
}
*(uint32_t *)addr = d->bd_qmask.qm_txq_mask[index];
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
case BIOCSTOTHERMASK:
- BPFD_LOCK(d);
+ BPFQ_WLOCK(&d->bd_qmask);
d->bd_qmask.qm_other_mask = TRUE;
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
case BIOCCROTHERMASK:
- BPFD_LOCK(d);
+ BPFQ_WLOCK(&d->bd_qmask);
d->bd_qmask.qm_other_mask = FALSE;
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
case BIOCGTOTHERMASK:
- BPFD_LOCK(d);
+ BPFQ_WLOCK(&d->bd_qmask);
*(uint32_t *)addr = (uint32_t)d->bd_qmask.qm_other_mask;
- BPFD_UNLOCK(d);
+ BPFQ_WUNLOCK(&d->bd_qmask);
break;
}
CURVNET_RESTORE();
@@ -2116,7 +2109,7 @@
#endif
u_int slen;
int gottime;
-// struct rm_priotracker tracker;
+ struct rm_priotracker tracker;
gottime = BPF_TSTAMP_NONE;
BPFIF_RLOCK(bp, &tracker);
@@ -2172,7 +2165,7 @@
#endif
u_int pktlen, slen;
int gottime;
-// struct rm_priotracker tracker;
+ struct rm_priotracker tracker;
/* Skip outgoing duplicate packets. */
if ((m->m_flags & M_PROMISC) != 0 && m->m_pkthdr.rcvif == NULL) {
@@ -2185,14 +2178,14 @@
gottime = BPF_TSTAMP_NONE;
BPFIF_RLOCK(bp, &tracker);
LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
- if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
- continue;
- BPFD_LOCK(d);
+ struct rm_priotracker qm_tracker;
+
+ BPFQ_RLOCK(&d->bd_qmask, &qm_tracker);
if (d->bd_qmask.qm_enabled) {
M_ASSERTPKTHDR(m);
if (!(m->m_flags & M_FLOWID)) {
if (!d->bd_qmask.qm_other_mask) {
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
continue;
}
} else {
@@ -2200,29 +2193,34 @@
if (m->m_pkthdr.rxqueue != (uint32_t)-1) {
if (m->m_pkthdr.rxqueue >= ifp->if_get_rxqueue_len(ifp)) {
log(LOG_DEBUG, "invalid rxqueue:%d len:%d\n", m->m_pkthdr.rxqueue, ifp->if_get_rxqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
BPFIF_RUNLOCK(bp, &tracker);
return;
}
if (!d->bd_qmask.qm_rxq_mask[m->m_pkthdr.rxqueue]) {
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
continue;
}
}
if (m->m_pkthdr.txqueue != (uint32_t)-1) {
if (m->m_pkthdr.txqueue >= ifp->if_get_txqueue_len(ifp)) {
log(LOG_DEBUG, "invalid txqueue:%d len:%d\n", m->m_pkthdr.txqueue, ifp->if_get_txqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
BPFIF_RUNLOCK(bp, &tracker);
return;
}
if (!d->bd_qmask.qm_txq_mask[m->m_pkthdr.txqueue]) {
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
continue;
}
}
}
}
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
+
+ if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
+ continue;
+ BPFD_LOCK(d);
++d->bd_rcount;
#ifdef BPF_JITTER
bf = bpf_jitter_enable != 0 ? d->bd_bfilter : NULL;
@@ -2259,7 +2257,7 @@
struct bpf_d *d;
u_int pktlen, slen;
int gottime;
-// struct rm_priotracker tracker;
+ struct rm_priotracker tracker;
/* Skip outgoing duplicate packets. */
if ((m->m_flags & M_PROMISC) != 0 && m->m_pkthdr.rcvif == NULL) {
@@ -2281,14 +2279,14 @@
gottime = BPF_TSTAMP_NONE;
BPFIF_RLOCK(bp, &tracker);
LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
- if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
- continue;
- BPFD_LOCK(d);
+ struct rm_priotracker qm_tracker;
+
+ BPFQ_RLOCK(&d->bd_qmask, &qm_tracker);
if (d->bd_qmask.qm_enabled) {
M_ASSERTPKTHDR(m);
if (!(m->m_flags & M_FLOWID)) {
if (!d->bd_qmask.qm_other_mask) {
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
continue;
}
} else {
@@ -2296,29 +2294,34 @@
if (m->m_pkthdr.rxqueue != (uint32_t)-1) {
if (m->m_pkthdr.rxqueue >= ifp->if_get_rxqueue_len(ifp)) {
log(LOG_DEBUG, "invalid rxqueue:%d len:%d\n", m->m_pkthdr.rxqueue, ifp->if_get_rxqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
BPFIF_RUNLOCK(bp, &tracker);
return;
}
if (!d->bd_qmask.qm_rxq_mask[m->m_pkthdr.rxqueue]) {
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
continue;
}
}
if (m->m_pkthdr.txqueue != (uint32_t)-1) {
if (m->m_pkthdr.txqueue >= ifp->if_get_txqueue_len(ifp)) {
log(LOG_DEBUG, "invalid txqueue:%d len:%d\n", m->m_pkthdr.txqueue, ifp->if_get_txqueue_len(ifp));
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
BPFIF_RUNLOCK(bp, &tracker);
return;
}
if (!d->bd_qmask.qm_txq_mask[m->m_pkthdr.txqueue]) {
- BPFD_UNLOCK(d);
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
continue;
}
}
}
}
+ BPFQ_RUNLOCK(&d->bd_qmask, &qm_tracker);
+
+ if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
+ continue;
+ BPFD_LOCK(d);
++d->bd_rcount;
slen = bpf_filter(d->bd_rfilter, (u_char *)&mb, pktlen, 0);
if (slen != 0) {
@@ -2758,7 +2761,7 @@
{
struct bpf_if *bp;
struct bpf_d *bd;
-// struct rm_priotracker tracker;
+ struct rm_priotracker tracker;
mtx_lock(&bpf_mtx);
LIST_FOREACH(bp, &bpf_iflist, bif_next) {
@@ -2816,7 +2819,7 @@
int index, error;
struct bpf_if *bp;
struct bpf_d *bd;
-// struct rm_priotracker tracker;
+ struct rm_priotracker tracker;
/*
* XXX This is not technically correct. It is possible for non
==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.h#8 (text+ko) ====
@@ -41,6 +41,7 @@
#define _NET_BPF_H_
#include <sys/lock.h>
+#include <sys/rmlock.h>
/* BSD style release date */
#define BPF_RELEASE 199606
@@ -1112,7 +1113,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_lock; /* rmlock 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#7 (text+ko) ====
@@ -44,14 +44,25 @@
#include <sys/queue.h>
#include <sys/conf.h>
#include <net/if.h>
+#include <sys/lock.h>
+#include <sys/rmlock.h>
struct bpf_qmask {
boolean_t qm_enabled;
boolean_t * qm_rxq_mask;
boolean_t * qm_txq_mask;
boolean_t qm_other_mask;
+ struct rmlock qm_lock;
};
+#define BPFQ_LOCK_INIT(qm, d) \
+ rm_init_flags(&(qm)->qm_lock, (d), RM_NOWITNESS | RM_RECURSE);
+#define BPFQ_LOCK_DESTROY(qm) rm_destroy(&(qm)->qm_lock)
+#define BPFQ_RLOCK(qm, tracker) rm_rlock(&(qm)->qm_lock, (tracker))
+#define BPFQ_RUNLOCK(qm, tracker) rm_runlock(&(qm)->qm_lock, (tracker))
+#define BPFQ_WLOCK(qm) rm_wlock(&(qm)->qm_lock)
+#define BPFQ_WUNLOCK(qm) rm_wunlock(&(qm)->qm_lock)
+
/*
* Descriptor associated with each open bpf file.
*/
@@ -153,11 +164,11 @@
};
#define BPFIF_LOCK_INIT(bif, d) \
- mtx_init(&(bif)->bif_lock, "bpf interface lock", NULL, MTX_DEF);
-#define BPFIF_LOCK_DESTROY(bif) mtx_destroy(&(bif)->bif_lock)
-#define BPFIF_RLOCK(bif, tracker) mtx_lock(&(bif)->bif_lock)
-#define BPFIF_RUNLOCK(bif, tracker) mtx_unlock(&(bif)->bif_lock)
-#define BPFIF_WLOCK(bif) mtx_lock(&(bif)->bif_lock)
-#define BPFIF_WUNLOCK(bif) mtx_unlock(&(bif)->bif_lock)
+ 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
More information about the p4-projects
mailing list