Re: [PATCH 3/8] arm: mm: reduce fixmap kmap from 32 to 16 CPUS

Rob Herring
2014-08-07T22:19:10Z

On Thu, Aug 7, 2014 at 10:01 AM, Kees Cook <keescook@chromium.org> wrote:
> More room is needed in the fixmap range for non-kmap fixmap entries. This
> reduces the kmap range from 32 to 16 CPUs.

Do you want this merged or just doing this to get the rest of your
series working? I'll post my patch for making the fixmap region 3MB
(it adds back the first 1MB of the top pmd).

> Additionally, add PTE entry for
> fixmap regardless of CONFIG_HIGHMEM.

"Additionally" is a good flag for this patch should be split-up. It
seems like we would want to apply this part to stable.

Rob

>
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---
> arch/arm/include/asm/fixmap.h | 12 ++++++++++--
> arch/arm/mm/highmem.c | 2 --
> arch/arm/mm/mm.h | 3 +++
> arch/arm/mm/mmu.c | 5 ++++-
> 4 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm/include/asm/fixmap.h b/arch/arm/include/asm/fixmap.h
> index 8ee7cb4f62ca..3ed08232be55 100644
> --- a/arch/arm/include/asm/fixmap.h
> +++ b/arch/arm/include/asm/fixmap.h
> @@ -1,16 +1,24 @@
> #ifndef _ASM_FIXMAP_H
> #define _ASM_FIXMAP_H
>
> +/*
> + * The fixmap uses 2MB. The KMAP fixmap needs 64k per CPU, so make room for
> + * 16 CPUs (taking 1MB) and leave the rest for additional fixmap areas.
> + */
> #define FIXADDR_START 0xffc00000UL
> #define FIXADDR_END 0xffe00000UL
> #define FIXADDR_TOP (FIXADDR_END - PAGE_SIZE)
> #define FIXADDR_SIZE (FIXADDR_END - FIXADDR_START)
>
> -#define FIX_KMAP_NR_PTES (FIXADDR_SIZE >> PAGE_SHIFT)
> +/* 16 PTEs per CPU (64k of 4k pages). */
> +#define FIX_KMAP_NR_PTES 16
> +#define FIX_KMAP_NR_CPUS 16
>
> enum fixed_addresses {
> + /* Support 16 CPUs for kmap as the first region of fixmap entries. */
> FIX_KMAP_BEGIN,
> - FIX_KMAP_END = FIX_KMAP_NR_PTES - 1,
> + FIX_KMAP_END = (FIX_KMAP_NR_PTES * FIX_KMAP_NR_CPUS) - 1,
> +
> __end_of_fixed_addresses
> };
>
> diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c
> index a1241ee8425e..adf264fb700b 100644
> --- a/arch/arm/mm/highmem.c
> +++ b/arch/arm/mm/highmem.c
> @@ -18,8 +18,6 @@
> #include <asm/tlbflush.h>
> #include "mm.h"
>
> -pte_t *fixmap_page_table;
> -
> static inline void set_fixmap_pte(int idx, pte_t pte)
> {
> unsigned long vaddr = __fix_to_virt(idx);
> diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h
> index ce727d47275c..c8b5b2d05b55 100644
> --- a/arch/arm/mm/mm.h
> +++ b/arch/arm/mm/mm.h
> @@ -7,6 +7,9 @@
> /* the upper-most page table pointer */
> extern pmd_t *top_pmd;
>
> +/* The fixmap PTE. */
> +extern pte_t *fixmap_page_table;
> +
> /*
> * 0xffff8000 to 0xffffffff is reserved for any ARM architecture
> * specific hacks for copying pages efficiently, while 0xffff4000
> diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> index e881ed817a8b..a7a756603775 100644
> --- a/arch/arm/mm/mmu.c
> +++ b/arch/arm/mm/mmu.c
> @@ -53,6 +53,9 @@ EXPORT_SYMBOL(empty_zero_page);
> */
> pmd_t *top_pmd;
>
> +/* The fixmap PTE. */
> +pte_t *fixmap_page_table;
> +
> #define CPOLICY_UNCACHED 0
> #define CPOLICY_BUFFERED 1
> #define CPOLICY_WRITETHROUGH 2
> @@ -1342,10 +1345,10 @@ static void __init kmap_init(void)
> #ifdef CONFIG_HIGHMEM
> pkmap_page_table = early_pte_alloc(pmd_off_k(PKMAP_BASE),
> PKMAP_BASE, _PAGE_KERNEL_TABLE);
> +#endif
>
> fixmap_page_table = early_pte_alloc(pmd_off_k(FIXADDR_START),
> FIXADDR_START, _PAGE_KERNEL_TABLE);
> -#endif
> }
>
> static void __init map_lowmem(void)
> --
> 1.9.1
>