Commit e236a166 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] mm: dirty_exceeded speedup

Ravikiran reports that this variable is bouncing all around nodes on NUMA
machines, causing measurable performance problems.  Fix that up by only
writing to it when it actually changed.

And put it in a new cacheline to prevent it sharing with other things (this
happened).
Signed-off-by: default avatarRavikiran Thirumalai <kiran@scalex86.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c2aeacd4
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
static long ratelimit_pages = 32; static long ratelimit_pages = 32;
static long total_pages; /* The total number of pages in the machine. */ static long total_pages; /* The total number of pages in the machine. */
static int dirty_exceeded; /* Dirty mem may be over limit */ static int dirty_exceeded __cacheline_aligned_in_smp; /* Dirty mem may be over limit */
/* /*
* When balance_dirty_pages decides that the caller needs to perform some * When balance_dirty_pages decides that the caller needs to perform some
...@@ -212,6 +212,7 @@ static void balance_dirty_pages(struct address_space *mapping) ...@@ -212,6 +212,7 @@ static void balance_dirty_pages(struct address_space *mapping)
if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh) if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh)
break; break;
if (!dirty_exceeded)
dirty_exceeded = 1; dirty_exceeded = 1;
/* Note: nr_reclaimable denotes nr_dirty + nr_unstable. /* Note: nr_reclaimable denotes nr_dirty + nr_unstable.
...@@ -234,7 +235,7 @@ static void balance_dirty_pages(struct address_space *mapping) ...@@ -234,7 +235,7 @@ static void balance_dirty_pages(struct address_space *mapping)
blk_congestion_wait(WRITE, HZ/10); blk_congestion_wait(WRITE, HZ/10);
} }
if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh) if (nr_reclaimable + wbs.nr_writeback <= dirty_thresh && dirty_exceeded)
dirty_exceeded = 0; dirty_exceeded = 0;
if (writeback_in_progress(bdi)) if (writeback_in_progress(bdi))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment