avf: allocate descriptor memory from local numa
[vpp.git] / src / vlib / physmem.h
index 9e7d52a..a986a50 100644 (file)
 #ifndef included_vlib_physmem_h
 #define included_vlib_physmem_h
 
+#include <vppinfra/pmalloc.h>
+
 typedef struct
 {
-  uword start, end, size;
-} vlib_physmem_region_t;
+  int index;
+  int fd;
+  void *base;
+  u32 n_pages;
+  uword *page_table;
+  u32 log2_page_size;
+  u32 numa_node;
+} vlib_physmem_map_t;
 
 typedef struct
 {
-  vlib_physmem_region_t virtual;
-
-  uword log2_n_bytes_per_page;
-
-  /* 1 << log2_n_bytes_per_page - 1. */
-  uword page_mask;
-
-  u64 *page_table;
-
-  /* is fake physmem */
-  u8 is_fake;
+  u32 flags;
+#define VLIB_PHYSMEM_MAIN_F_HAVE_PAGEMAP       (1 << 0)
+#define VLIB_PHYSMEM_MAIN_F_HAVE_IOMMU         (1 << 1)
+  vlib_physmem_map_t *maps;
+  clib_pmalloc_main_t *pmalloc_main;
 } vlib_physmem_main_t;
 
-always_inline u64
-vlib_physmem_offset_to_physical (vlib_physmem_main_t * pm, uword o)
-{
-  uword page_index = o >> pm->log2_n_bytes_per_page;
-  ASSERT (o < pm->virtual.size);
-  ASSERT (pm->page_table[page_index] != 0);
-  return (vec_elt (pm->page_table, page_index) + (o & pm->page_mask));
-}
-
-always_inline int
-vlib_physmem_is_virtual (vlib_physmem_main_t * pm, uword p)
-{
-  return p >= pm->virtual.start && p < pm->virtual.end;
-}
-
-always_inline uword
-vlib_physmem_offset_of (vlib_physmem_main_t * pm, void *p)
-{
-  uword a = pointer_to_uword (p);
-  uword o;
-
-  ASSERT (vlib_physmem_is_virtual (pm, a));
-  o = a - pm->virtual.start;
-
-  /* Offset must fit in 32 bits. */
-  ASSERT ((uword) o == a - pm->virtual.start);
-
-  return o;
-}
-
-always_inline void *
-vlib_physmem_at_offset (vlib_physmem_main_t * pm, uword offset)
-{
-  ASSERT (offset < pm->virtual.size);
-  return uword_to_pointer (pm->virtual.start + offset, void *);
-}
-
 #endif /* included_vlib_physmem_h */
 
 /*