mm: enable zeroed pages

Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 3d099e8..bbebc20 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1312,6 +1312,7 @@
 	struct per_cpu_pages *pcp;
 	unsigned long flags;
 	int migratetype;
+	int ok_to_zero = !(in_interrupt() || in_atomic());
 	int wasMlocked = __TestClearPageMlocked(page);
 
 	if (!free_pages_prepare(page, 0))
@@ -1340,12 +1341,18 @@
 	}
 
 	pcp = &this_cpu_ptr(zone->pageset)->pcp;
-	if (cold)
+	if (cold) {
 		list_add_tail(&page->lru,
 			      &pcp->lists[migratetype][NOTZEROED_PAGE]);
-	else
+		pcp->nzcount++;
+	} else if (ok_to_zero && pcp->nzcount > pcp->zcount) {
+		clear_highpage(page);
+		list_add(&page->lru, &pcp->lists[migratetype][ZEROED_PAGE]);
+		pcp->zcount++;
+	} else {
 		list_add(&page->lru, &pcp->lists[migratetype][NOTZEROED_PAGE]);
-	pcp->nzcount++;
+		pcp->nzcount++;
+	}
 	if (pcp->nzcount + pcp->zcount >= pcp->high)
 		free_pcppages_bulk(zone, pcp->batch, pcp);