From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB8BF3375C3; Thu, 28 Aug 2025 17:12:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401169; cv=none; b=T1Gj4fRIhWcXkrOCEmCwAavEQI8RkDhMLO2b4ib30cP86niqgz5SK0lX3j7sbzteY3irHulEDbXyjCKMwahrpO2uIHkHwcI+cZkm2dsjtRxhJqNj5fDjx6oysWueV9gW0SiQMsBoiuzUYZMXcghgaYyTAX8RMkbxuURDU6yruKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401169; c=relaxed/simple; bh=V00Ezz8Ti9dBe1Ak1a5KDdHP0ELwfwe8yMUv7LlWbPg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Eh1iaQuGYLdcKp7GF8n5i2pZ2+2f0CfbtLNJc80sH3lw29069LLIwtQ9UW/SrWcpEX6qN+uRPQuiSOBlIXz/R6dF/a0tHhcBqwYOuuBo6MOlfCeoPxifZlgvVykTnvT2L8U5nhUh84y5sxRbgR0S9K55R9yv20zjBSdB4Z9eOiQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jaUpxdvz; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jaUpxdvz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 66073C4CEED; Thu, 28 Aug 2025 17:12:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401168; bh=V00Ezz8Ti9dBe1Ak1a5KDdHP0ELwfwe8yMUv7LlWbPg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jaUpxdvzwwym0dlXeMFT+KGkRyAyLcOmfh1XaxJ6PQ2LFMXvXYB06OBDEQdbjg4o/ fF9cV3X0q+tdhnJaLYSTQ6gPIeQX615Jskmq5ZEqz3AgoKz87zh8HndeImZRRCQ9JO Z7sCkYsdwdS92Q5unjCX+cvUTbu2ynw9OTkrdmDQ9YCuF9vN0WQHKVnKlav/EYb+cA ZOhCiPJhMHs0k2UD0Obf7mN2rq4gQsEwYt/icehBaA5sz3A+83wEcDg0BzFhQ9q9q1 xYEv36Vn+4vPlN8grelrrG3aVTrfKo3cSkBDOC54Eq3tOzdDG4GHkeY9wwfmTxBjmf T5+YPJY6kiyJg== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , Quanmin Yan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 01/11] mm/damon/core: add damon_ctx->addr_unit Date: Thu, 28 Aug 2025 10:12:32 -0700 Message-Id: <20250828171242.59810-2-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- include/linux/damon.h | 3 ++- mm/damon/core.c | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/linux/damon.h b/include/linux/damon.h index d01bfee80bd6..6fa52f7495d9 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -746,7 +746,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. * @adaptive_targets: Head of monitoring targets (&damon_target) list. * @schemes: Head of schemes (&damos) list. */ @@ -788,6 +788,7 @@ struct damon_ctx { struct mutex kdamond_lock; =20 struct damon_operations ops; + unsigned long addr_unit; =20 struct list_head adaptive_targets; struct list_head schemes; diff --git a/mm/damon/core.c b/mm/damon/core.c index 5ac1433860a3..acea2964b9cc 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -544,6 +544,8 @@ struct damon_ctx *damon_new_ctx(void) ctx->attrs.min_nr_regions =3D 10; ctx->attrs.max_nr_regions =3D 1000; =20 + ctx->addr_unit =3D 1; + INIT_LIST_HEAD(&ctx->adaptive_targets); INIT_LIST_HEAD(&ctx->schemes); =20 @@ -1245,6 +1247,7 @@ int damon_commit_ctx(struct damon_ctx *dst, struct da= mon_ctx *src) return err; } dst->ops =3D src->ops; + dst->addr_unit =3D src->addr_unit; =20 return 0; } --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF96A338F5C; Thu, 28 Aug 2025 17:12:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401170; cv=none; b=imfa5gq3seBjyasEvR+qmEvTd//X5+BlhDFCmYAx47076PgPT4zMYvY8hr5ID48Lgi9VGDx7yBJf1aZfoixFve5CsiMRJUMkhRK0NmTif3A+Rpf7JHob8T2FrNYEU5mQV77HrQGDGNXfYy9mlgGYJSiXZR7EPui0iXESP+9IPIo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401170; c=relaxed/simple; bh=/viP4eNKlIp3xNvGENLPiu9ygdeBlYDEw/GbgmbYmHU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dkG7uiWMeKMJxzadHNoxFKQu7QeExBQtUSElCcZeKMfkuMCofRqzHVv4E4XQZQgg9eSKo/v4rhM9IVNK6bIBxsa9jB1SfgYcMvv8vRYQchrun7EFalSjYSPXriZf5U+XvmBFFtIu4++c5kUFjpjpbXFxlSUHUVrOxad1K+8tMDI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ShoWSbxe; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ShoWSbxe" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6DED1C4CEEB; Thu, 28 Aug 2025 17:12:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401169; bh=/viP4eNKlIp3xNvGENLPiu9ygdeBlYDEw/GbgmbYmHU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ShoWSbxe/VvRANS1E4btJRQii4QhZd4/DyUYBSCTQIJf+/FMvp59isNQLoZyRyWt0 /wRnFM9kYrcNo+SdHTDNCzwhIYfMoH/Opof0rlgrAxwNB7U4E+vdyPYfjgJ3R13Hwb /OVKiFSvOuap6k0V6h/XNSqen2Gt98MzZkp9J/7vJCtSWZFqSVQ1hDNcsvjWW92eN4 1tk38a9xbnwiNQErYYyxtmHetcl99oox3epZiEWoElrPgQZbZf+lIN/l6xeis+GEZ+ HikmhBENmXwOZk3CbzDeLf/UpEF8EJOtrDrmnls8ylJgkXQ5xH8c4wVMvTHHvCo6Ok wuljHjyCK4eRg== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , Quanmin Yan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 02/11] mm/damon/paddr: support addr_unit for access monitoring Date: Thu, 28 Aug 2025 10:12:33 -0700 Message-Id: <20250828171242.59810-3-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support of addr_unit paramer for access monitoing operations of paddr. Signed-off-by: SeongJae Park Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- 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 0b67d9321460..d497373c2bd2 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -18,7 +18,13 @@ #include "../internal.h" #include "ops-common.h" =20 -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 =3D damon_get_folio(PHYS_PFN(paddr)); =20 @@ -29,11 +35,12 @@ static void damon_pa_mkold(unsigned long paddr) folio_put(folio); } =20 -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 =3D damon_rand(r->ar.start, r->ar.end); =20 - damon_pa_mkold(r->sampling_addr); + damon_pa_mkold(damon_pa_phys_addr(r->sampling_addr, addr_unit)); } =20 static void damon_pa_prepare_access_checks(struct damon_ctx *ctx) @@ -43,11 +50,11 @@ static void damon_pa_prepare_access_checks(struct damon= _ctx *ctx) =20 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); } } =20 -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 =3D damon_get_folio(PHYS_PFN(paddr)); bool accessed; @@ -62,23 +69,25 @@ static bool damon_pa_young(unsigned long paddr, unsigne= d long *folio_sz) } =20 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 =3D PAGE_SIZE; static bool last_accessed; + phys_addr_t sampling_addr =3D damon_pa_phys_addr( + r->sampling_addr, addr_unit); =20 /* If the region is in the last checked page, reuse the result */ if (ALIGN_DOWN(last_addr, last_folio_sz) =3D=3D - 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; } =20 - last_accessed =3D damon_pa_young(r->sampling_addr, &last_folio_sz); + last_accessed =3D damon_pa_young(sampling_addr, &last_folio_sz); damon_update_region_access_rate(r, last_accessed, attrs); =20 - last_addr =3D r->sampling_addr; + last_addr =3D sampling_addr; } =20 static unsigned int damon_pa_check_accesses(struct damon_ctx *ctx) @@ -89,7 +98,8 @@ static unsigned int damon_pa_check_accesses(struct damon_= ctx *ctx) =20 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 =3D max(r->nr_accesses, max_nr_accesses); } } --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 12CA833CEAF; Thu, 28 Aug 2025 17:12:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401171; cv=none; b=dXLx7bJ9/VQ1rU6CjAD30JZB/JP/heNeOe/Ntb+rH4P6KbJRTXhYZm4DbJ0+HvAdlikGF5gFOChqwG0k0Ib1NHIGvTFIkq3Y/a38XxILoEyzhCrR6O7aAyX4progq9gaSSMwn5nJh+ydFIo2wioXZjt3W74aI23V3glDfBGJtX4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401171; c=relaxed/simple; bh=fYhqOdJk8g7Kx4IsyLnZ52pSMGRQylBDNBv4D4Pqc2E=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=p5LT1knze+F6wM56/OrylZO4gXiXs+Hk8S4qxfQk4rxJXKEMqpwghhwUizShn4DBE74c0DbXcIUDd0MEtTpJMTwIiT5v4+vGyRhA+5qUwKATW9nRWkx6SsrGLV0TGyTGXLIxxZYxqX0hj5cvXkH8HsDT9OVxV/yAkW79YELhByE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=E6ZWd3xP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="E6ZWd3xP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6EAC6C4CEF9; Thu, 28 Aug 2025 17:12:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401170; bh=fYhqOdJk8g7Kx4IsyLnZ52pSMGRQylBDNBv4D4Pqc2E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=E6ZWd3xPefENCDvxLUzYqof2Vqp7XK2zl+1MsWwPTYSiCWpjFxzhsxx3HgoYntLd3 KKs80tvDNSYseHgdp4uYx96ZzbbpYJSlJecQaVqV63H0YsIJ1BDp0e6ryZvWuNXpW0 zYxzih8BYLXwpN8Cw2Oa6yWhGH7R7CvoIbOqZFT19Ez0nbgRiBrMor49k9eR8TeYvL Cd/dlw2ZYG6FyuMmrNLl3SaPNnhqyt44NSiCM25b+Zj751sI6Qsp3/fg+r74+/t72u q1YDFa+BHVyU3VbzgDt0GI1Y0IfgyUda78LGuwojc6SkRehc1K9GsfIvddbIe0ztzR fqTUmMnayD8SA== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , Quanmin Yan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 03/11] mm/damon/paddr: support addr_unit for DAMOS_PAGEOUT Date: Thu, 28 Aug 2025 10:12:34 -0700 Message-Id: <20250828171242.59810-4-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- mm/damon/paddr.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c index d497373c2bd2..696aeb0f6c8e 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -24,6 +24,19 @@ static phys_addr_t damon_pa_phys_addr( return (phys_addr_t)addr * addr_unit; } =20 +static unsigned long damon_pa_core_addr( + phys_addr_t pa, unsigned long addr_unit) +{ + /* + * Use div_u64() for avoiding linking errors related with __udivdi3, + * __aeabi_uldivmod, or similar problems. This should also improve the + * performance optimization (read div_u64() comment for the detail). + */ + if (sizeof(pa) =3D=3D 8 && sizeof(addr_unit) =3D=3D 4) + return div_u64(pa, addr_unit); + return pa / addr_unit; +} + static void damon_pa_mkold(phys_addr_t paddr) { struct folio *folio =3D damon_get_folio(PHYS_PFN(paddr)); @@ -135,10 +148,11 @@ static bool damon_pa_invalid_damos_folio(struct folio= *folio, struct damos *s) return false; } =20 -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, applied; LIST_HEAD(folio_list); bool install_young_filter =3D true; struct damos_filter *filter; @@ -159,8 +173,8 @@ static unsigned long damon_pa_pageout(struct damon_regi= on *r, struct damos *s, damos_add_filter(s, filter); } =20 - addr =3D r->ar.start; - while (addr < r->ar.end) { + addr =3D damon_pa_phys_addr(r->ar.start, addr_unit); + while (addr < damon_pa_phys_addr(r->ar.end, addr_unit)) { folio =3D damon_get_folio(PHYS_PFN(addr)); if (damon_pa_invalid_damos_folio(folio, s)) { addr +=3D PAGE_SIZE; @@ -170,7 +184,7 @@ static unsigned long damon_pa_pageout(struct damon_regi= on *r, struct damos *s, if (damos_pa_filter_out(s, folio)) goto put_folio; else - *sz_filter_passed +=3D folio_size(folio); + *sz_filter_passed +=3D folio_size(folio) / addr_unit; =20 folio_clear_referenced(folio); folio_test_clear_young(folio); @@ -189,7 +203,7 @@ static unsigned long damon_pa_pageout(struct damon_regi= on *r, struct damos *s, applied =3D reclaim_pages(&folio_list); cond_resched(); s->last_applied =3D folio; - return applied * PAGE_SIZE; + return damon_pa_core_addr(applied * PAGE_SIZE, addr_unit); } =20 static inline unsigned long damon_pa_mark_accessed_or_deactivate( @@ -302,9 +316,11 @@ static unsigned long damon_pa_apply_scheme(struct damo= n_ctx *ctx, struct damon_target *t, struct damon_region *r, struct damos *scheme, unsigned long *sz_filter_passed) { + unsigned long aunit =3D 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: --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3901433EAF9; Thu, 28 Aug 2025 17:12:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401172; cv=none; b=aTtrJM683ddj8uQojUFn8YN2fvV0J5yUPRUvAIC0RuHxUaIwG3ai0bbq6bQpGEpSvZJ/+QGLU9/4k267q1MK+vcnxQm3Gqw46Qr9BEeUVYrwUHtoCyYbyKYtb97sb4LaLxZbNXh1FlGTQLPEa470JmM+akgaB/avMuNlu/EBLhk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401172; c=relaxed/simple; bh=C5/zayeob6MyHQaVS/Yc9d/xPufVGppR2LXlEsxQyJY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KzslewCS8wn8yceKboz9H9MCt+isFftZ+FX3/qydmlumegB77kv6nLX4aTl4npOFK72QDeqYP8LT3b4RczsE2xht7KoI47K3jyBhevwOD8V/XEvXPyGtdEJy7ljU6efdfbYbjzV61Mwksh/Fi3x8PyH1OGETriJ3snNW4+6H1GY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=E+RxwoPO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="E+RxwoPO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E51FC4CEEB; Thu, 28 Aug 2025 17:12:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401171; bh=C5/zayeob6MyHQaVS/Yc9d/xPufVGppR2LXlEsxQyJY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=E+RxwoPOAEE+6jUb93CGgu+N6foU77IcMgIU/87tAcSSi2wYKwDyaOYnSOSomt+li /xDZnGQAvwX1L2Vek8rmEa461XJOgKk5LfvRos+Abtckv2z4YuKsF239Cbb7dqvvcl dOXRJ3TRkBpJ7ZCqbkCHbWFxIGJSKK2vpGVqHP80M3qeheEoH3esTsRFv41uViIM3o yvU2ehSWKban9MeYyACMeMVN2ff9nv94NHh98uGlL6pykxvRQQQkFavhrIAAeVjcGj ywTA1SpaujwfKMiJ3BLprrKkCE8Rpak/kLQEE4KXxewVlYiXIZeKUMsfgNSpdmbIih S3nuORtUmagUQ== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , Quanmin Yan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 04/11] mm/damon/paddr: support addr_unit for DAMOS_LRU_[DE]PRIO Date: Thu, 28 Aug 2025 10:12:35 -0700 Message-Id: <20250828171242.59810-5-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- mm/damon/paddr.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c index 696aeb0f6c8e..2cd1c9953983 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -207,14 +207,15 @@ static unsigned long damon_pa_pageout(struct damon_re= gion *r, } =20 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 =3D 0; + phys_addr_t addr, applied =3D 0; struct folio *folio; =20 - addr =3D r->ar.start; - while (addr < r->ar.end) { + addr =3D damon_pa_phys_addr(r->ar.start, addr_unit); + while (addr < damon_pa_phys_addr(r->ar.end, addr_unit)) { folio =3D damon_get_folio(PHYS_PFN(addr)); if (damon_pa_invalid_damos_folio(folio, s)) { addr +=3D PAGE_SIZE; @@ -224,7 +225,7 @@ static inline unsigned long damon_pa_mark_accessed_or_d= eactivate( if (damos_pa_filter_out(s, folio)) goto put_folio; else - *sz_filter_passed +=3D folio_size(folio); + *sz_filter_passed +=3D folio_size(folio) / addr_unit; =20 if (mark_accessed) folio_mark_accessed(folio); @@ -236,20 +237,22 @@ static inline unsigned long damon_pa_mark_accessed_or= _deactivate( folio_put(folio); } s->last_applied =3D folio; - return applied * PAGE_SIZE; + return damon_pa_core_addr(applied * PAGE_SIZE, addr_unit); } =20 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); } =20 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); } =20 @@ -322,9 +325,11 @@ static unsigned long damon_pa_apply_scheme(struct damo= n_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); --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 28F0E338F5C; Thu, 28 Aug 2025 17:12:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401173; cv=none; b=EnaI0vK9Fxw9rfQY8aAIf9GvCIvhcUKY66/ZoZoFMMH/PzgwZUzqbnM62JhwTyS7WTHED2atu0sR1HxtWjow1JvypCZnYVW1NCXANjx+oySZtA7S4zxghEP+S2Yq1APEY46zDwgSxZN3b30fVIZ0Dv23OGzQp/Bk7SgUFWrti34= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401173; c=relaxed/simple; bh=rgx+uucpOxswRbmVzaNKcGMA1yTfBZgSAqGGyfaZrnk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Hbw2jZyZawhykyRf2LBW71wzpLaVtBjjBbChkR9B2i7B+geIbN+8wPd87Q3R9aACpOw57LVpKylUW17NGBXuHe4RS4rpS3kGfm6YQ9XbFoDJIrF5LeeBYHoW17Y3a+W9h8D4MXHcvXoJBFLCqY17/XjHXyasVDKPdiNc+joXYRA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XQZRxrmn; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XQZRxrmn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 90E56C4CEED; Thu, 28 Aug 2025 17:12:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401172; bh=rgx+uucpOxswRbmVzaNKcGMA1yTfBZgSAqGGyfaZrnk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XQZRxrmnUXCJGUkcjyA/VIU9G1NHvXvMntxG/GelRHsRAbEEZMBDh8r8YO8d1weBx SUqEv/LszGwvNbwYUsUtZIjhU3WOk8YWG+/8zZZ5jRraXy3tb7C9RSwk/RQm/Z8emv U3Pyq+fmqntP7Z1vUr20VrpirTo5kdXjOgZIkobDOB+yrYD2QHLsDYWl7mxVog2bZi fe6w8yzC8ScLgoJ+hd73ITXEv4/lduJgqP/nTKNsPOmudRPIaGtC01nbkZUPZT7n02 txxPetFCNvbWV7Ng6aNFmsoEZbGPGup5MyPte5q0EidokvZsFXa9eHGLeKuxF1wEaZ +LtcFsTl4cFFw== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , Quanmin Yan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 05/11] mm/damon/paddr: support addr_unit for MIGRATE_{HOT,COLD} Date: Thu, 28 Aug 2025 10:12:36 -0700 Message-Id: <20250828171242.59810-6-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- mm/damon/paddr.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c index 2cd1c9953983..0a122a8a9f1c 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -256,15 +256,16 @@ static unsigned long damon_pa_deactivate_pages(struct= damon_region *r, sz_filter_passed); } =20 -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, applied; LIST_HEAD(folio_list); struct folio *folio; =20 - addr =3D r->ar.start; - while (addr < r->ar.end) { + addr =3D damon_pa_phys_addr(r->ar.start, addr_unit); + while (addr < damon_pa_phys_addr(r->ar.end, addr_unit)) { folio =3D damon_get_folio(PHYS_PFN(addr)); if (damon_pa_invalid_damos_folio(folio, s)) { addr +=3D PAGE_SIZE; @@ -274,7 +275,7 @@ static unsigned long damon_pa_migrate(struct damon_regi= on *r, struct damos *s, if (damos_pa_filter_out(s, folio)) goto put_folio; else - *sz_filter_passed +=3D folio_size(folio); + *sz_filter_passed +=3D folio_size(folio) / addr_unit; =20 if (!folio_isolate_lru(folio)) goto put_folio; @@ -286,7 +287,7 @@ static unsigned long damon_pa_migrate(struct damon_regi= on *r, struct damos *s, applied =3D damon_migrate_pages(&folio_list, s->target_nid); cond_resched(); s->last_applied =3D folio; - return applied * PAGE_SIZE; + return damon_pa_core_addr(applied * PAGE_SIZE, addr_unit); } =20 static unsigned long damon_pa_stat(struct damon_region *r, struct damos *s, @@ -332,7 +333,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); case DAMOS_STAT: return damon_pa_stat(r, scheme, sz_filter_passed); default: --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E6D0E340D90; Thu, 28 Aug 2025 17:12:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401174; cv=none; b=LiiKm4Ufmb0vC8NCI3mjCYWVTscmYBG7KeR+uE8K6qT5AAVoRjESj6EbJt+DlqFIn33Hk5AsR/AvrKdLeLzzbKmXc8cavNWxT+fvor2zyPC9hBR/SuFOlJNdwQ95eK3Q8rge3TcLJa6+9663GfcRFlx2vvqpJJuAFnxwSub7fds= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401174; c=relaxed/simple; bh=s/ZtUKWoi9HlBtotMtbYAXHGNUrzkyLE//5a+5BjQyc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=djPZ/xNVPVJ8dDEGjCiYCrosT8eDkbbXTXx73m0H/qlXgNeOPoadiW2xufA8iRNQ/H7XsgJLnSlp3Z/lKgzWBy/MAQxNLmL6VIc8vG/fLzZcrYMXYOMkfPn6hRUQvqDwKht+Ue+Jz5LkmA7jN2n7+jp4l/YwmRcAZzdieoUf8SY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fmFEKtsF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fmFEKtsF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A0EF0C4CEF4; Thu, 28 Aug 2025 17:12:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401173; bh=s/ZtUKWoi9HlBtotMtbYAXHGNUrzkyLE//5a+5BjQyc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fmFEKtsF9NbDuJufKLJyMTnrxl4FEig2ZS4T+ULHygt3c8X7mDRAtCE5JAqcculiU kyUE6iiiyi6fCLo3tx9CD3MPDkgiMihYeEpgqr/aRtpxbxs9TPz6SdGY4eB0I057BY ZZBB3paIFdzOnC6yw1xnBAC6YBGb82+uCLxehk28tncossRjUA+r1qA4vpHB2YnNnF oIa4cQxY78apjx6gQyTcgbPJFIB6Q0kM52+yTXLn7a+i8FVY0cLh3/OBhxQxc0iEVX R5UKPDu38pyq5cY6Yw8gitFjkd1t/11AOrI3kOt1a7aGgOVz3z8oAUGUX7eSycSlMx Jym+oTukm3YaQ== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , Quanmin Yan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 06/11] mm/damon/paddr: support addr_unit for DAMOS_STAT Date: Thu, 28 Aug 2025 10:12:37 -0700 Message-Id: <20250828171242.59810-7-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- mm/damon/paddr.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c index 0a122a8a9f1c..07a8aead439e 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -290,17 +290,18 @@ static unsigned long damon_pa_migrate(struct damon_re= gion *r, return damon_pa_core_addr(applied * PAGE_SIZE, addr_unit); } =20 -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; struct folio *folio; =20 if (!damos_ops_has_filter(s)) return 0; =20 - addr =3D r->ar.start; - while (addr < r->ar.end) { + addr =3D damon_pa_phys_addr(r->ar.start, addr_unit); + while (addr < damon_pa_phys_addr(r->ar.end, addr_unit)) { folio =3D damon_get_folio(PHYS_PFN(addr)); if (damon_pa_invalid_damos_folio(folio, s)) { addr +=3D PAGE_SIZE; @@ -308,7 +309,7 @@ static unsigned long damon_pa_stat(struct damon_region = *r, struct damos *s, } =20 if (!damos_pa_filter_out(s, folio)) - *sz_filter_passed +=3D folio_size(folio); + *sz_filter_passed +=3D folio_size(folio) / addr_unit; addr +=3D folio_size(folio); folio_put(folio); } @@ -335,7 +336,7 @@ static unsigned long damon_pa_apply_scheme(struct damon= _ctx *ctx, case DAMOS_MIGRATE_COLD: return damon_pa_migrate(r, aunit, scheme, sz_filter_passed); 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; --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 021F1341646; Thu, 28 Aug 2025 17:12:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401175; cv=none; b=k3eLlzElerlPQv9clPaEUGmXMEL4Y6udkjfS9djqevwbnblIjNGFeU/P5S+r80NYVEY6+s2ZcLw39WqTClBQJoLEGlAAiU82A78pP55UnpjzdRzhCK6jMSydI4eTk1ArfT+hKX2wv1k//gV83GzhS/rNQeR47Xf0W0x+QLpcR/A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401175; c=relaxed/simple; bh=BBbyydnwAs+XoNN413vvEKNIDBGc2IkMvtIzus1iybo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Mjk6Y81/LtN8JqrSNXiyUBQYSOOnHg8VS1rNshC5oItF+BWTn8mio+Peu0TgjMIxdv+XgV4Ne88rGR+OV+hbfFZBjG3021uehUYloAaqA7kQ1FaWeRrb3lqvZHRSybkjKyxKt68E55mKp4Xp942Or4CnKiHHUkwdTjnnVgGMZ/k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UH9OD/nH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UH9OD/nH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A9F37C4CEEB; Thu, 28 Aug 2025 17:12:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401174; bh=BBbyydnwAs+XoNN413vvEKNIDBGc2IkMvtIzus1iybo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UH9OD/nHql8BkKwDV6clvDMyCvuuDAVn4QXQrqdQgRCKAn45/yaH7ZhIXJq4NhQe8 X/tdfyGZamgbpDx/dAKScIx+v2emHEdN2YPtXEJD7YpGWlxqVFmaQ/r9xNyiH2jBAG 7tfe/iEM6vmp3ObBIaU9/2zq+j2SPO5jYkHOJl+imDDd69SJlU75QICwwHm8mDkaTM vhQmWqTFd166GJDhalcloBfgmonSjiB0eKeMruetNgXIqJMhel5N5MIsrUc3vHMhIS cjQh2fUImtoMjxJCuA3kZphZ9QHS4DYyQfPI/w6mGSeqZq2zsYSq8MvZUirLElBHho zoQWAbeUV/arA== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , Quanmin Yan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 07/11] mm/damon/sysfs: implement addr_unit file under context dir Date: Thu, 28 Aug 2025 10:12:38 -0700 Message-Id: <20250828171242.59810-8-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Only DAMON kernel API callers can use addr_unit parameter. Implement a sysfs file to let DAMON sysfs ABI users use it. Additionally, addr_unit must be set to a non-zero value. Signed-off-by: SeongJae Park Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- mm/damon/sysfs.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 6d2b0dab50cb..98bf15d403b2 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -834,6 +834,7 @@ static const struct damon_sysfs_ops_name damon_sysfs_op= s_names[] =3D { 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; @@ -849,6 +850,7 @@ static struct damon_sysfs_context *damon_sysfs_context_= alloc( return NULL; context->kobj =3D (struct kobject){}; context->ops_id =3D ops_id; + context->addr_unit =3D 1; return context; } =20 @@ -997,6 +999,32 @@ static ssize_t operations_store(struct kobject *kobj, return -EINVAL; } =20 +static ssize_t addr_unit_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_context *context =3D 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 =3D container_of(kobj, + struct damon_sysfs_context, kobj); + unsigned long input_addr_unit; + int err =3D kstrtoul(buf, 0, &input_addr_unit); + + if (err) + return err; + if (!input_addr_unit) + return -EINVAL; + + context->addr_unit =3D input_addr_unit; + return count; +} + static void damon_sysfs_context_release(struct kobject *kobj) { kfree(container_of(kobj, struct damon_sysfs_context, kobj)); @@ -1008,9 +1036,13 @@ static struct kobj_attribute damon_sysfs_context_ava= il_operations_attr =3D static struct kobj_attribute damon_sysfs_context_operations_attr =3D __ATTR_RW_MODE(operations, 0600); =20 +static struct kobj_attribute damon_sysfs_context_addr_unit_attr =3D + __ATTR_RW_MODE(addr_unit, 0600); + static struct attribute *damon_sysfs_context_attrs[] =3D { &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); @@ -1397,6 +1429,7 @@ static int damon_sysfs_apply_inputs(struct damon_ctx = *ctx, err =3D damon_select_ops(ctx, sys_ctx->ops_id); if (err) return err; + ctx->addr_unit =3D sys_ctx->addr_unit; err =3D damon_sysfs_set_attrs(ctx, sys_ctx->attrs); if (err) return err; --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F1E0341ABF; Thu, 28 Aug 2025 17:12:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401176; cv=none; b=GwTkT3hMOFkfn1N3Q7vF2eQtWl6qyKVwhsQlf9APcBKfM9f9JhRWL0yapEDY/IFRsovYRmc3WSEQ7Vn2k/dpZFLllGF3a5B9l43uZIxM8dJk5nzZC52Hice93ZXR4MNeNQdz2N6Kn2Me1vBoMDvTJ5oSQE8HqFr18/TDSD2L4KI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401176; c=relaxed/simple; bh=XEEup2P+YfS2nWpANDMTFLVSwSxLXRRHKWWJnlZZn9s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=QwmSGzOsSIBUw/GkFBuPmouAEj0aSIKyN+4kPxc9EgUF5YfzXJuWDOdSeF3AC3HdbvnyLqypzEzwPsgtbn2DbunFcYlM7dCFKoPthq6blSbOpXjvvnZ/V71XUsLsItOfK6SR6B+bKZ8fAAlPSVQPfFvVE8opCTm5yZhfp0W5a58= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S0sDW0mt; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="S0sDW0mt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A3EACC4CEEB; Thu, 28 Aug 2025 17:12:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401175; bh=XEEup2P+YfS2nWpANDMTFLVSwSxLXRRHKWWJnlZZn9s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S0sDW0mtUEfC7+wyIitulsjr21PnQg6oUa4z9o7wFesIFqL9G9II6sjiS4dNfLInx 9RPqGCPrVFzGnAwGliAwcCi3WCC+uNvvSSvtHZoF3fd19n1FFO3pDXeBSrLLKRrsEK ZGjQJQp9LqPIgrXjGUKQh2CnMuzOwr3vxz2Xu0Xtm8e2VcAaozGeoaMvsf+or86ZL+ WKs2PKSPPJl9hYSm/YvATa9LiTKDekB9dA5yuYhVOSRKTb3q9LkB8troiKxwNvdczN eqJxV+0gMcPsXoKkrJIRqBpqPEzbFU0ZjRKJLREFfCBEjNeijfmZB2w4FpGmDQwmrV 9pqxHdEQ/bxeA== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , "Liam R. Howlett" , David Hildenbrand , Jonathan Corbet , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Quanmin Yan , Suren Baghdasaryan , Vlastimil Babka , damon@lists.linux.dev, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 08/11] Docs/mm/damon/design: document 'address unit' parameter Date: Thu, 28 Aug 2025 10:12:39 -0700 Message-Id: <20250828171242.59810-9-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add 'addr_unit' parameter description on DAMON design document. Signed-off-by: SeongJae Park Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- 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/des= ign.rst index 2f6ba5c7f4c7..d9d5baa1ec87 100644 --- a/Documentation/mm/damon/design.rst +++ b/Documentation/mm/damon/design.rst @@ -67,7 +67,7 @@ processes, NUMA nodes, files, and backing memory devices = would be supportable. Also, if some architectures or devices support special optimized access ch= eck features, those will be easily configurable. =20 -DAMON currently provides below three operation sets. Below two subsections +DAMON currently provides below three operation sets. Below three subsecti= ons describe how those work. =20 - vaddr: Monitor virtual address spaces of specific processes @@ -135,6 +135,18 @@ the interference is the responsibility of sysadmins. = However, it solves the conflict with the reclaim logic using ``PG_idle`` and ``PG_young`` page fl= ags, as Idle page tracking does. =20 +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 fa= ctor +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 operation= s set +implementation that supports the parameter. =20 .. _damon_core_logic: =20 --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D9AD342C96; Thu, 28 Aug 2025 17:12:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401177; cv=none; b=PFvNs3bSQJazEr7fplHBHsbfzeQeDSSt2zP5at+/gXwnRfs9nXFPXQ+DYHG1g23kYJDpYVkchTe/85LEpddTmnJ98tfkYqgB7IKzMrJ+i+CTDOjjhnwtvhz5xE/E+DMYZXh4TVhFyZ+YBVGeBHF1nhKUC3qW/8GaRrVNyMv6Ix4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401177; c=relaxed/simple; bh=0Tkh1C5fVDsNJAaGdZ/ykVNygO2LzvBdvdS278GzHlk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=Jls7ILaRmyQje+DQH07LE2fJgbTNj5gVRPOhyjK+nnSVH2qmNnIy+eRlaj0KF+vJ63+1VE5fAkm49h9ZZxUZ9ju95/sDoN7ZdvhwgZuGd9+OAQ6cbgZd5Z7MZ0JHMdW7vpjVOATpsH3IrLYGxlHXLUIhEBC29uYq7uasbRlpuY4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=N5tsV3mk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="N5tsV3mk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A2137C4CEEB; Thu, 28 Aug 2025 17:12:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401176; bh=0Tkh1C5fVDsNJAaGdZ/ykVNygO2LzvBdvdS278GzHlk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=N5tsV3mkCxzm9wNYzTMsleBT4pfBcY1lGcxcHxyZDTph4Fji+D8KxPLH2THg6LWGp oc71BnlefpsViutlRPsLpDqVe4hcQNzRMcN4HYGUIW3zP/D1GjWngcP98T+323RCSJ eOIY27TnIRZOzdxA8TJbYyDNf6DgQhxYqdxPCZ35Uu2jNZzAUzf3Vk6xv5LRg4kMoO DIk/hFw0ni3WSvpoOrOHcg8EdWFoj4rD0rjNP3kJa6wYeP7ovxhSizXt+yMAkhontp rP19fjSnVm+7/t5/b81sQKhqQuOI5AfLUMHpxyvmlLlzifgFzTzOSLmtTkFk1qoLwq 2m5ecHpMuEgTw== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , "Liam R. Howlett" , David Hildenbrand , Jonathan Corbet , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Quanmin Yan , Suren Baghdasaryan , Vlastimil Babka , damon@lists.linux.dev, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 09/11] Docs/admin-guide/mm/damon/usage: document addr_unit file Date: Thu, 28 Aug 2025 10:12:40 -0700 Message-Id: <20250828171242.59810-10-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Document addr_unit DAMON sysfs file on DAMON usage document. Signed-off-by: SeongJae Park Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- 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/a= dmin-guide/mm/damon/usage.rst index ff3a2dda1f02..2cae60b6f3ca 100644 --- a/Documentation/admin-guide/mm/damon/usage.rst +++ b/Documentation/admin-guide/mm/damon/usage.rst @@ -61,7 +61,7 @@ comma (","). =E2=94=82 :ref:`kdamonds `/nr_kdamonds =E2=94=82 =E2=94=82 :ref:`0 `/state,pid,refresh_ms =E2=94=82 =E2=94=82 =E2=94=82 :ref:`contexts `/nr_cont= exts - =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 :ref:`0 `/avail= _operations,operations + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 :ref:`0 `/avail= _operations,operations,addr_unit =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 :ref:`monitoring_att= rs `/ =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 intervals/= sample_us,aggr_us,update_us =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = intervals_goal/access_bp,aggrs,min_sample_us,max_sample_us @@ -188,9 +188,9 @@ details). At the moment, only one context per kdamond = is supported, so only contexts// ------------- =20 -In each context directory, two files (``avail_operations`` and ``operation= s``) -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. =20 DAMON supports multiple types of :ref:`monitoring operations `, including those for virtual a= ddress @@ -205,6 +205,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. =20 +``addr_unit`` file is for setting and getting the :ref:`address unit +` parameter of the operations set. + .. _sysfs_monitoring_attrs: =20 contexts//monitoring_attrs/ diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/des= ign.rst index d9d5baa1ec87..80354f4f42ba 100644 --- a/Documentation/mm/damon/design.rst +++ b/Documentation/mm/damon/design.rst @@ -135,6 +135,8 @@ the interference is the responsibility of sysadmins. H= owever, it solves the conflict with the reclaim logic using ``PG_idle`` and ``PG_young`` page fl= ags, as Idle page tracking does. =20 +.. _damon_design_addr_unit: + Address Unit ------------ =20 --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EE9A335BC1; Thu, 28 Aug 2025 17:12:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401178; cv=none; b=SOrgnqUJEBWbcXNGXrZ/0WULG9dNyhBc/TTbGO9xoAboWKbcKTj3iBA7ncGYpdlcdKk0NEC6DHUhTH4A/EFAKR+Rf+KJbhAGAYfLx5/+mBlbPdRxNTLuSbzeXQXZ1elyEenedS8Rxpm/bakOh4qGng6nPBzhi5LMJH81sBs12Yw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401178; c=relaxed/simple; bh=E4lfMWLAM0CZUwTFNYks6zQJROy89IQivneqIvqMdBo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=iUh6FFFw52vGBjC9k7RG+v829iHpsa6fv2dWcTY68XAY1ZHR5lt0hfwpAGxKcmqbrmLX8GGZebYEQlmgMirGRbBdwxeMVlUwzprI4OMHxWjvvnNHhts2kuG8zuBq9tzevZKWrsAMRLFUym/BZGsoH+pWFgEGvRYyELeGG5TbL6g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=R7/FmEi3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="R7/FmEi3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB7D4C4CEED; Thu, 28 Aug 2025 17:12:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401177; bh=E4lfMWLAM0CZUwTFNYks6zQJROy89IQivneqIvqMdBo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R7/FmEi3JX7oKToun7GulU8vhzLnkqFIhzQR7knoDm40YxsaPtw3S/DU0ugsEIXrS nVsn0zSsuOyutcyid5uOd71fplJLqmWkND5JgoBLgVqElhFOwpMjthWQ+L+i7dfVJQ Xah1dK7wXUdq9cNO35lexfuL0KJpFX+9CukkBaY6BVzWSpo1GmvGgQ18pbwUsu4ufy MBDOc5ca3BAhThC05qpw88/eOiqVmyeb7paTMRpi4pYGaSM/tE26SRd6qU0yHp+pOx oZGhKjZkx1qdEa8Y0JXjhhDkdNwuXKf6uSdLyyJ3UGsfvm3JoTC/BXJcMjTnYiqv5T BHQdbR4wByb4Q== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , Quanmin Yan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 10/11] Docs/ABI/damon: document addr_unit file Date: Thu, 28 Aug 2025 10:12:41 -0700 Message-Id: <20250828171242.59810-11-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Document addr_unit DAMON sysfs file on DAMON ABI document. Signed-off-by: SeongJae Park Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park --- Documentation/ABI/testing/sysfs-kernel-mm-damon | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-kernel-mm-damon b/Documentatio= n/ABI/testing/sysfs-kernel-mm-damon index 6791d879759e..b6b71db36ca7 100644 --- a/Documentation/ABI/testing/sysfs-kernel-mm-damon +++ b/Documentation/ABI/testing/sysfs-kernel-mm-damon @@ -77,6 +77,13 @@ Description: Writing a keyword for a monitoring operatio= ns set ('vaddr' for Note that only the operations sets that listed in 'avail_operations' file are valid inputs. =20 +What: /sys/kernel/mm/damon/admin/kdamonds//contexts//addr_unit +Date: Aug 2025 +Contact: SeongJae Park +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//contexts//monitoring_att= rs/intervals/sample_us Date: Mar 2022 Contact: SeongJae Park --=20 2.39.5 From nobody Fri Oct 3 15:37:49 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1FF00343D63; Thu, 28 Aug 2025 17:12:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401179; cv=none; b=GP0LGUVVrH650kSjEGFG9/uJbGnXTqbhj+trQdpAReO55FbD3uTBW04NFT8aep2H4maL9IYuw2hwmqG9483MftJjUkz2tmjqLCloiQeUmXVMzjQzSXe0ZLgCVQMi0aMgp1n+l/inmeDVd5dAzC8arT5a7sqpx4BEWZvUsRBndDE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756401179; c=relaxed/simple; bh=ISBNZAiFGy5WkoKys1iRyS5Q+6KEjLYzz0QUShR4E/Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=lQ9+D+7zQuVQtbM8fBHN5lH2GFu39D53/1oQfxtAOJ1HJ2P8T5IazBYDz4dpsxriNgQ9ki9cWGmaDWnNFv3R/3Iq0nFdDC9kvnk2tvwLucCa0F75neE3qaHeS+ePTxZLIv2HxPAjIyTube5Z1o/DP75BuFpvoCTv4T4VZoln1/M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TvZR6zua; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TvZR6zua" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B6147C4AF0F; Thu, 28 Aug 2025 17:12:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756401179; bh=ISBNZAiFGy5WkoKys1iRyS5Q+6KEjLYzz0QUShR4E/Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TvZR6zuaMQ8xUu6z2O0D5OY8ClcZ9OdQxE/JwTu8UZo5KOl4F+B37gDbkDUndVJUI nZOzmiHj8Xg24XUDf7zj3znl1H4BA88sorOqEhrzUQYs22TYG/9SHaG6QCGgmhED/P C9f0LECcgtoKN9x8GHS7av3E7F+WzUVFA/8gxkqd+WCyiFn8YkJKrRiLqtWi22Xx5A xvDpHiGmIVQipS4BHdfEjltpOzui7u3VeoDfgE49YfGKbRVfc6A0ERe6pguEMNNTq2 +/48WiACzXYobqVimfI28kaVCNC6xcSehzlEelH/K1twxI8yuKPQa47H9nWyrGubLt hoTGCgwMfrb9g== From: SeongJae Park To: Andrew Morton Cc: Quanmin Yan , SeongJae Park , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, wangkefeng.wang@huawei.com, zuoze1@huawei.com Subject: [PATCH v3 11/11] mm/damon: add damon_ctx->min_sz_region Date: Thu, 28 Aug 2025 10:12:42 -0700 Message-Id: <20250828171242.59810-12-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250828171242.59810-1-sj@kernel.org> References: <20250828171242.59810-1-sj@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Quanmin Yan Adopting addr_unit would make DAMON_MINREGION 'addr_unit * 4096' bytes and cause data alignment issues[1]. Add damon_ctx->min_sz_region to change DAMON_MIN_REGION from a global macro value to per-context variable. [1] https://lore.kernel.org/all/527714dd-0e33-43ab-bbbd-d89670ba79e7@huawei= .com Signed-off-by: Quanmin Yan Reviewed-by: SeongJae Park Signed-off-by: SeongJae Park --- include/linux/damon.h | 4 ++- mm/damon/core.c | 67 ++++++++++++++++++++---------------- mm/damon/sysfs.c | 8 +++-- mm/damon/tests/core-kunit.h | 21 ++++++----- mm/damon/tests/vaddr-kunit.h | 2 +- mm/damon/vaddr.c | 2 +- 6 files changed, 61 insertions(+), 43 deletions(-) diff --git a/include/linux/damon.h b/include/linux/damon.h index 6fa52f7495d9..ec8716292c09 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -747,6 +747,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. * @adaptive_targets: Head of monitoring targets (&damon_target) list. * @schemes: Head of schemes (&damos) list. */ @@ -789,6 +790,7 @@ struct damon_ctx { =20 struct damon_operations ops; unsigned long addr_unit; + unsigned long min_sz_region; =20 struct list_head adaptive_targets; struct list_head schemes; @@ -877,7 +879,7 @@ static inline void damon_insert_region(struct damon_reg= ion *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 *ran= ges, - unsigned int nr_ranges); + unsigned int nr_ranges, unsigned long min_sz_region); void damon_update_region_access_rate(struct damon_region *r, bool accessed, struct damon_attrs *attrs); =20 diff --git a/mm/damon/core.c b/mm/damon/core.c index acea2964b9cc..7aeb3f24aae8 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -201,6 +201,7 @@ static int damon_fill_regions_holes(struct damon_region= *first, * @t: the given target. * @ranges: array of new monitoring target ranges. * @nr_ranges: length of @ranges. + * @min_sz_region: minimum region size. * * This function adds new regions to, or modify existing regions of a * monitoring target to fit in specific ranges. @@ -208,7 +209,7 @@ static int damon_fill_regions_holes(struct damon_region= *first, * Return: 0 if success, or negative error code otherwise. */ int damon_set_regions(struct damon_target *t, struct damon_addr_range *ran= ges, - unsigned int nr_ranges) + unsigned int nr_ranges, unsigned long min_sz_region) { struct damon_region *r, *next; unsigned int i; @@ -245,16 +246,16 @@ int damon_set_regions(struct damon_target *t, struct = damon_addr_range *ranges, /* no region intersects with this range */ newr =3D damon_new_region( ALIGN_DOWN(range->start, - DAMON_MIN_REGION), - ALIGN(range->end, DAMON_MIN_REGION)); + min_sz_region), + ALIGN(range->end, min_sz_region)); if (!newr) return -ENOMEM; damon_insert_region(newr, damon_prev_region(r), r, t); } else { /* resize intersecting regions to fit in this range */ first->ar.start =3D ALIGN_DOWN(range->start, - DAMON_MIN_REGION); - last->ar.end =3D ALIGN(range->end, DAMON_MIN_REGION); + min_sz_region); + last->ar.end =3D ALIGN(range->end, min_sz_region); =20 /* fill possible holes in the range */ err =3D damon_fill_regions_holes(first, last, t); @@ -545,6 +546,7 @@ struct damon_ctx *damon_new_ctx(void) ctx->attrs.max_nr_regions =3D 1000; =20 ctx->addr_unit =3D 1; + ctx->min_sz_region =3D DAMON_MIN_REGION; =20 INIT_LIST_HEAD(&ctx->adaptive_targets); INIT_LIST_HEAD(&ctx->schemes); @@ -1127,8 +1129,8 @@ static struct damon_target *damon_nth_target(int n, s= truct damon_ctx *ctx) * * If @src has no region, @dst keeps current regions. */ -static int damon_commit_target_regions( - struct damon_target *dst, struct damon_target *src) +static int damon_commit_target_regions(struct damon_target *dst, + struct damon_target *src, unsigned long src_min_sz_region) { struct damon_region *src_region; struct damon_addr_range *ranges; @@ -1145,18 +1147,19 @@ static int damon_commit_target_regions( i =3D 0; damon_for_each_region(src_region, src) ranges[i++] =3D src_region->ar; - err =3D damon_set_regions(dst, ranges, i); + err =3D damon_set_regions(dst, ranges, i, src_min_sz_region); kfree(ranges); return err; } =20 static int damon_commit_target( struct damon_target *dst, bool dst_has_pid, - struct damon_target *src, bool src_has_pid) + struct damon_target *src, bool src_has_pid, + unsigned long src_min_sz_region) { int err; =20 - err =3D damon_commit_target_regions(dst, src); + err =3D damon_commit_target_regions(dst, src, src_min_sz_region); if (err) return err; if (dst_has_pid) @@ -1178,7 +1181,8 @@ static int damon_commit_targets( if (src_target) { err =3D damon_commit_target( dst_target, damon_target_has_pid(dst), - src_target, damon_target_has_pid(src)); + src_target, damon_target_has_pid(src), + src->min_sz_region); if (err) return err; } else { @@ -1201,7 +1205,8 @@ static int damon_commit_targets( if (!new_target) return -ENOMEM; err =3D damon_commit_target(new_target, false, - src_target, damon_target_has_pid(src)); + src_target, damon_target_has_pid(src), + src->min_sz_region); if (err) { damon_destroy_target(new_target, NULL); return err; @@ -1248,6 +1253,7 @@ int damon_commit_ctx(struct damon_ctx *dst, struct da= mon_ctx *src) } dst->ops =3D src->ops; dst->addr_unit =3D src->addr_unit; + dst->min_sz_region =3D src->min_sz_region; =20 return 0; } @@ -1280,8 +1286,8 @@ static unsigned long damon_region_sz_limit(struct dam= on_ctx *ctx) =20 if (ctx->attrs.min_nr_regions) sz /=3D ctx->attrs.min_nr_regions; - if (sz < DAMON_MIN_REGION) - sz =3D DAMON_MIN_REGION; + if (sz < ctx->min_sz_region) + sz =3D ctx->min_sz_region; =20 return sz; } @@ -1625,6 +1631,7 @@ static bool damos_valid_target(struct damon_ctx *c, s= truct damon_target *t, * @t: The target of the region. * @rp: The pointer to the region. * @s: The scheme to be applied. + * @min_sz_region: minimum region size. * * If a quota of a scheme has exceeded in a quota charge window, the schem= e's * action would applied to only a part of the target access pattern fulfil= ling @@ -1642,7 +1649,7 @@ static bool damos_valid_target(struct damon_ctx *c, s= truct damon_target *t, * Return: true if the region should be entirely skipped, false otherwise. */ static bool damos_skip_charged_region(struct damon_target *t, - struct damon_region **rp, struct damos *s) + struct damon_region **rp, struct damos *s, unsigned long min_sz_region) { struct damon_region *r =3D *rp; struct damos_quota *quota =3D &s->quota; @@ -1664,11 +1671,11 @@ static bool damos_skip_charged_region(struct damon_= target *t, if (quota->charge_addr_from && r->ar.start < quota->charge_addr_from) { sz_to_skip =3D ALIGN_DOWN(quota->charge_addr_from - - r->ar.start, DAMON_MIN_REGION); + r->ar.start, min_sz_region); if (!sz_to_skip) { - if (damon_sz_region(r) <=3D DAMON_MIN_REGION) + if (damon_sz_region(r) <=3D min_sz_region) return true; - sz_to_skip =3D DAMON_MIN_REGION; + sz_to_skip =3D min_sz_region; } damon_split_region_at(t, r, sz_to_skip); r =3D damon_next_region(r); @@ -1693,7 +1700,8 @@ static void damos_update_stat(struct damos *s, } =20 static bool damos_filter_match(struct damon_ctx *ctx, struct damon_target = *t, - struct damon_region *r, struct damos_filter *filter) + struct damon_region *r, struct damos_filter *filter, + unsigned long min_sz_region) { bool matched =3D false; struct damon_target *ti; @@ -1710,8 +1718,8 @@ static bool damos_filter_match(struct damon_ctx *ctx,= struct damon_target *t, matched =3D target_idx =3D=3D filter->target_idx; break; case DAMOS_FILTER_TYPE_ADDR: - start =3D ALIGN_DOWN(filter->addr_range.start, DAMON_MIN_REGION); - end =3D ALIGN_DOWN(filter->addr_range.end, DAMON_MIN_REGION); + start =3D ALIGN_DOWN(filter->addr_range.start, min_sz_region); + end =3D ALIGN_DOWN(filter->addr_range.end, min_sz_region); =20 /* inside the range */ if (start <=3D r->ar.start && r->ar.end <=3D end) { @@ -1747,7 +1755,7 @@ static bool damos_filter_out(struct damon_ctx *ctx, s= truct damon_target *t, =20 s->core_filters_allowed =3D false; damos_for_each_filter(filter, s) { - if (damos_filter_match(ctx, t, r, filter)) { + if (damos_filter_match(ctx, t, r, filter, ctx->min_sz_region)) { if (filter->allow) s->core_filters_allowed =3D true; return !filter->allow; @@ -1882,7 +1890,7 @@ static void damos_apply_scheme(struct damon_ctx *c, s= truct damon_target *t, if (c->ops.apply_scheme) { if (quota->esz && quota->charged_sz + sz > quota->esz) { sz =3D ALIGN_DOWN(quota->esz - quota->charged_sz, - DAMON_MIN_REGION); + c->min_sz_region); if (!sz) goto update_stat; damon_split_region_at(t, r, sz); @@ -1930,7 +1938,7 @@ static void damon_do_apply_schemes(struct damon_ctx *= c, if (quota->esz && quota->charged_sz >=3D quota->esz) continue; =20 - if (damos_skip_charged_region(t, &r, s)) + if (damos_skip_charged_region(t, &r, s, c->min_sz_region)) continue; =20 if (!damos_valid_target(c, t, r, s)) @@ -2328,7 +2336,8 @@ static void damon_split_region_at(struct damon_target= *t, } =20 /* Split every region in the given target into 'nr_subs' regions */ -static void damon_split_regions_of(struct damon_target *t, int nr_subs) +static void damon_split_regions_of(struct damon_target *t, int nr_subs, + unsigned long min_sz_region) { struct damon_region *r, *next; unsigned long sz_region, sz_sub =3D 0; @@ -2338,13 +2347,13 @@ static void damon_split_regions_of(struct damon_tar= get *t, int nr_subs) sz_region =3D damon_sz_region(r); =20 for (i =3D 0; i < nr_subs - 1 && - sz_region > 2 * DAMON_MIN_REGION; i++) { + sz_region > 2 * min_sz_region; i++) { /* * Randomly select size of left sub-region to be at * least 10 percent and at most 90% of original region */ sz_sub =3D ALIGN_DOWN(damon_rand(1, 10) * - sz_region / 10, DAMON_MIN_REGION); + sz_region / 10, min_sz_region); /* Do not allow blank region */ if (sz_sub =3D=3D 0 || sz_sub >=3D sz_region) continue; @@ -2384,7 +2393,7 @@ static void kdamond_split_regions(struct damon_ctx *c= tx) nr_subregions =3D 3; =20 damon_for_each_target(t, ctx) - damon_split_regions_of(t, nr_subregions); + damon_split_regions_of(t, nr_subregions, ctx->min_sz_region); =20 last_nr_regions =3D nr_regions; } @@ -2773,7 +2782,7 @@ int damon_set_region_biggest_system_ram_default(struc= t damon_target *t, =20 addr_range.start =3D *start; addr_range.end =3D *end; - return damon_set_regions(t, &addr_range, 1); + return damon_set_regions(t, &addr_range, 1, DAMON_MIN_REGION); } =20 /* diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 98bf15d403b2..0ed404c89f80 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -1329,7 +1329,8 @@ static int damon_sysfs_set_attrs(struct damon_ctx *ct= x, } =20 static int damon_sysfs_set_regions(struct damon_target *t, - struct damon_sysfs_regions *sysfs_regions) + struct damon_sysfs_regions *sysfs_regions, + unsigned long min_sz_region) { struct damon_addr_range *ranges =3D kmalloc_array(sysfs_regions->nr, sizeof(*ranges), GFP_KERNEL | __GFP_NOWARN); @@ -1351,7 +1352,7 @@ static int damon_sysfs_set_regions(struct damon_targe= t *t, if (ranges[i - 1].end > ranges[i].start) goto out; } - err =3D damon_set_regions(t, ranges, sysfs_regions->nr); + err =3D damon_set_regions(t, ranges, sysfs_regions->nr, min_sz_region); out: kfree(ranges); return err; @@ -1372,7 +1373,7 @@ static int damon_sysfs_add_target(struct damon_sysfs_= target *sys_target, /* caller will destroy targets */ return -EINVAL; } - return damon_sysfs_set_regions(t, sys_target->regions); + return damon_sysfs_set_regions(t, sys_target->regions, ctx->min_sz_region= ); } =20 static int damon_sysfs_add_targets(struct damon_ctx *ctx, @@ -1430,6 +1431,7 @@ static int damon_sysfs_apply_inputs(struct damon_ctx = *ctx, if (err) return err; ctx->addr_unit =3D sys_ctx->addr_unit; + ctx->min_sz_region =3D max(DAMON_MIN_REGION / sys_ctx->addr_unit, 1); err =3D damon_sysfs_set_attrs(ctx, sys_ctx->attrs); if (err) return err; diff --git a/mm/damon/tests/core-kunit.h b/mm/damon/tests/core-kunit.h index 5f5dc9db2e90..51369e35298b 100644 --- a/mm/damon/tests/core-kunit.h +++ b/mm/damon/tests/core-kunit.h @@ -230,14 +230,14 @@ static void damon_test_split_regions_of(struct kunit = *test) t =3D damon_new_target(); r =3D damon_new_region(0, 22); damon_add_region(r, t); - damon_split_regions_of(t, 2); + damon_split_regions_of(t, 2, DAMON_MIN_REGION); KUNIT_EXPECT_LE(test, damon_nr_regions(t), 2u); damon_free_target(t); =20 t =3D damon_new_target(); r =3D damon_new_region(0, 220); damon_add_region(r, t); - damon_split_regions_of(t, 4); + damon_split_regions_of(t, 4, DAMON_MIN_REGION); KUNIT_EXPECT_LE(test, damon_nr_regions(t), 4u); damon_free_target(t); damon_destroy_ctx(c); @@ -303,7 +303,7 @@ static void damon_test_set_regions(struct kunit *test) =20 damon_add_region(r1, t); damon_add_region(r2, t); - damon_set_regions(t, &range, 1); + damon_set_regions(t, &range, 1, DAMON_MIN_REGION); =20 KUNIT_EXPECT_EQ(test, damon_nr_regions(t), 3); damon_for_each_region(r, t) { @@ -450,25 +450,29 @@ static void damos_test_filter_out(struct kunit *test) damon_add_region(r, t); =20 /* region in the range */ - KUNIT_EXPECT_TRUE(test, damos_filter_match(NULL, t, r, f)); + KUNIT_EXPECT_TRUE(test, + damos_filter_match(NULL, t, r, f, DAMON_MIN_REGION)); KUNIT_EXPECT_EQ(test, damon_nr_regions(t), 1); =20 /* region before the range */ r->ar.start =3D DAMON_MIN_REGION * 1; r->ar.end =3D DAMON_MIN_REGION * 2; - KUNIT_EXPECT_FALSE(test, damos_filter_match(NULL, t, r, f)); + KUNIT_EXPECT_FALSE(test, + damos_filter_match(NULL, t, r, f, DAMON_MIN_REGION)); KUNIT_EXPECT_EQ(test, damon_nr_regions(t), 1); =20 /* region after the range */ r->ar.start =3D DAMON_MIN_REGION * 6; r->ar.end =3D DAMON_MIN_REGION * 8; - KUNIT_EXPECT_FALSE(test, damos_filter_match(NULL, t, r, f)); + KUNIT_EXPECT_FALSE(test, + damos_filter_match(NULL, t, r, f, DAMON_MIN_REGION)); KUNIT_EXPECT_EQ(test, damon_nr_regions(t), 1); =20 /* region started before the range */ r->ar.start =3D DAMON_MIN_REGION * 1; r->ar.end =3D DAMON_MIN_REGION * 4; - KUNIT_EXPECT_FALSE(test, damos_filter_match(NULL, t, r, f)); + KUNIT_EXPECT_FALSE(test, + damos_filter_match(NULL, t, r, f, DAMON_MIN_REGION)); /* filter should have split the region */ KUNIT_EXPECT_EQ(test, r->ar.start, DAMON_MIN_REGION * 1); KUNIT_EXPECT_EQ(test, r->ar.end, DAMON_MIN_REGION * 2); @@ -481,7 +485,8 @@ static void damos_test_filter_out(struct kunit *test) /* region started in the range */ r->ar.start =3D DAMON_MIN_REGION * 2; r->ar.end =3D DAMON_MIN_REGION * 8; - KUNIT_EXPECT_TRUE(test, damos_filter_match(NULL, t, r, f)); + KUNIT_EXPECT_TRUE(test, + damos_filter_match(NULL, t, r, f, DAMON_MIN_REGION)); /* filter should have split the region */ KUNIT_EXPECT_EQ(test, r->ar.start, DAMON_MIN_REGION * 2); KUNIT_EXPECT_EQ(test, r->ar.end, DAMON_MIN_REGION * 6); diff --git a/mm/damon/tests/vaddr-kunit.h b/mm/damon/tests/vaddr-kunit.h index d2b37ccf2cc0..fce38dd53cf8 100644 --- a/mm/damon/tests/vaddr-kunit.h +++ b/mm/damon/tests/vaddr-kunit.h @@ -141,7 +141,7 @@ static void damon_do_test_apply_three_regions(struct ku= nit *test, damon_add_region(r, t); } =20 - damon_set_regions(t, three_regions, 3); + damon_set_regions(t, three_regions, 3, DAMON_MIN_REGION); =20 for (i =3D 0; i < nr_expected / 2; i++) { r =3D __nth_region_of(t, i); diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c index 66ef9869eafe..8c048f9b129e 100644 --- a/mm/damon/vaddr.c +++ b/mm/damon/vaddr.c @@ -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_set_regions(t, three_regions, 3, DAMON_MIN_REGION); } } =20 --=20 2.39.5