linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space
@ 2025-04-16  4:25 SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 01/10] mm/damon/core: add damon_ctx->addr_unit SeongJae Park
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Jonathan Corbet, Ze Zuo, damon,
	kernel-team, linux-doc, linux-kernel, linux-mm

DAMON core layer has its own address space that uses 'unsigned long' for
handling addresses.  The underlying DAMON operations set implementation
translates the core layer address to the real address space that it is
working for.   For example, vaddr and fvaddr translates the core layer
addresses to virtual addresses.

However, all operations set layer simply assumes the core layer address
will be same to those for the given address space.  Since the core layer
address uses 'unsigned long', it is ok for virtual addresses.  In case
of physical address space, however, there can be some cases where
'unsigned long' cannot handle whole address.  For example, 32bit arm
machines with large physical address extension (LPAE) is such a case[1].
Arm with LPAE is the only reported use case, but similar cases could
happen in future.

Add a new core layer parameter called 'addr_unit'.  Operations set layer
can translate a core layer address to the real address by multiplying
the parameter value to the core layer address.  Support of the parameter
is up to each operations layer implementation, though.  For example,
operations set implementations for virtual address space can simply
ignore the parameter.  Add the support on paddr, which is the DAMON
operations set implementation for the physical address space, as we have
a clear use case for that.

Patches Sequence
================

The first patch implements the new parameter on DAMON kernel API.

Following five patches (patch 2-6) incrementally add support of the new
parameter on paddr operations set, for monitoring operations and DAMOS
operations for each DAMOS actions.

The seventh patch implements DAMON sysfs ABI for letting users control
the parameter.

Final three patches (patches 8-10) documents the new ABI on design,
usage, and ABI documents, respectively.

[1] https://lore.kernel.org/20250408075553.959388-1-zuoze1@huawei.com

SeongJae Park (10):
  mm/damon/core: add damon_ctx->addr_unit
  mm/damon/paddr: support addr_unit for access monitoring
  mm/damon/paddr: support addr_unit for DAMOS_PAGEOUT
  mm/damon/paddr: support addr_unit for DAMOS_LRU_[DE]PRIO
  mm/damon/paddr: support addr_unit for MIGRATE_{HOT,COLD}
  mm/damon/paddr: support addr_unit for DAMOS_STAT
  mm/damon/sysfs: implement addr_unit file under context dir
  Docs/mm/damon/design: document 'address unit' parameter
  Docs/admin-guide/mm/damon/usage: document addr_unit file
  Docs/ABI/damon: document addr_unit file

 .../ABI/testing/sysfs-kernel-mm-damon         |  7 ++
 Documentation/admin-guide/mm/damon/usage.rst  | 11 ++-
 Documentation/mm/damon/design.rst             | 16 +++-
 include/linux/damon.h                         |  2 +
 mm/damon/core.c                               |  3 +
 mm/damon/paddr.c                              | 95 ++++++++++++-------
 mm/damon/sysfs.c                              | 26 +++++
 7 files changed, 119 insertions(+), 41 deletions(-)


base-commit: b32e0b4ccfbe176a541e7feee0cdaebb957738e7
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 01/10] mm/damon/core: add damon_ctx->addr_unit
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 02/10] mm/damon/paddr: support addr_unit for access monitoring SeongJae Park
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Ze Zuo, damon, kernel-team,
	linux-kernel, linux-mm

In some cases, some of the real address that handled by the underlying
operations set cannot be handled by DAMON since it uses only 'unsinged
long' as the address type.  Using DAMON for physical address space
monitoring of 32 bit ARM devices with large physical address extension
(LPAE) is one example[1].

Add a parameter name 'addr_unit' to core layer to help such cases.
DAMON core API callers can set it as the scale factor that will be used
by the operations set for translating the core layer's addresses to the
real address by multiplying the parameter value to the core layer
address.  Support of the parameter is up to each operations set layer.
The support from the physical address space operations set (paddr) will
be added with following commits.

