From: Christoph Lameter Subject: Sparsemem: Vmemmap does not need section bits Sparsemem vmemmap does not need any section bits. This patch has the effect of reducing the number of bits used in page->flags by at least 6. V1->V2: - Make page_to_section() undefined for SPARSEMEM_VMEMMAP (Kamezawa Hiroyuki) since any use may return an invalid value. It is not use at all if SPARSEMEM_VMEMMAP is defined. Signed-off-by: Christoph Lameter --- include/linux/mm.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) Index: linux-2.6.25-rc3-mm1/include/linux/mm.h =================================================================== --- linux-2.6.25-rc3-mm1.orig/include/linux/mm.h 2008-03-05 14:22:47.762243907 -0800 +++ linux-2.6.25-rc3-mm1/include/linux/mm.h 2008-03-05 14:32:09.243648114 -0800 @@ -386,11 +386,11 @@ static inline void set_compound_order(st * we have run out of space and have to fall back to an * alternate (slower) way of determining the node. * - * No sparsemem: | NODE | ZONE | ... | FLAGS | - * with space for node: | SECTION | NODE | ZONE | ... | FLAGS | - * no space for node: | SECTION | ZONE | ... | FLAGS | + * No sparsemem or sparsemem vmemmap: | NODE | ZONE | ... | FLAGS | + * classic sparse with space for node:| SECTION | NODE | ZONE | ... | FLAGS | + * classic sparse no space for node: | SECTION | ZONE | ... | FLAGS | */ -#ifdef CONFIG_SPARSEMEM +#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) #define SECTIONS_WIDTH SECTIONS_SHIFT #else #define SECTIONS_WIDTH 0 @@ -401,6 +401,9 @@ static inline void set_compound_order(st #if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= FLAGS_RESERVED #define NODES_WIDTH NODES_SHIFT #else +#ifdef CONFIG_SPARSEMEM_VMEMMAP +#error "Vmemmap: No space for nodes field in page flags" +#endif #define NODES_WIDTH 0 #endif @@ -493,10 +496,12 @@ static inline struct zone *page_zone(str return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)]; } +#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) static inline unsigned long page_to_section(struct page *page) { return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK; } +#endif static inline void set_page_zone(struct page *page, enum zone_type zone) {