From 3086328d5ff69cee18399a68dd9fd9c5f10a4c2d Mon Sep 17 00:00:00 2001 From: Vinayak Menon Date: Thu, 26 Mar 2015 11:58:45 +0530 Subject: mm: page-writeback: fix page state calculation in throttle_vm_writeout It was found that a number of tasks were blocked in the reclaim path (throttle_vm_writeout) for seconds, because of vmstat_diff not being synced in time. Fix that by adding a new function global_page_state_snapshot. Signed-off-by: Vinayak Menon Change-Id: Iec167635ad724a55c27bdbd49eb8686e7857216c --- include/linux/vmstat.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'include/linux/vmstat.h') diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 3e5d9075960f..aed05ca3e911 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -160,6 +160,26 @@ static inline unsigned long zone_page_state_snapshot(struct zone *zone, return x; } +static inline unsigned long global_page_state_snapshot(enum zone_stat_item item) +{ + long x = atomic_long_read(&vm_stat[item]); + +#ifdef CONFIG_SMP + struct zone *zone; + int cpu; + + for_each_online_cpu(cpu) { + for_each_populated_zone(zone) + x += per_cpu_ptr(zone->pageset, + cpu)->vm_stat_diff[item]; + } + + if (x < 0) + x = 0; +#endif + return x; +} + #ifdef CONFIG_NUMA extern unsigned long node_page_state(int node, enum zone_stat_item item); -- cgit v1.2.3