I did a short program where a primary (--file-prefix=p1) allocates a memzone and generates a file descriptor that is passed to another primary (--file-prefix=p2) . The process P2 tries to mmap the memory but I get an error (Bad file descriptor): uint64_t* addr = mmap(NULL, 1024*1024*1024, PROT_READ, flags, mem_fd, 0); if (addr == -1) perror("mmap"); Il giorno ven 8 apr 2022 alle ore 23:08 Antonio Di Bacco < a.dibacco.ks@gmail.com> ha scritto: > > > Il giorno ven 8 apr 2022 alle ore 15:26 Dmitry Kozlyuk < > dmitry.kozliuk@gmail.com> ha scritto: > >> 2022-04-08 14:31 (UTC+0200), Antonio Di Bacco: >> > I know that it is possible to share memory between a primary and >> secondary >> > process using rte_memzone_reserve_aligned to allocate memory in primary >> > that is "seen" also by the secondary. If we have two primary processes >> > (started with different file-prefix) the same approach is not feasible. >> I >> > wonder how to share a chunk of memory hosted on a hugepage between two >> > primaries. >> > >> > Regards. >> >> Hi Antonio, >> >> Correction: all hugepages allocated by DPDK are shared >> between primary and secondary processes, not only memzones. >> >> I assume we're talking about processes within one host, >> because your previous similar question was about sharing memory between >> hosts >> (as we have discussed offline), which is out of scope for DPDK. >> >> As for the question directly, you need to map the same part of the same >> file >> in the second primary as the hugepage is mapped from in the first primary. >> I don't recommend to work with file paths, because their management >> is not straightforward (--single-file-segments, for one) and is >> undocumented. >> >> There is a way to share DPDK memory segment file descriptors. >> Although public, this DPDK API is dangerous in the sense that you must >> clearly understand what you're doing and how DPDK works. >> Hence the question: what is the task you need this sharing for? >> Maybe there is a simpler way. >> >> 1. In the first primary: >> >> mz = rte_memzone_reserve() >> ms = rte_mem_virt2memseg(mz->addr) >> fd = rte_memseg_get_fd(ms) >> offset = rte_memseg_get_fd_offset(ms) >> >> 2. Use Unix domain sockets with SCM_RIGHTS >> to send "fd" and "offset" to the second primary. >> >> 3. In the second primary, after receiving "fd" and "offset": >> >> flags = MAP_SHARED | MAP_HUGE | (30 << MAP_HUGE_SHIFT) >> addr = mmap(fd, offset, flags) >> >> Note that "mz" may consist of multiple "ms" depending on the sizes >> of the zone and hugepages, and on the zone alignment. >> Also "addr" may (and probably will) differ from "mz->addr". >> It is possible to pass "mz->addr" and try to force it, >> like DPDK does for primary/secondary. >> > > > Thank you Dmitry, it is really incredible how deep your knowledge is. I > will give it a try. >