|
@@ -1405,15 +1405,24 @@ static inline int check_new_page(struct page *page)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline bool free_pages_prezeroed(bool poisoned)
|
|
|
|
+{
|
|
|
|
+ return IS_ENABLED(CONFIG_PAGE_POISONING_ZERO) &&
|
|
|
|
+ page_poisoning_enabled() && poisoned;
|
|
|
|
+}
|
|
|
|
+
|
|
static int prep_new_page(struct page *page, unsigned int order, gfp_t gfp_flags,
|
|
static int prep_new_page(struct page *page, unsigned int order, gfp_t gfp_flags,
|
|
int alloc_flags)
|
|
int alloc_flags)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
|
|
+ bool poisoned = true;
|
|
|
|
|
|
for (i = 0; i < (1 << order); i++) {
|
|
for (i = 0; i < (1 << order); i++) {
|
|
struct page *p = page + i;
|
|
struct page *p = page + i;
|
|
if (unlikely(check_new_page(p)))
|
|
if (unlikely(check_new_page(p)))
|
|
return 1;
|
|
return 1;
|
|
|
|
+ if (poisoned)
|
|
|
|
+ poisoned &= page_is_poisoned(p);
|
|
}
|
|
}
|
|
|
|
|
|
set_page_private(page, 0);
|
|
set_page_private(page, 0);
|
|
@@ -1424,7 +1433,7 @@ static int prep_new_page(struct page *page, unsigned int order, gfp_t gfp_flags,
|
|
kernel_poison_pages(page, 1 << order, 1);
|
|
kernel_poison_pages(page, 1 << order, 1);
|
|
kasan_alloc_pages(page, order);
|
|
kasan_alloc_pages(page, order);
|
|
|
|
|
|
- if (gfp_flags & __GFP_ZERO)
|
|
|
|
|
|
+ if (!free_pages_prezeroed(poisoned) && (gfp_flags & __GFP_ZERO))
|
|
for (i = 0; i < (1 << order); i++)
|
|
for (i = 0; i < (1 << order); i++)
|
|
clear_highpage(page + i);
|
|
clear_highpage(page + i);
|
|
|
|
|