162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <linux/mm.h> 362306a36Sopenharmony_ci#include <linux/page-isolation.h> 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciunsigned int _debug_guardpage_minorder; 662306a36Sopenharmony_ci 762306a36Sopenharmony_cibool _debug_pagealloc_enabled_early __read_mostly 862306a36Sopenharmony_ci = IS_ENABLED(CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT); 962306a36Sopenharmony_ciEXPORT_SYMBOL(_debug_pagealloc_enabled_early); 1062306a36Sopenharmony_ciDEFINE_STATIC_KEY_FALSE(_debug_pagealloc_enabled); 1162306a36Sopenharmony_ciEXPORT_SYMBOL(_debug_pagealloc_enabled); 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciDEFINE_STATIC_KEY_FALSE(_debug_guardpage_enabled); 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic int __init early_debug_pagealloc(char *buf) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci return kstrtobool(buf, &_debug_pagealloc_enabled_early); 1862306a36Sopenharmony_ci} 1962306a36Sopenharmony_ciearly_param("debug_pagealloc", early_debug_pagealloc); 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistatic int __init debug_guardpage_minorder_setup(char *buf) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci unsigned long res; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci if (kstrtoul(buf, 10, &res) < 0 || res > MAX_ORDER / 2) { 2662306a36Sopenharmony_ci pr_err("Bad debug_guardpage_minorder value\n"); 2762306a36Sopenharmony_ci return 0; 2862306a36Sopenharmony_ci } 2962306a36Sopenharmony_ci _debug_guardpage_minorder = res; 3062306a36Sopenharmony_ci pr_info("Setting debug_guardpage_minorder to %lu\n", res); 3162306a36Sopenharmony_ci return 0; 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ciearly_param("debug_guardpage_minorder", debug_guardpage_minorder_setup); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cibool __set_page_guard(struct zone *zone, struct page *page, unsigned int order, 3662306a36Sopenharmony_ci int migratetype) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci if (order >= debug_guardpage_minorder()) 3962306a36Sopenharmony_ci return false; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci __SetPageGuard(page); 4262306a36Sopenharmony_ci INIT_LIST_HEAD(&page->buddy_list); 4362306a36Sopenharmony_ci set_page_private(page, order); 4462306a36Sopenharmony_ci /* Guard pages are not available for any usage */ 4562306a36Sopenharmony_ci if (!is_migrate_isolate(migratetype)) 4662306a36Sopenharmony_ci __mod_zone_freepage_state(zone, -(1 << order), migratetype); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci return true; 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_civoid __clear_page_guard(struct zone *zone, struct page *page, unsigned int order, 5262306a36Sopenharmony_ci int migratetype) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci __ClearPageGuard(page); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci set_page_private(page, 0); 5762306a36Sopenharmony_ci if (!is_migrate_isolate(migratetype)) 5862306a36Sopenharmony_ci __mod_zone_freepage_state(zone, (1 << order), migratetype); 5962306a36Sopenharmony_ci} 60