path: root/mm
diff options
authorAndy Whitcroft <>2007-10-16 01:24:11 -0700
committerLinus Torvalds <>2007-10-16 09:42:51 -0700
commit540557b9439ec19668553830c90222f9fb0c2e95 (patch)
tree07dfa0e88580d4101dbb11ebc59348233e18b2f0 /mm
parentcd881a6b22902b356cacf8fd2e4e895871068eec (diff)
sparsemem: record when a section has a valid mem_map
We have flags to indicate whether a section actually has a valid mem_map associated with it. This is never set and we rely solely on the present bit to indicate a section is valid. By definition a section is not valid if it has no mem_map and there is a window during init where the present bit is set but there is no mem_map, during which pfn_valid() will return true incorrectly. Use the existing SECTION_HAS_MEM_MAP flag to indicate the presence of a valid mem_map. Switch valid_section{,_nr} and pfn_valid() to this bit. Add a new present_section{,_nr} and pfn_present() interfaces for those users who care to know that a section is going to be valid. [ coding-syle fixes] Signed-off-by: Andy Whitcroft <> Acked-by: Mel Gorman <> Cc: Christoph Lameter <> Cc: "Luck, Tony" <> Cc: Andi Kleen <> Cc: "David S. Miller" <> Cc: Paul Mackerras <> Cc: Benjamin Herrenschmidt <> Cc: KAMEZAWA Hiroyuki <> Signed-off-by: Andrew Morton <> Signed-off-by: Linus Torvalds <>
Diffstat (limited to 'mm')
1 files changed, 5 insertions, 4 deletions
diff --git a/mm/sparse.c b/mm/sparse.c
index e8f36e4796d0..54f3940406cb 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -176,7 +176,7 @@ unsigned long __init node_memmap_size_bytes(int nid, unsigned long start_pfn,
if (nid != early_pfn_to_nid(pfn))
- if (pfn_valid(pfn))
+ if (pfn_present(pfn))
nr_pages += PAGES_PER_SECTION;
@@ -206,11 +206,12 @@ struct page *sparse_decode_mem_map(unsigned long coded_mem_map, unsigned long pn
static int __meminit sparse_init_one_section(struct mem_section *ms,
unsigned long pnum, struct page *mem_map)
- if (!valid_section(ms))
+ if (!present_section(ms))
return -EINVAL;
ms->section_mem_map &= ~SECTION_MAP_MASK;
- ms->section_mem_map |= sparse_encode_mem_map(mem_map, pnum);
+ ms->section_mem_map |= sparse_encode_mem_map(mem_map, pnum) |
return 1;
@@ -256,7 +257,7 @@ void __init sparse_init(void)
struct page *map;
for (pnum = 0; pnum < NR_MEM_SECTIONS; pnum++) {
- if (!valid_section_nr(pnum))
+ if (!present_section_nr(pnum))
map = sparse_early_mem_map_alloc(pnum);