diff options
Diffstat (limited to 'include/linux/mmzone.h')
-rw-r--r-- | include/linux/mmzone.h | 30 |
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 | |||
501 | extern struct mem_section *mem_section[NR_SECTION_ROOTS]; | ||
502 | |||
503 | static 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 | |||
490 | extern struct mem_section mem_section[NR_MEM_SECTIONS]; | 512 | extern struct mem_section mem_section[NR_MEM_SECTIONS]; |
491 | 513 | ||
492 | static inline struct mem_section *__nr_to_section(unsigned long nr) | 514 | static 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 | ||
514 | static inline int valid_section(struct mem_section *section) | 540 | static 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 | ||
519 | static inline int section_has_mem_map(struct mem_section *section) | 545 | static 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 | ||
524 | static inline int valid_section_nr(unsigned long nr) | 550 | static inline int valid_section_nr(unsigned long nr) |