diff options
author | sephe <sephe@FreeBSD.org> | 2016-02-29 09:05:33 +0000 |
---|---|---|
committer | sephe <sephe@FreeBSD.org> | 2016-02-29 09:05:33 +0000 |
commit | e6e9e0871bcff3f6ba412aa099d12b4864107af4 (patch) | |
tree | c1224a105a4632142cb29b24dc371b88faf6d5bd | |
parent | 0e171a3e623b6d778425812b88db601747d77bf6 (diff) | |
download | FreeBSD-src-e6e9e0871bcff3f6ba412aa099d12b4864107af4.zip FreeBSD-src-e6e9e0871bcff3f6ba412aa099d12b4864107af4.tar.gz |
hyperv/hn: Utilize mbuf flowid
MFC after: 1 week
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D5488
-rw-r--r-- | sys/dev/hyperv/netvsc/hv_net_vsc.h | 3 | ||||
-rw-r--r-- | sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c | 14 |
2 files changed, 13 insertions, 4 deletions
diff --git a/sys/dev/hyperv/netvsc/hv_net_vsc.h b/sys/dev/hyperv/netvsc/hv_net_vsc.h index 641f0cf..8a16770 100644 --- a/sys/dev/hyperv/netvsc/hv_net_vsc.h +++ b/sys/dev/hyperv/netvsc/hv_net_vsc.h @@ -1000,10 +1000,11 @@ struct buf_ring; struct hn_rx_ring { struct ifnet *hn_ifp; - struct lro_ctrl hn_lro; + int hn_rx_idx; /* Trust csum verification on host side */ int hn_trust_hcsum; /* HN_TRUST_HCSUM_ */ + struct lro_ctrl hn_lro; u_long hn_csum_ip; u_long hn_csum_tcp; diff --git a/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c b/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c index 96cb96a..1b04966 100644 --- a/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c +++ b/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c @@ -1287,6 +1287,9 @@ skip: m_new->m_flags |= M_VLANTAG; } + m_new->m_pkthdr.flowid = rxr->hn_rx_idx; + M_HASHTYPE_SET(m_new, M_HASHTYPE_OPAQUE); + /* * Note: Moved RX completion back to hv_nv_on_receive() so all * messages (not just data messages) will trigger a response. @@ -2037,6 +2040,7 @@ hn_create_rx_data(struct hn_softc *sc) if (hn_trust_hostip) rxr->hn_trust_hcsum |= HN_TRUST_HCSUM_IP; rxr->hn_ifp = sc->hn_ifp; + rxr->hn_rx_idx = i; /* * Initialize LRO. @@ -2567,10 +2571,14 @@ hn_transmit(struct ifnet *ifp, struct mbuf *m) { struct hn_softc *sc = ifp->if_softc; struct hn_tx_ring *txr; - int error; + int error, idx = 0; - /* TODO: vRSS, TX ring selection */ - txr = &sc->hn_tx_ring[0]; + /* + * Select the TX ring based on flowid + */ + if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) + idx = m->m_pkthdr.flowid % sc->hn_tx_ring_cnt; + txr = &sc->hn_tx_ring[idx]; error = drbr_enqueue(ifp, txr->hn_mbuf_br, m); if (error) |