mm/damon/core: split out scheme quota adjustment logic into a new function
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>
This commit is contained in:
Родитель
d1cbbf621f
Коммит
898810e5ca
|
@ -848,6 +848,53 @@ static void damos_set_effective_quota(struct damos_quota *quota)
|
|||
quota->esz = esz;
|
||||
}
|
||||
|
||||
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;
|
||||
unsigned long cumulated_sz;
|
||||
unsigned int score, max_score = 0;
|
||||
|
||||
if (!quota->ms && !quota->sz)
|
||||
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);
|
||||
}
|
||||
|
||||
if (!c->ops.get_scheme_score)
|
||||
return;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
static void kdamond_apply_schemes(struct damon_ctx *c)
|
||||
{
|
||||
struct damon_target *t;
|
||||
|
@ -855,52 +902,10 @@ static void kdamond_apply_schemes(struct damon_ctx *c)
|
|||
struct damos *s;
|
||||
|
||||
damon_for_each_scheme(s, c) {
|
||||
struct damos_quota *quota = &s->quota;
|
||||
unsigned long cumulated_sz;
|
||||
unsigned int score, max_score = 0;
|
||||
|
||||
if (!s->wmarks.activated)
|
||||
continue;
|
||||
|
||||
if (!quota->ms && !quota->sz)
|
||||
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 (!c->ops.get_scheme_score)
|
||||
continue;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
|
||||
/* 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;
|
||||
damos_adjust_quota(c, s);
|
||||
}
|
||||
|
||||
damon_for_each_target(t, c) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче