]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
virtio-net: use the check_mergeable_len helper
authorBui Quang Minh <minhquangbui99@gmail.com>
Mon, 30 Jun 2025 14:42:12 +0000 (21:42 +0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 3 Jul 2025 08:56:55 +0000 (10:56 +0200)
Replace the current repeated code to check received length in mergeable
mode with the new check_mergeable_len helper.

Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Link: https://patch.msgid.link/20250630144212.48471-4-minhquangbui99@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/virtio_net.c

index 535a4534c27f1d5da5af47ecbbff793df296ac29..ecd3f46deb5d7004cf6e48218a8cbda80377960a 100644 (file)
@@ -2156,7 +2156,6 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
                                      struct virtnet_rq_stats *stats)
 {
        struct virtio_net_hdr_mrg_rxbuf *hdr = buf;
-       unsigned int headroom, tailroom, room;
        struct skb_shared_info *shinfo;
        unsigned int xdp_frags_truesz = 0;
        unsigned int truesize;
@@ -2202,20 +2201,14 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev,
                page = virt_to_head_page(buf);
                offset = buf - page_address(page);
 
-               truesize = mergeable_ctx_to_truesize(ctx);
-               headroom = mergeable_ctx_to_headroom(ctx);
-               tailroom = headroom ? sizeof(struct skb_shared_info) : 0;
-               room = SKB_DATA_ALIGN(headroom + tailroom);
-
-               xdp_frags_truesz += truesize;
-               if (unlikely(len > truesize - room)) {
+               if (check_mergeable_len(dev, ctx, len)) {
                        put_page(page);
-                       pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
-                                dev->name, len, (unsigned long)(truesize - room));
-                       DEV_STATS_INC(dev, rx_length_errors);
                        goto err;
                }
 
+               truesize = mergeable_ctx_to_truesize(ctx);
+               xdp_frags_truesz += truesize;
+
                frag = &shinfo->frags[shinfo->nr_frags++];
                skb_frag_fill_page_desc(frag, page, offset, len);
                if (page_is_pfmemalloc(page))
@@ -2429,18 +2422,12 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
        struct sk_buff *head_skb, *curr_skb;
        unsigned int truesize = mergeable_ctx_to_truesize(ctx);
        unsigned int headroom = mergeable_ctx_to_headroom(ctx);
-       unsigned int tailroom = headroom ? sizeof(struct skb_shared_info) : 0;
-       unsigned int room = SKB_DATA_ALIGN(headroom + tailroom);
 
        head_skb = NULL;
        u64_stats_add(&stats->bytes, len - vi->hdr_len);
 
-       if (unlikely(len > truesize - room)) {
-               pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
-                        dev->name, len, (unsigned long)(truesize - room));
-               DEV_STATS_INC(dev, rx_length_errors);
+       if (check_mergeable_len(dev, ctx, len))
                goto err_skb;
-       }
 
        if (unlikely(vi->xdp_enabled)) {
                struct bpf_prog *xdp_prog;
@@ -2475,17 +2462,10 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
                u64_stats_add(&stats->bytes, len);
                page = virt_to_head_page(buf);
 
-               truesize = mergeable_ctx_to_truesize(ctx);
-               headroom = mergeable_ctx_to_headroom(ctx);
-               tailroom = headroom ? sizeof(struct skb_shared_info) : 0;
-               room = SKB_DATA_ALIGN(headroom + tailroom);
-               if (unlikely(len > truesize - room)) {
-                       pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
-                                dev->name, len, (unsigned long)(truesize - room));
-                       DEV_STATS_INC(dev, rx_length_errors);
+               if (check_mergeable_len(dev, ctx, len))
                        goto err_skb;
-               }
 
+               truesize = mergeable_ctx_to_truesize(ctx);
                curr_skb  = virtnet_skb_append_frag(head_skb, curr_skb, page,
                                                    buf, len, truesize);
                if (!curr_skb)