session: make sure segment sizes are page aligned 52/13452/4
authorFlorin Coras <fcoras@cisco.com>
Thu, 12 Jul 2018 08:45:13 +0000 (01:45 -0700)
committerDamjan Marion <dmarion@me.com>
Tue, 17 Jul 2018 09:01:46 +0000 (09:01 +0000)
Change-Id: Ibbba75d069ca1bbf9e5a1b8bd2f405d32021c656
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/svm/ssvm.c
src/vnet/session/segment_manager.c

index dfb68c0..c005b61 100644 (file)
@@ -331,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)
     {
index 9dade6e..31bb0c3 100644 (file)
@@ -153,7 +153,7 @@ int
 segment_manager_add_segment (segment_manager_t * sm, u32 segment_size)
 {
   segment_manager_main_t *smm = &segment_manager_main;
-  u32 rnd_margin = 128 << 10, seg_index;
+  u32 rnd_margin = 128 << 10, seg_index, page_size;
   segment_manager_properties_t *props;
   uword baseva = (u64) ~ 0, alloc_size;
   svm_fifo_segment_private_t *seg;
@@ -187,6 +187,8 @@ segment_manager_add_segment (segment_manager_t * sm, u32 segment_size)
    * Initialize ssvm segment and svm fifo private header
    */
   segment_size = segment_size ? segment_size : props->add_segment_size;
+  page_size = clib_mem_get_page_size ();
+  segment_size = (segment_size + page_size - 1) & ~(page_size - 1);
   if (props->segment_type != SSVM_SEGMENT_PRIVATE)
     {
       seg_name = format (0, "%d-%d%c", getpid (), segment_name_counter++, 0);