physmem: Add physmem map support
[vpp.git] / src / vlib / physmem.c
index e2d8892..37bf693 100755 (executable)
@@ -31,7 +31,8 @@
 
 clib_error_t *
 vlib_physmem_shared_map_create (vlib_main_t * vm, char *name, uword size,
-                               u32 numa_node, u32 * map_index)
+                               u32 log2_page_sz, u32 numa_node,
+                               u32 * map_index)
 {
   clib_pmalloc_main_t *pm = vm->physmem_main.pmalloc_main;
   vlib_physmem_main_t *vpm = &vm->physmem_main;
@@ -39,9 +40,10 @@ vlib_physmem_shared_map_create (vlib_main_t * vm, char *name, uword size,
   clib_pmalloc_arena_t *a;
   clib_error_t *error = 0;
   void *va;
-  int i;
+  uword i;
 
-  va = clib_pmalloc_create_shared_arena (pm, name, size, numa_node);
+  va = clib_pmalloc_create_shared_arena (pm, name, size, log2_page_sz,
+                                        numa_node);
 
   if (va == 0)
     return clib_error_return (0, "%U", format_clib_error,
@@ -53,12 +55,13 @@ vlib_physmem_shared_map_create (vlib_main_t * vm, char *name, uword size,
   *map_index = map->index = map - vpm->maps;
   map->base = va;
   map->fd = a->fd;
-  map->n_pages = a->n_pages;
-  map->log2_page_size = a->log2_page_sz;
+  map->n_pages = a->n_pages * a->subpages_per_page;
+  map->log2_page_size = a->log2_subpage_sz;
 
   for (i = 0; i < a->n_pages; i++)
     {
-      uword pa = clib_pmalloc_get_pa (pm, (u8 *) va + (i << a->log2_page_sz));
+      uword pa =
+       clib_pmalloc_get_pa (pm, (u8 *) va + (i << a->log2_subpage_sz));
 
       /* maybe iova */
       if (pa == 0)
@@ -87,7 +90,7 @@ vlib_physmem_init (vlib_main_t * vm)
 
   /* check if pagemap is accessible */
   pt = clib_mem_vm_get_paddr (&pt, min_log2 (sysconf (_SC_PAGESIZE)), 1);
-  if (pt[0])
+  if (pt && pt[0])
     vpm->flags |= VLIB_PHYSMEM_MAIN_F_HAVE_PAGEMAP;
   vec_free (pt);
 
@@ -109,7 +112,7 @@ show_physmem (vlib_main_t * vm,
 {
   vlib_physmem_main_t *vpm = &vm->physmem_main;
   unformat_input_t _line_input, *line_input = &_line_input;
-  u32 verbose = 0;
+  u32 verbose = 0, map = 0;
 
   if (unformat_user (input, unformat_line_input, line_input))
     {
@@ -123,20 +126,26 @@ show_physmem (vlib_main_t * vm,
            verbose = 2;
          else if (unformat (line_input, "d"))
            verbose = 2;
+         else if (unformat (line_input, "map"))
+           map = 1;
          else
            break;
        }
       unformat_free (line_input);
     }
 
-  vlib_cli_output (vm, "  %U", format_pmalloc, vpm->pmalloc_main, verbose);
+  if (map)
+    vlib_cli_output (vm, " %U", format_pmalloc_map, vpm->pmalloc_main);
+  else
+    vlib_cli_output (vm, " %U", format_pmalloc, vpm->pmalloc_main, verbose);
+
   return 0;
 }
 
 /* *INDENT-OFF* */
 VLIB_CLI_COMMAND (show_physmem_command, static) = {
   .path = "show physmem",
-  .short_help = "Show physical memory allocation",
+  .short_help = "show physmem [verbose | detail | map]",
   .function = show_physmem,
 };
 /* *INDENT-ON* */