Spdk/include/spdk_internal
Shuhei Matsumoto 6fdc71ec18 lib/thread: Defer exiting thread if thread is unregistering io_device
Current SPDK thread library has a issue which occurs if there is
a race between exiting thread and unregistering io_device.

For example, there are two threads. Thread 1 registers a device
and thread 2 gets a channel of the device. Then if thread 1 starts
exiting and unregisters the device, and then thread 2 puts the channel,
thread 2 sends a message to thread 1 to complete releasing the device,
thread 1 already moved exited. Hence thread 2 failed to send the
message.

This patch fixes the race issue. The code is verified by adding
a unit test case.

In detail, add a count, unregistering_dev, to struct spdk_thread,
increment it if a callback is specified to spdk_io_device_unregister(),
and then decrement it in _finish_unregister(), and thread_exit()
checks if it is zero.

The contents of struct spdk_thread is changed but it is not public
data structure, and hence suppress it for ABI testing.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Idf5faa55335c3ea89f47ccce32687a6be2e26c68
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5796
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: <dongx.yi@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
2021-01-13 10:07:51 +00:00
..
accel_engine.h accel: Move non-engine specific batch to the accel_fw layer 2020-10-22 22:43:28 +00:00
assert.h include: Move the remainder of the code base to stdinc.h 2017-05-08 13:20:36 -07:00
event.h event: governor implementation 2020-10-23 22:35:53 +00:00
idxd.h lib/idxd: implement idxd back end for CRC 2020-05-15 08:12:13 +00:00
lvolstore.h lvol: remove lvol_task structure 2020-04-24 15:45:21 +00:00
mock.h test: add generic unlink wrapper 2020-05-06 12:43:57 +00:00
nvme_tcp.h nvmf/tcp: Support ICD for fabric/admin commands 2020-10-27 08:40:12 +00:00
rdma.h rdma: Add new API spdk_rdma_qp_accept 2020-06-18 07:28:04 +00:00
sock.h sock: create spdk_sock_prep_reqs function. 2020-11-27 09:22:30 +00:00
thread.h lib/thread: Defer exiting thread if thread is unregistering io_device 2021-01-13 10:07:51 +00:00
uring.h bdev/uring: Do not use IORING_SETUP_IOPOLL. 2020-08-04 18:27:56 +00:00
utf.h utf.h: remove #include "spdk/json.h" 2018-01-31 14:37:16 -05:00
vhost_user.h vhost_user: add VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD definition 2020-01-13 12:43:16 +00:00
virtio.h virtio: add transitional virtio device support 2020-11-20 11:00:53 +00:00