lkml.org 
[lkml]   [2009]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] x86: make e820_update_range to handle small range update

    Impact: enhance to handle more case.

    try to handle new range could be covered by one entry.

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>

    ---
    arch/x86/kernel/e820.c | 23 +++++++++++++++++++----
    1 file changed, 19 insertions(+), 4 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
    @@ -427,6 +427,7 @@ static u64 __init __e820_update_range(st
    u64 size, unsigned old_type,
    unsigned new_type)
    {
    + u64 end;
    unsigned int i;
    u64 real_updated_size = 0;

    @@ -435,21 +436,35 @@ static u64 __init __e820_update_range(st
    if (size > (ULLONG_MAX - start))
    size = ULLONG_MAX - start;

    + end = start + size;
    for (i = 0; i < e820x->nr_map; i++) {
    struct e820entry *ei = &e820x->map[i];
    u64 final_start, final_end;
    + u64 ei_end;
    +
    if (ei->type != old_type)
    continue;
    - /* totally covered? */
    - if (ei->addr >= start &&
    - (ei->addr + ei->size) <= (start + size)) {
    +
    + ei_end = ei->addr + ei->size;
    + /* totally covered by new range? */
    + if (ei->addr >= start && ei_end <= end) {
    ei->type = new_type;
    real_updated_size += ei->size;
    continue;
    }
    +
    + /* new range is totally covered? */
    + if (ei->addr < start && ei_end > end) {
    + __e820_add_region(e820x, start, size, new_type);
    + __e820_add_region(e820x, end, ei_end - end, ei->type);
    + ei->size = start - ei->addr;
    + real_updated_size += size;
    + continue;
    + }
    +
    /* partially covered */
    final_start = max(start, ei->addr);
    - final_end = min(start + size, ei->addr + ei->size);
    + final_end = min(end, ei_end);
    if (final_start >= final_end)
    continue;


    \
     
     \ /
      Last update: 2009-03-13 06:41    [W:3.371 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site