Michael J. Ruhl 28a9a9e83c IB/hfi1: Remove race conditions in user_sdma send path
Packet queue state is over used to determine SDMA descriptor
availablitity and packet queue request state.

cpu 0  ret = user_sdma_send_pkts(req, pcount);
cpu 0  if (atomic_read(&pq->n_reqs))
cpu 1  IRQ user_sdma_txreq_cb calls pq_update() (state to _INACTIVE)
cpu 0        xchg(&pq->state, SDMA_PKT_Q_ACTIVE);

At this point pq->n_reqs == 0 and pq->state is incorrectly
SDMA_PKT_Q_ACTIVE.  The close path will hang waiting for the state
to return to _INACTIVE.

This can also change the state from _DEFERRED to _ACTIVE.  However,
this is a mostly benign race.

Remove the racy code path.

Use n_reqs to determine if a packet queue is active or not.

Reviewed-by: Mitko Haralanov <mitko.haralanov@intel.com>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
2018-09-11 10:05:17 -06:00
..
2018-08-25 18:13:10 -07:00
2018-08-27 14:25:54 -06:00
2018-08-30 13:39:04 -07:00
2018-08-20 16:30:27 -07:00
2018-08-30 14:47:41 -07:00
2018-08-23 13:52:46 -07:00
2018-08-25 18:43:59 -07:00
2018-08-23 15:44:58 -07:00
2018-08-08 15:44:47 +10:00
2018-08-20 15:38:44 -07:00
2018-08-23 13:44:43 -07:00
2018-08-25 14:12:36 -07:00
2018-08-16 12:26:24 -07:00
2018-08-25 18:13:10 -07:00
2018-08-23 13:52:46 -07:00
2018-08-20 15:38:44 -07:00
2018-08-22 14:14:15 -07:00
2018-08-18 11:04:51 -07:00
2018-08-20 11:36:07 +02:00
2018-08-20 15:38:44 -07:00
2018-08-25 14:12:36 -07:00
2018-08-20 16:30:27 -07:00
2018-08-25 18:13:10 -07:00
2018-08-23 14:02:22 -07:00
2018-08-18 16:45:27 -07:00
2018-08-23 13:52:46 -07:00
2018-08-23 13:52:46 -07:00
2018-08-24 09:34:23 -07:00
2018-08-19 09:30:44 -07:00
2018-08-23 13:52:46 -07:00
2018-08-17 11:32:50 -07:00
2018-08-23 15:44:58 -07:00
2018-08-24 08:45:19 -07:00
2018-08-31 08:45:16 -07:00
2018-08-18 11:04:51 -07:00