diff options
Diffstat (limited to 'mm/page_ext.c')
| -rw-r--r-- | mm/page_ext.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/mm/page_ext.c b/mm/page_ext.c index 4ee522fd381c..dc1626be458b 100644 --- a/mm/page_ext.c +++ b/mm/page_ext.c @@ -71,6 +71,7 @@ static bool need_page_idle(void)  }  static struct page_ext_operations page_idle_ops __initdata = {  	.need = need_page_idle, +	.need_shared_flags = true,  };  #endif @@ -86,12 +87,12 @@ static struct page_ext_operations *page_ext_ops[] __initdata = {  #endif  }; -unsigned long page_ext_size = sizeof(struct page_ext); +unsigned long page_ext_size;  static unsigned long total_usage;  static struct page_ext *lookup_page_ext(const struct page *page); -bool early_page_ext; +bool early_page_ext __meminitdata;  static int __init setup_early_page_ext(char *str)  {  	early_page_ext = true; @@ -106,7 +107,16 @@ static bool __init invoke_need_callbacks(void)  	bool need = false;  	for (i = 0; i < entries; i++) { -		if (page_ext_ops[i]->need && page_ext_ops[i]->need()) { +		if (page_ext_ops[i]->need()) { +			if (page_ext_ops[i]->need_shared_flags) { +				page_ext_size = sizeof(struct page_ext); +				break; +			} +		} +	} + +	for (i = 0; i < entries; i++) { +		if (page_ext_ops[i]->need()) {  			page_ext_ops[i]->offset = page_ext_size;  			page_ext_size += page_ext_ops[i]->size;  			need = true;  |