vppinfra: Add FreeBSD method for updating pmalloc lookup table

FreeBSD has a different interface to request memory mapping information.
Add a FreeBSD specific method for reading physical addresses and make it
available at build time.

Type: improvement
Change-Id: I3588dde8e0a6f6d53333040245341ed09cebef9d
Signed-off-by: Tom Jones <thj@freebsd.org>
This commit is contained in:
Tom Jones
2024-02-02 14:25:24 +00:00
committed by Damjan Marion
parent a0fd523013
commit 97188d71dd

View File

@@ -17,6 +17,9 @@
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef __FreeBSD__
#include <sys/memrange.h>
#endif /* __FreeBSD__ */
#include <fcntl.h>
#include <unistd.h>
#include <sched.h>
@@ -184,8 +187,9 @@ next_chunk:
}
static void
pmalloc_update_lookup_table (clib_pmalloc_main_t * pm, u32 first, u32 count)
pmalloc_update_lookup_table (clib_pmalloc_main_t *pm, u32 first, u32 count)
{
#ifdef __linux
uword seek, va, pa, p;
int fd;
u32 elts_per_page = 1U << (pm->def_log2_page_sz - pm->lookup_log2_page_sz);
@@ -223,6 +227,45 @@ pmalloc_update_lookup_table (clib_pmalloc_main_t * pm, u32 first, u32 count)
if (fd != -1)
close (fd);
#elif defined(__FreeBSD__)
struct mem_extract meme;
uword p;
int fd;
u32 elts_per_page = 1U << (pm->def_log2_page_sz - pm->lookup_log2_page_sz);
vec_validate_aligned (pm->lookup_table,
vec_len (pm->pages) * elts_per_page - 1,
CLIB_CACHE_LINE_BYTES);
p = (uword) first * elts_per_page;
if (pm->flags & CLIB_PMALLOC_F_NO_PAGEMAP)
{
while (p < (uword) elts_per_page * count)
{
pm->lookup_table[p] =
pointer_to_uword (pm->base) + (p << pm->lookup_log2_page_sz);
p++;
}
return;
}
fd = open ((char *) "/dev/mem", O_RDONLY);
if (fd == -1)
return;
while (p < (uword) elts_per_page * count)
{
meme.me_vaddr =
pointer_to_uword (pm->base) + (p << pm->lookup_log2_page_sz);
if (ioctl (fd, MEM_EXTRACT_PADDR, &meme) == -1)
continue;
pm->lookup_table[p] = meme.me_vaddr - meme.me_paddr;
p++;
}
return;
#else
#error "Unsupported OS"
#endif
}
static inline clib_pmalloc_page_t *