Linux filesystem development
 help / color / mirror / Atom feed
* [PATCH] mm/oom_kill, proc: replace magic number 1000 with OOM_SCORE_ADJ_MAX
@ 2026-08-11  3:36 Ye Liu
  2026-08-11 12:58 ` Michal Hocko
  2026-08-18  1:04 ` Song Hu
  0 siblings, 2 replies; 5+ messages in thread
From: Ye Liu @ 2026-08-11  3:36 UTC (permalink / raw)
  To: Michal Hocko, Andrew Morton
  Cc: Ye Liu, David Rientjes, Shakeel Butt, linux-kernel, linux-fsdevel,
	linux-mm

From: Ye Liu <liuye@kylinos.cn>

In oom_badness() and proc_oom_score(), the oom_score_adj normalization
uses a hardcoded 1000, which is the value of OOM_SCORE_ADJ_MAX defined
in include/uapi/linux/oom.h.  Other code in the kernel (e.g.
fs/proc/base.c oom_adj handling) already uses OOM_SCORE_ADJ_MAX for
the same purpose.

Replace the magic number with the macro for consistency and
readability.  No functional change.

Signed-off-by: Ye Liu <liuye@kylinos.cn>
---
 fs/proc/base.c | 3 ++-
 mm/oom_kill.c  | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/proc/base.c b/fs/proc/base.c
index 6a39de424f62..58be38942460 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -594,7 +594,8 @@ static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns,
 	 * exporting for a long time so userspace might depend on it.
 	 */
 	if (badness != LONG_MIN)
-		points = (1000 + badness * 1000 / (long)totalpages) * 2 / 3;
+		points = (OOM_SCORE_ADJ_MAX +
+			  badness * OOM_SCORE_ADJ_MAX / (long)totalpages) * 2 / 3;
 
 	seq_printf(m, "%lu\n", points);
 
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 5f372f6e26fa..08bff7a55db8 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -230,7 +230,7 @@ long oom_badness(struct task_struct *p, unsigned long totalpages)
 	task_unlock(p);
 
 	/* Normalize to oom_score_adj units */
-	adj *= totalpages / 1000;
+	adj *= totalpages / OOM_SCORE_ADJ_MAX;
 	points += adj;
 
 	return points;
-- 
2.25.1


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

* Re: [PATCH] mm/oom_kill, proc: replace magic number 1000 with OOM_SCORE_ADJ_MAX
  2026-08-11  3:36 [PATCH] mm/oom_kill, proc: replace magic number 1000 with OOM_SCORE_ADJ_MAX Ye Liu
@ 2026-08-11 12:58 ` Michal Hocko
  2026-08-18  1:04 ` Song Hu
  1 sibling, 0 replies; 5+ messages in thread
From: Michal Hocko @ 2026-08-11 12:58 UTC (permalink / raw)
  To: Ye Liu
  Cc: Andrew Morton, Ye Liu, David Rientjes, Shakeel Butt, linux-kernel,
	linux-fsdevel, linux-mm

On Tue 11-08-26 11:36:08, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
> 
> In oom_badness() and proc_oom_score(), the oom_score_adj normalization
> uses a hardcoded 1000, which is the value of OOM_SCORE_ADJ_MAX defined
> in include/uapi/linux/oom.h.  Other code in the kernel (e.g.
> fs/proc/base.c oom_adj handling) already uses OOM_SCORE_ADJ_MAX for
> the same purpose.
> 
> Replace the magic number with the macro for consistency and
> readability.  No functional change.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>

I am not really sure this adds to the readability much TBH but no
fundamental objections from me.

Acked-by: Michal Hocko <mhocko@suse.com>

