Patch "virtio_net: Do not pull payload in skb->head" has been added to the 5.10-stable tree
Subsystems (3)
[email protected]
AppliedThis is a note to let you know that I've just added the patch titled
virtio_net: Do not pull payload in skb->head
to the 5.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
virtio_net-do-not-pull-payload-in-skb-head.patch
and it can be found in the queue-5.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From 0f6925b3e8da0dbbb52447ca8a8b42b371aac7db Mon Sep 17 00:00:00 2001
From: Eric Dumazet <[email protected]>
Date: Fri, 2 Apr 2021 06:26:02 -0700
Subject: virtio_net: Do not pull payload in skb->head
From: Eric Dumazet <[email protected]>
commit 0f6925b3e8da0dbbb52447ca8a8b42b371aac7db upstream.
Xuan Zhuo reported that commit 3226b158e67c ("net: avoid 32 x truesize under-estimation for tiny skbs") brought a ~10% performance drop.
The reason for the performance drop was that GRO was forced to chain sk_buff (using skb_shinfo(skb)->frag_list), which uses more memory but also cause packet consumers to go over a lot of overhead handling all the tiny skbs.
It turns out that virtio_net page_to_skb() has a wrong strategy :
It allocates skbs with GOOD_COPY_LEN (128) bytes in skb->head, then copies 128 bytes from the page, before feeding the packet to GRO stack.
This was suboptimal before commit 3226b158e67c ("net: avoid 32 x truesize under-estimation for tiny skbs") because GRO was using 2 frags per MSS, meaning we were not packing MSS with 100% efficiency.
Fix is to pull only the ethernet header in page_to_skb()
Then, we change virtio_net_hdr_to_skb() to pull the missing headers, instead of assuming they were already pulled by callers.
This fixes the performance regression, but could also allow virtio_net to accept packets with more than 128bytes of headers.
Many thanks to Xuan Zhuo for his report, and his tests/help.
--- drivers/net/virtio_net.c | 10 +++++++--- include/linux/virtio_net.h | 14 +++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-)
drivers/net/virtio_net.c +7 -3
@@ -406,9 +406,13 @@ static struct sk_buff *page_to_skb(struc offset += hdr_padded_len; p += hdr_padded_len; - copy = len; -if (copy >skb_tailroom (skb)) - copy =skb_tailroom (skb); +/* Copy all frame if it fits skb->head, otherwise +* we let virtio_net_hdr_to_skb() and GRO pull headers as needed. +*/ +if (len <=skb_tailroom (skb)) + copy = len; +else + copy =ETH_HLEN + metasize;skb_put_data (skb, p, copy);if (metasize) {
include/linux/virtio_net.h +9 -5
@@ -65,14 +65,18 @@ static inline int virtio_net_hdr_to_skb(skb_reset_mac_header (skb);if (hdr->flags &VIRTIO_NET_HDR_F_NEEDS_CSUM ) { -u16 start =__virtio16_to_cpu (little_endian, hdr->csum_start); -u16 off =__virtio16_to_cpu (little_endian, hdr->csum_offset); +u32 start =__virtio16_to_cpu (little_endian, hdr->csum_start); +u32 off =__virtio16_to_cpu (little_endian, hdr->csum_offset); +u32 needed = start +max_t (u32, thlen, off +sizeof (__sum16)); + +if (!pskb_may_pull (skb, needed)) +return -EINVAL ;if (!skb_partial_csum_set (skb, start, off))return -EINVAL ; p_off =skb_transport_offset (skb) + thlen; -if (p_off >skb_headlen (skb)) +if (!pskb_may_pull (skb, p_off))return -EINVAL ; }else {/* gso packets without NEEDS_CSUM do not set transport_offset.
@@ -102,14 +106,14 @@ retry: } p_off = keys.control.thoff + thlen; -if (p_off >skb_headlen (skb) || +if (!pskb_may_pull (skb, p_off) || keys.basic.ip_proto != ip_proto)return -EINVAL ;skb_set_transport_header (skb, keys.control.thoff); }else if (gso_type) { p_off = thlen; -if (p_off >skb_headlen (skb)) +if (!pskb_may_pull (skb, p_off))return -EINVAL ; } }
Patches currently in stable-queue which might be from [email protected] are
queue-5.10/net-hsr-reset-mac-header-for-tx-path.patch queue-5.10/net-let-skb_orphan_partial-wake-up-waiters.patch queue-5.10/net-ensure-mac-header-is-set-in-virtio_net_hdr_to_skb.patch queue-5.10/net-sched-sch_teql-fix-null-pointer-dereference.patch queue-5.10/virtio_net-do-not-pull-payload-in-skb-head.patch
_______________________________________________
Virtualization mailing list [email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization