Spdk/lib/util
Dariusz Stojaczyk a7aa9d5737 io_channel: ensure io_device is always freed just once
Imagine the following code flow:
1. `spdk_put_io_channel();`
2. `spdk_io_device_unregister();`

Since putting an io_channel is always deferred,
it is likely that spdk_io_device_unregister will
lock the io_channel mutex first. It will set
dev->unregistered flag and then quickly realize
there are still open channels for this device
(refcnt > 0) - so it'll return. All fine here.

However, if the deferred put_io_channel happens to
lock the mutex first from other thread, it will
decrement the refcnt and attempt to free the device.
Both the decrementation and freeing are done under
a mutex, but there is a slight window inbetween
where the mutex is re-locked. spdk_io_device_unregister
is already sleeping on a mutex_lock(), so it might
strike now. It'll see there are no more io_channels
for this device and free the device. Once
put_io_channels regains the lock again, it will attempt
freeing the device for a second time.

This patch removes the slight window mentioned above.

Related to #278

Change-Id: I6c0f6014353529028d658211135196d97f1d8547
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/408193
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
2018-04-18 12:29:58 -04:00
..
bit_array.c env: Rename spdk_malloc/zmalloc/realloc/free to spdk_dma_(func) 2017-05-31 15:30:27 -04:00
cpuset.c lib/util: return const pointer from spdk_cpuset_fmt 2018-02-20 13:05:36 -05:00
crc16.c util/crc16: add crc16 library support and unit tests 2017-12-20 15:12:26 -05:00
crc32_ieee.c util: add CRC32 utility functions 2017-08-02 19:47:35 -04:00
crc32.c util: add CRC32 utility functions 2017-08-02 19:47:35 -04:00
crc32c.c util/crc32c: add SSE 4.2 CRC32 instruction support 2017-08-02 19:47:35 -04:00
fd.c util/fd: drop fallback from spdk_fd_get_blocklen() 2017-08-11 19:36:30 -04:00
io_channel.c io_channel: ensure io_device is always freed just once 2018-04-18 12:29:58 -04:00
Makefile util: add uuid.h to wrap libuuid 2018-03-08 10:49:51 -05:00
strerror_tls.c util: add spdk_strerror() wrapper with TLS support 2018-01-04 15:00:09 -05:00
string.c util: add spdk_mem_all_zero() function 2018-02-23 10:05:32 -05:00
uuid.c util: add uuid.h to wrap libuuid 2018-03-08 10:49:51 -05:00