Skip site navigation (1)Skip section navigation (2)
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>