svm: simplify memfd client segment mapping
Type: improvement
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I33c6a5d1686cc32a6cde149083256d6cf0770fc5
diff --git a/src/svm/ssvm.c b/src/svm/ssvm.c
index aca65ad..47441eb 100644
--- a/src/svm/ssvm.c
+++ b/src/svm/ssvm.c
@@ -291,7 +291,7 @@
int
ssvm_client_init_memfd (ssvm_private_t * memfd)
{
- clib_mem_vm_map_t mapa = { 0 };
+ int mmap_flags = MAP_SHARED;
ssvm_shared_header_t *sh;
uword page_size;
@@ -304,37 +304,40 @@
return SSVM_API_ERROR_MMAP;
}
+ if (memfd->requested_va)
+ mmap_flags |= MAP_FIXED;
+
/*
* Map the segment once, to look at the shared header
*/
- mapa.fd = memfd->fd;
- mapa.size = page_size;
+ sh = (void *) mmap (0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED,
+ memfd->fd, 0);
- if (clib_mem_vm_ext_map (&mapa))
+ if (sh == MAP_FAILED)
{
- clib_unix_warning ("client research mmap (fd %d)", mapa.fd);
+ clib_unix_warning ("client research mmap (fd %d)", memfd->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);
+ munmap (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))
+ sh = (void *) mmap (uword_to_pointer (memfd->requested_va, void *),
+ memfd->ssvm_size,
+ PROT_READ | PROT_WRITE, mmap_flags, memfd->fd, 0);
+
+ if (sh == MAP_FAILED)
{
clib_unix_warning ("client final mmap");
close (memfd->fd);
return SSVM_API_ERROR_MMAP;
}
- sh = mapa.addr;
sh->client_pid = getpid ();
memfd->sh = sh;
return 0;
@@ -347,7 +350,7 @@
if (memfd->is_server)
clib_mem_vm_unmap (memfd->sh);
else
- clib_mem_vm_free (memfd->sh, memfd->ssvm_size);
+ munmap (memfd->sh, memfd->ssvm_size);
close (memfd->fd);
}
diff --git a/src/vppinfra/linux/mem.c b/src/vppinfra/linux/mem.c
index c20de9c..1b3694b 100644
--- a/src/vppinfra/linux/mem.c
+++ b/src/vppinfra/linux/mem.c
@@ -750,64 +750,6 @@
return r;
}
-clib_error_t *
-clib_mem_vm_ext_map (clib_mem_vm_map_t * a)
-{
- long unsigned int old_mask[16] = { 0 };
- int mmap_flags = MAP_SHARED;
- clib_error_t *err = 0;
- int old_mpol = -1;
- void *addr;
- int rv;
-
- if (a->numa_node)
- {
- rv = get_mempolicy (&old_mpol, old_mask, sizeof (old_mask) * 8 + 1, 0,
- 0);
-
- if (rv == -1)
- {
- err = clib_error_return_unix (0, "get_mempolicy");
- goto done;
- }
- }
-
- if (a->requested_va)
- mmap_flags |= MAP_FIXED;
-
- if (old_mpol != -1)
- {
- long unsigned int mask[16] = { 0 };
- mask[0] = 1 << a->numa_node;
- rv = set_mempolicy (MPOL_BIND, mask, sizeof (mask) * 8 + 1);
- if (rv == -1)
- {
- err = clib_error_return_unix (0, "set_mempolicy");
- goto done;
- }
- }
-
- addr = (void *) mmap (uword_to_pointer (a->requested_va, void *), a->size,
- PROT_READ | PROT_WRITE, mmap_flags, a->fd, 0);
-
- if (addr == MAP_FAILED)
- return clib_error_return_unix (0, "mmap");
-
- /* re-apply old numa memory policy */
- if (old_mpol != -1 &&
- set_mempolicy (old_mpol, old_mask, sizeof (old_mask) * 8 + 1) == -1)
- {
- err = clib_error_return_unix (0, "set_mempolicy");
- goto done;
- }
-
- a->addr = addr;
- CLIB_MEM_UNPOISON (addr, a->size);
-
-done:
- return err;
-}
-
int
clib_mem_set_numa_affinity (u8 numa_node, int force)
{
diff --git a/src/vppinfra/mem.h b/src/vppinfra/mem.h
index 2fd4bfb..e998eb0 100644
--- a/src/vppinfra/mem.h
+++ b/src/vppinfra/mem.h
@@ -498,7 +498,6 @@
u8 numa_node;
} clib_mem_vm_map_t;
-clib_error_t *clib_mem_vm_ext_map (clib_mem_vm_map_t * a);
void clib_mem_vm_randomize_va (uword * requested_va,
clib_mem_page_sz_t log2_page_size);
void mheap_trace (void *v, int enable);