Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ixgbe: Enable setting RSS table to default values

ethtool uses `ETHTOOL_GRXRINGS` to compute how many queues are supported
by RSS. The driver should return the smaller of either:
- The maximum number of RSS queues the device supports, OR
- The number of RX queues configured

Prior to this change, running `ethtool -X $iface default` fails if the
number of queues configured is larger than the number supported by RSS,
even though changing the queue count correctly resets the flowhash to
use all supported queues.

Other drivers (for example, i40e) will succeed but the flow hash will
reset to support the maximum number of queues supported by RSS, even if
that amount is smaller than the configured amount.

Prior to this change:

$ sudo ethtool -L eth1 combined 20
$ sudo ethtool -x eth1
RX flow hash indirection table for eth1 with 20 RX ring(s):
0: 0 1 2 3 4 5 6 7
8: 8 9 10 11 12 13 14 15
16: 0 1 2 3 4 5 6 7
24: 8 9 10 11 12 13 14 15
32: 0 1 2 3 4 5 6 7
...

You can see that the flowhash was correctly set to use the maximum
number of queues supported by the driver (16).

However, asking the NIC to reset to "default" fails:

$ sudo ethtool -X eth1 default
Cannot set RX flow hash configuration: Invalid argument

After this change, the flowhash can be reset to default which will use
all of the available RSS queues (16) or the configured queue count,
whichever is smaller.

Starting with eth1 which has 10 queues and a flowhash distributing to
all 10 queues:

$ sudo ethtool -x eth1
RX flow hash indirection table for eth1 with 10 RX ring(s):
0: 0 1 2 3 4 5 6 7
8: 8 9 0 1 2 3 4 5
16: 6 7 8 9 0 1 2 3
...

Increasing the queue count to 48 resets the flowhash to distribute to 16
queues, as it did before this patch:

$ sudo ethtool -L eth1 combined 48
$ sudo ethtool -x eth1
RX flow hash indirection table for eth1 with 16 RX ring(s):
0: 0 1 2 3 4 5 6 7
8: 8 9 10 11 12 13 14 15
16: 0 1 2 3 4 5 6 7
...

Due to the other bugfix in this series, the flowhash can be set to use
queues 0-5:

$ sudo ethtool -X eth1 equal 5
$ sudo ethtool -x eth1
RX flow hash indirection table for eth1 with 16 RX ring(s):
0: 0 1 2 3 4 0 1 2
8: 3 4 0 1 2 3 4 0
16: 1 2 3 4 0 1 2 3
...

Due to this bugfix, the flowhash can be reset to default and use 16
queues:

$ sudo ethtool -X eth1 default
$ sudo ethtool -x eth1
RX flow hash indirection table for eth1 with 16 RX ring(s):
0: 0 1 2 3 4 5 6 7
8: 8 9 10 11 12 13 14 15
16: 0 1 2 3 4 5 6 7
...

Fixes: 91cd94bfe4f0 ("ixgbe: add basic support for setting and getting nfc controls")
Signed-off-by: Joe Damato <jdamato@fastly.com>
Reviewed-by: Sridhar Samudrala <sridhar.samudrala@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>

authored by

Joe Damato and committed by
Tony Nguyen
e85d3d55 4f3ed129

+10 -9
+10 -9
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
··· 2665 2665 return 0; 2666 2666 } 2667 2667 2668 + static int ixgbe_rss_indir_tbl_max(struct ixgbe_adapter *adapter) 2669 + { 2670 + if (adapter->hw.mac.type < ixgbe_mac_X550) 2671 + return 16; 2672 + else 2673 + return 64; 2674 + } 2675 + 2668 2676 static int ixgbe_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, 2669 2677 u32 *rule_locs) 2670 2678 { ··· 2681 2673 2682 2674 switch (cmd->cmd) { 2683 2675 case ETHTOOL_GRXRINGS: 2684 - cmd->data = adapter->num_rx_queues; 2676 + cmd->data = min_t(int, adapter->num_rx_queues, 2677 + ixgbe_rss_indir_tbl_max(adapter)); 2685 2678 ret = 0; 2686 2679 break; 2687 2680 case ETHTOOL_GRXCLSRLCNT: ··· 3082 3073 } 3083 3074 3084 3075 return ret; 3085 - } 3086 - 3087 - static int ixgbe_rss_indir_tbl_max(struct ixgbe_adapter *adapter) 3088 - { 3089 - if (adapter->hw.mac.type < ixgbe_mac_X550) 3090 - return 16; 3091 - else 3092 - return 64; 3093 3076 } 3094 3077 3095 3078 static u32 ixgbe_get_rxfh_key_size(struct net_device *netdev)