X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=mm%2Fsparse.c;fp=mm%2Fsparse.c;h=0a51f36ba3a1b9fcaade3481857cbfd4ae1233b2;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=86c52ab80878f1df2239ae9270c5f49b643ab1b0;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/mm/sparse.c b/mm/sparse.c index 86c52ab80..0a51f36ba 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -1,6 +1,7 @@ /* * sparse memory mappings. */ +#include #include #include #include @@ -31,10 +32,7 @@ static struct mem_section *sparse_index_alloc(int nid) unsigned long array_size = SECTIONS_PER_ROOT * sizeof(struct mem_section); - if (slab_is_available()) - section = kmalloc_node(array_size, GFP_KERNEL, nid); - else - section = alloc_bootmem_node(NODE_DATA(nid), array_size); + section = alloc_bootmem_node(NODE_DATA(nid), array_size); if (section) memset(section, 0, array_size); @@ -44,7 +42,7 @@ static struct mem_section *sparse_index_alloc(int nid) static int sparse_index_init(unsigned long section_nr, int nid) { - static DEFINE_SPINLOCK(index_init_lock); + static spinlock_t index_init_lock = SPIN_LOCK_UNLOCKED; unsigned long root = SECTION_NR_TO_ROOT(section_nr); struct mem_section *section; int ret = 0; @@ -86,8 +84,11 @@ int __section_nr(struct mem_section* ms) unsigned long root_nr; struct mem_section* root; - for (root_nr = 0; root_nr < NR_SECTION_ROOTS; root_nr++) { - root = __nr_to_section(root_nr * SECTIONS_PER_ROOT); + for (root_nr = 0; + root_nr < NR_MEM_SECTIONS; + root_nr += SECTIONS_PER_ROOT) { + root = __nr_to_section(root_nr); + if (!root) continue; @@ -98,22 +99,6 @@ int __section_nr(struct mem_section* ms) return (root_nr * SECTIONS_PER_ROOT) + (ms - root); } -/* - * During early boot, before section_mem_map is used for an actual - * mem_map, we use section_mem_map to store the section's NUMA - * node. This keeps us from having to use another data structure. The - * node information is cleared just before we store the real mem_map. - */ -static inline unsigned long sparse_encode_early_nid(int nid) -{ - return (nid << SECTION_NID_SHIFT); -} - -static inline int sparse_early_nid(struct mem_section *section) -{ - return (section->section_mem_map >> SECTION_NID_SHIFT); -} - /* Record a memory area against a node. */ void memory_present(int nid, unsigned long start, unsigned long end) { @@ -128,8 +113,7 @@ void memory_present(int nid, unsigned long start, unsigned long end) ms = __nr_to_section(section); if (!ms->section_mem_map) - ms->section_mem_map = sparse_encode_early_nid(nid) | - SECTION_MARKED_PRESENT; + ms->section_mem_map = SECTION_MARKED_PRESENT; } } @@ -180,7 +164,6 @@ static int sparse_init_one_section(struct mem_section *ms, if (!valid_section(ms)) return -EINVAL; - ms->section_mem_map &= ~SECTION_MAP_MASK; ms->section_mem_map |= sparse_encode_mem_map(mem_map, pnum); return 1; @@ -189,8 +172,8 @@ static int sparse_init_one_section(struct mem_section *ms, static struct page *sparse_early_mem_map_alloc(unsigned long pnum) { struct page *map; + int nid = early_pfn_to_nid(section_nr_to_pfn(pnum)); struct mem_section *ms = __nr_to_section(pnum); - int nid = sparse_early_nid(ms); map = alloc_remap(nid, sizeof(struct page) * PAGES_PER_SECTION); if (map) @@ -298,9 +281,9 @@ int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, ret = sparse_init_one_section(ms, section_nr, memmap); -out: - pgdat_resize_unlock(pgdat, &flags); if (ret <= 0) __kfree_section_memmap(memmap, nr_pages); +out: + pgdat_resize_unlock(pgdat, &flags); return ret; }