+19
−9
Loading
The qpair's state member is only 3 bits of a uint8_t, and the in_completion_context bit is another bit in that same uint8_t. We know that the qpair's state is only ever updated by one thread, but it is possible that the state could be modified by one thread, while another thread is modifying in_completion_context. in_completion_context is only modified by the thread that is polling the qpair (or the qpair's poll group). But with async mode, another thread that has a qpair on the same PCIe controller could poll its adminq and reap the SQ completion for the qpair that's owned by the other thread. So do *not* set the generic qpair state to CONNECTED from the SQ completion callback. Instead just set the pcie_state to READY, and let the thread that owns the qpair detect the qpair is READY and set the state to CONNECTED itself. Fixes issue #2157. Signed-off-by:Jim Harris <james.r.harris@intel.com> Change-Id: I9efc0c954504f1841e1c3890ae78211ad0d1990e Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9975 Reviewed-by:
Konrad Sztyber <konrad.sztyber@intel.com> Reviewed-by:
Aleksey Marchuk <alexeymar@mellanox.com> Reviewed-by:
Ben Walker <benjamin.walker@intel.com> Tested-by:
SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Community-CI: Mellanox Build Bot