That is possible to get/set registers from any thread, during regs processing we are polling admin qpair to get a completion. At the same time, another thread can also poll admin qpair and that can lead to undefined behavior. This patch fixes an issue when bdev_nvme is configured with io_timeout. If remote target becomes unresponsive (e.g. due to link down), IO timeout occurs and bdev_nvme tries to get csts registers in timeout_cb. At the same time another thread can process adminq, so we may have 2 simultaneous adminq polls. If admin qpair is disconnecting at that time (RDMA transport) we may destroy resources twice from different threads. We don't see a problem with set_regs function but it won't be redundant to lock mutex in set_regs as well. Signed-off-by: Alexey Marchuk <alexeymar@nvidia.com> Change-Id: I7ec3984d25d0249061005533d13b22315b44ddf2 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13687 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> |
||
---|---|---|
.. | ||
Makefile | ||
nvme_fabric_ut.c |