mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-04 00:05:26 +00:00
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>
This commit is contained in:
committed by
Andrei Vagin
parent
bbe7721075
commit
2d965008d3
@@ -21,6 +21,9 @@
|
||||
#include "restorer.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
|
||||
|
||||
int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpsimd)
|
||||
|
@@ -23,6 +23,9 @@
|
||||
#include "images/core.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)
|
||||
{
|
||||
UserPpc64FpstateEntry *fpe;
|
||||
|
@@ -4,22 +4,36 @@
|
||||
#define ARCH_HAS_LONG_PAGES
|
||||
|
||||
#ifndef CR_NOGLIBC
|
||||
#include <unistd.h>
|
||||
#include <string.h> /* ffsl() */
|
||||
#include <unistd.h> /* _SC_PAGESIZE */
|
||||
|
||||
#ifndef PAGE_SHIFT
|
||||
# define PAGE_SHIFT 12
|
||||
#endif
|
||||
extern unsigned __page_size;
|
||||
extern unsigned __page_shift;
|
||||
|
||||
#ifndef PAGE_SIZE
|
||||
# define PAGE_SIZE (1UL << PAGE_SHIFT)
|
||||
#endif
|
||||
static inline unsigned page_size(void)
|
||||
{
|
||||
if (!__page_size)
|
||||
__page_size = sysconf(_SC_PAGESIZE);
|
||||
return __page_size;
|
||||
}
|
||||
|
||||
#ifndef PAGE_MASK
|
||||
# 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_size() sysconf(_SC_PAGESIZE)
|
||||
|
||||
#else /* CR_NOGLIBC */
|
||||
|
||||
|
@@ -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 */
|
||||
|
||||
|
Reference in New Issue
Block a user