arm64: mm: fold alternatives into .init
authorMark Rutland <mark.rutland@arm.com>
Wed, 9 Dec 2015 12:44:38 +0000 (12:44 +0000)
committerWill Deacon <will.deacon@arm.com>
Thu, 10 Dec 2015 17:36:08 +0000 (17:36 +0000)
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>
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 a64340df244873e74370c5119212d34f564ba9c2..f943a848f8440c1cb3e6a0eb2204a4ff67156e9f 100644 (file)
@@ -140,9 +140,6 @@ SECTIONS
 
        PERCPU_SECTION(64)
 
-       . = ALIGN(PAGE_SIZE);
-       __init_end = .;
-
        . = ALIGN(4);
        .altinstructions : {
                __alt_instructions = .;
@@ -154,6 +151,8 @@ SECTIONS
        }
 
        . = ALIGN(PAGE_SIZE);
+       __init_end = .;
+
        _data = .;
        _sdata = .;
        RW_DATA_SECTION(64, PAGE_SIZE, THREAD_SIZE)
index 9b8cc673f43c42038512b3b8b046741ff747fe91..2ee6c208c318bbc5714fc553b7dcb0ccfd7294c4 100644 (file)
@@ -360,7 +360,6 @@ void free_initmem(void)
 {
        fixup_init();
        free_initmem_default(0);
-       free_alternatives_memory();
 }
 
 #ifdef CONFIG_BLK_DEV_INITRD