diff options
author | Ingo Molnar <mingo@kernel.org> | 2017-01-28 12:00:35 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-01-28 16:55:24 -0500 |
commit | f9748fa045851041ba69a1d2899971746f29c9d5 (patch) | |
tree | 1694905aa72a10a3054cf2983567296c3868fd5c | |
parent | e7dbf7ad4172ef79bcfdb432f9463eda892951ca (diff) |
x86/boot/e820: Simplify the e820__update_table() interface
The e820__update_table() parameters are pretty complex:
arch/x86/include/asm/e820/api.h:extern int e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map);
But 90% of the usage is trivial:
arch/x86/kernel/e820.c: if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries))
arch/x86/kernel/e820.c: e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
arch/x86/kernel/e820.c: e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
arch/x86/kernel/e820.c: if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries) < 0)
arch/x86/kernel/e820.c: e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr);
arch/x86/kernel/early-quirks.c: e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
arch/x86/kernel/setup.c: e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
arch/x86/kernel/setup.c: e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
arch/x86/platform/efi/efi.c: e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
arch/x86/xen/setup.c: e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries),
arch/x86/xen/setup.c: e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
arch/x86/xen/setup.c: e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries),
as it only uses an exiting struct e820_table's entries array, its size and
its current number of entries as input and output arguments.
Only one use is non-trivial:
arch/x86/kernel/e820.c: e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr);
... which call updates the E820 table in the zeropage in-situ, and the layout there does not
match that of 'struct e820_table' (in particular nr_entries is at a different offset,
hardcoded by the boot protocol).
Simplify all this by introducing a low level __e820__update_table() API that
the zeropage update call can use, and simplifying the main e820__update_table()
call signature down to:
int e820__update_table(struct e820_table *table);
This visibly simplifies all the call sites:
arch/x86/include/asm/e820/api.h:extern int e820__update_table(struct e820_table *table);
arch/x86/include/asm/e820/types.h: * call to e820__update_table() to remove duplicates. The allowance
arch/x86/kernel/e820.c: * The return value from e820__update_table() is zero if it
arch/x86/kernel/e820.c:int __init e820__update_table(struct e820_table *table)
arch/x86/kernel/e820.c: if (e820__update_table(e820_table))
arch/x86/kernel/e820.c: e820__update_table(e820_table_firmware);
arch/x86/kernel/e820.c: e820__update_table(e820_table);
arch/x86/kernel/e820.c: e820__update_table(e820_table);
arch/x86/kernel/e820.c: if (e820__update_table(e820_table) < 0)
arch/x86/kernel/early-quirks.c: e820__update_table(e820_table);
arch/x86/kernel/setup.c: e820__update_table(e820_table);
arch/x86/kernel/setup.c: e820__update_table(e820_table);
arch/x86/platform/efi/efi.c: e820__update_table(e820_table);
arch/x86/xen/setup.c: e820__update_table(&xen_e820_table);
arch/x86/xen/setup.c: e820__update_table(e820_table);
arch/x86/xen/setup.c: e820__update_table(&xen_e820_table);
No change in functionality.
Cc: Alex Thorlton <athorlton@sgi.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Huang, Ying <ying.huang@intel.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul Jackson <pj@sgi.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Tejun Heo <tj@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Wei Yang <richard.weiyang@gmail.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/include/asm/e820/api.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/e820.c | 19 | ||||
-rw-r--r-- | arch/x86/kernel/early-quirks.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 4 | ||||
-rw-r--r-- | arch/x86/platform/efi/efi.c | 2 | ||||
-rw-r--r-- | arch/x86/xen/setup.c | 9 |
6 files changed, 21 insertions, 17 deletions
diff --git a/arch/x86/include/asm/e820/api.h b/arch/x86/include/asm/e820/api.h index 4c35c36c62d5..7d5dfc2f9e91 100644 --- a/arch/x86/include/asm/e820/api.h +++ b/arch/x86/include/asm/e820/api.h | |||
@@ -16,7 +16,7 @@ extern u64 e820__range_update(u64 start, u64 size, enum e820_type old_type, enu | |||
16 | extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, int checktype); | 16 | extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, int checktype); |
17 | 17 | ||
18 | extern void e820__print_table(char *who); | 18 | extern void e820__print_table(char *who); |
19 | extern int e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map); | 19 | extern int e820__update_table(struct e820_table *table); |
20 | extern void e820__update_table_print(void); | 20 | extern void e820__update_table_print(void); |
21 | 21 | ||
22 | extern unsigned long e820_end_of_ram_pfn(void); | 22 | extern unsigned long e820_end_of_ram_pfn(void); |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index da69addf6c34..49823e0a7aea 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
@@ -259,7 +259,7 @@ static int __init cpcompare(const void *a, const void *b) | |||
259 | return (ap->addr != ap->pbios->addr) - (bp->addr != bp->pbios->addr); | 259 | return (ap->addr != ap->pbios->addr) - (bp->addr != bp->pbios->addr); |
260 | } | 260 | } |
261 | 261 | ||
262 | int __init e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map) | 262 | static int __init __e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map) |
263 | { | 263 | { |
264 | static struct change_member change_point_list[2*E820_MAX_ENTRIES] __initdata; | 264 | static struct change_member change_point_list[2*E820_MAX_ENTRIES] __initdata; |
265 | static struct change_member *change_point[2*E820_MAX_ENTRIES] __initdata; | 265 | static struct change_member *change_point[2*E820_MAX_ENTRIES] __initdata; |
@@ -368,6 +368,11 @@ int __init e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *p | |||
368 | return 0; | 368 | return 0; |
369 | } | 369 | } |
370 | 370 | ||
371 | int __init e820__update_table(struct e820_table *table) | ||
372 | { | ||
373 | return __e820__update_table(table->entries, ARRAY_SIZE(table->entries), &table->nr_entries); | ||
374 | } | ||
375 | |||
371 | static int __init __append_e820_table(struct e820_entry *biosmap, int nr_map) | 376 | static int __init __append_e820_table(struct e820_entry *biosmap, int nr_map) |
372 | { | 377 | { |
373 | while (nr_map) { | 378 | while (nr_map) { |
@@ -548,7 +553,7 @@ u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, int | |||
548 | 553 | ||
549 | void __init e820__update_table_print(void) | 554 | void __init e820__update_table_print(void) |
550 | { | 555 | { |
551 | if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries)) | 556 | if (e820__update_table(e820_table)) |
552 | return; | 557 | return; |
553 | 558 | ||
554 | pr_info("e820: modified physical RAM map:\n"); | 559 | pr_info("e820: modified physical RAM map:\n"); |
@@ -557,7 +562,7 @@ void __init e820__update_table_print(void) | |||
557 | 562 | ||
558 | static void __init e820__update_table_firmware(void) | 563 | static void __init e820__update_table_firmware(void) |
559 | { | 564 | { |
560 | e820__update_table(e820_table_firmware->entries, ARRAY_SIZE(e820_table_firmware->entries), &e820_table_firmware->nr_entries); | 565 | e820__update_table(e820_table_firmware); |
561 | } | 566 | } |
562 | 567 | ||
563 | #define MAX_GAP_END 0x100000000ull | 568 | #define MAX_GAP_END 0x100000000ull |
@@ -676,7 +681,7 @@ void __init e820__memory_setup_extended(u64 phys_addr, u32 data_len) | |||
676 | extmap = (struct e820_entry *)(sdata->data); | 681 | extmap = (struct e820_entry *)(sdata->data); |
677 | 682 | ||
678 | __append_e820_table(extmap, entries); | 683 | __append_e820_table(extmap, entries); |
679 | e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); | 684 | e820__update_table(e820_table); |
680 | 685 | ||
681 | early_memunmap(sdata, data_len); | 686 | early_memunmap(sdata, data_len); |
682 | pr_info("e820: extended physical RAM map:\n"); | 687 | pr_info("e820: extended physical RAM map:\n"); |
@@ -931,7 +936,7 @@ void __init e820_reserve_setup_data(void) | |||
931 | early_memunmap(data, sizeof(*data)); | 936 | early_memunmap(data, sizeof(*data)); |
932 | } | 937 | } |
933 | 938 | ||
934 | e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); | 939 | e820__update_table(e820_table); |
935 | memcpy(e820_table_firmware, e820_table, sizeof(*e820_table_firmware)); | 940 | memcpy(e820_table_firmware, e820_table, sizeof(*e820_table_firmware)); |
936 | printk(KERN_INFO "extended physical RAM map:\n"); | 941 | printk(KERN_INFO "extended physical RAM map:\n"); |
937 | e820__print_table("reserve setup_data"); | 942 | e820__print_table("reserve setup_data"); |
@@ -945,7 +950,7 @@ void __init e820_reserve_setup_data(void) | |||
945 | void __init e820__finish_early_params(void) | 950 | void __init e820__finish_early_params(void) |
946 | { | 951 | { |
947 | if (userdef) { | 952 | if (userdef) { |
948 | if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries) < 0) | 953 | if (e820__update_table(e820_table) < 0) |
949 | early_panic("Invalid user supplied memory map"); | 954 | early_panic("Invalid user supplied memory map"); |
950 | 955 | ||
951 | pr_info("e820: user-defined physical RAM map:\n"); | 956 | pr_info("e820: user-defined physical RAM map:\n"); |
@@ -1132,7 +1137,7 @@ char *__init e820__memory_setup_default(void) | |||
1132 | * the next section from 1mb->appropriate_mem_k | 1137 | * the next section from 1mb->appropriate_mem_k |
1133 | */ | 1138 | */ |
1134 | new_nr = boot_params.e820_entries; | 1139 | new_nr = boot_params.e820_entries; |
1135 | e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr); | 1140 | __e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr); |
1136 | boot_params.e820_entries = new_nr; | 1141 | boot_params.e820_entries = new_nr; |
1137 | 1142 | ||
1138 | if (append_e820_table(boot_params.e820_table, boot_params.e820_entries) < 0) { | 1143 | if (append_e820_table(boot_params.e820_table, boot_params.e820_entries) < 0) { |
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 2220a4c03adf..ff7e4b3988ed 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c | |||
@@ -547,7 +547,7 @@ intel_graphics_stolen(int num, int slot, int func, | |||
547 | 547 | ||
548 | /* Mark this space as reserved */ | 548 | /* Mark this space as reserved */ |
549 | e820__range_add(base, size, E820_TYPE_RESERVED); | 549 | e820__range_add(base, size, E820_TYPE_RESERVED); |
550 | e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); | 550 | e820__update_table(e820_table); |
551 | } | 551 | } |
552 | 552 | ||
553 | static void __init intel_graphics_quirks(int num, int slot, int func) | 553 | static void __init intel_graphics_quirks(int num, int slot, int func) |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 074c86a0ee86..acb2db02ec81 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -740,7 +740,7 @@ static void __init trim_bios_range(void) | |||
740 | */ | 740 | */ |
741 | e820__range_remove(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_TYPE_RAM, 1); | 741 | e820__range_remove(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_TYPE_RAM, 1); |
742 | 742 | ||
743 | e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); | 743 | e820__update_table(e820_table); |
744 | } | 744 | } |
745 | 745 | ||
746 | /* called before trim_bios_range() to spare extra sanitize */ | 746 | /* called before trim_bios_range() to spare extra sanitize */ |
@@ -1033,7 +1033,7 @@ void __init setup_arch(char **cmdline_p) | |||
1033 | if (ppro_with_ram_bug()) { | 1033 | if (ppro_with_ram_bug()) { |
1034 | e820__range_update(0x70000000ULL, 0x40000ULL, E820_TYPE_RAM, | 1034 | e820__range_update(0x70000000ULL, 0x40000ULL, E820_TYPE_RAM, |
1035 | E820_TYPE_RESERVED); | 1035 | E820_TYPE_RESERVED); |
1036 | e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); | 1036 | e820__update_table(e820_table); |
1037 | printk(KERN_INFO "fixed physical RAM map:\n"); | 1037 | printk(KERN_INFO "fixed physical RAM map:\n"); |
1038 | e820__print_table("bad_ppro"); | 1038 | e820__print_table("bad_ppro"); |
1039 | } | 1039 | } |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 14d0a6b1eee1..2f7f7605fee0 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
@@ -167,7 +167,7 @@ static void __init do_add_efi_memmap(void) | |||
167 | } | 167 | } |
168 | e820__range_add(start, size, e820_type); | 168 | e820__range_add(start, size, e820_type); |
169 | } | 169 | } |
170 | e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); | 170 | e820__update_table(e820_table); |
171 | } | 171 | } |
172 | 172 | ||
173 | int __init efi_memblock_x86_reserve_range(void) | 173 | int __init efi_memblock_x86_reserve_range(void) |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index cf29abfc392c..a5bf7c451435 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -782,7 +782,7 @@ char * __init xen_memory_setup(void) | |||
782 | xen_ignore_unusable(); | 782 | xen_ignore_unusable(); |
783 | 783 | ||
784 | /* Make sure the Xen-supplied memory map is well-ordered. */ | 784 | /* Make sure the Xen-supplied memory map is well-ordered. */ |
785 | e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries), &xen_e820_table.nr_entries); | 785 | e820__update_table(&xen_e820_table); |
786 | 786 | ||
787 | max_pages = xen_get_max_pages(); | 787 | max_pages = xen_get_max_pages(); |
788 | 788 | ||
@@ -856,10 +856,9 @@ char * __init xen_memory_setup(void) | |||
856 | * reserve ISA memory anyway because too many things poke | 856 | * reserve ISA memory anyway because too many things poke |
857 | * about in there. | 857 | * about in there. |
858 | */ | 858 | */ |
859 | e820__range_add(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, | 859 | e820__range_add(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, E820_TYPE_RESERVED); |
860 | E820_TYPE_RESERVED); | ||
861 | 860 | ||
862 | e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); | 861 | e820__update_table(e820_table); |
863 | 862 | ||
864 | /* | 863 | /* |
865 | * Check whether the kernel itself conflicts with the target E820 map. | 864 | * Check whether the kernel itself conflicts with the target E820 map. |
@@ -930,7 +929,7 @@ char * __init xen_auto_xlated_memory_setup(void) | |||
930 | 929 | ||
931 | xen_e820_table.nr_entries = memmap.nr_entries; | 930 | xen_e820_table.nr_entries = memmap.nr_entries; |
932 | 931 | ||
933 | e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries), &xen_e820_table.nr_entries); | 932 | e820__update_table(&xen_e820_table); |
934 | 933 | ||
935 | for (i = 0; i < xen_e820_table.nr_entries; i++) | 934 | for (i = 0; i < xen_e820_table.nr_entries; i++) |
936 | e820__range_add(xen_e820_table.entries[i].addr, xen_e820_table.entries[i].size, xen_e820_table.entries[i].type); | 935 | e820__range_add(xen_e820_table.entries[i].addr, xen_e820_table.entries[i].size, xen_e820_table.entries[i].type); |