/*------------------------------------------------------------------------- * * pg_numa.c * Basic NUMA portability routines * * * Copyright (c) 2025, PostgreSQL Global Development Group * * * IDENTIFICATION * src/port/pg_numa.c * *------------------------------------------------------------------------- */ #include "c.h" #include #include "port/pg_numa.h" /* * At this point we provide support only for Linux thanks to libnuma, but in * future support for other platforms e.g. Win32 or FreeBSD might be possible * too. For Win32 NUMA APIs see * https://learn.microsoft.com/en-us/windows/win32/procthread/numa-support */ #ifdef USE_LIBNUMA #include #include /* libnuma requires initialization as per numa(3) on Linux */ int pg_numa_init(void) { int r = numa_available(); return r; } /* * We use move_pages(2) syscall here - instead of get_mempolicy(2) - as the * first one allows us to batch and query about many memory pages in one single * giant system call that is way faster. */ int pg_numa_query_pages(int pid, unsigned long count, void **pages, int *status) { return numa_move_pages(pid, count, pages, NULL, status, 0); } int pg_numa_get_max_node(void) { return numa_max_node(); } #else /* Empty wrappers */ int pg_numa_init(void) { /* We state that NUMA is not available */ return -1; } int pg_numa_query_pages(int pid, unsigned long count, void **pages, int *status) { return 0; } int pg_numa_get_max_node(void) { return 0; } #endif