diff options
Diffstat (limited to 'mm/mm_init.c')
| -rw-r--r-- | mm/mm_init.c | 83 | 
1 files changed, 68 insertions, 15 deletions
diff --git a/mm/mm_init.c b/mm/mm_init.c index 4e0e26591df..4074caf9936 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -8,7 +8,9 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/kobject.h> -#include <linux/module.h> +#include <linux/export.h> +#include <linux/memory.h> +#include <linux/notifier.h>  #include "internal.h"  #ifdef CONFIG_DEBUG_MEMORY_INIT @@ -69,34 +71,41 @@ void __init mminit_verify_pageflags_layout(void)  	unsigned long or_mask, add_mask;  	shift = 8 * sizeof(unsigned long); -	width = shift - SECTIONS_WIDTH - NODES_WIDTH - ZONES_WIDTH; +	width = shift - SECTIONS_WIDTH - NODES_WIDTH - ZONES_WIDTH - LAST_CPUPID_SHIFT;  	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_widths", -		"Section %d Node %d Zone %d Flags %d\n", +		"Section %d Node %d Zone %d Lastcpupid %d Flags %d\n",  		SECTIONS_WIDTH,  		NODES_WIDTH,  		ZONES_WIDTH, +		LAST_CPUPID_WIDTH,  		NR_PAGEFLAGS);  	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_shifts", -		"Section %d Node %d Zone %d\n", +		"Section %d Node %d Zone %d Lastcpupid %d\n",  		SECTIONS_SHIFT,  		NODES_SHIFT, -		ZONES_SHIFT); -	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_offsets", -		"Section %lu Node %lu Zone %lu\n", +		ZONES_SHIFT, +		LAST_CPUPID_SHIFT); +	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_pgshifts", +		"Section %lu Node %lu Zone %lu Lastcpupid %lu\n",  		(unsigned long)SECTIONS_PGSHIFT,  		(unsigned long)NODES_PGSHIFT, -		(unsigned long)ZONES_PGSHIFT); -	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_zoneid", -		"Zone ID: %lu -> %lu\n", -		(unsigned long)ZONEID_PGOFF, -		(unsigned long)(ZONEID_PGOFF + ZONEID_SHIFT)); +		(unsigned long)ZONES_PGSHIFT, +		(unsigned long)LAST_CPUPID_PGSHIFT); +	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_nodezoneid", +		"Node/Zone ID: %lu -> %lu\n", +		(unsigned long)(ZONEID_PGOFF + ZONEID_SHIFT), +		(unsigned long)ZONEID_PGOFF);  	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_usage", -		"location: %d -> %d unused %d -> %d flags %d -> %d\n", +		"location: %d -> %d layout %d -> %d unused %d -> %d page-flags\n",  		shift, width, width, NR_PAGEFLAGS, NR_PAGEFLAGS, 0);  #ifdef NODE_NOT_IN_PAGE_FLAGS  	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_nodeflags",  		"Node not in page flags");  #endif +#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS +	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_nodeflags", +		"Last cpupid not in page flags"); +#endif  	if (SECTIONS_WIDTH) {  		shift -= SECTIONS_WIDTH; @@ -140,6 +149,51 @@ early_param("mminit_loglevel", set_mminit_loglevel);  struct kobject *mm_kobj;  EXPORT_SYMBOL_GPL(mm_kobj); +#ifdef CONFIG_SMP +s32 vm_committed_as_batch = 32; + +static void __meminit mm_compute_batch(void) +{ +	u64 memsized_batch; +	s32 nr = num_present_cpus(); +	s32 batch = max_t(s32, nr*2, 32); + +	/* batch size set to 0.4% of (total memory/#cpus), or max int32 */ +	memsized_batch = min_t(u64, (totalram_pages/nr)/256, 0x7fffffff); + +	vm_committed_as_batch = max_t(s32, memsized_batch, batch); +} + +static int __meminit mm_compute_batch_notifier(struct notifier_block *self, +					unsigned long action, void *arg) +{ +	switch (action) { +	case MEM_ONLINE: +	case MEM_OFFLINE: +		mm_compute_batch(); +	default: +		break; +	} +	return NOTIFY_OK; +} + +static struct notifier_block compute_batch_nb __meminitdata = { +	.notifier_call = mm_compute_batch_notifier, +	.priority = IPC_CALLBACK_PRI, /* use lowest priority */ +}; + +static int __init mm_compute_batch_init(void) +{ +	mm_compute_batch(); +	register_hotmemory_notifier(&compute_batch_nb); + +	return 0; +} + +__initcall(mm_compute_batch_init); + +#endif +  static int __init mm_sysfs_init(void)  {  	mm_kobj = kobject_create_and_add("mm", kernel_kobj); @@ -148,5 +202,4 @@ static int __init mm_sysfs_init(void)  	return 0;  } - -__initcall(mm_sysfs_init); +postcore_initcall(mm_sysfs_init);  | 
