aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2018-08-16 13:24:30 +0200
committerDave Barach <openvpp@barachs.net>2018-08-16 13:55:17 +0000
commit9daf8fb6b36f6e23951d6fe479248c092617c402 (patch)
tree5b5ff2ac53919ef4f0c0b2fdc689f8208e15eb28
parent4657c27b8874b51cf90645ed71150d9400d65832 (diff)
dpdk: fix rss hash function handling
DPDK 18.08 verifies if all set bits are supported and fails if not.... Change-Id: Ia87242fcda11147dff3bebe2e2bef32f0a8891fb Signed-off-by: Damjan Marion <damarion@cisco.com>
-rw-r--r--src/plugins/dpdk/device/dpdk.h1
-rw-r--r--src/plugins/dpdk/device/format.c16
-rw-r--r--src/plugins/dpdk/device/init.c12
3 files changed, 23 insertions, 6 deletions
diff --git a/src/plugins/dpdk/device/dpdk.h b/src/plugins/dpdk/device/dpdk.h
index c39f1f950c6..f75cd99e5d3 100644
--- a/src/plugins/dpdk/device/dpdk.h
+++ b/src/plugins/dpdk/device/dpdk.h
@@ -515,6 +515,7 @@ format_function_t format_dpdk_rx_trace;
format_function_t format_dpdk_rte_mbuf;
format_function_t format_dpdk_rx_rte_mbuf;
format_function_t format_dpdk_flow;
+format_function_t format_dpdk_rss_hf_name;
unformat_function_t unformat_dpdk_log_level;
vnet_flow_dev_ops_function_t dpdk_flow_ops_fn;
diff --git a/src/plugins/dpdk/device/format.c b/src/plugins/dpdk/device/format.c
index 2c9a7d30513..be828932c80 100644
--- a/src/plugins/dpdk/device/format.c
+++ b/src/plugins/dpdk/device/format.c
@@ -45,22 +45,28 @@
_ (rx_errors, q_errors)
#define foreach_dpdk_rss_hf \
+ _(ETH_RSS_IPV4, "ipv4") \
_(ETH_RSS_FRAG_IPV4, "ipv4-frag") \
_(ETH_RSS_NONFRAG_IPV4_TCP, "ipv4-tcp") \
_(ETH_RSS_NONFRAG_IPV4_UDP, "ipv4-udp") \
_(ETH_RSS_NONFRAG_IPV4_SCTP, "ipv4-sctp") \
_(ETH_RSS_NONFRAG_IPV4_OTHER, "ipv4-other") \
- _(ETH_RSS_IPV4, "ipv4") \
- _(ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex") \
- _(ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex") \
+ _(ETH_RSS_IPV6, "ipv6") \
_(ETH_RSS_FRAG_IPV6, "ipv6-frag") \
_(ETH_RSS_NONFRAG_IPV6_TCP, "ipv6-tcp") \
_(ETH_RSS_NONFRAG_IPV6_UDP, "ipv6-udp") \
_(ETH_RSS_NONFRAG_IPV6_SCTP, "ipv6-sctp") \
_(ETH_RSS_NONFRAG_IPV6_OTHER, "ipv6-other") \
+ _(ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex") \
+ _(ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex") \
_(ETH_RSS_L2_PAYLOAD, "l2-payload") \
_(ETH_RSS_IPV6_EX, "ipv6-ex") \
- _(ETH_RSS_IPV6, "ipv6")
+ _(ETH_RSS_IPV6_TCP_EX, "ipv6-tcp-ex") \
+ _(ETH_RSS_IPV6_UDP_EX, "ipv6-udp-ex") \
+ _(ETH_RSS_PORT, "port") \
+ _(ETH_RSS_VXLAN, "vxlan") \
+ _(ETH_RSS_GENEVE, "geneve") \
+ _(ETH_RSS_NVGRE, "nvgre")
#define foreach_dpdk_rx_offload_caps \
@@ -426,7 +432,7 @@ if (bitmap & v) { \
s = format(s, "%s ", str); \
}
-static u8 *
+u8 *
format_dpdk_rss_hf_name (u8 * s, va_list * args)
{
u64 bitmap = va_arg (*args, u64);
diff --git a/src/plugins/dpdk/device/init.c b/src/plugins/dpdk/device/init.c
index 5dd15ab3c98..9b14c1a9d4f 100644
--- a/src/plugins/dpdk/device/init.c
+++ b/src/plugins/dpdk/device/init.c
@@ -387,7 +387,17 @@ dpdk_lib_init (dpdk_main_t * dm)
xd->port_conf.rx_adv_conf.rss_conf.rss_hf =
ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP;
else
- xd->port_conf.rx_adv_conf.rss_conf.rss_hf = devconf->rss_fn;
+ {
+ u64 unsupported_bits;
+ xd->port_conf.rx_adv_conf.rss_conf.rss_hf = devconf->rss_fn;
+ unsupported_bits = xd->port_conf.rx_adv_conf.rss_conf.rss_hf;
+ unsupported_bits &= ~dev_info.flow_type_rss_offloads;
+ if (unsupported_bits)
+ dpdk_log_warn ("Unsupported RSS hash functions: %U",
+ format_dpdk_rss_hf_name, unsupported_bits);
+ }
+ xd->port_conf.rx_adv_conf.rss_conf.rss_hf &=
+ dev_info.flow_type_rss_offloads;
}
else
xd->rx_q_used = 1;