Thursday, May 10, 2018 5:22 PM, Ophir Munk: @mellanox.com>; Shahaf > Shuler <shah...@mellanox.com> > Subject: [PATCH v3 1/2] net/mlx4: advertise supported RSS hash functions > > Advertise mlx4 supported RSS functions as part of dev_infos_get callback. > Previous to this commit RSS support was reported as none. Since the > introduction of [1] it is required that all RSS configurations will be > verified. > > [1] commit 8863a1fbfc66 ("ethdev: add supported hash function check") > > Signed-off-by: Ophir Munk <ophi...@mellanox.com> > --- > v1: > Initial release > v2: > Update based on reviews (split into 2 commits) > v3: > More updates based on reviews > > drivers/net/mlx4/mlx4_ethdev.c | 12 ++++++----- > drivers/net/mlx4/mlx4_flow.c | 45 > ++++++++++++++++++++++++++++++++++++++++++ > drivers/net/mlx4/mlx4_flow.h | 35 > ++++++++++++++++++++++++++++++++ > 3 files changed, 87 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/mlx4/mlx4_ethdev.c > b/drivers/net/mlx4/mlx4_ethdev.c index 9a76670..ef559a3 100644 > --- a/drivers/net/mlx4/mlx4_ethdev.c > +++ b/drivers/net/mlx4/mlx4_ethdev.c > @@ -582,11 +582,13 @@ mlx4_dev_infos_get(struct rte_eth_dev *dev, > struct rte_eth_dev_info *info) > info->if_index = if_nametoindex(ifname); > info->hash_key_size = MLX4_RSS_HASH_KEY_SIZE; > info->speed_capa = > - ETH_LINK_SPEED_1G | > - ETH_LINK_SPEED_10G | > - ETH_LINK_SPEED_20G | > - ETH_LINK_SPEED_40G | > - ETH_LINK_SPEED_56G; > + ETH_LINK_SPEED_1G | > + ETH_LINK_SPEED_10G | > + ETH_LINK_SPEED_20G | > + ETH_LINK_SPEED_40G | > + ETH_LINK_SPEED_56G; > + info->flow_type_rss_offloads = > + mlx4_ibv_to_rss_types(priv->hw_rss_sup); > } > > /** > diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c > index 397a150..baad299 100644 > --- a/drivers/net/mlx4/mlx4_flow.c > +++ b/drivers/net/mlx4/mlx4_flow.c > @@ -134,6 +134,51 @@ mlx4_conv_rss_types(struct priv *priv, uint64_t > types) } > > /** > + * Convert verbs RSS types to their DPDK equivalents. > + * > + * This function returns a group of RSS dpdk types given their
dpdk -> DPDK > +equivalent group > + * of verbs types. > + * For example both source IPv4 and destination IPv4 verbs types are > +converted > + * into their equivalent RSS group types. If each of these verbs types > +existed > + * exclusively - no conversion would take place. > + * > + * @param types > + * RSS hash types in verbs format. > + * > + * @return > + * DPDK RSS hash fields supported by mlx4. > + */ > +uint64_t > +mlx4_ibv_to_rss_types(uint64_t types) > +{ > + enum { IPV4, IPV6, IPV4_TCP, IPV6_TCP, IPV4_UDP, IPV6_UDP}; > + > + const uint64_t in[] = { > + [IPV4] = IPV4_IBV_HF, > + [IPV6] = IPV6_IBV_HF, > + [IPV4_TCP] = IPV4_IBV_HF | TCP_IBV_HF, > + [IPV6_TCP] = IPV6_IBV_HF | TCP_IBV_HF, > + [IPV4_UDP] = IPV4_IBV_HF | UDP_IBV_HF, > + [IPV6_UDP] = IPV6_IBV_HF | UDP_IBV_HF, > + }; > + const uint64_t out[RTE_DIM(in)] = { > + [IPV4] = IPV4_RSS_HF, > + [IPV6] = IPV6_RSS_HF, > + [IPV4_TCP] = IPV4_RSS_HF | IPV4_TCP_RSS_HF, > + [IPV6_TCP] = IPV6_RSS_HF | IPV6_TCP_RSS_HF, > + [IPV4_UDP] = IPV4_RSS_HF | IPV4_UDP_RSS_HF, > + [IPV6_UDP] = IPV6_RSS_HF | IPV6_UDP_RSS_HF, > + }; > + uint64_t conv = 0; > + unsigned int i; > + > + for (i = 0; i != RTE_DIM(in); ++i) > + if ((types & in[i]) == in[i]) > + conv |= out[i]; > + return conv; > +} > + > +/** > * Merge Ethernet pattern item into flow rule handle. > * > * Additional mlx4-specific constraints on supported fields: > diff --git a/drivers/net/mlx4/mlx4_flow.h b/drivers/net/mlx4/mlx4_flow.h > index 2c8dff3..e47982c 100644 > --- a/drivers/net/mlx4/mlx4_flow.h > +++ b/drivers/net/mlx4/mlx4_flow.h > @@ -30,6 +30,40 @@ > /** Meta pattern item used to distinguish internal rules. */ #define > MLX4_FLOW_ITEM_TYPE_INTERNAL ((enum rte_flow_item_type)-1) > Any specific reason below MACRO are part of the .h file and not the .c file? Also all mlx4 related macros should be prefixed with MLX4_ > +/** IBV supported RSS hash functions combinations */ #define > +IPV4_IBV_HF ( \ > + IBV_RX_HASH_SRC_IPV4 | \ > + IBV_RX_HASH_DST_IPV4) > +#define IPV6_IBV_HF ( \ > + IBV_RX_HASH_SRC_IPV6 | \ > + IBV_RX_HASH_DST_IPV6) > +#define TCP_IBV_HF ( \ > + IBV_RX_HASH_SRC_PORT_TCP | \ > + IBV_RX_HASH_DST_PORT_TCP) > +#define UDP_IBV_HF (IBV_RX_HASH_SRC_PORT_UDP | \ > + IBV_RX_HASH_DST_PORT_UDP) > + > +/** Supported RSS hash functions combinations */ #define IPV4_RSS_HF ( > +\ > + ETH_RSS_IPV4 | \ > + ETH_RSS_FRAG_IPV4 | \ > + ETH_RSS_NONFRAG_IPV4_OTHER) > +#define IPV6_RSS_HF ( \ > + ETH_RSS_IPV6 | \ > + ETH_RSS_FRAG_IPV6 | \ > + ETH_RSS_NONFRAG_IPV6_OTHER | \ > + ETH_RSS_IPV6_EX) > +#define IPV4_TCP_RSS_HF ( \ > + ETH_RSS_NONFRAG_IPV4_TCP) > +#define IPV6_TCP_RSS_HF ( \ > + ETH_RSS_NONFRAG_IPV6_TCP | \ > + ETH_RSS_IPV6_TCP_EX) > +#define IPV4_UDP_RSS_HF ( \ > + ETH_RSS_NONFRAG_IPV4_UDP) > +#define IPV6_UDP_RSS_HF ( \ > + ETH_RSS_NONFRAG_IPV6_UDP | \ > + ETH_RSS_IPV6_UDP_EX) > + > /** PMD-specific (mlx4) definition of a flow rule handle. */ struct > rte_flow { > LIST_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. > */ @@ -49,6 +83,7 @@ struct rte_flow { > /* mlx4_flow.c */ > > uint64_t mlx4_conv_rss_types(struct priv *priv, uint64_t rss_hf); > +uint64_t mlx4_ibv_to_rss_types(uint64_t ibv_rss_types); > int mlx4_flow_sync(struct priv *priv, struct rte_flow_error *error); void > mlx4_flow_clean(struct priv *priv); int mlx4_filter_ctrl(struct rte_eth_dev > *dev, > -- > 2.7.4