Enable shared-VM namespace support 36/136/1
authorDave Barach <dave@barachs.net>
Fri, 22 Jan 2016 21:09:52 +0000 (16:09 -0500)
committerDave Barach <dave@barachs.net>
Fri, 22 Jan 2016 21:10:07 +0000 (16:10 -0500)
Required prep work for gracefully supporting
"... dpdk { proc-type secondary }" -  multiple processes sharing a physical
host, VM, container, etc.

Change-Id: Ic3eb72f4093e26d7c86dde3b8799264f1d0c218b
Signed-off-by: Dave Barach <dave@barachs.net>
svm/svm.c
vlib-api/vlibmemory/memory_shared.c
vlib-api/vlibmemory/memory_vlib.c
vpp-api-test/vat/main.c
vpp/api/api.c
vpp/api/gmon.c

index ab74913..62f317a 100644 (file)
--- a/svm/svm.c
+++ b/svm/svm.c
@@ -338,8 +338,6 @@ u8 *shm_name_from_svm_map_region_args (svm_map_region_args_t *a)
                 split_point++;
             }
             vec_add1 (mkdir_arg, 0);
-            if (mkdir ((char *) mkdir_arg, 0777) < 0 && errno != EEXIST)
-                clib_unix_warning ("mkdir %s", mkdir_arg);
             
             /* ready to descend another level */
             mkdir_arg[vec_len(mkdir_arg)-1] = '-';
index de1eafd..ecd5cff 100644 (file)
@@ -192,6 +192,13 @@ static void vl_msg_api_free_nolock (void *a)
     svm_pop_heap (oldheap);
 }
 
+void vl_set_memory_root_path (char *name)
+{
+    api_main_t *am = &api_main;
+
+    am->root_path = name;
+}
+
 int vl_map_shmem (char *region_name, int is_vlib)
 {
     svm_map_region_args_t *a = 0;
@@ -203,7 +210,7 @@ int vl_map_shmem (char *region_name, int is_vlib)
     struct timespec ts, tsrem;
 
     if (is_vlib == 0)
-        svm_region_init();
+        svm_region_init_chroot(am->root_path);
 
     vec_validate (a, 0);
 
index 57cb8f7..7ba76ec 100644 (file)
@@ -1046,9 +1046,10 @@ VLIB_CLI_COMMAND (trace, static) = {
 clib_error_t *
 vlibmemory_init (vlib_main_t * vm)
 {
-    /* Do this early, to avoid glibc malloc fubar */
-    svm_region_init();
-    return 0;
+  api_main_t *am = &api_main;
+  /* Normally NULL, can be set by cmd line "chroot {prefix foo}" */
+  svm_region_init_chroot (am->root_path);
+  return 0;
 }
 
 VLIB_INIT_FUNCTION (vlibmemory_init);
@@ -1060,13 +1061,6 @@ void vl_set_memory_region_name (char *name)
     am->region_name = name;
 }
 
-void vl_set_memory_root_path (char *name)
-{
-    api_main_t *am = &api_main;
-
-    am->root_path = name;
-}
-
 static int range_compare (vl_api_msg_range_t * a0, vl_api_msg_range_t * a1)
 {
     int len0, len1, clen;
index 1bec4a1..cde51fd 100644 (file)
@@ -176,6 +176,7 @@ int main (int argc, char ** argv)
     unformat_input_t _argv, *a = &_argv;
     u8 **input_files = 0;
     u8 *output_file = 0;
+    u8 *chroot_prefix;
     u8 *this_input_file;
     u8 interactive = 1;
     u8 json_output = 0;
@@ -213,7 +214,9 @@ int main (int argc, char ** argv)
         else if (unformat (a, "plugin_name_filter %s", 
                            (u8 *)&vat_plugin_name_filter))
             vec_add1 (vat_plugin_name_filter, 0);
-        else {
+        else if (unformat (a, "chroot prefix %s", &chroot_prefix)) {
+            vl_set_memory_root_path ((char *)chroot_prefix);
+        } else {
             fformat (stderr, 
                      "%s: usage [in <f1> ... in <fn>] [out <fn>] [script] [json]\n");
             exit (1);
index 9f3da21..55de994 100644 (file)
@@ -4979,6 +4979,26 @@ vpe_api_init (vlib_main_t *vm)
 
 VLIB_INIT_FUNCTION(vpe_api_init);
 
+static clib_error_t *
+chroot_config (vlib_main_t * vm, unformat_input_t * input)
+{
+  u8 * chroot_path;
+
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "prefix %s", &chroot_path))
+        {
+          vec_add1 (chroot_path, 0);
+          vl_set_memory_root_path ((char *)chroot_path);
+        }
+      else
+       return clib_error_return (0, "unknown input `%U'",
+                                 format_unformat_error, input);
+    }
+  return 0;
+}
+VLIB_EARLY_CONFIG_FUNCTION (chroot_config, "chroot");
+
 void * get_unformat_vnet_sw_interface (void)
 {
     return (void *) &unformat_vnet_sw_interface;
index 75bf344..e256e83 100644 (file)
@@ -35,6 +35,8 @@
 #include <vppinfra/heap.h>
 #include <vppinfra/pool.h>
 #include <vppinfra/format.h>
+#include <vlibapi/api.h>
+#include <vlibmemory/api.h>
 
 #include <vlib/vlib.h>
 #include <vlib/unix/unix.h>
@@ -104,11 +106,12 @@ static clib_error_t *
 gmon_init (vlib_main_t *vm)
 {
     gmon_main_t *gm = &gmon_main;
+    api_main_t * am = &api_main;
     pid_t *swp = 0;
     f64 *v = 0;
 
     gm->vlib_main = vm;
-    gm->svmdb_client = svmdb_map();
+    gm->svmdb_client = svmdb_map_chroot(am->root_path);
 
     /* Find or create, set to zero */
     vec_add1 (v, 0.0);