From 16e4a4a0ae39ebc1ded1b6dba2799b176aee1828 Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Thu, 16 Apr 2020 12:00:14 -0400 Subject: vppinfra: bihash improvements Template instances can allocate BIHASH_KVP_PER_PAGE data records tangent to the bucket, to remove a dependent read / prefetch. Template instances can ask for immediate memory allocation, to avoid several branches in the lookup path. Clean up l2 fib, gpb plugin codes: use clib_bihash_get_bucket(...) Use hugepages for bihash allocation arenas Type: improvement Signed-off-by: Dave Barach Signed-off-by: Damjan Marion Change-Id: I92fc11bc58e48d84e2d61f44580916dd1c56361c --- src/vppinfra/linux/mem.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/vppinfra/linux') diff --git a/src/vppinfra/linux/mem.c b/src/vppinfra/linux/mem.c index 3b7294f038a..d86402a9b16 100644 --- a/src/vppinfra/linux/mem.c +++ b/src/vppinfra/linux/mem.c @@ -344,6 +344,38 @@ clib_mem_vm_ext_free (clib_mem_vm_alloc_t * a) } } +uword +clib_mem_vm_reserve (uword start, uword size, u32 log2_page_sz) +{ + uword off, pagesize = 1 << log2_page_sz; + int mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS; + u8 *p; + + if (start) + mmap_flags |= MAP_FIXED; + + size = round_pow2 (size, pagesize); + + p = uword_to_pointer (start, void *); + p = mmap (p, size + pagesize, PROT_NONE, mmap_flags, -1, 0); + + if (p == MAP_FAILED) + return ~0; + + off = round_pow2 ((uword) p, pagesize) - (uword) p; + + /* trim start and end of reservation to be page aligned */ + if (off) + { + munmap (p, off); + p += off; + } + + munmap (p + size, pagesize - off); + + return (uword) p; +} + u64 * clib_mem_vm_get_paddr (void *mem, int log2_page_size, int n_pages) { -- cgit 1.2.3-korg