mirror of
https://github.com/torvalds/linux.git
synced 2026-08-01 12:11:59 +02:00
Merge branch 'net-xdp-add-missing-metadata-support-for-some-xdp-drvs'
Lorenzo Bianconi says: ==================== net: xdp: Add missing metadata support for some xdp drvs Introduce missing metadata support for some xdp drivers setting metadata size building the skb from xdp_buff. Please note most of the drivers are just compile tested. v1: https://lore.kernel.org/20250311-mvneta-xdp-meta-v1-0-36cf1c99790e@kernel.org ==================== Link: https://patch.msgid.link/20250318-mvneta-xdp-meta-v2-0-b6075778f61f@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
82b06429dd
|
|
@ -2342,7 +2342,7 @@ mvneta_swbm_rx_frame(struct mvneta_port *pp,
|
|||
prefetch(data);
|
||||
xdp_buff_clear_frags_flag(xdp);
|
||||
xdp_prepare_buff(xdp, data, pp->rx_offset_correction + MVNETA_MH_SIZE,
|
||||
data_len, false);
|
||||
data_len, true);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -2396,6 +2396,7 @@ mvneta_swbm_build_skb(struct mvneta_port *pp, struct page_pool *pool,
|
|||
struct xdp_buff *xdp, u32 desc_status)
|
||||
{
|
||||
struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(xdp);
|
||||
u32 metasize = xdp->data - xdp->data_meta;
|
||||
struct sk_buff *skb;
|
||||
u8 num_frags;
|
||||
|
||||
|
|
@ -2410,6 +2411,8 @@ mvneta_swbm_build_skb(struct mvneta_port *pp, struct page_pool *pool,
|
|||
|
||||
skb_reserve(skb, xdp->data - xdp->data_hard_start);
|
||||
skb_put(skb, xdp->data_end - xdp->data);
|
||||
if (metasize)
|
||||
skb_metadata_set(skb, metasize);
|
||||
skb->ip_summed = mvneta_rx_csum(pp, desc_status);
|
||||
|
||||
if (unlikely(xdp_buff_has_frags(xdp)))
|
||||
|
|
|
|||
|
|
@ -3915,13 +3915,13 @@ static int mvpp2_rx(struct mvpp2_port *port, struct napi_struct *napi,
|
|||
|
||||
while (rx_done < rx_todo) {
|
||||
struct mvpp2_rx_desc *rx_desc = mvpp2_rxq_next_desc_get(rxq);
|
||||
u32 rx_status, timestamp, metasize = 0;
|
||||
struct mvpp2_bm_pool *bm_pool;
|
||||
struct page_pool *pp = NULL;
|
||||
struct sk_buff *skb;
|
||||
unsigned int frag_size;
|
||||
dma_addr_t dma_addr;
|
||||
phys_addr_t phys_addr;
|
||||
u32 rx_status, timestamp;
|
||||
int pool, rx_bytes, err, ret;
|
||||
struct page *page;
|
||||
void *data;
|
||||
|
|
@ -3983,7 +3983,7 @@ static int mvpp2_rx(struct mvpp2_port *port, struct napi_struct *napi,
|
|||
xdp_init_buff(&xdp, PAGE_SIZE, xdp_rxq);
|
||||
xdp_prepare_buff(&xdp, data,
|
||||
MVPP2_MH_SIZE + MVPP2_SKB_HEADROOM,
|
||||
rx_bytes, false);
|
||||
rx_bytes, true);
|
||||
|
||||
ret = mvpp2_run_xdp(port, xdp_prog, &xdp, pp, &ps);
|
||||
|
||||
|
|
@ -3999,6 +3999,8 @@ static int mvpp2_rx(struct mvpp2_port *port, struct napi_struct *napi,
|
|||
ps.rx_bytes += rx_bytes;
|
||||
continue;
|
||||
}
|
||||
|
||||
metasize = xdp.data - xdp.data_meta;
|
||||
}
|
||||
|
||||
if (frag_size)
|
||||
|
|
@ -4038,6 +4040,8 @@ static int mvpp2_rx(struct mvpp2_port *port, struct napi_struct *napi,
|
|||
|
||||
skb_reserve(skb, MVPP2_MH_SIZE + MVPP2_SKB_HEADROOM);
|
||||
skb_put(skb, rx_bytes);
|
||||
if (metasize)
|
||||
skb_metadata_set(skb, metasize);
|
||||
skb->ip_summed = mvpp2_rx_csum(port, rx_status);
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,
|
|||
struct bpf_prog *prog,
|
||||
struct nix_cqe_rx_s *cqe,
|
||||
struct otx2_cq_queue *cq,
|
||||
bool *need_xdp_flush);
|
||||
u32 *metasize, bool *need_xdp_flush);
|
||||
|
||||
static void otx2_sq_set_sqe_base(struct otx2_snd_queue *sq,
|
||||
struct sk_buff *skb)
|
||||
|
|
@ -336,6 +336,7 @@ static void otx2_rcv_pkt_handler(struct otx2_nic *pfvf,
|
|||
struct nix_rx_sg_s *sg = &cqe->sg;
|
||||
struct sk_buff *skb = NULL;
|
||||
void *end, *start;
|
||||
u32 metasize = 0;
|
||||
u64 *seg_addr;
|
||||
u16 *seg_size;
|
||||
int seg;
|
||||
|
|
@ -346,7 +347,8 @@ static void otx2_rcv_pkt_handler(struct otx2_nic *pfvf,
|
|||
}
|
||||
|
||||
if (pfvf->xdp_prog)
|
||||
if (otx2_xdp_rcv_pkt_handler(pfvf, pfvf->xdp_prog, cqe, cq, need_xdp_flush))
|
||||
if (otx2_xdp_rcv_pkt_handler(pfvf, pfvf->xdp_prog, cqe, cq,
|
||||
&metasize, need_xdp_flush))
|
||||
return;
|
||||
|
||||
skb = napi_get_frags(napi);
|
||||
|
|
@ -378,6 +380,8 @@ static void otx2_rcv_pkt_handler(struct otx2_nic *pfvf,
|
|||
skb->mark = parse->match_id;
|
||||
|
||||
skb_mark_for_recycle(skb);
|
||||
if (metasize)
|
||||
skb_metadata_set(skb, metasize);
|
||||
|
||||
napi_gro_frags(napi);
|
||||
}
|
||||
|
|
@ -1482,7 +1486,7 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,
|
|||
struct bpf_prog *prog,
|
||||
struct nix_cqe_rx_s *cqe,
|
||||
struct otx2_cq_queue *cq,
|
||||
bool *need_xdp_flush)
|
||||
u32 *metasize, bool *need_xdp_flush)
|
||||
{
|
||||
struct xdp_buff xdp, *xsk_buff = NULL;
|
||||
unsigned char *hard_start;
|
||||
|
|
@ -1514,13 +1518,14 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,
|
|||
|
||||
hard_start = (unsigned char *)phys_to_virt(pa);
|
||||
xdp_prepare_buff(&xdp, hard_start, OTX2_HEAD_ROOM,
|
||||
cqe->sg.seg_size, false);
|
||||
cqe->sg.seg_size, true);
|
||||
|
||||
act = bpf_prog_run_xdp(prog, &xdp);
|
||||
|
||||
handle_xdp_verdict:
|
||||
switch (act) {
|
||||
case XDP_PASS:
|
||||
*metasize = xdp.data - xdp.data_meta;
|
||||
break;
|
||||
case XDP_TX:
|
||||
qidx += pfvf->hw.tx_queues;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ u32 mana_run_xdp(struct net_device *ndev, struct mana_rxq *rxq,
|
|||
goto out;
|
||||
|
||||
xdp_init_buff(xdp, PAGE_SIZE, &rxq->xdp_rxq);
|
||||
xdp_prepare_buff(xdp, buf_va, XDP_PACKET_HEADROOM, pkt_len, false);
|
||||
xdp_prepare_buff(xdp, buf_va, XDP_PACKET_HEADROOM, pkt_len, true);
|
||||
|
||||
act = bpf_prog_run_xdp(prog, xdp);
|
||||
|
||||
|
|
|
|||
|
|
@ -1559,8 +1559,12 @@ static struct sk_buff *mana_build_skb(struct mana_rxq *rxq, void *buf_va,
|
|||
return NULL;
|
||||
|
||||
if (xdp->data_hard_start) {
|
||||
u32 metasize = xdp->data - xdp->data_meta;
|
||||
|
||||
skb_reserve(skb, xdp->data - xdp->data_hard_start);
|
||||
skb_put(skb, xdp->data_end - xdp->data);
|
||||
if (metasize)
|
||||
skb_metadata_set(skb, metasize);
|
||||
return skb;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -970,7 +970,7 @@ static int netsec_process_rx(struct netsec_priv *priv, int budget)
|
|||
struct netsec_de *de = dring->vaddr + (DESC_SZ * idx);
|
||||
struct netsec_desc *desc = &dring->desc[idx];
|
||||
struct page *page = virt_to_page(desc->addr);
|
||||
u32 xdp_result = NETSEC_XDP_PASS;
|
||||
u32 metasize, xdp_result = NETSEC_XDP_PASS;
|
||||
struct sk_buff *skb = NULL;
|
||||
u16 pkt_len, desc_len;
|
||||
dma_addr_t dma_handle;
|
||||
|
|
@ -1019,7 +1019,7 @@ static int netsec_process_rx(struct netsec_priv *priv, int budget)
|
|||
prefetch(desc->addr);
|
||||
|
||||
xdp_prepare_buff(&xdp, desc->addr, NETSEC_RXBUF_HEADROOM,
|
||||
pkt_len, false);
|
||||
pkt_len, true);
|
||||
|
||||
if (xdp_prog) {
|
||||
xdp_result = netsec_run_xdp(priv, xdp_prog, &xdp);
|
||||
|
|
@ -1048,6 +1048,9 @@ static int netsec_process_rx(struct netsec_priv *priv, 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->protocol = eth_type_trans(skb, priv->ndev);
|
||||
|
||||
if (priv->rx_cksum_offload_flag &&
|
||||
|
|
|
|||
|
|
@ -351,6 +351,7 @@ static void cpsw_rx_handler(void *token, int len, int status)
|
|||
int ret = 0, port, ch = xmeta->ch;
|
||||
int headroom = CPSW_HEADROOM_NA;
|
||||
struct net_device *ndev = xmeta->ndev;
|
||||
u32 metasize = 0;
|
||||
struct cpsw_priv *priv;
|
||||
struct page_pool *pool;
|
||||
struct sk_buff *skb;
|
||||
|
|
@ -400,7 +401,7 @@ static void cpsw_rx_handler(void *token, int len, int status)
|
|||
size -= CPSW_RX_VLAN_ENCAP_HDR_SIZE;
|
||||
}
|
||||
|
||||
xdp_prepare_buff(&xdp, pa, headroom, size, false);
|
||||
xdp_prepare_buff(&xdp, pa, headroom, size, true);
|
||||
|
||||
port = priv->emac_port + cpsw->data.dual_emac;
|
||||
ret = cpsw_run_xdp(priv, ch, &xdp, page, port, &len);
|
||||
|
|
@ -408,6 +409,7 @@ static void cpsw_rx_handler(void *token, int len, int status)
|
|||
goto requeue;
|
||||
|
||||
headroom = xdp.data - xdp.data_hard_start;
|
||||
metasize = xdp.data - xdp.data_meta;
|
||||
|
||||
/* XDP prog can modify vlan tag, so can't use encap header */
|
||||
status &= ~CPDMA_RX_VLAN_ENCAP;
|
||||
|
|
@ -423,6 +425,8 @@ static void cpsw_rx_handler(void *token, int len, int status)
|
|||
|
||||
skb_reserve(skb, headroom);
|
||||
skb_put(skb, len);
|
||||
if (metasize)
|
||||
skb_metadata_set(skb, metasize);
|
||||
skb->dev = ndev;
|
||||
if (status & CPDMA_RX_VLAN_ENCAP)
|
||||
cpsw_rx_vlan_encap(skb);
|
||||
|
|
|
|||
|
|
@ -293,6 +293,7 @@ static void cpsw_rx_handler(void *token, int len, int status)
|
|||
struct page_pool *pool;
|
||||
struct sk_buff *skb;
|
||||
struct xdp_buff xdp;
|
||||
u32 metasize = 0;
|
||||
int ret = 0;
|
||||
dma_addr_t dma;
|
||||
|
||||
|
|
@ -345,13 +346,14 @@ static void cpsw_rx_handler(void *token, int len, int status)
|
|||
size -= CPSW_RX_VLAN_ENCAP_HDR_SIZE;
|
||||
}
|
||||
|
||||
xdp_prepare_buff(&xdp, pa, headroom, size, false);
|
||||
xdp_prepare_buff(&xdp, pa, headroom, size, true);
|
||||
|
||||
ret = cpsw_run_xdp(priv, ch, &xdp, page, priv->emac_port, &len);
|
||||
if (ret != CPSW_XDP_PASS)
|
||||
goto requeue;
|
||||
|
||||
headroom = xdp.data - xdp.data_hard_start;
|
||||
metasize = xdp.data - xdp.data_meta;
|
||||
|
||||
/* XDP prog can modify vlan tag, so can't use encap header */
|
||||
status &= ~CPDMA_RX_VLAN_ENCAP;
|
||||
|
|
@ -368,6 +370,8 @@ static void cpsw_rx_handler(void *token, int len, int status)
|
|||
skb->offload_fwd_mark = priv->offload_fwd_mark;
|
||||
skb_reserve(skb, headroom);
|
||||
skb_put(skb, len);
|
||||
if (metasize)
|
||||
skb_metadata_set(skb, metasize);
|
||||
skb->dev = ndev;
|
||||
if (status & CPDMA_RX_VLAN_ENCAP)
|
||||
cpsw_rx_vlan_encap(skb);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user