a33e0943b0
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> |
||
---|---|---|
.. | ||
env_internal.h | ||
env.c | ||
env.mk | ||
init.c | ||
Makefile | ||
memory.c | ||
pci_ioat.c | ||
pci_nvme.c | ||
pci_virtio.c | ||
pci.c | ||
threads.c | ||
vtophys.c |