mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
mm/damon/core: introduce damon_region->probe_hits
Add an array for the per-region per-probe positive samples count. For simple and efficient implementation, add a limit to the number of data probes and set the array to support only the limited number of counters. Link: https://lore.kernel.org/20260518234119.97569-6-sj@kernel.org Signed-off-by: SeongJae Park <sj@kernel.org> Cc: David Hildenbrand <david@kernel.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Liam R. Howlett <liam@infradead.org> Cc: Lorenzo Stoakes <ljs@kernel.org> Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Rapoport <rppt@kernel.org> Cc: Shuah Khan <shuah@kernel.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
d0de4b29c7
commit
57c6332f25
|
|
@ -17,6 +17,8 @@
|
|||
|
||||
/* Minimal region size. Every damon_region is aligned by this. */
|
||||
#define DAMON_MIN_REGION_SZ PAGE_SIZE
|
||||
/* Maximum number of monitoring probes. */
|
||||
#define DAMON_MAX_PROBES (4)
|
||||
/* Max priority score for DAMON-based operation schemes */
|
||||
#define DAMOS_MAX_SCORE (99)
|
||||
|
||||
|
|
@ -47,6 +49,7 @@ struct damon_size_range {
|
|||
* @nr_accesses: Access frequency of this region.
|
||||
* @nr_accesses_bp: @nr_accesses in basis point (0.01%) that updated for
|
||||
* each sampling interval.
|
||||
* @probe_hits: Number of probe-positive region samples.
|
||||
* @list: List head for siblings.
|
||||
* @age: Age of this region.
|
||||
*
|
||||
|
|
@ -75,6 +78,7 @@ struct damon_region {
|
|||
unsigned long sampling_addr;
|
||||
unsigned int nr_accesses;
|
||||
unsigned int nr_accesses_bp;
|
||||
unsigned char probe_hits[DAMON_MAX_PROBES];
|
||||
struct list_head list;
|
||||
|
||||
unsigned int age;
|
||||
|
|
|
|||
|
|
@ -229,6 +229,7 @@ static void damon_verify_new_region(unsigned long start, unsigned long end)
|
|||
struct damon_region *damon_new_region(unsigned long start, unsigned long end)
|
||||
{
|
||||
struct damon_region *region;
|
||||
int i;
|
||||
|
||||
damon_verify_new_region(start, end);
|
||||
region = kmem_cache_alloc(damon_region_cache, GFP_KERNEL);
|
||||
|
|
@ -239,6 +240,8 @@ struct damon_region *damon_new_region(unsigned long start, unsigned long end)
|
|||
region->ar.end = end;
|
||||
region->nr_accesses = 0;
|
||||
region->nr_accesses_bp = 0;
|
||||
for (i = 0; i < DAMON_MAX_PROBES; i++)
|
||||
region->probe_hits[i] = 0;
|
||||
INIT_LIST_HEAD(®ion->list);
|
||||
|
||||
region->age = 0;
|
||||
|
|
@ -2980,12 +2983,17 @@ static void damon_merge_two_regions(struct damon_target *t,
|
|||
struct damon_region *l, struct damon_region *r)
|
||||
{
|
||||
unsigned long sz_l = damon_sz_region(l), sz_r = damon_sz_region(r);
|
||||
int i;
|
||||
|
||||
l->nr_accesses = (l->nr_accesses * sz_l + r->nr_accesses * sz_r) /
|
||||
(sz_l + sz_r);
|
||||
l->nr_accesses_bp = l->nr_accesses * 10000;
|
||||
l->age = (l->age * sz_l + r->age * sz_r) / (sz_l + sz_r);
|
||||
l->ar.end = r->ar.end;
|
||||
/* todo: do this for only installed probes */
|
||||
for (i = 0; i < DAMON_MAX_PROBES; i++)
|
||||
l->probe_hits[i] = (l->probe_hits[i] * sz_l + r->probe_hits[i]
|
||||
* sz_r) / (sz_l + sz_r);
|
||||
damon_verify_merge_two_regions(l, r);
|
||||
damon_destroy_region(r, t);
|
||||
}
|
||||
|
|
@ -3108,6 +3116,8 @@ static void damon_split_region_at(struct damon_target *t,
|
|||
new->last_nr_accesses = r->last_nr_accesses;
|
||||
new->nr_accesses_bp = r->nr_accesses_bp;
|
||||
new->nr_accesses = r->nr_accesses;
|
||||
/* todo: do this for only installed probes */
|
||||
memcpy(new->probe_hits, r->probe_hits, sizeof(r->probe_hits));
|
||||
|
||||
damon_insert_region(new, r, damon_next_region(r), t);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user