mm/damon/core: add complement argument to damos_new_quota_goal()

damos_quota_goal->complement needs to be manually set by each API
callers.  It is easy to make mistakes.  Extend the quota goal
constructor, damos_new_quota_goal() to receive and set the complement
flag value. Also update all callers to use the new signature.

Link: https://lore.kernel.org/20260929080113.41708-3-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Asier Gutierrez <gutierrez.asier@huawei-partners.com>
This commit is contained in:
SJ Park 2026-09-29 01:01:05 -07:00 committed by Andrew Morton
parent de6632aa78
commit 89d16e8622
7 changed files with 15 additions and 11 deletions

View File

@ -1090,7 +1090,7 @@ bool damos_filter_for_ops(enum damos_filter_type type);
void damos_destroy_filter(struct damos_filter *f);
struct damos_quota_goal *damos_new_quota_goal(
enum damos_quota_goal_metric metric,
enum damos_quota_goal_metric metric, bool complement,
unsigned long target_value);
void damos_add_quota_goal(struct damos_quota *q, struct damos_quota_goal *g);
void damos_destroy_quota_goal(struct damos_quota_goal *goal);

View File

@ -691,7 +691,7 @@ void damos_destroy_filter(struct damos_filter *f)
}
struct damos_quota_goal *damos_new_quota_goal(
enum damos_quota_goal_metric metric,
enum damos_quota_goal_metric metric, bool complement,
unsigned long target_value)
{
struct damos_quota_goal *goal;
@ -700,6 +700,7 @@ struct damos_quota_goal *damos_new_quota_goal(
if (!goal)
return NULL;
goal->metric = metric;
goal->complement = complement;
goal->target_value = target_value;
if (metric == DAMOS_QUOTA_SOME_MEM_PSI_US)
goal->last_psi_total = U64_MAX;
@ -1262,8 +1263,8 @@ int damos_commit_quota_goals(struct damos_quota *dst, struct damos_quota *src)
damos_for_each_quota_goal_safe(src_goal, next, src) {
if (j++ < i)
continue;
new_goal = damos_new_quota_goal(
src_goal->metric, src_goal->target_value);
new_goal = damos_new_quota_goal(src_goal->metric,
src_goal->complement, src_goal->target_value);
if (!new_goal)
return -ENOMEM;
err = damos_commit_quota_goal(new_goal, src_goal);

View File

@ -233,12 +233,13 @@ static int damon_lru_sort_add_quota_goals(struct damos *hot_scheme,
if (!active_mem_bp)
return 0;
goal = damos_new_quota_goal(DAMOS_QUOTA_ACTIVE_MEM_BP, active_mem_bp);
goal = damos_new_quota_goal(DAMOS_QUOTA_ACTIVE_MEM_BP, false,
active_mem_bp);
if (!goal)
return -ENOMEM;
damos_add_quota_goal(&hot_scheme->quota, goal);
/* aim 0.2 % goal conflict, to keep little ping pong */
goal = damos_new_quota_goal(DAMOS_QUOTA_INACTIVE_MEM_BP,
goal = damos_new_quota_goal(DAMOS_QUOTA_INACTIVE_MEM_BP, false,
10000 - active_mem_bp + 2);
if (!goal)
return -ENOMEM;

View File

@ -233,7 +233,7 @@ static int damon_reclaim_apply_parameters(void)
damon_set_schemes(param_ctx, &scheme, 1);
if (quota_mem_pressure_us) {
goal = damos_new_quota_goal(DAMOS_QUOTA_SOME_MEM_PSI_US,
goal = damos_new_quota_goal(DAMOS_QUOTA_SOME_MEM_PSI_US, false,
quota_mem_pressure_us);
if (!goal)
goto out;
@ -241,7 +241,8 @@ static int damon_reclaim_apply_parameters(void)
}
if (quota_autotune_feedback) {
goal = damos_new_quota_goal(DAMOS_QUOTA_USER_INPUT, 10000);
goal = damos_new_quota_goal(DAMOS_QUOTA_USER_INPUT, false,
10000);
if (!goal)
goto out;
goal->current_value = quota_autotune_feedback;

View File

@ -2869,7 +2869,7 @@ static int damos_sysfs_add_quota_score(
if (!sysfs_goal->target_value)
continue;
goal = damos_new_quota_goal(sysfs_goal->metric,
goal = damos_new_quota_goal(sysfs_goal->metric, false,
sysfs_goal->target_value);
if (!goal)
return -ENOMEM;

View File

@ -1014,6 +1014,7 @@ static void damos_test_commit_quota_goals_for(struct kunit *test,
* Make it kfree()-able.
*/
goal = damos_new_quota_goal(dst_goals[i].metric,
dst_goals[i].complement,
dst_goals[i].target_value);
if (!goal)
goto out;
@ -2411,7 +2412,7 @@ static void damos_test_esz_goal_temporal(struct kunit *test)
}
damon_add_scheme(ctx, s);
goal = damos_new_quota_goal(DAMOS_QUOTA_USER_INPUT, 10000);
goal = damos_new_quota_goal(DAMOS_QUOTA_USER_INPUT, false, 10000);
if (!goal) {
damon_destroy_ctx(ctx);
kunit_skip(test, "quota goal alloc fail");

View File

@ -163,7 +163,7 @@ static struct damon_ctx *damon_sample_mtier_build_ctx(bool promote)
damon_set_schemes(ctx, &scheme, 1);
quota_goal = damos_new_quota_goal(
promote ? DAMOS_QUOTA_NODE_MEM_USED_BP :
DAMOS_QUOTA_NODE_MEM_FREE_BP,
DAMOS_QUOTA_NODE_MEM_FREE_BP, false,
promote ? node0_mem_used_bp : node0_mem_free_bp);
if (!quota_goal)
goto free_out;