summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsephe <sephe@FreeBSD.org>2016-02-29 09:05:33 +0000
committersephe <sephe@FreeBSD.org>2016-02-29 09:05:33 +0000
commite6e9e0871bcff3f6ba412aa099d12b4864107af4 (patch)
treec1224a105a4632142cb29b24dc371b88faf6d5bd
parent0e171a3e623b6d778425812b88db601747d77bf6 (diff)
downloadFreeBSD-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.h3
-rw-r--r--sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c14
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)
OpenPOWER on IntegriCloud