Files
linux/include/linux
Eric Dumazet a36703d08c virtio_net: Do not pull payload in skb->head
[ Upstream commit 0f6925b3e8 ]

Xuan Zhuo reported that commit 3226b158e6 ("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 3226b158e6 ("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.

Fixes: 3226b158e6 ("net: avoid 32 x truesize under-estimation for tiny skbs")
Reported-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Link: https://www.spinics.net/lists/netdev/msg731397.html
Co-Developed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Jason Wang <jasowang@redhat.com>
Cc: virtualization@lists.linux-foundation.org
Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2021-05-22 11:40:52 +02:00
..
2019-12-11 09:12:38 +01:00
2019-11-12 11:43:29 -05:00
2021-04-14 08:42:11 +02:00
2020-06-25 22:25:13 -07:00
2020-06-16 14:19:57 +02:00
2020-10-28 13:18:56 +01:00
2020-05-24 20:48:11 +02:00
2020-07-21 08:24:52 -05:00
2020-07-08 10:48:35 -07:00
2021-04-28 13:40:00 +02:00
2020-09-21 15:00:40 -07:00
2020-10-02 15:00:49 -07:00
2020-10-16 17:21:51 +02:00
2019-10-09 19:33:43 -07:00
2020-03-09 11:12:19 +01:00
2019-12-03 11:20:37 +01:00
2020-06-16 19:25:20 +02:00
2020-12-11 14:02:14 -08:00
2020-05-04 11:19:58 -07:00
2020-08-12 20:42:08 +02:00
2020-06-17 00:07:38 +02:00
2020-12-26 16:02:43 +01:00
2020-03-06 11:06:15 +01:00
2020-07-24 17:12:41 -07:00
2020-08-04 21:02:38 -04:00
2019-10-04 12:31:46 -07:00
2019-10-15 13:34:25 +02:00
2020-09-16 08:54:53 -05:00
2020-05-18 10:30:21 +01:00
2020-08-26 12:41:56 +02:00
2020-11-19 22:38:29 -05:00
2020-10-13 18:38:32 -07:00
2019-12-04 19:44:14 -08:00
2020-06-02 15:15:46 +01:00
2019-12-11 09:12:38 +01:00
2021-03-04 11:37:59 +01:00
2020-09-04 09:25:20 -07:00
2021-02-07 15:37:17 +01:00
2020-05-08 18:18:11 +01:00
2020-05-08 00:12:42 +02:00
2020-05-28 10:31:09 +02:00
2020-09-23 18:02:49 -07:00
2020-03-06 11:56:59 +01:00
2021-05-19 10:13:11 +02:00
2020-09-04 12:46:07 +01:00
2020-08-27 16:06:47 -04:00
2019-08-14 15:30:35 +02:00
2019-11-14 19:06:47 -08:00
2020-10-07 14:28:39 -04:00
2020-05-09 13:57:12 +02:00
2020-07-01 10:49:02 +02:00
2020-09-24 19:49:36 -07:00
2020-07-23 17:34:18 +10:00
2020-05-15 13:51:28 -07:00
2020-08-31 12:52:33 -07:00
2019-07-16 19:23:25 -07:00
2021-03-30 14:32:05 +02:00
2020-10-18 09:27:10 -07:00
2020-05-09 13:57:12 +02:00
2020-08-18 17:06:15 +02:00
2020-11-06 10:05:18 -08:00
2020-08-07 11:33:24 -07:00
2020-09-26 22:55:05 -04:00
2021-03-07 12:34:15 +01:00
2021-05-07 11:04:32 +02:00
2021-05-14 09:50:18 +02:00
2021-05-14 09:50:18 +02:00
2021-05-14 09:50:31 +02:00
2020-07-04 09:35:36 -05:00
2020-09-10 14:03:31 -07:00
2020-08-01 11:28:17 +02:00
2020-04-01 12:06:26 -04:00
2020-10-05 13:21:49 +02:00