summaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2006-12-06 20:33:02 -0800
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-07 08:39:23 -0800
commitbc4ba393c007248f76c05945abb7b7b892cdd1cc (patch)
tree3c2cf7e13ecf991c58ffc00617757fcdeb3d863f /mm/page_alloc.c
parentebe29738f3934ad6a93c8bd76e30aa5d797a269d (diff)
downloadlinux-bc4ba393c007248f76c05945abb7b7b892cdd1cc.tar.bz2
[PATCH] drain_node_page(): Drain pages in batch units
drain_node_pages() currently drains the complete pageset of all pages. If there are a large number of pages in the queues then we may hold off interrupts for too long. Duplicate the method used in free_hot_cold_page. Only drain pcp->batch pages at one time. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index a840e702722c..86f2984f8b79 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -685,9 +685,15 @@ void drain_node_pages(int nodeid)
pcp = &pset->pcp[i];
if (pcp->count) {
+ int to_drain;
+
local_irq_save(flags);
- free_pages_bulk(zone, pcp->count, &pcp->list, 0);
- pcp->count = 0;
+ if (pcp->count >= pcp->batch)
+ to_drain = pcp->batch;
+ else
+ to_drain = pcp->count;
+ free_pages_bulk(zone, to_drain, &pcp->list, 0);
+ pcp->count -= to_drain;
local_irq_restore(flags);
}
}