diff --git a/drivers/net/ethernet/google/gve/gve_rx_dqo.c b/drivers/net/ethernet/google/gve/gve_rx_dqo.c index 8271f731a91f..36ad2b02d7d9 100644 --- a/drivers/net/ethernet/google/gve/gve_rx_dqo.c +++ b/drivers/net/ethernet/google/gve/gve_rx_dqo.c @@ -770,8 +770,7 @@ static int gve_rx_xsk_dqo(struct napi_struct *napi, struct gve_rx_ring *rx, } /* Copy the data to skb */ - rx->ctx.skb_head = gve_rx_copy_data(priv->dev, napi, - xdp->data, buf_len); + rx->ctx.skb_head = xdp_build_skb_from_zc(xdp); if (unlikely(!rx->ctx.skb_head)) { xsk_buff_free(xdp); gve_free_buf_state(rx, buf_state); @@ -779,8 +778,6 @@ static int gve_rx_xsk_dqo(struct napi_struct *napi, struct gve_rx_ring *rx, } rx->ctx.skb_tail = rx->ctx.skb_head; - /* Free XSK buffer and Buffer state */ - xsk_buff_free(xdp); gve_free_buf_state(rx, buf_state); /* Update Stats */ @@ -919,7 +916,7 @@ static int gve_rx_dqo(struct napi_struct *napi, struct gve_rx_ring *rx, buf_state->page_info.page_address + buf_state->page_info.page_offset, buf_state->page_info.pad, - buf_len, false); + buf_len, true); gve_xdp.gve = priv; gve_xdp.compl_desc = compl_desc; @@ -933,9 +930,17 @@ static int gve_rx_dqo(struct napi_struct *napi, struct gve_rx_ring *rx, return 0; } + rx->ctx.skb_head = xdp_build_skb_from_buff(&gve_xdp.xdp); + if (unlikely(!rx->ctx.skb_head)) + goto error; + rx->ctx.skb_tail = rx->ctx.skb_head; + + gve_reuse_buffer(rx, buf_state); + u64_stats_update_begin(&rx->statss); rx->xdp_actions[XDP_PASS]++; u64_stats_update_end(&rx->statss); + return 0; } if (eop && buf_len <= priv->rx_copybreak &&