Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=85770ffe4f0cdd4396b17f14762adc25a571a348
Commit:     85770ffe4f0cdd4396b17f14762adc25a571a348
Parent:     df068464169a84a6a66c05d140f43a46d5eb6176
Author:     Andy Whitcroft <[EMAIL PROTECTED]>
AuthorDate: Wed Aug 22 14:01:03 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Wed Aug 22 19:52:44 2007 -0700

    sparsemem: ensure we initialise the node mapping for SPARSEMEM_STATIC
    
    Booting SPARSEMEM on NUMA systems trips a BUG in page_alloc.c:
    
        Initializing HighMem for node 0 (00038000:00100000)
        Initializing HighMem for node 1 (00100000:001ffe00)
        ------------[ cut here ]------------
        kernel BUG at /home/apw/git/linux-2.6/mm/page_alloc.c:456!
        [...]
    
    This occurs because the section to node id mapping is not being
    setup correctly during init under SPARSEMEM_STATIC, leading to an
    attempt to free pages from all nodes into the zones on node 0.
    
    When the zone_table[] was removed in the following commit, a new
    section to node mapping table was introduced:
    
        commit 89689ae7f95995723fbcd5c116c47933a3bb8b13
        [PATCH] Get rid of zone_table[]
    
    That conversion inadvertantly only initialised the node mapping in
    SPARSEMEM_EXTREME.  Ensure we initialise the node mapping in
    SPARSEMEM_STATIC.
    
    [EMAIL PROTECTED]: make the stubs static inline]
    Signed-off-by: Andy Whitcroft <[EMAIL PROTECTED]>
    Cc: Christoph Lameter <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 mm/sparse.c |   14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index 3047bf0..239f5a7 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -41,6 +41,15 @@ int page_to_nid(struct page *page)
        return section_to_node_table[page_to_section(page)];
 }
 EXPORT_SYMBOL(page_to_nid);
+
+static void set_section_nid(unsigned long section_nr, int nid)
+{
+       section_to_node_table[section_nr] = nid;
+}
+#else /* !NODE_NOT_IN_PAGE_FLAGS */
+static inline void set_section_nid(unsigned long section_nr, int nid)
+{
+}
 #endif
 
 #ifdef CONFIG_SPARSEMEM_EXTREME
@@ -68,10 +77,6 @@ static int __meminit sparse_index_init(unsigned long 
section_nr, int nid)
        struct mem_section *section;
        int ret = 0;
 
-#ifdef NODE_NOT_IN_PAGE_FLAGS
-       section_to_node_table[section_nr] = nid;
-#endif
-
        if (mem_section[root])
                return -EEXIST;
 
@@ -148,6 +153,7 @@ void __init memory_present(int nid, unsigned long start, 
unsigned long end)
                struct mem_section *ms;
 
                sparse_index_init(section, nid);
+               set_section_nid(section, nid);
 
                ms = __nr_to_section(section);
                if (!ms->section_mem_map)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to