when mlx5e_accel_tx_begin() drops the skb, e.g. because psp can't encapsulate it, mlx5e_xmit() returns without posting anything. the skbs before it in a bulk dequeue may have been posted with xmit_more, which defers the doorbell to the next one, and an mpwqe session may be open. the device then doesn't see them until the next transmit on that sq, and since the queue isn't stopped, the tx watchdog doesn't fire. flush the sq on this drop like the dma error paths do: close the mpwqe session, post a nop and ring the doorbell. mlx5e_tx_flush() doesn't check whether the nop leaves less than stop_room in the sq. for the dma error paths that is rare, but a run of offload drops would post nops without stopping the queue, and could overrun wqes in flight. so check it in mlx5e_tx_flush(), like the other producers do. the completion of the nop wakes the queue again. the next patch makes the psp drop reachable from user space, with an ipv6 extension header set on a psp socket. Fixes: 2ac9cfe78223 ("net/mlx5e: IPSec, Add Innova IPSec offload TX data path") Signed-off-by: Todd Freed --- drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c index 14479da98f42..006bf976def1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c @@ -365,6 +365,7 @@ static void mlx5e_tx_flush(struct mlx5e_txqsq *sq) }; wqe = mlx5e_post_nop(&sq->wq, sq->sqn, &sq->pc); + mlx5e_tx_check_stop(sq); mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, &wqe->ctrl); } @@ -672,8 +673,13 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev) } /* May send SKBs and WQEs. */ - if (unlikely(!mlx5e_accel_tx_begin(dev, sq, skb, &accel))) + if (unlikely(!mlx5e_accel_tx_begin(dev, sq, skb, &accel))) { + /* The skb was dropped: ring the doorbell which the previous + * ones may have deferred to it + */ + mlx5e_tx_flush(sq); return NETDEV_TX_OK; + } mlx5e_sq_xmit_prepare(sq, skb, &accel, &attr); -- 2.53.0-Meta