X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Fsvm.c;h=d958c8378e5388c717a8a8a2a36e1a4b60536ec6;hb=73710c7da2f8deaea83dbbbfce8737c9c6cd2949;hp=16a58fa126a6e9fe72757458382eb551ae5af243;hpb=d6c30d9cae3ec8946c75d9ed87d40c053e2c083a;p=vpp.git diff --git a/src/svm/svm.c b/src/svm/svm.c index 16a58fa126a..d958c8378e5 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); @@ -339,9 +339,13 @@ svm_data_region_create (svm_map_region_args_t * a, svm_region_t * rp) if (a->flags & SVM_FLAGS_MHEAP) { + 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; + rp->flags |= SVM_FLAGS_MHEAP; } return 0; @@ -652,6 +656,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 +729,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");