vppinfra: introduce clib_mem_vm_ext_free() to avoid fd leaks
[vpp.git] / src / vppinfra / linux / mem.c
index 475e3dc..2d968fa 100644 (file)
@@ -46,7 +46,7 @@
 #define F_SEAL_WRITE    0x0008 /* prevent writes */
 #endif
 
-uword
+u64
 clib_mem_vm_get_page_size (int fd)
 {
   struct stat st = { 0 };
@@ -87,7 +87,7 @@ clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a)
   int log2_page_size;
   int n_pages;
   int old_mpol = -1;
-  u64 old_mask[16] = { 0 };
+  long unsigned int old_mask[16] = { 0 };
 
   /* save old numa mem policy if needed */
   if (a->flags & (CLIB_MEM_VM_F_NUMA_PREFER | CLIB_MEM_VM_F_NUMA_FORCE))
@@ -127,6 +127,7 @@ clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a)
 
          if (mount ("none", (char *) mount_dir, "hugetlbfs", 0, NULL))
            {
+             rmdir ((char *) mount_dir);
              err = clib_error_return_unix (0, "mount hugetlb directory '%s'",
                                            mount_dir);
              goto error;
@@ -136,6 +137,8 @@ clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a)
 
          if ((fd = open ((char *) filename, O_CREAT | O_RDWR, 0755)) == -1)
            {
+             umount2 ((char *) mount_dir, MNT_DETACH);
+             rmdir ((char *) mount_dir);
              err = clib_error_return_unix (0, "open");
              goto error;
            }
@@ -207,10 +210,11 @@ clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a)
   if (old_mpol != -1)
     {
       int rv;
-      u64 mask[16] = { 0 };
+      long unsigned int mask[16] = { 0 };
       mask[0] = 1 << a->numa_node;
       rv = set_mempolicy (MPOL_BIND, mask, sizeof (mask) * 8 + 1);
-      if (rv)
+      if (rv == -1 && a->numa_node != 0 &&
+         (a->flags & CLIB_MEM_VM_F_NUMA_FORCE) != 0)
        {
          err = clib_error_return_unix (0, "set_mempolicy");
          goto error;
@@ -248,6 +252,17 @@ done:
   return err;
 }
 
+void
+clib_mem_vm_ext_free (clib_mem_vm_alloc_t * a)
+{
+  if (a != 0)
+    {
+      clib_mem_vm_free (a->addr, 1 << a->log2_page_size);
+      if (a->fd != -1)
+       close (a->fd);
+    }
+}
+
 u64 *
 clib_mem_vm_get_paddr (void *mem, int log2_page_size, int n_pages)
 {