X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fpool.c;h=1f3b96f0f0ad00c46e2e37a673e9ad12593bd089;hb=f6f21db2e30b83236464887df62f50a189bbb859;hp=ed83b41afef9e57bc6e25a9e84ba5e98e321b890;hpb=b7f1faa7fbd4575f28766e552a73810c6de0ace3;p=vpp.git diff --git a/src/vppinfra/pool.c b/src/vppinfra/pool.c index ed83b41afef..1f3b96f0f0a 100644 --- a/src/vppinfra/pool.c +++ b/src/vppinfra/pool.c @@ -37,95 +37,40 @@ #include -void -_pool_init_fixed (void **pool_ptr, u32 elt_size, u32 max_elts) +__clib_export void +_pool_init_fixed (void **pool_ptr, uword elt_size, uword max_elts, uword align) { - 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; + vec_attr_t va = { .elt_sz = elt_size, + .align = align, + .hdr_sz = sizeof (pool_header_t) }; ASSERT (elt_size); ASSERT (max_elts); - vector_size = pool_aligned_header_bytes + vec_header_bytes (0) - + (u64) elt_size *max_elts; + v = _vec_alloc_internal (max_elts, &va); - free_index_size = vec_header_bytes (0) + sizeof (u32) * max_elts; - - /* 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 + 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 *) (v + 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); - 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: - */