diff options
author | SeongJae Park <sj@kernel.org> | 2023-10-19 19:49:21 +0000 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2023-11-28 17:19:58 +0000 |
commit | 74ed10979060d089d813f65dc91b7a9f0a30fa06 (patch) | |
tree | b7d384925ec9a0bbc8ee1fe65ce78857c40fb682 /mm | |
parent | 557547ad87599ad79536ac3216e1529d84ec21eb (diff) | |
download | linux-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>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/damon/core.c | 10 |
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, |