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 <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Brian Gerst <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: Denys Vlasenko <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Huang, Ying <[email protected]>
Cc: Josh Poimboeuf <[email protected]>
Cc: Juergen Gross <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Paul Jackson <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Rafael J. Wysocki <[email protected]>
Cc: Tejun Heo <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Wei Yang <[email protected]>
Cc: Yinghai Lu <[email protected]>
Cc: [email protected]
Signed-off-by: Ingo Molnar <[email protected]>
---
 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

Reply via email to