From owner-svn-src-user@FreeBSD.ORG Mon Sep 2 20:35:41 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id C6CF37C; Mon, 2 Sep 2013 20:35:41 +0000 (UTC) (envelope-from syuu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id A3ADB2164; Mon, 2 Sep 2013 20:35:41 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r82KZfml024751; Mon, 2 Sep 2013 20:35:41 GMT (envelope-from syuu@svn.freebsd.org) Received: (from syuu@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r82KZekn024743; Mon, 2 Sep 2013 20:35:40 GMT (envelope-from syuu@svn.freebsd.org) Message-Id: <201309022035.r82KZekn024743@svn.freebsd.org> From: Takuya ASADA Date: Mon, 2 Sep 2013 20:35:40 +0000 (UTC) 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 X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Sep 2013 20:35:41 -0000 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 #include #include +#include #include +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 */