net/mlx4_en: use napi_complete_done() in TX completion
authorEric Dumazet <edumazet@google.com>
Wed, 22 Apr 2020 16:13:29 +0000 (09:13 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Apr 2020 19:43:20 +0000 (12:43 -0700)
In order to benefit from the new napi_defer_hard_irqs feature,
we need to use napi_complete_done() variant in this driver.

RX path is already using it, this patch implements TX completion side.

mlx4_en_process_tx_cq() now returns the amount of retired packets,
instead of a boolean, so that mlx4_en_poll_tx_cq() can pass
this value to napi_complete_done().

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_rx.c
drivers/net/ethernet/mellanox/mlx4/en_tx.c
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

index db3552f..7871392 100644 (file)
@@ -946,7 +946,7 @@ int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget)
                xdp_tx_cq = priv->tx_cq[TX_XDP][cq->ring];
                if (xdp_tx_cq->xdp_busy) {
                        clean_complete = mlx4_en_process_tx_cq(dev, xdp_tx_cq,
-                                                              budget);
+                                                              budget) < budget;
                        xdp_tx_cq->xdp_busy = !clean_complete;
                }
        }
index 4d5ca30..a99d3ed 100644 (file)
@@ -382,8 +382,8 @@ int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring)
        return cnt;
 }
 
-bool mlx4_en_process_tx_cq(struct net_device *dev,
-                          struct mlx4_en_cq *cq, int napi_budget)
+int mlx4_en_process_tx_cq(struct net_device *dev,
+                         struct mlx4_en_cq *cq, int napi_budget)
 {
        struct mlx4_en_priv *priv = netdev_priv(dev);
        struct mlx4_cq *mcq = &cq->mcq;
@@ -405,7 +405,7 @@ bool mlx4_en_process_tx_cq(struct net_device *dev,
        u32 ring_cons;
 
        if (unlikely(!priv->port_up))
-               return true;
+               return 0;
 
        netdev_txq_bql_complete_prefetchw(ring->tx_queue);
 
@@ -480,7 +480,7 @@ bool mlx4_en_process_tx_cq(struct net_device *dev,
        WRITE_ONCE(ring->cons, ring_cons + txbbs_skipped);
 
        if (cq->type == TX_XDP)
-               return done < budget;
+               return done;
 
        netdev_tx_completed_queue(ring->tx_queue, packets, bytes);
 
@@ -492,7 +492,7 @@ bool mlx4_en_process_tx_cq(struct net_device *dev,
                ring->wake_queue++;
        }
 
-       return done < budget;
+       return done;
 }
 
 void mlx4_en_tx_irq(struct mlx4_cq *mcq)
@@ -512,14 +512,14 @@ int mlx4_en_poll_tx_cq(struct napi_struct *napi, int budget)
        struct mlx4_en_cq *cq = container_of(napi, struct mlx4_en_cq, napi);
        struct net_device *dev = cq->dev;
        struct mlx4_en_priv *priv = netdev_priv(dev);
-       bool clean_complete;
+       int work_done;
 
-       clean_complete = mlx4_en_process_tx_cq(dev, cq, budget);
-       if (!clean_complete)
+       work_done = mlx4_en_process_tx_cq(dev, cq, budget);
+       if (work_done >= budget)
                return budget;
 
-       napi_complete(napi);
-       mlx4_en_arm_cq(priv, cq);
+       if (napi_complete_done(napi, work_done))
+               mlx4_en_arm_cq(priv, cq);
 
        return 0;
 }
index 630f159..9f56036 100644 (file)
@@ -737,8 +737,8 @@ int mlx4_en_process_rx_cq(struct net_device *dev,
                          int budget);
 int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget);
 int mlx4_en_poll_tx_cq(struct napi_struct *napi, int budget);
-bool mlx4_en_process_tx_cq(struct net_device *dev,
-                          struct mlx4_en_cq *cq, int napi_budget);
+int mlx4_en_process_tx_cq(struct net_device *dev,
+                         struct mlx4_en_cq *cq, int napi_budget);
 u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv,
                         struct mlx4_en_tx_ring *ring,
                         int index, u64 timestamp,