[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20250718060615.237986-1-lulu@redhat.com>
Date: Fri, 18 Jul 2025 14:06:15 +0800
From: Cindy Lu <lulu@...hat.com>
To: Paolo Bonzini <pbonzini@...hat.com>,
Vitaly Kuznetsov <vkuznets@...hat.com>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>,
Borislav Petkov <bp@...en8.de>,
Dave Hansen <dave.hansen@...ux.intel.com>,
x86@...nel.org (maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)),
"H. Peter Anvin" <hpa@...or.com>,
"Peter Zijlstra (Intel)" <peterz@...radead.org>,
"Kirill A. Shutemov" <kas@...nel.org>,
"Xin Li (Intel)" <xin@...or.com>,
Rik van Riel <riel@...riel.com>,
"Ahmed S. Darwish" <darwi@...utronix.de>,
kvm@...r.kernel.org (open list:KVM PARAVIRT (KVM/paravirt)),
linux-kernel@...r.kernel.org (open list:X86 ARCHITECTURE (32-BIT AND 64-BIT)),
lulu@...hat.com
Subject: [PATCH] netvsc: transfer lower device max tso size
From: Jason Wang <jasowang@...hat.com>
When netvsc is accelerated by the lower device, we can advertise the
lower device max tso size in order to get better performance.
One example is that when 802.3ad encap is enabled by netvsc, it has a
lower max tso size than 64K. This will lead to software segmentation
of forwarding GSO packet (e.g the one from VM/tap).
This patch help to recover the performance.
Signed-off-by: Jason Wang <jasowang@...hat.com>
Tested-by: Cindy Lu <lulu@...hat.com>
---
drivers/net/hyperv/netvsc_drv.c | 2 +-
include/linux/netdevice.h | 4 ++++
net/core/dev.c | 18 ++++++++++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index c41a025c66f0..7af4aa4f4abe 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -2440,7 +2440,7 @@ static int netvsc_vf_changed(struct net_device *vf_netdev, unsigned long event)
* switched over to the VF
*/
if (vf_is_up)
- netif_set_tso_max_size(ndev, vf_netdev->tso_max_size);
+ netif_stacked_transfer_tso_max_size(vf_netdev, ndev);
else
netif_set_tso_max_size(ndev, netvsc_dev->netvsc_gso_max_size);
}
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index adb14db25798..c695a3ffecd8 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -5275,6 +5275,9 @@ void netdev_change_features(struct net_device *dev);
void netif_stacked_transfer_operstate(const struct net_device *rootdev,
struct net_device *dev);
+void netif_stacked_transfer_tso_max_size(const struct net_device *rootdev,
+ struct net_device *dev);
+
netdev_features_t passthru_features_check(struct sk_buff *skb,
struct net_device *dev,
netdev_features_t features);
@@ -5326,6 +5329,7 @@ static inline bool netif_needs_gso(struct sk_buff *skb,
}
void netif_set_tso_max_size(struct net_device *dev, unsigned int size);
+
void netif_set_tso_max_segs(struct net_device *dev, unsigned int segs);
void netif_inherit_tso_max(struct net_device *to,
const struct net_device *from);
diff --git a/net/core/dev.c b/net/core/dev.c
index be97c440ecd5..3bec4284adff 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3306,6 +3306,24 @@ void netif_set_tso_max_size(struct net_device *dev, unsigned int size)
}
EXPORT_SYMBOL(netif_set_tso_max_size);
+/**
+ * netif_stacked_transfer_tso_max_size - transfer tso max size
+ * @rootdev: the root or lower level device to transfer tso max size from
+ * @dev: the device to transfer operstate to
+ *
+ * Transfer tso max size from root to device. This is normally
+ * called when a stacking relationship exists between the root
+ * device and the device(a leaf device).
+ */
+void netif_stacked_transfer_tso_max_size(const struct net_device *rootdev,
+ struct net_device *dev)
+{
+ dev->tso_max_size = rootdev->tso_max_size;
+ netif_set_gso_max_size(dev, READ_ONCE(rootdev->gso_max_size));
+ netif_set_gso_ipv4_max_size(dev, READ_ONCE(rootdev->gso_ipv4_max_size));
+}
+EXPORT_SYMBOL(netif_stacked_transfer_tso_max_size);
+
/**
* netif_set_tso_max_segs() - set the max number of segs supported for TSO
* @dev: netdev to update
--
2.45.0
Powered by blists - more mailing lists