aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Piggin <nickpiggin@yahoo.com.au>2006-01-06 03:11:00 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-06 11:33:25 -0500
commita86b1f53166a260ced8f3c8c526945bf496f2e78 (patch)
tree5513bccce91fed08d4769fd18e0f527a84aea508
parent2d92c5c9150a2a9ca3dc25da58d5042e17a96b6a (diff)
[PATCH] mm: page_state fixes
read_page_state and __get_page_state only traverse online CPUs, which will cause results to fluctuate when CPUs are plugged in or out. Signed-off-by: Nick Piggin <npiggin@suse.de> Cc: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--mm/page_alloc.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 7cff958e7813..379618747deb 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1169,12 +1169,11 @@ EXPORT_SYMBOL(nr_pagecache);
1169DEFINE_PER_CPU(long, nr_pagecache_local) = 0; 1169DEFINE_PER_CPU(long, nr_pagecache_local) = 0;
1170#endif 1170#endif
1171 1171
1172void __get_page_state(struct page_state *ret, int nr, cpumask_t *cpumask) 1172static void __get_page_state(struct page_state *ret, int nr, cpumask_t *cpumask)
1173{ 1173{
1174 int cpu = 0; 1174 int cpu = 0;
1175 1175
1176 memset(ret, 0, sizeof(*ret)); 1176 memset(ret, 0, sizeof(*ret));
1177 cpus_and(*cpumask, *cpumask, cpu_online_map);
1178 1177
1179 cpu = first_cpu(*cpumask); 1178 cpu = first_cpu(*cpumask);
1180 while (cpu < NR_CPUS) { 1179 while (cpu < NR_CPUS) {
@@ -1227,7 +1226,7 @@ unsigned long __read_page_state(unsigned long offset)
1227 unsigned long ret = 0; 1226 unsigned long ret = 0;
1228 int cpu; 1227 int cpu;
1229 1228
1230 for_each_online_cpu(cpu) { 1229 for_each_cpu(cpu) {
1231 unsigned long in; 1230 unsigned long in;
1232 1231
1233 in = (unsigned long)&per_cpu(page_states, cpu) + offset; 1232 in = (unsigned long)&per_cpu(page_states, cpu) + offset;