bna: Add synchronization for tx ring.
authorBenjamin Poirier <bpoirier@suse.com>
Mon, 7 Nov 2016 09:57:56 +0000 (17:57 +0800)
committerJiri Slaby <jslaby@suse.cz>
Fri, 27 Jan 2017 16:14:54 +0000 (17:14 +0100)
commit32dacf499429803e502361a3a778cbbd691d368b
tree3d4333635863a1f2d1c641944778483ce3afc471
parente4f13c5f27d6bfb2fea565d346273b0c74023ae6
bna: Add synchronization for tx ring.

commit d667f78514c656a6a8bf0b3d6134a7fe5cd4d317 upstream.

We received two reports of BUG_ON in bnad_txcmpl_process() where
hw_consumer_index appeared to be ahead of producer_index. Out of order
write/read of these variables could explain these reports.

bnad_start_xmit(), as a producer of tx descriptors, has a few memory
barriers sprinkled around writes to producer_index and the device's
doorbell but they're not paired with anything in bnad_txcmpl_process(), a
consumer.

Since we are synchronizing with a device, we must use mandatory barriers,
not smp_*. Also, I didn't see the purpose of the last smp_mb() in
bnad_start_xmit().

Signed-off-by: Benjamin Poirier <bpoirier@suse.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
drivers/net/ethernet/brocade/bna/bnad.c