Commit 2d965008 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Andrei Vagin

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: 's avatarAdrian Reber <areber@redhat.com>
Signed-off-by: 's avatarDmitry Safonov <dima@arista.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent bbe77210
...@@ -21,6 +21,9 @@ ...@@ -21,6 +21,9 @@
#include "restorer.h" #include "restorer.h"
#include <compel/compel.h> #include <compel/compel.h>
unsigned __page_size = 0;
unsigned __page_shift = 0;
#define assign_reg(dst, src, e) dst->e = (__typeof__(dst->e))(src)->e #define assign_reg(dst, src, e) dst->e = (__typeof__(dst->e))(src)->e
int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpsimd) int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpsimd)
......
...@@ -23,6 +23,9 @@ ...@@ -23,6 +23,9 @@
#include "images/core.pb-c.h" #include "images/core.pb-c.h"
#include "images/creds.pb-c.h" #include "images/creds.pb-c.h"
unsigned __page_size = 0;
unsigned __page_shift = 0;
static UserPpc64FpstateEntry *copy_fp_regs(uint64_t *fpregs) static UserPpc64FpstateEntry *copy_fp_regs(uint64_t *fpregs)
{ {
UserPpc64FpstateEntry *fpe; UserPpc64FpstateEntry *fpe;
......
...@@ -4,22 +4,36 @@ ...@@ -4,22 +4,36 @@
#define ARCH_HAS_LONG_PAGES #define ARCH_HAS_LONG_PAGES
#ifndef CR_NOGLIBC #ifndef CR_NOGLIBC
#include <unistd.h> #include <string.h> /* ffsl() */
#include <unistd.h> /* _SC_PAGESIZE */
#ifndef PAGE_SHIFT
# define PAGE_SHIFT 12 extern unsigned __page_size;
#endif extern unsigned __page_shift;
#ifndef PAGE_SIZE static inline unsigned page_size(void)
# define PAGE_SIZE (1UL << PAGE_SHIFT) {
#endif if (!__page_size)
__page_size = sysconf(_SC_PAGESIZE);
#ifndef PAGE_MASK return __page_size;
# define PAGE_MASK (~(PAGE_SIZE - 1)) }
#endif
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_PFN(addr) ((addr) / PAGE_SIZE)
#define page_size() sysconf(_SC_PAGESIZE)
#else /* CR_NOGLIBC */ #else /* CR_NOGLIBC */
......
...@@ -4,26 +4,36 @@ ...@@ -4,26 +4,36 @@
#define ARCH_HAS_LONG_PAGES #define ARCH_HAS_LONG_PAGES
#ifndef CR_NOGLIBC #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. * Don't add ifdefs for PAGE_SIZE: if any header defines it as a constant
* See kernel file arch/powerpc/configs/pseries_*defconfig * 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_SIZE page_size()
# define PAGE_SHIFT 16 #define PAGE_MASK (~(PAGE_SIZE - 1))
#endif #define PAGE_SHIFT page_shift()
#ifndef PAGE_SIZE
# define PAGE_SIZE (1UL << PAGE_SHIFT)
#endif
#ifndef PAGE_MASK
# define PAGE_MASK (~(PAGE_SIZE - 1))
#endif
#define PAGE_PFN(addr) ((addr) / PAGE_SIZE) #define PAGE_PFN(addr) ((addr) / PAGE_SIZE)
#define page_size() sysconf(_SC_PAGESIZE)
#else /* CR_NOGLIBC */ #else /* CR_NOGLIBC */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment