vppinfra: fix clib_mem_vm_ext_alloc non-shared allocations 45/10945/2
authorDamjan Marion <damarion@cisco.com>
Sun, 4 Mar 2018 15:41:35 +0000 (16:41 +0100)
committerFlorin Coras <florin.coras@gmail.com>
Sun, 4 Mar 2018 17:58:02 +0000 (17:58 +0000)
Change-Id: I6d049c0875b91f67f008dc04ae7efe2f8ddc276e
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/vppinfra/linux/mem.c
src/vppinfra/mem.h

index c4973a6..75d2a7e 100644 (file)
@@ -83,7 +83,7 @@ clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a)
   clib_error_t *err = 0;
   void *addr = 0;
   u8 *filename = 0;
-  int mmap_flags = MAP_SHARED;
+  int mmap_flags = 0;
   int log2_page_size;
   int n_pages;
   int old_mpol = -1;
@@ -108,9 +108,13 @@ clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a)
        }
     }
 
+  if (a->flags & CLIB_MEM_VM_F_LOCKED)
+    mmap_flags |= MAP_LOCKED;
+
   /* if we are creating shared segment, we need file descriptor */
   if (a->flags & CLIB_MEM_VM_F_SHARED)
     {
+      mmap_flags |= MAP_SHARED;
       /* if hugepages are needed we need to create mount point */
       if (a->flags & CLIB_MEM_VM_F_HUGETLB)
        {
@@ -169,14 +173,14 @@ clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a)
     }
   else                         /* not CLIB_MEM_VM_F_SHARED */
     {
+      mmap_flags |= MAP_PRIVATE | MAP_ANONYMOUS;
       if (a->flags & CLIB_MEM_VM_F_HUGETLB)
        {
-         mmap_flags |= MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS;
+         mmap_flags |= MAP_HUGETLB;
          log2_page_size = 21;
        }
       else
        {
-         mmap_flags |= MAP_PRIVATE | MAP_ANONYMOUS;
          log2_page_size = min_log2 (sysconf (_SC_PAGESIZE));
        }
     }
index 028289c..55a276f 100644 (file)
@@ -328,6 +328,7 @@ typedef struct
 #define CLIB_MEM_VM_F_NUMA_PREFER (1 << 2)
 #define CLIB_MEM_VM_F_NUMA_FORCE (1 << 3)
 #define CLIB_MEM_VM_F_HUGETLB_PREALLOC (1 << 4)
+#define CLIB_MEM_VM_F_LOCKED (1 << 5)
   u32 flags; /**< vm allocation flags:
                 <br> CLIB_MEM_VM_F_SHARED: request shared memory, file
                descriptor will be provided on successful allocation.
@@ -337,6 +338,7 @@ typedef struct
                <br> CLIB_MEM_VM_F_NUMA_FORCE: fail if setting numa policy fails.
                <br> CLIB_MEM_VM_F_HUGETLB_PREALLOC: pre-allocate hugepages if
                number of available pages is not sufficient.
+               <br> CLIB_MEM_VM_F_LOCKED: request locked memory.
              */
   char *name; /**< Name for memory allocation, set by caller. */
   uword size; /**< Allocation size, set by caller. */