X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Fssvm.c;h=0305278a6b6e439a65142e779601ee1a1b6687d8;hb=2c8e0023f91882e53f06eb99c901b97fe013f981;hp=c005b61144b12260dac5e05b31fc5212ad51cfd1;hpb=5da96a77a84ae5414debbc46d390464d51010113;p=vpp.git diff --git a/src/svm/ssvm.c b/src/svm/ssvm.c index c005b61144b..0305278a6b6 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,7 +28,7 @@ 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; + int ssvm_fd; clib_mem_vm_map_t mapa = { 0 }; u8 junk = 0, *ssvm_filename; ssvm_shared_header_t *sh; @@ -77,7 +77,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; @@ -87,6 +87,7 @@ ssvm_master_init_shm (ssvm_private_t * ssvm) mapa.requested_va = requested_va; mapa.size = ssvm->ssvm_size; mapa.fd = ssvm_fd; + mapa.numa_node = ssvm->numa; if (clib_mem_vm_ext_map (&mapa)) { clib_unix_warning ("mmap"); @@ -100,8 +101,10 @@ 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; - sh->heap = mheap_alloc_with_flags (((u8 *) sh) + page_size, - ssvm->ssvm_size - page_size, mh_flags); + sh->heap = create_mspace_with_base (((u8 *) sh) + page_size, + ssvm->ssvm_size - page_size, + 1 /* locked */ ); + mspace_disable_expand (sh->heap); oldheap = ssvm_push_heap (sh); sh->name = format (0, "%s", ssvm->name, 0); @@ -167,7 +170,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); @@ -203,7 +206,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); } /** @@ -212,7 +215,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 }; @@ -227,6 +230,11 @@ ssvm_master_init_memfd (ssvm_private_t * memfd) alloc.size = memfd->ssvm_size; alloc.flags = CLIB_MEM_VM_F_SHARED; alloc.requested_va = memfd->requested_va; + if (memfd->numa) + { + alloc.numa_node = memfd->numa; + alloc.flags |= CLIB_MEM_VM_F_NUMA_PREFER; + } if ((err = clib_mem_vm_ext_alloc (&alloc))) { clib_error_report (err); @@ -238,15 +246,17 @@ 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; - sh->heap = mheap_alloc_with_flags (((u8 *) sh) + page_size, - memfd->ssvm_size - page_size, flags); + sh->heap = create_mspace_with_base (((u8 *) sh) + page_size, + memfd->ssvm_size - page_size, + 1 /* locked */ ); + mspace_disable_expand (sh->heap); oldheap = ssvm_push_heap (sh); sh->name = format (0, "%s", memfd->name, 0); ssvm_pop_heap (oldheap); @@ -271,7 +281,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"); @@ -328,35 +338,59 @@ ssvm_delete_memfd (ssvm_private_t * memfd) int ssvm_master_init_private (ssvm_private_t * ssvm) { - u32 pagesize = clib_mem_get_page_size (); + uword pagesize = clib_mem_get_page_size (), rnd_size = 0; + clib_mem_vm_alloc_t alloc = { 0 }; + struct dlmallinfo dlminfo; ssvm_shared_header_t *sh; - mheap_t *heap_header; - u64 rnd_size = 0; + clib_error_t *err; u8 *heap; - 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); + rnd_size = clib_max (ssvm->ssvm_size + (pagesize - 1), ssvm->ssvm_size); + rnd_size &= ~(pagesize - 1); + + alloc.name = (char *) ssvm->name; + alloc.size = rnd_size + pagesize; + if (ssvm->numa) + { + alloc.numa_node = ssvm->numa; + alloc.flags |= CLIB_MEM_VM_F_NUMA_PREFER; + } + + if ((err = clib_mem_vm_ext_alloc (&alloc))) + { + clib_error_report (err); + return SSVM_API_ERROR_CREATE_FAILURE; + } + + heap = create_mspace_with_base ((u8 *) alloc.addr + pagesize, rnd_size, + 1 /* locked */ ); if (heap == 0) { clib_unix_warning ("mheap alloc"); return -1; } - heap_header = mheap_header (heap); - heap_header->flags |= MHEAP_FLAG_THREAD_SAFE; + + mspace_disable_expand (heap); + + /* Find actual size because mspace size is rounded up by dlmalloc */ + dlminfo = mspace_mallinfo (heap); + rnd_size = dlminfo.fordblks; ssvm->ssvm_size = rnd_size; ssvm->i_am_master = 1; ssvm->my_pid = getpid (); ssvm->requested_va = ~0; - /* Allocate a [sic] shared memory header, in process memory... */ - sh = clib_mem_alloc_aligned (sizeof (*sh), CLIB_CACHE_LINE_BYTES); + /* First page in allocated memory is set aside for the shared header */ + sh = alloc.addr; 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; } @@ -372,8 +406,8 @@ void ssvm_delete_private (ssvm_private_t * ssvm) { vec_free (ssvm->name); - mheap_free (ssvm->sh->heap); - clib_mem_free (ssvm->sh); + destroy_mspace (ssvm->sh->heap); + clib_mem_vm_free (ssvm->sh, ssvm->ssvm_size + clib_mem_get_page_size ()); } int