* [PATCH iwl-next v4 1/3] igb: prepare for RSS key get/set support
2026-01-20 9:34 [PATCH iwl-next v4 0/3] igb: add RSS key get/set support Takashi Kozu
@ 2026-01-20 9:34 ` Takashi Kozu
2026-01-20 9:36 ` Loktionov, Aleksandr
2026-01-20 15:26 ` Kwapulinski, Piotr
2026-01-20 9:34 ` [PATCH iwl-next v4 2/3] igb: expose RSS key via ethtool get_rxfh Takashi Kozu
2026-01-20 9:34 ` [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via ethtool set_rxfh Takashi Kozu
2 siblings, 2 replies; 10+ messages in thread
From: Takashi Kozu @ 2026-01-20 9:34 UTC (permalink / raw)
To: anthony.l.nguyen
Cc: przemyslaw.kitszel, andrew+netdev, davem, edumazet, kuba, pabeni,
intel-wired-lan, netdev, aleksandr.loktionov, pmenzel,
piotr.kwapulinski, enjuk, Takashi Kozu
Store the RSS key inside struct igb_adapter and introduce the
igb_write_rss_key() helper function. This allows the driver to program
the E1000 registers using a persistent RSS key, instead of using a
stack-local buffer in igb_setup_mrqc().
Signed-off-by: Takashi Kozu <takkozu@amazon.com>
---
drivers/net/ethernet/intel/igb/igb.h | 3 +++
drivers/net/ethernet/intel/igb/igb_ethtool.c | 21 ++++++++++++++++++++
drivers/net/ethernet/intel/igb/igb_main.c | 8 ++++----
3 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
index 0fff1df81b7b..8c9b02058cec 100644
--- a/drivers/net/ethernet/intel/igb/igb.h
+++ b/drivers/net/ethernet/intel/igb/igb.h
@@ -495,6 +495,7 @@ struct hwmon_buff {
#define IGB_N_PEROUT 2
#define IGB_N_SDP 4
#define IGB_RETA_SIZE 128
+#define IGB_RSS_KEY_SIZE 40
enum igb_filter_match_flags {
IGB_FILTER_FLAG_ETHER_TYPE = 0x1,
@@ -655,6 +656,7 @@ struct igb_adapter {
struct i2c_client *i2c_client;
u32 rss_indir_tbl_init;
u8 rss_indir_tbl[IGB_RETA_SIZE];
+ u8 rss_key[IGB_RSS_KEY_SIZE];
unsigned long link_check_timeout;
int copper_tries;
@@ -735,6 +737,7 @@ void igb_down(struct igb_adapter *);
void igb_reinit_locked(struct igb_adapter *);
void igb_reset(struct igb_adapter *);
int igb_reinit_queues(struct igb_adapter *);
+void igb_write_rss_key(struct igb_adapter *adapter);
void igb_write_rss_indir_tbl(struct igb_adapter *);
int igb_set_spd_dplx(struct igb_adapter *, u32, u8);
int igb_setup_tx_resources(struct igb_ring *);
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index b507576b28b2..a93069b761a6 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -3019,6 +3019,27 @@ static int igb_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
return ret;
}
+/**
+ * igb_write_rss_key - Program the RSS key into device registers
+ * @adapter: board private structure
+ *
+ * Write the RSS key stored in adapter->rss_key to the E1000 hardware registers.
+ * Each 32-bit chunk of the key is read using get_unaligned_le32() and written
+ * to the appropriate register.
+ */
+void igb_write_rss_key(struct igb_adapter *adapter)
+{
+ struct e1000_hw *hw = &adapter->hw;
+
+ ASSERT_RTNL();
+
+ for (int i = 0; i < IGB_RSS_KEY_SIZE / 4; i++) {
+ u32 val = get_unaligned_le32(&adapter->rss_key[i * 4]);
+
+ wr32(E1000_RSSRK(i), val);
+ }
+}
+
static int igb_get_eee(struct net_device *netdev, struct ethtool_keee *edata)
{
struct igb_adapter *adapter = netdev_priv(netdev);
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index dbea37269d2c..c703011b19ec 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -4050,6 +4050,9 @@ static int igb_sw_init(struct igb_adapter *adapter)
pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
+ /* init RSS key */
+ netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
+
/* set default ring sizes */
adapter->tx_ring_count = IGB_DEFAULT_TXD;
adapter->rx_ring_count = IGB_DEFAULT_RXD;
@@ -4525,11 +4528,8 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)
struct e1000_hw *hw = &adapter->hw;
u32 mrqc, rxcsum;
u32 j, num_rx_queues;
- u32 rss_key[10];
- netdev_rss_key_fill(rss_key, sizeof(rss_key));
- for (j = 0; j < 10; j++)
- wr32(E1000_RSSRK(j), rss_key[j]);
+ igb_write_rss_key(adapter);
num_rx_queues = adapter->rss_queues;
--
2.52.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* RE: [PATCH iwl-next v4 1/3] igb: prepare for RSS key get/set support
2026-01-20 9:34 ` [PATCH iwl-next v4 1/3] igb: prepare for " Takashi Kozu
@ 2026-01-20 9:36 ` Loktionov, Aleksandr
2026-01-20 15:26 ` Kwapulinski, Piotr
1 sibling, 0 replies; 10+ messages in thread
From: Loktionov, Aleksandr @ 2026-01-20 9:36 UTC (permalink / raw)
To: Takashi Kozu, Nguyen, Anthony L
Cc: Kitszel, Przemyslaw, andrew+netdev@lunn.ch, davem@davemloft.net,
edumazet@google.com, kuba@kernel.org, pabeni@redhat.com,
intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org,
pmenzel@molgen.mpg.de, Kwapulinski, Piotr, enjuk@amazon.com
> -----Original Message-----
> From: Takashi Kozu <takkozu@amazon.com>
> Sent: Tuesday, January 20, 2026 10:35 AM
> To: Nguyen, Anthony L <anthony.l.nguyen@intel.com>
> Cc: Kitszel, Przemyslaw <przemyslaw.kitszel@intel.com>;
> andrew+netdev@lunn.ch; davem@davemloft.net; edumazet@google.com;
> kuba@kernel.org; pabeni@redhat.com; intel-wired-lan@lists.osuosl.org;
> netdev@vger.kernel.org; Loktionov, Aleksandr
> <aleksandr.loktionov@intel.com>; pmenzel@molgen.mpg.de; Kwapulinski,
> Piotr <piotr.kwapulinski@intel.com>; enjuk@amazon.com; Takashi Kozu
> <takkozu@amazon.com>
> Subject: [PATCH iwl-next v4 1/3] igb: prepare for RSS key get/set
> support
>
> Store the RSS key inside struct igb_adapter and introduce the
> igb_write_rss_key() helper function. This allows the driver to program
> the E1000 registers using a persistent RSS key, instead of using a
> stack-local buffer in igb_setup_mrqc().
>
> Signed-off-by: Takashi Kozu <takkozu@amazon.com>
> ---
> drivers/net/ethernet/intel/igb/igb.h | 3 +++
> drivers/net/ethernet/intel/igb/igb_ethtool.c | 21
> ++++++++++++++++++++
> drivers/net/ethernet/intel/igb/igb_main.c | 8 ++++----
> 3 files changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/igb/igb.h
> b/drivers/net/ethernet/intel/igb/igb.h
> index 0fff1df81b7b..8c9b02058cec 100644
> --- a/drivers/net/ethernet/intel/igb/igb.h
> +++ b/drivers/net/ethernet/intel/igb/igb.h
> @@ -495,6 +495,7 @@ struct hwmon_buff {
> #define IGB_N_PEROUT 2
> #define IGB_N_SDP 4
> #define IGB_RETA_SIZE 128
> +#define IGB_RSS_KEY_SIZE 40
>
> enum igb_filter_match_flags {
> IGB_FILTER_FLAG_ETHER_TYPE = 0x1,
> @@ -655,6 +656,7 @@ struct igb_adapter {
> struct i2c_client *i2c_client;
> u32 rss_indir_tbl_init;
> u8 rss_indir_tbl[IGB_RETA_SIZE];
> + u8 rss_key[IGB_RSS_KEY_SIZE];
>
> unsigned long link_check_timeout;
> int copper_tries;
> @@ -735,6 +737,7 @@ void igb_down(struct igb_adapter *); void
> igb_reinit_locked(struct igb_adapter *); void igb_reset(struct
> igb_adapter *); int igb_reinit_queues(struct igb_adapter *);
> +void igb_write_rss_key(struct igb_adapter *adapter);
> void igb_write_rss_indir_tbl(struct igb_adapter *); int
> igb_set_spd_dplx(struct igb_adapter *, u32, u8); int
> igb_setup_tx_resources(struct igb_ring *); diff --git
> a/drivers/net/ethernet/intel/igb/igb_ethtool.c
> b/drivers/net/ethernet/intel/igb/igb_ethtool.c
> index b507576b28b2..a93069b761a6 100644
> --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
> +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
> @@ -3019,6 +3019,27 @@ static int igb_set_rxnfc(struct net_device
> *dev, struct ethtool_rxnfc *cmd)
> return ret;
> }
>
> +/**
> + * igb_write_rss_key - Program the RSS key into device registers
> + * @adapter: board private structure
> + *
> + * Write the RSS key stored in adapter->rss_key to the E1000 hardware
> registers.
> + * Each 32-bit chunk of the key is read using get_unaligned_le32()
> and
> +written
> + * to the appropriate register.
> + */
> +void igb_write_rss_key(struct igb_adapter *adapter) {
> + struct e1000_hw *hw = &adapter->hw;
> +
> + ASSERT_RTNL();
> +
> + for (int i = 0; i < IGB_RSS_KEY_SIZE / 4; i++) {
> + u32 val = get_unaligned_le32(&adapter->rss_key[i * 4]);
> +
> + wr32(E1000_RSSRK(i), val);
> + }
> +}
> +
> static int igb_get_eee(struct net_device *netdev, struct ethtool_keee
> *edata) {
> struct igb_adapter *adapter = netdev_priv(netdev); diff --git
> a/drivers/net/ethernet/intel/igb/igb_main.c
> b/drivers/net/ethernet/intel/igb/igb_main.c
> index dbea37269d2c..c703011b19ec 100644
> --- a/drivers/net/ethernet/intel/igb/igb_main.c
> +++ b/drivers/net/ethernet/intel/igb/igb_main.c
> @@ -4050,6 +4050,9 @@ static int igb_sw_init(struct igb_adapter
> *adapter)
>
> pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
>
> + /* init RSS key */
> + netdev_rss_key_fill(adapter->rss_key, sizeof(adapter-
> >rss_key));
> +
> /* set default ring sizes */
> adapter->tx_ring_count = IGB_DEFAULT_TXD;
> adapter->rx_ring_count = IGB_DEFAULT_RXD; @@ -4525,11 +4528,8
> @@ static void igb_setup_mrqc(struct igb_adapter *adapter)
> struct e1000_hw *hw = &adapter->hw;
> u32 mrqc, rxcsum;
> u32 j, num_rx_queues;
> - u32 rss_key[10];
>
> - netdev_rss_key_fill(rss_key, sizeof(rss_key));
> - for (j = 0; j < 10; j++)
> - wr32(E1000_RSSRK(j), rss_key[j]);
> + igb_write_rss_key(adapter);
>
> num_rx_queues = adapter->rss_queues;
>
> --
> 2.52.0
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
^ permalink raw reply [flat|nested] 10+ messages in thread* RE: [PATCH iwl-next v4 1/3] igb: prepare for RSS key get/set support
2026-01-20 9:34 ` [PATCH iwl-next v4 1/3] igb: prepare for " Takashi Kozu
2026-01-20 9:36 ` Loktionov, Aleksandr
@ 2026-01-20 15:26 ` Kwapulinski, Piotr
1 sibling, 0 replies; 10+ messages in thread
From: Kwapulinski, Piotr @ 2026-01-20 15:26 UTC (permalink / raw)
To: Takashi Kozu, Nguyen, Anthony L
Cc: Kitszel, Przemyslaw, andrew+netdev@lunn.ch, davem@davemloft.net,
edumazet@google.com, kuba@kernel.org, pabeni@redhat.com,
intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org,
Loktionov, Aleksandr, pmenzel@molgen.mpg.de, enjuk@amazon.com
>-----Original Message-----
>From: Takashi Kozu <takkozu@amazon.com>
>Sent: Tuesday, January 20, 2026 10:35 AM
>To: Nguyen, Anthony L <anthony.l.nguyen@intel.com>
>Cc: Kitszel, Przemyslaw <przemyslaw.kitszel@intel.com>; andrew+netdev@lunn.ch; davem@davemloft.net; edumazet@google.com; kuba@kernel.org; pabeni@redhat.com; intel-wired-lan@lists.osuosl.org; netdev@vger.kernel.org; Loktionov, Aleksandr <aleksandr.loktionov@intel.com>; pmenzel@molgen.mpg.de; Kwapulinski, Piotr <piotr.kwapulinski@intel.com>; enjuk@amazon.com; Takashi Kozu <takkozu@amazon.com>
>Subject: [PATCH iwl-next v4 1/3] igb: prepare for RSS key get/set support
>
>Store the RSS key inside struct igb_adapter and introduce the
>igb_write_rss_key() helper function. This allows the driver to program the E1000 registers using a persistent RSS key, instead of using a stack-local buffer in igb_setup_mrqc().
>
>Signed-off-by: Takashi Kozu <takkozu@amazon.com>
>---
> drivers/net/ethernet/intel/igb/igb.h | 3 +++
> drivers/net/ethernet/intel/igb/igb_ethtool.c | 21 ++++++++++++++++++++
> drivers/net/ethernet/intel/igb/igb_main.c | 8 ++++----
> 3 files changed, 28 insertions(+), 4 deletions(-)
>
>diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
>index 0fff1df81b7b..8c9b02058cec 100644
>--- a/drivers/net/ethernet/intel/igb/igb.h
>+++ b/drivers/net/ethernet/intel/igb/igb.h
>@@ -495,6 +495,7 @@ struct hwmon_buff {
> #define IGB_N_PEROUT 2
> #define IGB_N_SDP 4
> #define IGB_RETA_SIZE 128
>+#define IGB_RSS_KEY_SIZE 40
>
> enum igb_filter_match_flags {
> IGB_FILTER_FLAG_ETHER_TYPE = 0x1,
>@@ -655,6 +656,7 @@ struct igb_adapter {
> struct i2c_client *i2c_client;
> u32 rss_indir_tbl_init;
> u8 rss_indir_tbl[IGB_RETA_SIZE];
>+ u8 rss_key[IGB_RSS_KEY_SIZE];
>
> unsigned long link_check_timeout;
> int copper_tries;
>@@ -735,6 +737,7 @@ void igb_down(struct igb_adapter *); void igb_reinit_locked(struct igb_adapter *); void igb_reset(struct igb_adapter *); int igb_reinit_queues(struct igb_adapter *);
>+void igb_write_rss_key(struct igb_adapter *adapter);
> void igb_write_rss_indir_tbl(struct igb_adapter *); int igb_set_spd_dplx(struct igb_adapter *, u32, u8); int igb_setup_tx_resources(struct igb_ring *); diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
>index b507576b28b2..a93069b761a6 100644
>--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
>+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
>@@ -3019,6 +3019,27 @@ static int igb_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
> return ret;
> }
>
>+/**
>+ * igb_write_rss_key - Program the RSS key into device registers
>+ * @adapter: board private structure
>+ *
>+ * Write the RSS key stored in adapter->rss_key to the E1000 hardware registers.
>+ * Each 32-bit chunk of the key is read using get_unaligned_le32() and
>+written
>+ * to the appropriate register.
>+ */
>+void igb_write_rss_key(struct igb_adapter *adapter) {
>+ struct e1000_hw *hw = &adapter->hw;
>+
>+ ASSERT_RTNL();
>+
>+ for (int i = 0; i < IGB_RSS_KEY_SIZE / 4; i++) {
>+ u32 val = get_unaligned_le32(&adapter->rss_key[i * 4]);
>+
>+ wr32(E1000_RSSRK(i), val);
>+ }
>+}
>+
> static int igb_get_eee(struct net_device *netdev, struct ethtool_keee *edata) {
> struct igb_adapter *adapter = netdev_priv(netdev); diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
>index dbea37269d2c..c703011b19ec 100644
>--- a/drivers/net/ethernet/intel/igb/igb_main.c
>+++ b/drivers/net/ethernet/intel/igb/igb_main.c
>@@ -4050,6 +4050,9 @@ static int igb_sw_init(struct igb_adapter *adapter)
>
> pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
>
>+ /* init RSS key */
>+ netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
>+
> /* set default ring sizes */
> adapter->tx_ring_count = IGB_DEFAULT_TXD;
> adapter->rx_ring_count = IGB_DEFAULT_RXD; @@ -4525,11 +4528,8 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)
> struct e1000_hw *hw = &adapter->hw;
> u32 mrqc, rxcsum;
> u32 j, num_rx_queues;
>- u32 rss_key[10];
>
>- netdev_rss_key_fill(rss_key, sizeof(rss_key));
>- for (j = 0; j < 10; j++)
>- wr32(E1000_RSSRK(j), rss_key[j]);
>+ igb_write_rss_key(adapter);
>
> num_rx_queues = adapter->rss_queues;
>
>--
>2.52.0
Reviewed-by: Piotr Kwapulinski <piotr.kwapulinski@intel.com>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH iwl-next v4 2/3] igb: expose RSS key via ethtool get_rxfh
2026-01-20 9:34 [PATCH iwl-next v4 0/3] igb: add RSS key get/set support Takashi Kozu
2026-01-20 9:34 ` [PATCH iwl-next v4 1/3] igb: prepare for " Takashi Kozu
@ 2026-01-20 9:34 ` Takashi Kozu
2026-01-20 9:34 ` [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via ethtool set_rxfh Takashi Kozu
2 siblings, 0 replies; 10+ messages in thread
From: Takashi Kozu @ 2026-01-20 9:34 UTC (permalink / raw)
To: anthony.l.nguyen
Cc: przemyslaw.kitszel, andrew+netdev, davem, edumazet, kuba, pabeni,
intel-wired-lan, netdev, aleksandr.loktionov, pmenzel,
piotr.kwapulinski, enjuk, Takashi Kozu
Implement igb_get_rxfh_key_size() and extend
igb_get_rxfh() to return the RSS key to userspace.
This can be tested using `ethtool -x <dev>`.
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Signed-off-by: Takashi Kozu <takkozu@amazon.com>
---
drivers/net/ethernet/intel/igb/igb_ethtool.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index a93069b761a6..b387121f0ea7 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -3297,10 +3297,12 @@ static int igb_get_rxfh(struct net_device *netdev,
int i;
rxfh->hfunc = ETH_RSS_HASH_TOP;
- if (!rxfh->indir)
- return 0;
- for (i = 0; i < IGB_RETA_SIZE; i++)
- rxfh->indir[i] = adapter->rss_indir_tbl[i];
+ if (rxfh->indir)
+ for (i = 0; i < IGB_RETA_SIZE; i++)
+ rxfh->indir[i] = adapter->rss_indir_tbl[i];
+
+ if (rxfh->key)
+ memcpy(rxfh->key, adapter->rss_key, sizeof(adapter->rss_key));
return 0;
}
@@ -3340,6 +3342,11 @@ void igb_write_rss_indir_tbl(struct igb_adapter *adapter)
}
}
+static u32 igb_get_rxfh_key_size(struct net_device *netdev)
+{
+ return IGB_RSS_KEY_SIZE;
+}
+
static int igb_set_rxfh(struct net_device *netdev,
struct ethtool_rxfh_param *rxfh,
struct netlink_ext_ack *extack)
@@ -3504,6 +3511,7 @@ static const struct ethtool_ops igb_ethtool_ops = {
.get_module_eeprom = igb_get_module_eeprom,
.get_rxfh_indir_size = igb_get_rxfh_indir_size,
.get_rxfh = igb_get_rxfh,
+ .get_rxfh_key_size = igb_get_rxfh_key_size,
.set_rxfh = igb_set_rxfh,
.get_rxfh_fields = igb_get_rxfh_fields,
.set_rxfh_fields = igb_set_rxfh_fields,
--
2.52.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via ethtool set_rxfh
2026-01-20 9:34 [PATCH iwl-next v4 0/3] igb: add RSS key get/set support Takashi Kozu
2026-01-20 9:34 ` [PATCH iwl-next v4 1/3] igb: prepare for " Takashi Kozu
2026-01-20 9:34 ` [PATCH iwl-next v4 2/3] igb: expose RSS key via ethtool get_rxfh Takashi Kozu
@ 2026-01-20 9:34 ` Takashi Kozu
2026-01-25 13:12 ` Kohei Enju
2 siblings, 1 reply; 10+ messages in thread
From: Takashi Kozu @ 2026-01-20 9:34 UTC (permalink / raw)
To: anthony.l.nguyen
Cc: przemyslaw.kitszel, andrew+netdev, davem, edumazet, kuba, pabeni,
intel-wired-lan, netdev, aleksandr.loktionov, pmenzel,
piotr.kwapulinski, enjuk, Takashi Kozu
Change igc_set_rxfh() to accept and save a userspace-provided
RSS key. When a key is provided, store it in the adapter and write the
E1000 registers accordingly.
This can be tested using `ethtool -X <dev> hkey <key>`.
Signed-off-by: Takashi Kozu <takkozu@amazon.com>
---
drivers/net/ethernet/intel/igb/igb.h | 1 +
drivers/net/ethernet/intel/igb/igb_ethtool.c | 49 +++++++++++---------
drivers/net/ethernet/intel/igb/igb_main.c | 3 +-
3 files changed, 30 insertions(+), 23 deletions(-)
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
index 8c9b02058cec..2509ec30acf3 100644
--- a/drivers/net/ethernet/intel/igb/igb.h
+++ b/drivers/net/ethernet/intel/igb/igb.h
@@ -657,6 +657,7 @@ struct igb_adapter {
u32 rss_indir_tbl_init;
u8 rss_indir_tbl[IGB_RETA_SIZE];
u8 rss_key[IGB_RSS_KEY_SIZE];
+ bool has_user_rss_key;
unsigned long link_check_timeout;
int copper_tries;
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index b387121f0ea7..1db9c2447c91 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -3357,35 +3357,40 @@ static int igb_set_rxfh(struct net_device *netdev,
u32 num_queues;
/* We do not allow change in unsupported parameters */
- if (rxfh->key ||
- (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
- rxfh->hfunc != ETH_RSS_HASH_TOP))
+ if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
+ rxfh->hfunc != ETH_RSS_HASH_TOP)
return -EOPNOTSUPP;
- if (!rxfh->indir)
- return 0;
- num_queues = adapter->rss_queues;
+ if (rxfh->indir) {
+ num_queues = adapter->rss_queues;
- switch (hw->mac.type) {
- case e1000_82576:
- /* 82576 supports 2 RSS queues for SR-IOV */
- if (adapter->vfs_allocated_count)
- num_queues = 2;
- break;
- default:
- break;
- }
+ switch (hw->mac.type) {
+ case e1000_82576:
+ /* 82576 supports 2 RSS queues for SR-IOV */
+ if (adapter->vfs_allocated_count)
+ num_queues = 2;
+ break;
+ default:
+ break;
+ }
- /* Verify user input. */
- for (i = 0; i < IGB_RETA_SIZE; i++)
- if (rxfh->indir[i] >= num_queues)
- return -EINVAL;
+ /* Verify user input. */
+ for (i = 0; i < IGB_RETA_SIZE; i++)
+ if (rxfh->indir[i] >= num_queues)
+ return -EINVAL;
- for (i = 0; i < IGB_RETA_SIZE; i++)
- adapter->rss_indir_tbl[i] = rxfh->indir[i];
+ for (i = 0; i < IGB_RETA_SIZE; i++)
+ adapter->rss_indir_tbl[i] = rxfh->indir[i];
+
+ igb_write_rss_indir_tbl(adapter);
+ }
- igb_write_rss_indir_tbl(adapter);
+ if (rxfh->key) {
+ adapter->has_user_rss_key = true;
+ memcpy(adapter->rss_key, rxfh->key, sizeof(adapter->rss_key));
+ igb_write_rss_key(adapter);
+ }
return 0;
}
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index c703011b19ec..8dab133296ca 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -4051,7 +4051,8 @@ static int igb_sw_init(struct igb_adapter *adapter)
pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
/* init RSS key */
- netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
+ if (!adapter->has_user_rss_key)
+ netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
/* set default ring sizes */
adapter->tx_ring_count = IGB_DEFAULT_TXD;
--
2.52.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via ethtool set_rxfh
2026-01-20 9:34 ` [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via ethtool set_rxfh Takashi Kozu
@ 2026-01-25 13:12 ` Kohei Enju
2026-01-27 22:33 ` Tony Nguyen
0 siblings, 1 reply; 10+ messages in thread
From: Kohei Enju @ 2026-01-25 13:12 UTC (permalink / raw)
To: takkozu
Cc: aleksandr.loktionov, andrew+netdev, anthony.l.nguyen, davem,
edumazet, enjuk, intel-wired-lan, kuba, netdev, pabeni,
piotr.kwapulinski, pmenzel, przemyslaw.kitszel
On Tue, 20 Jan 2026 18:34:40 +0900, Takashi Kozu wrote:
> Change igc_set_rxfh() to accept and save a userspace-provided
> RSS key. When a key is provided, store it in the adapter and write the
> E1000 registers accordingly.
>
> This can be tested using `ethtool -X <dev> hkey <key>`.
>
> Signed-off-by: Takashi Kozu <takkozu@amazon.com>
> ---
> drivers/net/ethernet/intel/igb/igb.h | 1 +
> drivers/net/ethernet/intel/igb/igb_ethtool.c | 49 +++++++++++---------
> drivers/net/ethernet/intel/igb/igb_main.c | 3 +-
> 3 files changed, 30 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
> index 8c9b02058cec..2509ec30acf3 100644
> --- a/drivers/net/ethernet/intel/igb/igb.h
> +++ b/drivers/net/ethernet/intel/igb/igb.h
> @@ -657,6 +657,7 @@ struct igb_adapter {
> u32 rss_indir_tbl_init;
> u8 rss_indir_tbl[IGB_RETA_SIZE];
> u8 rss_key[IGB_RSS_KEY_SIZE];
> + bool has_user_rss_key;
Hi Kozu-san.
While preparing for testing, I noticed that now 'has_user_rss_key' is
not necessary.
Since netdev_rss_key_fill() is called in igb_sw_init() and igb_sw_init()
is called only once for the adapter's lifetime, adapter->rss_key
wouldn't be changed except for user-intended change.
I'd drop that flag and related code (see below)
>
> unsigned long link_check_timeout;
> int copper_tries;
> diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
> index b387121f0ea7..1db9c2447c91 100644
> --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
> +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
> @@ -3357,35 +3357,40 @@ static int igb_set_rxfh(struct net_device *netdev,
> u32 num_queues;
>
> /* We do not allow change in unsupported parameters */
> - if (rxfh->key ||
> - (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
> - rxfh->hfunc != ETH_RSS_HASH_TOP))
> + if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
> + rxfh->hfunc != ETH_RSS_HASH_TOP)
> return -EOPNOTSUPP;
> - if (!rxfh->indir)
> - return 0;
>
> - num_queues = adapter->rss_queues;
> + if (rxfh->indir) {
> + num_queues = adapter->rss_queues;
>
> - switch (hw->mac.type) {
> - case e1000_82576:
> - /* 82576 supports 2 RSS queues for SR-IOV */
> - if (adapter->vfs_allocated_count)
> - num_queues = 2;
> - break;
> - default:
> - break;
> - }
> + switch (hw->mac.type) {
> + case e1000_82576:
> + /* 82576 supports 2 RSS queues for SR-IOV */
> + if (adapter->vfs_allocated_count)
> + num_queues = 2;
> + break;
> + default:
> + break;
> + }
>
> - /* Verify user input. */
> - for (i = 0; i < IGB_RETA_SIZE; i++)
> - if (rxfh->indir[i] >= num_queues)
> - return -EINVAL;
> + /* Verify user input. */
> + for (i = 0; i < IGB_RETA_SIZE; i++)
> + if (rxfh->indir[i] >= num_queues)
> + return -EINVAL;
>
>
> - for (i = 0; i < IGB_RETA_SIZE; i++)
> - adapter->rss_indir_tbl[i] = rxfh->indir[i];
> + for (i = 0; i < IGB_RETA_SIZE; i++)
> + adapter->rss_indir_tbl[i] = rxfh->indir[i];
> +
> + igb_write_rss_indir_tbl(adapter);
> + }
>
> - igb_write_rss_indir_tbl(adapter);
> + if (rxfh->key) {
> + adapter->has_user_rss_key = true;
here
> + memcpy(adapter->rss_key, rxfh->key, sizeof(adapter->rss_key));
> + igb_write_rss_key(adapter);
> + }
>
> return 0;
> }
> diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
> index c703011b19ec..8dab133296ca 100644
> --- a/drivers/net/ethernet/intel/igb/igb_main.c
> +++ b/drivers/net/ethernet/intel/igb/igb_main.c
> @@ -4051,7 +4051,8 @@ static int igb_sw_init(struct igb_adapter *adapter)
> pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
>
> /* init RSS key */
> - netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
> + if (!adapter->has_user_rss_key)
> + netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
and this diff.
>
> /* set default ring sizes */
> adapter->tx_ring_count = IGB_DEFAULT_TXD;
> --
> 2.52.0
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via ethtool set_rxfh
2026-01-25 13:12 ` Kohei Enju
@ 2026-01-27 22:33 ` Tony Nguyen
2026-01-28 6:09 ` [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via Kohei Enju
0 siblings, 1 reply; 10+ messages in thread
From: Tony Nguyen @ 2026-01-27 22:33 UTC (permalink / raw)
To: Kohei Enju, takkozu
Cc: aleksandr.loktionov, andrew+netdev, davem, edumazet, enjuk,
intel-wired-lan, kuba, netdev, pabeni, piotr.kwapulinski, pmenzel,
przemyslaw.kitszel
On 1/25/2026 5:12 AM, Kohei Enju wrote:
> On Tue, 20 Jan 2026 18:34:40 +0900, Takashi Kozu wrote:
>
>> Change igc_set_rxfh() to accept and save a userspace-provided
>> RSS key. When a key is provided, store it in the adapter and write the
>> E1000 registers accordingly.
>>
>> This can be tested using `ethtool -X <dev> hkey <key>`.
>>
>> Signed-off-by: Takashi Kozu <takkozu@amazon.com>
>> ---
>> drivers/net/ethernet/intel/igb/igb.h | 1 +
>> drivers/net/ethernet/intel/igb/igb_ethtool.c | 49 +++++++++++---------
>> drivers/net/ethernet/intel/igb/igb_main.c | 3 +-
>> 3 files changed, 30 insertions(+), 23 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
>> index 8c9b02058cec..2509ec30acf3 100644
>> --- a/drivers/net/ethernet/intel/igb/igb.h
>> +++ b/drivers/net/ethernet/intel/igb/igb.h
>> @@ -657,6 +657,7 @@ struct igb_adapter {
>> u32 rss_indir_tbl_init;
>> u8 rss_indir_tbl[IGB_RETA_SIZE];
>> u8 rss_key[IGB_RSS_KEY_SIZE];
>> + bool has_user_rss_key;
>
> Hi Kozu-san.
>
> While preparing for testing, I noticed that now 'has_user_rss_key' is
> not necessary.
>
> Since netdev_rss_key_fill() is called in igb_sw_init() and igb_sw_init()
> is called only once for the adapter's lifetime, adapter->rss_key
> wouldn't be changed except for user-intended change.
>
> I'd drop that flag and related code (see below)
Hi Kohei,
I believe this igb implementation was based on your igc implementation
which also has the same. Would it be possible for you to update the igc
to do this as well?
Thanks,
Tony
>>
>> unsigned long link_check_timeout;
>> int copper_tries;
>> diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c
>> index b387121f0ea7..1db9c2447c91 100644
>> --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
>> +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
>> @@ -3357,35 +3357,40 @@ static int igb_set_rxfh(struct net_device *netdev,
>> u32 num_queues;
>>
>> /* We do not allow change in unsupported parameters */
>> - if (rxfh->key ||
>> - (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
>> - rxfh->hfunc != ETH_RSS_HASH_TOP))
>> + if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
>> + rxfh->hfunc != ETH_RSS_HASH_TOP)
>> return -EOPNOTSUPP;
>> - if (!rxfh->indir)
>> - return 0;
>>
>> - num_queues = adapter->rss_queues;
>> + if (rxfh->indir) {
>> + num_queues = adapter->rss_queues;
>>
>> - switch (hw->mac.type) {
>> - case e1000_82576:
>> - /* 82576 supports 2 RSS queues for SR-IOV */
>> - if (adapter->vfs_allocated_count)
>> - num_queues = 2;
>> - break;
>> - default:
>> - break;
>> - }
>> + switch (hw->mac.type) {
>> + case e1000_82576:
>> + /* 82576 supports 2 RSS queues for SR-IOV */
>> + if (adapter->vfs_allocated_count)
>> + num_queues = 2;
>> + break;
>> + default:
>> + break;
>> + }
>>
>> - /* Verify user input. */
>> - for (i = 0; i < IGB_RETA_SIZE; i++)
>> - if (rxfh->indir[i] >= num_queues)
>> - return -EINVAL;
>> + /* Verify user input. */
>> + for (i = 0; i < IGB_RETA_SIZE; i++)
>> + if (rxfh->indir[i] >= num_queues)
>> + return -EINVAL;
>>
>>
>> - for (i = 0; i < IGB_RETA_SIZE; i++)
>> - adapter->rss_indir_tbl[i] = rxfh->indir[i];
>> + for (i = 0; i < IGB_RETA_SIZE; i++)
>> + adapter->rss_indir_tbl[i] = rxfh->indir[i];
>> +
>> + igb_write_rss_indir_tbl(adapter);
>> + }
>>
>> - igb_write_rss_indir_tbl(adapter);
>> + if (rxfh->key) {
>> + adapter->has_user_rss_key = true;
>
> here
>
>> + memcpy(adapter->rss_key, rxfh->key, sizeof(adapter->rss_key));
>> + igb_write_rss_key(adapter);
>> + }
>>
>> return 0;
>> }
>> diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
>> index c703011b19ec..8dab133296ca 100644
>> --- a/drivers/net/ethernet/intel/igb/igb_main.c
>> +++ b/drivers/net/ethernet/intel/igb/igb_main.c
>> @@ -4051,7 +4051,8 @@ static int igb_sw_init(struct igb_adapter *adapter)
>> pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
>>
>> /* init RSS key */
>> - netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
>> + if (!adapter->has_user_rss_key)
>> + netdev_rss_key_fill(adapter->rss_key, sizeof(adapter->rss_key));
>
> and this diff.
>
>>
>> /* set default ring sizes */
>> adapter->tx_ring_count = IGB_DEFAULT_TXD;
>> --
>> 2.52.0
>
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via
2026-01-27 22:33 ` Tony Nguyen
@ 2026-01-28 6:09 ` Kohei Enju
2026-01-28 17:33 ` Tony Nguyen
0 siblings, 1 reply; 10+ messages in thread
From: Kohei Enju @ 2026-01-28 6:09 UTC (permalink / raw)
To: anthony.l.nguyen
Cc: aleksandr.loktionov, andrew+netdev, davem, edumazet, enjuk,
intel-wired-lan, kohei, kuba, netdev, pabeni, piotr.kwapulinski,
pmenzel, przemyslaw.kitszel, takkozu
On Tue, 27 Jan 2026 14:33:24 -0800, Tony Nguyen wrote:
> On 1/25/2026 5:12 AM, Kohei Enju wrote:
> > On Tue, 20 Jan 2026 18:34:40 +0900, Takashi Kozu wrote:
> >
> >> Change igc_set_rxfh() to accept and save a userspace-provided
> >> RSS key. When a key is provided, store it in the adapter and write the
> >> E1000 registers accordingly.
> >>
> >> This can be tested using `ethtool -X <dev> hkey <key>`.
> >>
> >> Signed-off-by: Takashi Kozu <takkozu@amazon.com>
> >> ---
> >> drivers/net/ethernet/intel/igb/igb.h | 1 +
> >> drivers/net/ethernet/intel/igb/igb_ethtool.c | 49 +++++++++++---------
> >> drivers/net/ethernet/intel/igb/igb_main.c | 3 +-
> >> 3 files changed, 30 insertions(+), 23 deletions(-)
> >>
> >> diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h
> >> index 8c9b02058cec..2509ec30acf3 100644
> >> --- a/drivers/net/ethernet/intel/igb/igb.h
> >> +++ b/drivers/net/ethernet/intel/igb/igb.h
> >> @@ -657,6 +657,7 @@ struct igb_adapter {
> >> u32 rss_indir_tbl_init;
> >> u8 rss_indir_tbl[IGB_RETA_SIZE];
> >> u8 rss_key[IGB_RSS_KEY_SIZE];
> >> + bool has_user_rss_key;
> >
> > Hi Kozu-san.
> >
> > While preparing for testing, I noticed that now 'has_user_rss_key' is
> > not necessary.
> >
> > Since netdev_rss_key_fill() is called in igb_sw_init() and igb_sw_init()
> > is called only once for the adapter's lifetime, adapter->rss_key
> > wouldn't be changed except for user-intended change.
> >
> > I'd drop that flag and related code (see below)
>
> Hi Kohei,
>
> I believe this igb implementation was based on your igc implementation
> which also has the same. Would it be possible for you to update the igc
> to do this as well?
Yes, you're right. I'd love to do that and post as new version,
so could you drop the series[1] from tnguy/next-queue.git?
[1] https://lore.kernel.org/intel-wired-lan/20251025150136.47618-1-enjuk@amazon.com/
>
> Thanks,
> Tony
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via
2026-01-28 6:09 ` [PATCH iwl-next v4 3/3] igb: allow configuring RSS key via Kohei Enju
@ 2026-01-28 17:33 ` Tony Nguyen
0 siblings, 0 replies; 10+ messages in thread
From: Tony Nguyen @ 2026-01-28 17:33 UTC (permalink / raw)
To: Kohei Enju
Cc: aleksandr.loktionov, andrew+netdev, davem, edumazet, enjuk,
intel-wired-lan, kuba, netdev, pabeni, piotr.kwapulinski, pmenzel,
przemyslaw.kitszel, takkozu
On 1/27/2026 10:09 PM, Kohei Enju wrote:
>
> Yes, you're right. I'd love to do that and post as new version,
> so could you drop the series[1] from tnguy/next-queue.git?
Done.
Thanks,
Tony
^ permalink raw reply [flat|nested] 10+ messages in thread