diff options
author | Dmitry Safonov <dima@arista.com> | 2018-05-10 21:14:48 +0300 |
---|---|---|
committer | Andrei Vagin <avagin@virtuozzo.com> | 2018-07-04 03:17:17 +0300 |
commit | 2d965008d367455e792e0938dd13656a85dabf14 (patch) | |
tree | 926bfb9c8553c8931948e00a428bdc42442c8cff /include | |
parent | bbe7721075ab28a03ff48a2c3b5df495816fc4eb (diff) |
ppc64/aarch64: Dynamically define PAGE_SIZE
On ppc64/aarch64 Linux can be set to use Large pages, so the PAGE_SIZE
isn't build-time constant anymore. Define it through _SC_PAGESIZE.
There are different sizes for a page on ppc64:
: #if defined(CONFIG_PPC_256K_PAGES)
: #define PAGE_SHIFT 18
: #elif defined(CONFIG_PPC_64K_PAGES)
: #define PAGE_SHIFT 16
: #elif defined(CONFIG_PPC_16K_PAGES)
: #define PAGE_SHIFT 14
: #else
: #define PAGE_SHIFT 12
: #endif
And on aarch64 there are default sizes and possibly someone can set his
own PAGE_SHIFT:
: config ARM64_PAGE_SHIFT
: int
: default 16 if ARM64_64K_PAGES
: default 14 if ARM64_16K_PAGES
: default 12
On the downside - each time we need PAGE_SIZE, we're doing libc
function call on aarch64/ppc64.
Fixes: #415
Tested-by: Adrian Reber <areber@redhat.com>
Signed-off-by: Dmitry Safonov <dima@arista.com>
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/common/arch/aarch64/asm/page.h | 42 | ||||
-rw-r--r-- | include/common/arch/ppc64/asm/page.h | 40 |
2 files changed, 53 insertions, 29 deletions
diff --git a/include/common/arch/aarch64/asm/page.h b/include/common/arch/aarch64/asm/page.h index 4126c8474..bd8fe8f71 100644 --- a/include/common/arch/aarch64/asm/page.h +++ b/include/common/arch/aarch64/asm/page.h @@ -4,22 +4,36 @@ #define ARCH_HAS_LONG_PAGES #ifndef CR_NOGLIBC -#include <unistd.h> - -#ifndef PAGE_SHIFT -# define PAGE_SHIFT 12 -#endif - -#ifndef PAGE_SIZE -# define PAGE_SIZE (1UL << PAGE_SHIFT) -#endif - -#ifndef PAGE_MASK -# define PAGE_MASK (~(PAGE_SIZE - 1)) -#endif +#include <string.h> /* ffsl() */ +#include <unistd.h> /* _SC_PAGESIZE */ + +extern unsigned __page_size; +extern unsigned __page_shift; + +static inline unsigned page_size(void) +{ + if (!__page_size) + __page_size = sysconf(_SC_PAGESIZE); + return __page_size; +} + +static inline unsigned page_shift(void) +{ + if (!__page_shift) + __page_shift = (ffsl(page_size()) - 1); + return __page_shift; +} + +/* + * Don't add ifdefs for PAGE_SIZE: if any header defines it as a constant + * on aarch64, then we need refrain using PAGE_SIZE in criu and use + * page_size() across sources (as it may differ on aarch64). + */ +#define PAGE_SIZE page_size() +#define PAGE_MASK (~(PAGE_SIZE - 1)) +#define PAGE_SHIFT page_shift() #define PAGE_PFN(addr) ((addr) / PAGE_SIZE) -#define page_size() sysconf(_SC_PAGESIZE) #else /* CR_NOGLIBC */ diff --git a/include/common/arch/ppc64/asm/page.h b/include/common/arch/ppc64/asm/page.h index a95af55ef..5107cb8e0 100644 --- a/include/common/arch/ppc64/asm/page.h +++ b/include/common/arch/ppc64/asm/page.h @@ -4,26 +4,36 @@ #define ARCH_HAS_LONG_PAGES #ifndef CR_NOGLIBC -#include <unistd.h> +#include <string.h> /* ffsl() */ +#include <unistd.h> /* _SC_PAGESIZE */ + +extern unsigned __page_size; +extern unsigned __page_shift; + +static inline unsigned page_size(void) +{ + if (!__page_size) + __page_size = sysconf(_SC_PAGESIZE); + return __page_size; +} + +static inline unsigned page_shift(void) +{ + if (!__page_shift) + __page_shift = (ffsl(page_size()) - 1); + return __page_shift; +} /* - * Default config for Pseries is to use 64K pages. - * See kernel file arch/powerpc/configs/pseries_*defconfig + * Don't add ifdefs for PAGE_SIZE: if any header defines it as a constant + * on ppc64, then we need refrain using PAGE_SIZE in criu and use + * page_size() across sources (as it may differ on ppc64). */ -#ifndef PAGE_SHIFT -# define PAGE_SHIFT 16 -#endif - -#ifndef PAGE_SIZE -# define PAGE_SIZE (1UL << PAGE_SHIFT) -#endif - -#ifndef PAGE_MASK -# define PAGE_MASK (~(PAGE_SIZE - 1)) -#endif +#define PAGE_SIZE page_size() +#define PAGE_MASK (~(PAGE_SIZE - 1)) +#define PAGE_SHIFT page_shift() #define PAGE_PFN(addr) ((addr) / PAGE_SIZE) -#define page_size() sysconf(_SC_PAGESIZE) #else /* CR_NOGLIBC */ |