X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Fsvm.c;h=313fe4a87879dc57b7880e459fb3e5c058735fd8;hb=ae34872077c956aa34ee816b55ccb5c5f6ab40a1;hp=6249a342be28a141fe6b4be981f59186a534c994;hpb=c35f3e835b4078fedabc1ff5013bc4727f533e16;p=vpp.git diff --git a/src/svm/svm.c b/src/svm/svm.c index 6249a342be2..313fe4a8787 100644 --- a/src/svm/svm.c +++ b/src/svm/svm.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -329,15 +328,15 @@ svm_data_region_create (svm_map_region_args_t * a, svm_region_t * rp) return -3; } close (fd); - rp->backing_file = (char *) format (0, "%s\0", a->backing_file); + CLIB_MEM_UNPOISON (rp->data_base, map_size); + rp->backing_file = (char *) format (0, "%s%c", a->backing_file, 0); rp->flags |= SVM_FLAGS_FILE; } if (a->flags & SVM_FLAGS_MHEAP) { - rp->data_heap = create_mspace_with_base (rp->data_base, - map_size, 1 /* locked */ ); - mspace_disable_expand (rp->data_heap); + rp->data_heap = clib_mem_create_heap (rp->data_base, map_size, + 1 /* locked */ , "svm data"); rp->flags |= SVM_FLAGS_MHEAP; } @@ -414,6 +413,7 @@ svm_data_region_map (svm_map_region_args_t * a, svm_region_t * rp) return -3; } close (fd); + CLIB_MEM_UNPOISON (rp->data_base, map_size); } return 0; } @@ -485,12 +485,11 @@ 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; - rp->region_heap = create_mspace_with_base + rp->region_heap = clib_mem_create_heap (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); + 0) ? a->pvt_heap_size : SVM_PVT_MHEAP_SIZE, 1 /* locked */ , + "svm region"); oldheap = svm_push_pvt_heap (rp); @@ -607,6 +606,7 @@ svm_map_region (svm_map_region_args_t * a) return (0); } close (svm_fd); + CLIB_MEM_UNPOISON (rp, a->size); svm_region_init_mapped_region (a, rp); @@ -663,6 +663,9 @@ svm_map_region (svm_map_region_args_t * a) clib_warning ("mmap"); return (0); } + + CLIB_MEM_UNPOISON (rp, MMAP_PAGESIZE); + /* * We lost the footrace to create this region; make sure * the winner has crossed the finish line. @@ -699,6 +702,8 @@ svm_map_region (svm_map_region_args_t * a) close (svm_fd); + CLIB_MEM_UNPOISON (rp, a->size); + if ((uword) rp != rp->virtual_base) { clib_warning ("mmap botch"); @@ -711,12 +716,17 @@ svm_map_region (svm_map_region_args_t * a) pid_holding_region_lock = rp->mutex_owner_pid; if (pid_holding_region_lock && kill (pid_holding_region_lock, 0) < 0) { + pthread_mutexattr_t attr; clib_warning ("region %s mutex held by dead pid %d, tag %d, force unlock", rp->region_name, pid_holding_region_lock, rp->mutex_owner_tag); /* owner pid is nonexistent */ - rp->mutex.__data.__owner = 0; - rp->mutex.__data.__lock = 0; + if (pthread_mutexattr_init (&attr)) + clib_unix_warning ("mutexattr_init"); + if (pthread_mutexattr_setpshared (&attr, PTHREAD_PROCESS_SHARED)) + clib_unix_warning ("mutexattr_setpshared"); + if (pthread_mutex_init (&rp->mutex, &attr)) + clib_unix_warning ("mutex_init"); dead_region_recovery = 1; } @@ -1042,6 +1052,7 @@ svm_region_unmap_internal (void *rp_arg, u8 is_client) oldheap = svm_push_pvt_heap (rp); /* nb vec_delete() in the loop */ /* Remove the caller from the list of mappers */ + CLIB_MEM_UNPOISON (rp->client_pids, vec_bytes (rp->client_pids)); for (i = 0; i < vec_len (rp->client_pids); i++) { if (rp->client_pids[i] == mypid) @@ -1174,6 +1185,7 @@ svm_region_exit_internal (u8 is_client) virtual_base = root_rp->virtual_base; virtual_size = root_rp->virtual_size; + CLIB_MEM_UNPOISON (root_rp->client_pids, vec_bytes (root_rp->client_pids)); for (i = 0; i < vec_len (root_rp->client_pids); i++) { if (root_rp->client_pids[i] == mypid) @@ -1281,10 +1293,10 @@ svm_client_scan (const char *root_path) * find_or_create. */ /* *INDENT-OFF* */ - pool_foreach (subp, mp->subregions, ({ + pool_foreach (subp, mp->subregions) { name = vec_dup (subp->subregion_name); vec_add1(svm_names, name); - })); + } /* *INDENT-ON* */ pthread_mutex_unlock (&root_rp->mutex);