[1] https://lore.kernel.org/20250408075553.959388-1-zuoze1@huawei.com

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 include/linux/damon.h | 2 ++
 mm/damon/core.c       | 3 +++
 2 files changed, 5 insertions(+)

diff --git a/include/linux/damon.h b/include/linux/damon.h
index ba3604cd4d60..4ea6f07f390b 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -775,6 +775,7 @@ struct damon_attrs {
  * Accesses to other fields must be protected by themselves.
  *
  * @ops:	Set of monitoring operations for given use cases.
+ * @addr_unit:	Scale factor for core to ops address conversion.
  * @callback:	Set of callbacks for monitoring events notifications.
  *
  * @adaptive_targets:	Head of monitoring targets (&damon_target) list.
@@ -817,6 +818,7 @@ struct damon_ctx {
 	struct mutex kdamond_lock;
 
 	struct damon_operations ops;
+	unsigned long addr_unit;
 	struct damon_callback callback;
 
 	struct list_head adaptive_targets;
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 587fb9a4fef8..b78217ad3c5c 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -535,6 +535,8 @@ struct damon_ctx *damon_new_ctx(void)
 	ctx->attrs.min_nr_regions = 10;
 	ctx->attrs.max_nr_regions = 1000;
 
+	ctx->addr_unit = 1;
+
 	INIT_LIST_HEAD(&ctx->adaptive_targets);
 	INIT_LIST_HEAD(&ctx->schemes);
 
@@ -1150,6 +1152,7 @@ int damon_commit_ctx(struct damon_ctx *dst, struct damon_ctx *src)
 	if (err)
 		return err;
 	dst->ops = src->ops;
+	dst->addr_unit = src->addr_unit ? : 1;
 
 	return 0;
 }
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 02/10] mm/damon/paddr: support addr_unit for access monitoring
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 01/10] mm/damon/core: add damon_ctx->addr_unit SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 03/10] mm/damon/paddr: support addr_unit for DAMOS_PAGEOUT SeongJae Park
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Ze Zuo, damon, kernel-team,
	linux-kernel, linux-mm

Add support of addr_unit paramer for access monitoing operations of
paddr.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 mm/damon/paddr.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index b207c79ab9de..bc188aa2f01b 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -58,7 +58,13 @@ static void damon_folio_mkold(struct folio *folio)
 
 }
 
-static void damon_pa_mkold(unsigned long paddr)
+static phys_addr_t damon_pa_phys_addr(
+		unsigned long addr, unsigned long addr_unit)
+{
+	return (phys_addr_t)addr * addr_unit;
+}
+
+static void damon_pa_mkold(phys_addr_t paddr)
 {
 	struct folio *folio = damon_get_folio(PHYS_PFN(paddr));
 
@@ -69,11 +75,12 @@ static void damon_pa_mkold(unsigned long paddr)
 	folio_put(folio);
 }
 
-static void __damon_pa_prepare_access_check(struct damon_region *r)
+static void __damon_pa_prepare_access_check(struct damon_region *r,
+		unsigned long addr_unit)
 {
 	r->sampling_addr = damon_rand(r->ar.start, r->ar.end);
 
-	damon_pa_mkold(r->sampling_addr);
+	damon_pa_mkold(damon_pa_phys_addr(r->sampling_addr, addr_unit));
 }
 
 static void damon_pa_prepare_access_checks(struct damon_ctx *ctx)
@@ -83,7 +90,7 @@ static void damon_pa_prepare_access_checks(struct damon_ctx *ctx)
 
 	damon_for_each_target(t, ctx) {
 		damon_for_each_region(r, t)
-			__damon_pa_prepare_access_check(r);
+			__damon_pa_prepare_access_check(r, ctx->addr_unit);
 	}
 }
 
@@ -156,7 +163,7 @@ static bool damon_folio_young(struct folio *folio)
 	return accessed;
 }
 
