Re: [PATCH 02/14] arm64: Handle section maps for swapper/idmap
On 2 September 2015 at 11:42, Suzuki K. Poulose wrote: > On 02/09/15 10:38, Ard Biesheuvel wrote: >> >> On 13 August 2015 at 13:33, Suzuki K. Poulose >> wrote: >>> >>> From: "Suzuki K. Poulose" >>> >>> We use section maps with 4K page size to create the >>> swapper/idmaps. So far we have used !64K or 4K checks >>> to handle the case where we use the section maps. This >>> patch adds a symbol to make it clear those cases. >>> >> >> That sentence does not make sense. > > > I agree. How about : > > "This patch adds a new symbol, 'ARM64_SWAPPER_USES_SECTION_MAPS', to > handle cases where we use section maps, instead of using the page size > symbols." > Yep, much better -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 02/14] arm64: Handle section maps for swapper/idmap
On 02/09/15 10:38, Ard Biesheuvel wrote: On 13 August 2015 at 13:33, Suzuki K. Poulose wrote: From: "Suzuki K. Poulose" We use section maps with 4K page size to create the swapper/idmaps. So far we have used !64K or 4K checks to handle the case where we use the section maps. This patch adds a symbol to make it clear those cases. That sentence does not make sense. I agree. How about : "This patch adds a new symbol, 'ARM64_SWAPPER_USES_SECTION_MAPS', to handle cases where we use section maps, instead of using the page size symbols." Suzuki -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 02/14] arm64: Handle section maps for swapper/idmap
On 13 August 2015 at 13:33, Suzuki K. Poulose wrote: > From: "Suzuki K. Poulose" > > We use section maps with 4K page size to create the > swapper/idmaps. So far we have used !64K or 4K checks > to handle the case where we use the section maps. This > patch adds a symbol to make it clear those cases. > That sentence does not make sense. > Cc: Ard Biesheuvel > Cc: Mark Rutland > Cc: Catalin Marinas > Cc: Will Deacon > Signed-off-by: Suzuki K. Poulose > --- > arch/arm64/include/asm/kernel-pgtable.h | 31 +- > arch/arm64/mm/mmu.c | 70 > ++- > 2 files changed, 51 insertions(+), 50 deletions(-) > > diff --git a/arch/arm64/include/asm/kernel-pgtable.h > b/arch/arm64/include/asm/kernel-pgtable.h > index 622929d..5876a36 100644 > --- a/arch/arm64/include/asm/kernel-pgtable.h > +++ b/arch/arm64/include/asm/kernel-pgtable.h > @@ -19,6 +19,13 @@ > #ifndef __ASM_KERNEL_PGTABLE_H > #define __ASM_KERNEL_PGTABLE_H > > +/* With 4K pages, we use section maps. */ > +#ifdef CONFIG_ARM64_4K_PAGES > +#define ARM64_SWAPPER_USES_SECTION_MAPS 1 > +#else > +#define ARM64_SWAPPER_USES_SECTION_MAPS 0 > +#endif > + > /* > * The idmap and swapper page tables need some space reserved in the kernel > * image. Both require pgd, pud (4 levels only) and pmd tables to (section) > @@ -28,26 +35,28 @@ > * could be increased on the fly if system RAM is out of reach for the > default > * VA range, so 3 pages are reserved in all cases. > */ > -#ifdef CONFIG_ARM64_64K_PAGES > -#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS) > -#else > +#if ARM64_SWAPPER_USES_SECTION_MAPS > #define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - 1) > +#else > +#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS) > #endif > > #define SWAPPER_DIR_SIZE (SWAPPER_PGTABLE_LEVELS * PAGE_SIZE) > #define IDMAP_DIR_SIZE (3 * PAGE_SIZE) > > /* Initial memory map size */ > -#ifdef CONFIG_ARM64_64K_PAGES > -#define SWAPPER_BLOCK_SHIFTPAGE_SHIFT > -#define SWAPPER_BLOCK_SIZE PAGE_SIZE > -#define SWAPPER_TABLE_SHIFTPMD_SHIFT > -#else > +#if ARM64_SWAPPER_USES_SECTION_MAPS > #define SWAPPER_BLOCK_SHIFTSECTION_SHIFT > #define SWAPPER_BLOCK_SIZE SECTION_SIZE > #define SWAPPER_TABLE_SHIFTPUD_SHIFT > +#else > +#define SWAPPER_BLOCK_SHIFTPAGE_SHIFT > +#define SWAPPER_BLOCK_SIZE PAGE_SIZE > +#define SWAPPER_TABLE_SHIFTPMD_SHIFT > #endif > > +/* The size of the initial kernel direct mapping */ > +#define SWAPPER_INIT_MAP_SIZE (_AC(1, UL) << SWAPPER_TABLE_SHIFT) > > /* > * Initial memory map attributes. > @@ -55,10 +64,10 @@ > #define SWAPPER_PTE_FLAGS PTE_TYPE_PAGE | PTE_AF | PTE_SHARED > #define SWAPPER_PMD_FLAGS PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S > > -#ifdef CONFIG_ARM64_64K_PAGES > -#define SWAPPER_MM_MMUFLAGSPTE_ATTRINDX(MT_NORMAL) | SWAPPER_PTE_FLAGS > -#else > +#if ARM64_SWAPPER_USES_SECTION_MAPS > #define SWAPPER_MM_MMUFLAGSPMD_ATTRINDX(MT_NORMAL) | SWAPPER_PMD_FLAGS > +#else > +#define SWAPPER_MM_MMUFLAGSPTE_ATTRINDX(MT_NORMAL) | SWAPPER_PTE_FLAGS > #endif > > > diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c > index 9211b85..71230488 100644 > --- a/arch/arm64/mm/mmu.c > +++ b/arch/arm64/mm/mmu.c > @@ -32,6 +32,7 @@ > > #include > #include > +#include > #include > #include > #include > @@ -353,14 +354,11 @@ static void __init map_mem(void) > * memory addressable from the initial direct kernel mapping. > * > * The initial direct kernel mapping, located at swapper_pg_dir, gives > -* us PUD_SIZE (4K pages) or PMD_SIZE (64K pages) memory starting from > -* PHYS_OFFSET (which must be aligned to 2MB as per > -* Documentation/arm64/booting.txt). > +* us PUD_SIZE (with SECTION maps, i.e, 4K) or PMD_SIZE (without > +* SECTION maps, i.e, 64K pages) memory starting from PHYS_OFFSET > +* (which must be aligned to 2MB as per > Documentation/arm64/booting.txt). > */ > - if (IS_ENABLED(CONFIG_ARM64_64K_PAGES)) > - limit = PHYS_OFFSET + PMD_SIZE; > - else > - limit = PHYS_OFFSET + PUD_SIZE; > + limit = PHYS_OFFSET + SWAPPER_INIT_MAP_SIZE; > memblock_set_current_limit(limit); > > /* map all the memory banks */ > @@ -371,21 +369,24 @@ static void __init map_mem(void) > if (start >= end) > break; > > -#ifndef CONFIG_ARM64_64K_PAGES > - /* > -* For the first memory bank align the start address and > -* current memblock limit to prevent create_mapping() from > -* allocating pte page tables from unmapped memory. > -* When 64K pages are enabled, the pte page table for the > -* first PGDIR_SIZE is already present in swapper_pg_dir. > -*/ > - if (start < limit) > - st
[PATCH 02/14] arm64: Handle section maps for swapper/idmap
From: "Suzuki K. Poulose" We use section maps with 4K page size to create the swapper/idmaps. So far we have used !64K or 4K checks to handle the case where we use the section maps. This patch adds a symbol to make it clear those cases. Cc: Ard Biesheuvel Cc: Mark Rutland Cc: Catalin Marinas Cc: Will Deacon Signed-off-by: Suzuki K. Poulose --- arch/arm64/include/asm/kernel-pgtable.h | 31 +- arch/arm64/mm/mmu.c | 70 ++- 2 files changed, 51 insertions(+), 50 deletions(-) diff --git a/arch/arm64/include/asm/kernel-pgtable.h b/arch/arm64/include/asm/kernel-pgtable.h index 622929d..5876a36 100644 --- a/arch/arm64/include/asm/kernel-pgtable.h +++ b/arch/arm64/include/asm/kernel-pgtable.h @@ -19,6 +19,13 @@ #ifndef __ASM_KERNEL_PGTABLE_H #define __ASM_KERNEL_PGTABLE_H +/* With 4K pages, we use section maps. */ +#ifdef CONFIG_ARM64_4K_PAGES +#define ARM64_SWAPPER_USES_SECTION_MAPS 1 +#else +#define ARM64_SWAPPER_USES_SECTION_MAPS 0 +#endif + /* * The idmap and swapper page tables need some space reserved in the kernel * image. Both require pgd, pud (4 levels only) and pmd tables to (section) @@ -28,26 +35,28 @@ * could be increased on the fly if system RAM is out of reach for the default * VA range, so 3 pages are reserved in all cases. */ -#ifdef CONFIG_ARM64_64K_PAGES -#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS) -#else +#if ARM64_SWAPPER_USES_SECTION_MAPS #define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - 1) +#else +#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS) #endif #define SWAPPER_DIR_SIZE (SWAPPER_PGTABLE_LEVELS * PAGE_SIZE) #define IDMAP_DIR_SIZE (3 * PAGE_SIZE) /* Initial memory map size */ -#ifdef CONFIG_ARM64_64K_PAGES -#define SWAPPER_BLOCK_SHIFTPAGE_SHIFT -#define SWAPPER_BLOCK_SIZE PAGE_SIZE -#define SWAPPER_TABLE_SHIFTPMD_SHIFT -#else +#if ARM64_SWAPPER_USES_SECTION_MAPS #define SWAPPER_BLOCK_SHIFTSECTION_SHIFT #define SWAPPER_BLOCK_SIZE SECTION_SIZE #define SWAPPER_TABLE_SHIFTPUD_SHIFT +#else +#define SWAPPER_BLOCK_SHIFTPAGE_SHIFT +#define SWAPPER_BLOCK_SIZE PAGE_SIZE +#define SWAPPER_TABLE_SHIFTPMD_SHIFT #endif +/* The size of the initial kernel direct mapping */ +#define SWAPPER_INIT_MAP_SIZE (_AC(1, UL) << SWAPPER_TABLE_SHIFT) /* * Initial memory map attributes. @@ -55,10 +64,10 @@ #define SWAPPER_PTE_FLAGS PTE_TYPE_PAGE | PTE_AF | PTE_SHARED #define SWAPPER_PMD_FLAGS PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S -#ifdef CONFIG_ARM64_64K_PAGES -#define SWAPPER_MM_MMUFLAGSPTE_ATTRINDX(MT_NORMAL) | SWAPPER_PTE_FLAGS -#else +#if ARM64_SWAPPER_USES_SECTION_MAPS #define SWAPPER_MM_MMUFLAGSPMD_ATTRINDX(MT_NORMAL) | SWAPPER_PMD_FLAGS +#else +#define SWAPPER_MM_MMUFLAGSPTE_ATTRINDX(MT_NORMAL) | SWAPPER_PTE_FLAGS #endif diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 9211b85..71230488 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -353,14 +354,11 @@ static void __init map_mem(void) * memory addressable from the initial direct kernel mapping. * * The initial direct kernel mapping, located at swapper_pg_dir, gives -* us PUD_SIZE (4K pages) or PMD_SIZE (64K pages) memory starting from -* PHYS_OFFSET (which must be aligned to 2MB as per -* Documentation/arm64/booting.txt). +* us PUD_SIZE (with SECTION maps, i.e, 4K) or PMD_SIZE (without +* SECTION maps, i.e, 64K pages) memory starting from PHYS_OFFSET +* (which must be aligned to 2MB as per Documentation/arm64/booting.txt). */ - if (IS_ENABLED(CONFIG_ARM64_64K_PAGES)) - limit = PHYS_OFFSET + PMD_SIZE; - else - limit = PHYS_OFFSET + PUD_SIZE; + limit = PHYS_OFFSET + SWAPPER_INIT_MAP_SIZE; memblock_set_current_limit(limit); /* map all the memory banks */ @@ -371,21 +369,24 @@ static void __init map_mem(void) if (start >= end) break; -#ifndef CONFIG_ARM64_64K_PAGES - /* -* For the first memory bank align the start address and -* current memblock limit to prevent create_mapping() from -* allocating pte page tables from unmapped memory. -* When 64K pages are enabled, the pte page table for the -* first PGDIR_SIZE is already present in swapper_pg_dir. -*/ - if (start < limit) - start = ALIGN(start, PMD_SIZE); - if (end < limit) { - limit = end & PMD_MASK; - memblock_set_current_limit(limit); + if (ARM64_SWAPPER_USES_SECTION_MAPS) { + /* +* For the first memory bank align the start address and +