X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Fssvm.c;h=69463b1f192628ab5989ca54391a18eee25836b4;hb=03328ec8bb86b93fa70bb6b2a9b37c40e686a1f7;hp=7fa9b2587297fb3688d2a65a80feccde60f146a7;hpb=a5ab5034f4b50fc5a19ccf8910c91613e6a52f5a;p=vpp.git diff --git a/src/svm/ssvm.c b/src/svm/ssvm.c index 7fa9b258729..69463b1f192 100644 --- a/src/svm/ssvm.c +++ b/src/svm/ssvm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Cisco and/or its affiliates. + * Copyright (c) 2015-2019 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -80,7 +80,7 @@ ssvm_master_init_shm (ssvm_private_t * ssvm) return SSVM_API_ERROR_SET_SIZE; } - page_size = clib_mem_vm_get_page_size (ssvm_fd); + page_size = clib_mem_get_fd_page_size (ssvm_fd); if (ssvm->requested_va) { requested_va = ssvm->requested_va; @@ -177,7 +177,7 @@ map_it: return SSVM_API_ERROR_SLAVE_TIMEOUT; re_map_it: - ssvm->requested_va = (u64) sh->ssvm_va; + ssvm->requested_va = sh->ssvm_va; ssvm->ssvm_size = sh->ssvm_size; munmap (sh, MMAP_PAGESIZE); @@ -213,7 +213,7 @@ ssvm_delete_shm (ssvm_private_t * ssvm) vec_free (fn); vec_free (ssvm->name); - munmap ((void *) ssvm->requested_va, ssvm->ssvm_size); + munmap ((void *) ssvm->sh, ssvm->ssvm_size); } /** @@ -290,7 +290,7 @@ ssvm_slave_init_memfd (ssvm_private_t * memfd) memfd->i_am_master = 0; - page_size = clib_mem_vm_get_page_size (memfd->fd); + page_size = clib_mem_get_fd_page_size (memfd->fd); if (!page_size) { clib_unix_warning ("page size unknown"); @@ -347,13 +347,12 @@ ssvm_delete_memfd (ssvm_private_t * memfd) int ssvm_master_init_private (ssvm_private_t * ssvm) { + uword pagesize = clib_mem_get_page_size (), rnd_size = 0; ssvm_shared_header_t *sh; - u32 pagesize = clib_mem_get_page_size (); - u32 rnd_size = 0; u8 *heap; - rnd_size = (ssvm->ssvm_size + (pagesize - 1)) & ~(pagesize - 1); - rnd_size = clib_min (rnd_size, ((u64) 1 << 32) - pagesize); + rnd_size = clib_max (ssvm->ssvm_size + (pagesize - 1), ssvm->ssvm_size); + rnd_size &= ~(pagesize - 1); #if USE_DLMALLOC == 0 { @@ -370,6 +369,18 @@ ssvm_master_init_private (ssvm_private_t * ssvm) } #else heap = create_mspace (rnd_size, 1 /* locked */ ); + if (heap == 0) + { + clib_unix_warning ("mheap alloc"); + return -1; + } + + mspace_disable_expand (heap); + + /* Find actual size because mspace size is rounded up by dlmalloc */ + struct dlmallinfo dlminfo; + dlminfo = mspace_mallinfo (heap); + rnd_size = dlminfo.fordblks; #endif ssvm->ssvm_size = rnd_size; @@ -381,9 +392,12 @@ ssvm_master_init_private (ssvm_private_t * ssvm) sh = clib_mem_alloc_aligned (sizeof (*sh), CLIB_CACHE_LINE_BYTES); ssvm->sh = sh; - memset (sh, 0, sizeof (*sh)); + clib_memset (sh, 0, sizeof (*sh)); sh->heap = heap; + sh->ssvm_size = rnd_size; + sh->ssvm_va = pointer_to_uword (heap); sh->type = SSVM_SEGMENT_PRIVATE; + sh->name = ssvm->name; return 0; }