On Mon, Jan 19, 2026 at 03:07:12AM -0800, Breno Leitao wrote:
Hello Jakub,
On Sat, Jan 17, 2026 at 06:15:51PM -0800, Jakub Kicinski wrote:
quoted
On Thu, 15 Jan 2026 06:37:48 -0800 Breno Leitao wrote:
quoted
-static int be_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd,
- u32 *rule_locs)
-{
- struct be_adapter *adapter = netdev_priv(netdev);
-
- if (!be_multi_rxq(adapter)) {
- dev_info(&adapter->pdev->dev,
- "ethtool::get_rxnfc: RX flow hashing is disabled\n");
- return -EINVAL;
- }
I think we need to add this check to set_rxfh now. The error coming
from get_rxnfc/GRXRINGS effectively shielded the driver from set_rxfh
calls ever happening when there's only 1 ring. Now they will happen.
You are absolutely correct. The ethtool core calls
get_rxnfc(ETHTOOL_GRXRINGS) _before_ allowing RSS configuration via
set_rxfh, and if it fails, ethtool_set_rxfh() will fail as well. And
with the current change, ethtool_set_rxfh() will not fail if the adapter
is not multi-queue.
Upon further consideration, should we implement this limitation directly within
the ethtool infrastructure?
Something as:
Author: Breno Leitao [off-list ref]
Date: Mon Jan 19 03:25:05 2026 -0800
ethtool: reject RSS configuration on single-queue devices
Configuring RSS (Receive Side Scaling) makes no sense when the device
only has a single RX queue - there is nothing to distribute traffic
across. The indirection table would just map everything to queue 0.
Add explicit checks in ethtool_set_rxfh_indir() and ethtool_set_rxfh()
to reject RSS configuration when the device reports fewer than 2 RX rings.
This protects all drivers uniformly at the core level.
Signed-off-by: Breno Leitao [off-list ref]
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 9431e305b233..899864e96aab 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -1380,6 +1380,10 @@ static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
ret = num_rx_rings;
goto out;
}
+ if (num_rx_rings < 2) {
+ ret = -EOPNOTSUPP;
+ goto out;
+ }
if (user_size == 0) {
u32 *indir = rxfh_dev.indir;@@ -1599,6 +1603,10 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
ret = num_rx_rings;
goto out_free;
}
+ if (num_rx_rings < 2) {
+ ret = -EOPNOTSUPP;
+ goto out_free;
+ }