All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks
@ 2025-09-05 17:07 Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
                   ` (6 more replies)
  0 siblings, 7 replies; 11+ messages in thread
From: Breno Leitao @ 2025-09-05 17:07 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn
  Cc: netdev, linux-kernel, virtualization, Breno Leitao, jdamato,
	kernel-team

This patchset introduces a new dedicated ethtool_ops callback,
.get_rxrings, which enables drivers to provide the number of RX rings
directly, improving efficiency and clarity in RX ring queries and RSS
configuration.

Number of drivers no implement .get_rxnfc just to report the ring count,
so, having a proper callback makes sense and simplify .get_rxnfc.

This has been suggested by Jakub, and follow the same idea as RXFH
driver callbacks [1].

This also port virtio_net to this new callback. Once there is consensus
on this approach, I can start moving the drivers to this new callback.

Link: https://lore.kernel.org/all/20250611145949.2674086-1-kuba@kernel.org/ [1]

Suggested-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Breno Leitao <leitao@debian.org>
---
Breno Leitao (7):
      net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir
      net: ethtool: add support for ETHTOOL_GRXRINGS ioctl
      net: ethtool: remove the duplicated handling from ethtool_get_rxrings
      net: ethtool: add get_rxrings callback to optimize RX ring queries
      net: ethtool: update set_rxfh to use get_num_rxrings helper
      net: ethtool: update set_rxfh_indir to use get_num_rxrings helper
      net: virtio_net: add get_rxrings ethtool callback for RX ring queries

 drivers/net/virtio_net.c | 15 ++--------
 include/linux/ethtool.h  |  1 +
 net/ethtool/ioctl.c      | 75 ++++++++++++++++++++++++++++++++++++++----------
 3 files changed, 64 insertions(+), 27 deletions(-)
---
base-commit: 16c610162d1f1c332209de1c91ffb09b659bb65d
change-id: 20250905-gxrings-a2ec22ee2aec

Best regards,
--  
Breno Leitao <leitao@debian.org>


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH RFC net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir
  2025-09-05 17:07 [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
@ 2025-09-05 17:07 ` Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 2/7] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl Breno Leitao
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Breno Leitao @ 2025-09-05 17:07 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn
  Cc: netdev, linux-kernel, virtualization, Breno Leitao, jdamato,
	kernel-team

Modify ethtool_copy_validate_indir() and callers to validate indirection
table entries against the number of RX rings as an integer instead of
accessing rx_rings->data.

This will be useful in the future, given that struct ethtool_rxnfc might
not exist for native GRXRINGS call.

