static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,
                                            struct xdp_buff *xdp)
 {
+       unsigned int totalsize = xdp->data_end - xdp->data_meta;
        unsigned int metasize = xdp->data - xdp->data_meta;
-       unsigned int datasize = xdp->data_end - xdp->data;
-       unsigned int totalsize = metasize + datasize;
        struct sk_buff *skb;
 
-       skb = __napi_alloc_skb(&ring->q_vector->napi,
-                              xdp->data_end - xdp->data_hard_start,
+       net_prefetch(xdp->data_meta);
+
+       skb = __napi_alloc_skb(&ring->q_vector->napi, totalsize,
                               GFP_ATOMIC | __GFP_NOWARN);
        if (unlikely(!skb))
                return NULL;
 
-       skb_reserve(skb, xdp->data_meta - xdp->data_hard_start);
-       memcpy(__skb_put(skb, totalsize), xdp->data_meta, totalsize);
+       memcpy(__skb_put(skb, totalsize), xdp->data_meta,
+              ALIGN(totalsize, sizeof(long)));
+
        if (metasize) {
                skb_metadata_set(skb, metasize);
                __skb_pull(skb, metasize);