-static bool damon_pa_young(unsigned long paddr, unsigned long *folio_sz)
+static bool damon_pa_young(phys_addr_t paddr, unsigned long *folio_sz)
 {
 	struct folio *folio = damon_get_folio(PHYS_PFN(paddr));
 	bool accessed;
@@ -171,23 +178,25 @@ static bool damon_pa_young(unsigned long paddr, unsigned long *folio_sz)
 }
 
 static void __damon_pa_check_access(struct damon_region *r,
-		struct damon_attrs *attrs)
+		struct damon_attrs *attrs, unsigned long addr_unit)
 {
-	static unsigned long last_addr;
+	static phys_addr_t last_addr;
 	static unsigned long last_folio_sz = PAGE_SIZE;
 	static bool last_accessed;
+	phys_addr_t sampling_addr = damon_pa_phys_addr(
+			r->sampling_addr, addr_unit);
 
 	/* If the region is in the last checked page, reuse the result */
 	if (ALIGN_DOWN(last_addr, last_folio_sz) ==
-				ALIGN_DOWN(r->sampling_addr, last_folio_sz)) {
+				ALIGN_DOWN(sampling_addr, last_folio_sz)) {
 		damon_update_region_access_rate(r, last_accessed, attrs);
 		return;
 	}
 
-	last_accessed = damon_pa_young(r->sampling_addr, &last_folio_sz);
+	last_accessed = damon_pa_young(sampling_addr, &last_folio_sz);
 	damon_update_region_access_rate(r, last_accessed, attrs);
 
-	last_addr = r->sampling_addr;
+	last_addr = sampling_addr;
 }
 
 static unsigned int damon_pa_check_accesses(struct damon_ctx *ctx)
@@ -198,7 +207,8 @@ static unsigned int damon_pa_check_accesses(struct damon_ctx *ctx)
 
 	damon_for_each_target(t, ctx) {
 		damon_for_each_region(r, t) {
-			__damon_pa_check_access(r, &ctx->attrs);
+			__damon_pa_check_access(
+					r, &ctx->attrs, ctx->addr_unit);
 			max_nr_accesses = max(r->nr_accesses, max_nr_accesses);
 		}
 	}
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 03/10] mm/damon/paddr: support addr_unit for DAMOS_PAGEOUT
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 01/10] mm/damon/core: add damon_ctx->addr_unit SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 02/10] mm/damon/paddr: support addr_unit for access monitoring SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 04/10] mm/damon/paddr: support addr_unit for DAMOS_LRU_[DE]PRIO SeongJae Park
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Ze Zuo, damon, kernel-team,
	linux-kernel, linux-mm

Add support of addr_unit for DAMOS_PAGEOUT action handling from the
DAMOS operation implementation for the physical address space.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 mm/damon/paddr.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index bc188aa2f01b..169ba81d4182 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -287,10 +287,12 @@ static bool damon_pa_invalid_damos_folio(struct folio *folio, struct damos *s)
 	return false;
 }
 
