[2/9] ixgbevf: add ethtool private flag for legacy Rx

Message ID 20180131005117.19264.16322.stgit@localhost6.localdomain6
State Accepted
Delegated to: Jeff Kirsher
Headers show
Series
  • ixgbevf: build_skb support and related changes
Related show

Commit Message

Emil Tantilov Jan. 31, 2018, 12:51 a.m.
Introduce legacy-rx private flag that will allow switching between the
old and new (build_skb based) Rx code paths. The implementation is the
same as in commit e08912985b29
("igb: Add support for ethtool private flag to allow use of legacy Rx")

This provides a means of validating the legacy Rx path in the event that
we are forced to fall back.  At some point in the future when we are
convinced we don't need it anymore we might be able to drop the legacy-rx
flag.

Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com>
---
 drivers/net/ethernet/intel/ixgbevf/ethtool.c |   48 ++++++++++++++++++++++++++
 drivers/net/ethernet/intel/ixgbevf/ixgbevf.h |    2 +
 2 files changed, 50 insertions(+)

Comments

Singh, Krishneil K Feb. 26, 2018, 4:02 p.m. | #1
> -----Original Message-----
> From: Intel-wired-lan [mailto:intel-wired-lan-bounces@osuosl.org] On Behalf Of
> Emil Tantilov
> Sent: Tuesday, January 30, 2018 4:51 PM
> To: intel-wired-lan@lists.osuosl.org
> Subject: [Intel-wired-lan] [PATCH 2/9] ixgbevf: add ethtool private flag for
> legacy Rx
> 
> Introduce legacy-rx private flag that will allow switching between the
> old and new (build_skb based) Rx code paths. The implementation is the
> same as in commit e08912985b29
> ("igb: Add support for ethtool private flag to allow use of legacy Rx")
> 
> This provides a means of validating the legacy Rx path in the event that
> we are forced to fall back.  At some point in the future when we are
> convinced we don't need it anymore we might be able to drop the legacy-rx
> flag.
> 
> Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com>
> ---
>  drivers/net/ethernet/intel/ixgbevf/ethtool.c |   48
> ++++++++++++++++++++++++++
>  drivers/net/ethernet/intel/ixgbevf/ixgbevf.h |    2 +
>  2 files changed, 50 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ethtool.c
> b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
> index 4400e49..e7623fe 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ethtool.c
> +++ b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
> @@ -94,6 +94,13 @@ struct ixgbe_stats {
> 
>  #define IXGBEVF_TEST_LEN (sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN)
> 
> +static const char ixgbevf_priv_flags_strings[][ETH_GSTRING_LEN] = {
> +#define IXGBEVF_PRIV_FLAGS_LEGACY_RX	BIT(0)
> +	"legacy-rx",
> +};
> +
> +#define IXGBEVF_PRIV_FLAGS_STR_LEN
> ARRAY_SIZE(ixgbevf_priv_flags_strings)
> +
>  static int ixgbevf_get_link_ksettings(struct net_device *netdev,
>  				      struct ethtool_link_ksettings *cmd)
>  {
> @@ -241,6 +248,8 @@ static void ixgbevf_get_drvinfo(struct net_device
> *netdev,
>  		sizeof(drvinfo->version));
>  	strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
>  		sizeof(drvinfo->bus_info));
> +
> +	drvinfo->n_priv_flags = IXGBEVF_PRIV_FLAGS_STR_LEN;
>  }
> 
>  static void ixgbevf_get_ringparam(struct net_device *netdev,
> @@ -392,6 +401,8 @@ static int ixgbevf_get_sset_count(struct net_device
> *netdev, int stringset)
>  		return IXGBEVF_TEST_LEN;
>  	case ETH_SS_STATS:
>  		return IXGBEVF_STATS_LEN;
> +	case ETH_SS_PRIV_FLAGS:
> +		return IXGBEVF_PRIV_FLAGS_STR_LEN;
>  	default:
>  		return -EINVAL;
>  	}
> @@ -496,6 +507,10 @@ static void ixgbevf_get_strings(struct net_device
> *netdev, u32 stringset,
>  			p += ETH_GSTRING_LEN;
>  		}
>  		break;
> +	case ETH_SS_PRIV_FLAGS:
> +		memcpy(data, ixgbevf_priv_flags_strings,
> +		       IXGBEVF_PRIV_FLAGS_STR_LEN * ETH_GSTRING_LEN);
> +		break;
>  	}
>  }
> 
> @@ -888,6 +903,37 @@ static int ixgbevf_get_rxfh(struct net_device *netdev,
> u32 *indir, u8 *key,
>  	return err;
>  }
> 
> +static u32 ixgbevf_get_priv_flags(struct net_device *netdev)
> +{
> +	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
> +	u32 priv_flags = 0;
> +
> +	if (adapter->flags & IXGBEVF_FLAGS_LEGACY_RX)
> +		priv_flags |= IXGBEVF_PRIV_FLAGS_LEGACY_RX;
> +
> +	return priv_flags;
> +}
> +
> +static int ixgbevf_set_priv_flags(struct net_device *netdev, u32 priv_flags)
> +{
> +	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
> +	unsigned int flags = adapter->flags;
> +
> +	flags &= ~IXGBEVF_FLAGS_LEGACY_RX;
> +	if (priv_flags & IXGBEVF_PRIV_FLAGS_LEGACY_RX)
> +		flags |= IXGBEVF_FLAGS_LEGACY_RX;
> +
> +	if (flags != adapter->flags) {
> +		adapter->flags = flags;
> +
> +		/* reset interface to repopulate queues */
> +		if (netif_running(netdev))
> +			ixgbevf_reinit_locked(adapter);
> +	}
> +
> +	return 0;
> +}
> +
>  static const struct ethtool_ops ixgbevf_ethtool_ops = {
>  	.get_drvinfo		= ixgbevf_get_drvinfo,
>  	.get_regs_len		= ixgbevf_get_regs_len,
> @@ -909,6 +955,8 @@ static int ixgbevf_get_rxfh(struct net_device *netdev,
> u32 *indir, u8 *key,
>  	.get_rxfh_key_size	= ixgbevf_get_rxfh_key_size,
>  	.get_rxfh		= ixgbevf_get_rxfh,
>  	.get_link_ksettings	= ixgbevf_get_link_ksettings,
> +	.get_priv_flags		= ixgbevf_get_priv_flags,
> +	.set_priv_flags		= ixgbevf_set_priv_flags,
>  };
> 
>  void ixgbevf_set_ethtool_ops(struct net_device *netdev)
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> index f695242..62a3669 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> @@ -331,6 +331,8 @@ struct ixgbevf_adapter {
> 
>  	u32 *rss_key;
>  	u8 rss_indir_tbl[IXGBEVF_X550_VFRETA_SIZE];
> +	u32 flags;
> +#define IXGBEVF_FLAGS_LEGACY_RX		BIT(1)
>  };
> 
>  enum ixbgevf_state_t {
> 
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan@osuosl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan

Tested-by: Krishneil Singh <krishneil.k.singh@intel.com>

Patch

diff --git a/drivers/net/ethernet/intel/ixgbevf/ethtool.c b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
index 4400e49..e7623fe 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
@@ -94,6 +94,13 @@  struct ixgbe_stats {
 
 #define IXGBEVF_TEST_LEN (sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN)
 
+static const char ixgbevf_priv_flags_strings[][ETH_GSTRING_LEN] = {
+#define IXGBEVF_PRIV_FLAGS_LEGACY_RX	BIT(0)
+	"legacy-rx",
+};
+
+#define IXGBEVF_PRIV_FLAGS_STR_LEN ARRAY_SIZE(ixgbevf_priv_flags_strings)
+
 static int ixgbevf_get_link_ksettings(struct net_device *netdev,
 				      struct ethtool_link_ksettings *cmd)
 {
@@ -241,6 +248,8 @@  static void ixgbevf_get_drvinfo(struct net_device *netdev,
 		sizeof(drvinfo->version));
 	strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
 		sizeof(drvinfo->bus_info));
+
+	drvinfo->n_priv_flags = IXGBEVF_PRIV_FLAGS_STR_LEN;
 }
 
 static void ixgbevf_get_ringparam(struct net_device *netdev,
@@ -392,6 +401,8 @@  static int ixgbevf_get_sset_count(struct net_device *netdev, int stringset)
 		return IXGBEVF_TEST_LEN;
 	case ETH_SS_STATS:
 		return IXGBEVF_STATS_LEN;
+	case ETH_SS_PRIV_FLAGS:
+		return IXGBEVF_PRIV_FLAGS_STR_LEN;
 	default:
 		return -EINVAL;
 	}
@@ -496,6 +507,10 @@  static void ixgbevf_get_strings(struct net_device *netdev, u32 stringset,
 			p += ETH_GSTRING_LEN;
 		}
 		break;
+	case ETH_SS_PRIV_FLAGS:
+		memcpy(data, ixgbevf_priv_flags_strings,
+		       IXGBEVF_PRIV_FLAGS_STR_LEN * ETH_GSTRING_LEN);
+		break;
 	}
 }
 
