|
@@ -637,17 +637,20 @@ static int __init debug_guardpage_minorder_setup(char *buf)
|
|
|
}
|
|
|
__setup("debug_guardpage_minorder=", debug_guardpage_minorder_setup);
|
|
|
|
|
|
-static inline void set_page_guard(struct zone *zone, struct page *page,
|
|
|
+static inline bool set_page_guard(struct zone *zone, struct page *page,
|
|
|
unsigned int order, int migratetype)
|
|
|
{
|
|
|
struct page_ext *page_ext;
|
|
|
|
|
|
if (!debug_guardpage_enabled())
|
|
|
- return;
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (order >= debug_guardpage_minorder())
|
|
|
+ return false;
|
|
|
|
|
|
page_ext = lookup_page_ext(page);
|
|
|
if (unlikely(!page_ext))
|
|
|
- return;
|
|
|
+ return false;
|
|
|
|
|
|
__set_bit(PAGE_EXT_DEBUG_GUARD, &page_ext->flags);
|
|
|
|
|
@@ -655,6 +658,8 @@ static inline void set_page_guard(struct zone *zone, struct page *page,
|
|
|
set_page_private(page, order);
|
|
|
/* Guard pages are not available for any usage */
|
|
|
__mod_zone_freepage_state(zone, -(1 << order), migratetype);
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
static inline void clear_page_guard(struct zone *zone, struct page *page,
|
|
@@ -677,8 +682,8 @@ static inline void clear_page_guard(struct zone *zone, struct page *page,
|
|
|
}
|
|
|
#else
|
|
|
struct page_ext_operations debug_guardpage_ops = { NULL, };
|
|
|
-static inline void set_page_guard(struct zone *zone, struct page *page,
|
|
|
- unsigned int order, int migratetype) {}
|
|
|
+static inline bool set_page_guard(struct zone *zone, struct page *page,
|
|
|
+ unsigned int order, int migratetype) { return false; }
|
|
|
static inline void clear_page_guard(struct zone *zone, struct page *page,
|
|
|
unsigned int order, int migratetype) {}
|
|
|
#endif
|
|
@@ -1622,18 +1627,15 @@ static inline void expand(struct zone *zone, struct page *page,
|
|
|
size >>= 1;
|
|
|
VM_BUG_ON_PAGE(bad_range(zone, &page[size]), &page[size]);
|
|
|
|
|
|
- if (IS_ENABLED(CONFIG_DEBUG_PAGEALLOC) &&
|
|
|
- debug_guardpage_enabled() &&
|
|
|
- high < debug_guardpage_minorder()) {
|
|
|
- /*
|
|
|
- * Mark as guard pages (or page), that will allow to
|
|
|
- * merge back to allocator when buddy will be freed.
|
|
|
- * Corresponding page table entries will not be touched,
|
|
|
- * pages will stay not present in virtual address space
|
|
|
- */
|
|
|
- set_page_guard(zone, &page[size], high, migratetype);
|
|
|
+ /*
|
|
|
+ * Mark as guard pages (or page), that will allow to
|
|
|
+ * merge back to allocator when buddy will be freed.
|
|
|
+ * Corresponding page table entries will not be touched,
|
|
|
+ * pages will stay not present in virtual address space
|
|
|
+ */
|
|
|
+ if (set_page_guard(zone, &page[size], high, migratetype))
|
|
|
continue;
|
|
|
- }
|
|
|
+
|
|
|
list_add(&page[size].lru, &area->free_list[migratetype]);
|
|
|
area->nr_free++;
|
|
|
set_page_order(&page[size], high);
|