diff options
Diffstat (limited to 'mm/damon/core.c')
| -rw-r--r-- | mm/damon/core.c | 45 | 
1 files changed, 19 insertions, 26 deletions
| diff --git a/mm/damon/core.c b/mm/damon/core.c index e92497895202..1dd153c31c9e 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -11,7 +11,6 @@  #include <linux/delay.h>  #include <linux/kthread.h>  #include <linux/mm.h> -#include <linux/random.h>  #include <linux/slab.h>  #include <linux/string.h> @@ -23,9 +22,6 @@  #define DAMON_MIN_REGION 1  #endif -/* Get a random number in [l, r) */ -#define damon_rand(l, r) (l + prandom_u32_max(r - l)) -  static DEFINE_MUTEX(damon_lock);  static int nr_running_ctxs; @@ -53,17 +49,6 @@ struct damon_region *damon_new_region(unsigned long start, unsigned long end)  	return region;  } -/* - * Add a region between two other regions - */ -inline void damon_insert_region(struct damon_region *r, -		struct damon_region *prev, struct damon_region *next, -		struct damon_target *t) -{ -	__list_add(&r->list, &prev->list, &next->list); -	t->nr_regions++; -} -  void damon_add_region(struct damon_region *r, struct damon_target *t)  {  	list_add_tail(&r->list, &t->regions_list); @@ -106,8 +91,7 @@ struct damos *damon_new_scheme(  	scheme->min_age_region = min_age_region;  	scheme->max_age_region = max_age_region;  	scheme->action = action; -	scheme->stat_count = 0; -	scheme->stat_sz = 0; +	scheme->stat = (struct damos_stat){};  	INIT_LIST_HEAD(&scheme->list);  	scheme->quota.ms = quota->ms; @@ -530,15 +514,17 @@ static bool kdamond_aggregate_interval_passed(struct damon_ctx *ctx)  static void kdamond_reset_aggregated(struct damon_ctx *c)  {  	struct damon_target *t; +	unsigned int ti = 0;	/* target's index */  	damon_for_each_target(t, c) {  		struct damon_region *r;  		damon_for_each_region(r, t) { -			trace_damon_aggregated(t, r, damon_nr_regions(t)); +			trace_damon_aggregated(t, ti, r, damon_nr_regions(t));  			r->last_nr_accesses = r->nr_accesses;  			r->nr_accesses = 0;  		} +		ti++;  	}  } @@ -578,6 +564,7 @@ static void damon_do_apply_schemes(struct damon_ctx *c,  		struct damos_quota *quota = &s->quota;  		unsigned long sz = r->ar.end - r->ar.start;  		struct timespec64 begin, end; +		unsigned long sz_applied = 0;  		if (!s->wmarks.activated)  			continue; @@ -631,7 +618,7 @@ static void damon_do_apply_schemes(struct damon_ctx *c,  				damon_split_region_at(c, t, r, sz);  			}  			ktime_get_coarse_ts64(&begin); -			c->primitive.apply_scheme(c, t, r, s); +			sz_applied = c->primitive.apply_scheme(c, t, r, s);  			ktime_get_coarse_ts64(&end);  			quota->total_charged_ns += timespec64_to_ns(&end) -  				timespec64_to_ns(&begin); @@ -645,8 +632,11 @@ static void damon_do_apply_schemes(struct damon_ctx *c,  			r->age = 0;  update_stat: -		s->stat_count++; -		s->stat_sz += sz; +		s->stat.nr_tried++; +		s->stat.sz_tried += sz; +		if (sz_applied) +			s->stat.nr_applied++; +		s->stat.sz_applied += sz_applied;  	}  } @@ -694,6 +684,8 @@ static void kdamond_apply_schemes(struct damon_ctx *c)  		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; @@ -733,7 +725,10 @@ static void kdamond_apply_schemes(struct damon_ctx *c)  	}  } -#define sz_damon_region(r) (r->ar.end - r->ar.start) +static inline unsigned long sz_damon_region(struct damon_region *r) +{ +	return r->ar.end - r->ar.start; +}  /*   * Merge two adjacent regions into one region @@ -750,8 +745,6 @@ static void damon_merge_two_regions(struct damon_target *t,  	damon_destroy_region(r, t);  } -#define diff_of(a, b) (a > b ? a - b : b - a) -  /*   * Merge adjacent regions having similar access frequencies   * @@ -765,13 +758,13 @@ static void damon_merge_regions_of(struct damon_target *t, unsigned int thres,  	struct damon_region *r, *prev = NULL, *next;  	damon_for_each_region_safe(r, next, t) { -		if (diff_of(r->nr_accesses, r->last_nr_accesses) > thres) +		if (abs(r->nr_accesses - r->last_nr_accesses) > thres)  			r->age = 0;  		else  			r->age++;  		if (prev && prev->ar.end == r->ar.start && -		    diff_of(prev->nr_accesses, r->nr_accesses) <= thres && +		    abs(prev->nr_accesses - r->nr_accesses) <= thres &&  		    sz_damon_region(prev) + sz_damon_region(r) <= sz_limit)  			damon_merge_two_regions(t, prev, r);  		else |