aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/mmzone.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/mmzone.h')
-rw-r--r--include/linux/mmzone.h30
1 files changed, 28 insertions, 2 deletions
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 6c90461ed99f..b97054bbc394 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -487,6 +487,28 @@ struct mem_section {
487 unsigned long section_mem_map; 487 unsigned long section_mem_map;
488}; 488};
489 489
490#ifdef CONFIG_ARCH_SPARSEMEM_EXTREME
491/*
492 * Should we ever require GCC 4 or later then the flat array scheme
493 * can be eliminated and a uniform solution for EXTREME and !EXTREME can
494 * be arrived at.
495 */
496#define SECTION_ROOT_SHIFT (PAGE_SHIFT-3)
497#define SECTION_ROOT_MASK ((1UL<<SECTION_ROOT_SHIFT) - 1)
498#define SECTION_TO_ROOT(_sec) ((_sec) >> SECTION_ROOT_SHIFT)
499#define NR_SECTION_ROOTS (NR_MEM_SECTIONS >> SECTION_ROOT_SHIFT)
500
501extern struct mem_section *mem_section[NR_SECTION_ROOTS];
502
503static inline struct mem_section *__nr_to_section(unsigned long nr)
504{
505 if (!mem_section[SECTION_TO_ROOT(nr)])
506 return NULL;
507 return &mem_section[SECTION_TO_ROOT(nr)][nr & SECTION_ROOT_MASK];
508}
509
510#else
511
490extern struct mem_section mem_section[NR_MEM_SECTIONS]; 512extern struct mem_section mem_section[NR_MEM_SECTIONS];
491 513
492static inline struct mem_section *__nr_to_section(unsigned long nr) 514static inline struct mem_section *__nr_to_section(unsigned long nr)
@@ -494,6 +516,10 @@ static inline struct mem_section *__nr_to_section(unsigned long nr)
494 return &mem_section[nr]; 516 return &mem_section[nr];
495} 517}
496 518
519#define sparse_index_init(_sec, _nid) do {} while (0)
520
521#endif
522
497/* 523/*
498 * We use the lower bits of the mem_map pointer to store 524 * We use the lower bits of the mem_map pointer to store
499 * a little bit of information. There should be at least 525 * a little bit of information. There should be at least
@@ -513,12 +539,12 @@ static inline struct page *__section_mem_map_addr(struct mem_section *section)
513 539
514static inline int valid_section(struct mem_section *section) 540static inline int valid_section(struct mem_section *section)
515{ 541{
516 return (section->section_mem_map & SECTION_MARKED_PRESENT); 542 return (section && (section->section_mem_map & SECTION_MARKED_PRESENT));
517} 543}
518 544
519static inline int section_has_mem_map(struct mem_section *section) 545static inline int section_has_mem_map(struct mem_section *section)
520{ 546{
521 return (section->section_mem_map & SECTION_HAS_MEM_MAP); 547 return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP));
522} 548}
523 549
524static inline int valid_section_nr(unsigned long nr) 550static inline int valid_section_nr(unsigned long nr)