mm/damon/core: split out scheme quota adjustment logic into a new function
authorSeongJae Park <sj@kernel.org>
Wed, 26 Oct 2022 22:59:35 +0000 (22:59 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 30 Nov 2022 23:01:25 +0000 (15:01 -0800)
DAMOS quota adjustment logic in 'kdamond_apply_schemes()', has some amount
of code, and the logic is not so straightforward.  Split it out to a new
function for better readability.

Link: https://lkml.kernel.org/r/20221026225943.100429-5-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/core.c

index 3a810c6..80d5937 100644 (file)
@@ -848,59 +848,64 @@ static void damos_set_effective_quota(struct damos_quota *quota)
        quota->esz = esz;
 }
 
-static void kdamond_apply_schemes(struct damon_ctx *c)
+static void damos_adjust_quota(struct damon_ctx *c, struct damos *s)
 {
+       struct damos_quota *quota = &s->quota;
        struct damon_target *t;
-       struct damon_region *r, *next_r;
-       struct damos *s;
+       struct damon_region *r;
+       unsigned long cumulated_sz;
+       unsigned int score, max_score = 0;
 
-       damon_for_each_scheme(s, c) {
-               struct damos_quota *quota = &s->quota;
-               unsigned long cumulated_sz;
-               unsigned int score, max_score = 0;
+       if (!quota->ms && !quota->sz)
+               return;
 
-               if (!s->wmarks.activated)
-                       continue;
+       /* New charge window starts */
+       if (time_after_eq(jiffies, quota->charged_from +
+                               msecs_to_jiffies(quota->reset_interval))) {
+               if (quota->esz && quota->charged_sz >= quota->esz)
+                       s->stat.qt_exceeds++;
+               quota->total_charged_sz += quota->charged_sz;
+               quota->charged_from = jiffies;
+               quota->charged_sz = 0;
+               damos_set_effective_quota(quota);
+       }
 
-               if (!quota->ms && !quota->sz)
-                       continue;
+       if (!c->ops.get_scheme_score)
+               return;
 
-               /* New charge window starts */
-               if (time_after_eq(jiffies, quota->charged_from +
-                                       msecs_to_jiffies(
-                                               quota->reset_interval))) {
-                       if (quota->esz && quota->charged_sz >= quota->esz)
-                               s->stat.qt_exceeds++;
-                       quota->total_charged_sz += quota->charged_sz;
-                       quota->charged_from = jiffies;
-                       quota->charged_sz = 0;
-                       damos_set_effective_quota(quota);
+       /* Fill up the score histogram */
+       memset(quota->histogram, 0, sizeof(quota->histogram));
+       damon_for_each_target(t, c) {
+               damon_for_each_region(r, t) {
+                       if (!__damos_valid_target(r, s))
+                               continue;
+                       score = c->ops.get_scheme_score(c, t, r, s);
+                       quota->histogram[score] += damon_sz_region(r);
+                       if (score > max_score)
+                               max_score = score;
                }
+       }
 
-               if (!c->ops.get_scheme_score)
-                       continue;
+       /* Set the min score limit */
+       for (cumulated_sz = 0, score = max_score; ; score--) {
+               cumulated_sz += quota->histogram[score];
+               if (cumulated_sz >= quota->esz || !score)
+                       break;
+       }
+       quota->min_score = score;
+}
 
-               /* Fill up the score histogram */
-               memset(quota->histogram, 0, sizeof(quota->histogram));
-               damon_for_each_target(t, c) {
-                       damon_for_each_region(r, t) {
-                               if (!__damos_valid_target(r, s))
-                                       continue;
-                               score = c->ops.get_scheme_score(
-                                               c, t, r, s);
-                               quota->histogram[score] += damon_sz_region(r);
-                               if (score > max_score)
-                                       max_score = score;
-                       }
-               }
+static void kdamond_apply_schemes(struct damon_ctx *c)
+{
+       struct damon_target *t;
+       struct damon_region *r, *next_r;
+       struct damos *s;
 
-               /* Set the min score limit */
-               for (cumulated_sz = 0, score = max_score; ; score--) {
-                       cumulated_sz += quota->histogram[score];
-                       if (cumulated_sz >= quota->esz || !score)
-                               break;
-               }
-               quota->min_score = score;
+       damon_for_each_scheme(s, c) {
+               if (!s->wmarks.activated)
+                       continue;
+
+               damos_adjust_quota(c, s);
        }
 
        damon_for_each_target(t, c) {