[Intel-wired-lan] [PATCH net-next v3 4/6] iavf: Support for modifying TCP RSS flow hashing

Jankowski, Konrad0 konrad0.jankowski at intel.com
Wed Apr 21 19:22:53 UTC 2021



> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces at osuosl.org> On Behalf Of
> Haiyue Wang
> Sent: wtorek, 13 kwietnia 2021 02:49
> To: intel-wired-lan at lists.osuosl.org
> Cc: Zhang, Qi Z <qi.z.zhang at intel.com>
> Subject: [Intel-wired-lan] [PATCH net-next v3 4/6] iavf: Support for
> modifying TCP RSS flow hashing
> 
> Provides the ability to enable TCP RSS hashing by ethtool.
> 
> It gives users option of generating RSS hash based on the TCP source and
> destination ports numbers, IPv4 or IPv6 source and destination addresses.
> 
> Signed-off-by: Haiyue Wang <haiyue.wang at intel.com>
> ---
>  drivers/net/ethernet/intel/iavf/Makefile      |   1 +
>  .../net/ethernet/intel/iavf/iavf_adv_rss.c    | 170 ++++++++++++++
>  .../net/ethernet/intel/iavf/iavf_adv_rss.h    |  54 +++++
>  .../net/ethernet/intel/iavf/iavf_ethtool.c    | 214 +++++++++++++++++-
>  .../net/ethernet/intel/iavf/iavf_virtchnl.c   |  15 +-
>  5 files changed, 450 insertions(+), 4 deletions(-)  create mode 100644
> drivers/net/ethernet/intel/iavf/iavf_adv_rss.c
> 
> diff --git a/drivers/net/ethernet/intel/iavf/Makefile
> b/drivers/net/ethernet/intel/iavf/Makefile
> index 121e194ee734..9c3e45c54d01 100644
> --- a/drivers/net/ethernet/intel/iavf/Makefile
> +++ b/drivers/net/ethernet/intel/iavf/Makefile
> @@ -12,4 +12,5 @@ subdir-ccflags-y += -I$(src)
>  obj-$(CONFIG_IAVF) += iavf.o
> 
>  iavf-objs := iavf_main.o iavf_ethtool.o iavf_virtchnl.o iavf_fdir.o \
> +	     iavf_adv_rss.o \
>  	     iavf_txrx.o iavf_common.o iavf_adminq.o iavf_client.o diff --git
> a/drivers/net/ethernet/intel/iavf/iavf_adv_rss.c
> b/drivers/net/ethernet/intel/iavf/iavf_adv_rss.c
> new file mode 100644
> index 000000000000..4c5771cdc445
> --- /dev/null
> +++ b/drivers/net/ethernet/intel/iavf/iavf_adv_rss.c
> @@ -0,0 +1,170 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright (c) 2021, Intel Corporation. */
> +
> +/* advanced RSS configuration ethtool support for iavf */
> +
> +#include "iavf.h"
> +
> +/**
> + * iavf_fill_adv_rss_ip4_hdr - fill the IPv4 RSS protocol header
> + * @hdr: the virtchnl message protocol header data structure
> + * @hash_flds: the RSS configuration protocol hash fields  */ static
> +void iavf_fill_adv_rss_ip4_hdr(struct virtchnl_proto_hdr *hdr, u64
> +hash_flds) {
> +	VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, IPV4);
> +
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_IPV4_SA)
> +		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, SRC);
> +
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_IPV4_DA)
> +		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV4, DST); }
> +
> +/**
> + * iavf_fill_adv_rss_ip6_hdr - fill the IPv6 RSS protocol header
> + * @hdr: the virtchnl message protocol header data structure
> + * @hash_flds: the RSS configuration protocol hash fields  */ static
> +void iavf_fill_adv_rss_ip6_hdr(struct virtchnl_proto_hdr *hdr, u64
> +hash_flds) {
> +	VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, IPV6);
> +
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_IPV6_SA)
> +		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, SRC);
> +
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_IPV6_DA)
> +		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, IPV6, DST); }
> +
> +/**
> + * iavf_fill_adv_rss_tcp_hdr - fill the TCP RSS protocol header
> + * @hdr: the virtchnl message protocol header data structure
> + * @hash_flds: the RSS configuration protocol hash fields  */ static
> +void iavf_fill_adv_rss_tcp_hdr(struct virtchnl_proto_hdr *hdr, u64
> +hash_flds) {
> +	VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, TCP);
> +
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT)
> +		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, TCP,
> SRC_PORT);
> +
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT)
> +		VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, TCP,
> DST_PORT); }
> +
> +/**
> + * iavf_fill_adv_rss_cfg_msg - fill the RSS configuration into virtchnl
> +message
> + * @rss_cfg: the virtchnl message to be filled with RSS configuration
> +setting
> + * @packet_hdrs: the RSS configuration protocol header types
> + * @hash_flds: the RSS configuration protocol hash fields
> + *
> + * Returns 0 if the RSS configuration virtchnl message is filled
> +successfully  */ int iavf_fill_adv_rss_cfg_msg(struct virtchnl_rss_cfg
> +*rss_cfg,
> +			  u32 packet_hdrs, u64 hash_flds)
> +{
> +	struct virtchnl_proto_hdrs *proto_hdrs = &rss_cfg->proto_hdrs;
> +	struct virtchnl_proto_hdr *hdr;
> +
> +	rss_cfg->rss_algorithm =
> VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
> +
> +	proto_hdrs->tunnel_level = 0;	/* always outer layer */
> +
> +	hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];
> +	switch (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_L3) {
> +	case IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4:
> +		iavf_fill_adv_rss_ip4_hdr(hdr, hash_flds);
> +		break;
> +	case IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6:
> +		iavf_fill_adv_rss_ip6_hdr(hdr, hash_flds);
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	hdr = &proto_hdrs->proto_hdr[proto_hdrs->count++];
> +	switch (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_L4) {
> +	case IAVF_ADV_RSS_FLOW_SEG_HDR_TCP:
> +		iavf_fill_adv_rss_tcp_hdr(hdr, hash_flds);
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +/**
> + * iavf_find_adv_rss_cfg_by_hdrs - find RSS configuration with header
> +type
> + * @adapter: pointer to the VF adapter structure
> + * @packet_hdrs: protocol header type to find.
> + *
> + * Returns pointer to advance RSS configuration if found or null  */
> +struct iavf_adv_rss * iavf_find_adv_rss_cfg_by_hdrs(struct iavf_adapter
> +*adapter, u32 packet_hdrs) {
> +	struct iavf_adv_rss *rss;
> +
> +	list_for_each_entry(rss, &adapter->adv_rss_list_head, list)
> +		if (rss->packet_hdrs == packet_hdrs)
> +			return rss;
> +
> +	return NULL;
> +}
> +
> +/**
> + * iavf_print_adv_rss_cfg
> + * @adapter: pointer to the VF adapter structure
> + * @rss: pointer to the advance RSS configuration to print
> + * @action: the string description about how to handle the RSS
> + * @result: the string description about the virtchnl result
> + *
> + * Print the advance RSS configuration
> + **/
> +void
> +iavf_print_adv_rss_cfg(struct iavf_adapter *adapter, struct iavf_adv_rss
> *rss,
> +		       const char *action, const char *result) {
> +	u32 packet_hdrs = rss->packet_hdrs;
> +	u64 hash_flds = rss->hash_flds;
> +	static char hash_opt[300];
> +	const char *proto;
> +
> +	if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_TCP)
> +		proto = "TCP";
> +	else
> +		return;
> +
> +	memset(hash_opt, 0, sizeof(hash_opt));
> +
> +	strcat(hash_opt, proto);
> +	if (packet_hdrs & IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4)
> +		strcat(hash_opt, "v4 ");
> +	else
> +		strcat(hash_opt, "v6 ");
> +
> +	if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_IPV4_SA |
> +			 IAVF_ADV_RSS_HASH_FLD_IPV6_SA))
> +		strcat(hash_opt, "IP SA,");
> +	if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_IPV4_DA |
> +			 IAVF_ADV_RSS_HASH_FLD_IPV6_DA))
> +		strcat(hash_opt, "IP DA,");
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT)
> +		strcat(hash_opt, "src port,");
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT)
> +		strcat(hash_opt, "dst port,");
> +
> +	if (!action)
> +		action = "";
> +
> +	if (!result)
> +		result = "";
> +
> +	dev_info(&adapter->pdev->dev, "%s %s %s\n", action, hash_opt,
> result);
> +}
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_adv_rss.h
> b/drivers/net/ethernet/intel/iavf/iavf_adv_rss.h
> index 66262090e697..339ecb42938b 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_adv_rss.h
> +++ b/drivers/net/ethernet/intel/iavf/iavf_adv_rss.h
> @@ -15,11 +15,65 @@ enum iavf_adv_rss_state_t {
>  	IAVF_ADV_RSS_ACTIVE,		/* RSS configuration is active
> */
>  };
> 
> +enum iavf_adv_rss_flow_seg_hdr {
> +	IAVF_ADV_RSS_FLOW_SEG_HDR_NONE	= 0x00000000,
> +	IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4	= 0x00000001,
> +	IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6	= 0x00000002,
> +	IAVF_ADV_RSS_FLOW_SEG_HDR_TCP	= 0x00000004,
> +};
> +
> +#define IAVF_ADV_RSS_FLOW_SEG_HDR_L3		\
> +	(IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4	|	\
> +	 IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6)
> +
> +#define IAVF_ADV_RSS_FLOW_SEG_HDR_L4		\
> +	(IAVF_ADV_RSS_FLOW_SEG_HDR_TCP)
> +
> +enum iavf_adv_rss_flow_field {
> +	/* L3 */
> +	IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_SA,
> +	IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_DA,
> +	IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_SA,
> +	IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_DA,
> +	/* L4 */
> +	IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_SRC_PORT,
> +	IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_DST_PORT,
> +
> +	/* The total number of enums must not exceed 64 */
> +	IAVF_ADV_RSS_FLOW_FIELD_IDX_MAX
> +};
> +
> +#define IAVF_ADV_RSS_HASH_INVALID	0
> +#define IAVF_ADV_RSS_HASH_FLD_IPV4_SA	\
> +	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_SA)
> +#define IAVF_ADV_RSS_HASH_FLD_IPV6_SA	\
> +	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_SA)
> +#define IAVF_ADV_RSS_HASH_FLD_IPV4_DA	\
> +	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_DA)
> +#define IAVF_ADV_RSS_HASH_FLD_IPV6_DA	\
> +	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_DA)
> +#define IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT	\
> +	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_SRC_PORT)
> +#define IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT	\
> +	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_DST_PORT)
> +
>  /* bookkeeping of advanced RSS configuration */  struct iavf_adv_rss {
>  	enum iavf_adv_rss_state_t state;
>  	struct list_head list;
> 
> +	u32 packet_hdrs;
> +	u64 hash_flds;
> +
>  	struct virtchnl_rss_cfg cfg_msg;
>  };
> +
> +int
> +iavf_fill_adv_rss_cfg_msg(struct virtchnl_rss_cfg *rss_cfg,
> +			  u32 packet_hdrs, u64 hash_flds);
> +struct iavf_adv_rss *
> +iavf_find_adv_rss_cfg_by_hdrs(struct iavf_adapter *adapter, u32
> +packet_hdrs); void iavf_print_adv_rss_cfg(struct iavf_adapter *adapter,
> +struct iavf_adv_rss *rss,
> +		       const char *action, const char *result);
>  #endif /* _IAVF_ADV_RSS_H_ */
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
> b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
> index 935145ab2b77..b5ec8e723b61 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
> +++ b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
> @@ -1418,6 +1418,214 @@ static int iavf_del_fdir_ethtool(struct
> iavf_adapter *adapter, struct ethtool_rx
>  	return err;
>  }
> 
> +/**
> + * iavf_adv_rss_parse_hdrs - parses headers from RSS hash input
> + * @cmd: ethtool rxnfc command
> + *
> + * This function parses the rxnfc command and returns intended
> + * header types for RSS configuration
> + */
> +static u32 iavf_adv_rss_parse_hdrs(struct ethtool_rxnfc *cmd) {
> +	u32 hdrs = IAVF_ADV_RSS_FLOW_SEG_HDR_NONE;
> +
> +	switch (cmd->flow_type) {
> +	case TCP_V4_FLOW:
> +		hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_TCP |
> +			IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4;
> +		break;
> +	case TCP_V6_FLOW:
> +		hdrs |= IAVF_ADV_RSS_FLOW_SEG_HDR_TCP |
> +			IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6;
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	return hdrs;
> +}
> +
> +/**
> + * iavf_adv_rss_parse_hash_flds - parses hash fields from RSS hash
> +input
> + * @cmd: ethtool rxnfc command
> + *
> + * This function parses the rxnfc command and returns intended hash
> +fields for
> + * RSS configuration
> + */
> +static u64 iavf_adv_rss_parse_hash_flds(struct ethtool_rxnfc *cmd) {
> +	u64 hfld = IAVF_ADV_RSS_HASH_INVALID;
> +
> +	if (cmd->data & RXH_IP_SRC || cmd->data & RXH_IP_DST) {
> +		switch (cmd->flow_type) {
> +		case TCP_V4_FLOW:
> +			if (cmd->data & RXH_IP_SRC)
> +				hfld |= IAVF_ADV_RSS_HASH_FLD_IPV4_SA;
> +			if (cmd->data & RXH_IP_DST)
> +				hfld |= IAVF_ADV_RSS_HASH_FLD_IPV4_DA;
> +			break;
> +		case TCP_V6_FLOW:
> +			if (cmd->data & RXH_IP_SRC)
> +				hfld |= IAVF_ADV_RSS_HASH_FLD_IPV6_SA;
> +			if (cmd->data & RXH_IP_DST)
> +				hfld |= IAVF_ADV_RSS_HASH_FLD_IPV6_DA;
> +			break;
> +		default:
> +			break;
> +		}
> +	}
> +
> +	if (cmd->data & RXH_L4_B_0_1 || cmd->data & RXH_L4_B_2_3) {
> +		switch (cmd->flow_type) {
> +		case TCP_V4_FLOW:
> +		case TCP_V6_FLOW:
> +			if (cmd->data & RXH_L4_B_0_1)
> +				hfld |=
> IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT;
> +			if (cmd->data & RXH_L4_B_2_3)
> +				hfld |=
> IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT;
> +			break;
> +		default:
> +			break;
> +		}
> +	}
> +
> +	return hfld;
> +}
> +
> +/**
> + * iavf_set_adv_rss_hash_opt - Enable/Disable flow types for RSS hash
> + * @adapter: pointer to the VF adapter structure
> + * @cmd: ethtool rxnfc command
> + *
> + * Returns Success if the flow input set is supported.
> + */
> +static int
> +iavf_set_adv_rss_hash_opt(struct iavf_adapter *adapter,
> +			  struct ethtool_rxnfc *cmd)
> +{
> +	struct iavf_adv_rss *rss_old, *rss_new;
> +	bool rss_new_add = false;
> +	int count = 50, err = 0;
> +	u64 hash_flds;
> +	u32 hdrs;
> +
> +	if (!ADV_RSS_SUPPORT(adapter))
> +		return -EOPNOTSUPP;
> +
> +	hdrs = iavf_adv_rss_parse_hdrs(cmd);
> +	if (hdrs == IAVF_ADV_RSS_FLOW_SEG_HDR_NONE)
> +		return -EINVAL;
> +
> +	hash_flds = iavf_adv_rss_parse_hash_flds(cmd);
> +	if (hash_flds == IAVF_ADV_RSS_HASH_INVALID)
> +		return -EINVAL;
> +
> +	rss_new = kzalloc(sizeof(*rss_new), GFP_KERNEL);
> +	if (!rss_new)
> +		return -ENOMEM;
> +
> +	if (iavf_fill_adv_rss_cfg_msg(&rss_new->cfg_msg, hdrs, hash_flds))
> {
> +		kfree(rss_new);
> +		return -EINVAL;
> +	}
> +
> +	while (test_and_set_bit(__IAVF_IN_CRITICAL_TASK,
> +				&adapter->crit_section)) {
> +		if (--count == 0) {
> +			kfree(rss_new);
> +			return -EINVAL;
> +		}
> +
> +		udelay(1);
> +	}
> +
> +	spin_lock_bh(&adapter->adv_rss_lock);
> +	rss_old = iavf_find_adv_rss_cfg_by_hdrs(adapter, hdrs);
> +	if (rss_old) {
> +		if (rss_old->state != IAVF_ADV_RSS_ACTIVE) {
> +			err = -EBUSY;
> +		} else if (rss_old->hash_flds != hash_flds) {
> +			rss_old->state = IAVF_ADV_RSS_ADD_REQUEST;
> +			rss_old->hash_flds = hash_flds;
> +			memcpy(&rss_old->cfg_msg, &rss_new->cfg_msg,
> +			       sizeof(rss_new->cfg_msg));
> +			adapter->aq_required |=
> IAVF_FLAG_AQ_ADD_ADV_RSS_CFG;
> +		} else {
> +			err = -EEXIST;
> +		}
> +	} else {
> +		rss_new_add = true;
> +		rss_new->state = IAVF_ADV_RSS_ADD_REQUEST;
> +		rss_new->packet_hdrs = hdrs;
> +		rss_new->hash_flds = hash_flds;
> +		list_add_tail(&rss_new->list, &adapter->adv_rss_list_head);
> +		adapter->aq_required |=
> IAVF_FLAG_AQ_ADD_ADV_RSS_CFG;
> +	}
> +	spin_unlock_bh(&adapter->adv_rss_lock);
> +
> +	if (!err)
> +		mod_delayed_work(iavf_wq, &adapter->watchdog_task, 0);
> +
> +	clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
> +
> +	if (!rss_new_add)
> +		kfree(rss_new);
> +
> +	return err;
> +}
> +
> +/**
> + * iavf_get_adv_rss_hash_opt - Retrieve hash fields for a given
> +flow-type
> + * @adapter: pointer to the VF adapter structure
> + * @cmd: ethtool rxnfc command
> + *
> + * Returns Success if the flow input set is supported.
> + */
> +static int
> +iavf_get_adv_rss_hash_opt(struct iavf_adapter *adapter,
> +			  struct ethtool_rxnfc *cmd)
> +{
> +	struct iavf_adv_rss *rss;
> +	u64 hash_flds;
> +	u32 hdrs;
> +
> +	if (!ADV_RSS_SUPPORT(adapter))
> +		return -EOPNOTSUPP;
> +
> +	cmd->data = 0;
> +
> +	hdrs = iavf_adv_rss_parse_hdrs(cmd);
> +	if (hdrs == IAVF_ADV_RSS_FLOW_SEG_HDR_NONE)
> +		return -EINVAL;
> +
> +	spin_lock_bh(&adapter->adv_rss_lock);
> +	rss = iavf_find_adv_rss_cfg_by_hdrs(adapter, hdrs);
> +	if (rss)
> +		hash_flds = rss->hash_flds;
> +	else
> +		hash_flds = IAVF_ADV_RSS_HASH_INVALID;
> +	spin_unlock_bh(&adapter->adv_rss_lock);
> +
> +	if (hash_flds == IAVF_ADV_RSS_HASH_INVALID)
> +		return -EINVAL;
> +
> +	if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_IPV4_SA |
> +			 IAVF_ADV_RSS_HASH_FLD_IPV6_SA))
> +		cmd->data |= (u64)RXH_IP_SRC;
> +
> +	if (hash_flds & (IAVF_ADV_RSS_HASH_FLD_IPV4_DA |
> +			 IAVF_ADV_RSS_HASH_FLD_IPV6_DA))
> +		cmd->data |= (u64)RXH_IP_DST;
> +
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT)
> +		cmd->data |= (u64)RXH_L4_B_0_1;
> +
> +	if (hash_flds & IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT)
> +		cmd->data |= (u64)RXH_L4_B_2_3;
> +
> +	return 0;
> +}
> +
>  /**
>   * iavf_set_rxnfc - command to set Rx flow rules.
>   * @netdev: network interface device structure @@ -1437,6 +1645,9 @@
> static int iavf_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc
> *cmd)
>  	case ETHTOOL_SRXCLSRLDEL:
>  		ret = iavf_del_fdir_ethtool(adapter, cmd);
>  		break;
> +	case ETHTOOL_SRXFH:
> +		ret = iavf_set_adv_rss_hash_opt(adapter, cmd);
> +		break;
>  	default:
>  		break;
>  	}
> @@ -1477,8 +1688,7 @@ static int iavf_get_rxnfc(struct net_device *netdev,
> struct ethtool_rxnfc *cmd,
>  		ret = iavf_get_fdir_fltr_ids(adapter, cmd, (u32 *)rule_locs);
>  		break;
>  	case ETHTOOL_GRXFH:
> -		netdev_info(netdev,
> -			    "RSS hash info is not available to vf, use pf.\n");
> +		ret = iavf_get_adv_rss_hash_opt(adapter, cmd);
>  		break;
>  	default:
>  		break;
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> index 54d2efe1732d..0eab3c43bdc5 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> +++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
> @@ -1327,6 +1327,9 @@ void iavf_add_adv_rss_cfg(struct iavf_adapter
> *adapter)
>  			process_rss = true;
>  			rss->state = IAVF_ADV_RSS_ADD_PENDING;
>  			memcpy(rss_cfg, &rss->cfg_msg, len);
> +			iavf_print_adv_rss_cfg(adapter, rss,
> +					       "Input set change for",
> +					       "is pending");
>  			break;
>  		}
>  	}
> @@ -1599,6 +1602,9 @@ void iavf_virtchnl_completion(struct iavf_adapter
> *adapter,
>  						 &adapter-
> >adv_rss_list_head,
>  						 list) {
>  				if (rss->state ==
> IAVF_ADV_RSS_ADD_PENDING) {
> +					iavf_print_adv_rss_cfg(adapter, rss,
> +							       "Failed to change
> the input set for",
> +							       NULL);
>  					list_del(&rss->list);
>  					kfree(rss);
>  				}
> @@ -1815,9 +1821,14 @@ void iavf_virtchnl_completion(struct iavf_adapter
> *adapter,
>  		struct iavf_adv_rss *rss;
> 
>  		spin_lock_bh(&adapter->adv_rss_lock);
> -		list_for_each_entry(rss, &adapter->adv_rss_list_head, list)
> -			if (rss->state == IAVF_ADV_RSS_ADD_PENDING)
> +		list_for_each_entry(rss, &adapter->adv_rss_list_head, list) {
> +			if (rss->state == IAVF_ADV_RSS_ADD_PENDING) {
> +				iavf_print_adv_rss_cfg(adapter, rss,
> +						       "Input set change for",
> +						       "successful");
>  				rss->state = IAVF_ADV_RSS_ACTIVE;
> +			}
> +		}
>  		spin_unlock_bh(&adapter->adv_rss_lock);
>  		}
>  		break;

Tested-by: Konrad Jankowski <konrad0.jankowski at intel.com>


More information about the Intel-wired-lan mailing list