X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Fssvm.c;h=59a5d228957fd6dea257ad6101370eb8e7d9f141;hb=c5df8c71c;hp=04e0efa3d622d76f0944135b34b1fe9ccbe30ac8;hpb=f8f516a8b0ccab2f5d9796f90419bf2661c750af;p=vpp.git diff --git a/src/svm/ssvm.c b/src/svm/ssvm.c index 04e0efa3d62..59a5d228957 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: @@ -28,8 +28,10 @@ static delete_fn delete_fns[SSVM_N_SEGMENT_TYPES] = 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; + int ssvm_fd; +#if USE_DLMALLOC == 0 + int mh_flags = MHEAP_FLAG_DISABLE_VM | MHEAP_FLAG_THREAD_SAFE; +#endif clib_mem_vm_map_t mapa = { 0 }; u8 junk = 0, *ssvm_filename; ssvm_shared_header_t *sh; @@ -56,8 +58,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) { @@ -73,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; @@ -96,8 +103,15 @@ ssvm_master_init_shm (ssvm_private_t * ssvm) sh->ssvm_size = ssvm->ssvm_size; sh->ssvm_va = pointer_to_uword (sh); sh->type = SSVM_SEGMENT_SHM; +#if USE_DLMALLOC == 0 sh->heap = mheap_alloc_with_flags (((u8 *) sh) + page_size, ssvm->ssvm_size - page_size, mh_flags); +#else + sh->heap = create_mspace_with_base (((u8 *) sh) + page_size, + ssvm->ssvm_size - page_size, + 1 /* locked */ ); + mspace_disable_expand (sh->heap); +#endif oldheap = ssvm_push_heap (sh); sh->name = format (0, "%s", ssvm->name, 0); @@ -163,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); @@ -208,7 +222,7 @@ ssvm_delete_shm (ssvm_private_t * ssvm) int ssvm_master_init_memfd (ssvm_private_t * memfd) { - uword page_size, flags = MHEAP_FLAG_DISABLE_VM | MHEAP_FLAG_THREAD_SAFE; + uword page_size; ssvm_shared_header_t *sh; void *oldheap; clib_mem_vm_alloc_t alloc = { 0 }; @@ -234,15 +248,24 @@ ssvm_master_init_memfd (ssvm_private_t * memfd) memfd->my_pid = getpid (); memfd->i_am_master = 1; - page_size = 1 << alloc.log2_page_size; + page_size = 1ull << alloc.log2_page_size; sh = memfd->sh; sh->master_pid = memfd->my_pid; sh->ssvm_size = memfd->ssvm_size; sh->ssvm_va = pointer_to_uword (sh); sh->type = SSVM_SEGMENT_MEMFD; + +#if USE_DLMALLOC == 0 + uword flags = MHEAP_FLAG_DISABLE_VM | MHEAP_FLAG_THREAD_SAFE; + sh->heap = mheap_alloc_with_flags (((u8 *) sh) + page_size, memfd->ssvm_size - page_size, flags); - +#else + sh->heap = create_mspace_with_base (((u8 *) sh) + page_size, + memfd->ssvm_size - page_size, + 1 /* locked */ ); + mspace_disable_expand (sh->heap); +#endif oldheap = ssvm_push_heap (sh); sh->name = format (0, "%s", memfd->name, 0); ssvm_pop_heap (oldheap); @@ -267,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"); @@ -324,21 +347,30 @@ ssvm_delete_memfd (ssvm_private_t * memfd) int 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 pagesize = clib_mem_get_page_size (); u32 rnd_size = 0; u8 *heap; - rnd_size = (ssvm->ssvm_size + (pagesize - 1)) & ~pagesize; - heap = mheap_alloc (0, rnd_size); - if (heap == 0) - { - clib_unix_warning ("mheap alloc"); - return -1; - } - heap_header = mheap_header (heap); - heap_header->flags |= MHEAP_FLAG_THREAD_SAFE; + rnd_size = (ssvm->ssvm_size + (pagesize - 1)) & ~(pagesize - 1); + rnd_size = clib_min (rnd_size, ((u64) 1 << 32) - pagesize); + +#if USE_DLMALLOC == 0 + { + mheap_t *heap_header; + + heap = mheap_alloc (0, rnd_size); + if (heap == 0) + { + clib_unix_warning ("mheap alloc"); + return -1; + } + heap_header = mheap_header (heap); + heap_header->flags |= MHEAP_FLAG_THREAD_SAFE; + } +#else + heap = create_mspace (rnd_size, 1 /* locked */ ); +#endif ssvm->ssvm_size = rnd_size; ssvm->i_am_master = 1; @@ -349,7 +381,7 @@ 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->type = SSVM_SEGMENT_PRIVATE; @@ -367,7 +399,11 @@ void ssvm_delete_private (ssvm_private_t * ssvm) { vec_free (ssvm->name); +#if USE_DLMALLOC == 0 mheap_free (ssvm->sh->heap); +#else + destroy_mspace (ssvm->sh->heap); +#endif clib_mem_free (ssvm->sh); }