aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2008-04-28 05:12:43 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-28 11:58:21 -0400
commit308c05e35e3517d19bb67a7e97772235c9e15cd7 (patch)
tree75d0eae800ef1fc7297f97262b42ddbd1347cad0
parent2301696932b55e2ea2085cefc84f7b94fa2dd54b (diff)
sparsemem: vmemmap does not need section bits
A set of patches that attempts to improve page flag handling. First of all a method is introduced to generate the page flag functions using macros. Then the number of page flags used by sparsemem is reduced. All page flag operations will no longer be macros. All flags will use inline function. Then we add a way to export enum constants to the preprocessor which allows us to get rid of __ZONE_COUNT and use the NR_PAGEFLAGS for the dynamic calculation of actually available page flags for fields. This patch: 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. Signed-off-by: Christoph Lameter <clameter@sgi.com> Cc: Andy Whitcroft <apw@shadowen.org> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Rik van Riel <riel@redhat.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/mm.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h
index ca973359fe5f..24659ed06bae 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -395,11 +395,11 @@ static inline void set_compound_order(struct page *page, unsigned long order)
395 * we have run out of space and have to fall back to an 395 * we have run out of space and have to fall back to an
396 * alternate (slower) way of determining the node. 396 * alternate (slower) way of determining the node.
397 * 397 *
398 * No sparsemem: | NODE | ZONE | ... | FLAGS | 398 * No sparsemem or sparsemem vmemmap: | NODE | ZONE | ... | FLAGS |
399 * with space for node: | SECTION | NODE | ZONE | ... | FLAGS | 399 * classic sparse with space for node:| SECTION | NODE | ZONE | ... | FLAGS |
400 * no space for node: | SECTION | ZONE | ... | FLAGS | 400 * classic sparse no space for node: | SECTION | ZONE | ... | FLAGS |
401 */ 401 */
402#ifdef CONFIG_SPARSEMEM 402#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
403#define SECTIONS_WIDTH SECTIONS_SHIFT 403#define SECTIONS_WIDTH SECTIONS_SHIFT
404#else 404#else
405#define SECTIONS_WIDTH 0 405#define SECTIONS_WIDTH 0
@@ -410,6 +410,9 @@ static inline void set_compound_order(struct page *page, unsigned long order)
410#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= FLAGS_RESERVED 410#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= FLAGS_RESERVED
411#define NODES_WIDTH NODES_SHIFT 411#define NODES_WIDTH NODES_SHIFT
412#else 412#else
413#ifdef CONFIG_SPARSEMEM_VMEMMAP
414#error "Vmemmap: No space for nodes field in page flags"
415#endif
413#define NODES_WIDTH 0 416#define NODES_WIDTH 0
414#endif 417#endif
415 418
@@ -502,10 +505,12 @@ static inline struct zone *page_zone(struct page *page)
502 return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)]; 505 return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)];
503} 506}
504 507
508#if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP)
505static inline unsigned long page_to_section(struct page *page) 509static inline unsigned long page_to_section(struct page *page)
506{ 510{
507 return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK; 511 return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK;
508} 512}
513#endif
509 514
510static inline void set_page_zone(struct page *page, enum zone_type zone) 515static inline void set_page_zone(struct page *page, enum zone_type zone)
511{ 516{