[PATCH] x86: split e820 reserved entries record to late v3

Previous thread: Re: by Robert Hancock on Thursday, August 28, 2008 - 8:14 pm. (1 message)

Next thread: [PATCH] x86: split e820 reserved entries record to late v4 by Yinghai Lu on Thursday, August 28, 2008 - 9:29 pm. (10 messages)
To: Ingo Molnar <mingo@...>, Thomas Gleixner <tglx@...>, H. Peter Anvin <hpa@...>, Andrew Morton <akpm@...>, Jesse Barnes <jbarnes@...>, Linus Torvalds <torvalds@...>
Cc: <linux-kernel@...>, Yinghai Lu <yhlu.kernel@...>
Date: Thursday, August 28, 2008 - 8:41 pm

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

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>

---
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(-)

Index: linux-2.6/arch/x86/kernel/e820.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/e820.c
+++ linux-2.6/arch/x86/kernel/e820.c
@@ -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";
Index: linux-2.6/arch/x86/pci/i386.c
=======================...

To: Yinghai Lu <yhlu.kernel@...>
Cc: Ingo Molnar <mingo@...>, Thomas Gleixner <tglx@...>, H. Peter Anvin <hpa@...>, Andrew Morton <akpm@...>, Jesse Barnes <jbarnes@...>, <linux-kernel@...>
Date: Thursday, August 28, 2008 - 8:53 pm

Btw, make this one "static" - I don't think anybody outside of this file
should ever use it anyway.

is probably worthy of a comment.

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
--

To: Linus Torvalds <torvalds@...>
Cc: Ingo Molnar <mingo@...>, Thomas Gleixner <tglx@...>, H. Peter Anvin <hpa@...>, Andrew Morton <akpm@...>, Jesse Barnes <jbarnes@...>, <linux-kernel@...>
Date: Thursday, August 28, 2008 - 9:02 pm

On Thu, Aug 28, 2008 at 5:53 PM, Linus Torvalds

how about
/*
* don't register the region that could be conflicted with pci device
BAR resource
* and insert them later.
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
--

Previous thread: Re: by Robert Hancock on Thursday, August 28, 2008 - 8:14 pm. (1 message)

Next thread: [PATCH] x86: split e820 reserved entries record to late v4 by Yinghai Lu on Thursday, August 28, 2008 - 9:29 pm. (10 messages)