void ssvm_delete_memfd (ssvm_private_t * memfd) { vec_free (memfd->name); clib_mem_vm_free (memfd->sh, memfd->ssvm_size); close (memfd->fd); }
/** * Initialize memfd segment slave * * Subtly different than svm_slave_init. The caller needs to acquire * a usable file descriptor for the memfd segment e.g. via * vppinfra/socket.c:default_socket_recvmsg */ int ssvm_slave_init_memfd (ssvm_private_t * memfd) { clib_mem_vm_map_t mapa = { 0 }; ssvm_shared_header_t *sh; uword page_size; memfd->i_am_master = 0; page_size = clib_mem_get_fd_page_size (memfd->fd); if (!page_size) { clib_unix_warning ("page size unknown"); return SSVM_API_ERROR_MMAP; } /* * Map the segment once, to look at the shared header */ mapa.fd = memfd->fd; mapa.size = page_size; if (clib_mem_vm_ext_map (&mapa)) { clib_unix_warning ("slave research mmap (fd %d)", mapa.fd); close (memfd->fd); return SSVM_API_ERROR_MMAP; } sh = mapa.addr; memfd->requested_va = sh->ssvm_va; memfd->ssvm_size = sh->ssvm_size; clib_mem_vm_free (sh, page_size); /* * Remap the segment at the 'right' address */ mapa.requested_va = memfd->requested_va; mapa.size = memfd->ssvm_size; if (clib_mem_vm_ext_map (&mapa)) { clib_unix_warning ("slave final mmap"); close (memfd->fd); return SSVM_API_ERROR_MMAP; } sh = mapa.addr; sh->slave_pid = getpid (); memfd->sh = sh; return 0; }
void clib_smp_free (clib_smp_main_t * m) { clib_mem_vm_free (m->vm_base, (uword) ((1 + m->n_cpus) << m->log2_n_per_cpu_vm_bytes)); }