From nobody Sat Sep 26 01:59:49 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 E1872375F82; Sat, 5 Sep 2026 20:26:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640006; cv=none; b=qOPJrZfVvhHnsyl5pU5LjfiOpivaZj8Ml+mwYqKUgWJ+Vcl5Y6aUM6UF6mtBiRivhiTM0OAecKmmp0S+FSUyyncPwhhqXp9TGy/FwdIQh2RvIYMbNvCRHqYi6SolNZT3xubwTKbVNvwQDm521UBMinSkt+/u2KHsaBpDlth/V2k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640006; c=relaxed/simple; bh=fKrB/U0Fkc84EdTBQ6P2uNZCoUXlmjMlVMrrxMNAX2w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gdg5JTV6d7ZeyRicBcIoceNJtURmp414boUGnF/U+hRRs1YEH0opMBYljoX+0GPKHHd8BJ2c3QrFZXipbjDve0QCifqnf8ZUwLDXtqyOluKcmLhrazCSqGWkXTWWWn9JA/dSnFx7rSLwcWT9a6v6WmwsCWi3OUPAU8cbEsLPnvM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aX53b0wQ; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aX53b0wQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9EF641F00A3E; Sat, 5 Sep 2026 20:26:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788640003; bh=jEjB5+SmYpe1jV4B6kvt1MmnXfzrPfDtBLhTiuYoc8Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=aX53b0wQlWmkYH33AjzoghCYSwYeNkKyLh2Cp0TVS8FyKpcH1FzAdekysPBs664Pr Z+xxdn25A/jB8F3TT0bdqFB9LSVjOtrfTy6XrImNMNCZ6IpoazR68QQKItXFw1jy2T DYNy39vjaVZY3RrVHkcXknODXSG7EnrDOEfO4dZw8joN8MCIExapAX7a/CzVw5/cwi BEuttzVFQN6eRUtWmbdB7BmWTUKMUbHaBUKHfsMEf7cN2RN7s7ZeByqk4o3APXbG6j +io0Su9wnO0j99Mao0ugtSJidQZ2JCMHWyQg9VX/TAGQKSKsKB+rEFoCCJp5QMLyS5 ge4yG90ZNSZaQ== From: SJ Park To: Cc: SJ Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 1/5] mm/damon/vaddr: support prep_probes Date: Sat, 5 Sep 2026 13:26:23 -0700 Message-ID: <20260905202634.88102-2-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260905202634.88102-1-sj@kernel.org> References: <20260905202634.88102-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" DAMON virtual address space operation set (vaddr) is not supporting prep_probes. Add the support. Signed-off-by: SJ Park --- mm/damon/vaddr.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c index af9e1b82454cc..20f4784f17817 100644 --- a/mm/damon/vaddr.c +++ b/mm/damon/vaddr.c @@ -483,6 +483,45 @@ static unsigned int damon_va_check_accesses(struct dam= on_ctx *ctx) return max_nr_accesses; } =20 +static void damon_va_prep_probe_region(struct damon_ctx *ctx, + struct mm_struct *mm, struct damon_region *r, + struct damon_probe *probe) +{ + struct damon_prep *p; + + damon_for_each_prep(p, probe) { + switch (p->action) { + case DAMON_PREP_SET_PGIDLE: + damon_va_mkold(mm, r->sampling_addr); + break; + default: + break; + } + } +} + +static void damon_va_prep_probes(struct damon_ctx *ctx, bool set_samples) +{ + struct damon_target *t; + struct mm_struct *mm; + struct damon_region *r; + struct damon_probe *p; + + damon_for_each_target(t, ctx) { + mm =3D damon_get_mm(t); + if (!mm) + continue; + damon_for_each_region(r, t) { + if (set_samples) + r->sampling_addr =3D damon_rand(ctx, r->ar.start, + r->ar.end); + damon_for_each_probe(p, ctx) + damon_va_prep_probe_region(ctx, mm, r, p); + } + mmput(mm); + } +} + static bool damos_va_filter_young_match(struct damos_filter *filter, struct folio *folio, struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pmd_t *pmdp) @@ -911,6 +950,7 @@ static int __init damon_va_initcall(void) .update =3D damon_va_update, .prepare_access_checks =3D damon_va_prepare_access_checks, .check_accesses =3D damon_va_check_accesses, + .prep_probes =3D damon_va_prep_probes, .target_valid =3D damon_va_target_valid, .cleanup_target =3D damon_va_cleanup_target, .apply_scheme =3D damon_va_apply_scheme, --=20 2.47.3 From nobody Sat Sep 26 01:59:49 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 7392338B158; Sat, 5 Sep 2026 20:26:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640005; cv=none; b=RSxrQzSlKxdRaUkKga253z1EX9LfUn1kNocQdItWMDXx+dITlXl8i8FfwZvPht21DHZDWeeSa3gMu9c90pMAUMpqPOAA8rg0IrI+Dg0QHujEI5x6lrXz58WyIHH7CZd5ZCsmYsJ5YjoiKmCSbVXUZb42YzqHLr3pmx2FCfebgbU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640005; c=relaxed/simple; bh=pBJFOlatllz+K9zXmVwpamK+Ho2uRvOnLoGDxXKoCUQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ts3cgzIDjI93YAhsjD0scYYAH7fhQ85gO/6QpmpEDV6p2DYIVzm67QvdhGZpauvLumOTzk54qgc33POAH7cGtdNPXJNyPu2AY5/l9a6yDfUwS5LMK7J2yVYg0Q9N2hE/fAxlN3xSoSUh7mmsaujYaX1sW8NAVPYhX3I1J+6AvrA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y646QVjB; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Y646QVjB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EF2A51F00AC4; Sat, 5 Sep 2026 20:26:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788640004; bh=Fn4wlsJY/z4XEr5TrccoXyN8K/aFxzX6vlLK3FGYk8U=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Y646QVjBODL2Nszz7u/PMlBRcqwdj40UkazJ/+ndoBf45LjxUX63V8oybAf0LrkTb EsbEmKlKOyyDEQcIBDdziEIQe6oT/MkSV5kt+HK9xOLpQDKOuJv6tv5rcRwxzjimdX WPzg/dpwTrEmQh9Xs46X7j10+LK21PhNLXpKZwPZL79EQ3ne4VVaQxSNlDktdEQeDl Fg31MReWxKR4UYG96stySnkAc2tdSInKBIywyRA7IRTUNTe0kJDSWlvcsjeRhXc5A2 bfi9jDkidi/1NTrcVDtJ+BWtH5qstOI0Fesqwg7s6XE/PLvWmsnVbsyfl4LydHo4Ct dNlS54AuTjURA== From: SJ Park To: Cc: SJ Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 2/5] mm/damon/paddr: move probe filter handling to ops-common Date: Sat, 5 Sep 2026 13:26:24 -0700 Message-ID: <20260905202634.88102-3-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260905202634.88102-1-sj@kernel.org> References: <20260905202634.88102-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" Probe filter matching logic for anon and memcg type filters in DAMON's physical address space operation set (paddr) can be reused by virtual address space operation set (vaddr) in future. Prepare the future by moving the code to ops-common.c Signed-off-by: SJ Park --- mm/damon/ops-common.c | 32 ++++++++++++++++++++++++++++++++ mm/damon/ops-common.h | 2 ++ mm/damon/paddr.c | 23 +---------------------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c index 441d45679eaf2..76b663a4be610 100644 --- a/mm/damon/ops-common.c +++ b/mm/damon/ops-common.c @@ -524,3 +524,35 @@ bool damos_ops_has_filter(struct damos *s) return true; return false; } + +bool damon_ops_filter_match(struct damon_filter *filter, struct folio *fol= io) +{ + bool matched =3D false; + struct mem_cgroup *memcg; + + switch (filter->type) { + case DAMON_FILTER_TYPE_ANON: + if (!folio) { + matched =3D false; + break; + } + matched =3D folio_test_anon(folio); + break; + case DAMON_FILTER_TYPE_MEMCG: + if (!folio) { + matched =3D false; + break; + } + rcu_read_lock(); + memcg =3D folio_memcg_check(folio); + if (!memcg) + matched =3D false; + else + matched =3D filter->memcg_id =3D=3D mem_cgroup_id(memcg); + rcu_read_unlock(); + break; + default: + break; + } + return matched =3D=3D filter->matching; +} diff --git a/mm/damon/ops-common.h b/mm/damon/ops-common.h index 172f0f17c4a84..ee27058251005 100644 --- a/mm/damon/ops-common.h +++ b/mm/damon/ops-common.h @@ -31,3 +31,5 @@ bool damos_folio_filter_match(struct damos_filter *filter= , struct folio *folio); unsigned long damon_migrate_pages(struct list_head *folio_list, int target= _nid); =20 bool damos_ops_has_filter(struct damos *s); + +bool damon_ops_filter_match(struct damon_filter *filter, struct folio *fol= io); diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c index d2173a448d0b0..d7c81829445ba 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -143,29 +143,8 @@ static bool damon_pa_filter_match(struct damon_filter = *filter, struct folio *folio) { bool matched =3D false; - struct mem_cgroup *memcg; =20 switch (filter->type) { - case DAMON_FILTER_TYPE_ANON: - if (!folio) { - matched =3D false; - break; - } - matched =3D folio_test_anon(folio); - break; - case DAMON_FILTER_TYPE_MEMCG: - if (!folio) { - matched =3D false; - break; - } - rcu_read_lock(); - memcg =3D folio_memcg_check(folio); - if (!memcg) - matched =3D false; - else - matched =3D filter->memcg_id =3D=3D mem_cgroup_id(memcg); - rcu_read_unlock(); - break; case DAMON_FILTER_TYPE_PGIDLE_UNSET: if (!folio) matched =3D false; @@ -173,7 +152,7 @@ static bool damon_pa_filter_match(struct damon_filter *= filter, matched =3D damon_folio_young(folio); break; default: - break; + return damon_ops_filter_match(filter, folio); } return matched =3D=3D filter->matching; } --=20 2.47.3 From nobody Sat Sep 26 01:59:49 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 9652E3A451B; Sat, 5 Sep 2026 20:26:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640005; cv=none; b=krDMD7vj65BVEg/l4lIQC47Jk/kZvHx+7MsQTv4bCjXv3JQO4s2KVldFUfWzlpot+4mf2k4xBb/V8IgWuzNrNxuRZz4D4JHVp7IaluWVu/5QgFcwIn6cO6hVRpb+KI76ZREJw00YNuO/w5PK3TZnX5FhkboDAHjzPlMrxGPcHSc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640005; c=relaxed/simple; bh=E7fgarhF93UmeFS3xcsx89VbQHqmZiIyVfzBU35jzC4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IGALPuv5uIct0daJiCpdTctOFTGTVHGhde+k5xlukTYGFRMoBo2mmKfodfPXrP3IV/6f+46qSiEycm6UQF+3Gy56EGyLMhI8yxr/wuXIc2BoVDPWdWsKmt7XURwGLjLzmwfpbbm4Y4ybHkyySKB4va0O8aq4ZyCteWjRCK0wlog= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bPeXXfgN; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bPeXXfgN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 499021F00A3F; Sat, 5 Sep 2026 20:26:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788640004; bh=fT43lELJTSuTapSRQfge6uMBnWbBQLknesZmv7ILLgU=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=bPeXXfgNTpyOh45yiXs2EzQRjiiM6Wt1vHoDx5xyU3NeX364Av3sKdvtQDCbe8qHy pVrw5uyfZslrQTGnMJJasukhfK/kewkIoknKBdkSBLEMhTE9E4ODOSrnzrX7rpzEHo QgtK8vLfNpLpe5syT0GsPjo7G0199vs3no+yzWpZumPhCEurk7s4LvdJHsWnnGVqLT C2hzhdWIKS34Trmn5Csy6ojjaWxau7D/uI5UBRj0PFR+iqBmedA24zakW5HI3Fg1tO jaxK70+w3xpBepaL+SqxW0AOB+SfZL9rulaq3Pese1xLqJGD8V5QVyh2D88yvSB1ez fbk0FOHkW2E0A== From: SJ Park To: Cc: SJ Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 3/5] mm/damon/vaddr: support apply_probe Date: Sat, 5 Sep 2026 13:26:25 -0700 Message-ID: <20260905202634.88102-4-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260905202634.88102-1-sj@kernel.org> References: <20260905202634.88102-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" DAMON virtual address space operation set (vaddr) is not supporting apply_probe. Add a minimum support. Do not support hugetlb pages and PGIDLE_UNSET filter type for simplicity. Signed-off-by: SJ Park --- mm/damon/vaddr.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c index 20f4784f17817..7c548ec0cf6b5 100644 --- a/mm/damon/vaddr.c +++ b/mm/damon/vaddr.c @@ -522,6 +522,128 @@ static void damon_va_prep_probes(struct damon_ctx *ct= x, bool set_samples) } } =20 +static bool damon_va_filter_pass(struct folio *folio, struct damon_probe *= p) +{ + struct damon_filter *f; + bool pass =3D true; + + damon_for_each_filter(f, p) { + if (damon_ops_filter_match(f, folio)) { + pass =3D f->allow; + break; + } + pass =3D !f->allow; + } + return pass; +} + +struct damon_va_probe_walk_private { + struct damon_ctx *ctx; + struct damon_region *r; +}; + +static void damon_va_probe_folio(struct damon_ctx *ctx, + struct damon_region *r, struct folio *folio) +{ + struct damon_probe *probe; + int i =3D 0; + + damon_for_each_probe(probe, ctx) { + if (damon_va_filter_pass(folio, probe)) + r->probe_hits[i]++; + i++; + } +} + +static int damon_va_probe_pmd_entry(pmd_t *pmd, unsigned long addr, + unsigned long next, struct mm_walk *walk) +{ + pte_t *pte; + pte_t ptent; + spinlock_t *ptl; + struct folio *folio; + struct damon_va_probe_walk_private *priv =3D walk->private; + +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + ptl =3D pmd_trans_huge_lock(pmd, walk->vma); + if (ptl) { + pmd_t pmde =3D pmdp_get(pmd); + + if (!pmd_present(pmde)) + goto huge_out; + folio =3D vm_normal_folio_pmd(walk->vma, addr, pmde); + if (!folio) + goto huge_out; + damon_va_probe_folio(priv->ctx, priv->r, folio); + +huge_out: + spin_unlock(ptl); + return 0; + } +#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ + + pte =3D pte_offset_map_lock(walk->mm, pmd, addr, &ptl); + if (!pte) + return 0; + ptent =3D ptep_get(pte); + if (!pte_present(ptent)) + goto out; + folio =3D vm_normal_folio(walk->vma, addr, ptent); + if (!folio) + goto out; + damon_va_probe_folio(priv->ctx, priv->r, folio); + +out: + pte_unmap_unlock(pte, ptl); + return 0; +} + +static void __damon_va_apply_probes(struct damon_ctx *ctx, + struct mm_struct *mm, struct damon_region *r) +{ + struct damon_va_probe_walk_private arg =3D { + .ctx =3D ctx, + .r =3D r, + }; + struct mm_walk_ops damon_probe_walk_ops =3D { + .pmd_entry =3D damon_va_probe_pmd_entry, + .hugetlb_entry =3D NULL, + }; + unsigned long addr =3D r->sampling_addr; + + if (!mm) + return; + + damon_va_walk_page_range(mm, addr, addr + 1, &damon_probe_walk_ops, + &arg); +} + +static unsigned int damon_va_apply_probes(struct damon_ctx *ctx, + bool set_samples, bool return_max_wsum) +{ + struct damon_target *t; + struct mm_struct *mm; + struct damon_region *r; + unsigned int max_wsum =3D 0; + + damon_for_each_target(t, ctx) { + mm =3D damon_get_mm(t); + damon_for_each_region(r, t) { + if (set_samples) + r->sampling_addr =3D damon_rand(ctx, r->ar.start, + r->ar.end); + __damon_va_apply_probes(ctx, mm, r); + if (return_max_wsum) + max_wsum =3D max(damon_probe_hits_wsum(r, false, + ctx), max_wsum); + } + if (mm) + mmput(mm); + } + + return max_wsum; +} + static bool damos_va_filter_young_match(struct damos_filter *filter, struct folio *folio, struct vm_area_struct *vma, unsigned long addr, pte_t *ptep, pmd_t *pmdp) @@ -951,6 +1073,7 @@ static int __init damon_va_initcall(void) .prepare_access_checks =3D damon_va_prepare_access_checks, .check_accesses =3D damon_va_check_accesses, .prep_probes =3D damon_va_prep_probes, + .apply_probes =3D damon_va_apply_probes, .target_valid =3D damon_va_target_valid, .cleanup_target =3D damon_va_cleanup_target, .apply_scheme =3D damon_va_apply_scheme, --=20 2.47.3 From nobody Sat Sep 26 01:59:49 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 D4E143A63EF; Sat, 5 Sep 2026 20:26:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640007; cv=none; b=AOH7EXRnPpYOUir/D9VC7l/ibH9RwAo1N+RQWXtvRz/V+1VNyjqLFWrEzYCKBmPZ9meY8YXznXyDmLKfTjxvK12maw36urAkSYS88SVlt0ueA0UGAximYlRmtAGEqHjs0ZV2oPTKGYIM24mmnZfzXImUathcsXrbbdvsVHNqIzk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640007; c=relaxed/simple; bh=6XNabZx0rdT/us2xD8F3Yx1aNqF1vaFNgfnZgADOfSk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZTrY9dq2ke9VxUINVWiQxpSg9GjNxJalsEoey2XwD2O6SCFlV3FoIY6d8WMemPtxN8g/8rkP5jn2SdtC1/PxuG4CC8EJfyxEGDKx2GKBhc2pgRu4nx6wHBKrzxMHC0gAxPn94zipa9O+1BuB4kBiQyWr3Q9X9jfHL8okAivzq2c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XELRf4FU; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XELRf4FU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 96B591F00A3D; Sat, 5 Sep 2026 20:26:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788640004; bh=ljZqDnomsr/PzAJ3OgMACOqJ7QipPXHSesCap1Ut72A=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=XELRf4FUAPre6yzEWl2c6/aeh5N/93qZx0vzARRXYRzgW4uThZBQHwN8ykfTwn/Ed 6sf+5Walh50v4Ew0nnhwoRDh7bFlp+OeLpYtIl1nSGIYaRU5UFGNZs7sUntx12/BZG Iv8pO3SkeL/2XjeJQSa5/wnr34PKCbu/PMsJw8L0f4wmY0q4O2dJ0R6limZ2d4kgaj ksbdHFPI6PZkUHbWca4XE+QhhqMro5iuvLAMhlMNqhwlxUfzSte3XSh9uQ3280GYBz g6PLd5YDXIYeBxd0woGysm21P5Kz1vHxwO5LfYScELTGrCbjLVZQYMXx5dGQoHHzy9 gF7uC82LlAv6w== From: SJ Park To: Cc: SJ Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 4/5] mm/damon/vaddr: extend apply_probes() for hugetlb Date: Sat, 5 Sep 2026 13:26:26 -0700 Message-ID: <20260905202634.88102-5-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260905202634.88102-1-sj@kernel.org> References: <20260905202634.88102-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" DAMON virtual address space operation set(vaddr) does not support hugetlb pages in apply_probes. Extend it for hugetlb pages. Signed-off-by: SJ Park --- mm/damon/vaddr.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c index 7c548ec0cf6b5..45239f05e113b 100644 --- a/mm/damon/vaddr.c +++ b/mm/damon/vaddr.c @@ -598,6 +598,34 @@ static int damon_va_probe_pmd_entry(pmd_t *pmd, unsign= ed long addr, return 0; } =20 +#ifdef CONFIG_HUGETLB_PAGE +static int damon_va_probe_hugetlb_entry(pte_t *pte, unsigned long hmask, + unsigned long addr, unsigned long end, struct mm_walk *walk) +{ + struct damon_va_probe_walk_private *priv =3D walk->private; + struct hstate *h =3D hstate_vma(walk->vma); + struct folio *folio; + spinlock_t *ptl; + pte_t entry; + + ptl =3D huge_pte_lock(h, walk->mm, pte); + entry =3D huge_ptep_get(walk->mm, addr, pte); + if (!pte_present(entry)) + goto out; + + folio =3D pfn_folio(pte_pfn(entry)); + folio_get(folio); + damon_va_probe_folio(priv->ctx, priv->r, folio); + folio_put(folio); + +out: + spin_unlock(ptl); + return 0; +} +#else +#define damon_va_probe_hugetlb_entry NULL +#endif /* CONFIG_HUGETLB_PAGE */ + static void __damon_va_apply_probes(struct damon_ctx *ctx, struct mm_struct *mm, struct damon_region *r) { @@ -607,7 +635,7 @@ static void __damon_va_apply_probes(struct damon_ctx *c= tx, }; struct mm_walk_ops damon_probe_walk_ops =3D { .pmd_entry =3D damon_va_probe_pmd_entry, - .hugetlb_entry =3D NULL, + .hugetlb_entry =3D damon_va_probe_hugetlb_entry, }; unsigned long addr =3D r->sampling_addr; =20 --=20 2.47.3 From nobody Sat Sep 26 01:59:49 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 2DB6F3AC0DC; Sat, 5 Sep 2026 20:26:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640006; cv=none; b=QYp3BObmskv9dLPOGPQkp5u0yMzP8XjtoTJbNUFpbzOHZOkax4Jh54GBP2ZIU/ObiZkKuwn1HtBmJnogXN+CU2YOSgyEU5DAL5ANa9nvq1CuCq7ALK9ElK6/IZpNW60eYDW+ZjQO3KkJXdve3gc+Bgx8UaWMDmTyvC2um+rAfUs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788640006; c=relaxed/simple; bh=chJoHZKREMSQchbWk7BcihNcvxO7HU8pRLDu7X832Ro=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ajt/MhjQBkqOHrgSqyMQPF9a8vRHDJ/yLLHZPqEnyKE7J3jGcc1vX6XcaCULBeyR9d9xn9Mx9flL/ddq11vJ+LnZW9qemZELvf4pyXAC2+SjK5WbStHS7q7fxrQuCW+o0g1MGDgaab2+SYumSCnu75eAqYWFOGiNXgN8SvOuDoM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JK7RdAfx; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JK7RdAfx" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E43DF1F00ACA; Sat, 5 Sep 2026 20:26:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788640005; bh=XvOnZdXRT1oYcTh0OqGiqvrYhRphtRi0kIGud2JHRJM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=JK7RdAfxkHkGQH62f0Lo5rVGUMzihKR7KLtA2YyPKLdfNzvFXtlSBqYSF6DEvMdn2 TOB9OpSAO1mjtNOyy/m6bAMU64WhF42+OljZTh+xh88/G4KI08JS6HikzAECJVOMEM W3YEWJzBZDk6DpEynrqv7E9T7+nTAOX+Tz8P9djTfs+pVZ5vL/Z9N4xUfQJCeBBxYu 0ME5Rx0NNxPr7J/7aPlDMdv4qaR66dnCIR64X1edAmYQxsDpIbz2dVjambKjvL9AJA KqGCkYVpu8Pde9R3++I6BWmdLwR5NQhDdTh56eaWeAUbr5rbdfNmD1l0qHEz0bqyLY olHr4BKts/aUg== From: SJ Park To: Cc: SJ Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 5/5] mm/damon/vaddr: support pgidle_unset probe filter type Date: Sat, 5 Sep 2026 13:26:27 -0700 Message-ID: <20260905202634.88102-6-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260905202634.88102-1-sj@kernel.org> References: <20260905202634.88102-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" DAMON virtual address space operation set (vaddr) does not support pgidle_unset probe filter type. Add the support. Signed-off-by: SJ Park --- mm/damon/vaddr.c | 55 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c index 45239f05e113b..9a38dc89a156e 100644 --- a/mm/damon/vaddr.c +++ b/mm/damon/vaddr.c @@ -522,13 +522,49 @@ static void damon_va_prep_probes(struct damon_ctx *ct= x, bool set_samples) } } =20 -static bool damon_va_filter_pass(struct folio *folio, struct damon_probe *= p) +static bool damon_va_young_addr(struct folio *folio, pte_t *pte, pmd_t *pm= d, + struct mm_struct *mm, unsigned long addr) +{ + bool young =3D false; + + if (pte) + young =3D pte_young(*pte); + else if (pmd) + young =3D pmd_young(*pmd); + young =3D young || !folio_test_idle(folio) || + mmu_notifier_test_young(mm, addr); + return young; +} + +static bool damon_va_filter_match(struct damon_filter *filter, + struct folio *folio, pte_t *pte, pmd_t *pmd, + struct mm_struct *mm, unsigned long addr) +{ + bool matched =3D false; + + switch (filter->type) { + case DAMON_FILTER_TYPE_PGIDLE_UNSET: + if (!folio) + matched =3D false; + else + matched =3D damon_va_young_addr(folio, pte, pmd, mm, + addr); + break; + default: + return damon_ops_filter_match(filter, folio); + } + return matched =3D=3D filter->matching; +} + +static bool damon_va_filter_pass(struct folio *folio, struct damon_probe *= p, + pte_t *pte, pmd_t *pmd, struct mm_struct *mm, + unsigned long addr) { struct damon_filter *f; bool pass =3D true; =20 damon_for_each_filter(f, p) { - if (damon_ops_filter_match(f, folio)) { + if (damon_va_filter_match(f, folio, pte, pmd, mm, addr)) { pass =3D f->allow; break; } @@ -543,13 +579,15 @@ struct damon_va_probe_walk_private { }; =20 static void damon_va_probe_folio(struct damon_ctx *ctx, - struct damon_region *r, struct folio *folio) + struct damon_region *r, struct folio *folio, + pte_t *pte, pmd_t *pmd, struct mm_struct *mm) { struct damon_probe *probe; int i =3D 0; =20 damon_for_each_probe(probe, ctx) { - if (damon_va_filter_pass(folio, probe)) + if (damon_va_filter_pass(folio, probe, pte, pmd, mm, + r->sampling_addr)) r->probe_hits[i]++; i++; } @@ -574,7 +612,8 @@ static int damon_va_probe_pmd_entry(pmd_t *pmd, unsigne= d long addr, folio =3D vm_normal_folio_pmd(walk->vma, addr, pmde); if (!folio) goto huge_out; - damon_va_probe_folio(priv->ctx, priv->r, folio); + damon_va_probe_folio(priv->ctx, priv->r, folio, NULL, &pmde, + walk->vma->vm_mm); =20 huge_out: spin_unlock(ptl); @@ -591,7 +630,8 @@ static int damon_va_probe_pmd_entry(pmd_t *pmd, unsigne= d long addr, folio =3D vm_normal_folio(walk->vma, addr, ptent); if (!folio) goto out; - damon_va_probe_folio(priv->ctx, priv->r, folio); + damon_va_probe_folio(priv->ctx, priv->r, folio, &ptent, NULL, + walk->vma->vm_mm); =20 out: pte_unmap_unlock(pte, ptl); @@ -615,7 +655,8 @@ static int damon_va_probe_hugetlb_entry(pte_t *pte, uns= igned long hmask, =20 folio =3D pfn_folio(pte_pfn(entry)); folio_get(folio); - damon_va_probe_folio(priv->ctx, priv->r, folio); + damon_va_probe_folio(priv->ctx, priv->r, folio, &entry, NULL, + walk->vma->vm_mm); folio_put(folio); =20 out: --=20 2.47.3