net/mlx5e: XDP, Precede XDP-related operations in RQ poll by a loaded program check
authorTariq Toukan <tariqt@mellanox.com>
Wed, 21 Nov 2018 11:56:17 +0000 (13:56 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 21 Dec 2018 06:54:17 +0000 (22:54 -0800)
At the end of the RQ polling loop, some XDP-related operations
might be required. Before checking them one by one, check if
an XDP program is even loaded.
Combine all the checks and operations in a single function in xdp files.

This saves unnecessary checks for non-XDP flows.

Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c

index ad6d471d00dd47c6c4b802ad79fd6dd1e157cf21..cf22ea529c53c34a563f75f9f77ecb7ab2768a72 100644 (file)
@@ -305,3 +305,18 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
 
        return n - drops;
 }
+
+void mlx5e_xdp_rx_poll_complete(struct mlx5e_rq *rq)
+{
+       struct mlx5e_xdpsq *xdpsq = &rq->xdpsq;
+
+       if (xdpsq->doorbell) {
+               mlx5e_xmit_xdp_doorbell(xdpsq);
+               xdpsq->doorbell = false;
+       }
+
+       if (xdpsq->redirect_flush) {
+               xdp_do_flush_map();
+               xdpsq->redirect_flush = false;
+       }
+}
index 6dfab045925f01564b50e47c0340cdc04b4a602f..eecc0392fcffea6dd33e4a2f0050712f78888c4b 100644 (file)
@@ -44,7 +44,7 @@ bool mlx5e_xdp_handle(struct mlx5e_rq *rq, struct mlx5e_dma_info *di,
                      void *va, u16 *rx_headroom, u32 *len);
 bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq);
 void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq);
-
+void mlx5e_xdp_rx_poll_complete(struct mlx5e_rq *rq);
 bool mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xdp_info *xdpi);
 int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
                   u32 flags);
index cdce30a95c6097dbdc53c22978cff3a03cf15248..1d0bb5ff8c260b2aca71368681aad88aa4e627bf 100644 (file)
@@ -1190,7 +1190,6 @@ mpwrq_cqe_out:
 int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget)
 {
        struct mlx5e_rq *rq = container_of(cq, struct mlx5e_rq, cq);
-       struct mlx5e_xdpsq *xdpsq = &rq->xdpsq;
        struct mlx5_cqe64 *cqe;
        int work_done = 0;
 
@@ -1221,15 +1220,8 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget)
        } while ((++work_done < budget) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
 
 out:
-       if (xdpsq->doorbell) {
-               mlx5e_xmit_xdp_doorbell(xdpsq);
-               xdpsq->doorbell = false;
-       }
-
-       if (xdpsq->redirect_flush) {
-               xdp_do_flush_map();
-               xdpsq->redirect_flush = false;
-       }
+       if (rq->xdp_prog)
+               mlx5e_xdp_rx_poll_complete(rq);
 
        mlx5_cqwq_update_db_record(&cq->wq);