ice_construct_skb(struct ice_rx_ring *rx_ring, struct ice_rx_buf *rx_buf,
                  struct xdp_buff *xdp)
 {
+       unsigned int metasize = xdp->data - xdp->data_meta;
        unsigned int size = xdp->data_end - xdp->data;
        unsigned int headlen;
        struct sk_buff *skb;
 
        /* prefetch first cache line of first page */
-       net_prefetch(xdp->data);
+       net_prefetch(xdp->data_meta);
 
        /* allocate a skb to store the frags */
-       skb = __napi_alloc_skb(&rx_ring->q_vector->napi, ICE_RX_HDR_SIZE,
+       skb = __napi_alloc_skb(&rx_ring->q_vector->napi,
+                              ICE_RX_HDR_SIZE + metasize,
                               GFP_ATOMIC | __GFP_NOWARN);
        if (unlikely(!skb))
                return NULL;
                headlen = eth_get_headlen(skb->dev, xdp->data, ICE_RX_HDR_SIZE);
 
        /* align pull length to size of long to optimize memcpy performance */
-       memcpy(__skb_put(skb, headlen), xdp->data, ALIGN(headlen,
-                                                        sizeof(long)));
+       memcpy(__skb_put(skb, headlen + metasize), xdp->data_meta,
+              ALIGN(headlen + metasize, sizeof(long)));
+
+       if (metasize) {
+               skb_metadata_set(skb, metasize);
+               __skb_pull(skb, metasize);
+       }
 
        /* if we exhaust the linear part then add what is left as a frag */
        size -= headlen;