IB/hfi1: Race hazard avoidance in user SDMA driver
authorMichael J. Ruhl <michael.j.ruhl@intel.com>
Tue, 21 Mar 2017 00:24:45 +0000 (17:24 -0700)
committerDoug Ledford <dledford@redhat.com>
Wed, 5 Apr 2017 18:45:09 +0000 (14:45 -0400)
Set the errcode before the state and add the smb_wmb() to avoid a
potential race condition with the user.

Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Michael Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/user_sdma.c

index e6811c4edc73444b7912b6f06eb7500dbb29d5ed..060e374ca37bda2dce217a21e23a6194f24d4ce3 100644 (file)
@@ -1615,9 +1615,10 @@ static inline void set_comp_state(struct hfi1_user_sdma_pkt_q *pq,
 {
        hfi1_cdbg(SDMA, "[%u:%u:%u:%u] Setting completion status %u %d",
                  pq->dd->unit, pq->ctxt, pq->subctxt, idx, state, ret);
-       cq->comps[idx].status = state;
        if (state == ERROR)
                cq->comps[idx].errcode = -ret;
+       smp_wmb(); /* make sure errcode is visible first */
+       cq->comps[idx].status = state;
        trace_hfi1_sdma_user_completion(pq->dd, pq->ctxt, pq->subctxt,
                                        idx, state, ret);
 }