{
        int i;
 
+       if (likely(!xdp_buff_has_frags(xdp)))
+               goto out;
+
        for (i = 0; i < sinfo->nr_frags; i++)
                page_pool_put_full_page(rxq->page_pool,
                                        skb_frag_page(&sinfo->frags[i]), true);
+
+out:
        page_pool_put_page(rxq->page_pool, virt_to_head_page(xdp->data),
                           sync_len, true);
 }
        int data_len = -MVNETA_MH_SIZE, len;
        struct net_device *dev = pp->dev;
        enum dma_data_direction dma_dir;
-       struct skb_shared_info *sinfo;
 
        if (*size > MVNETA_MAX_RX_BUF_SIZE) {
                len = MVNETA_MAX_RX_BUF_SIZE;
 
        /* Prefetch header */
        prefetch(data);
+       xdp_buff_clear_frags_flag(xdp);
        xdp_prepare_buff(xdp, data, pp->rx_offset_correction + MVNETA_MH_SIZE,
                         data_len, false);
-
-       sinfo = xdp_get_shared_info_from_buff(xdp);
-       sinfo->nr_frags = 0;
 }
 
 static void
                skb_frag_off_set(frag, pp->rx_offset_correction);
                skb_frag_size_set(frag, data_len);
                __skb_frag_set_page(frag, page);
+
+               if (!xdp_buff_has_frags(xdp))
+                       xdp_buff_set_frags_flag(xdp);
        } else {
                page_pool_put_full_page(rxq->page_pool, page, true);
        }
                      struct xdp_buff *xdp, u32 desc_status)
 {
        struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(xdp);
-       int i, num_frags = sinfo->nr_frags;
        struct sk_buff *skb;
+       u8 num_frags;
+       int i;
+
+       if (unlikely(xdp_buff_has_frags(xdp)))
+               num_frags = sinfo->nr_frags;
 
        skb = build_skb(xdp->data_hard_start, PAGE_SIZE);
        if (!skb)
        skb_put(skb, xdp->data_end - xdp->data);
        skb->ip_summed = mvneta_rx_csum(pp, desc_status);
 
+       if (likely(!xdp_buff_has_frags(xdp)))
+               goto out;
+
        for (i = 0; i < num_frags; i++) {
                skb_frag_t *frag = &sinfo->frags[i];
 
                                skb_frag_size(frag), PAGE_SIZE);
        }
 
+out:
        return skb;
 }