@@ -888,6 +903,37 @@  static int ixgbevf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
 	return err;
 }
 
+static u32 ixgbevf_get_priv_flags(struct net_device *netdev)
+{
+	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
+	u32 priv_flags = 0;
+
+	if (adapter->flags & IXGBEVF_FLAGS_LEGACY_RX)
+		priv_flags |= IXGBEVF_PRIV_FLAGS_LEGACY_RX;
+
+	return priv_flags;
+}
+
+static int ixgbevf_set_priv_flags(struct net_device *netdev, u32 priv_flags)
+{
+	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
+	unsigned int flags = adapter->flags;
+
+	flags &= ~IXGBEVF_FLAGS_LEGACY_RX;
+	if (priv_flags & IXGBEVF_PRIV_FLAGS_LEGACY_RX)
+		flags |= IXGBEVF_FLAGS_LEGACY_RX;
+
+	if (flags != adapter->flags) {
+		adapter->flags = flags;
+
+		/* reset interface to repopulate queues */
+		if (netif_running(netdev))
+			ixgbevf_reinit_locked(adapter);
+	}
+
+	return 0;
+}
+
 static const struct ethtool_ops ixgbevf_ethtool_ops = {
 	.get_drvinfo		= ixgbevf_get_drvinfo,
 	.get_regs_len		= ixgbevf_get_regs_len,
@@ -909,6 +955,8 @@  static int ixgbevf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
 	.get_rxfh_key_size	= ixgbevf_get_rxfh_key_size,
 	.get_rxfh		= ixgbevf_get_rxfh,
 	.get_link_ksettings	= ixgbevf_get_link_ksettings,
+	.get_priv_flags		= ixgbevf_get_priv_flags,
+	.set_priv_flags		= ixgbevf_set_priv_flags,
 };
 
 void ixgbevf_set_ethtool_ops(struct net_device *netdev)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
index f695242..62a3669 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
@@ -331,6 +331,8 @@  struct ixgbevf_adapter {
 
 	u32 *rss_key;
 	u8 rss_indir_tbl[IXGBEVF_X550_VFRETA_SIZE];
+	u32 flags;
+#define IXGBEVF_FLAGS_LEGACY_RX		BIT(1)
 };
 
 enum ixbgevf_state_t {