Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F145433518
D8676.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D8676.diff
View Options
Index: head/sys/dev/hyperv/netvsc/if_hn.c
===================================================================
--- head/sys/dev/hyperv/netvsc/if_hn.c
+++ head/sys/dev/hyperv/netvsc/if_hn.c
@@ -55,9 +55,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_hn.h"
#include "opt_inet6.h"
#include "opt_inet.h"
-#include "opt_hn.h"
+#include "opt_rss.h"
#include <sys/param.h>
#include <sys/bus.h>
@@ -87,6 +88,9 @@
#include <net/if_types.h>
#include <net/if_var.h>
#include <net/rndis.h>
+#ifdef RSS
+#include <net/rss_config.h>
+#endif
#include <netinet/in_systm.h>
#include <netinet/in.h>
@@ -170,7 +174,11 @@
#define HN_PKTSIZE(m, align) \
roundup2((m)->m_pkthdr.len + HN_RNDIS_PKT_LEN, (align))
+#ifdef RSS
+#define HN_RING_IDX2CPU(sc, idx) rss_getcpu((idx) % rss_getnumbuckets())
+#else
#define HN_RING_IDX2CPU(sc, idx) (((sc)->hn_cpu + (idx)) % mp_ncpus)
+#endif
struct hn_txdesc {
#ifndef HN_USE_TXDESC_BUFRING
@@ -276,8 +284,10 @@
static int hn_caps_sysctl(SYSCTL_HANDLER_ARGS);
static int hn_hwassist_sysctl(SYSCTL_HANDLER_ARGS);
static int hn_rxfilter_sysctl(SYSCTL_HANDLER_ARGS);
+#ifndef RSS
static int hn_rss_key_sysctl(SYSCTL_HANDLER_ARGS);
static int hn_rss_ind_sysctl(SYSCTL_HANDLER_ARGS);
+#endif
static int hn_rss_hash_sysctl(SYSCTL_HANDLER_ARGS);
static int hn_txagg_size_sysctl(SYSCTL_HANDLER_ARGS);
static int hn_txagg_pkts_sysctl(SYSCTL_HANDLER_ARGS);
@@ -321,7 +331,9 @@
static void hn_destroy_rx_data(struct hn_softc *);
static int hn_check_iplen(const struct mbuf *, int);
static int hn_set_rxfilter(struct hn_softc *);
+#ifndef RSS
static int hn_rss_reconfig(struct hn_softc *);
+#endif
static void hn_rss_ind_fixup(struct hn_softc *);
static int hn_rxpkt(struct hn_rx_ring *, const void *,
int, const struct hn_rxinfo *);
@@ -478,6 +490,7 @@
static u_int hn_cpu_index; /* next CPU for channel */
static struct taskqueue **hn_tx_taskque;/* shared TX taskqueues */
+#ifndef RSS
static const uint8_t
hn_rss_key_default[NDIS_HASH_KEYSIZE_TOEPLITZ] = {
0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
@@ -486,6 +499,7 @@
0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
};
+#endif /* !RSS */
static device_method_t hn_methods[] = {
/* Device interface */
@@ -783,6 +797,7 @@
return hn_tx_swq_depth;
}
+#ifndef RSS
static int
hn_rss_reconfig(struct hn_softc *sc)
{
@@ -821,6 +836,7 @@
}
return (0);
}
+#endif /* !RSS */
static void
hn_rss_ind_fixup(struct hn_softc *sc)
@@ -969,6 +985,10 @@
} else if (ring_cnt > mp_ncpus) {
ring_cnt = mp_ncpus;
}
+#ifdef RSS
+ if (ring_cnt > rss_getnumbuckets())
+ ring_cnt = rss_getnumbuckets();
+#endif
tx_ring_cnt = hn_tx_ring_cnt;
if (tx_ring_cnt <= 0 || tx_ring_cnt > ring_cnt)
@@ -1068,12 +1088,17 @@
hn_rss_hash_sysctl, "A", "RSS hash");
SYSCTL_ADD_INT(ctx, child, OID_AUTO, "rss_ind_size",
CTLFLAG_RD, &sc->hn_rss_ind_size, 0, "RSS indirect entry count");
+#ifndef RSS
+ /*
+ * Don't allow RSS key/indirect table changes, if RSS is defined.
+ */
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rss_key",
CTLTYPE_OPAQUE | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
hn_rss_key_sysctl, "IU", "RSS key");
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rss_ind",
CTLTYPE_OPAQUE | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
hn_rss_ind_sysctl, "IU", "RSS indirect table");
+#endif
SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "rndis_agg_size",
CTLFLAG_RD, &sc->hn_rndis_agg_size, 0,
"RNDIS offered packet transmission aggregation size limit");
@@ -2905,6 +2930,8 @@
return sysctl_handle_string(oidp, filter_str, sizeof(filter_str), req);
}
+#ifndef RSS
+
static int
hn_rss_key_sysctl(SYSCTL_HANDLER_ARGS)
{
@@ -2966,6 +2993,8 @@
return (error);
}
+#endif /* !RSS */
+
static int
hn_rss_hash_sysctl(SYSCTL_HANDLER_ARGS)
{
@@ -4085,8 +4114,17 @@
/*
* Select the TX ring based on flowid
*/
- if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE)
- idx = m->m_pkthdr.flowid % sc->hn_tx_ring_inuse;
+ if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
+#ifdef RSS
+ uint32_t bid;
+
+ if (rss_hash2bucket(m->m_pkthdr.flowid, M_HASHTYPE_GET(m),
+ &bid) == 0)
+ idx = bid % sc->hn_tx_ring_inuse;
+ else
+#endif
+ idx = m->m_pkthdr.flowid % sc->hn_tx_ring_inuse;
+ }
txr = &sc->hn_tx_ring[idx];
error = drbr_enqueue(ifp, txr->hn_mbuf_br, m);
@@ -4542,7 +4580,11 @@
*/
if (bootverbose)
if_printf(sc->hn_ifp, "setup default RSS key\n");
+#ifdef RSS
+ rss_getkey(rss->rss_key);
+#else
memcpy(rss->rss_key, hn_rss_key_default, sizeof(rss->rss_key));
+#endif
sc->hn_flags |= HN_FLAG_HAS_RSSKEY;
}
@@ -4555,8 +4597,16 @@
if_printf(sc->hn_ifp, "setup default RSS indirect "
"table\n");
}
- for (i = 0; i < NDIS_HASH_INDCNT; ++i)
- rss->rss_ind[i] = i % nchan;
+ for (i = 0; i < NDIS_HASH_INDCNT; ++i) {
+ uint32_t subidx;
+
+#ifdef RSS
+ subidx = rss_get_indirection_to_bucket(i);
+#else
+ subidx = i;
+#endif
+ rss->rss_ind[i] = subidx % nchan;
+ }
sc->hn_flags |= HN_FLAG_HAS_RSSIND;
} else {
/*
@@ -4633,6 +4683,14 @@
sc->hn_tx_ring_inuse = sc->hn_tx_ring_cnt;
sc->hn_rx_ring_inuse = ring_cnt;
+#ifdef RSS
+ if (sc->hn_rx_ring_inuse != rss_getnumbuckets()) {
+ if_printf(sc->hn_ifp, "# of RX rings (%d) does not match "
+ "# of RSS buckets (%d)\n", sc->hn_rx_ring_inuse,
+ rss_getnumbuckets());
+ }
+#endif
+
if (bootverbose) {
if_printf(sc->hn_ifp, "%d TX ring, %d RX ring\n",
sc->hn_tx_ring_inuse, sc->hn_rx_ring_inuse);
Index: head/sys/modules/hyperv/netvsc/Makefile
===================================================================
--- head/sys/modules/hyperv/netvsc/Makefile
+++ head/sys/modules/hyperv/netvsc/Makefile
@@ -5,7 +5,8 @@
KMOD= hv_netvsc
SRCS= hn_nvs.c hn_rndis.c if_hn.c
-SRCS+= bus_if.h device_if.h opt_inet.h opt_inet6.h vmbus_if.h opt_hn.h
+SRCS+= bus_if.h device_if.h vmbus_if.h
+SRCS+= opt_hn.h opt_inet.h opt_inet6.h opt_rss.h
CFLAGS+= -I${.CURDIR}/../../../dev/hyperv/netvsc
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Feb 20, 7:50 PM (11 m, 6 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28903061
Default Alt Text
D8676.diff (5 KB)
Attached To
Mode
D8676: hyperv/hn: Add 'options RSS' support.
Attached
Detach File
Event Timeline
Log In to Comment