diff options
Diffstat (limited to 'mm/vmstat.c')
-rw-r--r-- | mm/vmstat.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/mm/vmstat.c b/mm/vmstat.c index 8a8da1f9b044..aaee66330e01 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
@@ -415,11 +415,7 @@ EXPORT_SYMBOL(dec_zone_page_state); | |||
415 | #endif | 415 | #endif |
416 | 416 | ||
417 | /* | 417 | /* |
418 | * Update the zone counters for one cpu. | 418 | * Update the zone counters for the current cpu. |
419 | * | ||
420 | * The cpu specified must be either the current cpu or a processor that | ||
421 | * is not online. If it is the current cpu then the execution thread must | ||
422 | * be pinned to the current cpu. | ||
423 | * | 419 | * |
424 | * Note that refresh_cpu_vm_stats strives to only access | 420 | * Note that refresh_cpu_vm_stats strives to only access |
425 | * node local memory. The per cpu pagesets on remote zones are placed | 421 | * node local memory. The per cpu pagesets on remote zones are placed |
@@ -432,7 +428,7 @@ EXPORT_SYMBOL(dec_zone_page_state); | |||
432 | * with the global counters. These could cause remote node cache line | 428 | * with the global counters. These could cause remote node cache line |
433 | * bouncing and will have to be only done when necessary. | 429 | * bouncing and will have to be only done when necessary. |
434 | */ | 430 | */ |
435 | void refresh_cpu_vm_stats(int cpu) | 431 | static void refresh_cpu_vm_stats(int cpu) |
436 | { | 432 | { |
437 | struct zone *zone; | 433 | struct zone *zone; |
438 | int i; | 434 | int i; |
@@ -494,6 +490,38 @@ void refresh_cpu_vm_stats(int cpu) | |||
494 | } | 490 | } |
495 | 491 | ||
496 | /* | 492 | /* |
493 | * Fold the data for an offline cpu into the global array. | ||
494 | * There cannot be any access by the offline cpu and therefore | ||
495 | * synchronization is simplified. | ||
496 | */ | ||
497 | void cpu_vm_stats_fold(int cpu) | ||
498 | { | ||
499 | struct zone *zone; | ||
500 | int i; | ||
501 | int global_diff[NR_VM_ZONE_STAT_ITEMS] = { 0, }; | ||
502 | |||
503 | for_each_populated_zone(zone) { | ||
504 | struct per_cpu_pageset *p; | ||
505 | |||
506 | p = per_cpu_ptr(zone->pageset, cpu); | ||
507 | |||
508 | for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) | ||
509 | if (p->vm_stat_diff[i]) { | ||
510 | int v; | ||
511 | |||
512 | v = p->vm_stat_diff[i]; | ||
513 | p->vm_stat_diff[i] = 0; | ||
514 | atomic_long_add(v, &zone->vm_stat[i]); | ||
515 | global_diff[i] += v; | ||
516 | } | ||
517 | } | ||
518 | |||
519 | for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) | ||
520 | if (global_diff[i]) | ||
521 | atomic_long_add(global_diff[i], &vm_stat[i]); | ||
522 | } | ||
523 | |||
524 | /* | ||
497 | * this is only called if !populated_zone(zone), which implies no other users of | 525 | * this is only called if !populated_zone(zone), which implies no other users of |
498 | * pset->vm_stat_diff[] exsist. | 526 | * pset->vm_stat_diff[] exsist. |
499 | */ | 527 | */ |