Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Sep 2013 20:35:40 +0000 (UTC)
From:      Takuya ASADA <syuu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r255155 - in user/syuu/mq_bpf/sys: dev/e1000 dev/ixgbe dev/mxge net sys
Message-ID:  <201309022035.r82KZekn024743@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: syuu
Date: Mon Sep  2 20:35:39 2013
New Revision: 255155
URL: http://svnweb.freebsd.org/changeset/base/255155

Log:
  mbuf queueid/queuetype, bpf_qmask_bits_t(kernel part)

Modified:
  user/syuu/mq_bpf/sys/dev/e1000/if_igb.c
  user/syuu/mq_bpf/sys/dev/ixgbe/ixgbe.c
  user/syuu/mq_bpf/sys/dev/mxge/if_mxge.c
  user/syuu/mq_bpf/sys/net/bpf.c
  user/syuu/mq_bpf/sys/net/bpf.h
  user/syuu/mq_bpf/sys/net/bpfdesc.h
  user/syuu/mq_bpf/sys/sys/mbuf.h

Modified: user/syuu/mq_bpf/sys/dev/e1000/if_igb.c
==============================================================================
--- user/syuu/mq_bpf/sys/dev/e1000/if_igb.c	Mon Sep  2 19:49:18 2013	(r255154)
+++ user/syuu/mq_bpf/sys/dev/e1000/if_igb.c	Mon Sep  2 20:35:39 2013	(r255155)
@@ -924,8 +924,9 @@ igb_start_locked(struct tx_ring *txr, st
 			break;
 		}
 
-		m_head->m_pkthdr.rxqueue = (uint32_t)-1;
-		m_head->m_pkthdr.txqueue = txr->me;
+		m_head->m_flags |= M_QUEUEID;
+		m_head->m_pkthdr.queueid = txr->me;
+		m_head->m_pkthdr.queuetype = QUEUETYPE_TX;
 
 		/* Send a copy of the frame to the BPF listener */
 		ETHER_BPF_MTAP(ifp, m_head);
