Date: Wed, 20 Jul 2011 23:19:58 GMT From: Takuya ASADA <syuu@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 196464 for review Message-ID: <201107202319.p6KNJwmP002258@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@196464?ac=10 Change 196464 by syuu@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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107202319.p6KNJwmP002258>