From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from m16.mail.163.com (m16.mail.163.com [117.135.210.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D16B92FDC20 for ; Fri, 10 Apr 2026 11:26:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=117.135.210.3 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775820415; cv=none; b=Uby6QGer8wGVY85++3bs3AN+Se+RiLvrFnkKf24RoLIuzdotYDhM2p9LiJdGKROMZYU+xAmVILjLh0lQa0FzDOhLvQKEe7UsrwO5zmUyanY1xYTrKaSm2dy/tJWCme4uQv+1AtFqmCiWO5ZT6A1vec0MDHEfYEjmnXjjXpB50js= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775820415; c=relaxed/simple; bh=jC57chDsDZ7PyLSyztCUKnJJQsX9PUvZjr8EpcqqhUs=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=pH8d3E1uNnCC5ItJmlOqg0aQU7DK9qCsYAeTyGZyPlfw4zEurOGkcVSRcGDlzQVM7y5USmFQAkEFhzhgsIwTh4Ojt2jnXMcb7hoboqu/w0OU+69lEwY8KLaJNjQcmb1ktQE7n9mKNlINMyZKhEq0xTVwwHcdDrsu67Pj48HaQAQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=163.com; spf=pass smtp.mailfrom=163.com; dkim=pass (1024-bit key) header.d=163.com header.i=@163.com header.b=mnQfO/NX; arc=none smtp.client-ip=117.135.210.3 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=163.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=163.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=163.com header.i=@163.com header.b="mnQfO/NX" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=QK 5aDz/JApH7Hqn3dICtUg98ezuf5oFq92vgm9PsAPo=; b=mnQfO/NXtWz4oqGhtV T9N9oAffotp8XN4AHWrxVXHyKkgw6RdjfaBl77vDYGtMNfKespaAIZAS9FKjPRvF QxtAHgLRbxUOgp+sDnJ0Qjj4RaICSoxIquR7q76tnyTk12Nc6e6R49sf1vaiN/Jq F+4Yksmz2hv7Z8RJunjleQ/pc= Received: from localhost.localdomain (unknown []) by gzsmtp4 (Coremail) with SMTP id PygvCgDHJatD3thpkDE+Vg--.269S2; Fri, 10 Apr 2026 19:25:59 +0800 (CST) From: Cao Ruichuang To: Andrew Morton , linux-mm@kvack.org Cc: David Hildenbrand , Lorenzo Stoakes , "Liam R . Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , linux-kernel@vger.kernel.org, Cao Ruichuang Subject: [PATCH] mm/vmstat: reject invalid stat_interval values Date: Fri, 10 Apr 2026 19:25:54 +0800 Message-Id: <20260410112554.23165-1-create0818@163.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID:PygvCgDHJatD3thpkDE+Vg--.269S2 X-Coremail-Antispam: 1Uf129KBjvJXoW7Kr4kXFyUAryxuF4xur1kAFb_yoW8KF1xp3 98GryUtw45G3WSganxAF4UZr4akrs7u34jkrnrJ34Sq3Z8K343Zrn5GrW2yF17Cry8XF1f X3yqy3s8uayYyFDanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0JUj9akUUUUU= X-CM-SenderInfo: pfuht3jhqyimi6rwjhhfrp/xtbC6Ahak2nY3kgRbwAA3w vm.stat_interval is exposed in seconds, but proc_dointvec_jiffies() currently accepts zero and negative values. In the current tree, writing 0 succeeds and leaves /proc/sys/vm/stat_interval at 0. vmstat_update() uses the stored jiffy interval directly when it requeues its delayed work, so a zero interval can drive excessive kworker CPU usage. Negative values are not meaningful either. Switch vm.stat_interval to a small custom sysctl handler that keeps the existing seconds-based userspace ABI while rejecting values below 1 and capping the upper bound at INT_MAX / HZ. Link: https://bugzilla.kernel.org/show_bug.cgi?id=220226 Signed-off-by: Cao Ruichuang --- mm/vmstat.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/mm/vmstat.c b/mm/vmstat.c index 86b14b0f77b..f48d3bdad64 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1964,6 +1964,7 @@ static const struct seq_operations vmstat_op = { #ifdef CONFIG_SMP static DEFINE_PER_CPU(struct delayed_work, vmstat_work); static int sysctl_stat_interval __read_mostly = HZ; +static const int sysctl_stat_interval_max = INT_MAX / HZ; static int vmstat_late_init_done; #ifdef CONFIG_PROC_FS @@ -1972,6 +1973,26 @@ static void refresh_vm_stats(struct work_struct *work) refresh_cpu_vm_stats(true); } +static int vmstat_stat_interval_handler(const struct ctl_table *table, int write, + void *buffer, size_t *lenp, loff_t *ppos) +{ + int interval = sysctl_stat_interval / HZ; + const struct ctl_table tmp = { + .data = &interval, + .maxlen = sizeof(interval), + .mode = table->mode, + .extra1 = SYSCTL_ONE, + .extra2 = (void *)&sysctl_stat_interval_max, + }; + int ret; + + ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); + if (!ret && write) + sysctl_stat_interval = interval * HZ; + + return ret; +} + static int vmstat_refresh(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos) { @@ -2236,7 +2257,7 @@ static const struct ctl_table vmstat_table[] = { .data = &sysctl_stat_interval, .maxlen = sizeof(sysctl_stat_interval), .mode = 0644, - .proc_handler = proc_dointvec_jiffies, + .proc_handler = vmstat_stat_interval_handler, }, { .procname = "stat_refresh", -- 2.39.5 (Apple Git-154)