From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752682AbdA1WsI (ORCPT ); Sat, 28 Jan 2017 17:48:08 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34017 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751846AbdA1Wrs (ORCPT ); Sat, 28 Jan 2017 17:47:48 -0500 From: Ingo Molnar To: linux-kernel@vger.kernel.org Cc: Andrew Morton , Andy Lutomirski , Borislav Petkov , "H . Peter Anvin" , Linus Torvalds , Peter Zijlstra , Thomas Gleixner , Yinghai Lu Subject: [PATCH 43/50] x86/boot/e820: Simplify the e820__update_table() interface Date: Sat, 28 Jan 2017 23:12:04 +0100 Message-Id: <1485641531-22124-44-git-send-email-mingo@kernel.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1485641531-22124-1-git-send-email-mingo@kernel.org> References: <1485641531-22124-1-git-send-email-mingo@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Brian Gerst Cc: Dan Williams Cc: Denys Vlasenko Cc: H. Peter Anvin Cc: Huang, Ying Cc: Josh Poimboeuf Cc: Juergen Gross Cc: Linus Torvalds Cc: Paul Jackson Cc: Peter Zijlstra Cc: Rafael J. Wysocki Cc: Tejun Heo Cc: Thomas Gleixner Cc: Wei Yang Cc: Yinghai Lu Cc: linux-kernel@vger.kernel.org Signed-off-by: Ingo Molnar --- arch/x86/include/asm/e820/api.h | 2 +- arch/x86/kernel/e820.c | 19 ++++++++++++------- arch/x86/kernel/early-quirks.c | 2 +- arch/x86/kernel/setup.c | 4 ++-- arch/x86/platform/efi/efi.c | 2 +- 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 extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, int checktype); extern void e820__print_table(char *who); -extern int e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map); +extern int e820__update_table(struct e820_table *table); extern void e820__update_table_print(void); 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) return (ap->addr != ap->pbios->addr) - (bp->addr != bp->pbios->addr); } -int __init e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map) +static int __init __e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map) { static struct change_member change_point_list[2*E820_MAX_ENTRIES] __initdata; 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 return 0; } +int __init e820__update_table(struct e820_table *table) +{ + return __e820__update_table(table->entries, ARRAY_SIZE(table->entries), &table->nr_entries); +} + static int __init __append_e820_table(struct e820_entry *biosmap, int nr_map) { while (nr_map) { @@ -548,7 +553,7 @@ u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, int void __init e820__update_table_print(void) { - if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries)) + if (e820__update_table(e820_table)) return; pr_info("e820: modified physical RAM map:\n"); @@ -557,7 +562,7 @@ void __init e820__update_table_print(void) static void __init e820__update_table_firmware(void) { - e820__update_table(e820_table_firmware->entries, ARRAY_SIZE(e820_table_firmware->entries), &e820_table_firmware->nr_entries); + e820__update_table(e820_table_firmware); } #define MAX_GAP_END 0x100000000ull @@ -676,7 +681,7 @@ void __init e820__memory_setup_extended(u64 phys_addr, u32 data_len) extmap = (struct e820_entry *)(sdata->data); __append_e820_table(extmap, entries); - e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); + e820__update_table(e820_table); early_memunmap(sdata, data_len); pr_info("e820: extended physical RAM map:\n"); @@ -931,7 +936,7 @@ void __init e820_reserve_setup_data(void) early_memunmap(data, sizeof(*data)); } - e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); + e820__update_table(e820_table); memcpy(e820_table_firmware, e820_table, sizeof(*e820_table_firmware)); printk(KERN_INFO "extended physical RAM map:\n"); e820__print_table("reserve setup_data"); @@ -945,7 +950,7 @@ void __init e820_reserve_setup_data(void) void __init e820__finish_early_params(void) { if (userdef) { - if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries) < 0) + if (e820__update_table(e820_table) < 0) early_panic("Invalid user supplied memory map"); pr_info("e820: user-defined physical RAM map:\n"); @@ -1132,7 +1137,7 @@ char *__init e820__memory_setup_default(void) * the next section from 1mb->appropriate_mem_k */ new_nr = boot_params.e820_entries; - e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr); + __e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr); boot_params.e820_entries = new_nr; 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, /* Mark this space as reserved */ e820__range_add(base, size, E820_TYPE_RESERVED); - e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); + e820__update_table(e820_table); } 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) */ e820__range_remove(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_TYPE_RAM, 1); - e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); + e820__update_table(e820_table); } /* called before trim_bios_range() to spare extra sanitize */ @@ -1033,7 +1033,7 @@ void __init setup_arch(char **cmdline_p) if (ppro_with_ram_bug()) { e820__range_update(0x70000000ULL, 0x40000ULL, E820_TYPE_RAM, E820_TYPE_RESERVED); - e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); + e820__update_table(e820_table); printk(KERN_INFO "fixed physical RAM map:\n"); e820__print_table("bad_ppro"); } 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) } e820__range_add(start, size, e820_type); } - e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); + e820__update_table(e820_table); } 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) xen_ignore_unusable(); /* Make sure the Xen-supplied memory map is well-ordered. */ - e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries), &xen_e820_table.nr_entries); + e820__update_table(&xen_e820_table); max_pages = xen_get_max_pages(); @@ -856,10 +856,9 @@ char * __init xen_memory_setup(void) * reserve ISA memory anyway because too many things poke * about in there. */ - e820__range_add(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, - E820_TYPE_RESERVED); + e820__range_add(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, E820_TYPE_RESERVED); - e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); + e820__update_table(e820_table); /* * Check whether the kernel itself conflicts with the target E820 map. @@ -930,7 +929,7 @@ char * __init xen_auto_xlated_memory_setup(void) xen_e820_table.nr_entries = memmap.nr_entries; - e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries), &xen_e820_table.nr_entries); + e820__update_table(&xen_e820_table); for (i = 0; i < xen_e820_table.nr_entries; i++) e820__range_add(xen_e820_table.entries[i].addr, xen_e820_table.entries[i].size, xen_e820_table.entries[i].type); -- 2.7.4