Spdk/lib/nvme
Jim Harris 54f28010a6 nvme/pcie: only set qpair state from qpair's thread
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
2022-06-30 13:32:27 -04:00
..
Makefile nvme: asynchronous create io qpair 2021-08-13 07:27:07 +00:00
nvme_ctrlr_cmd.c nvme: rename nvme_qpair_abort_reqs to *_with_cbarg 2022-06-30 13:32:25 -04:00
nvme_ctrlr_ocssd_cmd.c nvme: Move nsdata to namespace structure 2021-03-02 08:06:15 +00:00
nvme_ctrlr.c nvme: asynchronous detach without shutdown notification 2022-06-30 13:32:25 -04:00
nvme_cuse.c nvme: No longer allocate arrays of size NN in cuse handling 2021-09-03 08:07:25 +00:00
nvme_cuse.h lib/nvme: add RPC for interacting with CUSE devices 2019-10-24 23:43:59 +00:00
nvme_fabric.c nvme/fabric: implement async register get/set functions 2022-06-30 13:32:24 -04:00
nvme_internal.h nvme: make ctrlr detach fully asynchronous 2022-06-30 13:32:25 -04:00
nvme_io_msg.c nvme: only process io_msg in primary process 2021-04-22 01:06:02 +00:00
nvme_io_msg.h lib/nvme: update io msg producers on ns manage 2020-06-05 09:01:44 +00:00
nvme_ns_cmd.c nvme: Add functions spdk_nvme_ns_cmd_readv/writev_ext 2021-08-20 07:26:10 +00:00
nvme_ns_ocssd_cmd.c nvme: save separate metadata size to nvme request 2020-04-02 07:02:38 +00:00
nvme_ns.c util: Add macro SPDK_SIZEOF_MEMBER to get size of a member of a struct 2021-07-15 07:16:22 +00:00
nvme_opal_internal.h nvme/opal: deprecate spdk_opal_supported() 2020-05-20 14:16:44 +00:00
nvme_opal.c nvme/opal: check Security Protocol 00h before sending TCG SP 2021-06-04 19:57:36 +00:00
nvme_pcie_common.c nvme/pcie: only set qpair state from qpair's thread 2022-06-30 13:32:27 -04:00
nvme_pcie_internal.h nvme: add spdk_nvme_ctrlr_prepare_for_reset() 2021-09-07 07:33:41 +00:00
nvme_pcie.c nvme: Fix remove event processing bug 2021-07-13 09:07:23 +00:00
nvme_poll_group.c nvme: Add functions to get/free poll group statistics 2021-04-13 21:30:52 +00:00
nvme_qpair.c nvme: abort queued admin requests during init 2022-06-30 13:32:25 -04:00
nvme_quirks.c nvme: add quirks for new RedHat QEMU NVMe dev/vendor ID 2021-06-11 07:22:10 +00:00
nvme_rdma.c dma: Update translation result to hold iovec pointer 2022-06-30 13:32:26 -04:00
nvme_tcp.c nvme/tcp: Fix tcp_req->datao calculation issue. 2022-06-30 13:32:25 -04:00
nvme_transport.c nvme: Update spdk_nvme_ctrlr_get_memory_domain 2022-06-30 13:32:25 -04:00
nvme_vfio_user.c nvme/vfio-user: use the common request submission function 2021-06-09 07:21:31 +00:00
nvme_zns.c lib/nvme: NVMe ZNS - Zone Descriptor Extension support 2022-06-30 13:32:24 -04:00
nvme.c nvme: store fabrics connect data ptr in status structure 2021-08-31 08:38:16 +00:00
spdk_nvme.map nvme: Update spdk_nvme_ctrlr_get_memory_domain 2022-06-30 13:32:25 -04:00