Spdk/test/unit/lib
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
..
bdev bdev/ocssd: Factor out finding I/O path, nvme_ns and qpair, at I/O submission 2021-01-13 10:06:48 +00:00
blob blob: Make the ABI compatibility of spdk_blob_opts structure. 2020-12-29 07:55:22 +00:00
blobfs remove unneeded spdk_internal/thread.h includes 2020-12-10 14:38:04 +00:00
event event: add pci_allowed/pci_blocked to spdk_app_opts 2020-12-03 09:41:07 +00:00
ftl remove unneeded spdk_internal/thread.h includes 2020-12-10 14:38:04 +00:00
idxd test/unit/lib/idxd: Add unit test stubs 2020-11-19 09:49:53 +00:00
ioat ut: make use of CUnit macro to reduce duplications 2020-04-02 14:50:12 +00:00
iscsi lib/iscsi: Support the Datain pdu sending in out of order case. 2021-01-07 13:36:39 +00:00
json json: add spdk_json_free_object() 2020-10-19 10:02:10 +00:00
jsonrpc lib/jsonrpc: remove spdk_ prefix from internal functions. 2020-05-11 12:29:07 +00:00
log log: simplify SPDK_LOG_REGISTER_COMPONENT 2020-10-14 08:00:35 +00:00
lvol blob: Make the ABI compatibility of spdk_blob_open_opts structure. 2020-12-29 07:55:22 +00:00
notify ut: make use of CUnit macro to reduce duplications 2020-04-02 14:50:12 +00:00
nvme nvme: add function to check if controller supports zone append 2020-11-20 11:00:18 +00:00
nvmf nvmf/tcp: optimize nvmf_tcp_req_set_state() to reduce cpu usage 2021-01-08 09:35:55 +00:00
reduce test: add generic unlink wrapper 2020-05-06 12:43:57 +00:00
scsi test/unit/lib/scsi: Add unit test stubs 2020-11-19 09:47:06 +00:00
sock sock: create spdk_sock_prep_reqs function. 2020-11-27 09:22:30 +00:00
thread lib/thread: Defer exiting thread if thread is unregistering io_device 2021-01-13 10:07:51 +00:00
util cpuset: fix parse_mask 2020-08-27 08:34:07 +00:00
vhost vhost-blk: record inflight descs of packed ring 2020-12-16 08:56:12 +00:00
json_mock.c subsystem: add per module configuration dump 2018-03-23 02:47:40 -04:00
Makefile lib/idxd: add unit test framework and first unit test 2020-04-23 15:48:32 +00:00