-static unsigned long damon_pa_pageout(struct damon_region *r, struct damos *s,
+static unsigned long damon_pa_pageout(struct damon_region *r,
+		unsigned long addr_unit, struct damos *s,
 		unsigned long *sz_filter_passed)
 {
-	unsigned long addr, applied;
+	phys_addr_t addr;
+	unsigned long applied;
 	LIST_HEAD(folio_list);
 	bool install_young_filter = true;
 	struct damos_filter *filter;
@@ -311,8 +313,8 @@ static unsigned long damon_pa_pageout(struct damon_region *r, struct damos *s,
 		damos_add_filter(s, filter);
 	}
 
-	addr = r->ar.start;
-	while (addr < r->ar.end) {
+	addr = damon_pa_phys_addr(r->ar.start, addr_unit);
+	while (addr < damon_pa_phys_addr(r->ar.end, addr_unit)) {
 		folio = damon_get_folio(PHYS_PFN(addr));
 		if (damon_pa_invalid_damos_folio(folio, s)) {
 			addr += PAGE_SIZE;
@@ -672,9 +674,11 @@ static unsigned long damon_pa_apply_scheme(struct damon_ctx *ctx,
 		struct damon_target *t, struct damon_region *r,
 		struct damos *scheme, unsigned long *sz_filter_passed)
 {
+	unsigned long aunit = ctx->addr_unit;
+
 	switch (scheme->action) {
 	case DAMOS_PAGEOUT:
-		return damon_pa_pageout(r, scheme, sz_filter_passed);
+		return damon_pa_pageout(r, aunit, scheme, sz_filter_passed);
 	case DAMOS_LRU_PRIO:
 		return damon_pa_mark_accessed(r, scheme, sz_filter_passed);
 	case DAMOS_LRU_DEPRIO:
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 04/10] mm/damon/paddr: support addr_unit for DAMOS_LRU_[DE]PRIO
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
                   ` (2 preceding siblings ...)
  2025-04-16  4:25 ` [RFC PATCH 03/10] mm/damon/paddr: support addr_unit for DAMOS_PAGEOUT SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 05/10] mm/damon/paddr: support addr_unit for MIGRATE_{HOT,COLD} SeongJae Park
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Ze Zuo, damon, kernel-team,
	linux-kernel, linux-mm

Add support of addr_unit for DAMOS_LRU_PRIO and DAMOS_LRU_DEPRIO action
handling from the DAMOS operation implementation for the physical
address space.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 mm/damon/paddr.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index 169ba81d4182..fc1c720e8cb5 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -347,14 +347,16 @@ static unsigned long damon_pa_pageout(struct damon_region *r,
 }
 
 static inline unsigned long damon_pa_mark_accessed_or_deactivate(
-		struct damon_region *r, struct damos *s, bool mark_accessed,
+		struct damon_region *r, unsigned long addr_unit,
+		struct damos *s, bool mark_accessed,
 		unsigned long *sz_filter_passed)
 {
-	unsigned long addr, applied = 0;
+	phys_addr_t addr;
+	unsigned long applied = 0;
 	struct folio *folio;
 
-	addr = r->ar.start;
-	while (addr < r->ar.end) {
+	addr = damon_pa_phys_addr(r->ar.start, addr_unit);
+	while (addr < damon_pa_phys_addr(r->ar.end, addr_unit)) {
 		folio = damon_get_folio(PHYS_PFN(addr));
 		if (damon_pa_invalid_damos_folio(folio, s)) {
 			addr += PAGE_SIZE;
@@ -380,16 +382,18 @@ static inline unsigned long damon_pa_mark_accessed_or_deactivate(
 }
 
 static unsigned long damon_pa_mark_accessed(struct damon_region *r,
-	struct damos *s, unsigned long *sz_filter_passed)
+		unsigned long addr_unit, struct damos *s,
+		unsigned long *sz_filter_passed)
 {
-	return damon_pa_mark_accessed_or_deactivate(r, s, true,
+	return damon_pa_mark_accessed_or_deactivate(r, addr_unit, s, true,
 			sz_filter_passed);
 }
 
 static unsigned long damon_pa_deactivate_pages(struct damon_region *r,
-	struct damos *s, unsigned long *sz_filter_passed)
+		unsigned long addr_unit, struct damos *s,
+		unsigned long *sz_filter_passed)
 {
-	return damon_pa_mark_accessed_or_deactivate(r, s, false,
+	return damon_pa_mark_accessed_or_deactivate(r, addr_unit, s, false,
 			sz_filter_passed);
 }
 
@@ -680,9 +684,11 @@ static unsigned long damon_pa_apply_scheme(struct damon_ctx *ctx,
 	case DAMOS_PAGEOUT:
 		return damon_pa_pageout(r, aunit, scheme, sz_filter_passed);
 	case DAMOS_LRU_PRIO:
-		return damon_pa_mark_accessed(r, scheme, sz_filter_passed);
+		return damon_pa_mark_accessed(r, aunit, scheme,
+				sz_filter_passed);
 	case DAMOS_LRU_DEPRIO:
-		return damon_pa_deactivate_pages(r, scheme, sz_filter_passed);
+		return damon_pa_deactivate_pages(r, aunit, scheme,
+				sz_filter_passed);
 	case DAMOS_MIGRATE_HOT:
 	case DAMOS_MIGRATE_COLD:
 		return damon_pa_migrate(r, scheme, sz_filter_passed);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 05/10] mm/damon/paddr: support addr_unit for MIGRATE_{HOT,COLD}
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
                   ` (3 preceding siblings ...)
  2025-04-16  4:25 ` [RFC PATCH 04/10] mm/damon/paddr: support addr_unit for DAMOS_LRU_[DE]PRIO SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 06/10] mm/damon/paddr: support addr_unit for DAMOS_STAT SeongJae Park
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Ze Zuo, damon, kernel-team,
	linux-kernel, linux-mm

Add support of addr_unit for DAMOS_MIGRATE_HOT and DAMOS_MIGRATE_COLD
action handling from the DAMOS operation implementation for the physical
address space.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 mm/damon/paddr.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index fc1c720e8cb5..20955eefcdbf 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -518,15 +518,17 @@ static unsigned long damon_pa_migrate_pages(struct list_head *folio_list,
 	return nr_migrated;
 }
 
-static unsigned long damon_pa_migrate(struct damon_region *r, struct damos *s,
+static unsigned long damon_pa_migrate(struct damon_region *r,
+		unsigned long addr_unit, struct damos *s,
 		unsigned long *sz_filter_passed)
 {
-	unsigned long addr, applied;
+	phys_addr_t addr;
+	unsigned long applied;
 	LIST_HEAD(folio_list);
 	struct folio *folio;
 
-	addr = r->ar.start;
-	while (addr < r->ar.end) {
+	addr = damon_pa_phys_addr(r->ar.start, addr_unit);
+	while (addr < damon_pa_phys_addr(r->ar.end, addr_unit)) {
 		folio = damon_get_folio(PHYS_PFN(addr));
 		if (damon_pa_invalid_damos_folio(folio, s)) {
 			addr += PAGE_SIZE;
@@ -691,7 +693,7 @@ static unsigned long damon_pa_apply_scheme(struct damon_ctx *ctx,
 				sz_filter_passed);
 	case DAMOS_MIGRATE_HOT:
 	case DAMOS_MIGRATE_COLD:
-		return damon_pa_migrate(r, scheme, sz_filter_passed);
+		return damon_pa_migrate(r, aunit, scheme, sz_filter_passed);
 #ifdef CONFIG_ACMA
 	case DAMOS_ALLOC:
 		return damon_pa_alloc_or_free(r, scheme, true);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 06/10] mm/damon/paddr: support addr_unit for DAMOS_STAT
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
                   ` (4 preceding siblings ...)
  2025-04-16  4:25 ` [RFC PATCH 05/10] mm/damon/paddr: support addr_unit for MIGRATE_{HOT,COLD} SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 07/10] mm/damon/sysfs: implement addr_unit file under context dir SeongJae Park
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Ze Zuo, damon, kernel-team,
	linux-kernel, linux-mm

Add support of addr_unit for DAMOS_STAT action handling from the DAMOS
operation implementation for the physical address space.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 mm/damon/paddr.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index 20955eefcdbf..0d6491159a04 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -562,18 +562,19 @@ static bool damon_pa_scheme_has_filter(struct damos *s)
 	return false;
 }
 
-static unsigned long damon_pa_stat(struct damon_region *r, struct damos *s,
+static unsigned long damon_pa_stat(struct damon_region *r,
+		unsigned long addr_unit, struct damos *s,
 		unsigned long *sz_filter_passed)
 {
-	unsigned long addr;
+	phys_addr_t addr;
 	LIST_HEAD(folio_list);
 	struct folio *folio;
 
 	if (!damon_pa_scheme_has_filter(s))
 		return 0;
 
-	addr = r->ar.start;
-	while (addr < r->ar.end) {
+	addr = damon_pa_phys_addr(r->ar.start, addr_unit);
+	while (addr < damon_pa_phys_addr(r->ar.end, addr_unit)) {
 		folio = damon_get_folio(PHYS_PFN(addr));
 		if (damon_pa_invalid_damos_folio(folio, s)) {
 			addr += PAGE_SIZE;
@@ -701,7 +702,7 @@ static unsigned long damon_pa_apply_scheme(struct damon_ctx *ctx,
 		return damon_pa_alloc_or_free(r, scheme, false);
 #endif
 	case DAMOS_STAT:
-		return damon_pa_stat(r, scheme, sz_filter_passed);
+		return damon_pa_stat(r, aunit, scheme, sz_filter_passed);
 	default:
 		/* DAMOS actions that not yet supported by 'paddr'. */
 		break;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 07/10] mm/damon/sysfs: implement addr_unit file under context dir
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
                   ` (5 preceding siblings ...)
  2025-04-16  4:25 ` [RFC PATCH 06/10] mm/damon/paddr: support addr_unit for DAMOS_STAT SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 08/10] Docs/mm/damon/design: document 'address unit' parameter SeongJae Park
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Ze Zuo, damon, kernel-team,
	linux-kernel, linux-mm

Only DAMON kernel API callers can use addr_unit parameter.  Implement a
sysfs file to let DAMON sysfs ABI users use it.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 mm/damon/sysfs.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c
index 1af6aff35d84..ebd7cfa235b0 100644
--- a/mm/damon/sysfs.c
+++ b/mm/damon/sysfs.c
@@ -821,6 +821,7 @@ static const char * const damon_sysfs_ops_strs[] = {
 struct damon_sysfs_context {
 	struct kobject kobj;
 	enum damon_ops_id ops_id;
+	unsigned long addr_unit;
 	struct damon_sysfs_attrs *attrs;
 	struct damon_sysfs_targets *targets;
 	struct damon_sysfs_schemes *schemes;
@@ -836,6 +837,7 @@ static struct damon_sysfs_context *damon_sysfs_context_alloc(
 		return NULL;
 	context->kobj = (struct kobject){};
 	context->ops_id = ops_id;
+	context->addr_unit = 1;
 	return context;
 }
 
@@ -971,6 +973,25 @@ static ssize_t operations_store(struct kobject *kobj,
 	return -EINVAL;
 }
 
+static ssize_t addr_unit_show(struct kobject *kobj,
+		struct kobj_attribute *attr, char *buf)
+{
+	struct damon_sysfs_context *context = container_of(kobj,
+			struct damon_sysfs_context, kobj);
+
+	return sysfs_emit(buf, "%lu\n", context->addr_unit);
+}
+
+static ssize_t addr_unit_store(struct kobject *kobj,
+		struct kobj_attribute *attr, const char *buf, size_t count)
+{
+	struct damon_sysfs_context *context = container_of(kobj,
+			struct damon_sysfs_context, kobj);
+	int err = kstrtoul(buf, 0, &context->addr_unit);
+
+	return err ? err : count;
+}
+
 static void damon_sysfs_context_release(struct kobject *kobj)
 {
 	kfree(container_of(kobj, struct damon_sysfs_context, kobj));
@@ -982,9 +1003,13 @@ static struct kobj_attribute damon_sysfs_context_avail_operations_attr =
 static struct kobj_attribute damon_sysfs_context_operations_attr =
 		__ATTR_RW_MODE(operations, 0600);
 
+static struct kobj_attribute damon_sysfs_context_addr_unit_attr =
+		__ATTR_RW_MODE(addr_unit, 0600);
+
 static struct attribute *damon_sysfs_context_attrs[] = {
 	&damon_sysfs_context_avail_operations_attr.attr,
 	&damon_sysfs_context_operations_attr.attr,
+	&damon_sysfs_context_addr_unit_attr.attr,
 	NULL,
 };
 ATTRIBUTE_GROUPS(damon_sysfs_context);
@@ -1414,6 +1439,7 @@ static int damon_sysfs_apply_inputs(struct damon_ctx *ctx,
 	err = damon_select_ops(ctx, sys_ctx->ops_id);
 	if (err)
 		return err;
+	ctx->addr_unit = sys_ctx->addr_unit;
 	err = damon_sysfs_set_attrs(ctx, sys_ctx->attrs);
 	if (err)
 		return err;
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 08/10] Docs/mm/damon/design: document 'address unit' parameter
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
                   ` (6 preceding siblings ...)
  2025-04-16  4:25 ` [RFC PATCH 07/10] mm/damon/sysfs: implement addr_unit file under context dir SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 09/10] Docs/admin-guide/mm/damon/usage: document addr_unit file SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 10/10] Docs/ABI/damon: " SeongJae Park
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Jonathan Corbet, Ze Zuo, damon,
	kernel-team, linux-doc, linux-kernel, linux-mm

Add 'addr_unit' parameter description on DAMON design document.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 Documentation/mm/damon/design.rst | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/design.rst
index aa01d0232adc..696a4d738cb3 100644
--- a/Documentation/mm/damon/design.rst
+++ b/Documentation/mm/damon/design.rst
@@ -69,7 +69,7 @@ processes, NUMA nodes, files, and backing memory devices would be supportable.
 Also, if some architectures or devices support special optimized access check
 features, those will be easily configurable.
 
-DAMON currently provides below three operation sets.  Below two subsections
+DAMON currently provides below three operation sets.  Below three subsections
 describe how those work.
 
  - vaddr: Monitor virtual address spaces of specific processes
@@ -137,6 +137,18 @@ the interference is the responsibility of sysadmins.  However, it solves the
 conflict with the reclaim logic using ``PG_idle`` and ``PG_young`` page flags,
 as Idle page tracking does.
 
+Address Unit
+------------
+
+DAMON core layer uses ``unsinged long`` type for monitoring target address
+ranges.  In some cases, the address space for a given operations set could be
+too large to be handled with the type.  ARM (32-bit) with large physical
+address extension is an example.  For such cases, a per-operations set
+parameter called ``address unit`` is provided.  It represents the scale factor
+that need to be multiplied to the core layer's address for calculating real
+address on the given address space.  Support of ``address unit`` parameter is
+up to each operations set implementation.  ``paddr`` is the only operations set
+implementation that supports the parameter.
 
 .. _damon_core_logic:
 
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 09/10] Docs/admin-guide/mm/damon/usage: document addr_unit file
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
                   ` (7 preceding siblings ...)
  2025-04-16  4:25 ` [RFC PATCH 08/10] Docs/mm/damon/design: document 'address unit' parameter SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  2025-04-16  4:25 ` [RFC PATCH 10/10] Docs/ABI/damon: " SeongJae Park
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Jonathan Corbet, Ze Zuo, damon,
	kernel-team, linux-doc, linux-kernel, linux-mm

Document addr_unit DAMON sysfs file on DAMON usage document.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 Documentation/admin-guide/mm/damon/usage.rst | 11 +++++++----
 Documentation/mm/damon/design.rst            |  2 ++
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/Documentation/admin-guide/mm/damon/usage.rst b/Documentation/admin-guide/mm/damon/usage.rst
index ced2013db3df..7638bbaf9939 100644
--- a/Documentation/admin-guide/mm/damon/usage.rst
+++ b/Documentation/admin-guide/mm/damon/usage.rst
@@ -61,7 +61,7 @@ comma (",").
     │ :ref:`kdamonds <sysfs_kdamonds>`/nr_kdamonds
     │ │ :ref:`0 <sysfs_kdamond>`/state,pid
     │ │ │ :ref:`contexts <sysfs_contexts>`/nr_contexts
-    │ │ │ │ :ref:`0 <sysfs_context>`/avail_operations,operations
+    │ │ │ │ :ref:`0 <sysfs_context>`/avail_operations,operations,addr_unit
     │ │ │ │ │ :ref:`monitoring_attrs <sysfs_monitoring_attrs>`/
     │ │ │ │ │ │ intervals/sample_us,aggr_us,update_us
     │ │ │ │ │ │ │ intervals_goal/access_bp,aggrs,min_sample_us,max_sample_us
@@ -179,9 +179,9 @@ details).  At the moment, only one context per kdamond is supported, so only
 contexts/<N>/
 -------------
 
-In each context directory, two files (``avail_operations`` and ``operations``)
-and three directories (``monitoring_attrs``, ``targets``, and ``schemes``)
-exist.
+In each context directory, three files (``avail_operations``, ``operations``
+and ``addr_unit``) and three directories (``monitoring_attrs``, ``targets``,
+and ``schemes``) exist.
 
 DAMON supports multiple types of :ref:`monitoring operations
 <damon_design_configurable_operations_set>`, including those for virtual address
@@ -196,6 +196,9 @@ You can set and get what type of monitoring operations DAMON will use for the
 context by writing one of the keywords listed in ``avail_operations`` file and
 reading from the ``operations`` file.
 
+``addr_unit`` file is for setting and getting the :ref:`address unit
+<damon_design_addr_unit>` parameter of the operations set.
+
 .. _sysfs_monitoring_attrs:
 
 contexts/<N>/monitoring_attrs/
diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/design.rst
index 696a4d738cb3..56bfc0abff36 100644
--- a/Documentation/mm/damon/design.rst
+++ b/Documentation/mm/damon/design.rst
@@ -137,6 +137,8 @@ the interference is the responsibility of sysadmins.  However, it solves the
 conflict with the reclaim logic using ``PG_idle`` and ``PG_young`` page flags,
 as Idle page tracking does.
 
+.. _damon_design_addr_unit:
+
 Address Unit
 ------------
 
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC PATCH 10/10] Docs/ABI/damon: document addr_unit file
  2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
                   ` (8 preceding siblings ...)
  2025-04-16  4:25 ` [RFC PATCH 09/10] Docs/admin-guide/mm/damon/usage: document addr_unit file SeongJae Park
@ 2025-04-16  4:25 ` SeongJae Park
  9 siblings, 0 replies; 11+ messages in thread
From: SeongJae Park @ 2025-04-16  4:25 UTC (permalink / raw)
  Cc: SeongJae Park, Andrew Morton, Ze Zuo, damon, kernel-team,
	linux-kernel, linux-mm

Document addr_unit DAMON sysfs file on DAMON ABI document.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 Documentation/ABI/testing/sysfs-kernel-mm-damon | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-kernel-mm-damon b/Documentation/ABI/testing/sysfs-kernel-mm-damon
index 293197f180ad..40b7735f57d5 100644
--- a/Documentation/ABI/testing/sysfs-kernel-mm-damon
+++ b/Documentation/ABI/testing/sysfs-kernel-mm-damon
@@ -70,6 +70,13 @@ Description:	Writing a keyword for a monitoring operations set ('vaddr' for
 		Note that only the operations sets that listed in
 		'avail_operations' file are valid inputs.
 
+What:		/sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/addr_unit
+Date:		Apr 2025
+Contact:	SeongJae Park <sj@kernel.org>
+Description:	Writing an integer to this file sets the 'address unit'
+		parameter of the given operations set of the context.  Reading
+		the file returns the last-written 'address unit' value.
+
 What:		/sys/kernel/mm/damon/admin/kdamonds/<K>/contexts/<C>/monitoring_attrs/intervals/sample_us
 Date:		Mar 2022
 Contact:	SeongJae Park <sj@kernel.org>
-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2025-04-16  4:26 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-16  4:25 [RFC PATCH 00/10] mm/damon: support address space larger than damon-core address space SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 01/10] mm/damon/core: add damon_ctx->addr_unit SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 02/10] mm/damon/paddr: support addr_unit for access monitoring SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 03/10] mm/damon/paddr: support addr_unit for DAMOS_PAGEOUT SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 04/10] mm/damon/paddr: support addr_unit for DAMOS_LRU_[DE]PRIO SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 05/10] mm/damon/paddr: support addr_unit for MIGRATE_{HOT,COLD} SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 06/10] mm/damon/paddr: support addr_unit for DAMOS_STAT SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 07/10] mm/damon/sysfs: implement addr_unit file under context dir SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 08/10] Docs/mm/damon/design: document 'address unit' parameter SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 09/10] Docs/admin-guide/mm/damon/usage: document addr_unit file SeongJae Park
2025-04-16  4:25 ` [RFC PATCH 10/10] Docs/ABI/damon: " SeongJae Park

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox