X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Fsvm.c;h=aa84a2fe3b4b1a1377611150c879ff8ceac3c76e;hb=6a5adc369591fcac2447e9809deaa22f56b53911;hp=16a58fa126a6e9fe72757458382eb551ae5af243;hpb=d6c30d9cae3ec8946c75d9ed87d40c053e2c083a;p=vpp.git diff --git a/src/svm/svm.c b/src/svm/svm.c index 16a58fa126a..aa84a2fe3b4 100644 --- a/src/svm/svm.c +++ b/src/svm/svm.c @@ -83,7 +83,7 @@ svm_get_global_region_base_va () unformat_free (&input); close (fd); - count_leading_zeros (bits, end); + bits = count_leading_zeros (end); bits = 64 - bits; if (bits >= 36 && bits <= 48) return ((1ul << bits) / 4) - (2 * SVM_GLOBAL_REGION_SIZE); @@ -236,6 +236,7 @@ format_svm_region (u8 * s, va_list * args) } } } +#if USE_DLMALLOC == 0 s = format (s, " rgn heap stats: %U", format_mheap, rp->region_heap, 0); if ((rp->flags & SVM_FLAGS_MHEAP) && rp->data_heap) @@ -244,6 +245,7 @@ format_svm_region (u8 * s, va_list * args) rp->data_heap, 1); } s = format (s, "\n"); +#endif } return (s); @@ -339,9 +341,19 @@ svm_data_region_create (svm_map_region_args_t * a, svm_region_t * rp) if (a->flags & SVM_FLAGS_MHEAP) { +#if USE_DLMALLOC == 0 + mheap_t *heap_header; rp->data_heap = mheap_alloc_with_flags ((void *) (rp->data_base), map_size, MHEAP_FLAG_DISABLE_VM); + heap_header = mheap_header (rp->data_heap); + heap_header->flags |= MHEAP_FLAG_THREAD_SAFE; +#else + rp->data_heap = create_mspace_with_base (rp->data_base, + map_size, 1 /* locked */ ); + mspace_disable_expand (rp->data_heap); +#endif + rp->flags |= SVM_FLAGS_MHEAP; } return 0; @@ -514,12 +526,22 @@ svm_region_init_mapped_region (svm_map_region_args_t * a, svm_region_t * rp) rp->virtual_base = a->baseva; rp->virtual_size = a->size; +#if USE_DLMALLOC == 0 rp->region_heap = mheap_alloc_with_flags (uword_to_pointer (a->baseva + MMAP_PAGESIZE, void *), (a->pvt_heap_size != 0) ? a->pvt_heap_size : SVM_PVT_MHEAP_SIZE, MHEAP_FLAG_DISABLE_VM); +#else + rp->region_heap = create_mspace_with_base + (uword_to_pointer (a->baseva + MMAP_PAGESIZE, void *), + (a->pvt_heap_size != + 0) ? a->pvt_heap_size : SVM_PVT_MHEAP_SIZE, 1 /* locked */ ); + + mspace_disable_expand (rp->region_heap); +#endif + oldheap = svm_push_pvt_heap (rp); rp->region_name = (char *) format (0, "%s%c", a->name, 0); @@ -652,6 +674,10 @@ svm_map_region (svm_map_region_args_t * a) return (0); } + /* Reset ownership in case the client started first */ + if (fchown (svm_fd, a->uid, a->gid) < 0) + clib_unix_warning ("segment chown [ok if client starts first]"); + time_left = 20; while (1) { @@ -721,6 +747,8 @@ svm_map_region (svm_map_region_args_t * a) return (0); } + close (svm_fd); + if ((uword) rp != rp->virtual_base) { clib_warning ("mmap botch");