@@ -1020,8 +1021,9 @@ igb_mq_start_locked(struct ifnet *ifp, s
 		ifp->if_obytes += next->m_pkthdr.len;
 		if (next->m_flags & M_MCAST)
 			ifp->if_omcasts++;
-		next->m_pkthdr.rxqueue = (uint32_t)-1;
-		next->m_pkthdr.txqueue = txr->me;
+		next->m_flags |= M_QUEUEID;
+		next->m_pkthdr.queueid = txr->me;
+		next->m_pkthdr.queuetype = QUEUETYPE_TX;
 		ETHER_BPF_MTAP(ifp, next);
 		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
 			break;
@@ -4896,10 +4898,10 @@ igb_rxeof(struct igb_queue *que, int cou
 			}
 #ifndef IGB_LEGACY_TX
 			rxr->fmp->m_pkthdr.flowid = que->msix;
-			rxr->fmp->m_flags |= M_FLOWID;
+			rxr->fmp->m_flags |= (M_FLOWID | M_QUEUEID);
 #endif
-			rxr->fmp->m_pkthdr.rxqueue = que->msix;
-			rxr->fmp->m_pkthdr.txqueue = (uint32_t)-1;
+			rxr->fmp->m_pkthdr.queueid = que->msix;
+			rxr->fmp->m_pkthdr.queuetype = QUEUETYPE_TX;
 
 			sendmp = rxr->fmp;
 			/* Make sure to set M_PKTHDR. */

Modified: user/syuu/mq_bpf/sys/dev/ixgbe/ixgbe.c
==============================================================================
--- user/syuu/mq_bpf/sys/dev/ixgbe/ixgbe.c	Mon Sep  2 19:49:18 2013	(r255154)
+++ user/syuu/mq_bpf/sys/dev/ixgbe/ixgbe.c	Mon Sep  2 20:35:39 2013	(r255155)
@@ -760,8 +760,9 @@ ixgbe_start_locked(struct tx_ring *txr, 
 			break;
 		}
 
-		m_head->m_pkthdr.rxqueue = (uint32_t)-1;
-		m_head->m_pkthdr.txqueue = txr->me;
+		m_head->m_flags |= M_QUEUEID;
+		m_head->m_pkthdr.queueid = txr->me;
+		m_head->m_pkthdr.queuetype = QUEUETYPE_TX;
 
 		/* Send a copy of the frame to the BPF listener */
 		ETHER_BPF_MTAP(ifp, m_head);
@@ -862,8 +863,9 @@ ixgbe_mq_start_locked(struct ifnet *ifp,
 #endif
 		enqueued++;
  
- 		next->m_pkthdr.rxqueue = (uint32_t)-1;
- 		next->m_pkthdr.txqueue = txr->me;
+		next->m_flags |= M_QUEUEID;
+ 		next->m_pkthdr.queueid = txr->me;
+		next->m_pkthdr.queuetype = QUEUETYPE_TX;
 
 		/* Send a copy of the frame to the BPF listener */
 		ETHER_BPF_MTAP(ifp, next);
@@ -4564,10 +4566,10 @@ ixgbe_rxeof(struct ix_queue *que)
 				ixgbe_rx_checksum(staterr, sendmp, ptype);
 #if __FreeBSD_version >= 800000
 			sendmp->m_pkthdr.flowid = que->msix;
-			sendmp->m_flags |= M_FLOWID;
+			sendmp->m_flags |= (M_FLOWID | M_QUEUEID);
 #endif
-			sendmp->m_pkthdr.rxqueue = que->msix;
-			sendmp->m_pkthdr.txqueue = (uint32_t)-1;
+			sendmp->m_pkthdr.queueid = que->msix;
+			sendmp->m_pkthdr.queuetype = QUEUETYPE_RX;
 		}
 next_desc:
 		bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,

Modified: user/syuu/mq_bpf/sys/dev/mxge/if_mxge.c
==============================================================================
--- user/syuu/mq_bpf/sys/dev/mxge/if_mxge.c	Mon Sep  2 19:49:18 2013	(r255154)
+++ user/syuu/mq_bpf/sys/dev/mxge/if_mxge.c	Mon Sep  2 20:35:39 2013	(r255155)
@@ -2277,8 +2277,9 @@ mxge_start_locked(struct mxge_slice_stat
 		if (m == NULL) {
 			return;
 		}
-		m->m_pkthdr.rxqueue = (uint32_t)-1;
-		m->m_pkthdr.txqueue = (ss - sc->ss);
+		m->m_flags |= M_QUEUEID;
+		m->m_pkthdr.queueid = (ss - sc->ss);
+		m->m_pkthdr.queuetype = QUEUETYPE_TX;
 
 		/* let BPF see it */
 		BPF_MTAP(ifp, m);
@@ -2314,8 +2315,9 @@ mxge_transmit_locked(struct mxge_slice_s
 
 	if (!drbr_needs_enqueue(ifp, tx->br) &&
 	    ((tx->mask - (tx->req - tx->done)) > tx->max_desc)) {
-		m->m_pkthdr.rxqueue = (uint32_t)-1;
-		m->m_pkthdr.txqueue = (ss - sc->ss);
+		m->m_flags |= M_QUEUEID;
+		m->m_pkthdr.queueid = (ss - sc->ss);
+		m->m_pkthdr.queuetype = QUEUETYPE_TX;
 
 		/* let BPF see it */
 		BPF_MTAP(ifp, m);
@@ -2729,9 +2731,9 @@ mxge_rx_done_big(struct mxge_slice_state
 	/* flowid only valid if RSS hashing is enabled */
 	if (sc->num_slices > 1) {
 		m->m_pkthdr.flowid = (ss - sc->ss);
-		m->m_flags |= M_FLOWID;
-		m->m_pkthdr.rxqueue = (ss - sc->ss);
-		m->m_pkthdr.txqueue = (uint32_t)-1;
+		m->m_flags |= (M_FLOWID | M_QUEUEID);
+		m->m_pkthdr.queueid = (ss - sc->ss);
+		m->m_pkthdr.queuetype = QUEUETYPE_RX;
 	}
 	/* pass the frame up the stack */
 	(*ifp->if_input)(ifp, m);

Modified: user/syuu/mq_bpf/sys/net/bpf.c
==============================================================================
--- user/syuu/mq_bpf/sys/net/bpf.c	Mon Sep  2 19:49:18 2013	(r255154)
+++ user/syuu/mq_bpf/sys/net/bpf.c	Mon Sep  2 20:35:39 2013	(r255155)
@@ -820,10 +820,7 @@ bpfopen(struct cdev *dev, int flags, int
 	bpf_buffer_ioctl_sblen(d, &size);
 
  	d->bd_qmask.qm_enabled = FALSE;
- 	d->bd_qmask.qm_rxq_mask = NULL;
- 	d->bd_qmask.qm_txq_mask = NULL;
- 	d->bd_qmask.qm_other_mask = FALSE;
- 	rw_init(&d->bd_qmask.qm_lock, "qmask lock");
+	BPFQ_LOCK_INIT(&d->bd_qmask);
 
 	return (0);
 }
@@ -1704,7 +1701,7 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 		error = bpf_ioctl_rotzbuf(td, d, (struct bpf_zbuf *)addr);
 		break;
 
-	case BIOCENAQMASK:
+	case BIOCQMASKENABLE:
 		{
 			struct ifnet *ifp;
 
@@ -1727,21 +1724,15 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 				error = EINVAL;
 				break;
 			}
-			KASSERT(ifp->if_get_num_rxqueue, ("ifp->if_get_num_rxqueue not set\n"));
-			KASSERT(ifp->if_get_num_txqueue, ("ifp->if_get_num_rxqueue not set\n"));
+			BPFQ_ZERO(&d->bd_qmask.qm_rxqmask);
+			BPFQ_ZERO(&d->bd_qmask.qm_txqmask);
+			d->bd_qmask.qm_noqmask = FALSE;
 			d->bd_qmask.qm_enabled = TRUE;
-			d->bd_qmask.qm_rxq_mask =
-				malloc(ifp->if_get_num_rxqueue(ifp) * sizeof(boolean_t), M_BPF, 
-					M_WAITOK | M_ZERO);
-			d->bd_qmask.qm_txq_mask =
-				malloc(ifp->if_get_num_txqueue(ifp) * sizeof(boolean_t), M_BPF, 
-					M_WAITOK | M_ZERO);
-			d->bd_qmask.qm_other_mask = FALSE;
 			BPFQ_WUNLOCK(&d->bd_qmask);
 			break;
 		}
 
-	case BIOCDISQMASK:
+	case BIOCQMASKDISABLE:
 		{
 			if (d->bd_bif == NULL) {
 				/*
@@ -1757,23 +1748,19 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 				break;
 			}
 			d->bd_qmask.qm_enabled = FALSE;
-			
-			free(d->bd_qmask.qm_rxq_mask, M_BPF);
-			free(d->bd_qmask.qm_txq_mask, M_BPF);
 			BPFQ_WUNLOCK(&d->bd_qmask);
 			break;
 		}
 
-	case BIOCSTRXQMASK:
+	case BIOCGRXQMASK:
 		{
-			struct ifnet *ifp;
-			int index;
+			bpf_qmask_bits_t *qmask = (bpf_qmask_bits_t *)addr;
 
 			if (d->bd_bif == NULL) {
 				/*
 				 * No interface attached yet.
 				 */
-				error = EINVAL;	
+				error = EINVAL;
 				break;
 			}
 			BPFQ_WLOCK(&d->bd_qmask);
@@ -1782,28 +1769,21 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 				error = EINVAL;
 				break;
 			}
-			ifp = d->bd_bif->bif_ifp;
-			index = *(uint32_t *)addr;
-			if (index > ifp->if_get_num_rxqueue(ifp)) {
-				BPFQ_WUNLOCK(&d->bd_qmask);
-				error = EINVAL;
-				break;
-			}
-			d->bd_qmask.qm_rxq_mask[index] = TRUE;
+			BPFQ_COPY(&d->bd_qmask.qm_rxqmask, qmask);
 			BPFQ_WUNLOCK(&d->bd_qmask);
 			break;
+
 		}
 
-	case BIOCCRRXQMASK:
+	case BIOCSRXQMASK:
 		{
-			int index;
-			struct ifnet *ifp;
+			bpf_qmask_bits_t *qmask = (bpf_qmask_bits_t *)addr;
 
 			if (d->bd_bif == NULL) {
 				/*
 				 * No interface attached yet.
 				 */
-				error = EINVAL;
+				error = EINVAL;	
 				break;
 			}
 			BPFQ_WLOCK(&d->bd_qmask);
@@ -1812,22 +1792,14 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 				error = EINVAL;
 				break;
 			}
-			ifp = d->bd_bif->bif_ifp;
-			index = *(uint32_t *)addr;
-			if (index > ifp->if_get_num_rxqueue(ifp)) {
-				BPFQ_WUNLOCK(&d->bd_qmask);
-				error = EINVAL;
-				break;
-			}
-			d->bd_qmask.qm_rxq_mask[index] = FALSE;
+			BPFQ_COPY(qmask, &d->bd_qmask.qm_rxqmask);
 			BPFQ_WUNLOCK(&d->bd_qmask);
 			break;
 		}
 
-	case BIOCGTRXQMASK:
+	case BIOCGTXQMASK:
 		{
-			int index;
-			struct ifnet *ifp;
+			bpf_qmask_bits_t *qmask = (bpf_qmask_bits_t *)addr;
 
 			if (d->bd_bif == NULL) {
 				/*
@@ -1842,28 +1814,20 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 				error = EINVAL;
 				break;
 			}
-			ifp = d->bd_bif->bif_ifp;
-			index = *(uint32_t *)addr;
-			if (index > ifp->if_get_num_rxqueue(ifp)) {
-				BPFQ_WUNLOCK(&d->bd_qmask);
-				error = EINVAL;
-				break;
-			}
-			*(uint32_t *)addr = d->bd_qmask.qm_rxq_mask[index];
+			BPFQ_COPY(&d->bd_qmask.qm_txqmask, qmask);
 			BPFQ_WUNLOCK(&d->bd_qmask);
 			break;
 		}
 
-	case BIOCSTTXQMASK:
+	case BIOCSTXQMASK:
 		{
-			struct ifnet *ifp;
-			int index;
+			bpf_qmask_bits_t *qmask = (bpf_qmask_bits_t *)addr;
 
 			if (d->bd_bif == NULL) {
 				/*
 				 * No interface attached yet.
 				 */
-				error = EINVAL;
+				error = EINVAL;	
 				break;
 			}
 			BPFQ_WLOCK(&d->bd_qmask);
@@ -1872,24 +1836,14 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 				error = EINVAL;
 				break;
 			}
-
-			ifp = d->bd_bif->bif_ifp;
-			index = *(uint32_t *)addr;
-			if (index > ifp->if_get_num_txqueue(ifp)) {
-				BPFQ_WUNLOCK(&d->bd_qmask);
-				error = EINVAL;
-				break;
-			}
-			d->bd_qmask.qm_txq_mask[index] = TRUE;
+			BPFQ_COPY(qmask, &d->bd_qmask.qm_txqmask);
 			BPFQ_WUNLOCK(&d->bd_qmask);
 			break;
 		}
 
-	case BIOCCRTXQMASK:
+	case BIOCGNOQMASK:
 		{
-			struct ifnet *ifp;
-			int index;
-
+			boolean_t *noqmask = (boolean_t *)addr;
 			if (d->bd_bif == NULL) {
 				/*
 				 * No interface attached yet.
@@ -1903,29 +1857,20 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 				error = EINVAL;
 				break;
 			}
-
-			ifp = d->bd_bif->bif_ifp;
-			index = *(uint32_t *)addr;
-			if (index > ifp->if_get_num_txqueue(ifp)) {
-				BPFQ_WUNLOCK(&d->bd_qmask);
-				error = EINVAL;
-				break;
-			}
-			d->bd_qmask.qm_txq_mask[index] = FALSE;
+			*noqmask = d->bd_qmask.qm_noqmask;
 			BPFQ_WUNLOCK(&d->bd_qmask);
 			break;
 		}
 
-	case BIOCGTTXQMASK:
+	case BIOCSNOQMASK:
 		{
-			int index;
-			struct ifnet *ifp;
+			boolean_t *noqmask = (boolean_t *)addr;
 
 			if (d->bd_bif == NULL) {
 				/*
 				 * No interface attached yet.
 				 */
-				error = EINVAL;
+				error = EINVAL;	
 				break;
 			}
 			BPFQ_WLOCK(&d->bd_qmask);
@@ -1934,36 +1879,12 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 				error = EINVAL;
 				break;
 			}
-			ifp = d->bd_bif->bif_ifp;
-			index = *(uint32_t *)addr;
-			if (index > ifp->if_get_num_txqueue(ifp)) {
-				BPFQ_WUNLOCK(&d->bd_qmask);
-				error = EINVAL;
-				break;
-			}
-			*(uint32_t *)addr = d->bd_qmask.qm_txq_mask[index];
+			d->bd_qmask.qm_noqmask = *noqmask;
 			BPFQ_WUNLOCK(&d->bd_qmask);
 			break;
 		}
