fs/proc/base.c | 3 ++- mm/oom_kill.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
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
On Tue, 11 Aug 2026 11:36:08 +0800 Ye Liu <ye.liu@linux.dev> 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. > > ... > > --- 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; AI review suggests that this is a misinterpretation of "1000"? https://sashiko.dev/#/patchset/20260811033609.3992348-1-ye.liu@linux.dev
On Sat 29-08-26 20:13:10, Andrew Morton wrote: > On Tue, 11 Aug 2026 11:36:08 +0800 Ye Liu <ye.liu@linux.dev> 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. > > > > ... > > > > --- 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; > > AI review suggests that this is a misinterpretation of "1000"? > > https://sashiko.dev/#/patchset/20260811033609.3992348-1-ye.liu@linux.dev Sashiko is trying to be clever and it is simply wrong here. The scaling fact is indeed the same as the OOM_SCORE_ADJ_MAX. -- Michal Hocko SUSE Labs
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.
在 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
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
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
© 2016 - 2026 Red Hat, Inc.