vppinfra: increase max bihash arena size to 512GB
[vpp.git] / src / svm / ssvm.c
index 7077f8b..c005b61 100644 (file)
@@ -29,11 +29,10 @@ int
 ssvm_master_init_shm (ssvm_private_t * ssvm)
 {
   int ssvm_fd, mh_flags = MHEAP_FLAG_DISABLE_VM | MHEAP_FLAG_THREAD_SAFE;
-  svm_main_region_t *smr = svm_get_root_rp ()->data_base;
   clib_mem_vm_map_t mapa = { 0 };
   u8 junk = 0, *ssvm_filename;
   ssvm_shared_header_t *sh;
-  uword page_size;
+  uword page_size, requested_va = 0;
   void *oldheap;
 
   if (ssvm->ssvm_size == 0)
@@ -56,8 +55,13 @@ ssvm_master_init_shm (ssvm_private_t * ssvm)
 
   if (fchmod (ssvm_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) < 0)
     clib_unix_warning ("ssvm segment chmod");
-  if (fchown (ssvm_fd, smr->uid, smr->gid) < 0)
-    clib_unix_warning ("ssvm segment chown");
+  if (svm_get_root_rp ())
+    {
+      /* TODO: is this really needed? */
+      svm_main_region_t *smr = svm_get_root_rp ()->data_base;
+      if (fchown (ssvm_fd, smr->uid, smr->gid) < 0)
+       clib_unix_warning ("ssvm segment chown");
+    }
 
   if (lseek (ssvm_fd, ssvm->ssvm_size, SEEK_SET) < 0)
     {
@@ -75,9 +79,12 @@ ssvm_master_init_shm (ssvm_private_t * ssvm)
 
   page_size = clib_mem_vm_get_page_size (ssvm_fd);
   if (ssvm->requested_va)
-    clib_mem_vm_randomize_va (&ssvm->requested_va, min_log2 (page_size));
+    {
+      requested_va = ssvm->requested_va;
+      clib_mem_vm_randomize_va (&requested_va, min_log2 (page_size));
+    }
 
-  mapa.requested_va = ssvm->requested_va;
+  mapa.requested_va = requested_va;
   mapa.size = ssvm->ssvm_size;
   mapa.fd = ssvm_fd;
   if (clib_mem_vm_ext_map (&mapa))
@@ -324,10 +331,11 @@ ssvm_master_init_private (ssvm_private_t * ssvm)
   u32 pagesize = clib_mem_get_page_size ();
   ssvm_shared_header_t *sh;
   mheap_t *heap_header;
-  u32 rnd_size = 0;
+  u64 rnd_size = 0;
   u8 *heap;
 
-  rnd_size = (ssvm->ssvm_size + (pagesize - 1)) & ~pagesize;
+  rnd_size = (ssvm->ssvm_size + (pagesize - 1)) & ~(pagesize - 1);
+  rnd_size = clib_min (rnd_size, ((u64) 1 << 32) - pagesize);
   heap = mheap_alloc (0, rnd_size);
   if (heap == 0)
     {