mirror of
https://github.com/torvalds/linux.git
synced 2026-09-28 20:12:01 +02:00
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:
parent
e3c94e9782
commit
17cd41a973
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user