x86: split e820 reserved entries record to late v3
PATCH 1/1 x86: split e820 reserved entries record to late v3
so could let BAR res register at first, or even pnp?
v2: insert e820 reserve resources before pnp_system_init
v3: fix merging problem in tip/x86/core
please drop the one in tip/x86/core use this one instead
--- arch/x86/kernel/e820.c | 20 ++++++++++++++++++-- arch/x86/pci/i386.c | 3 +++ include/asm-x86/e820.h | 1 + 3 files changed, 22 insertions(+), 2 deletions(-)
arch/x86/kernel/e820.c +18 -2
@@ -1271,13 +1271,15 @@ static inline const char *e820_type_to_s/* * Mark e820 reserved areas as busy for the resource manager. */ +struct resource __initdata *e820_res;void __init e820_reserve_resources (void ) {int i; -struct resource *res;u64 end; +struct resource *res; res =alloc_bootmem_low (sizeof (struct resource ) * e820.nr_map); + e820_res = res;for (i =0 ; i < e820.nr_map; i++) { end = e820.map[i].addr + e820.map[i].size -1 ;#ifndef CONFIG_RESOURCES_64BIT
@@ -1291,7 +1293,8 @@ void __init e820_reserve_resources(void) res->end = end; res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ; -insert_resource (&iomem_resource, res); +if (e820.map[i].type !=E820_RESERVED || res->start < (1ULL <<20 )) +insert_resource (&iomem_resource, res); res++; }
@@ -1303,6 +1306,19 @@ void __init e820_reserve_resources(void) } } +void __init e820_reserve_resources_late (void ) +{ +int i; +struct resource *res; + + res = e820_res; +for (i =0 ; i < e820.nr_map; i++) { +if (e820.map[i].type ==E820_RESERVED && res->start >= (1ULL <<20 )) +insert_resource (&iomem_resource, res); + res++; + } +} +char *__init default_machine_specific_memory_setup (void ) {char *who ="BIOS-e820" ;
arch/x86/pci/i386.c +3 -0
@@ -33,6 +33,7 @@#include <linux/bootmem.h> #include <asm/pat.h> +#include <asm/e820.h> #include "pci.h"
@@ -230,6 +231,8 @@ void __init pcibios_resource_survey(voidpcibios_allocate_bus_resources (&pci_root_buses);pcibios_allocate_resources (0 );pcibios_allocate_resources (1 ); + +e820_reserve_resources_late (); }/**
include/asm-x86/e820.h +1 -0
@@ -122,6 +122,7 @@ extern void e820_register_active_regionsextern u64 e820_hole_size (u64 start,u64 end);extern void finish_e820_parsing (void );extern void e820_reserve_resources (void ); +extern void e820_reserve_resources_late (void );extern void setup_memory_map (void );extern char *default_machine_specific_memory_setup (void );extern char *machine_specific_memory_setup (void );
Quoted 4 lines · Yinghai Lu
/*
* Mark e820 reserved areas as busy for the resource manager. */
+struct resource__initdata*e820_res;
Btw, make this one "static" - I don't think anybody outside of this file should ever use it anyway.
And this:
arch/x86/kernel/e820.c void __init e820_reserve_resources(void) · line 1297
Quoted 2 lines
arch/x86/kernel/e820.c +2
-0+if (e820.map[i].type !=E820_RESERVED || res->start < (1ULL <<20 )) +insert_resource (&iomem_resource, res);
is probably worthy of a comment.
And finally:
arch/x86/kernel/e820.c void __init e820_reserve_resources(void) · line 1317
Quoted 9 lines
arch/x86/kernel/e820.c +9
-0+void __init e820_reserve_resources_late (void ) +{ +int i; +struct resource *res; + + res = e820_res; +for (i =0 ; i < e820.nr_map; i++) { +if (e820.map[i].type ==E820_RESERVED && res->start >= (1ULL <<20 )) +insert_resource (&iomem_resource, res);
instead of duplicating the conditional and always having to worry about it matching, how about just making it
if (!res->parent) insert_resource(&iomem_resource, res);
which basically says that "if it's not already inserted, try to re-insert it now".
Linus
Quoted 10 lines · Linus Torvalds
Quoted 4 lines · Yinghai Lu
/*
* Mark e820 reserved areas as busy for the resource manager. */
+struct resource__initdata*e820_res;Btw, make this one "static" - I don't think anybody outside of this file should ever use it anyway.
yes
Quoted 7 lines
And this:
arch/x86/kernel/e820.c void __init e820_reserve_resources(void) · line 1297
Quoted 2 lines
arch/x86/kernel/e820.c +2
-0+if (e820.map[i].type !=E820_RESERVED || res->start < (1ULL <<20 )) +insert_resource (&iomem_resource, res);is probably worthy of a comment.
how about
/*
* don't register the region that could be conflicted with pci device
BAR resource
* and insert them later.
*/
Quoted 16 lines
And finally:
arch/x86/kernel/e820.c void __init e820_reserve_resources(void) · line 1317
Quoted 9 lines
arch/x86/kernel/e820.c +9
-0+void __init e820_reserve_resources_late (void ) +{ +int i; +struct resource *res; + + res = e820_res; +for (i =0 ; i < e820.nr_map; i++) { +if (e820.map[i].type ==E820_RESERVED && res->start >= (1ULL <<20 )) +insert_resource (&iomem_resource, res);instead of duplicating the conditional and always having to worry about it matching, how about just making it
Quoted 5 lines
if (!res->parent) insert_resource(&iomem_resource, res);which basically says that "if it's not already inserted, try to re-insert it now".
there could be one is all zero, when 32bit/!64_RESOURCE. so could change it to
if (!res->parent && res->end)
insert_resource(&iomem_resource, res);YH