-
-	case BIOCSTOTHERMASK:
-		BPFQ_WLOCK(&d->bd_qmask);
-		d->bd_qmask.qm_other_mask = TRUE;
-		BPFQ_WUNLOCK(&d->bd_qmask);
-		break;
-
-	case BIOCCROTHERMASK:
-		BPFQ_WLOCK(&d->bd_qmask);
-		d->bd_qmask.qm_other_mask = FALSE;
-		BPFQ_WUNLOCK(&d->bd_qmask);
-		break;
-
-	case BIOCGTOTHERMASK:
-		BPFQ_WLOCK(&d->bd_qmask);
-		*(uint32_t *)addr = (uint32_t)d->bd_qmask.qm_other_mask;
-		BPFQ_WUNLOCK(&d->bd_qmask);
-		break;
 	}
+
 	CURVNET_RESTORE();
 	return (error);
 }
@@ -2309,22 +2230,23 @@ bpf_tap(struct bpf_if *bp, u_char *pkt, 
 	BPFIF_RLOCK(bp);
 
 	LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
-		/*
-		 * We are not using any locks for d here because:
-		 * 1) any filter change is protected by interface
-		 * write lock
-		 * 2) destroying/detaching d is protected by interface
-		 * write lock, too
-		 */
  		BPFQ_RLOCK(&d->bd_qmask);
  		if (d->bd_qmask.qm_enabled) {
- 			if (!d->bd_qmask.qm_other_mask) {
+ 			if (!d->bd_qmask.qm_noqmask) {
 				BPFQ_RUNLOCK(&d->bd_qmask);
  				continue;
  			}
  		}
 		BPFQ_RUNLOCK(&d->bd_qmask);
 
+		/*
+		 * We are not using any locks for d here because:
+		 * 1) any filter change is protected by interface
+		 * write lock
+		 * 2) destroying/detaching d is protected by interface
+		 * write lock, too
+		 */
+
 		/* XXX: Do not protect counter for the sake of performance. */
 		++d->bd_rcount;
 		/*
@@ -2394,36 +2316,34 @@ bpf_mtap(struct bpf_if *bp, struct mbuf 
  		BPFQ_RLOCK(&d->bd_qmask);
  		if (d->bd_qmask.qm_enabled) {
  			M_ASSERTPKTHDR(m);
- 			if (!(m->m_flags & M_FLOWID)) {
- 				if (!d->bd_qmask.qm_other_mask) {
- 					BPFQ_RUNLOCK(&d->bd_qmask);
- 					continue;
- 				}
- 			} else {
- 				struct ifnet *ifp = bp->bif_ifp;
- 				if (m->m_pkthdr.rxqueue != (uint32_t)-1) {
- 					if (m->m_pkthdr.rxqueue >= ifp->if_get_num_rxqueue(ifp)) {
- 						BPFQ_RUNLOCK(&d->bd_qmask);
- 						BPFIF_RUNLOCK(bp);
- 						return;
-					}
- 					if (!d->bd_qmask.qm_rxq_mask[m->m_pkthdr.rxqueue]) {
+ 			if (m->m_flags & M_QUEUEID) {
+				switch (m->m_pkthdr.queuetype) {
+				case QUEUETYPE_RX:
+					if (!BPFQ_ISSET(m->m_pkthdr.queueid,
+						 &d->bd_qmask.qm_rxqmask)) {
  						BPFQ_RUNLOCK(&d->bd_qmask);
  						continue;
  					}
- 				}
- 				if (m->m_pkthdr.txqueue != (uint32_t)-1) {
- 					if (m->m_pkthdr.txqueue >= ifp->if_get_num_txqueue(ifp)) {
- 						BPFQ_RUNLOCK(&d->bd_qmask);
- 						BPFIF_RUNLOCK(bp);
- 						return;
- 					}
- 					if (!d->bd_qmask.qm_txq_mask[m->m_pkthdr.txqueue]) {
+					break;
+				case QUEUETYPE_TX:
+					if (!BPFQ_ISSET(m->m_pkthdr.queueid, 
+						&d->bd_qmask.qm_rxqmask)) {
  						BPFQ_RUNLOCK(&d->bd_qmask);
  						continue;
  					}
+					break;
+				default:
+					if (!d->bd_qmask.qm_noqmask) {
+						BPFQ_RUNLOCK(&d->bd_qmask);
+						continue;
+					}
  				}
- 			}
+ 			}else{
+				if (!d->bd_qmask.qm_noqmask) {
+					BPFQ_RUNLOCK(&d->bd_qmask);
+					continue;
+				}
+			}
  		}
  		BPFQ_RUNLOCK(&d->bd_qmask);
  
@@ -2490,42 +2410,40 @@ bpf_mtap2(struct bpf_if *bp, void *data,
 	BPFIF_RLOCK(bp);
 
 	LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
- 		BPFQ_RLOCK(&d->bd_qmask);
+  		BPFQ_RLOCK(&d->bd_qmask);
  		if (d->bd_qmask.qm_enabled) {
  			M_ASSERTPKTHDR(m);
- 			if (!(m->m_flags & M_FLOWID)) {
- 				if (!d->bd_qmask.qm_other_mask) {
- 					BPFQ_RUNLOCK(&d->bd_qmask);
- 					continue;
- 				}
- 			} else {
- 				struct ifnet *ifp = bp->bif_ifp;
- 				if (m->m_pkthdr.rxqueue != (uint32_t)-1) {
- 					if (m->m_pkthdr.rxqueue >= ifp->if_get_num_rxqueue(ifp)) {
- 						BPFQ_RUNLOCK(&d->bd_qmask);
- 						BPFIF_RUNLOCK(bp);
- 						return;
- 					}
- 					if (!d->bd_qmask.qm_rxq_mask[m->m_pkthdr.rxqueue]) {
+ 			if (m->m_flags & M_QUEUEID) {
+				switch (m->m_pkthdr.queuetype) {
+				case QUEUETYPE_RX:
+					if (!BPFQ_ISSET(m->m_pkthdr.queueid,
+						 &d->bd_qmask.qm_rxqmask)) {
  						BPFQ_RUNLOCK(&d->bd_qmask);
  						continue;
  					}
- 				}
- 				if (m->m_pkthdr.txqueue != (uint32_t)-1) {
- 					if (m->m_pkthdr.txqueue >= ifp->if_get_num_txqueue(ifp)) {
- 						BPFQ_RUNLOCK(&d->bd_qmask);
- 						BPFIF_RUNLOCK(bp);
- 						return;
- 					}
- 					if (!d->bd_qmask.qm_txq_mask[m->m_pkthdr.txqueue]) {
+					break;
+				case QUEUETYPE_TX:
+					if (!BPFQ_ISSET(m->m_pkthdr.queueid, 
+						&d->bd_qmask.qm_rxqmask)) {
  						BPFQ_RUNLOCK(&d->bd_qmask);
  						continue;
  					}
+					break;
+				default:
+					if (!d->bd_qmask.qm_noqmask) {
+						BPFQ_RUNLOCK(&d->bd_qmask);
+						continue;
+					}
  				}
- 			}
+ 			}else{
+				if (!d->bd_qmask.qm_noqmask) {
+					BPFQ_RUNLOCK(&d->bd_qmask);
+					continue;
+				}
+			}
  		}
  		BPFQ_RUNLOCK(&d->bd_qmask);
- 
+
 		if (BPF_CHECK_DIRECTION(d, m->m_pkthdr.rcvif, bp->bif_ifp))
 			continue;
 		++d->bd_rcount;
@@ -2790,11 +2708,6 @@ bpf_freed(struct bpf_d *d)
 	if (d->bd_wfilter != NULL)
 		free((caddr_t)d->bd_wfilter, M_BPF);
  
- 	if (d->bd_qmask.qm_enabled) {
- 		free(d->bd_qmask.qm_rxq_mask, M_BPF);
- 		free(d->bd_qmask.qm_txq_mask, M_BPF);
- 	}
- 
 	mtx_destroy(&d->bd_lock);
 }
 

Modified: user/syuu/mq_bpf/sys/net/bpf.h
==============================================================================
--- user/syuu/mq_bpf/sys/net/bpf.h	Mon Sep  2 19:49:18 2013	(r255154)
+++ user/syuu/mq_bpf/sys/net/bpf.h	Mon Sep  2 20:35:39 2013	(r255155)
@@ -147,17 +147,14 @@ struct bpf_zbuf {
 #define	BIOCSETFNR	_IOW('B', 130, struct bpf_program)
 #define	BIOCGTSTAMP	_IOR('B', 131, u_int)
 #define	BIOCSTSTAMP	_IOW('B', 132, u_int)
-#define	BIOCENAQMASK	_IO('B', 133)
-#define	BIOCDISQMASK	_IO('B', 134)
-#define	BIOCSTRXQMASK	_IOWR('B', 135, uint32_t)
-#define	BIOCCRRXQMASK	_IOWR('B', 136, uint32_t)
-#define	BIOCGTRXQMASK	_IOR('B', 137, uint32_t)
-#define	BIOCSTTXQMASK	_IOWR('B', 138, uint32_t)
-#define	BIOCCRTXQMASK	_IOWR('B', 139, uint32_t)
-#define	BIOCGTTXQMASK	_IOR('B', 140, uint32_t)
-#define	BIOCSTOTHERMASK	_IO('B', 141)
-#define	BIOCCROTHERMASK	_IO('B', 142)
-#define	BIOCGTOTHERMASK	_IOR('B', 143, uint32_t)
+#define	BIOCQMASKENABLE	_IO('B', 133)
+#define	BIOCQMASKDISABLE _IO('B', 134)
+#define	BIOCGRXQMASK	_IOR('B', 135, bpf_qmask_bits_t)
+#define	BIOCSRXQMASK	_IOW('B', 135, bpf_qmask_bits_t)
+#define	BIOCGTXQMASK	_IOR('B', 136, bpf_qmask_bits_t)
+#define	BIOCSTXQMASK	_IOW('B', 137, bpf_qmask_bits_t)
+#define	BIOCGNOQMASK	_IOR('B', 138, boolean_t)
+#define	BIOCSNOQMASK	_IOW('B', 139, boolean_t)
 
 /* Obsolete */
 #define	BIOCGSEESENT	BIOCGDIRECTION

Modified: user/syuu/mq_bpf/sys/net/bpfdesc.h
==============================================================================
--- user/syuu/mq_bpf/sys/net/bpfdesc.h	Mon Sep  2 19:49:18 2013	(r255154)
+++ user/syuu/mq_bpf/sys/net/bpfdesc.h	Mon Sep  2 20:35:39 2013	(r255155)
@@ -43,21 +43,28 @@
 #include <sys/selinfo.h>
 #include <sys/queue.h>
 #include <sys/conf.h>
+#include <sys/cpuset.h>
 #include <net/if.h>
 
+typedef cpuset_t bpf_qmask_bits_t;
+
 struct bpf_qmask {
 	boolean_t	qm_enabled;
-	boolean_t *	qm_rxq_mask;
-	boolean_t *	qm_txq_mask;
-	boolean_t	qm_other_mask;
+	bpf_qmask_bits_t qm_rxqmask;
+	bpf_qmask_bits_t qm_txqmask;
+	boolean_t	qm_noqmask;
 	struct rwlock	qm_lock;
 };
 
-#define BPFQ_LOCK_DESTROY(qm)		rw_destroy(&(qm)->qm_lock)
-#define BPFQ_RLOCK(qm)			rw_rlock(&(qm)->qm_lock)
-#define BPFQ_RUNLOCK(qm)		rw_runlock(&(qm)->qm_lock)
-#define BPFQ_WLOCK(qm)			rw_wlock(&(qm)->qm_lock)
-#define BPFQ_WUNLOCK(qm)		rw_wunlock(&(qm)->qm_lock)
+#define BPFQ_LOCK_INIT(qm)	rw_init(&(qm)->qm_lock, "qmask lock")
+#define BPFQ_LOCK_DESTROY(qm)	rw_destroy(&(qm)->qm_lock)
+#define BPFQ_RLOCK(qm)		rw_rlock(&(qm)->qm_lock)
+#define BPFQ_RUNLOCK(qm)	rw_runlock(&(qm)->qm_lock)
+#define BPFQ_WLOCK(qm)		rw_wlock(&(qm)->qm_lock)
+#define BPFQ_WUNLOCK(qm)	rw_wunlock(&(qm)->qm_lock)
+#define BPFQ_ZERO		CPU_ZERO
+#define BPFQ_COPY		CPU_COPY
+#define BPFQ_ISSET		CPU_ISSET
 
 /*
  * Descriptor associated with each open bpf file.

Modified: user/syuu/mq_bpf/sys/sys/mbuf.h
==============================================================================
--- user/syuu/mq_bpf/sys/sys/mbuf.h	Mon Sep  2 19:49:18 2013	(r255154)
+++ user/syuu/mq_bpf/sys/sys/mbuf.h	Mon Sep  2 20:35:39 2013	(r255155)
@@ -110,6 +110,11 @@ struct m_tag {
 	void			(*m_tag_free)(struct m_tag *);
 };
 
+enum queuetype {
+	QUEUETYPE_RX,
+	QUEUETYPE_TX
+};
+
 /*
  * Record/packet header in first mbuf of chain; valid only if M_PKTHDR is set.
  */
@@ -121,8 +126,8 @@ struct pkthdr {
 	uint32_t	 flowid;	/* packet's 4-tuple system
 					 * flow identifier
 					 */
-	uint32_t	rxqueue;
-	uint32_t	txqueue;
+	u_int		 queueid;	/* hw queue id */
+	int		 queuetype;	/* hw queue type */
 	/* variables for hardware checksum */
 	int		 csum_flags;	/* flags regarding checksum */
 	int		 csum_data;	/* data field used by csum routines */
@@ -207,6 +212,7 @@ struct mbuf {
 #define	M_PROTO7	0x00100000 /* protocol-specific */
 #define	M_PROTO8	0x00200000 /* protocol-specific */
 #define	M_FLOWID	0x00400000 /* deprecated: flowid is valid */
+#define	M_QUEUEID	0x00800000 /* packet has hw queue id */
 #define	M_HASHTYPEBITS	0x0F000000 /* mask of bits holding flowid hash type */
 
 #define	M_NOTIFICATION	M_PROTO5    /* SCTP notification */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309022035.r82KZekn024743>