Messages in this thread Patch in this message | | | Date | Tue, 24 Jun 2008 12:57:35 -0700 | From | "Yinghai Lu" <> | Subject | Re: [PATCH 1/3] e820_update_range(): Strip size of original region |
| |
On Tue, Jun 24, 2008 at 7:35 AM, Bernhard Walle <bwalle@suse.de> wrote: > This patch fixes a bug in e820_update_range(): Previously, if a region was > partially covered, then e820_update_range() only added a new E820 range but > didn't update the end/size of the previous range. That lead to duplicate > covering of a region. > > Patch tested on i386 and x86-64 with patch that uses e820_update_range() > to limit the E820 map when "mem" parameter is specified on the command line. > > > Signed-off-by: Bernhard Walle <bwalle@suse.de> > --- > arch/x86/kernel/e820.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c > index e285ea3..e466073 100644 > --- a/arch/x86/kernel/e820.c > +++ b/arch/x86/kernel/e820.c > @@ -422,6 +422,7 @@ u64 __init e820_update_range(u64 start, u64 size, unsigned old_type, > final_end = min(start + size, ei->addr + ei->size); > if (final_start >= final_end) > continue; > + ei->size -= final_end - final_start; > e820_add_region(final_start, final_end - final_start, > new_type); > real_updated_size += final_end - final_start; > --
thanks for finding it, but fix is not complete. could have problem with fore boundary overlapping. need to update the ei->addr
please check attached patch
YH [PATCH] x86: fix e820_update_range size when overlapping
before that we relay on sanitize_e820_map to remove the overlap.
but e820_update_range(,,E820_RESERVED, E820_RAM) will not work
this patch fix that
who is going to use this?
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 512f779..15b4393 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c @@ -425,6 +425,11 @@ u64 __init e820_update_range(u64 start, u64 size, unsigned old_type, e820_add_region(final_start, final_end - final_start, new_type); real_updated_size += final_end - final_start; + + ei->size -= final_end - final_start; + if (ei->addr < final_start) + continue; + ei->addr = final_end; } return real_updated_size; } | |