| From: SeongJae Park <sj@kernel.org> |
| Subject: mm/damon/sysfs-schemes: implement a command for scheme quota goals only commit |
| Date: Thu, 30 Nov 2023 02:36:47 +0000 |
| |
| To update DAMOS quota goals, users need to enter 'commit' command to the |
| 'state' file of the kdamond, which applies not only the goals but entire |
| inputs. It is inefficient. Implement yet another 'state' file input |
| command for reading and committing only the scheme quota goals, namely |
| 'commit_schemes_quota_goals'. |
| |
| Link: https://lkml.kernel.org/r/20231130023652.50284-5-sj@kernel.org |
| Signed-off-by: SeongJae Park <sj@kernel.org> |
| Cc: Brendan Higgins <brendanhiggins@google.com> |
| Cc: David Gow <davidgow@google.com> |
| Cc: Jonathan Corbet <corbet@lwn.net> |
| Cc: Shuah Khan <shuah@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/damon/sysfs-common.h | 3 +++ |
| mm/damon/sysfs-schemes.c | 16 ++++++++++++++++ |
| mm/damon/sysfs.c | 27 +++++++++++++++++++++++++++ |
| 3 files changed, 46 insertions(+) |
| |
| --- a/mm/damon/sysfs.c~mm-damon-sysfs-schemes-implement-a-command-for-scheme-quota-goals-only-commit |
| +++ a/mm/damon/sysfs.c |
| @@ -995,6 +995,11 @@ enum damon_sysfs_cmd { |
| /* @DAMON_SYSFS_CMD_COMMIT: Update kdamond inputs. */ |
| DAMON_SYSFS_CMD_COMMIT, |
| /* |
| + * @DAMON_SYSFS_CMD_COMMIT_SCHEMES_QUOTA_GOALS: Commit the quota goals |
| + * to DAMON. |
| + */ |
| + DAMON_SYSFS_CMD_COMMIT_SCHEMES_QUOTA_GOALS, |
| + /* |
| * @DAMON_SYSFS_CMD_UPDATE_SCHEMES_STATS: Update scheme stats sysfs |
| * files. |
| */ |
| @@ -1025,6 +1030,7 @@ static const char * const damon_sysfs_cm |
| "on", |
| "off", |
| "commit", |
| + "commit_schemes_quota_goals", |
| "update_schemes_stats", |
| "update_schemes_tried_bytes", |
| "update_schemes_tried_regions", |
| @@ -1351,6 +1357,24 @@ static int damon_sysfs_commit_input(stru |
| kdamond->contexts->contexts_arr[0]); |
| } |
| |
| +static int damon_sysfs_commit_schemes_quota_goals( |
| + struct damon_sysfs_kdamond *sysfs_kdamond) |
| +{ |
| + struct damon_ctx *ctx; |
| + struct damon_sysfs_context *sysfs_ctx; |
| + |
| + if (!damon_sysfs_kdamond_running(sysfs_kdamond)) |
| + return -EINVAL; |
| + /* TODO: Support multiple contexts per kdamond */ |
| + if (sysfs_kdamond->contexts->nr != 1) |
| + return -EINVAL; |
| + |
| + ctx = sysfs_kdamond->damon_ctx; |
| + sysfs_ctx = sysfs_kdamond->contexts->contexts_arr[0]; |
| + damos_sysfs_set_quota_scores(sysfs_ctx->schemes, ctx); |
| + return 0; |
| +} |
| + |
| /* |
| * damon_sysfs_cmd_request_callback() - DAMON callback for handling requests. |
| * @c: The DAMON context of the callback. |
| @@ -1379,6 +1403,9 @@ static int damon_sysfs_cmd_request_callb |
| case DAMON_SYSFS_CMD_COMMIT: |
| err = damon_sysfs_commit_input(kdamond); |
| break; |
| + case DAMON_SYSFS_CMD_COMMIT_SCHEMES_QUOTA_GOALS: |
| + err = damon_sysfs_commit_schemes_quota_goals(kdamond); |
| + break; |
| case DAMON_SYSFS_CMD_UPDATE_SCHEMES_TRIED_BYTES: |
| total_bytes_only = true; |
| fallthrough; |
| --- a/mm/damon/sysfs-common.h~mm-damon-sysfs-schemes-implement-a-command-for-scheme-quota-goals-only-commit |
| +++ a/mm/damon/sysfs-common.h |
| @@ -56,3 +56,6 @@ int damon_sysfs_schemes_update_regions_s |
| int damon_sysfs_schemes_clear_regions( |
| struct damon_sysfs_schemes *sysfs_schemes, |
| struct damon_ctx *ctx); |
| + |
| +void damos_sysfs_set_quota_scores(struct damon_sysfs_schemes *sysfs_schemes, |
| + struct damon_ctx *ctx); |
| --- a/mm/damon/sysfs-schemes.c~mm-damon-sysfs-schemes-implement-a-command-for-scheme-quota-goals-only-commit |
| +++ a/mm/damon/sysfs-schemes.c |
| @@ -1896,6 +1896,22 @@ static void damos_sysfs_set_quota_score( |
| } |
| } |
| |
| +void damos_sysfs_set_quota_scores(struct damon_sysfs_schemes *sysfs_schemes, |
| + struct damon_ctx *ctx) |
| +{ |
| + struct damos *scheme; |
| + int i = 0; |
| + |
| + damon_for_each_scheme(scheme, ctx) { |
| + struct damon_sysfs_scheme *sysfs_scheme; |
| + |
| + sysfs_scheme = sysfs_schemes->schemes_arr[i]; |
| + damos_sysfs_set_quota_score(sysfs_scheme->quotas->goals, |
| + &scheme->quota); |
| + i++; |
| + } |
| +} |
| + |
| static struct damos *damon_sysfs_mk_scheme( |
| struct damon_sysfs_scheme *sysfs_scheme) |
| { |
| _ |