From: SeongJae Park <sj@kernel.org>
Cc: SeongJae Park <sj@kernel.org>, Guenter Roeck <linux@roeck-us.net>,
damon@lists.linux.dev, linux-mm@kvack.org,
linux-kernel@vger.kernel.org
Subject: [RFC PATCH] mm/damon/core: avoid overflow in damon_feed_loop_next_input()
Date: Thu, 5 Sep 2024 10:24:05 -0700 [thread overview]
Message-ID: <20240905172405.46995-1-sj@kernel.org> (raw)
damon_feed_loop_next_input() is fragile to overflows. Rewrite code to
avoid overflows. This is not yet well tested on 32bit archs.
Reported-by: Guenter Roeck <linux@roeck-us.net>
Closes: https://lore.kernel.org/944f3d5b-9177-48e7-8ec9-7f1331a3fea3@roeck-us.net
Fixes: 9294a037c015 ("mm/damon/core: implement goal-oriented feedback-driven quota auto-tuning")
Signed-off-by: SeongJae Park <sj@kernel.org>
---
As mentioned on the commit message, this is not yet sufficiently tested
on 32bit machines. That's why this is RFC.
mm/damon/core.c | 33 +++++++++++++++++++++++++++------
1 file changed, 27 insertions(+), 6 deletions(-)
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 32677f13f437..1d951c2a1d85 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -1494,15 +1494,36 @@ static unsigned long damon_feed_loop_next_input(unsigned long last_input,
unsigned long score)
{
const unsigned long goal = 10000;
- unsigned long score_goal_diff = max(goal, score) - min(goal, score);
- unsigned long score_goal_diff_bp = score_goal_diff * 10000 / goal;
- unsigned long compensation = last_input * score_goal_diff_bp / 10000;
/* Set minimum input as 10000 to avoid compensation be zero */
const unsigned long min_input = 10000;
+ unsigned long score_goal_diff;
+ unsigned long compensation;
+
+ if (score == goal)
+ return last_input;
+
+ /* last_input, score <= ULONG_MAX */
+ if (score < goal) {
+ score_goal_diff = goal - score;
+ } else {
+ /* if score_goal_diff > goal, will return min_input anyway */
+ score_goal_diff = min(score - goal, goal);
+ }
+
+ if (last_input < ULONG_MAX / score_goal_diff)
+ compensation = last_input * score_goal_diff / goal;
+ else
+ compensation = last_input / goal * score_goal_diff;
+
+ /* compensation <= last_input <= ULONG_MAX */
+
+ if (goal > score) {
+ if (last_input < ULONG_MAX - compensation)
+ return last_input + compensation;
+ return ULONG_MAX;
+ }
- if (goal > score)
- return last_input + compensation;
- if (last_input > compensation + min_input)
+ if (last_input - compensation > min_input)
return last_input - compensation;
return min_input;
}
--
2.39.2
next reply other threads:[~2024-09-05 17:24 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-05 17:24 SeongJae Park [this message]
2024-09-05 21:40 ` [RFC PATCH] mm/damon/core: avoid overflow in damon_feed_loop_next_input() Guenter Roeck
2024-10-31 4:18 ` Guenter Roeck
2024-10-31 5:21 ` SeongJae Park
2024-11-01 14:16 ` Guenter Roeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240905172405.46995-1-sj@kernel.org \
--to=sj@kernel.org \
--cc=damon@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@roeck-us.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.