arm64: mm: fold alternatives into .init
authorMark Rutland <mark.rutland@arm.com>
Wed, 9 Dec 2015 12:44:38 +0000 (12:44 +0000)
committerAlex Shi <alex.shi@linaro.org>
Thu, 20 Oct 2016 08:23:44 +0000 (16:23 +0800)
Currently we treat the alternatives separately from other data that's
only used during initialisation, using separate .altinstructions and
.altinstr_replacement linker sections. These are freed for general
allocation separately from .init*. This is problematic as:

* We do not remove execute permissions, as we do for .init, leaving the
  memory executable.

* We pad between them, making the kernel Image bianry up to PAGE_SIZE
  bytes larger than necessary.

This patch moves the two sections into the contiguous region used for
.init*. This saves some memory, ensures that we remove execute
permissions, and allows us to remove some code made redundant by this
reorganisation.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Andre Przywara <andre.przywara@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Jeremy Linton <jeremy.linton@arm.com>
Cc: Laura Abbott <labbott@fedoraproject.org>
Cc: Will Deacon <will.deacon@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
(cherry picked from commit 9aa4ec1571da62366cfddc20f3b923609604fe63)
Signed-off-by: Alex Shi <alex.shi@linaro.org>
arch/arm64/include/asm/alternative.h
arch/arm64/kernel/alternative.c
arch/arm64/kernel/vmlinux.lds.S
arch/arm64/mm/init.c

index d56ec07151570e6e498e9bf35b2fd9ccaed335fe..e4962f04201e295d933d33f7f39745a5f5e65f65 100644 (file)
@@ -19,7 +19,6 @@ struct alt_instr {
 
 void __init apply_alternatives_all(void);
 void apply_alternatives(void *start, size_t length);
-void free_alternatives_memory(void);
 
 #define ALTINSTR_ENTRY(feature)                                                      \
        " .word 661b - .\n"                             /* label           */ \
index ab9db0e9818c0caa52aa040b7c01aa83183d774e..d2ee1b21a10ddd1bcce1718210c6ce7b7725cfe3 100644 (file)
@@ -158,9 +158,3 @@ void apply_alternatives(void *start, size_t length)
 
        __apply_alternatives(&region);
 }
-
-void free_alternatives_memory(void)
-{
-       free_reserved_area(__alt_instructions, __alt_instructions_end,
-                          0, "alternatives");
-}
index 2fb8560724a4ca7cb8313ab2543f1cd5528c4607..f04c4762977bd99141a01bbaf50f52855572da06 100644 (file)
@@ -145,9 +145,6 @@ SECTIONS
 
        PERCPU_SECTION(L1_CACHE_BYTES)
 
-       . = ALIGN(PAGE_SIZE);
-       __init_end = .;
-
        . = ALIGN(4);
        .altinstructions : {
                __alt_instructions = .;
@@ -159,6 +156,8 @@ SECTIONS
        }
 
        . = ALIGN(PAGE_SIZE);
+       __init_end = .;
+
        _data = .;
        _sdata = .;
        RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
index 4cb98aa8c27b2e89fd32783d45f283e8a152d80e..b37e2590d690ec5fee45cd8663cac5a84e84ae96 100644 (file)
@@ -360,7 +360,6 @@ void free_initmem(void)
 {
        fixup_init();
        free_initmem_default(0);
-       free_alternatives_memory();
 }
 
 #ifdef CONFIG_BLK_DEV_INITRD