aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2017-01-28 12:00:35 -0500
committerIngo Molnar <mingo@kernel.org>2017-01-28 16:55:24 -0500
commitf9748fa045851041ba69a1d2899971746f29c9d5 (patch)
tree1694905aa72a10a3054cf2983567296c3868fd5c
parente7dbf7ad4172ef79bcfdb432f9463eda892951ca (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.h2
-rw-r--r--arch/x86/kernel/e820.c19
-rw-r--r--arch/x86/kernel/early-quirks.c2
-rw-r--r--arch/x86/kernel/setup.c4
-rw-r--r--arch/x86/platform/efi/efi.c2
-rw-r--r--arch/x86/xen/setup.c9
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
16extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, int checktype); 16extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, int checktype);
17 17
18extern void e820__print_table(char *who); 18extern void e820__print_table(char *who);
19extern int e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map); 19extern int e820__update_table(struct e820_table *table);
20extern void e820__update_table_print(void); 20extern void e820__update_table_print(void);
21 21
22extern unsigned long e820_end_of_ram_pfn(void); 22extern 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
262int __init e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map) 262static 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
371int __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
371static int __init __append_e820_table(struct e820_entry *biosmap, int nr_map) 376static 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
549void __init e820__update_table_print(void) 554void __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
558static void __init e820__update_table_firmware(void) 563static 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)
945void __init e820__finish_early_params(void) 950void __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
553static void __init intel_graphics_quirks(int num, int slot, int func) 553static 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
173int __init efi_memblock_x86_reserve_range(void) 173int __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);