> ---
>  fs/proc/base.c | 3 ++-
>  mm/oom_kill.c  | 2 +-
>  2 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/proc/base.c b/fs/proc/base.c
> index 6a39de424f62..58be38942460 100644
> --- a/fs/proc/base.c
> +++ b/fs/proc/base.c
> @@ -594,7 +594,8 @@ static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns,
>  	 * exporting for a long time so userspace might depend on it.
>  	 */
>  	if (badness != LONG_MIN)
> -		points = (1000 + badness * 1000 / (long)totalpages) * 2 / 3;
> +		points = (OOM_SCORE_ADJ_MAX +
> +			  badness * OOM_SCORE_ADJ_MAX / (long)totalpages) * 2 / 3;
>  
>  	seq_printf(m, "%lu\n", points);
>  
> diff --git a/mm/oom_kill.c b/mm/oom_kill.c
> index 5f372f6e26fa..08bff7a55db8 100644
> --- a/mm/oom_kill.c
> +++ b/mm/oom_kill.c
> @@ -230,7 +230,7 @@ long oom_badness(struct task_struct *p, unsigned long totalpages)
>  	task_unlock(p);
>  
>  	/* Normalize to oom_score_adj units */
> -	adj *= totalpages / 1000;
> +	adj *= totalpages / OOM_SCORE_ADJ_MAX;
>  	points += adj;
>  
>  	return points;
> -- 
> 2.25.1

-- 
Michal Hocko
SUSE Labs

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

* Re: [PATCH] mm/oom_kill, proc: replace magic number 1000 with OOM_SCORE_ADJ_MAX
  2026-08-11  3:36 [PATCH] mm/oom_kill, proc: replace magic number 1000 with OOM_SCORE_ADJ_MAX Ye Liu
  2026-08-11 12:58 ` Michal Hocko
@ 2026-08-18  1:04 ` Song Hu
  2026-08-19  3:15   ` Ye Liu
  1 sibling, 1 reply; 5+ messages in thread
From: Song Hu @ 2026-08-18  1:04 UTC (permalink / raw)
  To: ye.liu
  Cc: akpm, linux-fsdevel, linux-kernel, linux-mm, liuye, mhocko,
	rientjes, shakeel.butt, husong

On 2026/8/11 11:36, Ye Liu wrote:
> --- a/mm/oom_kill.c
> +++ b/mm/oom_kill.c
> @@ -230,7 +230,7 @@ long oom_badness(struct task_struct *p, unsigned long totalpages)
>  	task_unlock(p);
>
>  	/* Normalize to oom_score_adj units */
> -	adj *= totalpages / 1000;
> +	adj *= totalpages / OOM_SCORE_ADJ_MAX;

One thing this line hides: for a memcg OOM, totalpages is
mem_cgroup_get_max(), which can be below 1000 pages when the
container limit is under 4M.  The division then yields 0, the whole
oom_score_adj contribution goes away, and a task protected with
-997 scores the same as a best-effort task with 1000.  The -1000
exemption is checked separately above and still works.

DIV_ROUND_UP(totalpages, OOM_SCORE_ADJ_MAX) would preserve the adj
weighting for small limits and change nothing meaningful for large
ones.  This is an edge case, so probably fine to leave as is -
noting it here since the line is being touched anyway.

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

* Re: [PATCH] mm/oom_kill, proc: replace magic number 1000 with OOM_SCORE_ADJ_MAX
  2026-08-18  1:04 ` Song Hu
@ 2026-08-19  3:15   ` Ye Liu
  2026-08-19  6:47     ` Michal Hocko
  0 siblings, 1 reply; 5+ messages in thread
From: Ye Liu @ 2026-08-19  3:15 UTC (permalink / raw)
  To: Song Hu
  Cc: akpm, linux-fsdevel, linux-kernel, linux-mm, liuye, mhocko,
	rientjes, shakeel.butt



在 2026/8/18 09:04, Song Hu 写道:
> On 2026/8/11 11:36, Ye Liu wrote:
>> --- a/mm/oom_kill.c
>> +++ b/mm/oom_kill.c
>> @@ -230,7 +230,7 @@ long oom_badness(struct task_struct *p, unsigned long totalpages)
>>  	task_unlock(p);
>>
>>  	/* Normalize to oom_score_adj units */
>> -	adj *= totalpages / 1000;
>> +	adj *= totalpages / OOM_SCORE_ADJ_MAX;
> 
> One thing this line hides: for a memcg OOM, totalpages is
> mem_cgroup_get_max(), which can be below 1000 pages when the
> container limit is under 4M.  The division then yields 0, the whole
> oom_score_adj contribution goes away, and a task protected with
> -997 scores the same as a best-effort task with 1000.  The -1000
> exemption is checked separately above and still works.
> 
> DIV_ROUND_UP(totalpages, OOM_SCORE_ADJ_MAX) would preserve the adj
> weighting for small limits and change nothing meaningful for large
> ones.  This is an edge case, so probably fine to leave as is -
> noting it here since the line is being touched anyway.

Good catch. Yes, the truncation for totalpages < 1000 is real, 
but as you noted, it's an existing edge case. I'll keep this patch 
as a mechanical replacement and won't address it here. Out of curiosity,
are sub-4MB memcg limits actually used in practice? 

-- 
Thanks,
Ye Liu


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

* Re: [PATCH] mm/oom_kill, proc: replace magic number 1000 with OOM_SCORE_ADJ_MAX
  2026-08-19  3:15   ` Ye Liu
@ 2026-08-19  6:47     ` Michal Hocko
  0 siblings, 0 replies; 5+ messages in thread
From: Michal Hocko @ 2026-08-19  6:47 UTC (permalink / raw)
  To: Ye Liu
  Cc: Song Hu, akpm, linux-fsdevel, linux-kernel, linux-mm, liuye,
	rientjes, shakeel.butt

On Wed 19-08-26 11:15:52, Ye Liu wrote:
> 
> 
> 在 2026/8/18 09:04, Song Hu 写道:
> > On 2026/8/11 11:36, Ye Liu wrote:
> >> --- a/mm/oom_kill.c
> >> +++ b/mm/oom_kill.c
> >> @@ -230,7 +230,7 @@ long oom_badness(struct task_struct *p, unsigned long totalpages)
> >>  	task_unlock(p);
> >>
> >>  	/* Normalize to oom_score_adj units */
> >> -	adj *= totalpages / 1000;
> >> +	adj *= totalpages / OOM_SCORE_ADJ_MAX;
> > 
> > One thing this line hides: for a memcg OOM, totalpages is
> > mem_cgroup_get_max(), which can be below 1000 pages when the
> > container limit is under 4M.  The division then yields 0, the whole
> > oom_score_adj contribution goes away, and a task protected with
> > -997 scores the same as a best-effort task with 1000.  The -1000
> > exemption is checked separately above and still works.
> > 
> > DIV_ROUND_UP(totalpages, OOM_SCORE_ADJ_MAX) would preserve the adj
> > weighting for small limits and change nothing meaningful for large
> > ones.  This is an edge case, so probably fine to leave as is -
> > noting it here since the line is being touched anyway.
> 
> Good catch. Yes, the truncation for totalpages < 1000 is real, 
> but as you noted, it's an existing edge case. I'll keep this patch 
> as a mechanical replacement and won't address it here. Out of curiosity,
> are sub-4MB memcg limits actually used in practice? 

I have seen containers as small as 20MB and they were suffering from
quite some problems - e.g. charge caching on different leyers. I would
generally discourage people from running containers that small unless
they exactly know what they are doing.
-- 
Michal Hocko
SUSE Labs

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

end of thread, other threads:[~2026-08-19  6:47 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-11  3:36 [PATCH] mm/oom_kill, proc: replace magic number 1000 with OOM_SCORE_ADJ_MAX Ye Liu
2026-08-11 12:58 ` Michal Hocko
2026-08-18  1:04 ` Song Hu
2026-08-19  3:15   ` Ye Liu
2026-08-19  6:47     ` Michal Hocko

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