Skip to content

Commit

Permalink
[PATCH] ZVC: Overstep counters
Browse files Browse the repository at this point in the history
Increments and decrements are usually grouped rather than mixed.  We can
optimize the inc and dec functions for that case.

Increment and decrement the counters by 50% more than the threshold in
those cases and set the differential accordingly.  This decreases the need
to update the atomic counters.

The idea came originally from Andrew Morton.  The overstepping alone was
sufficient to address the contention issue found when updating the global
and the per zone counters from 160 processors.

Also remove some code in dec_zone_page_state.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Christoph Lameter authored and Linus Torvalds committed Sep 1, 2006
1 parent b63fe1b commit a302eb4
Showing 1 changed file with 5 additions and 15 deletions.
20 changes: 5 additions & 15 deletions mm/vmstat.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,8 @@ static void __inc_zone_state(struct zone *zone, enum zone_stat_item item)
(*p)++;

if (unlikely(*p > STAT_THRESHOLD)) {
zone_page_state_add(*p, zone, item);
*p = 0;
zone_page_state_add(*p + STAT_THRESHOLD / 2, zone, item);
*p = -STAT_THRESHOLD / 2;
}
}

Expand All @@ -209,8 +209,8 @@ void __dec_zone_page_state(struct page *page, enum zone_stat_item item)
(*p)--;

if (unlikely(*p < -STAT_THRESHOLD)) {
zone_page_state_add(*p, zone, item);
*p = 0;
zone_page_state_add(*p - STAT_THRESHOLD / 2, zone, item);
*p = STAT_THRESHOLD /2;
}
}
EXPORT_SYMBOL(__dec_zone_page_state);
Expand Down Expand Up @@ -239,19 +239,9 @@ EXPORT_SYMBOL(inc_zone_page_state);
void dec_zone_page_state(struct page *page, enum zone_stat_item item)
{
unsigned long flags;
struct zone *zone;
s8 *p;

zone = page_zone(page);
local_irq_save(flags);
p = diff_pointer(zone, item);

(*p)--;

if (unlikely(*p < -STAT_THRESHOLD)) {
zone_page_state_add(*p, zone, item);
*p = 0;
}
__dec_zone_page_state(page, item);
local_irq_restore(flags);
}
EXPORT_SYMBOL(dec_zone_page_state);
Expand Down

0 comments on commit a302eb4

Please sign in to comment.