From: zhongjinji <zhongjinji@xxxxxxxxx> In the past, nr_reserved_highatomic was considered to be part of unusable_free when there was no ALLOC_RESERVES flag. To prevent unusable_free from being too large, it is reasonable to set a fixed maximum highatomic value. Even if the maximum number of highatomic pageblocks is set to be larger, unusable_free may not increase, since Yu Zhao provided the modification about nr_free_highatomic in https://lore.kernel.org/all/20241028182653.3420139-1-yuzhao@xxxxxxxxxx/T/#u More highatomic pageblocks are beneficial for the successful allocation of high-order page, which is helpful in some devices. Therefore, use highatomic_reserve_ratio to adjust the maximum number of highatomic pageblocks. Signed-off-by: zhongjinji <zhongjinji@xxxxxxxxx> --- mm/page_alloc.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 579789600a3c..dbdce6a0f694 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -273,6 +273,7 @@ int min_free_kbytes = 1024; int user_min_free_kbytes = -1; static int watermark_boost_factor __read_mostly = 15000; static int watermark_scale_factor = 10; +static int highatomic_reserve_ratio = 10; /* movable_zone is the "real" zone pages in ZONE_MOVABLE are taken from */ int movable_zone; @@ -2046,7 +2047,8 @@ static void reserve_highatomic_pageblock(struct page *page, int order, */ if ((zone_managed_pages(zone) / 100) < pageblock_nr_pages) return; - max_managed = ALIGN((zone_managed_pages(zone) / 100), pageblock_nr_pages); + max_managed = ALIGN((zone_managed_pages(zone) * highatomic_reserve_ratio / 1000), + pageblock_nr_pages); if (zone->nr_reserved_highatomic >= max_managed) return; @@ -6199,6 +6201,13 @@ static const struct ctl_table page_alloc_sysctl_table[] = { .mode = 0644, .proc_handler = percpu_pagelist_high_fraction_sysctl_handler, .extra1 = SYSCTL_ZERO, + }, + .procname = "highatomic_reserve_ratio", + .data = &highatomic_reserve_ratio, + .maxlen = sizeof(highatomic_reserve_ratio), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, }, { .procname = "lowmem_reserve_ratio", -- 2.17.1