Skip to content

Commit

Permalink
[PATCH] sparsemem interaction with memory add bug fixes
Browse files Browse the repository at this point in the history
This patch fixes two bugs with the way sparsemem interacts with memory add.
They are:

- memory leak if memmap for section already exists

- calling alloc_bootmem_node() after boot

These bugs were discovered and a first cut at the fixes were provided by
Arnd Bergmann <arnd@arndb.de> and Joel Schopp <jschopp@us.ibm.com>.

Signed-off-by: Mike Kravetz <kravetz@us.ibm.com>
Signed-off-by: Joel Schopp <jschopp@austin.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Mike Kravetz authored and Linus Torvalds committed May 2, 2006
1 parent 2c43630 commit 46a66ee
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions mm/sparse.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,10 @@ static struct mem_section *sparse_index_alloc(int nid)
unsigned long array_size = SECTIONS_PER_ROOT *
sizeof(struct mem_section);

section = alloc_bootmem_node(NODE_DATA(nid), array_size);
if (system_state == SYSTEM_RUNNING)
section = kmalloc_node(array_size, GFP_KERNEL, nid);
else
section = alloc_bootmem_node(NODE_DATA(nid), array_size);

if (section)
memset(section, 0, array_size);
Expand Down Expand Up @@ -281,9 +284,9 @@ int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,

ret = sparse_init_one_section(ms, section_nr, memmap);

if (ret <= 0)
__kfree_section_memmap(memmap, nr_pages);
out:
pgdat_resize_unlock(pgdat, &flags);
if (ret <= 0)
__kfree_section_memmap(memmap, nr_pages);
return ret;
}

0 comments on commit 46a66ee

Please sign in to comment.