summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorSeongJae Park <sj@kernel.org>2024-02-19 11:44:19 -0800
committerAndrew Morton <akpm@linux-foundation.org>2024-02-23 17:48:27 -0800
commit91f21216a79d00f7da380ed4ce100e8a7a0d0cff (patch)
tree43e663b63ebde9dad3f31e72bbc250d1ed3f26b9 /include/linux
parent106e26fc1c4c1a0e3747246e15df2bc3aa9d46b2 (diff)
mm/damon/core: add multiple goals per damos_quota and helpers for those
The feedback-driven DAMOS quota auto-tuning feature allows only single goal to the DAMON kernel API users. The API users could implement multiple goals for the end-users on their level, and that's what DAMON sysfs interface is doing. More DAMON kernel API users such as DAMON_RECLAIM would need to do similar work. To reduce unnecessary future duplciated efforts, support multiple goals from DAMOS core layer. To make the support in minimum non-destructive change, keep the old single goal setup interface, and add multiple goals setup. The single goal will treated as one of the multiple goals, so old API users are not required to make any change. Link: https://lkml.kernel.org/r/20240219194431.159606-9-sj@kernel.org Signed-off-by: SeongJae Park <sj@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/damon.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/include/linux/damon.h b/include/linux/damon.h
index 2fe345adf6b2..4bd898eaf80e 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -130,6 +130,7 @@ enum damos_action {
* struct damos_quota_goal - DAMOS scheme quota auto-tuning goal.
* @get_score: Function for getting current score of the goal.
* @get_score_arg: Parameter for @get_score
+ * @list: List head for siblings.
*
* Data structure for getting the current score of the quota tuning goal.
* Calling @get_score with @get_score_arg as the parameter should return the
@@ -140,6 +141,7 @@ enum damos_action {
struct damos_quota_goal {
unsigned long (*get_score)(void *arg);
void *get_score_arg;
+ struct list_head list;
};
/**
@@ -148,6 +150,7 @@ struct damos_quota_goal {
* @ms: Maximum milliseconds that the scheme can use.
* @sz: Maximum bytes of memory that the action can be applied.
* @goal: Quota auto-tuning goal.
+ * @goals: Head of quota tuning goals (&damos_quota_goal) list.
* @esz: Effective size quota in bytes.
*
* @weight_sz: Weight of the region's size for prioritization.
@@ -171,6 +174,8 @@ struct damos_quota_goal {
* every @reset_interval. Then, if the new size quota is smaller than the
* effective quota, it uses the new size quota as the effective quota.
*
+ * If @goals is not empty, same action is taken for each goal of the list.
+ *
* The resulting effective size quota in bytes is set to @esz.
*
* For selecting regions within the quota, DAMON prioritizes current scheme's
@@ -184,6 +189,7 @@ struct damos_quota {
unsigned long ms;
unsigned long sz;
struct damos_quota_goal goal;
+ struct list_head goals;
unsigned long esz;
unsigned int weight_sz;
@@ -648,6 +654,12 @@ static inline unsigned long damon_sz_region(struct damon_region *r)
#define damon_for_each_scheme_safe(s, next, ctx) \
list_for_each_entry_safe(s, next, &(ctx)->schemes, list)
+#define damos_for_each_quota_goal(goal, quota) \
+ list_for_each_entry(goal, &quota->goals, list)
+
+#define damos_for_each_quota_goal_safe(goal, next, quota) \
+ list_for_each_entry_safe(goal, next, &(quota)->goals, list)
+
#define damos_for_each_filter(f, scheme) \
list_for_each_entry(f, &(scheme)->filters, list)
@@ -681,6 +693,11 @@ struct damos_filter *damos_new_filter(enum damos_filter_type type,
void damos_add_filter(struct damos *s, struct damos_filter *f);
void damos_destroy_filter(struct damos_filter *f);
+struct damos_quota_goal *damos_new_quota_goal(
+ unsigned long (*get_score)(void *), void *get_score_arg);
+void damos_add_quota_goal(struct damos_quota *q, struct damos_quota_goal *g);
+void damos_destroy_quota_goal(struct damos_quota_goal *goal);
+
struct damos *damon_new_scheme(struct damos_access_pattern *pattern,
enum damos_action action,
unsigned long apply_interval_us,