|
@@ -395,11 +395,11 @@ static inline void set_compound_order(struct page *page, unsigned long order)
|
|
* we have run out of space and have to fall back to an
|
|
* we have run out of space and have to fall back to an
|
|
* alternate (slower) way of determining the node.
|
|
* 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
|
|
#define SECTIONS_WIDTH SECTIONS_SHIFT
|
|
#else
|
|
#else
|
|
#define SECTIONS_WIDTH 0
|
|
#define SECTIONS_WIDTH 0
|
|
@@ -410,6 +410,9 @@ static inline void set_compound_order(struct page *page, unsigned long order)
|
|
#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= FLAGS_RESERVED
|
|
#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= FLAGS_RESERVED
|
|
#define NODES_WIDTH NODES_SHIFT
|
|
#define NODES_WIDTH NODES_SHIFT
|
|
#else
|
|
#else
|
|
|
|
+#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
|
|
|
+#error "Vmemmap: No space for nodes field in page flags"
|
|
|
|
+#endif
|
|
#define NODES_WIDTH 0
|
|
#define NODES_WIDTH 0
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -502,10 +505,12 @@ static inline struct zone *page_zone(struct page *page)
|
|
return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)];
|
|
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)
|
|
static inline unsigned long page_to_section(struct page *page)
|
|
{
|
|
{
|
|
return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK;
|
|
return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK;
|
|
}
|
|
}
|
|
|
|
+#endif
|
|
|
|
|
|
static inline void set_page_zone(struct page *page, enum zone_type zone)
|
|
static inline void set_page_zone(struct page *page, enum zone_type zone)
|
|
{
|
|
{
|