* [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks
@ 2025-09-15 10:47 Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 1/8] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
` (8 more replies)
0 siblings, 9 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
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 implements .get_rxnfc callback just to report the ring
count, so, having a proper callback makes sense and simplify .get_rxnfc
(in some cases remove it completely).
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>
Tested-by: Lei Yang <leiyang@redhat.com>
---
Changes in v3:
- Make ethtool_get_rx_ring_count() non static and use it in rss_set_prep_indir()
- Check return function of ethtool_get_rx_ring_count() in
ethtool_get_rx_ring_count() (Jakub)
- Link to v2: https://lore.kernel.org/r/20250912-gxrings-v2-0-3c7a60bbeebf@debian.org
Changes in v2:
- rename get_num_rxrings() to ethtool_get_rx_ring_count() (Jakub)
- initialize struct ethtool_rxnfc() (Jakub)
- Link to v1: https://lore.kernel.org/r/20250909-gxrings-v1-0-634282f06a54@debian.org
---
Changes v1 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 (8):
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 ethtool_get_rx_ring_count helper
net: ethtool: update set_rxfh_indir to use ethtool_get_rx_ring_count helper
net: ethtool: use the new helper in rss_set_prep_indir()
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/common.h | 2 ++
net/ethtool/ioctl.c | 88 ++++++++++++++++++++++++++++++++++++++----------
net/ethtool/rss.c | 15 ++++-----
5 files changed, 84 insertions(+), 38 deletions(-)
---
base-commit: 5b5ba63a54cc7cb050fa734dbf495ffd63f9cbf7
change-id: 20250905-gxrings-a2ec22ee2aec
Best regards,
--
Breno Leitao <leitao@debian.org>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH net-next v3 1/8] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
@ 2025-09-15 10:47 ` Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 2/8] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl Breno Leitao
` (7 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
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] 12+ messages in thread
* [PATCH net-next v3 2/8] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 1/8] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
@ 2025-09-15 10:47 ` Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 3/8] net: ethtool: remove the duplicated handling from ethtool_get_rxrings Breno Leitao
` (6 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
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] 12+ messages in thread
* [PATCH net-next v3 3/8] net: ethtool: remove the duplicated handling from ethtool_get_rxrings
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 1/8] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 2/8] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl Breno Leitao
@ 2025-09-15 10:47 ` Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 4/8] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries Breno Leitao
` (5 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
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 | 33 ++++++++++-----------------------
1 file changed, 10 insertions(+), 23 deletions(-)
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 4214ab33c3c81..a0f3de76cea03 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1212,52 +1212,39 @@ 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;
+ struct ethtool_rxnfc info;
+ size_t info_size;
int ret;
- void *rule_buf = NULL;
if (!ops->get_rxnfc)
return -EOPNOTSUPP;
+ info_size = sizeof(info);
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);
+ 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,
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;
+ struct ethtool_rxnfc info;
void *rule_buf = NULL;
+ size_t info_size;
+ int ret;
if (!ops->get_rxnfc)
return -EOPNOTSUPP;
+ info_size = sizeof(info);
ret = ethtool_rxnfc_copy_struct(cmd, &info, &info_size, useraddr);
if (ret)
return ret;
--
2.47.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next v3 4/8] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
` (2 preceding siblings ...)
2025-09-15 10:47 ` [PATCH net-next v3 3/8] net: ethtool: remove the duplicated handling from ethtool_get_rxrings Breno Leitao
@ 2025-09-15 10:47 ` Breno Leitao
2025-09-16 16:12 ` Jakub Kicinski
2025-09-16 16:18 ` Jakub Kicinski
2025-09-15 10:47 ` [PATCH net-next v3 5/8] net: ethtool: update set_rxfh to use ethtool_get_rx_ring_count helper Breno Leitao
` (4 subsequent siblings)
8 siblings, 2 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
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.
Create ethtool_get_rx_ring_count() to use .get_rx_ring_count if
available, falling back to get_rxnfc() otherwise. It needs to be
non-static, given it will be called by other ethtool functions laters,
as those calling get_rxfh().
Signed-off-by: Breno Leitao <leitao@debian.org>
---
include/linux/ethtool.h | 2 ++
net/ethtool/common.h | 2 ++
net/ethtool/ioctl.c | 26 ++++++++++++++++++++++++--
3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index d7d757e72554e..c869b7f8bce8b 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/common.h b/net/ethtool/common.h
index c4d084dde5bf4..1609cf4e53ebb 100644
--- a/net/ethtool/common.h
+++ b/net/ethtool/common.h
@@ -54,6 +54,8 @@ void ethtool_ringparam_get_cfg(struct net_device *dev,
struct kernel_ethtool_ringparam *kparam,
struct netlink_ext_ack *extack);
+int ethtool_get_rx_ring_count(struct net_device *dev);
+
int __ethtool_get_ts_info(struct net_device *dev, struct kernel_ethtool_ts_info *info);
int ethtool_get_ts_info_by_phc(struct net_device *dev,
struct kernel_ethtool_ts_info *info,
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index a0f3de76cea03..5b17e71cb3032 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1208,6 +1208,26 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
return 0;
}
+int ethtool_get_rx_ring_count(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);
+
+ if (!ops->get_rxnfc)
+ return -EOPNOTSUPP;
+
+ rx_rings.cmd = ETHTOOL_GRXRINGS;
+ 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,7 +1237,7 @@ static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
size_t info_size;
int ret;
- if (!ops->get_rxnfc)
+ if (!ops->get_rxnfc && !ops->get_rx_ring_count)
return -EOPNOTSUPP;
info_size = sizeof(info);
@@ -1225,10 +1245,12 @@ static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
if (ret)
return ret;
- ret = ops->get_rxnfc(dev, &info, NULL);
+ ret = ethtool_get_rx_ring_count(dev);
if (ret < 0)
return ret;
+ info.data = ret;
+
return ethtool_rxnfc_copy_to_user(useraddr, &info, info_size, NULL);
}
--
2.47.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next v3 5/8] net: ethtool: update set_rxfh to use ethtool_get_rx_ring_count helper
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
` (3 preceding siblings ...)
2025-09-15 10:47 ` [PATCH net-next v3 4/8] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries Breno Leitao
@ 2025-09-15 10:47 ` Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 6/8] net: ethtool: update set_rxfh_indir " Breno Leitao
` (3 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
kernel-team
Modify ethtool_set_rxfh() to use the new ethtool_get_rx_ring_count()
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 5b17e71cb3032..2fcb11e7505f4 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1555,9 +1555,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;
@@ -1618,10 +1618,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 = ethtool_get_rx_ring_count(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).
@@ -1634,7 +1635,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;
@@ -1646,7 +1647,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] 12+ messages in thread
* [PATCH net-next v3 6/8] net: ethtool: update set_rxfh_indir to use ethtool_get_rx_ring_count helper
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
` (4 preceding siblings ...)
2025-09-15 10:47 ` [PATCH net-next v3 5/8] net: ethtool: update set_rxfh to use ethtool_get_rx_ring_count helper Breno Leitao
@ 2025-09-15 10:47 ` Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 7/8] net: ethtool: use the new helper in rss_set_prep_indir() Breno Leitao
` (2 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
kernel-team
Modify ethtool_set_rxfh() to use the new ethtool_get_rx_ring_count()
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 2fcb11e7505f4..30932555618b0 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1374,7 +1374,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]);
@@ -1400,20 +1400,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 = ethtool_get_rx_ring_count(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] 12+ messages in thread
* [PATCH net-next v3 7/8] net: ethtool: use the new helper in rss_set_prep_indir()
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
` (5 preceding siblings ...)
2025-09-15 10:47 ` [PATCH net-next v3 6/8] net: ethtool: update set_rxfh_indir " Breno Leitao
@ 2025-09-15 10:47 ` Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 8/8] net: virtio_net: add get_rxrings ethtool callback for RX ring queries Breno Leitao
2025-09-17 6:40 ` [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Lei Yang
8 siblings, 0 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
kernel-team
Refactor rss_set_prep_indir() to utilize the new
ethtool_get_rx_ring_count() helper for determining the number of RX
rings, replacing the direct use of get_rxnfc with ETHTOOL_GRXRINGS.
This ensures compatibility with both legacy and new ethtool_ops
interfaces by transparently multiplexing between them.
Signed-off-by: Breno Leitao <leitao@debian.org>
---
| 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
--git a/net/ethtool/rss.c b/net/ethtool/rss.c
index 202d95e8bf3e1..4dced53be4b3b 100644
--- a/net/ethtool/rss.c
+++ b/net/ethtool/rss.c
@@ -620,23 +620,22 @@ rss_set_prep_indir(struct net_device *dev, struct genl_info *info,
struct rss_reply_data *data, struct ethtool_rxfh_param *rxfh,
bool *reset, bool *mod)
{
- const struct ethtool_ops *ops = dev->ethtool_ops;
struct netlink_ext_ack *extack = info->extack;
struct nlattr **tb = info->attrs;
- struct ethtool_rxnfc rx_rings;
size_t alloc_size;
+ int num_rx_rings;
u32 user_size;
int i, err;
if (!tb[ETHTOOL_A_RSS_INDIR])
return 0;
- if (!data->indir_size || !ops->get_rxnfc)
+ if (!data->indir_size)
return -EOPNOTSUPP;
- rx_rings.cmd = ETHTOOL_GRXRINGS;
- err = ops->get_rxnfc(dev, &rx_rings, NULL);
- if (err)
+ err = ethtool_get_rx_ring_count(dev);
+ if (err < 0)
return err;
+ num_rx_rings = err;
if (nla_len(tb[ETHTOOL_A_RSS_INDIR]) % 4) {
NL_SET_BAD_ATTR(info->extack, tb[ETHTOOL_A_RSS_INDIR]);
@@ -665,7 +664,7 @@ rss_set_prep_indir(struct net_device *dev, struct genl_info *info,
nla_memcpy(rxfh->indir, tb[ETHTOOL_A_RSS_INDIR], alloc_size);
for (i = 0; i < user_size; i++) {
- if (rxfh->indir[i] < rx_rings.data)
+ if (rxfh->indir[i] < num_rx_rings)
continue;
NL_SET_ERR_MSG_ATTR_FMT(extack, tb[ETHTOOL_A_RSS_INDIR],
@@ -682,7 +681,7 @@ rss_set_prep_indir(struct net_device *dev, struct genl_info *info,
} else {
for (i = 0; i < data->indir_size; i++)
rxfh->indir[i] =
- ethtool_rxfh_indir_default(i, rx_rings.data);
+ ethtool_rxfh_indir_default(i, num_rx_rings);
}
*mod |= memcmp(rxfh->indir, data->indir_table, data->indir_size);
--
2.47.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next v3 8/8] net: virtio_net: add get_rxrings ethtool callback for RX ring queries
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
` (6 preceding siblings ...)
2025-09-15 10:47 ` [PATCH net-next v3 7/8] net: ethtool: use the new helper in rss_set_prep_indir() Breno Leitao
@ 2025-09-15 10:47 ` Breno Leitao
2025-09-17 6:40 ` [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Lei Yang
8 siblings, 0 replies; 12+ messages in thread
From: Breno Leitao @ 2025-09-15 10:47 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, Lei Yang,
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 06708c9a979e6..7da5a37917e92 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -5609,20 +5609,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 = {
@@ -5650,7 +5641,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] 12+ messages in thread
* Re: [PATCH net-next v3 4/8] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries
2025-09-15 10:47 ` [PATCH net-next v3 4/8] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries Breno Leitao
@ 2025-09-16 16:12 ` Jakub Kicinski
2025-09-16 16:18 ` Jakub Kicinski
1 sibling, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2025-09-16 16:12 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, Lei Yang, kernel-team
On Mon, 15 Sep 2025 03:47:29 -0700 Breno Leitao wrote:
> --- a/net/ethtool/ioctl.c
> +++ b/net/ethtool/ioctl.c
> @@ -1208,6 +1208,26 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
> return 0;
> }
>
> +int ethtool_get_rx_ring_count(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);
> +
> + if (!ops->get_rxnfc)
> + return -EOPNOTSUPP;
> +
> + rx_rings.cmd = ETHTOOL_GRXRINGS;
> + ret = ops->get_rxnfc(dev, &rx_rings, NULL);
> + if (ret < 0)
> + return ret;
> +
> + return rx_rings.data;
> +}
This gets called from netlink, so I think it needs to be in common.c
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH net-next v3 4/8] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries
2025-09-15 10:47 ` [PATCH net-next v3 4/8] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries Breno Leitao
2025-09-16 16:12 ` Jakub Kicinski
@ 2025-09-16 16:18 ` Jakub Kicinski
1 sibling, 0 replies; 12+ messages in thread
From: Jakub Kicinski @ 2025-09-16 16:18 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, Lei Yang, kernel-team
On Mon, 15 Sep 2025 03:47:29 -0700 Breno Leitao wrote:
> @@ -1217,7 +1237,7 @@ static noinline_for_stack int ethtool_get_rxrings(struct net_device *dev,
> size_t info_size;
> int ret;
>
> - if (!ops->get_rxnfc)
> + if (!ops->get_rxnfc && !ops->get_rx_ring_count)
> return -EOPNOTSUPP;
There's inconsistency in how we check for the ops being present.
Here we check for get_rxnfc and the new callback.
But ethtool_set_rxfh() and ethtool_set_rxfh_indir() are only checking
for get_rxnfc. I suppose we can remove the explicit ops checks and
let ethtool_get_rx_ring_count() return EOPNOTSUPP?
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
` (7 preceding siblings ...)
2025-09-15 10:47 ` [PATCH net-next v3 8/8] net: virtio_net: add get_rxrings ethtool callback for RX ring queries Breno Leitao
@ 2025-09-17 6:40 ` Lei Yang
8 siblings, 0 replies; 12+ messages in thread
From: Lei Yang @ 2025-09-17 6:40 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 series of patches v3 with virtio-net regression tests,
everything works fine.
Tested-by: Lei Yang <leiyang@redhat.com>
On Mon, Sep 15, 2025 at 6:47 PM 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 implements .get_rxnfc callback just to report the ring
> count, so, having a proper callback makes sense and simplify .get_rxnfc
> (in some cases remove it completely).
>
> 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>
> Tested-by: Lei Yang <leiyang@redhat.com>
> ---
> Changes in v3:
> - Make ethtool_get_rx_ring_count() non static and use it in rss_set_prep_indir()
> - Check return function of ethtool_get_rx_ring_count() in
> ethtool_get_rx_ring_count() (Jakub)
> - Link to v2: https://lore.kernel.org/r/20250912-gxrings-v2-0-3c7a60bbeebf@debian.org
>
> Changes in v2:
> - rename get_num_rxrings() to ethtool_get_rx_ring_count() (Jakub)
> - initialize struct ethtool_rxnfc() (Jakub)
> - Link to v1: https://lore.kernel.org/r/20250909-gxrings-v1-0-634282f06a54@debian.org
> ---
> Changes v1 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 (8):
> 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 ethtool_get_rx_ring_count helper
> net: ethtool: update set_rxfh_indir to use ethtool_get_rx_ring_count helper
> net: ethtool: use the new helper in rss_set_prep_indir()
> 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/common.h | 2 ++
> net/ethtool/ioctl.c | 88 ++++++++++++++++++++++++++++++++++++++----------
> net/ethtool/rss.c | 15 ++++-----
> 5 files changed, 84 insertions(+), 38 deletions(-)
> ---
> base-commit: 5b5ba63a54cc7cb050fa734dbf495ffd63f9cbf7
> change-id: 20250905-gxrings-a2ec22ee2aec
>
> Best regards,
> --
> Breno Leitao <leitao@debian.org>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2025-09-17 6:41 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-15 10:47 [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 1/8] net: ethtool: pass the num of RX rings directly to ethtool_copy_validate_indir Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 2/8] net: ethtool: add support for ETHTOOL_GRXRINGS ioctl Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 3/8] net: ethtool: remove the duplicated handling from ethtool_get_rxrings Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 4/8] net: ethtool: add get_rx_ring_count callback to optimize RX ring queries Breno Leitao
2025-09-16 16:12 ` Jakub Kicinski
2025-09-16 16:18 ` Jakub Kicinski
2025-09-15 10:47 ` [PATCH net-next v3 5/8] net: ethtool: update set_rxfh to use ethtool_get_rx_ring_count helper Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 6/8] net: ethtool: update set_rxfh_indir " Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 7/8] net: ethtool: use the new helper in rss_set_prep_indir() Breno Leitao
2025-09-15 10:47 ` [PATCH net-next v3 8/8] net: virtio_net: add get_rxrings ethtool callback for RX ring queries Breno Leitao
2025-09-17 6:40 ` [PATCH net-next v3 0/8] net: ethtool: add dedicated GRXRINGS driver callbacks Lei Yang
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.