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 Index: linux-2.6.19-rc5-mm2/mm/page_alloc.c =================================================================== --- linux-2.6.19-rc5-mm2.orig/mm/page_alloc.c 2006-11-17 13:28:39.492284421 -0600 +++ linux-2.6.19-rc5-mm2/mm/page_alloc.c 2006-11-21 14:53:39.313626619 -0600 @@ -705,9 +705,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); } }