vppinfra: deprecate vec numa macros
[vpp.git] / src / vppinfra / pool.c
index 2539845..ff7278b 100644 (file)
 __clib_export void
 _pool_init_fixed (void **pool_ptr, u32 elt_size, u32 max_elts)
 {
-  u8 *mmap_base;
-  u64 vector_size;
-  u64 free_index_size;
-  u64 total_size;
-  u64 page_size;
-  pool_header_t *fh;
-  vec_header_t *vh;
+  uword *b;
+  pool_header_t *ph;
   u8 *v;
-  u32 *fi;
   u32 i;
-  u32 set_bits;
 
   ASSERT (elt_size);
   ASSERT (max_elts);
 
-  vector_size =
-    vec_header_bytes (pool_aligned_header_bytes) + (u64) elt_size * max_elts;
-  free_index_size = vec_header_bytes (0) + sizeof (u32) * max_elts;
+  v =
+    vec_resize_allocate_memory (0, max_elts, elt_size * max_elts,
+                               sizeof (pool_header_t), CLIB_CACHE_LINE_BYTES);
 
-  /* Round up to a cache line boundary */
-  vector_size = (vector_size + CLIB_CACHE_LINE_BYTES - 1)
-    & ~(CLIB_CACHE_LINE_BYTES - 1);
-
-  free_index_size = (free_index_size + CLIB_CACHE_LINE_BYTES - 1)
-    & ~(CLIB_CACHE_LINE_BYTES - 1);
-
-  total_size = vector_size + free_index_size;
-
-  /* Round up to an even number of pages */
-  page_size = clib_mem_get_page_size ();
-  total_size = (total_size + page_size - 1) & ~(page_size - 1);
-
-  /* mmap demand zero memory */
-
-  mmap_base = mmap (0, total_size, PROT_READ | PROT_WRITE,
-                   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-
-  if (mmap_base == MAP_FAILED)
-    {
-      clib_unix_warning ("mmap");
-      *pool_ptr = 0;
-    }
-
-  /* First comes the pool header */
-  fh = (pool_header_t *) mmap_base;
-  /* Find the user vector pointer */
-  v = (u8 *) (mmap_base + vec_header_bytes (pool_aligned_header_bytes));
-  /* Finally, the vector header */
-  vh = _vec_find (v);
-
-  fh->free_bitmap = 0;         /* No free elts (yet) */
-  fh->max_elts = max_elts;
-  fh->mmap_base = mmap_base;
-  fh->mmap_size = total_size;
-
-  vh->len = max_elts;
+  ph = pool_header (v);
+  ph->max_elts = max_elts;
 
   /* Build the free-index vector */
-  vh = (vec_header_t *) ((u8 *) fh + vector_size);
-  vh->len = max_elts;
-  fi = (u32 *) (vh + 1);
-
-  fh->free_indices = fi;
+  vec_validate_aligned (ph->free_indices, max_elts - 1, CLIB_CACHE_LINE_BYTES);
+  for (i = 0; i < max_elts; i++)
+    ph->free_indices[i] = (max_elts - 1) - i;
 
   /* Set the entire free bitmap */
-  clib_bitmap_alloc (fh->free_bitmap, max_elts);
-  clib_memset (fh->free_bitmap, 0xff,
-              vec_len (fh->free_bitmap) * sizeof (uword));
-
-  /* Clear any extraneous set bits */
-  set_bits = vec_len (fh->free_bitmap) * BITS (uword);
+  clib_bitmap_alloc (ph->free_bitmap, max_elts);
 
-  for (i = max_elts; i < set_bits; i++)
-    fh->free_bitmap = clib_bitmap_set (fh->free_bitmap, i, 0);
+  for (b = ph->free_bitmap, i = max_elts; i >= uword_bits;
+       i -= uword_bits, b++)
+    b[0] = ~0ULL;
 
-  /* Create the initial free vector */
-  for (i = 0; i < max_elts; i++)
-    fi[i] = (max_elts - 1) - i;
+  if (i)
+    b[0] = pow2_mask (i);
 
   *pool_ptr = v;
 }
 
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */