diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index a840e702722cc78fd342aeed2511bc909480ccb8..86f2984f8b7941a5d62fc41bfef6e00871feeed7 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);
 			}
 		}