Bug: https://bugs.gentoo.org/show_bug.cgi?id=600860 Upstream commits: https://reviews.llvm.org/D26001 https://reviews.llvm.org/D35072 --- a/runtime/src/kmp_alloc.c +++ b/runtime/src/kmp_alloc.c @@ -1719,13 +1719,8 @@ __kmp_ft_page_allocate(size_t size) { void *adr, *aadr; -#if KMP_OS_LINUX - /* TODO: Use this function to get page size everywhere */ - int page_size = getpagesize(); -#else - /* TODO: Find windows function to get page size and use it everywhere */ - int page_size = PAGE_SIZE; -#endif /* KMP_OS_LINUX */ + + const int page_size = KMP_GET_PAGE_SIZE(); adr = (void *) __kmp_thread_malloc( __kmp_get_thread(), size + page_size + KMP_PTR_SKIP); --- a/runtime/src/kmp_os.h +++ b/runtime/src/kmp_os.h @@ -235,10 +235,23 @@ #define __forceinline __inline #endif -#define PAGE_SIZE (0x4000) +#if KMP_OS_WINDOWS +#include + +static inline int KMP_GET_PAGE_SIZE(void) { + SYSTEM_INFO si; + GetSystemInfo(&si); + return si.dwPageSize; +} +#else +// TODO: find the corresponding function to getpagesize() in Windows +// and use it whenever possible. +#define KMP_GET_PAGE_SIZE() getpagesize() +#endif + #define PAGE_ALIGNED(_addr) ( ! ((size_t) _addr & \ - (size_t)(PAGE_SIZE - 1))) -#define ALIGN_TO_PAGE(x) (void *)(((size_t)(x)) & ~((size_t)(PAGE_SIZE - 1))) + (size_t)(KMP_GET_PAGE_SIZE() - 1))) +#define ALIGN_TO_PAGE(x) (void *)(((size_t)(x)) & ~((size_t)(KMP_GET_PAGE_SIZE() - 1))) /* ---------------------- Support for cache alignment, padding, etc. -----------------*/ @@ -289,8 +302,6 @@ #if KMP_ASM_INTRINS && KMP_OS_WINDOWS -#include - #pragma intrinsic(InterlockedExchangeAdd) #pragma intrinsic(InterlockedCompareExchange) #pragma intrinsic(InterlockedExchange) --- a/runtime/src/kmp_runtime.c +++ b/runtime/src/kmp_runtime.c @@ -345,8 +345,10 @@ int lastNode; int localProc = __kmp_get_cpu_from_gtid(gtid); - p1 = (void *)( (size_t)p1 & ~((size_t)PAGE_SIZE - 1) ); - p2 = (void *)( ((size_t) p2 - 1) & ~((size_t)PAGE_SIZE - 1) ); + const int page_size = KMP_GET_PAGE_SIZE(); + + p1 = (void *)( (size_t)p1 & ~((size_t)page_size - 1) ); + p2 = (void *)( ((size_t) p2 - 1) & ~((size_t)page_size - 1) ); if(localProc >= 0) __kmp_printf_no_lock(" GTID %d localNode %d\n", gtid, localProc>>1); else @@ -358,17 +360,17 @@ lastNode = node; /* This loop collates adjacent pages with the same host node. */ do { - (char*)p1 += PAGE_SIZE; + (char*)p1 += page_size; } while(p1 <= p2 && (node = __kmp_get_host_node(p1)) == lastNode); __kmp_printf_no_lock(" %p-%p memNode %d\n", last, (char*)p1 - 1, lastNode); } while(p1 <= p2); # else __kmp_printf_no_lock(" %p-%p memNode %d\n", p1, - (char*)p1 + (PAGE_SIZE - 1), __kmp_get_host_node(p1)); + (char*)p1 + (page_size - 1), __kmp_get_host_node(p1)); if(p1 < p2) { __kmp_printf_no_lock(" %p-%p memNode %d\n", p2, - (char*)p2 + (PAGE_SIZE - 1), __kmp_get_host_node(p2)); + (char*)p2 + (page_size - 1), __kmp_get_host_node(p2)); } # endif }