summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSeongJae Park <sj@kernel.org>2023-10-19 19:49:21 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-11-28 17:19:58 +0000
commit74ed10979060d089d813f65dc91b7a9f0a30fa06 (patch)
treeb7d384925ec9a0bbc8ee1fe65ce78857c40fb682
parent557547ad87599ad79536ac3216e1529d84ec21eb (diff)
downloadlinux-stable-74ed10979060d089d813f65dc91b7a9f0a30fa06.tar.gz
linux-stable-74ed10979060d089d813f65dc91b7a9f0a30fa06.tar.bz2
linux-stable-74ed10979060d089d813f65dc91b7a9f0a30fa06.zip
mm/damon/core: avoid divide-by-zero during monitoring results update
commit d35963bfb05877455228ecec6b194f624489f96a upstream. When monitoring attributes are changed, DAMON updates access rate of the monitoring results accordingly. For that, it divides some values by the maximum nr_accesses. However, due to the type of the related variables, simple division-based calculation of the divisor can return zero. As a result, divide-by-zero is possible. Fix it by using damon_max_nr_accesses(), which handles the case. Link: https://lkml.kernel.org/r/20231019194924.100347-3-sj@kernel.org Fixes: 2f5bef5a590b ("mm/damon/core: update monitoring results for new monitoring attributes") Signed-off-by: SeongJae Park <sj@kernel.org> Reported-by: Jakub Acs <acsjakub@amazon.de> Cc: <stable@vger.kernel.org> [6.3+] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--mm/damon/core.c10
1 files changed, 2 insertions, 8 deletions
diff --git a/mm/damon/core.c b/mm/damon/core.c
index bcd2bd9d6c10..42fea05ecde4 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -476,20 +476,14 @@ static unsigned int damon_age_for_new_attrs(unsigned int age,
static unsigned int damon_accesses_bp_to_nr_accesses(
unsigned int accesses_bp, struct damon_attrs *attrs)
{
- unsigned int max_nr_accesses =
- attrs->aggr_interval / attrs->sample_interval;
-
- return accesses_bp * max_nr_accesses / 10000;
+ return accesses_bp * damon_max_nr_accesses(attrs) / 10000;
}
/* convert nr_accesses to access ratio in bp (per 10,000) */
static unsigned int damon_nr_accesses_to_accesses_bp(
unsigned int nr_accesses, struct damon_attrs *attrs)
{
- unsigned int max_nr_accesses =
- attrs->aggr_interval / attrs->sample_interval;
-
- return nr_accesses * 10000 / max_nr_accesses;
+ return nr_accesses * 10000 / damon_max_nr_accesses(attrs);
}
static unsigned int damon_nr_accesses_for_new_attrs(unsigned int nr_accesses,