netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks
@ 2025-09-09 20:23 Breno Leitao
  2025-09-09 20:23 ` [PATCH net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
                   ` (7 more replies)
  0 siblings, 8 replies; 10+ messages in thread
From: Breno Leitao @ 2025-09-09 20:23 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, kernel-team

This patchset introduces a new dedicated ethtool_ops callback,
.get_rx_ring_count, 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>
---
Changes from RFC:
- Renaming and changing the return type of .get_rxrings() callback (Jakub)
- Add the docstring format for the new callback (Simon)
- Remove the unecessary WARN_ONCE() (Jakub)
- Link to RFC: https://lore.kernel.org/r/20250905-gxrings-v1-0-984fc471f28f@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_rx_ring_count 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  |  2 ++
 net/ethtool/ioctl.c      | 72 ++++++++++++++++++++++++++++++++++++++----------
 3 files changed, 62 insertions(+), 27 deletions(-)
---
base-commit: 9f0730b063b436938ebb6371aecb12ec6ed896e9
change-id: 20250905-gxrings-a2ec22ee2aec

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


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

* [PATCH net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir
  2025-09-09 20:23 [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
@ 2025-09-09 20:23 ` Breno Leitao
  2025-09-09 20:24 ` [PATCH net-next 2/7] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl Breno Leitao
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Breno Leitao @ 2025-09-09 20:23 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, 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] 10+ messages in thread

* [PATCH net-next 2/7] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl
  2025-09-09 20:23 [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
  2025-09-09 20:23 ` [PATCH net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
@ 2025-09-09 20:24 ` Breno Leitao
  2025-09-09 20:24 ` [PATCH net-next 3/7] net: ethtool: remove the duplicated handling from ethtool_get_rxrings Breno Leitao
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Breno Leitao @ 2025-09-09 20:24 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, 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] 10+ messages in thread

* [PATCH net-next 3/7] net: ethtool: remove the duplicated handling from ethtool_get_rxrings
  2025-09-09 20:23 [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
  2025-09-09 20:23 ` [PATCH net-next 1/7] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
  2025-09-09 20:24 ` [PATCH net-next 2/7] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl Breno Leitao
@ 2025-09-09 20:24 ` Breno Leitao
  2025-09-09 20:24 ` [PATCH net-next 4/7] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries Breno Leitao
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Breno Leitao @ 2025-09-09 20:24 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, 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] 10+ messages in thread

* [PATCH net-next 4/7] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries
  2025-09-09 20:23 [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
                   ` (2 preceding siblings ...)
  2025-09-09 20:24 ` [PATCH net-next 3/7] net: ethtool: remove the duplicated handling from ethtool_get_rxrings Breno Leitao
@ 2025-09-09 20:24 ` Breno Leitao
  2025-09-10 16:10   ` Jakub Kicinski
  2025-09-09 20:24 ` [PATCH net-next 5/7] net: ethtool: update set_rxfh to use get_num_rxrings helper Breno Leitao
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 10+ messages in thread
From: Breno Leitao @ 2025-09-09 20:24 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, kernel-team

Add a new optional get_rx_ring_count 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_rx_ring_count() if available,
falling back to get_rxnfc() otherwise.

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

diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index de5bd76a400ca..2d91fd3102c14 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -968,6 +968,7 @@ struct kernel_ethtool_ts_info {
  * @reset: Reset (part of) the device, as specified by a bitmask of
  *	flags from &enum ethtool_reset_flags.  Returns a negative
  *	error code or zero.
+ * @get_rx_ring_count: Return the number of RX rings
  * @get_rxfh_key_size: Get the size of the RX flow hash key.
  *	Returns zero if not supported for this specific device.
  * @get_rxfh_indir_size: Get the size of the RX flow hash indirection table.
@@ -1162,6 +1163,7 @@ struct ethtool_ops {
 	int	(*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *);
 	int	(*flash_device)(struct net_device *, struct ethtool_flash *);
 	int	(*reset)(struct net_device *, u32 *);
+	u32	(*get_rx_ring_count)(struct net_device *dev);
 	u32	(*get_rxfh_key_size)(struct net_device *);
 	u32	(*get_rxfh_indir_size)(struct net_device *);
 	int	(*get_rxfh)(struct net_device *, struct ethtool_rxfh_param *);
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 1a9ad47f60313..aba483bc9fd85 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_rx_ring_count)
+		return ops->get_rx_ring_count(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,14 @@ 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_rx_ring_count)
 		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;
+	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] 10+ messages in thread

* [PATCH net-next 5/7] net: ethtool: update set_rxfh to use get_num_rxrings helper
  2025-09-09 20:23 [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
                   ` (3 preceding siblings ...)
  2025-09-09 20:24 ` [PATCH net-next 4/7] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries Breno Leitao
@ 2025-09-09 20:24 ` Breno Leitao
  2025-09-09 20:24 ` [PATCH net-next 6/7] net: ethtool: update set_rxfh_indir " Breno Leitao
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Breno Leitao @ 2025-09-09 20:24 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, 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 aba483bc9fd85..227083a8ab860 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1545,9 +1545,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;
@@ -1608,10 +1608,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).
@@ -1624,7 +1625,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;
@@ -1636,7 +1637,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] 10+ messages in thread

* [PATCH net-next 6/7] net: ethtool: update set_rxfh_indir to use get_num_rxrings helper
  2025-09-09 20:23 [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
                   ` (4 preceding siblings ...)
  2025-09-09 20:24 ` [PATCH net-next 5/7] net: ethtool: update set_rxfh to use get_num_rxrings helper Breno Leitao
@ 2025-09-09 20:24 ` Breno Leitao
  2025-09-09 20:24 ` [PATCH net-next 7/7] net: virtio_net: add get_rxrings ethtool callback for RX ring queries Breno Leitao
  2025-09-11 13:46 ` [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Lei Yang
  7 siblings, 0 replies; 10+ messages in thread
From: Breno Leitao @ 2025-09-09 20:24 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, 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 227083a8ab860..752f185d2d7ea 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1364,7 +1364,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]);
@@ -1390,20 +1390,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] 10+ messages in thread

* [PATCH net-next 7/7] net: virtio_net: add get_rxrings ethtool callback for RX ring queries
  2025-09-09 20:23 [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
                   ` (5 preceding siblings ...)
  2025-09-09 20:24 ` [PATCH net-next 6/7] net: ethtool: update set_rxfh_indir " Breno Leitao
@ 2025-09-09 20:24 ` Breno Leitao
  2025-09-11 13:46 ` [PATCH net-next 0/7] net: ethtool: add dedicated GRXRINGS driver callbacks Lei Yang
  7 siblings, 0 replies; 10+ messages in thread
From: Breno Leitao @ 2025-09-09 20:24 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, 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_rx_ring_count 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..e35b6ef015c05 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 u32 virtnet_get_rx_ring_count(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_rx_ring_count = virtnet_get_rx_ring_count,
 };
 
 static void virtnet_get_queue_stats_rx(struct net_device *dev, int i,

-- 
2.47.3


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

* Re: [PATCH net-next 4/7] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries
  2025-09-09 20:24 ` [PATCH net-next 4/7] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries Breno Leitao
@ 2025-09-10 16:10   ` Jakub Kicinski
  0 siblings, 0 replies; 10+ messages in thread
From: Jakub Kicinski @ 2025-09-10 16:10 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, kernel-team

On Tue, 09 Sep 2025 13:24:02 -0700 Breno Leitao wrote:
> +static int get_num_rxrings(struct net_device *dev)

ethtool_get_rx_ring_count()

> +{
> +	const struct ethtool_ops *ops = dev->ethtool_ops;
> +	struct ethtool_rxnfc rx_rings;

You need to initialize this..

> +	int ret;
> +
> +	if (ops->get_rx_ring_count)
> +		return ops->get_rx_ring_count(dev);
> +
> +	ret = ops->get_rxnfc(dev, &rx_rings, NULL);
> +	if (ret < 0)
> +		return ret;
-- 
pw-bot: cr

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

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

Tested this patch with virtio-net regression tests, everything works fine.

Tested-by: Lei Yang <leiyang@redhat.com>


On Wed, Sep 10, 2025 at 4:24 AM Breno Leitao <leitao@debian.org> wrote:
>
> This patchset introduces a new dedicated ethtool_ops callback,
> .get_rx_ring_count, 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>
> ---
> Changes from RFC:
> - Renaming and changing the return type of .get_rxrings() callback (Jakub)
> - Add the docstring format for the new callback (Simon)
> - Remove the unecessary WARN_ONCE() (Jakub)
> - Link to RFC: https://lore.kernel.org/r/20250905-gxrings-v1-0-984fc471f28f@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_rx_ring_count 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  |  2 ++
>  net/ethtool/ioctl.c      | 72 ++++++++++++++++++++++++++++++++++++++----------
>  3 files changed, 62 insertions(+), 27 deletions(-)
> ---
> base-commit: 9f0730b063b436938ebb6371aecb12ec6ed896e9
> change-id: 20250905-gxrings-a2ec22ee2aec
>
> Best regards,
> --
> Breno Leitao <leitao@debian.org>
>
>


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

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

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).