2021-03-19 09:51 (UTC-0700), Jie Zhou: > Issue under active investigation: > - Recent DPDK upstream change "eal: detach memsegs on cleanup" exposed > failure at eal exit with "EAL: Could not unmap memory: No Error". > Investigating KERNELBASE!UnmapViewOfFile. The issue will cause system > crash. Currently temporarily remove cleanup at exit on Windows. > Will revert after issue root caused and fixed
+Anatoly It's my fault I assumed "eal: detach memsegs on cleanup" series related to multiprocess only and didn't properly review it. The culprit is this code (eal_common_memory.c:1019): for (i = 0; i < RTE_DIM(mcfg->memsegs); i++) { struct rte_memseg_list *msl = &mcfg->memsegs[i]; /* skip uninitialized segments */ if (msl->base_va == NULL) continue; /* * external segments are supposed to be detached at this point, * but if they aren't, we can't really do anything about it, * because if we skip them here, they'll become invalid after * we unmap the memconfig anyway. however, if this is externally * referenced memory, we have no business unmapping it. */ if (!msl->external) if (rte_mem_unmap(msl->base_va, msl->len) != 0) RTE_LOG(ERR, EAL, "Could not unmap memory: %s\n", strerror(errno)); 1. It assumes memory is allocated using mapping, which is not the case for Windows. Instead of rte_mem_unmap() it should be eal_mem_free(), which is the same munmap() on Unices. However... 2. It assumes this line will remove all mappings within (base_va, size), as munmap()/rte_mem_unmap() would do. However, eal_mem_free(base_va, size) is only guaranteed to work if (base_va, size) came from eal_mem_reserve(size) or from OS-specific allocation (mmap on Unices, VirtualAlloc2 on Windows). Because of underlying munmap, it works as desired on Unices, but not on Windows. 3. A minor, but still: errno -> rte_errno, strerror -> rte_strerror. I can make eal_mem_free() behave as expected at issue 2. Or should we simple disable this code when where's no multiprocess support (how do we test for it properly, BTW)?