mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-17 16:14:25 +08:00
octeontx2-pf: Do xdp_do_flush() after redirects.
xdp_do_flush() should be invoked before leaving the NAPI poll function
if XDP-redirect has been performed.
Invoke xdp_do_flush() before leaving NAPI.
Cc: Geetha sowjanya <gakula@marvell.com>
Cc: Subbaraya Sundeep <sbhatta@marvell.com>
Cc: Sunil Goutham <sgoutham@marvell.com>
Cc: hariprasad <hkelam@marvell.com>
Fixes: 06059a1a9a
("octeontx2-pf: Add XDP support to netdev PF")
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: Geethasowjanya Akula <gakula@marvell.com>
Acked-by: Jesper Dangaard Brouer <hawk@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
edc0140cc3
commit
70b2b68926
@ -29,7 +29,8 @@
|
||||
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);
|
||||
struct otx2_cq_queue *cq,
|
||||
bool *need_xdp_flush);
|
||||
|
||||
static int otx2_nix_cq_op_status(struct otx2_nic *pfvf,
|
||||
struct otx2_cq_queue *cq)
|
||||
@ -337,7 +338,7 @@ static bool otx2_check_rcv_errors(struct otx2_nic *pfvf,
|
||||
static void otx2_rcv_pkt_handler(struct otx2_nic *pfvf,
|
||||
struct napi_struct *napi,
|
||||
struct otx2_cq_queue *cq,
|
||||
struct nix_cqe_rx_s *cqe)
|
||||
struct nix_cqe_rx_s *cqe, bool *need_xdp_flush)
|
||||
{
|
||||
struct nix_rx_parse_s *parse = &cqe->parse;
|
||||
struct nix_rx_sg_s *sg = &cqe->sg;
|
||||
@ -353,7 +354,7 @@ 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))
|
||||
if (otx2_xdp_rcv_pkt_handler(pfvf, pfvf->xdp_prog, cqe, cq, need_xdp_flush))
|
||||
return;
|
||||
|
||||
skb = napi_get_frags(napi);
|
||||
@ -388,6 +389,7 @@ static int otx2_rx_napi_handler(struct otx2_nic *pfvf,
|
||||
struct napi_struct *napi,
|
||||
struct otx2_cq_queue *cq, int budget)
|
||||
{
|
||||
bool need_xdp_flush = false;
|
||||
struct nix_cqe_rx_s *cqe;
|
||||
int processed_cqe = 0;
|
||||
|
||||
@ -409,13 +411,15 @@ process_cqe:
|
||||
cq->cq_head++;
|
||||
cq->cq_head &= (cq->cqe_cnt - 1);
|
||||
|
||||
otx2_rcv_pkt_handler(pfvf, napi, cq, cqe);
|
||||
otx2_rcv_pkt_handler(pfvf, napi, cq, cqe, &need_xdp_flush);
|
||||
|
||||
cqe->hdr.cqe_type = NIX_XQE_TYPE_INVALID;
|
||||
cqe->sg.seg_addr = 0x00;
|
||||
processed_cqe++;
|
||||
cq->pend_cqe--;
|
||||
}
|
||||
if (need_xdp_flush)
|
||||
xdp_do_flush();
|
||||
|
||||
/* Free CQEs to HW */
|
||||
otx2_write64(pfvf, NIX_LF_CQ_OP_DOOR,
|
||||
@ -1354,7 +1358,8 @@ bool otx2_xdp_sq_append_pkt(struct otx2_nic *pfvf, u64 iova, int len, u16 qidx)
|
||||
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)
|
||||
struct otx2_cq_queue *cq,
|
||||
bool *need_xdp_flush)
|
||||
{
|
||||
unsigned char *hard_start, *data;
|
||||
int qidx = cq->cq_idx;
|
||||
@ -1391,8 +1396,10 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,
|
||||
|
||||
otx2_dma_unmap_page(pfvf, iova, pfvf->rbsize,
|
||||
DMA_FROM_DEVICE);
|
||||
if (!err)
|
||||
if (!err) {
|
||||
*need_xdp_flush = true;
|
||||
return true;
|
||||
}
|
||||
put_page(page);
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user