igb: set skb hash type from RSS_TYPE

igb always marks the RX hash as L3 regardless of RSS_TYPE in the
advanced descriptor, which may indicate L4 (TCP/UDP) hash. This can
trigger unnecessary SW hash recalculation and breaks toeplitz selftests.

Use RSS_TYPE from pkt_info to set the correct PKT_HASH_TYPE_*

Tested by toeplitz.py with the igb RSS key get/set patches applied as
they are required for toeplitz.py (see Link below).
 # ethtool -N $DEV rx-flow-hash udp4 sdfn
 # ethtool -N $DEV rx-flow-hash udp6 sdfn
 # python toeplitz.py | grep -E "^# Totals"

Without patch:
 # Totals: pass:0 fail:12 xfail:0 xpass:0 skip:0 error:0

With patch:
 # Totals: pass:12 fail:0 xfail:0 xpass:0 skip:0 error:0

Link: https://lore.kernel.org/intel-wired-lan/20260119084511.95287-5-takkozu@amazon.com/
Signed-off-by: Kohei Enju <kohei@enjuk.jp>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
Kohei Enju 2026-01-22 13:47:46 +00:00 committed by Tony Nguyen
parent e3c94e9782
commit 17cd41a973
2 changed files with 34 additions and 4 deletions

View File

@ -87,6 +87,27 @@ union e1000_adv_rx_desc {
} wb; /* writeback */
};
#define E1000_RSS_TYPE_NO_HASH 0
#define E1000_RSS_TYPE_HASH_TCP_IPV4 1
#define E1000_RSS_TYPE_HASH_IPV4 2
#define E1000_RSS_TYPE_HASH_TCP_IPV6 3
#define E1000_RSS_TYPE_HASH_IPV6_EX 4
#define E1000_RSS_TYPE_HASH_IPV6 5
#define E1000_RSS_TYPE_HASH_TCP_IPV6_EX 6
#define E1000_RSS_TYPE_HASH_UDP_IPV4 7
#define E1000_RSS_TYPE_HASH_UDP_IPV6 8
#define E1000_RSS_TYPE_HASH_UDP_IPV6_EX 9
#define E1000_RSS_TYPE_MASK GENMASK(3, 0)
#define E1000_RSS_L4_TYPES_MASK \
(BIT(E1000_RSS_TYPE_HASH_TCP_IPV4) | \
BIT(E1000_RSS_TYPE_HASH_TCP_IPV6) | \
BIT(E1000_RSS_TYPE_HASH_TCP_IPV6_EX) | \
BIT(E1000_RSS_TYPE_HASH_UDP_IPV4) | \
BIT(E1000_RSS_TYPE_HASH_UDP_IPV6) | \
BIT(E1000_RSS_TYPE_HASH_UDP_IPV6_EX))
#define E1000_RXDADV_HDRBUFLEN_MASK 0x7FE0
#define E1000_RXDADV_HDRBUFLEN_SHIFT 5
#define E1000_RXDADV_STAT_TS 0x10000 /* Pkt was time stamped */

View File

@ -8820,10 +8820,19 @@ static inline void igb_rx_hash(struct igb_ring *ring,
union e1000_adv_rx_desc *rx_desc,
struct sk_buff *skb)
{
if (ring->netdev->features & NETIF_F_RXHASH)
skb_set_hash(skb,
le32_to_cpu(rx_desc->wb.lower.hi_dword.rss),
PKT_HASH_TYPE_L3);
u16 rss_type;
if (!(ring->netdev->features & NETIF_F_RXHASH))
return;
rss_type = le16_to_cpu(rx_desc->wb.lower.lo_dword.pkt_info) &
E1000_RSS_TYPE_MASK;
if (!rss_type)
return;
skb_set_hash(skb, le32_to_cpu(rx_desc->wb.lower.hi_dword.rss),
(E1000_RSS_L4_TYPES_MASK & BIT(rss_type)) ?
PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3);
}
/**