diff options
| author | Christoph Lameter <[email protected]> | 2006-12-07 04:33:02 +0000 |
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2006-12-07 16:39:23 +0000 |
| commit | bc4ba393c007248f76c05945abb7b7b892cdd1cc (patch) | |
| tree | 3c2cf7e13ecf991c58ffc00617757fcdeb3d863f /mm | |
| parent | [PATCH] Remove uses of kmem_cache_t from mm/* and include/linux/slab.h (diff) | |
| download | kernel-bc4ba393c007248f76c05945abb7b7b892cdd1cc.tar.gz kernel-bc4ba393c007248f76c05945abb7b7b892cdd1cc.zip | |
[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 <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/page_alloc.c | 10 |
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); } } |
