[PATCH v2 0/2] Support ethtool ntuple rule count change

STALE1857d

Revision v2 of 3 in this series.

5 messages, 3 authors, 2021-07-26 · open the first message on its own page

[PATCH v2 0/2] Support ethtool ntuple rule count change

From: Sunil Goutham <sgoutham@marvell.com>
Date: 2021-07-23 18:17:06

Some NICs share resources like packet filters across
multiple interfaces they support. From HW point of view
it is possible to use all filters for a single interface.
This 2 patch series adds support to modify ntuple rule
count for OcteonTx2 netdev.

Changes from v1:
   * No changes in code.
   * Previous discussion didn't conclude, submiting patches again to revive it.
   * Jakub suggested if devlink-resource can be used for this.
   * But since ntuple rule insert and delete are part of ethtool,
     I thought having this config also in ethtool makes sense ie
     all ntuple related stuff within one tool.
   * Also number of MCAM entries can be changed at runtime
     without a driver reload.

Sunil Goutham (2):
  net: ethtool: Support setting ntuple rule count
  octeontx2-pf: Support setting ntuple rule count

 .../ethernet/marvell/octeontx2/nic/otx2_common.h   |  1 +
 .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  |  3 +++
 .../ethernet/marvell/octeontx2/nic/otx2_flows.c    | 27 ++++++++++++++++++++--
 include/uapi/linux/ethtool.h                       |  1 +
 net/ethtool/ioctl.c                                |  1 +
 5 files changed, 31 insertions(+), 2 deletions(-)

-- 
2.7.4

[PATCH v2 2/2] octeontx2-pf: Support setting ntuple rule count

From: Sunil Goutham <sgoutham@marvell.com>
Date: 2021-07-23 18:17:06

Added support for changing ethtool ntuple filter count.
Rule count change is supported only when there are no
ntuple filters installed.

Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
---
 .../ethernet/marvell/octeontx2/nic/otx2_common.h   |  1 +
 .../ethernet/marvell/octeontx2/nic/otx2_ethtool.c  |  3 +++
 .../ethernet/marvell/octeontx2/nic/otx2_flows.c    | 27 ++++++++++++++++++++--
 3 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
index 8fd58cd..6fe2bf7 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
@@ -825,6 +825,7 @@ int otx2_get_all_flows(struct otx2_nic *pfvf,
 int otx2_add_flow(struct otx2_nic *pfvf,
 		  struct ethtool_rxnfc *nfc);
 int otx2_remove_flow(struct otx2_nic *pfvf, u32 location);
+int otx2_set_flow_rule_count(struct otx2_nic *pfvf, int count);
 int otx2_prepare_flow_request(struct ethtool_rx_flow_spec *fsp,
 			      struct npc_install_flow_req *req);
 void otx2_rss_ctx_flow_del(struct otx2_nic *pfvf, int ctx_id);
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
index 8df748e..753a8cf 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
@@ -690,6 +690,9 @@ static int otx2_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *nfc)
 		if (netif_running(dev) && ntuple)
 			ret = otx2_remove_flow(pfvf, nfc->fs.location);
 		break;
+	case ETHTOOL_SRXCLSRLCNT:
+		ret = otx2_set_flow_rule_count(pfvf, nfc->rule_cnt);
+		break;
 	default:
 		break;
 	}
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c
index 4d9de52..ea2626c 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c
@@ -123,12 +123,29 @@ static int otx2_alloc_ntuple_mcam_entries(struct otx2_nic *pfvf, u16 count)
 
 	if (allocated != count)
 		netdev_info(pfvf->netdev,
-			    "Unable to allocate %d MCAM entries for ntuple, got %d\n",
-			    count, allocated);
+			    "Unable to allocate %d MCAM entries above default rules' "
+			    "start index %d, got only %d\n",
+			    count, flow_cfg->def_ent[0], allocated);
 
 	return allocated;
 }
 
+int otx2_set_flow_rule_count(struct otx2_nic *pfvf, int count)
+{
+	struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
+
+	if (!flow_cfg)
+		return 0;
+
+	if (flow_cfg->nr_flows) {
+		netdev_err(pfvf->netdev,
+			   "Cannot change count when there are active rules\n");
+		return 0;
+	}
+
+	return otx2_alloc_ntuple_mcam_entries(pfvf, count);
+}
+
 int otx2_alloc_mcam_entries(struct otx2_nic *pfvf)
 {
 	struct otx2_flow_config *flow_cfg = pfvf->flow_cfg;
@@ -923,6 +940,12 @@ int otx2_add_flow(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc)
 	int err = 0;
 	u32 ring;
 
+	if (!flow_cfg->ntuple_max_flows) {
+		netdev_err(pfvf->netdev,
+			   "Ntuple rule count is 0, allocate and retry\n");
+		return -EINVAL;
+	}
+
 	ring = ethtool_get_flow_spec_ring(fsp->ring_cookie);
 	if (!(pfvf->flags & OTX2_FLAG_NTUPLE_SUPPORT))
 		return -ENOMEM;
-- 
2.7.4

[PATCH v2 1/2] net: ethtool: Support setting ntuple rule count

From: Sunil Goutham <sgoutham@marvell.com>
Date: 2021-07-23 18:17:07

Some NICs share resources like packet filters across
multiple interfaces they support. From HW point of view
it is possible to use all filters for a single interface.
Currently ethtool doesn't support modifying filter count so
that user can allocate more filters to a interface and less
to others. This patch adds ETHTOOL_SRXCLSRLCNT ioctl command
for modifying filter count.

example command:
./ethtool -U eth0 rule-count 256

Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
---
 include/uapi/linux/ethtool.h | 1 +
 net/ethtool/ioctl.c          | 1 +
 2 files changed, 2 insertions(+)
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index 67aa713..178f346 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -1552,6 +1552,7 @@ enum ethtool_fec_config_bits {
 #define ETHTOOL_PHY_STUNABLE	0x0000004f /* Set PHY tunable configuration */
 #define ETHTOOL_GFECPARAM	0x00000050 /* Get FEC settings */
 #define ETHTOOL_SFECPARAM	0x00000051 /* Set FEC settings */
+#define ETHTOOL_SRXCLSRLCNT	0x00000052 /* Set RX class rule count */
 
 /* compatibility with older code */
 #define SPARC_ETH_GSET		ETHTOOL_GSET
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 6134b18..ca0f75e 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -2863,6 +2863,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
 	case ETHTOOL_SRXFH:
 	case ETHTOOL_SRXCLSRLDEL:
 	case ETHTOOL_SRXCLSRLINS:
+	case ETHTOOL_SRXCLSRLCNT:
 		rc = ethtool_set_rxnfc(dev, ethcmd, useraddr);
 		break;
 	case ETHTOOL_FLASHDEV:
-- 
2.7.4

Re: [PATCH v2 1/2] net: ethtool: Support setting ntuple rule count

From: Andrew Lunn <andrew@lunn.ch>
Date: 2021-07-24 17:23:38

On Fri, Jul 23, 2021 at 11:46:45PM +0530, Sunil Goutham wrote:
Some NICs share resources like packet filters across
multiple interfaces they support. From HW point of view
it is possible to use all filters for a single interface.
Currently ethtool doesn't support modifying filter count so
that user can allocate more filters to a interface and less
to others. This patch adds ETHTOOL_SRXCLSRLCNT ioctl command
for modifying filter count.

example command:
./ethtool -U eth0 rule-count 256
How can use see what the current usage is? How many in total you have
available?  What the current split is between the interfaces?

You say:

   * Jakub suggested if devlink-resource can be used for this.

devlink-resource provides you a standardised mechanism to answer the
questions i just asked. So i would have to agree with Jakub.

	  Andrew

Re: [PATCH v2 1/2] net: ethtool: Support setting ntuple rule count

From: Saeed Mahameed <saeed@kernel.org>
Date: 2021-07-26 22:29:28

On Sat, 2021-07-24 at 19:23 +0200, Andrew Lunn wrote:
On Fri, Jul 23, 2021 at 11:46:45PM +0530, Sunil Goutham wrote:
quoted
Some NICs share resources like packet filters across
multiple interfaces they support. From HW point of view
it is possible to use all filters for a single interface.
Currently ethtool doesn't support modifying filter count so
that user can allocate more filters to a interface and less
to others. This patch adds ETHTOOL_SRXCLSRLCNT ioctl command
for modifying filter count.

example command:
./ethtool -U eth0 rule-count 256
How can use see what the current usage is? How many in total you have
available?  What the current split is between the interfaces?
There is no point of adding this ethtool interface if the orchestration
tool already knows the "rule-count" in advance, it's just redundant to
have a user managed limiting device in ethtool.
You say:

   * Jakub suggested if devlink-resource can be used for this.

devlink-resource provides you a standardised mechanism to answer the
questions i just asked. So i would have to agree with Jakub.
+1, devlink is your address when a single device is shared across
multiple interfaces.
          Andrew

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help