* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.