History

init: allow initcall tables to be emitted using relative references

Allow the initcall tables to be emitted using relative references that are only half the size on 64-bit architectures and don't require fixups at runtime on relocatable kernels.

Ard Biesheuvel committed 8 years ago

Commit 1b1eeca1 parent 7290d584 files · +68 −41Browse files

Showing the changes to init (1 of 4 files). Show all

Unified · Split

init/main.c+16−16
@@ -902,18 +902,18 @@ int __init_or_module do_one_initcall(initcall_t fn) · 901 unmodified lines
902902 }
903903
904904
905−extern initcall_t __initcall_start[];
906−extern initcall_t __initcall0_start[];
907−extern initcall_t __initcall1_start[];
908−extern initcall_t __initcall2_start[];
909−extern initcall_t __initcall3_start[];
910−extern initcall_t __initcall4_start[];
911−extern initcall_t __initcall5_start[];
912−extern initcall_t __initcall6_start[];
913−extern initcall_t __initcall7_start[];
914−extern initcall_t __initcall_end[];
915−
916−static initcall_t *initcall_levels[] __initdata = {
905+extern initcall_entry_t __initcall_start[];
906+extern initcall_entry_t __initcall0_start[];
907+extern initcall_entry_t __initcall1_start[];
908+extern initcall_entry_t __initcall2_start[];
909+extern initcall_entry_t __initcall3_start[];
910+extern initcall_entry_t __initcall4_start[];
911+extern initcall_entry_t __initcall5_start[];
912+extern initcall_entry_t __initcall6_start[];
913+extern initcall_entry_t __initcall7_start[];
914+extern initcall_entry_t __initcall_end[];
915+
916+static initcall_entry_t *initcall_levels[] __initdata = {
917917 __initcall0_start,
918918 __initcall1_start,
919919 __initcall2_start,
@@ -939,7 +939,7 @@ static char *initcall_level_names[] __initdata = { · 19 unmodified lines
939939
940940 static void __init do_initcall_level(int level)
941941 {
942− initcall_t *fn;
942+ initcall_entry_t *fn;
943943
944944 strcpy(initcall_command_line, saved_command_line);
945945 parse_args(initcall_level_names[level],
@@ -950,7 +950,7 @@ static void __init do_initcall_level(int level) · 4 unmodified lines
950950
951951 trace_initcall_level(initcall_level_names[level]);
952952 for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
953− do_one_initcall(*fn);
953+ do_one_initcall(initcall_from_entry(fn));
954954 }
955955
956956 static void __init do_initcalls(void)
@@ -981,11 +981,11 @@ static void __init do_basic_setup(void) · 24 unmodified lines
981981
982982 static void __init do_pre_smp_initcalls(void)
983983 {
984− initcall_t *fn;
984+ initcall_entry_t *fn;
985985
986986 trace_initcall_level("early");
987987 for (fn = __initcall_start; fn < __initcall0_start; fn++)
988− do_one_initcall(*fn);
988+ do_one_initcall(initcall_from_entry(fn));
989989 }
990990
991991 /*