From: Christoph Lameter Date: Thu, 7 Dec 2006 04:33:02 +0000 (-0800) Subject: [PATCH] drain_node_page(): Drain pages in batch units X-Git-Tag: v2.6.20-rc1~15^2~14^2~326 X-Git-Url: http://ftp.safe.ca/?a=commitdiff_plain;h=bc4ba393c007248f76c05945abb7b7b892cdd1cc;p=safe%2Fjmp%2Flinux-2.6 [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 Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a840e70..86f2984 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); } }