Set metadata size building the skb from xdp_buff in mediatek driver.
mtk_eth_soc driver sets xdp headroom to XDP_PACKET_HEADROOM so the
headroom is large enough to contain xdp_frame and xdp metadata.
Please note this patch is just compiled tested.

Reviewed-by: Michal Kubiak <michal.kub...@intel.com>
Signed-off-by: Lorenzo Bianconi <lore...@kernel.org>
---
 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c 
b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 
922330b3f4d70421276ecd3f4ab175b3ae263f71..43197b28b3e745319e974c6022a6a51b6953f60a
 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -2122,7 +2122,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int 
budget,
                if (ring->page_pool) {
                        struct page *page = virt_to_head_page(data);
                        struct xdp_buff xdp;
-                       u32 ret;
+                       u32 ret, metasize;
 
                        new_data = mtk_page_pool_get_buff(ring->page_pool,
                                                          &dma_addr,
@@ -2138,7 +2138,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int 
budget,
 
                        xdp_init_buff(&xdp, PAGE_SIZE, &ring->xdp_q);
                        xdp_prepare_buff(&xdp, data, MTK_PP_HEADROOM, pktlen,
-                                        false);
+                                        true);
                        xdp_buff_clear_frags_flag(&xdp);
 
                        ret = mtk_xdp_run(eth, ring, &xdp, netdev);
@@ -2158,6 +2158,9 @@ static int mtk_poll_rx(struct napi_struct *napi, int 
budget,
 
                        skb_reserve(skb, xdp.data - xdp.data_hard_start);
                        skb_put(skb, xdp.data_end - xdp.data);
+                       metasize = xdp.data - xdp.data_meta;
+                       if (metasize)
+                               skb_metadata_set(skb, metasize);
                        skb_mark_for_recycle(skb);
                } else {
                        if (ring->frag_size <= PAGE_SIZE)

-- 
2.48.1


Reply via email to