Spdk/lib
Darek Stojaczyk a33e0943b0 memory: forbid registering a memory region more than once
Removed the reference count from the registrations map.

Although technically supported, registering a single memory
region more than once had a lot of unhandled cases and could
easily lead to a segfault.

RDMA maps require all memory to be unregistered in the same
chunks the memory was registered, which is often impossible
to achieve if a region was registered more than once:

1. register region    0x0 - 0x3 -> it gets mapped to
                                   a single ibv_mr
2. register region    0x1 - 0x2 -> nothing happens, this region
                                   is already registered
3. unregister region  0x0 - 0x3 -> 0x0-0x1 gets unregistered as
                                   one region. 0x2-0x3 gets
                                   unregistered as another
                                   (leading to segfault in the
                                   the current RDMA implementation)

The problem is that the last two regions share the same ibv_mr,
which SPDK tries to free twice. The second free causes a segfault.
vtophys map handles this case by registering each 2MB chunk
separately, but this solution cannot be applied for RDMA, as
NICs put a limitation (~2048) on the number of regions registered.

Another option is to keep a refcount of each ibv_mr allocated,
and free it only when the entire region was unregistered from the
SPDK mem map. This is however very tricky and RDMAmojo mentions
that freeing a memory buffer before unregistering its ibv_mr
may lead to a segfault.

Change-Id: I545c56e24ffa55bda211dea22aeb8a55d9631fe5
Signed-off-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/426085
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
2018-10-11 18:59:11 +00:00
..
bdev bdev: Change split IOV submission from sequential to batch 2018-10-10 17:19:32 +00:00
blob bit_array: return UINT32_MAX if no cleared bits found 2018-10-08 17:03:33 +00:00
blobfs blobfs: align rw buffer to lba of device underneath 2018-09-18 16:35:57 +00:00
conf conf: don't strdup name if section already exist 2018-05-17 17:13:19 +00:00
copy thread: Add a name parameter to spdk_register_io_device 2018-09-05 16:00:54 +00:00
env_dpdk memory: forbid registering a memory region more than once 2018-10-11 18:59:11 +00:00
event log: add a way to turn on and off stack unwinding in logs 2018-10-02 22:09:27 +00:00
ioat ioat: change the return type of ioat_channel_destruct() to be void 2018-09-18 22:41:00 +00:00
iscsi sock: Update the spdk_sock_getaddr function. 2018-10-11 04:58:49 +00:00
json json: Add spdk_json_decode_uint16 2018-06-05 21:30:02 +00:00
jsonrpc jsonrpc: fix error path of spdk_jsonrpc_parse_request() 2018-08-31 17:41:58 +00:00
log Make: Add deps for each shared obj individually 2018-10-09 21:45:26 +00:00
lvol lvol: _spdk_add_lvs_to_list: break loop immediately if find 2018-09-14 03:56:35 +00:00
nbd nbd: add support for io_wait implement in nbd 2018-10-02 22:36:01 +00:00
net lib: fix typos in the lib directory 2018-08-24 17:15:12 +00:00
nvme nvme/rdma: fix a stack-buffer-overflow error 2018-10-11 01:58:48 +00:00
nvmf Make: Add deps for each shared obj individually 2018-10-09 21:45:26 +00:00
rocksdb blobfs: add a new API to return file's unique ID 2018-08-29 16:29:22 +00:00
rpc rpc: g_rpc_lock_path: remove redundant plus 2018-09-04 22:21:04 +00:00
scsi trace: remove alias concept 2018-09-05 18:03:43 +00:00
sock sock: Update the spdk_sock_getaddr function. 2018-10-11 04:58:49 +00:00
thread thread: Fix issue where a channel would be destroyed twice 2018-09-05 16:00:54 +00:00
trace trace: remove alias concept 2018-09-05 18:03:43 +00:00
ut_mock test: Simplify the mock library 2018-08-09 17:18:23 +00:00
util Make: Add deps for each shared obj individually 2018-10-09 21:45:26 +00:00
vhost vhost: rpc: add an optional parameter -n/--name for get_vhost_controllers 2018-10-04 23:33:04 +00:00
virtio virtio: clarify feature negotiation failure 2018-08-01 19:16:54 +00:00
Makefile test: remove spdk_cunit library 2018-07-06 18:35:03 +00:00