pmalloc: support for 4K pages

Change-Id: Iecceffe06a92660976ebb58cd3cbec4be8931db0
Signed-off-by: Damjan Marion <damarion@cisco.com>
diff --git a/src/vppinfra/pmalloc.h b/src/vppinfra/pmalloc.h
index 4d9906a..41b85e0 100644
--- a/src/vppinfra/pmalloc.h
+++ b/src/vppinfra/pmalloc.h
@@ -51,7 +51,8 @@
   int fd;
   u32 numa_node;
   u32 first_page_index;
-  u32 log2_page_sz;
+  u32 log2_subpage_sz;
+  u32 subpages_per_page;
   u32 n_pages;
   u8 *name;
   u32 *page_indices;
@@ -59,15 +60,42 @@
 
 typedef struct
 {
+  /* base VA address */
   u8 *base;
-  uword log2_page_sz;
-  uword *va_pa_diffs;
+
+  /* default page size - typically 2M */
+  u32 def_log2_page_sz;
+
+  /* system page size - typically 4K */
+  u32 sys_log2_page_sz;
+
+  /* maximum number of pages, limited by VA preallocation size */
   u32 max_pages;
+
+  /* vector of pages - each page have own alloc pool and it can be split
+     into subpages (i.e. 2M page build out of 512 4K pages) */
   clib_pmalloc_page_t *pages;
+
+  /* hash used to find chunk index out of VA, chunk index is defined
+     per page */
   uword *chunk_index_by_va;
+
+  /* alloc arenas are group of pages which share same attributes
+     shared arenas are represented by FD and they are not grovable
+     private arenas are growable */
   clib_pmalloc_arena_t *arenas;
+
+  /* vector of per numa node alloc arena indices
+     each numa node have own default privat alloc arena */
   u32 *default_arena_for_numa_node;
 
+  /* VA to PA lookup table */
+  uword *lookup_table;
+
+  /* lookup page size - equals to smalles subpage used */
+  u32 lookup_log2_page_sz;
+
+  /* last error */
   clib_error_t *error;
 } clib_pmalloc_main_t;
 
@@ -81,7 +109,8 @@
 void clib_pmalloc_free (clib_pmalloc_main_t * pm, void *va);
 
 void *clib_pmalloc_create_shared_arena (clib_pmalloc_main_t * pm, char *name,
-					uword size, u32 numa_node);
+					uword size, u32 log2_page_sz,
+					u32 numa_node);
 
 void *clib_pmalloc_alloc_from_arena (clib_pmalloc_main_t * pm, void *arena_va,
 				     uword size, uword align);
@@ -98,7 +127,7 @@
 clib_pmalloc_get_page_index (clib_pmalloc_main_t * pm, void *va)
 {
   uword index = (pointer_to_uword (va) - pointer_to_uword (pm->base)) >>
-    pm->log2_page_sz;
+    pm->def_log2_page_sz;
 
   ASSERT (index < vec_len (pm->pages));
 
@@ -115,8 +144,9 @@
 always_inline uword
 clib_pmalloc_get_pa (clib_pmalloc_main_t * pm, void *va)
 {
-  u32 index = clib_pmalloc_get_page_index (pm, va);
-  return pointer_to_uword (va) - pm->va_pa_diffs[index];
+  uword index = (pointer_to_uword (va) - pointer_to_uword (pm->base)) >>
+    pm->lookup_log2_page_sz;
+  return pointer_to_uword (va) - pm->lookup_table[index];
 }