lkml.org 
[lkml]   [2006]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    SubjectRe: assert/crash in __rmqueue() when enabling CONFIG_NUMA
    Ingo Molnar wrote:	[Thu May 04 2006, 03:25:28PM EDT]
    >
    > * Bob Picco <bob.picco@hp.com> wrote:
    >
    > > Dave Hansen wrote: [Thu May 04 2006, 11:21:06AM EDT]
    > > > I haven't thought through it completely, but these two lines worry me:
    > > >
    > > > > + start = pgdat->node_start_pfn & ~((1 << (MAX_ORDER - 1)) - 1);
    > > > > + end = start + pgdat->node_spanned_pages;
    > > >
    > > > Should the "end" be based off of the original "start", or the aligned
    > > > "start"?
    > >
    > > Yes. I failed to quilt refresh before sending. You mean end should be
    > > end = pgdat->node_start_pfn + pgdat->node_spanned_pages before
    > > rounding up.
    >
    > do you have an updated patch i should try?
    >
    > Ingo
    You can try this but don't believe it will change your outcome. I've
    booted this on ia64 with slight modification to eliminate
    VIRTUAL_MEM_MAP and have only DISCONTIGMEM. Your case is failing at the
    front edge of of the zone and not the ending edge which had a flaw in my
    first post of the patch. I would have expected the first patch to handle
    the front edge correctly.

    I don't remember seeing your .config in the thread (or blind and unable
    to see it). Would you please send it my way.

    I'm also hoping Andy has time to look into this.

    bob


    Index: linux-2.6.17-rc3/mm/page_alloc.c
    ===================================================================
    --- linux-2.6.17-rc3.orig/mm/page_alloc.c 2006-04-27 09:44:02.000000000 -0400
    +++ linux-2.6.17-rc3/mm/page_alloc.c 2006-05-04 13:01:25.000000000 -0400
    @@ -2123,14 +2123,22 @@ static void __init alloc_node_mem_map(st
    #ifdef CONFIG_FLAT_NODE_MEM_MAP
    /* ia64 gets its own node_mem_map, before this, without bootmem */
    if (!pgdat->node_mem_map) {
    - unsigned long size;
    + unsigned long size, start, end;
    struct page *map;

    - size = (pgdat->node_spanned_pages + 1) * sizeof(struct page);
    + /*
    + * The zone's endpoints aren't required to be MAX_ORDER
    + * aligned but the node_mem_map endpoints must be in order
    + * for the buddy allocator to function correctly.
    + */
    + start = pgdat->node_start_pfn & ~(MAX_ORDER_NR_PAGES - 1);
    + end = pgdat->node_start_pfn + pgdat->node_spanned_pages;
    + end = ALIGN(end, MAX_ORDER_NR_PAGES);
    + size = (end - start) * sizeof(struct page);
    map = alloc_remap(pgdat->node_id, size);
    if (!map)
    map = alloc_bootmem_node(pgdat, size);
    - pgdat->node_mem_map = map;
    + pgdat->node_mem_map = map + (pgdat->node_start_pfn - start);
    }
    #ifdef CONFIG_FLATMEM
    /*
    Index: linux-2.6.17-rc3/include/linux/mmzone.h
    ===================================================================
    --- linux-2.6.17-rc3.orig/include/linux/mmzone.h 2006-04-27 09:44:02.000000000 -0400
    +++ linux-2.6.17-rc3/include/linux/mmzone.h 2006-05-04 13:01:39.000000000 -0400
    @@ -22,6 +22,7 @@
    #else
    #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
    #endif
    +#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))

    struct free_area {
    struct list_head free_list;
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-05-04 21:46    [W:0.027 / U:0.684 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site