Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mm/page_alloc: only update lowmem_reserve_ratio on sysctl write
@ 2026-07-28 10:32 Jianlin Shi
  2026-07-30 15:28 ` Vlastimil Babka (SUSE)
  2026-07-31  3:42 ` [PATCH v2] " Jianlin Shi
  0 siblings, 2 replies; 6+ messages in thread
From: Jianlin Shi @ 2026-07-28 10:32 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, vbabka, linux-kernel

lowmem_reserve_ratio_sysctl_handler() ignores the return value of
proc_dointvec_minmax() and always sanitizes sysctl_lowmem_reserve_ratio
and calls setup_per_zone_lowmem_reserve(), even for read operations.

Reading /proc/sys/vm/lowmem_reserve_ratio should not recompute per-zone
lowmem_reserve[] and totalreserve_pages.  Only do so when the sysctl is
written, matching min_free_kbytes and watermark_scale_factor handlers.

Also propagate errors from proc_dointvec_minmax() instead of ignoring
them.

Compatibility note:
Previously a read also sanitized sysctl_lowmem_reserve_ratio[] and
called setup_per_zone_lowmem_reserve(), which rewrites each zone's
lowmem_reserve[] and recalculates pgdat->totalreserve_pages /
totalreserve_pages (visible via /proc/zoneinfo "protection" and used
by page allocation fallback and dirty-limit accounting).  After this
change only a write does that.  Documentation describes the meaning of
the ratio and the derived protection pages, but does not document any
read side-effect.

Worst case for odd userspace that treated a read as a refresh of those
derived values: lowmem_reserve[] and totalreserve_pages remain at their
last written/setup values until the next write of this sysctl, or until
another existing updater runs (e.g. adjust_managed_page_count() on
managed-page changes, or init/watermark setup paths).  Until then,
allocation fallback into lower zones and per-node dirtyable memory
(node_dirtyable_memory() subtracts pgdat->totalreserve_pages) may not
reflect a refresh that such userspace expected from the read alone.
Normal readers that only consume the ratio array are unaffected.

Signed-off-by: Jianlin Shi <shijianlin11@foxmail.com>
---
 mm/page_alloc.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 0387d2afd..ce33579ca 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6683,16 +6683,21 @@ static int sysctl_min_slab_ratio_sysctl_handler(const struct ctl_table *table, i
 static int lowmem_reserve_ratio_sysctl_handler(const struct ctl_table *table,
 		int write, void *buffer, size_t *length, loff_t *ppos)
 {
-	int i;
+	int i, rc;
 
-	proc_dointvec_minmax(table, write, buffer, length, ppos);
+	rc = proc_dointvec_minmax(table, write, buffer, length, ppos);
+	if (rc)
+		return rc;
 
-	for (i = 0; i < MAX_NR_ZONES; i++) {
-		if (sysctl_lowmem_reserve_ratio[i] < 1)
-			sysctl_lowmem_reserve_ratio[i] = 0;
+	if (write) {
+		for (i = 0; i < MAX_NR_ZONES; i++) {
+			if (sysctl_lowmem_reserve_ratio[i] < 1)
+				sysctl_lowmem_reserve_ratio[i] = 0;
+		}
+
+		setup_per_zone_lowmem_reserve();
 	}
 
-	setup_per_zone_lowmem_reserve();
 	return 0;
 }
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-08-01  7:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-28 10:32 [PATCH] mm/page_alloc: only update lowmem_reserve_ratio on sysctl write Jianlin Shi
2026-07-30 15:28 ` Vlastimil Babka (SUSE)
2026-07-31  3:36   ` Jianlin Shi
2026-07-31  3:42 ` [PATCH v2] " Jianlin Shi
2026-07-31  8:06   ` Vlastimil Babka (SUSE)
2026-08-01  7:36   ` Johannes Weiner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox