diff options
author | Alexander Kuleshov <kuleshovmail@gmail.com> | 2016-01-30 03:01:12 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-01-30 03:20:55 -0500 |
commit | 5e9ebbd87a99ecc6abb74325b0ac63c46891f6f3 (patch) | |
tree | e34b02c5146bcd897c46a9044f8679a22d6afda3 | |
parent | 26cd83670f2f5a3d5b5514a1f7d96567cdb9558b (diff) |
x86/boot: Micro-optimize reset_early_page_tables()
Save 25 bytes of code and make the bootup a tiny bit faster:
text data bss dec filename
9735144 4970776 15474688 30180608 vmlinux.old
9735119 4970776 15474688 30180583 vmlinux
Signed-off-by: Alexander Kuleshov <kuleshovmail@gmail.com>
Cc: Alexander Popov <alpopov@ptsecurity.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1454140872-16926-1-git-send-email-kuleshovmail@gmail.com
[ Fixed various small details. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/kernel/head64.c | 14 |
1 files changed, 3 insertions, 11 deletions
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index f129a9af6357..35843caa4ea7 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c | |||
@@ -40,13 +40,8 @@ pmdval_t early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX); | |||
40 | /* Wipe all early page tables except for the kernel symbol map */ | 40 | /* Wipe all early page tables except for the kernel symbol map */ |
41 | static void __init reset_early_page_tables(void) | 41 | static void __init reset_early_page_tables(void) |
42 | { | 42 | { |
43 | unsigned long i; | 43 | memset(early_level4_pgt, 0, sizeof(pgd_t)*(PTRS_PER_PGD-1)); |
44 | |||
45 | for (i = 0; i < PTRS_PER_PGD-1; i++) | ||
46 | early_level4_pgt[i].pgd = 0; | ||
47 | |||
48 | next_early_pgt = 0; | 44 | next_early_pgt = 0; |
49 | |||
50 | write_cr3(__pa_nodebug(early_level4_pgt)); | 45 | write_cr3(__pa_nodebug(early_level4_pgt)); |
51 | } | 46 | } |
52 | 47 | ||
@@ -54,7 +49,6 @@ static void __init reset_early_page_tables(void) | |||
54 | int __init early_make_pgtable(unsigned long address) | 49 | int __init early_make_pgtable(unsigned long address) |
55 | { | 50 | { |
56 | unsigned long physaddr = address - __PAGE_OFFSET; | 51 | unsigned long physaddr = address - __PAGE_OFFSET; |
57 | unsigned long i; | ||
58 | pgdval_t pgd, *pgd_p; | 52 | pgdval_t pgd, *pgd_p; |
59 | pudval_t pud, *pud_p; | 53 | pudval_t pud, *pud_p; |
60 | pmdval_t pmd, *pmd_p; | 54 | pmdval_t pmd, *pmd_p; |
@@ -81,8 +75,7 @@ again: | |||
81 | } | 75 | } |
82 | 76 | ||
83 | pud_p = (pudval_t *)early_dynamic_pgts[next_early_pgt++]; | 77 | pud_p = (pudval_t *)early_dynamic_pgts[next_early_pgt++]; |
84 | for (i = 0; i < PTRS_PER_PUD; i++) | 78 | memset(pud_p, 0, sizeof(pud_p) * PTRS_PER_PUD); |
85 | pud_p[i] = 0; | ||
86 | *pgd_p = (pgdval_t)pud_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; | 79 | *pgd_p = (pgdval_t)pud_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; |
87 | } | 80 | } |
88 | pud_p += pud_index(address); | 81 | pud_p += pud_index(address); |
@@ -97,8 +90,7 @@ again: | |||
97 | } | 90 | } |
98 | 91 | ||
99 | pmd_p = (pmdval_t *)early_dynamic_pgts[next_early_pgt++]; | 92 | pmd_p = (pmdval_t *)early_dynamic_pgts[next_early_pgt++]; |
100 | for (i = 0; i < PTRS_PER_PMD; i++) | 93 | memset(pmd_p, 0, sizeof(pmd_p) * PTRS_PER_PMD); |
101 | pmd_p[i] = 0; | ||
102 | *pud_p = (pudval_t)pmd_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; | 94 | *pud_p = (pudval_t)pmd_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; |
103 | } | 95 | } |
104 | pmd = (physaddr & PMD_MASK) + early_pmd_flags; | 96 | pmd = (physaddr & PMD_MASK) + early_pmd_flags; |