OSDN Git Service

net: mvneta: move mvneta_run_xdp after descriptors processing
authorLorenzo Bianconi <lorenzo@kernel.org>
Thu, 16 Jul 2020 22:16:31 +0000 (00:16 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Jul 2020 01:28:33 +0000 (18:28 -0700)
Move mvneta_run_xdp routine after all descriptor processing. This is a
preliminary patch to enable multi-buffers and JUMBO frames support for
XDP

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mvneta.c

index e9b3fb7..0214194 100644 (file)
@@ -2230,12 +2230,11 @@ mvneta_run_xdp(struct mvneta_port *pp, struct mvneta_rx_queue *rxq,
        return ret;
 }
 
-static int
+static void
 mvneta_swbm_rx_frame(struct mvneta_port *pp,
                     struct mvneta_rx_desc *rx_desc,
                     struct mvneta_rx_queue *rxq,
                     struct xdp_buff *xdp,
-                    struct bpf_prog *xdp_prog,
                     struct page *page,
                     struct mvneta_stats *stats)
 {
@@ -2244,7 +2243,6 @@ mvneta_swbm_rx_frame(struct mvneta_port *pp,
        struct net_device *dev = pp->dev;
        enum dma_data_direction dma_dir;
        struct skb_shared_info *sinfo;
-       int ret = 0;
 
        if (MVNETA_SKB_SIZE(rx_desc->data_size) > PAGE_SIZE) {
                len = MVNETA_MAX_RX_BUF_SIZE;
@@ -2270,13 +2268,8 @@ mvneta_swbm_rx_frame(struct mvneta_port *pp,
        sinfo = xdp_get_shared_info_from_buff(xdp);
        sinfo->nr_frags = 0;
 
-       if (xdp_prog)
-               ret = mvneta_run_xdp(pp, rxq, xdp_prog, xdp, stats);
-
        rxq->left_size = rx_desc->data_size - len;
        rx_desc->buf_phys_addr = 0;
-
-       return ret;
 }
 
 static void
@@ -2385,20 +2378,15 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
                rxq->refill_num++;
 
                if (rx_status & MVNETA_RXD_FIRST_DESC) {
-                       int err;
-
                        /* Check errors only for FIRST descriptor */
                        if (rx_status & MVNETA_RXD_ERR_SUMMARY) {
                                mvneta_rx_error(pp, rx_desc);
                                goto next;
                        }
 
-                       err = mvneta_swbm_rx_frame(pp, rx_desc, rxq, &xdp_buf,
-                                                  xdp_prog, page, &ps);
-                       if (err)
-                               continue;
-
                        desc_status = rx_desc->status;
+                       mvneta_swbm_rx_frame(pp, rx_desc, rxq, &xdp_buf, page,
+                                            &ps);
                } else {
                        if (unlikely(!xdp_buf.data_hard_start))
                                continue;
@@ -2417,6 +2405,10 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
                        goto next;
                }
 
+               if (xdp_prog &&
+                   mvneta_run_xdp(pp, rxq, xdp_prog, &xdp_buf, &ps))
+                       goto next;
+
                skb = mvneta_swbm_build_skb(pp, rxq, &xdp_buf, desc_status);
                if (IS_ERR(skb)) {
                        struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats);