mlx4: Fix transmit flow control and concurrency
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 22 Jun 2017 20:16:31 +0000 (16:16 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 20 Jul 2017 12:19:46 +0000 (08:19 -0400)
commit9e8d9721a664b300099164af014f6dd9c18f8264
treee5733d9196f24021e591e2eccb58d9ea59bb2ee9
parente7e7a7ba96760526e000d168bf23753c058169c2
mlx4: Fix transmit flow control and concurrency

We had no way to put backpressure on the network stack, and if you sent
packets fast enough, you'd overflow the NIC's TX queues, and get a "CQ
overrun".

Also, I noticed we had no protection for concurrency.  If we had two
concurrent transmitters, they would fight for slots in the ring.  The worst
I could come up with was one flow could get another's payload (consider
TSO'd packets, but someone else's packet replaces one of your frags).
That'd be another nightmare to debug.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/net/mlx4/en_netdev.c
kern/drivers/net/mlx4/en_tx.c
kern/drivers/net/mlx4/main.c
kern/drivers/net/mlx4/mlx4_en.h