|
@@ -234,6 +234,12 @@ static void bad_page(struct page *page)
|
|
|
static unsigned long nr_shown;
|
|
|
static unsigned long nr_unshown;
|
|
|
|
|
|
+ /* Don't complain about poisoned pages */
|
|
|
+ if (PageHWPoison(page)) {
|
|
|
+ __ClearPageBuddy(page);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Allow a burst of 60 reports, then keep quiet for that minute;
|
|
|
* or allow a steady drip of one report per second.
|
|
@@ -646,7 +652,7 @@ static inline void expand(struct zone *zone, struct page *page,
|
|
|
/*
|
|
|
* This page is about to be returned from the page allocator
|
|
|
*/
|
|
|
-static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
|
|
|
+static inline int check_new_page(struct page *page)
|
|
|
{
|
|
|
if (unlikely(page_mapcount(page) |
|
|
|
(page->mapping != NULL) |
|
|
@@ -655,6 +661,18 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
|
|
|
bad_page(page);
|
|
|
return 1;
|
|
|
}
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < (1 << order); i++) {
|
|
|
+ struct page *p = page + i;
|
|
|
+ if (unlikely(check_new_page(p)))
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
|
|
|
set_page_private(page, 0);
|
|
|
set_page_refcounted(page);
|