aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorAndy Whitcroft <apw@shadowen.org>2007-10-16 04:24:11 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:42:51 -0400
commit540557b9439ec19668553830c90222f9fb0c2e95 (patch)
tree07dfa0e88580d4101dbb11ebc59348233e18b2f0 /include/linux
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. [akpm@linux-foundation.org: coding-syle fixes] Signed-off-by: Andy Whitcroft <apw@shadowen.org> Acked-by: Mel Gorman <mel@csn.ul.ie> Cc: Christoph Lameter <clameter@sgi.com> Cc: "Luck, Tony" <tony.luck@intel.com> Cc: Andi Kleen <ak@suse.de> Cc: "David S. Miller" <davem@davemloft.net> Cc: Paul Mackerras <paulus@samba.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/mmzone.h16
1 files changed, 14 insertions, 2 deletions
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 4e5627379b09..f21e5951038b 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -771,12 +771,17 @@ static inline struct page *__section_mem_map_addr(struct mem_section *section)
771 return (struct page *)map; 771 return (struct page *)map;
772} 772}
773 773
774static inline int valid_section(struct mem_section *section) 774static inline int present_section(struct mem_section *section)
775{ 775{
776 return (section && (section->section_mem_map & SECTION_MARKED_PRESENT)); 776 return (section && (section->section_mem_map & SECTION_MARKED_PRESENT));
777} 777}
778 778
779static inline int section_has_mem_map(struct mem_section *section) 779static inline int present_section_nr(unsigned long nr)
780{
781 return present_section(__nr_to_section(nr));
782}
783
784static inline int valid_section(struct mem_section *section)
780{ 785{
781 return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP)); 786 return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP));
782} 787}
@@ -798,6 +803,13 @@ static inline int pfn_valid(unsigned long pfn)
798 return valid_section(__nr_to_section(pfn_to_section_nr(pfn))); 803 return valid_section(__nr_to_section(pfn_to_section_nr(pfn)));
799} 804}
800 805
806static inline int pfn_present(unsigned long pfn)
807{
808 if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
809 return 0;
810 return present_section(__nr_to_section(pfn_to_section_nr(pfn)));
811}
812
801/* 813/*
802 * These are _only_ used during initialisation, therefore they 814 * These are _only_ used during initialisation, therefore they
803 * can use __initdata ... They could have names to indicate 815 * can use __initdata ... They could have names to indicate