[PATCHv3 10/11] arm64: Add 16K page size support
Mark Rutland
mark.rutland at arm.com
Thu Oct 15 07:06:46 PDT 2015
Hi,
> +config ARM64_16K_PAGES
> + bool "16KB"
> + help
> + The system will use 16KB pages support. AArch32 emulation
> + requires applications compiled with 16K(or multiple of 16K)
> + aligned segments.
Nit: missing space before '('
Nit: 'a multiple of'
> @@ -503,6 +517,7 @@ config XEN
> config FORCE_MAX_ZONEORDER
> int
> default "14" if (ARM64_64K_PAGES && TRANSPARENT_HUGEPAGE)
> + default "12" if (ARM64_16K_PAGES && TRANSPARENT_HUGEPAGE)
> default "11"
I'm a little lost here. How are these numbers derived?
> menuconfig ARMV8_DEPRECATED
> @@ -689,9 +704,9 @@ config COMPAT
> the user helper functions, VFP support and the ptrace interface are
> handled appropriately by the kernel.
>
> - If you also enabled CONFIG_ARM64_64K_PAGES, please be aware that you
> - will only be able to execute AArch32 binaries that were compiled with
> - 64k aligned segments.
> + If you use a page size other than 4KB(i.e, 16KB or 64KB), please be aware
Nit: missing space before '(' please.
> diff --git a/arch/arm64/include/asm/fixmap.h b/arch/arm64/include/asm/fixmap.h
> index 8b9884c..a294c70 100644
> --- a/arch/arm64/include/asm/fixmap.h
> +++ b/arch/arm64/include/asm/fixmap.h
> @@ -55,8 +55,10 @@ enum fixed_addresses {
> * Temporary boot-time mappings, used by early_ioremap(),
> * before ioremap() is functional.
> */
> -#ifdef CONFIG_ARM64_64K_PAGES
> +#if defined(CONFIG_ARM64_64K_PAGES)
> #define NR_FIX_BTMAPS 4
> +#elif defined (CONFIG_ARM64_16K_PAGES)
> +#define NR_FIX_BTMAPS 16
> #else
> #define NR_FIX_BTMAPS 64
> #endif
We could include <linux/sizes.h> and simplify this to:
#define NR_FIX_BTMAPS (SZ_256K / PAGE_SIZE)
Which works for me locally.
> diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h
> index 5eac6a2..90c7ff2 100644
> --- a/arch/arm64/include/asm/thread_info.h
> +++ b/arch/arm64/include/asm/thread_info.h
> @@ -25,6 +25,8 @@
>
> #ifdef CONFIG_ARM64_4K_PAGES
> #define THREAD_SIZE_ORDER 2
> +#elif defined(CONFIG_ARM64_16K_PAGES)
> +#define THREAD_SIZE_ORDER 0
> #endif
> #define THREAD_SIZE 16384
The above looks correct.
As an open/general question, why do both THREAD_SIZE_ORDER and
THREAD_SIZE exist? One really should be defined in terms of the other.
As far as I can tell,the only user of THREAD_SIZE_ORDER outside of arch
code is fork.c, which could calculate it as:
ilog2(DIV_ROUND_UP(THREAD_SIZE, PAGE_SIZE))
Though I suspect we can't do that in a macro here for fear of a fragile
build, so that's something for another time.
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index b6aa9e0..2ed57a8 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -624,7 +624,12 @@ ENDPROC(__secondary_switched)
> #define id_aa64mmfr0_tgran_shift ID_AA64MMFR0_TGRAN64_SHIFT
> #define id_aa64mmfr0_tgran_on ID_AA64MMFR0_TGRAN64_ON
>
> -#else
> +#elif defined(CONFIG_ARM64_16K_PAGES)
> +
> +#define id_aa64mmfr0_tgran_shift ID_AA64MMFR0_TGRAN16_SHIFT
> +#define id_aa64mmfr0_tgran_on ID_AA64MMFR0_TGRAN16_ON
> +
> +#elif defined(CONFIG_ARM64_4K_PAGES)
>
> #define id_aa64mmfr0_tgran_shift ID_AA64MMFR0_TGRAN4_SHIFT
> #define id_aa64mmfr0_tgran_on ID_AA64MMFR0_TGRAN4_ON
I assume you'll s/ON/SUPPORTED/ per comments in another thread.
Otherwise this looks fine to me.
Thanks,
Mark.
More information about the linux-arm-kernel
mailing list