Signed-off-by: Breno Leitao <leitao@debian.org>
---
 net/ethtool/ioctl.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 0b2a4d0573b38..15627afa4424f 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1246,8 +1246,8 @@ static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
 }
 
 static int ethtool_copy_validate_indir(u32 *indir, void __user *useraddr,
-					struct ethtool_rxnfc *rx_rings,
-					u32 size)
+				       int num_rx_rings,
+				       u32 size)
 {
 	int i;
 
@@ -1256,7 +1256,7 @@ static int ethtool_copy_validate_indir(u32 *indir, void __user *useraddr,
 
 	/* Validate ring indices */
 	for (i = 0; i < size; i++)
-		if (indir[i] >= rx_rings->data)
+		if (indir[i] >= num_rx_rings)
 			return -EINVAL;
 
 	return 0;
@@ -1366,7 +1366,7 @@ static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
 	} else {
 		ret = ethtool_copy_validate_indir(rxfh_dev.indir,
 						  useraddr + ringidx_offset,
-						  &rx_rings,
+						  rx_rings.data,
 						  rxfh_dev.indir_size);
 		if (ret)
 			goto out;
@@ -1587,7 +1587,7 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
 		rxfh_dev.indir_size = dev_indir_size;
 		ret = ethtool_copy_validate_indir(rxfh_dev.indir,
 						  useraddr + rss_cfg_offset,
-						  &rx_rings,
+						  rx_rings.data,
 						  rxfh.indir_size);
 		if (ret)
 			goto out_free;

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH RFC net-next 2/7] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl
  2025-09-05 17:07 [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
@ 2025-09-05 17:07 ` Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 3/7] net: ethtool: remove the duplicated handling from ethtool_get_rxrings Breno Leitao
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Breno Leitao @ 2025-09-05 17:07 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn
  Cc: netdev, linux-kernel, virtualization, Breno Leitao, jdamato,
	kernel-team

This patch adds handling for the ETHTOOL_GRXRINGS ioctl command in the
ethtool ioctl dispatcher. It introduces a new helper function
ethtool_get_rxrings() that calls the driver's get_rxnfc() callback with
appropriate parameters to retrieve the number of RX rings supported
by the device.

By explicitly handling ETHTOOL_GRXRINGS, userspace queries through
ethtool can now obtain RX ring information in a structured manner.

In this patch, ethtool_get_rxrings() is a simply copy of
ethtool_get_rxnfc().

Signed-off-by: Breno Leitao <leitao@debian.org>
---
 net/ethtool/ioctl.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 15627afa4424f..4214ab33c3c81 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1208,6 +1208,44 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
 	return 0;
 }
 
+static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
+						  u32 cmd,
+						  void __user *useraddr)
+{
+	struct ethtool_rxnfc info;
+	size_t info_size = sizeof(info);
+	const struct ethtool_ops *ops = dev->ethtool_ops;
+	int ret;
+	void *rule_buf = NULL;
+
+	if (!ops->get_rxnfc)
+		return -EOPNOTSUPP;
+
+	ret = ethtool_rxnfc_copy_struct(cmd, &info, &info_size, useraddr);
+	if (ret)
+		return ret;
+
+	if (info.cmd == ETHTOOL_GRXCLSRLALL) {
+		if (info.rule_cnt > 0) {
+			if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
+				rule_buf = kcalloc(info.rule_cnt, sizeof(u32),
+						   GFP_USER);
+			if (!rule_buf)
+				return -ENOMEM;
+		}
+	}
+
+	ret = ops->get_rxnfc(dev, &info, rule_buf);
+	if (ret < 0)
+		goto err_out;
+
+	ret = ethtool_rxnfc_copy_to_user(useraddr, &info, info_size, rule_buf);
+err_out:
+	kfree(rule_buf);
+
+	return ret;
+}
+
 static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
 						u32 cmd, void __user *useraddr)
 {
@@ -3377,6 +3415,8 @@ __dev_ethtool(struct net *net, struct ifreq *ifr, void __user *useraddr,
 		rc = ethtool_set_rxfh_fields(dev, ethcmd, useraddr);
 		break;
 	case ETHTOOL_GRXRINGS:
+		rc = ethtool_get_rxrings(dev, ethcmd, useraddr);
+		break;
 	case ETHTOOL_GRXCLSRLCNT:
 	case ETHTOOL_GRXCLSRULE:
 	case ETHTOOL_GRXCLSRLALL:

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH RFC net-next 3/7] net: ethtool: remove the duplicated handling from ethtool_get_rxrings
  2025-09-05 17:07 [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 2/7] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl Breno Leitao
@ 2025-09-05 17:07 ` Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries Breno Leitao
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Breno Leitao @ 2025-09-05 17:07 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn
  Cc: netdev, linux-kernel, virtualization, Breno Leitao, jdamato,
	kernel-team

ethtool_get_rxrings() was a copy of ethtool_get_rxnfc(). Clean the code
that will never be executed for GRXRINGS specifically.

Signed-off-by: Breno Leitao <leitao@debian.org>
---
 net/ethtool/ioctl.c | 21 +++------------------
 1 file changed, 3 insertions(+), 18 deletions(-)

diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 4214ab33c3c81..1a9ad47f60313 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1216,7 +1216,6 @@ static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
 	size_t info_size = sizeof(info);
 	const struct ethtool_ops *ops = dev->ethtool_ops;
 	int ret;
-	void *rule_buf = NULL;
 
 	if (!ops->get_rxnfc)
 		return -EOPNOTSUPP;
@@ -1225,25 +1224,11 @@ static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
 	if (ret)
 		return ret;
 
-	if (info.cmd == ETHTOOL_GRXCLSRLALL) {
-		if (info.rule_cnt > 0) {
-			if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
-				rule_buf = kcalloc(info.rule_cnt, sizeof(u32),
-						   GFP_USER);
-			if (!rule_buf)
-				return -ENOMEM;
-		}
-	}
-
-	ret = ops->get_rxnfc(dev, &info, rule_buf);
+	ret = ops->get_rxnfc(dev, &info, NULL);
 	if (ret < 0)
-		goto err_out;
-
-	ret = ethtool_rxnfc_copy_to_user(useraddr, &info, info_size, rule_buf);
-err_out:
-	kfree(rule_buf);
+		return ret;
 
-	return ret;
+	return ethtool_rxnfc_copy_to_user(useraddr, &info, info_size, NULL);
 }
 
 static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries
  2025-09-05 17:07 [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
                   ` (2 preceding siblings ...)
  2025-09-05 17:07 ` [PATCH RFC net-next 3/7] net: ethtool: remove the duplicated handling from ethtool_get_rxrings Breno Leitao
@ 2025-09-05 17:07 ` Breno Leitao
  2025-09-05 23:42   ` Jakub Kicinski
  2025-09-08 11:51   ` Simon Horman
  2025-09-05 17:07 ` [PATCH RFC net-next 5/7] net: ethtool: update set_rxfh to use get_num_rxrings helper Breno Leitao
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 11+ messages in thread
From: Breno Leitao @ 2025-09-05 17:07 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn
  Cc: netdev, linux-kernel, virtualization, Breno Leitao, jdamato,
	kernel-team

Add a new optional get_rxrings callback in ethtool_ops to allow drivers
to provide the number of RX rings directly without going through the
full get_rxnfc flow classification interface.

Modify ethtool_get_rxrings() to use get_rxrings() if available,
falling back to get_rxnfc() otherwise.

Signed-off-by: Breno Leitao <leitao@debian.org>
---
 include/linux/ethtool.h |  1 +
 net/ethtool/ioctl.c     | 25 +++++++++++++++++++++----
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index de5bd76a400ca..4f6da35a77eb1 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -1141,6 +1141,7 @@ struct ethtool_ops {
 				 struct ethtool_ringparam *,
 				 struct kernel_ethtool_ringparam *,
 				 struct netlink_ext_ack *);
+	int	(*get_rxrings)(struct net_device *dev);
 	void	(*get_pause_stats)(struct net_device *dev,
 				   struct ethtool_pause_stats *pause_stats);
 	void	(*get_pauseparam)(struct net_device *,
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 1a9ad47f60313..2f3dbef9eb712 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1208,6 +1208,22 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
 	return 0;
 }
 
+static int get_num_rxrings(struct net_device *dev)
+{
+	const struct ethtool_ops *ops = dev->ethtool_ops;
+	struct ethtool_rxnfc rx_rings;
+	int ret;
+
+	if (ops->get_rxrings)
+		return ops->get_rxrings(dev);
+
+	ret = ops->get_rxnfc(dev, &rx_rings, NULL);
+	if (ret < 0)
+		return ret;
+
+	return rx_rings.data;
+}
+
 static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
 						  u32 cmd,
 						  void __user *useraddr)
@@ -1217,16 +1233,17 @@ static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
 	const struct ethtool_ops *ops = dev->ethtool_ops;
 	int ret;
 
-	if (!ops->get_rxnfc)
+	if (!ops->get_rxnfc && !ops->get_rxrings)
 		return -EOPNOTSUPP;
 
 	ret = ethtool_rxnfc_copy_struct(cmd, &info, &info_size, useraddr);
 	if (ret)
 		return ret;
 
-	ret = ops->get_rxnfc(dev, &info, NULL);
-	if (ret < 0)
-		return ret;
+	if (WARN_ON_ONCE(info.cmd != ETHTOOL_GRXRINGS))
+		return -EOPNOTSUPP;
+
+	info.data = get_num_rxrings(dev);
 
 	return ethtool_rxnfc_copy_to_user(useraddr, &info, info_size, NULL);
 }

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH RFC net-next 5/7] net: ethtool: update set_rxfh to use get_num_rxrings helper
  2025-09-05 17:07 [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
                   ` (3 preceding siblings ...)
  2025-09-05 17:07 ` [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries Breno Leitao
@ 2025-09-05 17:07 ` Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 6/7] net: ethtool: update set_rxfh_indir " Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 7/7] net: virtio_net: add get_rxrings ethtool callback for RX ring queries Breno Leitao
  6 siblings, 0 replies; 11+ messages in thread
From: Breno Leitao @ 2025-09-05 17:07 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn
  Cc: netdev, linux-kernel, virtualization, Breno Leitao, jdamato,
	kernel-team

Modify ethtool_set_rxfh() to use the new get_num_rxrings() helper function
for retrieving the number of RX rings instead of directly calling
get_rxnfc with ETHTOOL_GRXRINGS.

This way, we can leverage the new helper if it is available in ethtool_ops.

Signed-off-by: Breno Leitao <leitao@debian.org>
---
 net/ethtool/ioctl.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 2f3dbef9eb712..daab20b392f7b 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1548,9 +1548,9 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
 	struct ethtool_rxfh_param rxfh_dev = {};
 	struct ethtool_rxfh_context *ctx = NULL;
 	struct netlink_ext_ack *extack = NULL;
-	struct ethtool_rxnfc rx_rings;
 	struct ethtool_rxfh rxfh;
 	bool create = false;
+	int num_rx_rings;
 	u8 *rss_config;
 	int ntf = 0;
 	int ret;
@@ -1611,10 +1611,11 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
 	if (!rss_config)
 		return -ENOMEM;
 
-	rx_rings.cmd = ETHTOOL_GRXRINGS;
-	ret = ops->get_rxnfc(dev, &rx_rings, NULL);
-	if (ret)
+	num_rx_rings = get_num_rxrings(dev);
+	if (num_rx_rings < 0) {
+		ret = num_rx_rings;
 		goto out_free;
+	}
 
 	/* rxfh.indir_size == 0 means reset the indir table to default (master
 	 * context) or delete the context (other RSS contexts).
@@ -1627,7 +1628,7 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
 		rxfh_dev.indir_size = dev_indir_size;
 		ret = ethtool_copy_validate_indir(rxfh_dev.indir,
 						  useraddr + rss_cfg_offset,
-						  rx_rings.data,
+						  num_rx_rings,
 						  rxfh.indir_size);
 		if (ret)
 			goto out_free;
@@ -1639,7 +1640,8 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
 			rxfh_dev.indir_size = dev_indir_size;
 			indir = rxfh_dev.indir;
 			for (i = 0; i < dev_indir_size; i++)
-				indir[i] = ethtool_rxfh_indir_default(i, rx_rings.data);
+				indir[i] =
+					ethtool_rxfh_indir_default(i, num_rx_rings);
 		} else {
 			rxfh_dev.rss_delete = true;
 		}

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH RFC net-next 6/7] net: ethtool: update set_rxfh_indir to use get_num_rxrings helper
  2025-09-05 17:07 [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
                   ` (4 preceding siblings ...)
  2025-09-05 17:07 ` [PATCH RFC net-next 5/7] net: ethtool: update set_rxfh to use get_num_rxrings helper Breno Leitao
@ 2025-09-05 17:07 ` Breno Leitao
  2025-09-05 17:07 ` [PATCH RFC net-next 7/7] net: virtio_net: add get_rxrings ethtool callback for RX ring queries Breno Leitao
  6 siblings, 0 replies; 11+ messages in thread
From: Breno Leitao @ 2025-09-05 17:07 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn
  Cc: netdev, linux-kernel, virtualization, Breno Leitao, jdamato,
	kernel-team

Modify ethtool_set_rxfh() to use the new get_num_rxrings() helper function
for retrieving the number of RX rings instead of directly calling
get_rxnfc with ETHTOOL_GRXRINGS.

This way, we can leverage the new helper if it is available in ethtool_ops.

Signed-off-by: Breno Leitao <leitao@debian.org>
---
 net/ethtool/ioctl.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index daab20b392f7b..b8d85bba48329 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1367,7 +1367,7 @@ static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
 	const struct ethtool_ops *ops = dev->ethtool_ops;
 	struct ethtool_rxfh_param rxfh_dev = {};
 	struct netlink_ext_ack *extack = NULL;
-	struct ethtool_rxnfc rx_rings;
+	int num_rx_rings;
 	u32 user_size, i;
 	int ret;
 	u32 ringidx_offset = offsetof(struct ethtool_rxfh_indir, ring_index[0]);
@@ -1393,20 +1393,21 @@ static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
 	if (!rxfh_dev.indir)
 		return -ENOMEM;
 
-	rx_rings.cmd = ETHTOOL_GRXRINGS;
-	ret = ops->get_rxnfc(dev, &rx_rings, NULL);
-	if (ret)
+	num_rx_rings = get_num_rxrings(dev);
+	if (num_rx_rings < 0) {
+		ret = num_rx_rings;
 		goto out;
+	}
 
 	if (user_size == 0) {
 		u32 *indir = rxfh_dev.indir;
 
 		for (i = 0; i < rxfh_dev.indir_size; i++)
-			indir[i] = ethtool_rxfh_indir_default(i, rx_rings.data);
+			indir[i] = ethtool_rxfh_indir_default(i, num_rx_rings);
 	} else {
 		ret = ethtool_copy_validate_indir(rxfh_dev.indir,
 						  useraddr + ringidx_offset,
-						  rx_rings.data,
+						  num_rx_rings,
 						  rxfh_dev.indir_size);
 		if (ret)
 			goto out;

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH RFC net-next 7/7] net: virtio_net: add get_rxrings ethtool callback for RX ring queries
  2025-09-05 17:07 [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
                   ` (5 preceding siblings ...)
  2025-09-05 17:07 ` [PATCH RFC net-next 6/7] net: ethtool: update set_rxfh_indir " Breno Leitao
@ 2025-09-05 17:07 ` Breno Leitao
  6 siblings, 0 replies; 11+ messages in thread
From: Breno Leitao @ 2025-09-05 17:07 UTC (permalink / raw)
  To: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn
  Cc: netdev, linux-kernel, virtualization, Breno Leitao, jdamato,
	kernel-team

Replace the existing virtnet_get_rxnfc callback with a dedicated
virtnet_get_rxrings implementation to provide the number of RX rings
directly via the new ethtool_ops get_rxrings pointer.

This simplifies the RX ring count retrieval and aligns virtio_net with
the new ethtool API for querying RX ring parameters.

Signed-off-by: Breno Leitao <leitao@debian.org>
---
 drivers/net/virtio_net.c | 15 +++------------
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 975bdc5dab84b..942ae55e8897d 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -5610,20 +5610,11 @@ static int virtnet_set_rxfh(struct net_device *dev,
 	return 0;
 }
 
-static int virtnet_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info, u32 *rule_locs)
+static int virtnet_get_rxrings(struct net_device *dev)
 {
 	struct virtnet_info *vi = netdev_priv(dev);
-	int rc = 0;
 
-	switch (info->cmd) {
-	case ETHTOOL_GRXRINGS:
-		info->data = vi->curr_queue_pairs;
-		break;
-	default:
-		rc = -EOPNOTSUPP;
-	}
-
-	return rc;
+	return vi->curr_queue_pairs;
 }
 
 static const struct ethtool_ops virtnet_ethtool_ops = {
@@ -5651,7 +5642,7 @@ static const struct ethtool_ops virtnet_ethtool_ops = {
 	.set_rxfh = virtnet_set_rxfh,
 	.get_rxfh_fields = virtnet_get_hashflow,
 	.set_rxfh_fields = virtnet_set_hashflow,
-	.get_rxnfc = virtnet_get_rxnfc,
+	.get_rxrings = virtnet_get_rxrings,
 };
 
 static void virtnet_get_queue_stats_rx(struct net_device *dev, int i,

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries
  2025-09-05 17:07 ` [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries Breno Leitao
@ 2025-09-05 23:42   ` Jakub Kicinski
  2025-09-05 23:44     ` Jakub Kicinski
  2025-09-08 11:51   ` Simon Horman
  1 sibling, 1 reply; 11+ messages in thread
From: Jakub Kicinski @ 2025-09-05 23:42 UTC (permalink / raw)
  To: Breno Leitao
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn, netdev, linux-kernel,
	virtualization, jdamato, kernel-team

On Fri, 05 Sep 2025 10:07:23 -0700 Breno Leitao wrote:
> +	int	(*get_rxrings)(struct net_device *dev);

I think this can return u32..
The drivers can't possibly fail to know how many queues they have.
We already do that for get_rxfh_*_size callbacks

>  	void	(*get_pause_stats)(struct net_device *dev,
>  				   struct ethtool_pause_stats *pause_stats);
>  	void	(*get_pauseparam)(struct net_device *,
> diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
> index 1a9ad47f60313..2f3dbef9eb712 100644
> --- a/net/ethtool/ioctl.c
> +++ b/net/ethtool/ioctl.c
> @@ -1208,6 +1208,22 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
>  	return 0;
>  }
>  
> +static int get_num_rxrings(struct net_device *dev)

This one has to indeed keep returning int, until we get rid of
get_rxnfc fallback completely.

> +{
> +	const struct ethtool_ops *ops = dev->ethtool_ops;
> +	struct ethtool_rxnfc rx_rings;
> +	int ret;
> +
> +	if (ops->get_rxrings)
> +		return ops->get_rxrings(dev);
> +
> +	ret = ops->get_rxnfc(dev, &rx_rings, NULL);
> +	if (ret < 0)
> +		return ret;
> +
> +	return rx_rings.data;
> +}
> +
>  static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
>  						  u32 cmd,
>  						  void __user *useraddr)
> @@ -1217,16 +1233,17 @@ static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
>  	const struct ethtool_ops *ops = dev->ethtool_ops;
>  	int ret;
>  
> -	if (!ops->get_rxnfc)
> +	if (!ops->get_rxnfc && !ops->get_rxrings)
>  		return -EOPNOTSUPP;
>  
>  	ret = ethtool_rxnfc_copy_struct(cmd, &info, &info_size, useraddr);
>  	if (ret)
>  		return ret;
>  
> -	ret = ops->get_rxnfc(dev, &info, NULL);
> -	if (ret < 0)
> -		return ret;
> +	if (WARN_ON_ONCE(info.cmd != ETHTOOL_GRXRINGS))
> +		return -EOPNOTSUPP;

I think malicious user space can trigger this warning with a TOCTOU
race. Let's skip the check, it's not really needed?

> +	info.data = get_num_rxrings(dev);

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries
  2025-09-05 23:42   ` Jakub Kicinski
@ 2025-09-05 23:44     ` Jakub Kicinski
  0 siblings, 0 replies; 11+ messages in thread
From: Jakub Kicinski @ 2025-09-05 23:44 UTC (permalink / raw)
  To: Breno Leitao
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
	Simon Horman, Michael S. Tsirkin, Jason Wang, Xuan Zhuo,
	Eugenio Pérez, Andrew Lunn, netdev, linux-kernel,
	virtualization, jdamato, kernel-team

On Fri, 5 Sep 2025 16:42:53 -0700 Jakub Kicinski wrote:
> On Fri, 05 Sep 2025 10:07:23 -0700 Breno Leitao wrote:
> > +	int	(*get_rxrings)(struct net_device *dev);  
> 
> I think this can return u32..

Two more things, actually - get_rx_ring_count would sound a little bit
more in line with the get_rxfh_*_size helpers. And let's put it
somewhere closer to the rxfh callbacks. It's actually mostly used by
RXFH AKA RSS code.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries
  2025-09-05 17:07 ` [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries Breno Leitao
  2025-09-05 23:42   ` Jakub Kicinski
@ 2025-09-08 11:51   ` Simon Horman
  1 sibling, 0 replies; 11+ messages in thread
From: Simon Horman @ 2025-09-08 11:51 UTC (permalink / raw)
  To: Breno Leitao
  Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni, kuba,
	Michael S. Tsirkin, Jason Wang, Xuan Zhuo, Eugenio Pérez,
	Andrew Lunn, netdev, linux-kernel, virtualization, jdamato,
	kernel-team

On Fri, Sep 05, 2025 at 10:07:23AM -0700, Breno Leitao wrote:
> Add a new optional get_rxrings callback in ethtool_ops to allow drivers
> to provide the number of RX rings directly without going through the
> full get_rxnfc flow classification interface.
> 
> Modify ethtool_get_rxrings() to use get_rxrings() if available,
> falling back to get_rxnfc() otherwise.
> 
> Signed-off-by: Breno Leitao <leitao@debian.org>
> ---
>  include/linux/ethtool.h |  1 +
>  net/ethtool/ioctl.c     | 25 +++++++++++++++++++++----
>  2 files changed, 22 insertions(+), 4 deletions(-)
> 
> diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
> index de5bd76a400ca..4f6da35a77eb1 100644
> --- a/include/linux/ethtool.h
> +++ b/include/linux/ethtool.h
> @@ -1141,6 +1141,7 @@ struct ethtool_ops {
>  				 struct ethtool_ringparam *,
>  				 struct kernel_ethtool_ringparam *,
>  				 struct netlink_ext_ack *);
> +	int	(*get_rxrings)(struct net_device *dev);

Hi Breno,

Please also add get_rxrings to the Kernel doc for struct ethtool_ops.

>  	void	(*get_pause_stats)(struct net_device *dev,
>  				   struct ethtool_pause_stats *pause_stats);
>  	void	(*get_pauseparam)(struct net_device *,

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2025-09-08 11:51 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-05 17:07 [PATCH RFC net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
2025-09-05 17:07 ` [PATCH RFC net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
2025-09-05 17:07 ` [PATCH RFC net-next 2/7] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl Breno Leitao
2025-09-05 17:07 ` [PATCH RFC net-next 3/7] net: ethtool: remove the duplicated handling from ethtool_get_rxrings Breno Leitao
2025-09-05 17:07 ` [PATCH RFC net-next 4/7] net: ethtool: add get_rxrings callback to optimize RX ring queries Breno Leitao
2025-09-05 23:42   ` Jakub Kicinski
2025-09-05 23:44     ` Jakub Kicinski
2025-09-08 11:51   ` Simon Horman
2025-09-05 17:07 ` [PATCH RFC net-next 5/7] net: ethtool: update set_rxfh to use get_num_rxrings helper Breno Leitao
2025-09-05 17:07 ` [PATCH RFC net-next 6/7] net: ethtool: update set_rxfh_indir " Breno Leitao
2025-09-05 17:07 ` [PATCH RFC net-next 7/7] net: virtio_net: add get_rxrings ethtool callback for RX ring queries Breno Leitao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.