net/mlx4_en: use napi_complete_done() in TX completion
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>
This commit is contained in:
parent
7e417a66b8
commit
cf4058dbaa
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue