Thomas Bogendoerfer 75a932
From: Ronak Doshi <doshir@vmware.com>
Thomas Bogendoerfer 75a932
Date: Wed, 8 Feb 2023 14:38:59 -0800
Thomas Bogendoerfer 75a932
Subject: vmxnet3: move rss code block under eop descriptor
Thomas Bogendoerfer 75a932
Patch-mainline: v6.2
Thomas Bogendoerfer 75a932
Git-commit: ec76d0c2da5c6dfb6a33f1545cc15997013923da
Thomas Bogendoerfer 75a932
References: bsc#1208212
Thomas Bogendoerfer 75a932
Thomas Bogendoerfer 75a932
Commit b3973bb40041 ("vmxnet3: set correct hash type based on
Thomas Bogendoerfer 75a932
rss information") added hashType information into skb. However,
Thomas Bogendoerfer 75a932
rssType field is populated for eop descriptor. This can lead
Thomas Bogendoerfer 75a932
to incorrectly reporting of hashType for packets which use
Thomas Bogendoerfer 75a932
multiple rx descriptors. Multiple rx descriptors are used
Thomas Bogendoerfer 75a932
for Jumbo frame or LRO packets, which can hit this issue.
Thomas Bogendoerfer 75a932
Thomas Bogendoerfer 75a932
This patch moves the RSS codeblock under eop descritor.
Thomas Bogendoerfer 75a932
Thomas Bogendoerfer 75a932
Cc: stable@vger.kernel.org
Thomas Bogendoerfer 75a932
Fixes: b3973bb40041 ("vmxnet3: set correct hash type based on rss information")
Thomas Bogendoerfer 75a932
Signed-off-by: Ronak Doshi <doshir@vmware.com>
Thomas Bogendoerfer 75a932
Acked-by: Peng Li <lpeng@vmware.com>
Thomas Bogendoerfer 75a932
Acked-by: Guolin Yang <gyang@vmware.com>
Thomas Bogendoerfer 75a932
Link: https://lore.kernel.org/r/20230208223900.5794-1-doshir@vmware.com
Thomas Bogendoerfer 75a932
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Thomas Bogendoerfer 75a932
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 75a932
---
Thomas Bogendoerfer 75a932
 drivers/net/vmxnet3/vmxnet3_drv.c |   50 +++++++++++++++++++-------------------
Thomas Bogendoerfer 75a932
 1 file changed, 25 insertions(+), 25 deletions(-)
Thomas Bogendoerfer 75a932
Thomas Bogendoerfer 75a932
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
Thomas Bogendoerfer 75a932
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
Thomas Bogendoerfer 75a932
@@ -1479,31 +1479,6 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx
Thomas Bogendoerfer 75a932
 				rxd->len = rbi->len;
Thomas Bogendoerfer 75a932
 			}
Thomas Bogendoerfer 75a932
 
Thomas Bogendoerfer 75a932
-#ifdef VMXNET3_RSS
Thomas Bogendoerfer 75a932
-			if (rcd->rssType != VMXNET3_RCD_RSS_TYPE_NONE &&
Thomas Bogendoerfer 75a932
-			    (adapter->netdev->features & NETIF_F_RXHASH)) {
Thomas Bogendoerfer 75a932
-				enum pkt_hash_types hash_type;
Thomas Bogendoerfer 75a932
-
Thomas Bogendoerfer 75a932
-				switch (rcd->rssType) {
Thomas Bogendoerfer 75a932
-				case VMXNET3_RCD_RSS_TYPE_IPV4:
Thomas Bogendoerfer 75a932
-				case VMXNET3_RCD_RSS_TYPE_IPV6:
Thomas Bogendoerfer 75a932
-					hash_type = PKT_HASH_TYPE_L3;
Thomas Bogendoerfer 75a932
-					break;
Thomas Bogendoerfer 75a932
-				case VMXNET3_RCD_RSS_TYPE_TCPIPV4:
Thomas Bogendoerfer 75a932
-				case VMXNET3_RCD_RSS_TYPE_TCPIPV6:
Thomas Bogendoerfer 75a932
-				case VMXNET3_RCD_RSS_TYPE_UDPIPV4:
Thomas Bogendoerfer 75a932
-				case VMXNET3_RCD_RSS_TYPE_UDPIPV6:
Thomas Bogendoerfer 75a932
-					hash_type = PKT_HASH_TYPE_L4;
Thomas Bogendoerfer 75a932
-					break;
Thomas Bogendoerfer 75a932
-				default:
Thomas Bogendoerfer 75a932
-					hash_type = PKT_HASH_TYPE_L3;
Thomas Bogendoerfer 75a932
-					break;
Thomas Bogendoerfer 75a932
-				}
Thomas Bogendoerfer 75a932
-				skb_set_hash(ctx->skb,
Thomas Bogendoerfer 75a932
-					     le32_to_cpu(rcd->rssHash),
Thomas Bogendoerfer 75a932
-					     hash_type);
Thomas Bogendoerfer 75a932
-			}
Thomas Bogendoerfer 75a932
-#endif
Thomas Bogendoerfer 75a932
 			skb_put(ctx->skb, rcd->len);
Thomas Bogendoerfer 75a932
 
Thomas Bogendoerfer 75a932
 			if (VMXNET3_VERSION_GE_2(adapter) &&
Thomas Bogendoerfer 75a932
@@ -1580,6 +1555,31 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx
Thomas Bogendoerfer 75a932
 			u32 mtu = adapter->netdev->mtu;
Thomas Bogendoerfer 75a932
 			skb->len += skb->data_len;
Thomas Bogendoerfer 75a932
 
Thomas Bogendoerfer 75a932
+#ifdef VMXNET3_RSS
Thomas Bogendoerfer 75a932
+			if (rcd->rssType != VMXNET3_RCD_RSS_TYPE_NONE &&
Thomas Bogendoerfer 75a932
+			    (adapter->netdev->features & NETIF_F_RXHASH)) {
Thomas Bogendoerfer 75a932
+				enum pkt_hash_types hash_type;
Thomas Bogendoerfer 75a932
+
Thomas Bogendoerfer 75a932
+				switch (rcd->rssType) {
Thomas Bogendoerfer 75a932
+				case VMXNET3_RCD_RSS_TYPE_IPV4:
Thomas Bogendoerfer 75a932
+				case VMXNET3_RCD_RSS_TYPE_IPV6:
Thomas Bogendoerfer 75a932
+					hash_type = PKT_HASH_TYPE_L3;
Thomas Bogendoerfer 75a932
+					break;
Thomas Bogendoerfer 75a932
+				case VMXNET3_RCD_RSS_TYPE_TCPIPV4:
Thomas Bogendoerfer 75a932
+				case VMXNET3_RCD_RSS_TYPE_TCPIPV6:
Thomas Bogendoerfer 75a932
+				case VMXNET3_RCD_RSS_TYPE_UDPIPV4:
Thomas Bogendoerfer 75a932
+				case VMXNET3_RCD_RSS_TYPE_UDPIPV6:
Thomas Bogendoerfer 75a932
+					hash_type = PKT_HASH_TYPE_L4;
Thomas Bogendoerfer 75a932
+					break;
Thomas Bogendoerfer 75a932
+				default:
Thomas Bogendoerfer 75a932
+					hash_type = PKT_HASH_TYPE_L3;
Thomas Bogendoerfer 75a932
+					break;
Thomas Bogendoerfer 75a932
+				}
Thomas Bogendoerfer 75a932
+				skb_set_hash(skb,
Thomas Bogendoerfer 75a932
+					     le32_to_cpu(rcd->rssHash),
Thomas Bogendoerfer 75a932
+					     hash_type);
Thomas Bogendoerfer 75a932
+			}
Thomas Bogendoerfer 75a932
+#endif
Thomas Bogendoerfer 75a932
 			vmxnet3_rx_csum(adapter, skb,
Thomas Bogendoerfer 75a932
 					(union Vmxnet3_GenericDesc *)rcd);
Thomas Bogendoerfer 75a932
 			skb->protocol = eth_type_trans(skb, adapter->netdev);