
yinghai at kernel
May 14, 2009, 10:34 AM
Post #5 of 6
(971 views)
Permalink
|
|
Re: [PATCH 5/5] mm: clear N_HIGH_MEMORY map before se set it again -v2
[In reply to]
|
|
Andrew Morton wrote: > On Thu, 14 May 2009 10:05:43 -0700 > Yinghai Lu <yinghai [at] kernel> wrote: > >> Andrew Morton wrote: >>> On Thu, 14 May 2009 09:43:22 -0700 >>> Yinghai Lu <yinghai [at] kernel> wrote: >>> >>>> incase some system strange SRAT table. some kind of small range. >>>> or with mem= etc >>>> >>> That description is very hard to understand. Please provide more details. >> if the wrong SRAT table, have small range for some node. that node will not be onlined. >> In the early checking, the bit in node_states[N_HIGH_MEMORY] for the node is set even >> that node has less RAM like 1M, and it is not cleared before the bit is set again in >> the following loop according online nodes. > > Where in the kernel does this setting of the bit in node_states[] > occur? early_calculate_totalpages()? yes. > > Where in the kernel is it later decided to _not_ use these pages in > that node? Perhaps that's the place where the problem should be fixed. in free_area_init_nodes() /* Initialise every node */ mminit_verify_pageflags_layout(); setup_nr_node_ids(); for_each_online_node(nid) { pg_data_t *pgdat = NODE_DATA(nid); free_area_init_node(nid, NULL, find_min_pfn_for_node(nid), NULL); /* Any memory on that node */ if (pgdat->node_present_pages) node_set_state(nid, N_HIGH_MEMORY); check_for_regular_memory(pgdat); } so that patch clear that node_mask before set those bits according if that node is online and node_present_pages is there. > > >>>> Signed-off-by: Yinghai Lu <Yinghai [at] kernel> >>>> Tested-by: Jack Steiner <steiner [at] sgi> >>> What reason did Jack have to test this? Perhaps he hit some bug? >>> If so, please fully describe that bug in the changelog. >> for some memmoryless node and strange memmap. > > That's not a very good problem description. > > Put yourself in the position of a distro engineer whose customer > reports a 2.6.26 problem. He's going to look at your patch wondering > whether it might fix his customer's problem. We should provide him > with sufficient information to be able to determine this. > >>> >>>> Index: linux-2.6/mm/page_alloc.c >>>> =================================================================== >>>> --- linux-2.6.orig/mm/page_alloc.c >>>> +++ linux-2.6/mm/page_alloc.c >>>> @@ -4041,6 +4047,11 @@ void __init free_area_init_nodes(unsigne >>>> early_node_map[i].start_pfn, >>>> early_node_map[i].end_pfn); >>>> >>>> + /* >>>> + * find_zone_movable_pfns_for_nodes/early_calculate_totalpages init >>>> + * that node_mask, clear it at first >>>> + */ >>>> + nodes_clear(node_states[N_HIGH_MEMORY]); >>>> /* Initialise every node */ >>>> mminit_verify_pageflags_layout(); >>>> setup_nr_node_ids(); >>> If CONFIG_HIGHMEM=n, this will clear the N_NORMAL_MEMORY entry in >>> node_states[]. Why is this correct and desirable? >> then N_NORMAL_MEMORY == N_HIGH_MEMORY > > I know. > > But it's unobvious that this change is correct and desirable with both > CONFIG_HIGHMEM=n and CONFIG_HIGHMEM=y. use ifdef ? YH -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo [at] vger More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|