Skip to content

Commit

Permalink
vmstat: small revisions to refresh_cpu_vm_stats()
Browse files Browse the repository at this point in the history
1. Add comments explaining how the function can be called.

2. Collect global diffs in a local array and only spill
   them once into the global counters when the zone scan
   is finished. This means that we only touch each global
   counter once instead of each time we fold cpu counters
   into zone counters.

Signed-off-by: Christoph Lameter <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Christoph Lameter authored and Linus Torvalds committed Feb 5, 2008
1 parent 08e7d9b commit a7f75e2
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions mm/vmstat.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,10 @@ EXPORT_SYMBOL(dec_zone_page_state);
/*
* Update the zone counters for one cpu.
*
* The cpu specified must be either the current cpu or a processor that
* is not online. If it is the current cpu then the execution thread must
* be pinned to the current cpu.
*
* Note that refresh_cpu_vm_stats strives to only access
* node local memory. The per cpu pagesets on remote zones are placed
* in the memory local to the processor using that pageset. So the
Expand All @@ -299,7 +303,7 @@ void refresh_cpu_vm_stats(int cpu)
{
struct zone *zone;
int i;
unsigned long flags;
int global_diff[NR_VM_ZONE_STAT_ITEMS] = { 0, };

for_each_zone(zone) {
struct per_cpu_pageset *p;
Expand All @@ -311,15 +315,19 @@ void refresh_cpu_vm_stats(int cpu)

for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
if (p->vm_stat_diff[i]) {
unsigned long flags;
int v;

local_irq_save(flags);
zone_page_state_add(p->vm_stat_diff[i],
zone, i);
v = p->vm_stat_diff[i];
p->vm_stat_diff[i] = 0;
local_irq_restore(flags);
atomic_long_add(v, &zone->vm_stat[i]);
global_diff[i] += v;
#ifdef CONFIG_NUMA
/* 3 seconds idle till flush */
p->expire = 3;
#endif
local_irq_restore(flags);
}
#ifdef CONFIG_NUMA
/*
Expand Down Expand Up @@ -351,6 +359,10 @@ void refresh_cpu_vm_stats(int cpu)
drain_zone_pages(zone, p->pcp + 1);
#endif
}

for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
if (global_diff[i])
atomic_long_add(global_diff[i], &vm_stat[i]);
}

#endif
Expand Down

0 comments on commit a7f75e2

Please sign in to comment.