mm/damon: cleanup kdamond, damon_call(), damos filter and DAMON_MIN_REGION
Subsystems (2)
SeongJae Park
maintainercover mm/damon: cleanup kdamond, damon_call(), damos filter and DAMON_MIN_REGION
Do miscellaneous code cleanups for improving readability. First three patches cleanup kdamond termination process, by removing unused operation set cleanup callback (patch 1) and moving damon_ctx specific resource cleanups on kdamond termination to synchronization-easy place (patches 2 and 3). Next two patches touch damon_call() infrastructure, by refactoring kdamond_call() function to do less and simpler locking operations (patch 4), and documenting when dealloc_on_free does work (patch 5). Final three patches rename things for clear uses of those. Those rename damos_filter_out() to be more explicit about the fact that it is only for core-handled filters (patch 6), DAMON_MIN_REGION macro to be more explicit it is not about number of regions but size of each region (patch 7), and damon_ctx->min_sz_region to be different from damos_access_patern->min_sz_region (patch 8), so that those are not confusing and easy to grep.
SeongJae Park (8):
mm/damon: remove damon_operations->cleanup() mm/damon/core: cleanup targets and regions at once on kdamond
termination
mm/damon/core: cancel damos_walk() before damon_ctx->kdamond reset mm/damon/core: process damon_call_control requests on a local list mm/damon: document damon_call_control->dealloc_on_cancel repeat
behavior
mm/damon/core: rename damos_filter_out() to damos_core_filter_out() mm/damon: rename DAMON_MIN_REGION to DAMON_MIN_REGION_SZ mm/damon: rename min_sz_region of damon_ctx to min_region_sz
include/linux/damon.h | 15 ++-- mm/damon/core.c | 143 +++++++++++++++-------------------- mm/damon/lru_sort.c | 4 +- mm/damon/paddr.c | 1 - mm/damon/reclaim.c | 4 +- mm/damon/stat.c | 2 +- mm/damon/sysfs.c | 11 +-- mm/damon/tests/vaddr-kunit.h | 2 +- mm/damon/vaddr.c | 25 +++--- 9 files changed, 89 insertions(+), 118 deletions(-)
base-commit: 886ef5515d08f05191b61a347fc18f371627bdd4
Signature · 1 line
2.47.3
SeongJae Park
maintainerPATCH 1/8 mm/damon: remove damon_operations->cleanup()
damon_operations->cleanup() was added for a case that an operation set implementation requires additional cleanups. But no such implementation exists at the moment. Remove it.
--- include/linux/damon.h | 3 --- mm/damon/core.c | 2 -- mm/damon/paddr.c | 1 - mm/damon/vaddr.c | 1 - 4 files changed, 7 deletions(-)
include/linux/damon.h +0 -3
@@ -607,7 +607,6 @@ enum damon_ops_id {* @apply_scheme: Apply a DAMON-based operation scheme. * @target_valid: Determine if the target is valid. * @cleanup_target: Clean up each target before deallocation. -* @cleanup: Clean up the context. * * DAMON can be extended for various address spaces and usages. For this, * users should register the low level operations for their target address
@@ -640,7 +639,6 @@ enum damon_ops_id {* @target_valid should check whether the target is still valid for the * monitoring. * @cleanup_target is called before the target will be deallocated. -* @cleanup is called from @kdamond just before its termination. */ struct damon_operations {enum damon_ops_id id;
@@ -656,7 +654,6 @@ struct damon_operations { struct damos *scheme, unsigned long *sz_filter_passed);bool (*target_valid)(struct damon_target *t);void (*cleanup_target)(struct damon_target *t); -void (*cleanup)(struct damon_ctx *context); };/*
mm/damon/core.c +0 -2
@@ -2859,8 +2859,6 @@ static int kdamond_fn(void *data)damon_destroy_region (r, t); } -if (ctx->ops.cleanup) - ctx->ops.cleanup (ctx);kfree (ctx->regions_score_histogram);kdamond_call (ctx, true);
mm/damon/paddr.c +0 -1
@@ -373,7 +373,6 @@ static int __init damon_pa_initcall(void) .prepare_access_checks = damon_pa_prepare_access_checks, .check_accesses = damon_pa_check_accesses, .target_valid = NULL, - .cleanup = NULL, .apply_scheme = damon_pa_apply_scheme, .get_scheme_score = damon_pa_scheme_score, };
mm/damon/vaddr.c +0 -1
@@ -1014,7 +1014,6 @@ static int __init damon_va_initcall(void) .check_accesses = damon_va_check_accesses, .target_valid = damon_va_target_valid, .cleanup_target = damon_va_cleanup_target, - .cleanup = NULL, .apply_scheme = damon_va_apply_scheme, .get_scheme_score = damon_va_scheme_score, };
Signature · 1 line
2.47.3
SeongJae Park
maintainerPATCH 2/8 mm/damon/core: cleanup targets and regions at once on kdamond termination
In reply to SeongJae ParkWhen kdamond terminates, it destroys the regions of the context first, and the targets of the context just before the kdamond main function returns. Because regions are linked inside targets, doing them separately is only inefficient and looks weird. A more serious problem is that the cleanup of the targets is done after damon_ctx->kdamond reset, which is the event that lets DAMON API callers know the kdamond is no longer actively running. That is, some DAMON targets could still exist while kdamond is not running. There are no real problems from this, but this implicit fact could cause subtle racy issues in future. Destroy targets and regions at one.
Adding contexts on how the code has evolved in the way. Doing only regions destruction was because putting pids of the targets were done on DAMON API callers. Commit 7114bc5e01cf ("mm/damon/core: add cleanup_target() ops callback") moved the role to be done via operations set on each target destruction. Hence it removed the reason to do only regions cleanup. Commit 3a69f1635769 ("mm/damon/core: destroy targets when kdamond_fn() finish") therefore further destructed targets on kdamond termination time. It was still separated from regions destruction because damon_operations->cleanup() may do additional targets cleanup. Placing the targets destruction after damon_ctx->kdamond reset was just an unnecessary decision of the commit. The previous commit removed damon_operations->cleanup(), so there is no more reason to do destructions of regions and targets separately.
--- mm/damon/core.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
mm/damon/core.c +1 -7
@@ -2748,8 +2748,6 @@ static void kdamond_init_ctx(struct damon_ctx *ctx)static int kdamond_fn (void *data) {struct damon_ctx *ctx = data; -struct damon_target *t; -struct damon_region *r, *next;unsigned int max_nr_accesses =0 ;unsigned long sz_limit =0 ;
@@ -2854,10 +2852,7 @@ static int kdamond_fn(void *data) } } done: -damon_for_each_target (t, ctx) { -damon_for_each_region_safe (r, next, t) -damon_destroy_region (r, t); - } +damon_destroy_targets (ctx);kfree (ctx->regions_score_histogram);kdamond_call (ctx, true);
@@ -2875,7 +2870,6 @@ static int kdamond_fn(void *data) running_exclusive_ctxs = false;mutex_unlock (&damon_lock); -damon_destroy_targets (ctx);return 0 ; }
Signature · 1 line
2.47.3
SeongJae Park
maintainerPATCH 3/8 mm/damon/core: cancel damos_walk() before damon_ctx->kdamond reset
In reply to SeongJae Parkdamos_walk() request is canceled after damon_ctx->kdamond is reset. This can make weird situations where damon_is_running() returns false but the DAMON context has the damos_walk() request linked. There was a similar situation for damon_call() requests handling [1], which _was_ able to cause a racy use-after-free bug. Unlike the case of damon_call(), because damos_walk() is always synchronously handled and allows only single request at time, there is no such problematic race cases. But, keeping it as is could stem another subtle race condition bug in future.
Avoid that by cancelling the requests before the ->kdamond reset. Note that this change also makes all damon_ctx dependent resource cleanups consistently done before the damon_ctx->kdamond reset.
[1] https://lore.kernel.org/[email protected]
--- mm/damon/core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
mm/damon/core.c +1 -2
@@ -2856,14 +2856,13 @@ static int kdamond_fn(void *data)kfree (ctx->regions_score_histogram);kdamond_call (ctx, true); +damos_walk_cancel (ctx);pr_debug ("kdamond (%d) finishes\n" , current->pid);mutex_lock (&ctx->kdamond_lock); ctx->kdamond =NULL ;mutex_unlock (&ctx->kdamond_lock); -damos_walk_cancel (ctx); -mutex_lock (&damon_lock); nr_running_ctxs--;if (!nr_running_ctxs && running_exclusive_ctxs)
Signature · 1 line
2.47.3
SeongJae Park
maintainerPATCH 4/8 mm/damon/core: process damon_call_control requests on a local list
In reply to SeongJae Parkkdamond_call() handles damon_call() requests on the ->call_controls list of damon_ctx, which is shared with damon_call() callers. To protect the list from concurrent accesses while letting the callback function independent of the call_controls_lock, the function does complicated locking operations. For each damon_call_control object on the list, the function removes the control object from the list under locking, invoke the callback of the control object without locking, and then puts the control object back to the list if needed, under locking. It is complicated, and can contend the locks more frequently with other DAMON API caller threads as the number of concurrent callback requests increases. Contention overhead is not a big deal, but the increased race opportunity can make headaches.
Simplify the locking sequence by moving all damon_call_control objects from the shared list to a local list at once under the single lock protection, processing the callback requests without locking, and adding back repeat mode controls to the shared list again at once again, again under the single lock protection. This change makes the number of locking in kdamond_call() be always two, regardless of the number of the queued requests.
--- mm/damon/core.c | 59 ++++++++++++++++++------------------------------- 1 file changed, 21 insertions(+), 38 deletions(-)
mm/damon/core.c +21 -38
@@ -2649,48 +2649,31 @@ static void kdamond_usleep(unsigned long usecs)*/ static void kdamond_call (struct damon_ctx *ctx,bool cancel) { -struct damon_call_control *control; -LIST_HEAD (repeat_controls); -int ret =0 ; - -while (true) { -mutex_lock (&ctx->call_controls_lock); - control =list_first_entry_or_null (&ctx->call_controls, - struct damon_call_control, list); -mutex_unlock (&ctx->call_controls_lock); -if (!control) -break ; -if (cancel) { +struct damon_call_control *control, *next; +LIST_HEAD (controls); + +mutex_lock (&ctx->call_controls_lock); +list_splice_tail_init (&ctx->call_controls, &controls); +mutex_unlock (&ctx->call_controls_lock); + +list_for_each_entry_safe (control, next, &controls, list) { +if (!control->repeat || cancel) +list_del (&control->list); + +if (cancel) control->canceled = true; - }else { - ret = control->fn (control->data); - control->return_code = ret; - } -mutex_lock (&ctx->call_controls_lock); -list_del (&control->list); -mutex_unlock (&ctx->call_controls_lock); -if (!control->repeat) { +else + control->return_code = control->fn (control->data); + +if (!control->repeat)complete (&control->completion); - }else if (control->canceled && control->dealloc_on_cancel) { +else if (control->canceled && control->dealloc_on_cancel)kfree (control); -continue ; - }else { -list_add (&control->list, &repeat_controls); - } - } -while (true) { - control =list_first_entry_or_null (&repeat_controls, - struct damon_call_control, list); -if (!control) -break ; -/* Unlink from the repeate_controls list. */ -list_del (&control->list); -if (cancel) -continue ; -mutex_lock (&ctx->call_controls_lock); -list_add (&control->list, &ctx->call_controls); -mutex_unlock (&ctx->call_controls_lock); } + +mutex_lock (&ctx->call_controls_lock); +list_splice_tail (&controls, &ctx->call_controls); +mutex_unlock (&ctx->call_controls_lock); }/* Returns negative error code if it's not activated but should return */
Signature · 1 line
2.47.3
SeongJae Park
maintainerPATCH 5/8 mm/damon: document damon_call_control->dealloc_on_cancel repeat behavior
In reply to SeongJae Parkdamon_call_control->dealloc_on_cancel works only when ->repeat is true. But the behavior is not clearly documented. DAMON API callers can understand the behavior only after reading kdamond_call() code. Document the behavior on the kernel-doc comment of damon_call_control.
--- include/linux/damon.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/damon.h +1 -1
@@ -663,7 +663,7 @@ struct damon_operations {* @data: Data that will be passed to @fn. * @repeat: Repeat invocations. * @return_code: Return code from @fn invocation. -* @dealloc_on_cancel: De-allocate when canceled. +* @dealloc_on_cancel: If @repeat is true, de-allocate when canceled. * * Control damon_call(), which requests specific kdamond to invoke a given * function. Refer to damon_call() for more details.
Signature · 1 line
2.47.3
SeongJae Park
maintainerPATCH 6/8 mm/damon/core: rename damos_filter_out() to damos_core_filter_out()
In reply to SeongJae ParkDAMOS filters are processed on the core layer and operations layer, depending on their types. damos_filter_out() in core.c, which is for only core layer handled filters, can confuse the fact. Rename it to damos_core_filter_out(), to be more explicit about the fact.
--- mm/damon/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/damon/core.c +2 -2
@@ -1813,7 +1813,7 @@ static bool damos_filter_match(struct damon_ctx *ctx, struct damon_target *t,return matched == filter->matching; } -static bool damos_filter_out (struct damon_ctx *ctx,struct damon_target *t, +static bool damos_core_filter_out (struct damon_ctx *ctx,struct damon_target *t,struct damon_region *r,struct damos *s) {struct damos_filter *filter;
@@ -1960,7 +1960,7 @@ static void damos_apply_scheme(struct damon_ctx *c, struct damon_target *t, goto update_stat;damon_split_region_at (t, r, sz); } -if (damos_filter_out (c, t, r, s)) +if (damos_core_filter_out (c, t, r, s))return ;ktime_get_coarse_ts64 (&begin); trace_damos_before_apply(cidx, sidx, tidx, r,
Signature · 1 line
2.47.3
SeongJae Park
maintainerPATCH 7/8 mm/damon: rename DAMON_MIN_REGION to DAMON_MIN_REGION_SZ
In reply to SeongJae ParkThe macro is for the default minimum size of each DAMON region. There was a case that a reader was confused if it is the minimum number of total DAMON regions, which is set on damon_attrs->min_nr_regions. Make the name more explicit.
--- include/linux/damon.h | 2 +- mm/damon/core.c | 2 +- mm/damon/lru_sort.c | 2 +- mm/damon/reclaim.c | 2 +- mm/damon/sysfs.c | 2 +- mm/damon/tests/vaddr-kunit.h | 2 +- mm/damon/vaddr.c | 24 ++++++++++++------------ 7 files changed, 18 insertions(+), 18 deletions(-)
include/linux/damon.h +1 -1
@@ -15,7 +15,7 @@#include <linux/random.h> /* Minimal region size. Every damon_region is aligned by this. */ -#define DAMON_MIN_REGION PAGE_SIZE +#define DAMON_MIN_REGION_SZ PAGE_SIZE/* Max priority score for DAMON-based operation schemes */ #define DAMOS_MAX_SCORE (99)
mm/damon/core.c +1 -1
@@ -553,7 +553,7 @@ struct damon_ctx *damon_new_ctx(void) ctx->attrs.max_nr_regions =1000 ; ctx->addr_unit =1 ; - ctx->min_sz_region =DAMON_MIN_REGION ; + ctx->min_sz_region =DAMON_MIN_REGION_SZ ;INIT_LIST_HEAD (&ctx->adaptive_targets);INIT_LIST_HEAD (&ctx->schemes);
mm/damon/lru_sort.c +1 -1
@@ -298,7 +298,7 @@ static int damon_lru_sort_apply_parameters(void)if (!monitor_region_start && !monitor_region_end) addr_unit =1 ; param_ctx->addr_unit = addr_unit; - param_ctx->min_sz_region =max (DAMON_MIN_REGION / addr_unit,1 ); + param_ctx->min_sz_region =max (DAMON_MIN_REGION_SZ / addr_unit,1 );if (!damon_lru_sort_mon_attrs.sample_interval) { err = -EINVAL ;
mm/damon/reclaim.c +1 -1
@@ -208,7 +208,7 @@ static int damon_reclaim_apply_parameters(void)if (!monitor_region_start && !monitor_region_end) addr_unit =1 ; param_ctx->addr_unit = addr_unit; - param_ctx->min_sz_region =max (DAMON_MIN_REGION / addr_unit,1 ); + param_ctx->min_sz_region =max (DAMON_MIN_REGION_SZ / addr_unit,1 );if (!damon_reclaim_mon_attrs.aggr_interval) { err = -EINVAL ;
mm/damon/sysfs.c +1 -1
@@ -1470,7 +1470,7 @@ static int damon_sysfs_apply_inputs(struct damon_ctx *ctx,/* addr_unit is respected by only DAMON_OPS_PADDR */ if (sys_ctx->ops_id ==DAMON_OPS_PADDR ) ctx->min_sz_region =max ( -DAMON_MIN_REGION / sys_ctx->addr_unit,1 ); +DAMON_MIN_REGION_SZ / sys_ctx->addr_unit,1 ); err =damon_sysfs_set_attrs (ctx, sys_ctx->attrs);if (err)return err;
mm/damon/tests/vaddr-kunit.h +1 -1
@@ -147,7 +147,7 @@ static void damon_do_test_apply_three_regions(struct kunit *test,damon_add_region (r, t); } -damon_set_regions (t, three_regions,3 ,DAMON_MIN_REGION ); +damon_set_regions (t, three_regions,3 ,DAMON_MIN_REGION_SZ );for (i =0 ; i < nr_expected /2 ; i++) { r =__nth_region_of (t, i);
mm/damon/vaddr.c +12 -12
@@ -19,8 +19,8 @@#include "ops-common.h" #ifdef CONFIG_DAMON_VADDR_KUNIT_TEST -#undef DAMON_MIN_REGION -#define DAMON_MIN_REGION 1 +#undef DAMON_MIN_REGION_SZ +#define DAMON_MIN_REGION_SZ 1#endif /*
@@ -78,7 +78,7 @@ static int damon_va_evenly_split_region(struct damon_target *t, orig_end = r->ar.end; sz_orig =damon_sz_region (r); - sz_piece =ALIGN_DOWN (sz_orig / nr_pieces,DAMON_MIN_REGION ); + sz_piece =ALIGN_DOWN (sz_orig / nr_pieces,DAMON_MIN_REGION_SZ );if (!sz_piece)return -EINVAL ;
@@ -161,12 +161,12 @@ static int __damon_va_three_regions(struct mm_struct *mm,swap (first_gap, second_gap);/* Store the result */ - regions[0 ].start =ALIGN (start,DAMON_MIN_REGION ); - regions[0 ].end =ALIGN (first_gap.start,DAMON_MIN_REGION ); - regions[1 ].start =ALIGN (first_gap.end,DAMON_MIN_REGION ); - regions[1 ].end =ALIGN (second_gap.start,DAMON_MIN_REGION ); - regions[2 ].start =ALIGN (second_gap.end,DAMON_MIN_REGION ); - regions[2 ].end =ALIGN (prev->vm_end,DAMON_MIN_REGION ); + regions[0 ].start =ALIGN (start,DAMON_MIN_REGION_SZ ); + regions[0 ].end =ALIGN (first_gap.start,DAMON_MIN_REGION_SZ ); + regions[1 ].start =ALIGN (first_gap.end,DAMON_MIN_REGION_SZ ); + regions[1 ].end =ALIGN (second_gap.start,DAMON_MIN_REGION_SZ ); + regions[2 ].start =ALIGN (second_gap.end,DAMON_MIN_REGION_SZ ); + regions[2 ].end =ALIGN (prev->vm_end,DAMON_MIN_REGION_SZ );return 0 ; }
@@ -259,8 +259,8 @@ static void __damon_va_init_regions(struct damon_ctx *ctx, sz += regions[i].end - regions[i].start;if (ctx->attrs.min_nr_regions) sz /= ctx->attrs.min_nr_regions; -if (sz <DAMON_MIN_REGION ) - sz =DAMON_MIN_REGION ; +if (sz <DAMON_MIN_REGION_SZ ) + sz =DAMON_MIN_REGION_SZ ;/* Set the initial three regions of the target */ for (i =0 ; i <3 ; i++) {
@@ -299,7 +299,7 @@ static void damon_va_update(struct damon_ctx *ctx)damon_for_each_target (t, ctx) {if (damon_va_three_regions (t, three_regions))continue ; -damon_set_regions (t, three_regions,3 ,DAMON_MIN_REGION ); +damon_set_regions (t, three_regions,3 ,DAMON_MIN_REGION_SZ ); } }
Signature · 1 line
2.47.3
SeongJae Park
maintainerPATCH 8/8 mm/damon: rename min_sz_region of damon_ctx to min_region_sz
In reply to SeongJae Park'min_sz_region' field of 'struct damon_ctx' represents the minimum size of each DAMON region for the context. 'struct damos_access_pattern' has a field of the same name. It confuses readers and makes 'grep' less optimal for them. Rename it to 'min_region_sz'.
--- include/linux/damon.h | 8 ++--- mm/damon/core.c | 69 ++++++++++++++++++++++--------------------- mm/damon/lru_sort.c | 4 +-- mm/damon/reclaim.c | 4 +-- mm/damon/stat.c | 2 +- mm/damon/sysfs.c | 9 +++--- 6 files changed, 49 insertions(+), 47 deletions(-)
include/linux/damon.h +4 -4
@@ -773,7 +773,7 @@ struct damon_attrs {* * @ops: Set of monitoring operations for given use cases. * @addr_unit: Scale factor for core to ops address conversion. -* @min_sz_region: Minimum region size. +* @min_region_sz: Minimum region size. * @adaptive_targets: Head of monitoring targets (&damon_target) list. * @schemes: Head of schemes (&damos) list. */
@@ -818,7 +818,7 @@ struct damon_ctx {/* public: */ struct damon_operations ops;unsigned long addr_unit; -unsigned long min_sz_region; +unsigned long min_region_sz;struct list_head adaptive_targets;struct list_head schemes;
@@ -907,7 +907,7 @@ static inline void damon_insert_region(struct damon_region *r,void damon_add_region (struct damon_region *r,struct damon_target *t);void damon_destroy_region (struct damon_region *r,struct damon_target *t);int damon_set_regions (struct damon_target *t,struct damon_addr_range *ranges, -unsigned int nr_ranges,unsigned long min_sz_region); +unsigned int nr_ranges,unsigned long min_region_sz);void damon_update_region_access_rate (struct damon_region *r,bool accessed,struct damon_attrs *attrs);
@@ -975,7 +975,7 @@ int damos_walk(struct damon_ctx *ctx, struct damos_walk_control *control);int damon_set_region_biggest_system_ram_default (struct damon_target *t,unsigned long *start,unsigned long *end, -unsigned long min_sz_region); +unsigned long min_region_sz);#endif /* CONFIG_DAMON */
mm/damon/core.c +35 -34
235 lines not on this page · raw message
mm/damon/lru_sort.c +2 -2
@@ -298,7 +298,7 @@ static int damon_lru_sort_apply_parameters(void)if (!monitor_region_start && !monitor_region_end) addr_unit =1 ; param_ctx->addr_unit = addr_unit; - param_ctx->min_sz_region =max (DAMON_MIN_REGION_SZ / addr_unit,1 ); + param_ctx->min_region_sz =max (DAMON_MIN_REGION_SZ / addr_unit,1 );if (!damon_lru_sort_mon_attrs.sample_interval) { err = -EINVAL ;
@@ -345,7 +345,7 @@ static int damon_lru_sort_apply_parameters(void) err =damon_set_region_biggest_system_ram_default (param_target, &monitor_region_start, &monitor_region_end, - param_ctx->min_sz_region); + param_ctx->min_region_sz);if (err) goto out; err =damon_commit_ctx (ctx, param_ctx);
mm/damon/reclaim.c +2 -2
@@ -208,7 +208,7 @@ static int damon_reclaim_apply_parameters(void)if (!monitor_region_start && !monitor_region_end) addr_unit =1 ; param_ctx->addr_unit = addr_unit; - param_ctx->min_sz_region =max (DAMON_MIN_REGION_SZ / addr_unit,1 ); + param_ctx->min_region_sz =max (DAMON_MIN_REGION_SZ / addr_unit,1 );if (!damon_reclaim_mon_attrs.aggr_interval) { err = -EINVAL ;
@@ -251,7 +251,7 @@ static int damon_reclaim_apply_parameters(void) err =damon_set_region_biggest_system_ram_default (param_target, &monitor_region_start, &monitor_region_end, - param_ctx->min_sz_region); + param_ctx->min_region_sz);if (err) goto out; err =damon_commit_ctx (ctx, param_ctx);
mm/damon/stat.c +1 -1
@@ -181,7 +181,7 @@ static struct damon_ctx *damon_stat_build_ctx(void) goto free_out;damon_add_target (ctx, target);if (damon_set_region_biggest_system_ram_default (target, &start, &end, - ctx->min_sz_region)) + ctx->min_region_sz)) goto free_out;return ctx; free_out:
mm/damon/sysfs.c +5 -4
@@ -1365,7 +1365,7 @@ static int damon_sysfs_set_attrs(struct damon_ctx *ctx,static int damon_sysfs_set_regions (struct damon_target *t,struct damon_sysfs_regions *sysfs_regions, -unsigned long min_sz_region) +unsigned long min_region_sz) {struct damon_addr_range *ranges =kmalloc_array (sysfs_regions->nr,sizeof (*ranges),GFP_KERNEL | __GFP_NOWARN);
@@ -1387,7 +1387,7 @@ static int damon_sysfs_set_regions(struct damon_target *t,if (ranges[i -1 ].end > ranges[i].start) goto out; } - err =damon_set_regions (t, ranges, sysfs_regions->nr, min_sz_region); + err =damon_set_regions (t, ranges, sysfs_regions->nr, min_region_sz); out:kfree (ranges);return err;
@@ -1409,7 +1409,8 @@ static int damon_sysfs_add_target(struct damon_sysfs_target *sys_target,return -EINVAL ; } t->obsolete = sys_target->obsolete; -return damon_sysfs_set_regions (t, sys_target->regions, ctx->min_sz_region); +return damon_sysfs_set_regions (t, sys_target->regions, + ctx->min_region_sz); } static int damon_sysfs_add_targets(struct damon_ctx *ctx,
@@ -1469,7 +1470,7 @@ static int damon_sysfs_apply_inputs(struct damon_ctx *ctx, ctx->addr_unit = sys_ctx->addr_unit;/* addr_unit is respected by only DAMON_OPS_PADDR */ if (sys_ctx->ops_id ==DAMON_OPS_PADDR ) - ctx->min_sz_region =max ( + ctx->min_region_sz =max (DAMON_MIN_REGION_SZ / sys_ctx->addr_unit,1 ); err =damon_sysfs_set_attrs (ctx, sys_ctx->attrs);if (err)
Signature · 1 line
2.47.3