diff options
Diffstat (limited to 'mm/vmstat.c')
| -rw-r--r-- | mm/vmstat.c | 46 | 
1 files changed, 40 insertions, 6 deletions
diff --git a/mm/vmstat.c b/mm/vmstat.c index 9bb31457791..b37bd49bfd5 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -207,7 +207,9 @@ void set_pgdat_percpu_threshold(pg_data_t *pgdat,  }  /* - * For use when we know that interrupts are disabled. + * For use when we know that interrupts are disabled, + * or when we know that preemption is disabled and that + * particular counter cannot be updated from interrupt context.   */  void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item,  				int delta) @@ -489,7 +491,7 @@ static void refresh_cpu_vm_stats(void)  			continue;  		if (__this_cpu_read(p->pcp.count)) -			drain_zone_pages(zone, __this_cpu_ptr(&p->pcp)); +			drain_zone_pages(zone, this_cpu_ptr(&p->pcp));  #endif  	}  	fold_diff(global_diff); @@ -770,6 +772,9 @@ const char * const vmstat_text[] = {  	"numa_local",  	"numa_other",  #endif +	"workingset_refault", +	"workingset_activate", +	"workingset_nodereclaim",  	"nr_anon_transparent_hugepages",  	"nr_free_cma",  	"nr_dirty_threshold", @@ -810,8 +815,12 @@ const char * const vmstat_text[] = {  	"pgrotated", +	"drop_pagecache", +	"drop_slab", +  #ifdef CONFIG_NUMA_BALANCING  	"numa_pte_updates", +	"numa_huge_pte_updates",  	"numa_hint_faults",  	"numa_hint_faults_local",  	"numa_pages_migrated", @@ -850,13 +859,19 @@ const char * const vmstat_text[] = {  	"thp_zero_page_alloc",  	"thp_zero_page_alloc_failed",  #endif +#ifdef CONFIG_DEBUG_TLBFLUSH  #ifdef CONFIG_SMP  	"nr_tlb_remote_flush",  	"nr_tlb_remote_flush_received", -#endif +#endif /* CONFIG_SMP */  	"nr_tlb_local_flush_all",  	"nr_tlb_local_flush_one", +#endif /* CONFIG_DEBUG_TLBFLUSH */ +#ifdef CONFIG_DEBUG_VM_VMACACHE +	"vmacache_find_calls", +	"vmacache_find_hits", +#endif  #endif /* CONFIG_VM_EVENTS_COUNTERS */  };  #endif /* CONFIG_PROC_FS || CONFIG_SYSFS || CONFIG_NUMA */ @@ -1217,7 +1232,7 @@ int sysctl_stat_interval __read_mostly = HZ;  static void vmstat_update(struct work_struct *w)  {  	refresh_cpu_vm_stats(); -	schedule_delayed_work(&__get_cpu_var(vmstat_work), +	schedule_delayed_work(this_cpu_ptr(&vmstat_work),  		round_jiffies_relative(sysctl_stat_interval));  } @@ -1229,6 +1244,20 @@ static void start_cpu_timer(int cpu)  	schedule_delayed_work_on(cpu, work, __round_jiffies_relative(HZ, cpu));  } +static void vmstat_cpu_dead(int node) +{ +	int cpu; + +	get_online_cpus(); +	for_each_online_cpu(cpu) +		if (cpu_to_node(cpu) == node) +			goto end; + +	node_clear_state(node, N_CPU); +end: +	put_online_cpus(); +} +  /*   * Use the cpu notifier to insure that the thresholds are recalculated   * when necessary. @@ -1258,6 +1287,7 @@ static int vmstat_cpuup_callback(struct notifier_block *nfb,  	case CPU_DEAD:  	case CPU_DEAD_FROZEN:  		refresh_zone_stat_thresholds(); +		vmstat_cpu_dead(cpu_to_node(cpu));  		break;  	default:  		break; @@ -1274,10 +1304,14 @@ static int __init setup_vmstat(void)  #ifdef CONFIG_SMP  	int cpu; -	register_cpu_notifier(&vmstat_notifier); +	cpu_notifier_register_begin(); +	__register_cpu_notifier(&vmstat_notifier); -	for_each_online_cpu(cpu) +	for_each_online_cpu(cpu) {  		start_cpu_timer(cpu); +		node_set_state(cpu_to_node(cpu), N_CPU); +	} +	cpu_notifier_register_done();  #endif  #ifdef CONFIG_PROC_FS  	proc_create("buddyinfo", S_IRUGO, NULL, &fragmentation_file_operations);  | 
