net/mlx5e: Use kernel's mechanism to avoid missing NAPIs
We used a channel state bit MLX5E_CHANNEL_NAPI_SCHED to make sure no NAPI is missed when a channel's napi_schedule() is called for completion events of the different channel's resources/rings while NAPI is currently running. Now, as similar mechanism is implemented in kernel, ("39e6c8208d7b net: solve a NAPI race"), we obsolete our own implementation and rely on the return value of napi_complete_done(). This patch removes a redundant overhead of atomic bit operations. Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Cc: Eric Dumazet <edumazet@google.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
29c2849e0d
commit
7b33aaeaae
|
@ -570,10 +570,6 @@ struct mlx5e_rq {
|
|||
struct mlx5_core_mkey umr_mkey;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
enum channel_flags {
|
||||
MLX5E_CHANNEL_NAPI_SCHED = 1,
|
||||
};
|
||||
|
||||
struct mlx5e_channel {
|
||||
/* data path */
|
||||
struct mlx5e_rq rq;
|
||||
|
@ -585,7 +581,6 @@ struct mlx5e_channel {
|
|||
struct net_device *netdev;
|
||||
__be32 mkey_be;
|
||||
u8 num_tc;
|
||||
unsigned long flags;
|
||||
|
||||
/* control */
|
||||
struct mlx5e_priv *priv;
|
||||
|
|
|
@ -3697,7 +3697,6 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog)
|
|||
|
||||
set_bit(MLX5E_RQ_STATE_ENABLED, &c->rq.state);
|
||||
/* napi_schedule in case we have missed anything */
|
||||
set_bit(MLX5E_CHANNEL_NAPI_SCHED, &c->flags);
|
||||
napi_schedule(&c->napi);
|
||||
|
||||
if (old_prog)
|
||||
|
|
|
@ -40,8 +40,6 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
|
|||
int work_done;
|
||||
int i;
|
||||
|
||||
clear_bit(MLX5E_CHANNEL_NAPI_SCHED, &c->flags);
|
||||
|
||||
for (i = 0; i < c->num_tc; i++)
|
||||
busy |= mlx5e_poll_tx_cq(&c->sq[i].cq, budget);
|
||||
|
||||
|
@ -56,13 +54,8 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
|
|||
if (busy)
|
||||
return budget;
|
||||
|
||||
napi_complete_done(napi, work_done);
|
||||
|
||||
/* avoid losing completion event during/after polling cqs */
|
||||
if (test_bit(MLX5E_CHANNEL_NAPI_SCHED, &c->flags)) {
|
||||
napi_schedule(napi);
|
||||
if (unlikely(!napi_complete_done(napi, work_done)))
|
||||
return work_done;
|
||||
}
|
||||
|
||||
for (i = 0; i < c->num_tc; i++)
|
||||
mlx5e_cq_arm(&c->sq[i].cq);
|
||||
|
@ -81,7 +74,6 @@ void mlx5e_completion_event(struct mlx5_core_cq *mcq)
|
|||
struct mlx5e_cq *cq = container_of(mcq, struct mlx5e_cq, mcq);
|
||||
|
||||
cq->event_ctr++;
|
||||
set_bit(MLX5E_CHANNEL_NAPI_SCHED, &cq->channel->flags);
|
||||
napi_schedule(cq->napi);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue