From nobody Mon May 25 04:33:39 2026 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 6FF0633CEA9; Sat, 16 May 2026 18:37:24 +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=1778956645; cv=none; b=jtbg1rlpgGwI9843GHdJFrisJ5N1MeQeXYsVpMwyhjc4esUZgip/IBSrjZDlP9J1MU+Kok5Lf8RKSE7ietv8UgyTKJeUtju+TojbJbQvE/7N8sm7u52MGhB2CbL/ub8bo3XhtZ+zYITWonl14JMxmumQgmPpgRgT/xOpr0XYFwM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956645; c=relaxed/simple; bh=8LT/D7TOnQRawE1lXMWBuu0a3XIQelloreA4qB43lWw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bcqbKEImLXTSkKMES5pgD323anDtYwMkvErQYQv+43H370Ew+Y7UGP6CJ22pcnbSNMdP3yiLQV8K27XXMh2GC7ZVyWFy4FNbkV2c4TArEESe1gJscTT2w5FjxeeWt+woGpcesn3FOA3+vVwSDgJTpkk8IHPcddn3SoqGw9yo2oI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=E0G+VqSx; 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="E0G+VqSx" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A6EE2C2BCC7; Sat, 16 May 2026 18:37:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956644; bh=8LT/D7TOnQRawE1lXMWBuu0a3XIQelloreA4qB43lWw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=E0G+VqSxQqhSNOCbM6wsCBGh67QTMlXR3OfSDjxrOghE6HDSvj2vv202wLhLeSPeN KROOkX9U1IrIzXNSiHPgtoW+TqB8mfvmn8eRDBeNIEPC68ZPPg6mqx5SBtuuN4DC0a r8lSkbV9G0zk9XBIuo4k2tQ0UeEstaXv+JP91An35qYeqs4b46geQzdKuyZRNAg1Fd h6diPSKky4SwabKoMGvaZk1Bz5c3dkji2+e86kQm8MaLWFRTwS8bB5/Zb4nhi/S4C3 dngs81oA6Yk3r0SR8WhZoPSNKsIMe91NXhqykxlY2DybUxMquevnAZhlQ7p9T64AX4 BkUk8bO1TjBBw== From: SeongJae Park To: Cc: SeongJae Park , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 01/28] mm/damon/core: introduce struct damon_probe Date: Sat, 16 May 2026 11:36:42 -0700 Message-ID: <20260516183712.81393-2-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Introduce a data structure for data attribute probe. It is just a linked list header at this step. It will be extended in a way that it can determine if a given memory has a specific data attribute. Signed-off-by: SeongJae Park --- include/linux/damon.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index f2cdb7c3f5e6c..a8fff5325b010 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -721,6 +721,15 @@ struct damon_intervals_goal { unsigned long max_sample_us; }; =20 +/** + * struct damon_probe - Data region attribute probe. + * + * @list: Siblings list. + */ +struct damon_probe { + struct list_head list; +}; + /** * struct damon_attrs - Monitoring attributes for accuracy/overhead contro= l. * --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 6FF8733D4EC; Sat, 16 May 2026 18:37:25 +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=1778956645; cv=none; b=UHd03PhbKX5YokQXy8MYp1qaSLj1JypI/7nvmJwWUV/jHCcZZF0bW0+PkjN3Se9mRrQEbbNDRM73bGZRFvfTq0Zmj6skrLrrcsM9262l1WlLjBBjOCQEhFR+SV5h9T0Gmzv/J8rfV/gMfPQx91DluXDevGOPtB/EWhTWvbTFTRw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956645; c=relaxed/simple; bh=QF0mkHpsHmEpXP/r2iX52BSaeN06R/tRwxpQFk2K61w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CFNCgx6K6edvSm66VJwwkaLSLOBK40igU1GHflUroRc/5NSvpsXQ4SV6D2pS50O/VdiC03R+3crbK4fgAEHQIy26NU0OYF+9orq8ETQyYIruioAIZdT/JNUZdVNlOymNTos+kckBsp3T9IV96EjzeNZzfHTMwV/DgdYjGfd3cUw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ujToEn/+; 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="ujToEn/+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F0673C2BCF7; Sat, 16 May 2026 18:37:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956645; bh=QF0mkHpsHmEpXP/r2iX52BSaeN06R/tRwxpQFk2K61w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ujToEn/+LXPvjen4/gVH6ZC5zXTz8Ibkzx/ovnKIg4fa9H0xwX+IXApmP5lOgSkDu gI6eNboEwYvso67DuClyTt2Q/8guu7qk/onDnTu5WqHZLkHzzPFoEenpIE1O5oNPC2 lcCuaQNKVUciOqphkvcOIaGsLGZPFqJAlKWX9mA2Nmmi6Kks2v3fvr2x+jt91a4Kac Z5Q4+dv0XNQC7NalqcDZPw1VVEvVyl1U5hqEGvucfCjCeXko10dPkjF6hIyK86J8RJ 4UWV5jaaOeiBz+tg5HdxTtfAWQbLgz9pzLbATQ+QJikwNe13r1LrMiOwU4+TEHiozt Z1VrzXpJXcHDg== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 02/28] mm/damon/core: embed damon_probe objects in damon_ctx Date: Sat, 16 May 2026 11:36:43 -0700 Message-ID: <20260516183712.81393-3-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Let damon_probe objects be able to be installed on a given damon_ctx, by adding a linked list header for storing the objects. Add initialization and cleanup of the new field with helper functions, too. Signed-off-by: SeongJae Park --- include/linux/damon.h | 9 +++++++++ mm/damon/core.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index a8fff5325b010..d15f47a321d88 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -847,6 +847,7 @@ struct damon_ctx { =20 /* public: */ struct damon_operations ops; + struct list_head probes; unsigned long addr_unit; unsigned long min_region_sz; =20 @@ -879,6 +880,11 @@ static inline unsigned long damon_sz_region(struct dam= on_region *r) return r->ar.end - r->ar.start; } =20 +#define damon_for_each_probe(p, ctx) \ + list_for_each_entry(p, &(ctx)->probes, list) + +#define damon_for_each_probe_safe(p, next, ctx) \ + list_for_each_entry_safe(p, next, &(ctx)->probes, list) =20 #define damon_for_each_region(r, t) \ list_for_each_entry(r, &t->regions_list, list) @@ -921,6 +927,9 @@ static inline unsigned long damon_sz_region(struct damo= n_region *r) =20 #ifdef CONFIG_DAMON =20 +struct damon_probe *damon_new_probe(void); +void damon_add_probe(struct damon_ctx *ctx, struct damon_probe *probe); + struct damon_region *damon_new_region(unsigned long start, unsigned long e= nd); =20 /* diff --git a/mm/damon/core.c b/mm/damon/core.c index 3dbbbfdeff719..0e55fa70fa5b6 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -109,6 +109,38 @@ int damon_select_ops(struct damon_ctx *ctx, enum damon= _ops_id id) return err; } =20 +struct damon_probe *damon_new_probe(void) +{ + struct damon_probe *p; + + p =3D kmalloc_obj(*p); + if (!p) + return NULL; + INIT_LIST_HEAD(&p->list); + return p; +} + +void damon_add_probe(struct damon_ctx *ctx, struct damon_probe *probe) +{ + list_add_tail(&probe->list, &ctx->probes); +} + +static void damon_del_probe(struct damon_probe *p) +{ + list_del(&p->list); +} + +static void damon_free_probe(struct damon_probe *p) +{ + kfree(p); +} + +static void damon_destroy_probe(struct damon_probe *p) +{ + damon_del_probe(p); + damon_free_probe(p); +} + #ifdef CONFIG_DAMON_DEBUG_SANITY static void damon_verify_new_region(unsigned long start, unsigned long end) { @@ -601,6 +633,8 @@ struct damon_ctx *damon_new_ctx(void) ctx->attrs.min_nr_regions =3D 10; ctx->attrs.max_nr_regions =3D 1000; =20 + INIT_LIST_HEAD(&ctx->probes); + ctx->addr_unit =3D 1; ctx->min_region_sz =3D DAMON_MIN_REGION_SZ; =20 @@ -621,12 +655,16 @@ static void damon_destroy_targets(struct damon_ctx *c= tx) void damon_destroy_ctx(struct damon_ctx *ctx) { struct damos *s, *next_s; + struct damon_probe *p, *next_p; =20 damon_destroy_targets(ctx); =20 damon_for_each_scheme_safe(s, next_s, ctx) damon_destroy_scheme(s); =20 + damon_for_each_probe_safe(p, next_p, ctx) + damon_destroy_probe(p); + kfree(ctx); } =20 --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 A219F33DEDD; Sat, 16 May 2026 18:37:25 +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=1778956645; cv=none; b=aAuqyFdfI3rkfYYs0CRc0P4zKQ4J4jGiYzdx7aVE8hDl4jzaJrgrTLLJYrXOqO3kNnEVslSlD17YYn1edUjgJWWXKWDUMQI8GvogC30Wkm0HS54yNJBAkJ/7zvmeILEPw8Es8CKB3NTAUFw3pBqvnM7gDxU3+Pr4VlS+YVtTqGU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956645; c=relaxed/simple; bh=9qp2MHSM8s3w0sFukfKdtDY+4dXqqo1Od1wtQQBaYpE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MsfE0ls+WyntEO0cqUyxXhCrECouOvAO3b/FClLOLjEsYu/tAD6g+dLM1DZg5dqGVQkeGXCUEN0uq+cvMbmWm2cmHg33z6BXSEdb33ijsYE5QZtCwF7IBM5lsOiOZM6GmwYJGdYNITLr4JeQiCUR8MkA3jW1NNnUvbcxq2NhpVc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Bw6wvPQL; 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="Bw6wvPQL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 51BDBC2BCB8; Sat, 16 May 2026 18:37:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956645; bh=9qp2MHSM8s3w0sFukfKdtDY+4dXqqo1Od1wtQQBaYpE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Bw6wvPQLdsJaJizOt333zj+YEXZGuQp/R+IN+ZGEEyhPIguIJLOM3+JgFBFxg+ZJd 0kURv5jMOCCe0Mx/2aRuuEKYYM/xxQKUqhfhwnuzOFNFUwz4xwggQ9k4IiKKy/2dZ6 7rdD3Iet4yMtKXu45uWakL4NFH1V7wueUvx1gQmivjJzEZ+KaMD03FywtERAVTF7E7 6r5yfG9OMXVlYx7ovBZwNcfxw2PeAMX3xI0O6Pj+Ee8aNtiRCE+b/BSzx+8dAiPQR9 VGqpHtGEZQToRKE7bSDTYpa0VcAvnjNKmwJsVGPswoDuzqX3oEbiMOSYXsZH56EdlR azn6CgVwxd9Eg== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 03/28] mm/damon/core: introduce damon_filter Date: Sat, 16 May 2026 11:36:44 -0700 Message-ID: <20260516183712.81393-4-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Define a data structure for constructing damon_probe's attributes check, namely damon_filter. It is very similar to damos_filter but works only for monitoring purposes. Also embed that into damon_probe, implement essential handling of the link, with fundamental helpers. Signed-off-by: SeongJae Park --- include/linux/damon.h | 36 ++++++++++++++++++++++++++++++++++++ mm/damon/core.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index d15f47a321d88..32005b8b1f8cd 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -721,12 +721,38 @@ struct damon_intervals_goal { unsigned long max_sample_us; }; =20 +/** + * enum damon_filter_type - Type of &struct damon_filter + * + * @DAMON_FILTER_TYPE_ANON: Anonymous pages. + */ +enum damon_filter_type { + DAMON_FILTER_TYPE_ANON, +}; + +/** + * struct damon_filter - DAMON region filter for &struct damon_probe. + * + * @type: Type of the region. + * @matching: Whether this filter is for the type-matching ones. + * @allow: Whether the @type-@matching ones should pass this filter. + * @list: Siblings list. + */ +struct damon_filter { + enum damon_filter_type type; + bool matching; + bool allow; + struct list_head list; +}; + /** * struct damon_probe - Data region attribute probe. * + * @filters: Filters for assessing if a given region is for this probe. * @list: Siblings list. */ struct damon_probe { + struct list_head filters; struct list_head list; }; =20 @@ -880,6 +906,12 @@ static inline unsigned long damon_sz_region(struct dam= on_region *r) return r->ar.end - r->ar.start; } =20 +#define damon_for_each_filter(f, p) \ + list_for_each_entry(f, &(p)->filters, list) + +#define damon_for_each_filter_safe(f, next, p) \ + list_for_each_entry_safe(f, next, &(p)->filters, list) + #define damon_for_each_probe(p, ctx) \ list_for_each_entry(p, &(ctx)->probes, list) =20 @@ -927,6 +959,10 @@ static inline unsigned long damon_sz_region(struct dam= on_region *r) =20 #ifdef CONFIG_DAMON =20 +struct damon_filter *damon_new_filter(enum damon_filter_type type, + bool matching, bool allow); +void damon_add_filter(struct damon_probe *probe, struct damon_filter *f); + struct damon_probe *damon_new_probe(void); void damon_add_probe(struct damon_ctx *ctx, struct damon_probe *probe); =20 diff --git a/mm/damon/core.c b/mm/damon/core.c index 0e55fa70fa5b6..44943d654dcce 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -109,6 +109,31 @@ int damon_select_ops(struct damon_ctx *ctx, enum damon= _ops_id id) return err; } =20 +struct damon_filter *damon_new_filter(enum damon_filter_type type, + bool matching, bool allow) +{ + struct damon_filter *filter; + + filter =3D kmalloc_obj(*filter); + if (!filter) + return NULL; + filter->type =3D type; + filter->matching =3D matching; + filter->allow =3D allow; + INIT_LIST_HEAD(&filter->list); + return filter; +} + +void damon_add_filter(struct damon_probe *p, struct damon_filter *f) +{ + list_add_tail(&f->list, &p->filters); +} + +static void damon_free_filter(struct damon_filter *f) +{ + kfree(f); +} + struct damon_probe *damon_new_probe(void) { struct damon_probe *p; @@ -116,6 +141,7 @@ struct damon_probe *damon_new_probe(void) p =3D kmalloc_obj(*p); if (!p) return NULL; + INIT_LIST_HEAD(&p->filters); INIT_LIST_HEAD(&p->list); return p; } @@ -132,6 +158,10 @@ static void damon_del_probe(struct damon_probe *p) =20 static void damon_free_probe(struct damon_probe *p) { + struct damon_filter *f, *next; + + damon_for_each_filter_safe(f, next, p) + damon_free_filter(f); kfree(p); } =20 --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 1113333F38E; Sat, 16 May 2026 18:37:26 +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=1778956646; cv=none; b=D2KqXSjoUE/TQ2Mds3Kls+MBBa0DAMMDCbCDrFo78CyPOS1jWpe1DmvZA5wGV3jX18mrsRGFraFljpgCiTzhFEDCINP41552F6Fdu7FzYYbAty0pBP4AHTXE50kU3HqoSVrf9b47V1OKgmhSOFNQJAruhBzfBknSQWbdEofwlqs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956646; c=relaxed/simple; bh=V8jJ5epB+GwJSdNuM2GEIbS33YAdZRISnffFQmMwTmE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hsdj244BqWYwui9TrhQDZN/ZGn4ytPoX9U8XR1Cr8hB/hgccppczn2AFbbFlvmdcs9qjfvK6wjNrEDCrzoTiz4SdiuT/CN0rgfIiWw6CsL7S+gHRRXGTgUQRk3+Z2wwF/xdvDW56XRaRgTZs/GnmGp2C7Dm3qEj12kEumA3GRbA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qOtip+Gl; 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="qOtip+Gl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AC68EC19425; Sat, 16 May 2026 18:37:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956645; bh=V8jJ5epB+GwJSdNuM2GEIbS33YAdZRISnffFQmMwTmE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qOtip+GlGcL7t+EwZKaXQLCFr3xqYaw6Nr7cnKzQx8xYPrpM/kcr0/SKrhOoXdd9R qSMDoMVaNhIafdwL9hQJrS2zuOmif8M8x0fijdEbOY7uHc4EC3sviPgpdH0ykggxqs +yxzhUe0GAp2cQJZZWbiKoVMvirqkmOUSX3Qb3oDUTE+ua49rpCaGet76F/D9HWseD zrF5N2YeDxjXzagdJku/llY3r7HYFozKsbuktx5eghFwgg9GWK6yRQuitFw4XNbnE+ x+Y/kJHVQ2D5e+Jq2aut+xzkdzjruvzrH0XmudSYlbNRd3kI62G8oQHwqjKNlS3UZ2 Vqdh2U+rmb4dg== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 04/28] mm/damon/core: commit probes Date: Sat, 16 May 2026 11:36:45 -0700 Message-ID: <20260516183712.81393-5-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Update damon_commit_ctx() to commit installed data probes, too. Signed-off-by: SeongJae Park --- mm/damon/core.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/mm/damon/core.c b/mm/damon/core.c index 44943d654dcce..15f2795a1156f 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -129,11 +129,34 @@ void damon_add_filter(struct damon_probe *p, struct d= amon_filter *f) list_add_tail(&f->list, &p->filters); } =20 +static void damon_del_filter(struct damon_filter *f) +{ + list_del(&f->list); +} + static void damon_free_filter(struct damon_filter *f) { kfree(f); } =20 +static void damon_destroy_filter(struct damon_filter *f) +{ + damon_del_filter(f); + damon_free_filter(f); +} + +static struct damon_filter *damon_nth_filter(int n, struct damon_probe *p) +{ + struct damon_filter *f; + int i =3D 0; + + damon_for_each_filter(f, p) { + if (i++ =3D=3D n) + return f; + } + return NULL; +} + struct damon_probe *damon_new_probe(void) { struct damon_probe *p; @@ -171,6 +194,18 @@ static void damon_destroy_probe(struct damon_probe *p) damon_free_probe(p); } =20 +static struct damon_probe *damon_nth_probe(int n, struct damon_ctx *ctx) +{ + struct damon_probe *p; + int i =3D 0; + + damon_for_each_probe(p, ctx) { + if (i++ =3D=3D n) + return p; + } + return NULL; +} + #ifdef CONFIG_DAMON_DEBUG_SANITY static void damon_verify_new_region(unsigned long start, unsigned long end) { @@ -1378,6 +1413,72 @@ static int damon_commit_targets( return 0; } =20 +static void damon_commit_filter(struct damon_filter *dst, + struct damon_filter *src) +{ + dst->type =3D src->type; + dst->matching =3D src->matching; + dst->allow =3D src->allow; +} + +static int damon_commit_filters(struct damon_probe *dst, + struct damon_probe *src) +{ + struct damon_filter *dst_filter, *next, *src_filter, *new_filter; + int i =3D 0, j =3D 0; + + damon_for_each_filter_safe(dst_filter, next, dst) { + src_filter =3D damon_nth_filter(i++, src); + if (src_filter) + damon_commit_filter(dst_filter, src_filter); + else + damon_destroy_filter(dst_filter); + } + + damon_for_each_filter_safe(src_filter, next, src) { + if (j++ < i) + continue; + + new_filter =3D damon_new_filter(src_filter->type, + src_filter->matching, src_filter->allow); + if (!new_filter) + return -ENOMEM; + damon_add_filter(dst, new_filter); + } + return 0; +} + +static int damon_commit_probes(struct damon_ctx *dst, struct damon_ctx *sr= c) +{ + struct damon_probe *dst_probe, *next, *src_probe, *new_probe; + int i =3D 0, j =3D 0, err; + + damon_for_each_probe_safe(dst_probe, next, dst) { + src_probe =3D damon_nth_probe(i++, src); + if (src_probe) { + err =3D damon_commit_filters(dst_probe, src_probe); + if (err) + return err; + } else { + damon_destroy_probe(dst_probe); + } + } + + damon_for_each_probe_safe(src_probe, next, src) { + if (j++ < i) + continue; + + new_probe =3D damon_new_probe(); + if (!new_probe) + return -ENOMEM; + damon_add_probe(dst, new_probe); + err =3D damon_commit_filters(new_probe, src_probe); + if (err) + return err; + } + return 0; +} + /** * damon_commit_ctx() - Commit parameters of a DAMON context to another. * @dst: The commit destination DAMON context. @@ -1418,6 +1519,9 @@ int damon_commit_ctx(struct damon_ctx *dst, struct da= mon_ctx *src) return err; } dst->ops =3D src->ops; + err =3D damon_commit_probes(dst, src); + if (err) + return err; dst->addr_unit =3D src->addr_unit; dst->min_region_sz =3D src->min_region_sz; =20 --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 63FED329C48; Sat, 16 May 2026 18:37:26 +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=1778956646; cv=none; b=gBz7Mswf7irQTD4dLoeWHVKP4rjBMH6DkqeuEwg4+ns4GcJCIrPNnaosAa6nnWNFucdgwCpkXjeefsQIfXR+f2RMuRpBep/5k67fbxN37UIT0AyawHZqXbJEeLG8qIrY4TawoYdMLYXKr0OvWtp4/dbsp08ddm1NIwxu1PCP0sI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956646; c=relaxed/simple; bh=rRV3S8Zs8/YBc8+5AI5kB/a9fxfrWlXoj5Vu2qtKMvo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iw6ib/RMhfC7MDnmLUACVtGXvBXgGfl0nvwyolW72mVEbFTeKO/VT7E87AIOET2ctHY4wOlyW7XmCHqs/4XAZgKq8dYENGhFI8eJRrJp0hmpmZd8N7KO64+JaGqtI8uECqWpT5NswXfxcv9s2BW93m4BIwcZknZy7pLk7dpYDHY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SK+xuiP4; 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="SK+xuiP4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0F8A6C2BCC7; Sat, 16 May 2026 18:37:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956646; bh=rRV3S8Zs8/YBc8+5AI5kB/a9fxfrWlXoj5Vu2qtKMvo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SK+xuiP4C2SaxDcfue3JBq/5hYij+Ee22zfOQ6LlqvqDk9kYdu9pGzHSPQTTBbInH lI8AwtBpUNP8Q0J0pMNJecqfzfme9hlNDukGaab3cU/AbSBtk/PsOJshIpPKMV1ltG s2ZhlE2SkmzDXMuWsK73RblUfd4XVDWJ2KEAfoXutOpRNkNuLXi41DA70efNBhp0BV iJzYi8PjHAh8JJ60zu3DmBB4Is+AkFOaFQ4ml1LfexUKjMQYwM2dqol68KXNHR5Tzd VgYjMPTiiFwo02VZz+uGa9qo51mxjy9tBN5v4HMzinTJGVPZ2AVZr4kLktU/0GuCrF GflR/TeenGipw== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 05/28] mm/damon/core: introduce damon_region->probe_hits Date: Sat, 16 May 2026 11:36:46 -0700 Message-ID: <20260516183712.81393-6-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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 an array for the per-region per-probe positive samples count. For simple and efficient implementation, add a limit to the number of data probes and set the array to support only the limited number of counters. Signed-off-by: SeongJae Park --- include/linux/damon.h | 4 ++++ mm/damon/core.c | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index 32005b8b1f8cd..9e70239e5305f 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -16,6 +16,8 @@ =20 /* Minimal region size. Every damon_region is aligned by this. */ #define DAMON_MIN_REGION_SZ PAGE_SIZE +/* Maximum number of monitoring probes. */ +#define DAMON_MAX_PROBES (4) /* Max priority score for DAMON-based operation schemes */ #define DAMOS_MAX_SCORE (99) =20 @@ -52,6 +54,7 @@ struct damon_size_range { * @nr_accesses: Access frequency of this region. * @nr_accesses_bp: @nr_accesses in basis point (0.01%) that updated for * each sampling interval. + * @probe_hits: Number of probe-positive region samples. * @list: List head for siblings. * @age: Age of this region. * @@ -80,6 +83,7 @@ struct damon_region { unsigned long sampling_addr; unsigned int nr_accesses; unsigned int nr_accesses_bp; + unsigned char probe_hits[DAMON_MAX_PROBES]; struct list_head list; =20 unsigned int age; diff --git a/mm/damon/core.c b/mm/damon/core.c index 15f2795a1156f..e5667660b4cd9 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -225,6 +225,7 @@ static void damon_verify_new_region(unsigned long start= , unsigned long end) struct damon_region *damon_new_region(unsigned long start, unsigned long e= nd) { struct damon_region *region; + int i; =20 damon_verify_new_region(start, end); region =3D kmem_cache_alloc(damon_region_cache, GFP_KERNEL); @@ -235,6 +236,8 @@ struct damon_region *damon_new_region(unsigned long sta= rt, unsigned long end) region->ar.end =3D end; region->nr_accesses =3D 0; region->nr_accesses_bp =3D 0; + for (i =3D 0; i < DAMON_MAX_PROBES; i++) + region->probe_hits[i] =3D 0; INIT_LIST_HEAD(®ion->list); =20 region->age =3D 0; @@ -2754,12 +2757,17 @@ static void damon_merge_two_regions(struct damon_ta= rget *t, struct damon_region *l, struct damon_region *r) { unsigned long sz_l =3D damon_sz_region(l), sz_r =3D damon_sz_region(r); + int i; =20 l->nr_accesses =3D (l->nr_accesses * sz_l + r->nr_accesses * sz_r) / (sz_l + sz_r); l->nr_accesses_bp =3D l->nr_accesses * 10000; l->age =3D (l->age * sz_l + r->age * sz_r) / (sz_l + sz_r); l->ar.end =3D r->ar.end; + /* todo: do this for only installed probes */ + for (i =3D 0; i < DAMON_MAX_PROBES; i++) + l->probe_hits[i] =3D (l->probe_hits[i] * sz_l + r->probe_hits[i] + * sz_r) / (sz_l + sz_r); damon_verify_merge_two_regions(l, r); damon_destroy_region(r, t); } @@ -2882,6 +2890,8 @@ static void damon_split_region_at(struct damon_target= *t, new->last_nr_accesses =3D r->last_nr_accesses; new->nr_accesses_bp =3D r->nr_accesses_bp; new->nr_accesses =3D r->nr_accesses; + /* todo: do this for only installed probes */ + memcpy(new->probe_hits, r->probe_hits, sizeof(r->probe_hits)); =20 damon_insert_region(new, r, damon_next_region(r), t); } --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 A4546340286; Sat, 16 May 2026 18:37:26 +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=1778956646; cv=none; b=mVDGpgH+nrVxN545nchZ03SoMom6UCxdYD+gIXL73b6e/fJ8uC9P2yQeT+stoygEoUpVSjlMcFEZ8nX0sYCf0wmwgVXGUfWeUJ/KE1JossGMLdixDZAzmx+MdJPw416VyYCSnOmhg1gsc69SEMzW4KV28XVaw+kkcafiaNPsqsw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956646; c=relaxed/simple; bh=BuHcQxBfKAGy6KrsKoN0hgRqvRDUguIDR5Ybq3/Wp0o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nvpJ8VhIIRasXWDqTVLbtlA4Z56yjIyakUUkRtYSN4dsyCnVSDheWsnHoDZYYNjFFtJxHayU/fFtojisdMJE7HPRuq0Dso5SSuHJLc4GS1sUmYIMV/ePz+1rfeftcGci4xwGIjY1a30y3MQ+WVP8e/CpEW7qVNuBnUbs6KG3BAQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Wh8zUIRu; 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="Wh8zUIRu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 641E4C2BCF5; Sat, 16 May 2026 18:37:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956646; bh=BuHcQxBfKAGy6KrsKoN0hgRqvRDUguIDR5Ybq3/Wp0o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Wh8zUIRuGhg8pd0sj3+VAfQpNbUn7HNJekNiHtL1lC54niNCCHjTurkMpp11z4/47 rgqjCfLFBSf9kTnnc/r6DRoCgRvkFl/1i1mkyS7CKvt7HUUbk8evl++70dmWRgjV5i Vi+EYS38qe54lyI+kKbo+SJXKTAcBJbXGSxE1IjEGsG6NTvZ7Pfe13N46MZBgNeBgq PigFlGoXhDgyNrzEvyuDOcGOUgLRkvF0TkVqWesIV8VYXSa80zWWW+0r4QeZYTNCFF JDNUdeC7Rmx7NHDBHJU6cQtBzmUOiNC2JbGJQ9T8dGmF4MUUTU+SL4LE6Tho5FwaTV TX/3LlC4ifWGw== From: SeongJae Park To: Cc: SeongJae Park , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 06/28] mm/damon/core: introduce damon_ops->apply_probes Date: Sat, 16 May 2026 11:36:47 -0700 Message-ID: <20260516183712.81393-7-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Extend damon_operations struct with a new callback, namely apply_probes. The callback will be invoked for data attributes monitoring. More specifically, the callback will apply damon_probe objects to each region and update the per-region per-probe counters for the number of encountered probe-positive samples. Signed-off-by: SeongJae Park --- include/linux/damon.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index 9e70239e5305f..d3b6296700a08 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -621,6 +621,7 @@ enum damon_ops_id { * @update: Update operations-related data structures. * @prepare_access_checks: Prepare next access check of target regions. * @check_accesses: Check the accesses to target regions. + * @apply_probes: Apply probes for each region. * @get_scheme_score: Get the score of a region for a scheme. * @apply_scheme: Apply a DAMON-based operation scheme. * @target_valid: Determine if the target is valid. @@ -647,6 +648,8 @@ enum damon_ops_id { * last preparation and update the number of observed accesses of each reg= ion. * It should also return max number of observed accesses that made as a re= sult * of its update. The value will be used for regions adjustment threshold. + * @apply_probes should apply the data attribute probes to each region and + * accordingly update the probe hits counter of the region. * @get_scheme_score should return the priority score of a region for a sc= heme * as an integer in [0, &DAMOS_MAX_SCORE]. * @apply_scheme is called from @kdamond when a region for user provided @@ -664,6 +667,7 @@ struct damon_operations { void (*update)(struct damon_ctx *context); void (*prepare_access_checks)(struct damon_ctx *context); unsigned int (*check_accesses)(struct damon_ctx *context); + void (*apply_probes)(struct damon_ctx *context); int (*get_scheme_score)(struct damon_ctx *context, struct damon_region *r, struct damos *scheme); unsigned long (*apply_scheme)(struct damon_ctx *context, --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 30E0F342514; Sat, 16 May 2026 18:37:27 +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=1778956647; cv=none; b=NUNPdUVMmXfBudcxFq70FXzesn8SrWs6XtuClafVpXfFcwT55lOgOb4EDm3cher/ypEb2YynJtTvSrTvKp1eedXUIUVJy3I3xoSYSHfcH+zFLZYEUxQPyaPxjclN7Bv0BW3Q4QDfbCxjgV3WfFHPYbkda/N4+rlPeJ1u6w3P6mw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956647; c=relaxed/simple; bh=uClJ0L17ynWbY4YuI5snfXPDwvcqzODKDGDtrjyzs6M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q0wKNr1dTJd1Q6AYBNQCrpv9y+oxfhP00SjEjuJQFhOvwQLFD2YdjVIPhCk0VmjOiKW/GK2hVnTv8aUaCYK4LHc4bByNkFAJC0vdzSc2IuSZYg5cvdzYKrXm+Fvkz0VKj8MIK3RSTVu/kHTbHr1HfBWYiReivixziQpLdpmukN0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ahYiYfUu; 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="ahYiYfUu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B051BC2BCB8; Sat, 16 May 2026 18:37:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956646; bh=uClJ0L17ynWbY4YuI5snfXPDwvcqzODKDGDtrjyzs6M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ahYiYfUuE7c1uPb7cCFrsijDXb3+lORDe/eBd6SqLA9iZ7SWMSdssqv2TfKfQjxh2 JBiUBXvOuPpqpJ+2AzsaGURyx2GxQmjr9rB9QSxnEW0TQtnge/IkuSDprJcjrv98+Q iSagIWedjuRRSsgAB1+QX2xvYH0wDdRRlisv8cBkJkcGtib+aG+lTg2/v+XtP1PuFe yHrlgI9gIT5QGOo4u3i/mne/7Dfjq/me4uTjgSqXQE3SVcAdIMK7tsmTFpjvlbrki4 w2K5+/kzBYsjUwby0GwIGxn7OUByOyIUNd78wEyL3tQV/CRf0yanjIx3o9v1cxvtUQ fjxww7q58P2BA== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 07/28] mm/damon/core: do data attributes monitoring Date: Sat, 16 May 2026 11:36:48 -0700 Message-ID: <20260516183712.81393-8-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement the data attributes monitoring execution. Update kdamond to invoke the probes application callback, and reset the aggregated number of per-region per-probe positive samples for every aggregation interval. Signed-off-by: SeongJae Park --- mm/damon/core.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mm/damon/core.c b/mm/damon/core.c index e5667660b4cd9..dde3c8d8fef89 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1886,10 +1886,14 @@ static void kdamond_reset_aggregated(struct damon_c= tx *c) struct damon_region *r; =20 damon_for_each_region(r, t) { + int i; + trace_damon_aggregated(ti, r, damon_nr_regions(t)); damon_warn_fix_nr_accesses_corruption(r); r->last_nr_accesses =3D r->nr_accesses; r->nr_accesses =3D 0; + for (i =3D 0; i < DAMON_MAX_PROBES; i++) + r->probe_hits[i] =3D 0; damon_verify_reset_aggregated(r, c); } ti++; @@ -3179,6 +3183,8 @@ static int kdamond_fn(void *data) =20 if (ctx->ops.check_accesses) max_nr_accesses =3D ctx->ops.check_accesses(ctx); + if (ctx->ops.apply_probes) + ctx->ops.apply_probes(ctx); =20 if (time_after_eq(ctx->passed_sample_intervals, next_aggregation_sis)) { --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 59486342CB4; Sat, 16 May 2026 18:37:27 +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=1778956647; cv=none; b=h2bl0N6AQFsYkZt4+7tdHm7vhrQCo0lbIDvLXcR0OCVTqDQEAAHmTD8jmwbPAtXPZxE1/8P93n+jDSqhqQmw/CpwlL4UWY24p8bEcm4J3JJpaDIirYBgV1d2OUiu/TOHSaxPhkLWqgEdYb3XMiHJJ6kPg7pgb/US4Zfp6QXEWxg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956647; c=relaxed/simple; bh=YUEUEwyNL9PReREavu4cR4f44O9YYFDKrNpJr/Ooyz0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qbIU3Ovpu+QEvk9eBeZp/oVkZapQKgbCEGBG49MF+qn/MO24QGJoxF1eP6ECk/lGdxu9tyAhRzJtcSD/tgQtlT26QbEwbzp7ZtVMNomTrxJjE/gK9lPzZz8s4i9nGxFoYOznuwzStMMhqsTSLRxaTtkDLUidLKcyx9L8atTlB0w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=X3w8+4T1; 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="X3w8+4T1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 127B2C2BCC7; Sat, 16 May 2026 18:37:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956647; bh=YUEUEwyNL9PReREavu4cR4f44O9YYFDKrNpJr/Ooyz0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=X3w8+4T1W3iNDJnRNOsh+A55B+RcmvuWDBMe5TonS+ne5qofWDudjhSrVuME5OyFz Qs7KPBG5AuG8LmcJIx4LNnGVkWApeaRCiu6NLQfZhZGzHuC4aDM8GsBxzH7BeKBR0d 6agISdRkDPWbMlCHnNGHaDHp6hIi6cD28HI3LDRc/OjY6uDOVz79woxAaROzms4/P5 XotRF9QgDLkJ+u36QxqffkICMVbvQ3/EWp/IYbaGPT6lqxCuJQ60cCtWKhm+Tl+lwp D3QgnGfvuwTQetjowQg4J9O0tvyKea5Dp944AUHWu8ercaFSi7zNUqm84Njbxd9RvJ 8AOd0eKYx6Hgw== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 08/28] mm/damon/paddr: support data attributes monitoring Date: Sat, 16 May 2026 11:36:49 -0700 Message-ID: <20260516183712.81393-9-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement and register damon_operations->apply_probes() callback to support data attributes monitoring. Signed-off-by: SeongJae Park --- mm/damon/paddr.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c index 5cdcc5037cbc1..81780b05c175e 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -120,6 +120,67 @@ static unsigned int damon_pa_check_accesses(struct dam= on_ctx *ctx) return max_nr_accesses; } =20 +static bool damon_pa_filter_match(struct damon_filter *filter, + struct folio *folio) +{ + bool matched =3D false; + + switch (filter->type) { + case DAMON_FILTER_TYPE_ANON: + if (!folio) { + matched =3D false; + break; + } + matched =3D folio_test_anon(folio); + break; + default: + break; + } + return matched =3D=3D filter->matching; +} + +static bool damon_pa_filter_pass(phys_addr_t pa, struct folio *folio, + struct damon_probe *p) +{ + struct damon_filter *f; + bool pass =3D true; + + damon_for_each_filter(f, p) { + if (damon_pa_filter_match(f, folio)) { + pass =3D f->allow; + break; + } + pass =3D !f->allow; + } + return pass; +} + +static void damon_pa_apply_probes(struct damon_ctx *ctx) +{ + struct damon_target *t; + struct damon_region *r; + struct damon_probe *p; + + damon_for_each_target(t, ctx) { + damon_for_each_region(r, t) { + int i =3D 0; + phys_addr_t pa; + struct folio *folio; + + pa =3D damon_pa_phys_addr(r->sampling_addr, + ctx->addr_unit); + folio =3D damon_get_folio(PHYS_PFN(pa)); + damon_for_each_probe(p, ctx) { + if (damon_pa_filter_pass(pa, folio, p)) + r->probe_hits[i]++; + i++; + } + if (folio) + folio_put(folio); + } + } +} + /* * damos_pa_filter_out - Return true if the page should be filtered out. */ @@ -371,6 +432,7 @@ static int __init damon_pa_initcall(void) .update =3D NULL, .prepare_access_checks =3D damon_pa_prepare_access_checks, .check_accesses =3D damon_pa_check_accesses, + .apply_probes =3D damon_pa_apply_probes, .target_valid =3D NULL, .apply_scheme =3D damon_pa_apply_scheme, .get_scheme_score =3D damon_pa_scheme_score, --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 DB7B43446A3; Sat, 16 May 2026 18:37:27 +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=1778956647; cv=none; b=cDIDbRtD2l+0xgWcm9jAc06SZtVPXXJPxmWTvjcdg3EvVjLL7H2pPgFMw7ta8y6gb5TpyakbuI3SxrAXpOEYHoJ9sOzz6qug0+dRK2U+mADSoqjz6XnrWjsZMZApjqJ2KRa4uSkhsMWOWTGrmTvMlyyB96R1NKPp7ai0x2U1HcM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956647; c=relaxed/simple; bh=iRZBRbnhuMWGPc47mimwPtAfnZSCPltTg9pBo2Ew2oI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QVbcghsNXWi3Hg6nsMqyjqiAK2zt2UkwMnOYYpBiHHCW79TQgTL+vXWyi0LFG2p1IqWBj+XLHeh2/XxeqQsQthZhRIyM7N6yj2pIe/xGAn4MtjZS1h0oZlJ0cLwD1tqJehSDgEghnwx/r6KxIW+Hvxx8TwQYzs/sNUr3uTPOqlo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hGYojE+s; 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="hGYojE+s" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 663A7C19425; Sat, 16 May 2026 18:37:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956647; bh=iRZBRbnhuMWGPc47mimwPtAfnZSCPltTg9pBo2Ew2oI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hGYojE+shBdtvikrnxOfsrT13b1eW4VMwiFxQ17DjbE9RTrpRNiUYBW/ItmCHLxZf 8vbHrJ9JMniWgT88pKw9bErJFBu0oR+x6KbKek2PUZD23r6BC4YgY/N9t6IQYISKk8 TLomoYIVsPz4nVsw+I7+7arQ2y8l2/MLM/kuQpflJbNYy8C+4tvLcQTViY+eu5p8yK rSCVpCHjQ0M6j0TAUGtN+8OTQihDSO7/JZj1wyol/PgcT8nUoP3ZrzGoXixLtzJwFX IJcnqNWrKShJLSqFfuUIVNcIDcJM+l3acjpfqXcEiRoExOieJwDhOZRhI05caqF+ZN v7O8gBKKB6rLw== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 09/28] mm/damon/sysfs: implement probes dir Date: Sat, 16 May 2026 11:36:50 -0700 Message-ID: <20260516183712.81393-10-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement sysfs directory that can be used by the users to install data probes. Signed-off-by: SeongJae Park --- mm/damon/sysfs.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index eefa959aa30ae..5f3b253f50ebf 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -747,6 +747,35 @@ static const struct kobj_type damon_sysfs_intervals_kt= ype =3D { .default_groups =3D damon_sysfs_intervals_groups, }; =20 +/* + * probes directory + */ + +struct damon_sysfs_probes { + struct kobject kobj; +}; + +static struct damon_sysfs_probes *damon_sysfs_probes_alloc(void) +{ + return kzalloc_obj(struct damon_sysfs_probes); +} + +static void damon_sysfs_probes_release(struct kobject *kobj) +{ + kfree(container_of(kobj, struct damon_sysfs_probes, kobj)); +} + +static struct attribute *damon_sysfs_probes_attrs[] =3D { + NULL, +}; +ATTRIBUTE_GROUPS(damon_sysfs_probes); + +static const struct kobj_type damon_sysfs_probes_ktype =3D { + .release =3D damon_sysfs_probes_release, + .sysfs_ops =3D &kobj_sysfs_ops, + .default_groups =3D damon_sysfs_probes_groups, +}; + /* * monitoring_attrs directory */ @@ -755,6 +784,7 @@ struct damon_sysfs_attrs { struct kobject kobj; struct damon_sysfs_intervals *intervals; struct damon_sysfs_ul_range *nr_regions_range; + struct damon_sysfs_probes *probes; }; =20 static struct damon_sysfs_attrs *damon_sysfs_attrs_alloc(void) @@ -771,6 +801,7 @@ static int damon_sysfs_attrs_add_dirs(struct damon_sysf= s_attrs *attrs) { struct damon_sysfs_intervals *intervals; struct damon_sysfs_ul_range *nr_regions_range; + struct damon_sysfs_probes *probes; int err; =20 intervals =3D damon_sysfs_intervals_alloc(5000, 100000, 60000000); @@ -799,8 +830,22 @@ static int damon_sysfs_attrs_add_dirs(struct damon_sys= fs_attrs *attrs) if (err) goto put_nr_regions_intervals_out; attrs->nr_regions_range =3D nr_regions_range; + + probes =3D damon_sysfs_probes_alloc(); + if (!probes) { + err =3D -ENOMEM; + goto put_nr_regions_intervals_out; + } + err =3D kobject_init_and_add(&probes->kobj, + &damon_sysfs_probes_ktype, &attrs->kobj, "probes"); + if (err) + goto put_probes_out; + attrs->probes =3D probes; return 0; =20 +put_probes_out: + kobject_put(&probes->kobj); + attrs->probes =3D NULL; put_nr_regions_intervals_out: kobject_put(&nr_regions_range->kobj); attrs->nr_regions_range =3D NULL; @@ -817,6 +862,7 @@ static void damon_sysfs_attrs_rm_dirs(struct damon_sysf= s_attrs *attrs) kobject_put(&attrs->nr_regions_range->kobj); damon_sysfs_intervals_rm_dirs(attrs->intervals); kobject_put(&attrs->intervals->kobj); + kobject_put(&attrs->probes->kobj); } =20 static void damon_sysfs_attrs_release(struct kobject *kobj) --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 25ECC33EB06; Sat, 16 May 2026 18:37:28 +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=1778956648; cv=none; b=rJyGy94l/DVR8AaJqJQiUBXzuOhoyFZrnqzc5D2E/bAVZGvoCXcqK7PU4ysUrqv5WTg1IpKjRaYZ36kn47RxavV8Do0slmHiVeRPMRtBPT11er22r6t7nfUkq5XEdrpl4JmbzGQbRb8Up8gTxptXbzRU2UDtIU56IrsycVaoGQI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956648; c=relaxed/simple; bh=WYmv4bT5UJuMRx71xod34Pd0amao4jaLlWchqRhE7dM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S1PcuTUVz+HDY0ZxYRDYCcot40G6bTfg+/C335pnXxYKSttqHKBrIJJNemBnWK3SCpI94CfQpnKnGF8JAGafODi23YqXCdRjn8qiyRt1aQcBDS5wkxh8EyWAzCx3uAMIRcJ17XiWF5z2miy7D0U4c7THDaaK/uls/2QaaEjviss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HBfjDveL; 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="HBfjDveL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C0978C2BCFA; Sat, 16 May 2026 18:37:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956648; bh=WYmv4bT5UJuMRx71xod34Pd0amao4jaLlWchqRhE7dM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HBfjDveL8mJyDYDZQuy4FgIoTDXLxwDdX5RmY7qfHqZoBxBzUHtf3nZOwe21OGScB InS3vc5L9fBnSomAQv8on8fE1SM0rR91V0xK7x6qOyzry1/PYlLqYODNiU3OmeL8ib aAW0Ulbt9+GmatqlMsGFcArr10vc9v4FSHXWZ4JN0OIwtZYOxSw6jEKhTNf20inOyg O+WO5KiOpFeD4/uQ40QPZ6o+vLKlK1RWHJeHTXloJAIe9TwJRpOVMY0oZMAq6EeKS1 NBNYagYVkW0rZAc8gL1GdIudnWqgEMcQxaYtAcdUBMBgyz7H8p7cLHgX8ch5szRQZI 6QmgayJqrIvuQ== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 10/28] mm/damon/sysfs: implement probe dir Date: Sat, 16 May 2026 11:36:51 -0700 Message-ID: <20260516183712.81393-11-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement sysfs directory for letting users install each data probe. Signed-off-by: SeongJae Park --- mm/damon/sysfs.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 5f3b253f50ebf..162d2d55be08e 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -747,12 +747,43 @@ static const struct kobj_type damon_sysfs_intervals_k= type =3D { .default_groups =3D damon_sysfs_intervals_groups, }; =20 +/* + * probe directory + */ + +struct damon_sysfs_probe { + struct kobject kobj; +}; + +static struct damon_sysfs_probe *damon_sysfs_probe_alloc(void) +{ + return kzalloc_obj(struct damon_sysfs_probe); +} + +static void damon_sysfs_probe_release(struct kobject *kobj) +{ + kfree(container_of(kobj, struct damon_sysfs_probe, kobj)); +} + +static struct attribute *damon_sysfs_probe_attrs[] =3D { + NULL, +}; +ATTRIBUTE_GROUPS(damon_sysfs_probe); + +static const struct kobj_type damon_sysfs_probe_ktype =3D { + .release =3D damon_sysfs_probe_release, + .sysfs_ops =3D &kobj_sysfs_ops, + .default_groups =3D damon_sysfs_probe_groups, +}; + /* * probes directory */ =20 struct damon_sysfs_probes { struct kobject kobj; + struct damon_sysfs_probe **probes_arr; + int nr; }; =20 static struct damon_sysfs_probes *damon_sysfs_probes_alloc(void) @@ -760,12 +791,99 @@ static struct damon_sysfs_probes *damon_sysfs_probes_= alloc(void) return kzalloc_obj(struct damon_sysfs_probes); } =20 +static void damon_sysfs_probes_rm_dirs( + struct damon_sysfs_probes *probes) +{ + struct damon_sysfs_probe **probes_arr =3D probes->probes_arr; + int i; + + for (i =3D 0; i < probes->nr; i++) + kobject_put(&probes_arr[i]->kobj); + probes->nr =3D 0; + kfree(probes_arr); + probes->probes_arr =3D NULL; +} + +static int damon_sysfs_probes_add_dirs( + struct damon_sysfs_probes *probes, int nr_probes) +{ + struct damon_sysfs_probe **probes_arr, *probe; + int err, i; + + damon_sysfs_probes_rm_dirs(probes); + if (!nr_probes) + return 0; + + probes_arr =3D kmalloc_objs(*probes_arr, nr_probes, + GFP_KERNEL | __GFP_NOWARN); + if (!probes_arr) + return -ENOMEM; + probes->probes_arr =3D probes_arr; + + for (i =3D 0; i < nr_probes; i++) { + probe =3D damon_sysfs_probe_alloc(); + if (!probe) { + damon_sysfs_probes_rm_dirs(probes); + return -ENOMEM; + } + + err =3D kobject_init_and_add(&probe->kobj, + &damon_sysfs_probe_ktype, &probes->kobj, + "%d", i); + if (err) { + kobject_put(&probe->kobj); + damon_sysfs_probes_rm_dirs(probes); + return err; + } + + probes_arr[i] =3D probe; + probes->nr++; + } + return 0; +} + +static ssize_t nr_probes_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_probes *probes =3D container_of(kobj, + struct damon_sysfs_probes, kobj); + + return sysfs_emit(buf, "%d\n", probes->nr); +} + +static ssize_t nr_probes_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_probes *probes; + int nr, err =3D kstrtoint(buf, 0, &nr); + + if (err) + return err; + if (nr < 0 || nr > DAMON_MAX_PROBES) + return -EINVAL; + + probes =3D container_of(kobj, struct damon_sysfs_probes, kobj); + + if (!mutex_trylock(&damon_sysfs_lock)) + return -EBUSY; + err =3D damon_sysfs_probes_add_dirs(probes, nr); + mutex_unlock(&damon_sysfs_lock); + if (err) + return err; + + return count; +} + static void damon_sysfs_probes_release(struct kobject *kobj) { kfree(container_of(kobj, struct damon_sysfs_probes, kobj)); } =20 +static struct kobj_attribute damon_sysfs_probes_nr_probes =3D + __ATTR_RW_MODE(nr_probes, 0600); + static struct attribute *damon_sysfs_probes_attrs[] =3D { + &damon_sysfs_probes_nr_probes.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_probes); @@ -862,6 +980,7 @@ static void damon_sysfs_attrs_rm_dirs(struct damon_sysf= s_attrs *attrs) kobject_put(&attrs->nr_regions_range->kobj); damon_sysfs_intervals_rm_dirs(attrs->intervals); kobject_put(&attrs->intervals->kobj); + damon_sysfs_probes_rm_dirs(attrs->probes); kobject_put(&attrs->probes->kobj); } =20 --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 8A08D33F5B4; Sat, 16 May 2026 18:37:28 +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=1778956648; cv=none; b=horwmHWZ3VjKewEoCOo2Uk4k4/OTHy3mFYU2UbWla1uAt6XLpyERjdmnt50bntMv0Ka7x/lOz7UJtqbXpqqbpb/aZ/bfJOzc2jzY+r+FKx8ljbWAbbSfnWwnWV0S12irdOseiBItVSlJD9XsK3OoPhAWw9YR1z4xIXPmyfZmtHM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956648; c=relaxed/simple; bh=OD0wZNpcC+Au5uSOMmYUQ5fPYaQIj7kX/hZbz/+GPQI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o8h58PQp+s6CpjV8nCKhBNB6L90PzPxifm/4WSbMBzf80NR2VJv5rELe52VET6tEyEUz1NPSzjGpZLf/t7rLNb9xQ6dSO1j55hL0VYZoIcZ1ITKXrgnWV1dsqx9oi2rBiqoOEvlrAz4yMOnMjL0x9C4gr1LzkgFy2j0oaupuzg0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YN8D4JCL; 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="YN8D4JCL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2391EC2BCB8; Sat, 16 May 2026 18:37:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956648; bh=OD0wZNpcC+Au5uSOMmYUQ5fPYaQIj7kX/hZbz/+GPQI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YN8D4JCLL+HrxEMBxVZFpgIiDelUdXI8eLib16Et2mzONInWwqZ+q984uO3TThopY TfIUXhYEyeUADwzARLTb7jgaaw/AJnGzBycrAHpVjHqSAscVqFYb0Q73/7LsRcD7vf trYd3BUSXdmUUF7N5nlM2CUyRP58lYTFivQ6o222ytUqyVpORNTMcq55SRtG+Jk9mH 8o8qniqKBdFE4avz+qYodiYmFtqHMaWbcEFsilYeTUOHdKCDXDzqrRpTEwHk5wR1Ag xbegDnyf5iltMACaUMI0suK/15F65RBvC2yoAKcR0i62fBNIXre3lOxQRnnDigLyhQ a5bUJ1ZbjtgTw== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 11/28] mm/damon/sysfs: implement filters directory Date: Sat, 16 May 2026 11:36:52 -0700 Message-ID: <20260516183712.81393-12-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement a directory for letting users to install data probe filters. Signed-off-by: SeongJae Park --- mm/damon/sysfs.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 162d2d55be08e..184613538d3aa 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -747,12 +747,42 @@ static const struct kobj_type damon_sysfs_intervals_k= type =3D { .default_groups =3D damon_sysfs_intervals_groups, }; =20 +/* + * filters directory + */ + +struct damon_sysfs_filters { + struct kobject kobj; +}; + +static struct damon_sysfs_filters *damon_sysfs_filters_alloc(void) +{ + return kzalloc_obj(struct damon_sysfs_filters); +} + +static void damon_sysfs_filters_release(struct kobject *kobj) +{ + kfree(container_of(kobj, struct damon_sysfs_filters, kobj)); +} + +static struct attribute *damon_sysfs_filters_attrs[] =3D { + NULL, +}; +ATTRIBUTE_GROUPS(damon_sysfs_filters); + +static const struct kobj_type damon_sysfs_filters_ktype =3D { + .release =3D damon_sysfs_filters_release, + .sysfs_ops =3D &kobj_sysfs_ops, + .default_groups =3D damon_sysfs_filters_groups, +}; + /* * probe directory */ =20 struct damon_sysfs_probe { struct kobject kobj; + struct damon_sysfs_filters *filters; }; =20 static struct damon_sysfs_probe *damon_sysfs_probe_alloc(void) @@ -760,6 +790,30 @@ static struct damon_sysfs_probe *damon_sysfs_probe_all= oc(void) return kzalloc_obj(struct damon_sysfs_probe); } =20 +static int damon_sysfs_probe_add_dirs(struct damon_sysfs_probe *attr) +{ + struct damon_sysfs_filters *filters; + int err; + + filters =3D damon_sysfs_filters_alloc(); + if (!filters) + return -ENOMEM; + attr->filters =3D filters; + + err =3D kobject_init_and_add(&filters->kobj, &damon_sysfs_filters_ktype, + &attr->kobj, "filters"); + if (err) { + kobject_put(&filters->kobj); + attr->filters =3D NULL; + } + return err; +} + +static void damon_sysfs_probe_rm_dirs(struct damon_sysfs_probe *attr) +{ + kobject_put(&attr->filters->kobj); +} + static void damon_sysfs_probe_release(struct kobject *kobj) { kfree(container_of(kobj, struct damon_sysfs_probe, kobj)); @@ -797,8 +851,10 @@ static void damon_sysfs_probes_rm_dirs( struct damon_sysfs_probe **probes_arr =3D probes->probes_arr; int i; =20 - for (i =3D 0; i < probes->nr; i++) + for (i =3D 0; i < probes->nr; i++) { + damon_sysfs_probe_rm_dirs(probes_arr[i]); kobject_put(&probes_arr[i]->kobj); + } probes->nr =3D 0; kfree(probes_arr); probes->probes_arr =3D NULL; @@ -836,6 +892,13 @@ static int damon_sysfs_probes_add_dirs( return err; } =20 + err =3D damon_sysfs_probe_add_dirs(probe); + if (err) { + kobject_put(&probe->kobj); + damon_sysfs_probes_rm_dirs(probes); + return err; + } + probes_arr[i] =3D probe; probes->nr++; } --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 C774B345751; Sat, 16 May 2026 18:37:28 +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=1778956648; cv=none; b=vAL6wk5L1XydrMp2uWROng8D4CkXBUee0+vUmdkpcQ8mtUvXDWHF82j10dYNkK++liuNNUuRm6dW2F1l8EPeMdOV5Wgrm2o6BmsPM9PVln6r6e4Cw3sM60xJFq2NVBzOFhNSiRNouNmSovekYQM2iJkDNjBCZYdH6bEXz2CiQlE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956648; c=relaxed/simple; bh=d12Khk8CFgdjTez4KpM1F3gx2KwZfImRH/clGa73SBg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N+ecnaaTVtEtovokCldpn8WXS1Ke62XUB87ehiXqZtQXN195IeAnPQm0ZlE0n5vYVm98MIzsgzR0dxne38qYzNtyp2OTO2NqMODnIcJeFrR3hCV8HMWfsjDDNvydlvndn2JOf/FI/Nz4iffgZaQvga2RIQOd+EeRBcNGNbIn6uE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ESnahhOh; 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="ESnahhOh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7BEA0C2BCF7; Sat, 16 May 2026 18:37:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956648; bh=d12Khk8CFgdjTez4KpM1F3gx2KwZfImRH/clGa73SBg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ESnahhOhVlyYRjHuop8ixzl/I2K8aJTIFfHw/0rmy3gV3IoIvAuVCh16iEt19W0bK nBzwZEHfUkGaylVosKJVZYIeBTdwavxdq8LrosxcEj3DFvi0QqvYhBLxWwMFj5SeYU 399t4snUJ9ShbFlLwG+jqfjZHCkBI9s1b1Agl32Q1ReDClYp9pSNr4pYY4L9fyZ75M GfnJYKYhSJty5fHoRv/w2H1AwYultRCBMPyepqCUudQ/tWTqMP9TrsB6f/apNDyS05 ZeiB0UhfQSFo5g/RW5ocSIxLRcQu/Aa3G0nNcRHQoaKEy4Ros02jYYt0BjL9ZsjmMU THcmrm/FqM83g== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 12/28] mm/damon/sysfs: implement filter dir Date: Sat, 16 May 2026 11:36:53 -0700 Message-ID: <20260516183712.81393-13-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement a sysfs directory for letting the users to configure each data probe filter. Signed-off-by: SeongJae Park --- mm/damon/sysfs.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 1 deletion(-) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 184613538d3aa..18c669ce6f81f 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -747,12 +747,46 @@ static const struct kobj_type damon_sysfs_intervals_k= type =3D { .default_groups =3D damon_sysfs_intervals_groups, }; =20 +/* + * filter directory + */ + +struct damon_sysfs_filter { + struct kobject kobj; +}; + +static struct damon_sysfs_filter *damon_sysfs_filter_alloc(void) +{ + return kzalloc_obj(struct damon_sysfs_filter); +} + +static void damon_sysfs_filter_release(struct kobject *kobj) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + + kfree(filter); +} + +static struct attribute *damon_sysfs_filter_attrs[] =3D { + NULL, +}; +ATTRIBUTE_GROUPS(damon_sysfs_filter); + +static const struct kobj_type damon_sysfs_filter_ktype =3D { + .release =3D damon_sysfs_filter_release, + .sysfs_ops =3D &kobj_sysfs_ops, + .default_groups =3D damon_sysfs_filter_groups, +}; + /* * filters directory */ =20 struct damon_sysfs_filters { struct kobject kobj; + struct damon_sysfs_filter **filters_arr; + int nr; }; =20 static struct damon_sysfs_filters *damon_sysfs_filters_alloc(void) @@ -760,12 +794,98 @@ static struct damon_sysfs_filters *damon_sysfs_filter= s_alloc(void) return kzalloc_obj(struct damon_sysfs_filters); } =20 +static void damon_sysfs_filters_rm_dirs(struct damon_sysfs_filters *filter= s) +{ + struct damon_sysfs_filter **filters_arr =3D filters->filters_arr; + int i; + + for (i =3D 0; i < filters->nr; i++) + kobject_put(&filters_arr[i]->kobj); + filters->nr =3D 0; + kfree(filters_arr); + filters->filters_arr =3D NULL; +} + +static int damon_sysfs_filters_add_dirs( + struct damon_sysfs_filters *filters, int nr_filters) +{ + struct damon_sysfs_filter **filters_arr, *filter; + int err, i; + + damon_sysfs_filters_rm_dirs(filters); + if (!nr_filters) + return 0; + + filters_arr =3D kmalloc_objs(*filters_arr, nr_filters, + GFP_KERNEL | __GFP_NOWARN); + if (!filters_arr) + return -ENOMEM; + filters->filters_arr =3D filters_arr; + + for (i =3D 0; i < nr_filters; i++) { + filter =3D damon_sysfs_filter_alloc(); + if (!filter) { + damon_sysfs_filters_rm_dirs(filters); + return -ENOMEM; + } + + err =3D kobject_init_and_add(&filter->kobj, + &damon_sysfs_filter_ktype, &filters->kobj, + "%d", i); + if (err) { + kobject_put(&filter->kobj); + damon_sysfs_filters_rm_dirs(filters); + return err; + } + + filters_arr[i] =3D filter; + filters->nr++; + } + return 0; +} + +static ssize_t nr_filters_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_filters *filters =3D container_of(kobj, + struct damon_sysfs_filters, kobj); + + return sysfs_emit(buf, "%d\n", filters->nr); +} + +static ssize_t nr_filters_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_filters *filters; + int nr, err =3D kstrtoint(buf, 0, &nr); + + if (err) + return err; + if (nr < 0) + return -EINVAL; + + filters =3D container_of(kobj, struct damon_sysfs_filters, kobj); + + if (!mutex_trylock(&damon_sysfs_lock)) + return -EBUSY; + err =3D damon_sysfs_filters_add_dirs(filters, nr); + mutex_unlock(&damon_sysfs_lock); + if (err) + return err; + + return count; +} + static void damon_sysfs_filters_release(struct kobject *kobj) { kfree(container_of(kobj, struct damon_sysfs_filters, kobj)); } =20 +static struct kobj_attribute damon_sysfs_filters_nr_attr =3D + __ATTR_RW_MODE(nr_filters, 0600); + static struct attribute *damon_sysfs_filters_attrs[] =3D { + &damon_sysfs_filters_nr_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_filters); @@ -811,7 +931,10 @@ static int damon_sysfs_probe_add_dirs(struct damon_sys= fs_probe *attr) =20 static void damon_sysfs_probe_rm_dirs(struct damon_sysfs_probe *attr) { - kobject_put(&attr->filters->kobj); + if (attr->filters) { + damon_sysfs_filters_rm_dirs(attr->filters); + kobject_put(&attr->filters->kobj); + } } =20 static void damon_sysfs_probe_release(struct kobject *kobj) --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 36D713469F5; Sat, 16 May 2026 18:37:29 +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=1778956649; cv=none; b=Sqtp1whoTl6x1QTiZ3jRPgIgDyTFTdad/OpbPO0fd8mJcHY6xO7Cwiq3IutArDxkLY5zQzg5Qx1D+mmdsZ270ELfOSyPX4R3XcFDSyykMdZPFESZ5ZVihkeFhqlFHMSsnvuCidmBcQcfgue7+CFhokwVG9U9G7p7xJbgEjQ5GFY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956649; c=relaxed/simple; bh=AEUZoeUvUNqOaA5YHBasjSzwVa8wJwIKAzC/F+JHBy0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u4vbnzB7I5Fo614XE2xE3jAW9jssv2r88LQcAiJbXYpD7g2pcZOTwKzyjQpIeNuliDuUr43rFJrswlP6UUCjCCAEPD8zkEk16Colh2YMMBXojym0gkjYc5jb9/dctWciqiF9wzwO0gdPh+CuwyKHBNYO9D6vC1h4jajCXnsqTeg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZcZGFwAW; 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="ZcZGFwAW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D511EC2BCC7; Sat, 16 May 2026 18:37:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956649; bh=AEUZoeUvUNqOaA5YHBasjSzwVa8wJwIKAzC/F+JHBy0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZcZGFwAWHksQbXFOC2ZF2/ShDMrkfd/9uWhwrnJA8lykQ8lRSM5ydlTysZ5oFdo4V rfDdaBpwZbgWGq5YPOAMR3Nmz78o78CvXRnkGIjqT4LEOF+InPP4nBlH7FMQ3h1rvp RkWaR63ZGk0ODY1Ah2PTmZ/skoI2Hw8YbTF/zqZ+VpxqRRVOt/Q0PFWJYuWuIrjDlu WcpmQnWtOu4MLKvaAFyHcUST7ZDLWYA0l0lqkRsK66o4xab4VjLZr+FmWFRn7nj4uL Cp7fS7z4kWJiCb7j59xMpmvxtN+oLo4RqCqiVMZ67NcOZxNHEQnmGjwR1olN37rASd c4ilaOt+hLjAA== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 13/28] mm/damon/sysfs: implement filter dir files Date: Sat, 16 May 2026 11:36:54 -0700 Message-ID: <20260516183712.81393-14-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement sysfs files under the data probe filter directory for letting users to configure each filter. Signed-off-by: SeongJae Park --- mm/damon/sysfs.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 18c669ce6f81f..35a4fa5c530f5 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -753,6 +753,9 @@ static const struct kobj_type damon_sysfs_intervals_kty= pe =3D { =20 struct damon_sysfs_filter { struct kobject kobj; + enum damon_filter_type type; + bool matching; + bool allow; }; =20 static struct damon_sysfs_filter *damon_sysfs_filter_alloc(void) @@ -760,6 +763,105 @@ static struct damon_sysfs_filter *damon_sysfs_filter_= alloc(void) return kzalloc_obj(struct damon_sysfs_filter); } =20 +struct damon_sysfs_filter_type_name { + enum damon_filter_type type; + char *name; +}; + +static const struct damon_sysfs_filter_type_name +damon_sysfs_filter_type_names[] =3D { + { + .type =3D DAMON_FILTER_TYPE_ANON, + .name =3D "anon", + }, +}; + +static ssize_t type_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + int i; + + for (i =3D 0; i < ARRAY_SIZE(damon_sysfs_filter_type_names); i++) { + const struct damon_sysfs_filter_type_name *type_name; + + type_name =3D &damon_sysfs_filter_type_names[i]; + if (type_name->type =3D=3D filter->type) + return sysfs_emit(buf, "%s\n", type_name->name); + } + return -EINVAL; +} + +static ssize_t type_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + ssize_t ret =3D -EINVAL; + int i; + + for (i =3D 0; i < ARRAY_SIZE(damon_sysfs_filter_type_names); i++) { + const struct damon_sysfs_filter_type_name *type_name; + + type_name =3D &damon_sysfs_filter_type_names[i]; + if (sysfs_streq(buf, type_name->name)) { + filter->type =3D type_name->type; + ret =3D count; + break; + } + } + return ret; +} + +static ssize_t matching_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + + return sysfs_emit(buf, "%c\n", filter->matching ? 'Y' : 'N'); +} + +static ssize_t matching_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + bool matching; + int err =3D kstrtobool(buf, &matching); + + if (err) + return err; + + filter->matching =3D matching; + return count; +} + +static ssize_t allow_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + + return sysfs_emit(buf, "%c\n", filter->allow ? 'Y' : 'N'); +} + +static ssize_t allow_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + bool allow; + int err =3D kstrtobool(buf, &allow); + + if (err) + return err; + + filter->allow =3D allow; + return count; +} + static void damon_sysfs_filter_release(struct kobject *kobj) { struct damon_sysfs_filter *filter =3D container_of(kobj, @@ -768,7 +870,19 @@ static void damon_sysfs_filter_release(struct kobject = *kobj) kfree(filter); } =20 +static struct kobj_attribute damon_sysfs_filter_type_attr =3D + __ATTR_RW_MODE(type, 0600); + +static struct kobj_attribute damon_sysfs_filter_matching_attr =3D + __ATTR_RW_MODE(matching, 0600); + +static struct kobj_attribute damon_sysfs_filter_allow_attr =3D + __ATTR_RW_MODE(allow, 0600); + static struct attribute *damon_sysfs_filter_attrs[] =3D { + &damon_sysfs_filter_type_attr.attr, + &damon_sysfs_filter_matching_attr.attr, + &damon_sysfs_filter_allow_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_filter); --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 8567233F8C3; Sat, 16 May 2026 18:37:29 +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=1778956649; cv=none; b=VQCFuNs4v5dVXUz1MKUskjNdkj7g7dUsotdCAGvCzC8M1R7As0sCOzepKgaxFkd2ngfI3LYu6Ldlgo5rCrVcFy6cSIApC9cnmLcAz12u7Bx5+8uqRWepXJHxK59s+fdy7V9gqxokLKudxjXeHdSmAhWoQA9eWN84xEnNAzsTxJk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956649; c=relaxed/simple; bh=YQ/bQKvFB6FRBUR2JrGvHQEa09kCyYCD7LjEDEyXhiU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nKzZgcm5jtW4rBVNwGl/6TwZCnqKx8lRRrnfZ/0fwYaQ9qFbIxZgFmN/anxmx+gMgEy7YNJrTns1pg8HSImTqq0ZH82yr+3WUAcXSiI3qjNBo3oIUiPuf3OsZPYr56w6LkYFJLl67vHPVSTI7NlFH1J+kinLDUIndjKOnpPL3fE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TOKV989N; 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="TOKV989N" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3707AC19425; Sat, 16 May 2026 18:37:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956649; bh=YQ/bQKvFB6FRBUR2JrGvHQEa09kCyYCD7LjEDEyXhiU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TOKV989ND2cKNdGxP5PDsmVUlhDxYOfvNwWeKyweVV/m1LOK2+iouQjtCeLZcTL9u ckuzNLAI+z6eKtXX1s6ATxZwKdlzfq0zOs5whRXO7SHV1q9+aNHd5U5Xeny3VLLYLt 1Y+QpEATiGsLtsCp1aSnFTRvP7qRrhnI260X+/s6MlMuZP4s+NFRkWGpO0chmYfWN3 FSCONfhKCZh+OLLo+EczCkZODe+PESe+HJS/QIdMj5E8UVUiNU3eADWgALGR8bpHKH d2QeoUMjkVFe1gVy9ti1oI9p1xwZXWhylxFGMXGfa/Ue8+D4A1nYjjT0A/3SqtVTpH KWNN7xmbPbBWA== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 14/28] mm/damon/sysfs: setup probes on DAMON core API parameters Date: Sat, 16 May 2026 11:36:55 -0700 Message-ID: <20260516183712.81393-15-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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 user-installed data probes to DAMON core API parameters, so that user inputs for data probes are passed to DAMON core. Signed-off-by: SeongJae Park --- mm/damon/sysfs.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 35a4fa5c530f5..f1b7d79386866 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -1825,6 +1825,40 @@ static int damon_sysfs_set_attrs(struct damon_ctx *c= tx, return damon_set_attrs(ctx, &attrs); } =20 +static int damon_sysfs_set_probes(struct damon_ctx *ctx, + struct damon_sysfs_probes *sys_probes) +{ + int i; + + for (i =3D 0; i < sys_probes->nr; i++) { + struct damon_sysfs_filters *sys_filters =3D + sys_probes->probes_arr[i]->filters; + struct damon_probe *c; + int j; + + if (!sys_filters) + continue; + c =3D damon_new_probe(); + if (!c) + return -ENOMEM; + damon_add_probe(ctx, c); + + for (j =3D 0; j < sys_filters->nr; j++) { + struct damon_sysfs_filter *sys_filter =3D + sys_filters->filters_arr[j]; + struct damon_filter *filter; + + filter =3D damon_new_filter(sys_filter->type, + sys_filter->matching, + sys_filter->allow); + if (!filter) + return -ENOMEM; + damon_add_filter(c, filter); + } + } + return 0; +} + static int damon_sysfs_set_regions(struct damon_target *t, struct damon_sysfs_regions *sysfs_regions, unsigned long min_region_sz) @@ -1936,6 +1970,9 @@ static int damon_sysfs_apply_inputs(struct damon_ctx = *ctx, ctx->min_region_sz =3D max( DAMON_MIN_REGION_SZ / sys_ctx->addr_unit, 1); err =3D damon_sysfs_set_attrs(ctx, sys_ctx->attrs); + if (err) + return err; + err =3D damon_sysfs_set_probes(ctx, sys_ctx->attrs->probes); if (err) return err; err =3D damon_sysfs_add_targets(ctx, sys_ctx->targets); --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 E5701348463; Sat, 16 May 2026 18:37:29 +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=1778956650; cv=none; b=uhIlcy2ePPabs6+eG5hfgh2PWJz2CupfhgvWMIIBCYCD4MdyUlniQAqh9EoXDl30zW7n0PvzSymygJjPdlUOHjzEzggI4knHHXQOf9jlnRrVbIt/vqQON9sTTFlVVXlIErqowTBCiIA4vBSXmkGYf8+pBYEw7gxozoo71KaWYco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956650; c=relaxed/simple; bh=uBWhjIohq11XfMogSOrNzs3xASVaFicaEYRMR65bdGg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SkY3wDkbed9/3xiDK+dOsYsPEo8Axw/ub62DRo5iOnMVwbsgl5l0KFLTdBG1EbmU82DsbPzHv6qiBVZs1DnpxChJyYCsqIvWtaqLZArX8ynH6KzWJ0x4PL0FvINk5PYag/TwuY7pRdOny2lYcswLtySyVBIl42LCLiA2Vtahclg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qc6CQKYd; 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="qc6CQKYd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8E8D1C2BD04; Sat, 16 May 2026 18:37:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956649; bh=uBWhjIohq11XfMogSOrNzs3xASVaFicaEYRMR65bdGg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qc6CQKYdFQbvC3v2l7Z69OzjNq2n3nvs/9lwdPFXtPNbXoPox1kL1R67loOoA3lEN aGICXkkdk/4hk9QmC6u7J3/Y4ckHNR6Yj/X411FGYphmw9oObyNJsji2YAzKV+u86g wa+K/GfKwlZrI4SzdF1PDxMxY38uJbEBJHE2gkW5bAxyMAai43hmqXgEVKTCx4bmxE EWkY83RopMO+aqT7qSLyWw626UunmvGaAetHm2Nlzxn/OaYHcbcVtSR8q6cNgDy0xX mVkxG+LguCUZLb6b+R377HwluHwHRgviUFCvTnVU4FViCWlWMnAzeizDmpVrEcXu1O 6N2X0fmLhp62A== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 15/28] mm/damon/sysfs-schemes: implement tried_regions//probes/ Date: Sat, 16 May 2026 11:36:56 -0700 Message-ID: <20260516183712.81393-16-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement a sysfs directory for showing the per-region probe hit counts. It is named 'probes/' and located under the DAMOS tried region directory. Signed-off-by: SeongJae Park --- mm/damon/sysfs-schemes.c | 70 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index 245d63808411a..8998df5bdc5c8 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -10,6 +10,32 @@ =20 #include "sysfs-common.h" =20 +/* + * probes directory + */ + +struct damos_sysfs_probes { + struct kobject kobj; +}; + +static struct damos_sysfs_probes *damos_sysfs_probes_alloc(void) +{ + return kzalloc_obj(struct damos_sysfs_probes); +} + +static void damos_sysfs_probes_release(struct kobject *kobj) +{ + struct damos_sysfs_probes *probes =3D container_of(kobj, + struct damos_sysfs_probes, kobj); + + kfree(probes); +} + +static const struct kobj_type damos_sysfs_probes_ktype =3D { + .release =3D damos_sysfs_probes_release, + .sysfs_ops =3D &kobj_sysfs_ops, +}; + /* * scheme region directory */ @@ -20,6 +46,7 @@ struct damon_sysfs_scheme_region { unsigned int nr_accesses; unsigned int age; unsigned long sz_filter_passed; + struct damos_sysfs_probes *probes; struct list_head list; }; =20 @@ -34,10 +61,36 @@ static struct damon_sysfs_scheme_region *damon_sysfs_sc= heme_region_alloc( sysfs_region->ar =3D region->ar; sysfs_region->nr_accesses =3D region->nr_accesses_bp / 10000; sysfs_region->age =3D region->age; + sysfs_region->probes =3D NULL; INIT_LIST_HEAD(&sysfs_region->list); return sysfs_region; } =20 +static int damos_sysfs_region_add_dirs( + struct damon_sysfs_scheme_region *region) +{ + struct damos_sysfs_probes *probes =3D damos_sysfs_probes_alloc(); + int err; + + if (!probes) + return -ENOMEM; + err =3D kobject_init_and_add(&probes->kobj, &damos_sysfs_probes_ktype, + ®ion->kobj, "probes"); + if (err) { + kobject_put(&probes->kobj); + return err; + } + + region->probes =3D probes; + return 0; +} + +static void damos_sysfs_region_rm_dirs( + struct damon_sysfs_scheme_region *region) +{ + kobject_put(®ion->probes->kobj); +} + static ssize_t start_show(struct kobject *kobj, struct kobj_attribute *att= r, char *buf) { @@ -165,6 +218,7 @@ static void damon_sysfs_scheme_regions_rm_dirs( =20 list_for_each_entry_safe(r, next, ®ions->regions_list, list) { /* release function deletes it from the list */ + damos_sysfs_region_rm_dirs(r); kobject_put(&r->kobj); regions->nr_regions--; } @@ -2927,14 +2981,20 @@ void damos_sysfs_populate_region_dir(struct damon_s= ysfs_schemes *sysfs_schemes, if (!region) return; region->sz_filter_passed =3D sz_filter_passed; - list_add_tail(®ion->list, &sysfs_regions->regions_list); - sysfs_regions->nr_regions++; if (kobject_init_and_add(®ion->kobj, &damon_sysfs_scheme_region_ktype, &sysfs_regions->kobj, "%d", - sysfs_regions->nr_regions++)) { - kobject_put(®ion->kobj); - } + sysfs_regions->nr_regions++)) + goto out; + if (damos_sysfs_region_add_dirs(region)) + goto out; + + list_add_tail(®ion->list, &sysfs_regions->regions_list); + sysfs_regions->nr_regions++; + return; + +out: + kobject_put(®ion->kobj); } =20 int damon_sysfs_schemes_clear_regions( --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 A71FF35DA46; Sat, 16 May 2026 18:37:30 +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=1778956652; cv=none; b=T9T9SVyozooOTSEBsH48lHn+7MEBbLzrMXC7MDSWXlBr/tyWHQS2CdQy6KHcTGamVNZka8qnvQz+2C7MwatoCIiek9C3yP27Nos9MmF+L+Pac6jaPm0Ne6+umlGDsSf4YQCazzU7VUfQzIpAecK3fYy1+kymQ3YxypILZrFAE7g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956652; c=relaxed/simple; bh=Q1zGK+j0zRxUsiCpVVG1d65SmG54MWL9Bnun2Pc3YCE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=olmsRtg9QT1CmzojHY6x2JGyG/CwaHYkpDkvOorYPzIFwiXdk9C3APRD4I2EPW9/ZElg9/g49UXV44qYWZBGgU3XjojYnH8RGuemV8zk0fuLr702qyvggC6IdzsN3DSAKyQ+x0B+VSi8AvsxJ0VUscRPcrWzngIgEAeWQLqi6cU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dgk4pAO0; 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="dgk4pAO0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E24A1C2BCC9; Sat, 16 May 2026 18:37:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956650; bh=Q1zGK+j0zRxUsiCpVVG1d65SmG54MWL9Bnun2Pc3YCE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dgk4pAO0Tio/zVHiiJjeEDVPmohekNsu4jCaZFUkcKxwAiGeUCS1LpoSmZ4K20a6A vpmNETg0uEdXEsXiYlnkL+rrO6MuwEEZEG4jxUJgynoP1fuPD4ECVSuLHD47nKUg/i 4r7I8zlWfuN+xrAOVIFRsQcAVIabQ+5JNmdR8lNdtbj9nmj9dyy9o4hnPMa1T0Z7wP p9BAHwg8XMp2Q+P76ecbC8o6P4ozTkETV3F8vOF8PeWPCJaqCROYFU2Hkz+sRP8jQ+ sFEE8JOlEp7M2bVfgGzRI2KV9wHL/Q4mVsmINqp9bD+8ztFv+SnoLd9vpHnXUmhdPb jhkec0cKpP9yw== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 16/28] mm/damon/sysfs-schemes: implement probe dir Date: Sat, 16 May 2026 11:36:57 -0700 Message-ID: <20260516183712.81393-17-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement sysfs directory for showing per-probe hits count of each region. Signed-off-by: SeongJae Park --- mm/damon/sysfs-schemes.c | 101 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 6 deletions(-) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index 8998df5bdc5c8..c8123c62bbd48 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -10,12 +10,40 @@ =20 #include "sysfs-common.h" =20 +/* + * probe directory + */ + +struct damos_sysfs_probe { + struct kobject kobj; +}; + +static struct damos_sysfs_probe *damos_sysfs_probe_alloc(void) +{ + return kzalloc_obj(struct damos_sysfs_probe); +} + +static void damos_sysfs_probe_release(struct kobject *kobj) +{ + struct damos_sysfs_probe *probe =3D container_of(kobj, + struct damos_sysfs_probe, kobj); + + kfree(probe); +} + +static const struct kobj_type damos_sysfs_probe_ktype =3D { + .release =3D damos_sysfs_probe_release, + .sysfs_ops =3D &kobj_sysfs_ops, +}; + /* * probes directory */ =20 struct damos_sysfs_probes { struct kobject kobj; + struct damos_sysfs_probe **probes_arr; + int nr; }; =20 static struct damos_sysfs_probes *damos_sysfs_probes_alloc(void) @@ -23,6 +51,60 @@ static struct damos_sysfs_probes *damos_sysfs_probes_all= oc(void) return kzalloc_obj(struct damos_sysfs_probes); } =20 +static void damos_sysfs_probes_rm_dirs(struct damos_sysfs_probes *probes) +{ + struct damos_sysfs_probe **probes_arr =3D probes->probes_arr; + int i; + + for (i =3D 0; i < probes->nr; i++) + kobject_put(&probes_arr[i]->kobj); + probes->nr =3D 0; + kfree(probes_arr); + probes->probes_arr =3D NULL; +} + +static int damos_sysfs_probes_add_dirs(struct damos_sysfs_probes *probes, + struct damon_ctx *ctx) +{ + struct damon_probe *probe; + struct damos_sysfs_probe **probes_arr; + int i =3D 0; + + damon_for_each_probe(probe, ctx) + i++; + + if (!i) + return 0; + + probes_arr =3D kmalloc_objs(*probes_arr, i); + if (!probes_arr) + return -ENOMEM; + probes->probes_arr =3D probes_arr; + + i =3D 0; + damon_for_each_probe(probe, ctx) { + struct damos_sysfs_probe *sys_probe; + int err; + + sys_probe =3D damos_sysfs_probe_alloc(); + if (!sys_probe) { + damos_sysfs_probes_rm_dirs(probes); + return -ENOMEM; + } + err =3D kobject_init_and_add(&sys_probe->kobj, + &damos_sysfs_probe_ktype, &probes->kobj, "%d", + i); + if (err) { + kobject_put(&sys_probe->kobj); + damos_sysfs_probes_rm_dirs(probes); + return err; + } + probes_arr[i++] =3D sys_probe; + probes->nr++; + } + return 0; +} + static void damos_sysfs_probes_release(struct kobject *kobj) { struct damos_sysfs_probes *probes =3D container_of(kobj, @@ -67,7 +149,8 @@ static struct damon_sysfs_scheme_region *damon_sysfs_sch= eme_region_alloc( } =20 static int damos_sysfs_region_add_dirs( - struct damon_sysfs_scheme_region *region) + struct damon_sysfs_scheme_region *region, + struct damon_ctx *ctx) { struct damos_sysfs_probes *probes =3D damos_sysfs_probes_alloc(); int err; @@ -76,18 +159,24 @@ static int damos_sysfs_region_add_dirs( return -ENOMEM; err =3D kobject_init_and_add(&probes->kobj, &damos_sysfs_probes_ktype, ®ion->kobj, "probes"); - if (err) { - kobject_put(&probes->kobj); - return err; - } + if (err) + goto fail; + err =3D damos_sysfs_probes_add_dirs(probes, ctx); + if (err) + goto fail; =20 region->probes =3D probes; return 0; + +fail: + kobject_put(&probes->kobj); + return err; } =20 static void damos_sysfs_region_rm_dirs( struct damon_sysfs_scheme_region *region) { + damos_sysfs_probes_rm_dirs(region->probes); kobject_put(®ion->probes->kobj); } =20 @@ -2986,7 +3075,7 @@ void damos_sysfs_populate_region_dir(struct damon_sys= fs_schemes *sysfs_schemes, &sysfs_regions->kobj, "%d", sysfs_regions->nr_regions++)) goto out; - if (damos_sysfs_region_add_dirs(region)) + if (damos_sysfs_region_add_dirs(region, ctx)) goto out; =20 list_add_tail(®ion->list, &sysfs_regions->regions_list); --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 9724534D910; Sat, 16 May 2026 18:37:30 +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=1778956651; cv=none; b=ObZ6kFc19euDfnE19hHxndyT0JZrhsafasUznNgx9Ip0OIk5fBIDh1XnFijVzdgRRYDGuec3SvUSQB+VOFmUoWBxFkvsqhXlO+UOt+yQ3bSomPVHdsPS6tDlwPwVsM5GGkhDyiFsSDwXj+9aB2Hgiw9GxSWDi2qkb8u7BtIHlyU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956651; c=relaxed/simple; bh=fhpPTTL5Cgz/6UBMQvvRgY5W5vyidcWD3uwslkT9fjQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lApQ/UjmeuB+ERRNvcbCUd+CKORUZ2rnqXim/YxCV+IZDz5mcVH+ODHZBHa2xZlBGrb/mamCXumHP7JOPWsYYx0zPNl8Ds9aLygk+7lGEjawoKI+pkTTxhe1pEQcYR1MnHLlSMwXcqRUvcWv5NCuUAhyg34b6eYA4FCZ3tptHZY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=G2ZbBgpJ; 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="G2ZbBgpJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 45153C19425; Sat, 16 May 2026 18:37:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956650; bh=fhpPTTL5Cgz/6UBMQvvRgY5W5vyidcWD3uwslkT9fjQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G2ZbBgpJ8olKE27odkZebC5/h5tsS5QOYOeGMs1MGsgSOdsPmqp5BTNCfipUHWyQz KTxrWeymw4RQGBqFZrh7NwY9sGzEg9eHs+nxXWp1R9m731/Mdhrj1nbX3dEIxVoq90 e0eVD11P5OyXxnFo4Vtid8npOdkdMkJGwzSH47mgO5ASmdo4mLzz8oLwql2xDXE3I5 LK8w/uNb740KQR6ByWdHNGePThkrCT1jXYPLUbdZkcUnxX+BDSfndhThoDCuuptKd5 m6CyBWe3wFKr5bdYY5iyIZvmOS3yWGzxTS1SPjfp+/FWOTMzHXQPbNAKtXHE9zUZeY fQ3eNuRvqjMpQ== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 17/28] mm/damon/sysfs-schemes: implement probe/hits file Date: Sat, 16 May 2026 11:36:58 -0700 Message-ID: <20260516183712.81393-18-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement sysfs file for showing the per-region per-probe hits count. Signed-off-by: SeongJae Park --- mm/damon/sysfs-schemes.c | 41 +++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index c8123c62bbd48..d680c785770a9 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -16,11 +16,27 @@ =20 struct damos_sysfs_probe { struct kobject kobj; + unsigned char hits; }; =20 -static struct damos_sysfs_probe *damos_sysfs_probe_alloc(void) +static struct damos_sysfs_probe *damos_sysfs_probe_alloc(unsigned char hit= s) { - return kzalloc_obj(struct damos_sysfs_probe); + struct damos_sysfs_probe *probe; + + probe =3D kzalloc_obj(*probe); + if (!probe) + return NULL; + probe->hits =3D hits; + return probe; +} + +static ssize_t hits_show(struct kobject *kobj, struct kobj_attribute *attr, + char *buf) +{ + struct damos_sysfs_probe *probe =3D container_of(kobj, + struct damos_sysfs_probe, kobj); + + return sysfs_emit(buf, "%hhu\n", probe->hits); } =20 static void damos_sysfs_probe_release(struct kobject *kobj) @@ -31,9 +47,19 @@ static void damos_sysfs_probe_release(struct kobject *ko= bj) kfree(probe); } =20 +static struct kobj_attribute damos_sysfs_probe_hits_attr =3D + __ATTR_RO_MODE(hits, 0400); + +static struct attribute *damos_sysfs_probe_attrs[] =3D { + &damos_sysfs_probe_hits_attr.attr, + NULL, +}; +ATTRIBUTE_GROUPS(damos_sysfs_probe); + static const struct kobj_type damos_sysfs_probe_ktype =3D { .release =3D damos_sysfs_probe_release, .sysfs_ops =3D &kobj_sysfs_ops, + .default_groups =3D damos_sysfs_probe_groups, }; =20 /* @@ -64,7 +90,7 @@ static void damos_sysfs_probes_rm_dirs(struct damos_sysfs= _probes *probes) } =20 static int damos_sysfs_probes_add_dirs(struct damos_sysfs_probes *probes, - struct damon_ctx *ctx) + struct damon_ctx *ctx, struct damon_region *region) { struct damon_probe *probe; struct damos_sysfs_probe **probes_arr; @@ -86,7 +112,7 @@ static int damos_sysfs_probes_add_dirs(struct damos_sysf= s_probes *probes, struct damos_sysfs_probe *sys_probe; int err; =20 - sys_probe =3D damos_sysfs_probe_alloc(); + sys_probe =3D damos_sysfs_probe_alloc(region->probe_hits[i]); if (!sys_probe) { damos_sysfs_probes_rm_dirs(probes); return -ENOMEM; @@ -150,7 +176,8 @@ static struct damon_sysfs_scheme_region *damon_sysfs_sc= heme_region_alloc( =20 static int damos_sysfs_region_add_dirs( struct damon_sysfs_scheme_region *region, - struct damon_ctx *ctx) + struct damon_ctx *ctx, + struct damon_region *dregion) { struct damos_sysfs_probes *probes =3D damos_sysfs_probes_alloc(); int err; @@ -161,7 +188,7 @@ static int damos_sysfs_region_add_dirs( ®ion->kobj, "probes"); if (err) goto fail; - err =3D damos_sysfs_probes_add_dirs(probes, ctx); + err =3D damos_sysfs_probes_add_dirs(probes, ctx, dregion); if (err) goto fail; =20 @@ -3075,7 +3102,7 @@ void damos_sysfs_populate_region_dir(struct damon_sys= fs_schemes *sysfs_schemes, &sysfs_regions->kobj, "%d", sysfs_regions->nr_regions++)) goto out; - if (damos_sysfs_region_add_dirs(region, ctx)) + if (damos_sysfs_region_add_dirs(region, ctx, r)) goto out; =20 list_add_tail(®ion->list, &sysfs_regions->regions_list); --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 1F58D357D0E; Sat, 16 May 2026 18:37:31 +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=1778956651; cv=none; b=QSw/NO3AXpB9uWb+2YfuEoDJEEFA3OnBACpqdYiLL9VQQHeZTHThcfQCWqo6kfN1Ic9fS65ZWYukm82uslU7Orpfvg1ddYdRjntJHnjm3/f1QUIl3UjBLGktFjxBfFiw4JYoPj96qknt18DF4JYRCPPYl4oF7Uda3UkzK2EVT0s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956651; c=relaxed/simple; bh=GaKE0tVTWmsw7G9ti4FDBUbar9GRDUtf1uS+1stN7jw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HeMoEH3gLHNL9ePhBDEOWrG0pO2/IcA1k1GL7DPltXvjnVVGbp88T2QDxo11TGq1IjVy4tc2FE4UpAJcVTGEyXae3O5Kuzsbx/VVz2qVej0VjN39OYe9yZbAu4Oe2ni0xKtn+X01WWfu58srhLF84t6oB+oOqGGpYlweNnhgt4g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PX88rBl4; 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="PX88rBl4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A347CC4AF14; Sat, 16 May 2026 18:37:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956651; bh=GaKE0tVTWmsw7G9ti4FDBUbar9GRDUtf1uS+1stN7jw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PX88rBl4TO3L9oH6KxHVLSga1aGTyNIAhmRiRaTDvkPNCytugn5vj63WBjhnm685Q uXjdfu/tgLeiXUSXqORKIes1dXrUa2v/y79hmgDuHPBIGr0Yp7aJ0nYr3YAv5YYQOE 5xh6hba4amXl5O5DNiofca+stGsRCoy2/bQ5HkunlLOeEU4gpiDi8gEPYV49TANzcu H1I+UoDYvMDwLiwEg8rJRcKRwHU3MhULZXe411UKBZc/mmMEtdz/7WTjMGhy7Oz/oL VaXFdw3ZA4QfZ20JJskjwwaLhDVXkHCc+HqNobcuaVM0wq81e0trJHPrVdxnFLO9LF nF+epkeDhLDDw== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , Masami Hiramatsu , Mathieu Desnoyers , Steven Rostedt , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-trace-kernel@vger.kernel.org Subject: [RFC PATCH v3 18/28] mm/damon: trace probe_hits Date: Sat, 16 May 2026 11:36:59 -0700 Message-ID: <20260516183712.81393-19-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Introduce a new tracepoint for exposing the per-region per-probe positive sample count via tracefs. Signed-off-by: SeongJae Park --- include/trace/events/damon.h | 38 ++++++++++++++++++++++++++++++++++++ mm/damon/core.c | 9 +++++++++ 2 files changed, 47 insertions(+) diff --git a/include/trace/events/damon.h b/include/trace/events/damon.h index 24fc402ab3c85..2fd914895c405 100644 --- a/include/trace/events/damon.h +++ b/include/trace/events/damon.h @@ -130,6 +130,44 @@ TRACE_EVENT(damon_monitor_intervals_tune, TP_printk("sample_us=3D%lu", __entry->sample_us) ); =20 +TRACE_EVENT_CONDITION(damon_region_aggregated, + + TP_PROTO(unsigned int target_id, struct damon_region *r, + unsigned int nr_regions, unsigned int nr_probes), + + TP_ARGS(target_id, r, nr_regions, nr_probes), + + TP_CONDITION(nr_probes > 0), + + TP_STRUCT__entry( + __field(unsigned long, target_id) + __field(unsigned long, start) + __field(unsigned long, end) + __field(unsigned int, nr_regions) + __field(unsigned int, nr_accesses) + __field(unsigned int, age) + __dynamic_array(unsigned char, probe_hits, nr_probes) + ), + + TP_fast_assign( + __entry->target_id =3D target_id; + __entry->start =3D r->ar.start; + __entry->end =3D r->ar.end; + __entry->nr_regions =3D nr_regions; + __entry->nr_accesses =3D r->nr_accesses; + __entry->age =3D r->age; + memcpy(__get_dynamic_array(probe_hits), r->probe_hits, + sizeof(*r->probe_hits) * nr_probes); + ), + + TP_printk("target_id=3D%lu nr_regions=3D%u %lu-%lu: %u %u probe_hits=3D%s= ", + __entry->target_id, __entry->nr_regions, + __entry->start, __entry->end, + __entry->nr_accesses, __entry->age, + __print_hex(__get_dynamic_array(probe_hits), + __get_dynamic_array_len(probe_hits))) +); + TRACE_EVENT(damon_aggregated, =20 TP_PROTO(unsigned int target_id, struct damon_region *r, diff --git a/mm/damon/core.c b/mm/damon/core.c index dde3c8d8fef89..11b513eb077fe 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1881,6 +1881,13 @@ static void kdamond_reset_aggregated(struct damon_ct= x *c) { struct damon_target *t; unsigned int ti =3D 0; /* target's index */ + unsigned int nr_probes =3D 0; + struct damon_probe *probe; + + if (trace_damon_region_aggregated_enabled()) { + damon_for_each_probe(probe, c) + nr_probes++; + } =20 damon_for_each_target(t, c) { struct damon_region *r; @@ -1889,6 +1896,8 @@ static void kdamond_reset_aggregated(struct damon_ctx= *c) int i; =20 trace_damon_aggregated(ti, r, damon_nr_regions(t)); + trace_damon_region_aggregated(ti, r, + damon_nr_regions(t), nr_probes); damon_warn_fix_nr_accesses_corruption(r); r->last_nr_accesses =3D r->nr_accesses; r->nr_accesses =3D 0; --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 A72C735DA67; Sat, 16 May 2026 18:37:31 +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=1778956652; cv=none; b=qwv/bXaMcR3hybfTgRxjVxL6v4aN2G0RIQvfrDUkhydpykMA+DxbLPO1NOFp2GA10UeA9MvtL+Mub5QhvDpzaot3OIudT1NF96I5fhEOfZurh1+JkBAhlsIoba1WawSCVIs4mpaEya8qqJwpn8iJ4Cgad1bbW4n5zilTxTR5sSw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956652; c=relaxed/simple; bh=EauBIBzKjl6rFCRlEGSo/s6NrgLL9HoVh8TIqUsq9vs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b8qRqtq7DiVFP/LE4cGTZtP7dg8Ahg8ln9AbyMfqFC8v1Kb7wU6ykE8Y/JA4rImeQJee9IlmxrhFAhAd9IuDTCGInk8Nh+PseBJxe60+62MEjjD1+HTuLNyiESpT3UqRF7f5JsCh0h7ZSERIppe4p/J4Pfmv6b75X7wuwzAFgRE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=V35TTJje; 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="V35TTJje" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 29AFFC2BCF5; Sat, 16 May 2026 18:37:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956651; bh=EauBIBzKjl6rFCRlEGSo/s6NrgLL9HoVh8TIqUsq9vs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V35TTJjeKEuxB/5xFHbsDemOsd5TqDRUYuMpUiMrVGFTQfEVJdTmeDWfxHNsb/oFD CMkiI1ssvT9v4RJ/d1yHCJMLq3cvuUlsb5Taohr+2N87YKF3yB962mDEL1CgkAnLGN JEFYR/lDbmT90Ew9vZAsYoGYdaCohdB/QGDT/5n8WQYkQPsHJSP6z0cZcs8x2II25U XAKhpB0BTCIAXYlks5s/d5ySuV/hi0+Z+R6nZe5VIWpudeiCu2Gs4xPbSAmGEk+pX0 a352cNlapycp4SDOfTVfUkdAco90/YUNuaBJ5on1XewmOJidH6iALziBIt2qSoWoZv j061YnOE5WQxw== From: SeongJae Park To: Cc: SeongJae Park , Shuah Khan , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 19/28] selftests/damon/sysfs.sh: test probes dir Date: Sat, 16 May 2026 11:37:00 -0700 Message-ID: <20260516183712.81393-20-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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 simple existence tests for data probes sysfs directories and files. Signed-off-by: SeongJae Park --- tools/testing/selftests/damon/sysfs.sh | 48 ++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tools/testing/selftests/damon/sysfs.sh b/tools/testing/selftes= ts/damon/sysfs.sh index 83e3b7f63d81c..1ac3e2ce8e448 100755 --- a/tools/testing/selftests/damon/sysfs.sh +++ b/tools/testing/selftests/damon/sysfs.sh @@ -291,11 +291,59 @@ test_intervals() ensure_file "$intervals_dir/update_us" "exist" "600" } =20 +test_damon_filter() +{ + damon_filter_dir=3D$1 + ensure_file "$damon_filter_dir/type" "exist" "600" + ensure_write_succ "$damon_filter_dir/type" "anon" "valid input" + ensure_write_fail "$damon_filter_dir/type" "foo" "invalid input" + ensure_file "$damon_filter_dir/matching" "exist" "600" + ensure_file "$damon_filter_dir/allow" "exist" "600" +} + +test_damon_filters() +{ + filters_dir=3D$1 + ensure_dir "$filters_dir" "exist" + ensure_file "$filters_dir/nr_filters" "exist" "600" + ensure_write_succ "$filters_dir/nr_filters" "1" "valid input" + test_damon_filter "$filters_dir/0" + + ensure_write_succ "$filters_dir/nr_filters" "2" "valid input" + test_damon_filter "$filters_dir/0" + test_damon_filter "$filters_dir/1" + + ensure_write_succ "$filters_dir/nr_filters" "0" "valid input" + ensure_dir "$filters_dir/0" "not_exist" + ensure_dir "$filters_dir/1" "not_exist" +} + +test_probe() +{ + probe_dir=3D$1 + ensure_dir "$probe_dir" "exist" + test_damon_filters "$probe_dir/filters" +} + +test_probes() +{ + probes_dir=3D$1 + ensure_dir "$probes_dir" "exist" + ensure_file "$probes_dir/nr_probes" "exist" "600" + + ensure_write_succ "$probes_dir/nr_probes" "1" "valid input" + test_probe "$probes_dir/0" + + ensure_write_succ "$probes_dir/nr_probes" "0" "valid input" + ensure_dir "$probes_dir/0" "not_exist" +} + test_monitoring_attrs() { monitoring_attrs_dir=3D$1 ensure_dir "$monitoring_attrs_dir" "exist" test_intervals "$monitoring_attrs_dir/intervals" + test_probes "$monitoring_attrs_dir/probes" test_range "$monitoring_attrs_dir/nr_regions" } =20 --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 3F66A35E92B; Sat, 16 May 2026 18:37:32 +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=1778956652; cv=none; b=l1qRJ9B63n6w5PHPTa2Y5vxwpjKPdEVr35f5YoVds7DrfL2/3SCHUAx0t6lM0rw1Afu6Gdfyr4k4QPXf8tubRCFckSVsmTFzRQIFODRjIoC0fUsN1tMbXucU1DEJA/HpE+X/aGa+40DTPKVKwEYfcP1131HgVVi7KATnpOhwUiw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956652; c=relaxed/simple; bh=OPFhEPDzos0mBFBwhii/0BwgZM31nZ+rfuFNwzzIAKM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QHBYlI+Vju4QgqKj/LMrg11HoP37n5J3moc2Twp1hNxM11LhyaoE5dQGgE1LU+HwcK/EpVh2Nnti1dMSbfJPtJf9JOO8Vxk08Rq5A5XnWYA1JN6y33IzHkO2ibvIg2pMTHaAQ5N4EM+azHPi+VUkn34592I6ETrjyIrAawQmrWg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sCfldWY7; 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="sCfldWY7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 86983C2BCB8; Sat, 16 May 2026 18:37:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956652; bh=OPFhEPDzos0mBFBwhii/0BwgZM31nZ+rfuFNwzzIAKM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sCfldWY7erLbYGRjnh1Xr1+Gtz/L8lwQIR/4NcyPeV5t4Hy8qUnl9MYg92baKmxvJ 1gpeNZ81CssNzxBzemFkiLj3wavVpWvKPdbJr2H1vq8VMIf9uc1ahibzHma6ZVaKnR evstM7aXLD7sOek6FBu5FZ2dkgFFzPUADTAORuXHwYUwlxOfto1wlRoWz5MH7eNGFZ CQScXMe9u1MtxSEIKitJ4HzVknUT2ZdY/c0+ii9ggHVJl90xYsUyNTPm/BofLOEguu rmlZ9JhgQ5Dm1D1EdaNl8q9nRDN7SlAaEKxLBWAAZcZl52QKzMoH4yQk3GUDd3cc3U 8oxPsB8rLY7HA== From: SeongJae Park To: Cc: SeongJae Park , "Liam R. Howlett" , Andrew Morton , David Hildenbrand , Jonathan Corbet , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Shuah Khan , Suren Baghdasaryan , Vlastimil Babka , damon@lists.linux.dev, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 20/28] Docs/mm/damon/design: document data attributes monitoring Date: Sat, 16 May 2026 11:37:01 -0700 Message-ID: <20260516183712.81393-21-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Update DAMON design document for newly added data attributes monitoring feature. Signed-off-by: SeongJae Park --- Documentation/mm/damon/design.rst | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/des= ign.rst index afc7d52bda2f7..aa08c899a3e5b 100644 --- a/Documentation/mm/damon/design.rst +++ b/Documentation/mm/damon/design.rst @@ -269,6 +269,43 @@ interval``, DAMON checks if the region's size and acce= ss frequency (``nr_accesses``) has significantly changed. If so, the counter is reset = to zero. Otherwise, the counter is increased. =20 +Data Attributes Monitoring +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Data access pattern is only one type of data attributes. In some use case= s, +users need to know more data attributes information. For example, users m= ay +need to know how much of a given hot or cold memory region is backed by +anonymous pages, or belong to a specific cgroup. For such use case, data +attributes monitoring feature is provided. + +Using the feature, users can register data attributes of their interest to= the +DAMON :ref:`context `. = The +registration is made by specifying a probe per attribute. Each of the pro= be +specifies a rule to determine if a given memory region has the related +attribute. The rule is constructed with multiple filters. The filters wo= rk +same to :ref:`DAMOS filters ` except the suppo= rted +filter types. Currently only ``anon`` filter type is supported for data +attributes monitoring. + +If such probes are registered, DAMON executes the probes for each region's +sampling memory when it does the access :ref:`sampling +`. The number of samples that identif= ied +as having the data attribute (hitting the probe) per :ref:`aggregation int= erval +` is accounted in a per-region per-probe counter. +Users can therefore know how much of a given DAMON region has a specific d= ata +attribute by reading the per-region per-probe probe hits counter after each +aggregation interval. + +This is a sampling based mechanism. Hence, it is lightweight but the outp= ut +may include some measurement errors. The output should be used with good +understanding of statistics. + +Another way to do this for higher accuracy is using :ref:`DAMOS filter +` with ``stat`` :ref:`action +` and ``sz_ops_filter_passed`` :ref:`stat +`. This approach provides the data attributes +information in page level. But, because it is operated in page level, the +overhead is proportional to the size of the memory. =20 Dynamic Target Space Updates Handling ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 410BF33E368; Sat, 16 May 2026 18:37:33 +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=1778956653; cv=none; b=UpzMsH1NrBGlw8e03LVZ4uo66iSQb4l+q2uQwebyzSl1WSnqMxHR9X7TyTsH/sx9YftTgbKaE3jVN3449+JO7SXgzMWc3xUvELVkjSMhrSJLgsEzwqwA+i2phaXUM9oidxxrg5dSIv9k64kCzr5zmwFYcfI2Bd4n4RQLWoS/c3k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956653; c=relaxed/simple; bh=jMwAnu4yT3RRMK4ipWWfT8kscfFZqP8KMamyoxvugWU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=kkEf2v53uVe05Qmio5cjBfdwm31FFTlSerzsqrj8OfnWHU8SNvNEe/Hm8CT2V/tajuiMZ01hQoPAV5+H6/ba1EzvQprhF/S2H8w41VDiySHfvVIgSO0+xnyEKqcMQd1uRPNUd4Ymeq2NYecTILzut+Gea74ZPjhznQ5MDyCKLhk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=U3NGrnmz; 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="U3NGrnmz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4BC85C2BCF7; Sat, 16 May 2026 18:37:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956652; bh=jMwAnu4yT3RRMK4ipWWfT8kscfFZqP8KMamyoxvugWU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=U3NGrnmzTBKZP3uPO5ftowoJ2YeL8zy04LqawTayW5hWW5YxiDbdxqND/k8dkap/N y2ZVvxmupRBs74Bb7n4VpHOS5MPEtb0J/xW/ZaxW6oxsgifreh47SOcNaMM0V0HjYj HjJMtZC7XoQ4URHYuTOwsTJWT7SOAJfF/oJHojwj2x56rh6YDoXHUhMaJsOPJA8yDP 6U9H7CSbFcrdVPKjchnvXuGw3dcZjUkRAwmdgsxTVZQoGPLc9TfM6uD/3tyAoN91Fj 862jeQ3szKe9LTTK8o2/V6zaLoZNiSIIwJxo1HTpJJlwqNAP6wVEPBsozmn7X+v4eY Nq4NOrxL4bpkg== From: SeongJae Park To: Cc: SeongJae Park , "Liam R. Howlett" , Andrew Morton , David Hildenbrand , Jonathan Corbet , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Shuah Khan , Suren Baghdasaryan , Vlastimil Babka , damon@lists.linux.dev, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 21/28] Docs/admin-guide/mm/damon/usage: document data attributes monitoring Date: Sat, 16 May 2026 11:37:02 -0700 Message-ID: <20260516183712.81393-22-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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 Update DAMON usage document for the newly added data attributes monitoring feature. Signed-off-by: SeongJae Park --- Documentation/admin-guide/mm/damon/usage.rst | 44 ++++++++++++++++++-- Documentation/mm/damon/design.rst | 2 + 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Documentation/admin-guide/mm/damon/usage.rst b/Documentation/a= dmin-guide/mm/damon/usage.rst index 534e1199cf091..7b6074a1666f3 100644 --- a/Documentation/admin-guide/mm/damon/usage.rst +++ b/Documentation/admin-guide/mm/damon/usage.rst @@ -71,6 +71,11 @@ comma (","). =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 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 nr_regions= /min,max + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 :ref:`prob= es `/nr_probes + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = 0/filters/nr_filters + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 0/type,matching,allow + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 ... + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = ... =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 :ref:`targets `/nr_targets =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 :ref:`0 `/pid_target,obsolete_target =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = :ref:`regions `/nr_regions @@ -95,6 +100,9 @@ comma (","). =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = :ref:`stats `/nr_tried,sz_tried,nr_applied,sz_applied,= sz_ops_filter_passed,qt_exceeds,nr_snapshots,max_nr_snapshots =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = :ref:`tried_regions `/total_bytes =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 0/start,end,nr_accesses,age,sz_filter_passed + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 =E2=94=82 probes + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 =E2=94=82 =E2=94=82 0/hits + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 =E2=94=82 =E2=94=82 ... =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 ... =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 ... =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 ... @@ -221,8 +229,8 @@ contexts//monitoring_attrs/ =20 Files for specifying attributes of the monitoring including required quali= ty and efficiency of the monitoring are in ``monitoring_attrs`` directory. -Specifically, two directories, ``intervals`` and ``nr_regions`` exist in t= his -directory. +Specifically, three directories, ``intervals``, ``nr_regions`` and ``probe= s`` +exist in this directory. =20 Under ``intervals`` directory, three files for DAMON's sampling interval (``sample_us``), aggregation interval (``aggr_us``), and update interval @@ -256,6 +264,27 @@ tuning-applied current values of the two intervals can= be read from the ``sample_us`` and ``aggr_us`` files after writing ``update_tuned_intervals= `` to the ``state`` file. =20 +.. _damon_usage_sysfs_probes: + +contexts//monitoring_attrs/probes/ +------------------------------------- + +A directory for registering :ref:`data attributes monitoring +` probes. + +In the beginning, this directory has only one file, ``nr_probes``. Writin= g a +number (``N``) to the file creates the number of child directories named `= `0`` +to ``N-1``. Each directory represents each monitoring probe. + +In each probe directory, one directory, ``filters`` exists. The directory +contains files for installing filters for the probe, that is used to deter= mine +the data attribute for the probe. + +In the beginning, ``filters`` directory has only one file, ``nr_filters``. +Writing a number (``N``) to the file creates the number of child directori= es +named ``0`` to ``N-1``. Each directory represents each filter and works i= n a +way similar to that for :ref:`DAMOS filter `. + .. _sysfs_targets: =20 contexts//targets/ @@ -601,10 +630,19 @@ tried_regions// ------------------ =20 In each region directory, you will find five files (``start``, ``end``, -``nr_accesses``, ``age``, and ``sz_filter_passed``). Reading the files wi= ll +``nr_accesses``, ``age`` and ``sz_filter_passed``). Reading the files will show the properties of the region that corresponding DAMON-based operation scheme ``action`` has tried to be applied. =20 +tried_regions//probes/ +------------------------- + +In each region directory, one directory (``probes``) also exists. In the +directory, subdirectories named ``0`` to ``N-1`` exists. ``N`` is the num= ber +of installed probes. In each number-named directory, a file (``hits``) ex= ist. +Reading the file shows the number of data attributes monitoring probe-hit +positive samples of the region. + Example ~~~~~~~ =20 diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/des= ign.rst index aa08c899a3e5b..85d668e929194 100644 --- a/Documentation/mm/damon/design.rst +++ b/Documentation/mm/damon/design.rst @@ -269,6 +269,8 @@ interval``, DAMON checks if the region's size and acces= s frequency (``nr_accesses``) has significantly changed. If so, the counter is reset = to zero. Otherwise, the counter is increased. =20 +.. _damon_design_data_attrs_monitoring: + Data Attributes Monitoring ~~~~~~~~~~~~~~~~~~~~~~~~~~ =20 --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 4756A36655B; Sat, 16 May 2026 18:37:33 +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=1778956654; cv=none; b=cs9E2pR4wyZdNQnTPYEcTBcRsMDqlFFGsQlCdfQjmuoMYPQARF2hSCkcVxk9pTmsBE4+egrhIpae2Q6uvV1amg5n51sUcEiMRwHXs3bhtLOpdgkYy/E4ugNmVlp4G7TIAm5ZbcAvniJ7IL0uF8rtH32UYn9YhpeLK2JY5kB5UJM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956654; c=relaxed/simple; bh=2Ec0kIvSNNzHsY2IUhwcp+UI3Lx0nH8m4xnL8yQciI0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ogg9I9HZsGpJsKAhOzg30F+snh9hhv53eJQKt3USCDRwOGtPqbP/lMQ+2ISSU/YUVAn9iribWM+ciKXdvJo5yeYqrErfLuIMgleCzansYEIOjN8qSUCFhfTCWA/34X/zAmOR4Try6y0Qn+wH+T4RhgF+TLf5ZHvD8ZY2cYJ+HFg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KH2ctPE3; 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="KH2ctPE3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C360C4AF11; Sat, 16 May 2026 18:37:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956653; bh=2Ec0kIvSNNzHsY2IUhwcp+UI3Lx0nH8m4xnL8yQciI0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KH2ctPE3z+F28KIea6irxq3fcBYKl/QSEhQUsM/8PCcQDij7ql6+QWVLIT7XNCHSq HoCsNFgqLv1hiHcDQWck4HKOdDUBfG9Ss6xuNJNwKXgKB8aQgX2GTvJ00dWD6HFBhM WZPqFaMcDauSCO3Ms1U2z+FymCK1cZwua/EBFh9Ek79VkpjsV/i5OM4rZiaLGGmMPD yP1qsEvC64VWmvN4jRothMj+Y7bRgw5KTLLp9a2mCsrbaz3gDWWOvQXl4qk9bo3mt4 YusN/dCrmE49HH6Wym/QDLdLSx6Tu/nW8R1hNNrbKEQjwHJdAaVKXh97qRuJmi0i6N DZyoPHUCVjm+Q== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 22/28] mm/damon/core: introduce DAMON_FILTER_TYPE_MEMCG Date: Sat, 16 May 2026 11:37:03 -0700 Message-ID: <20260516183712.81393-23-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Belonging memory cgoup is another data attribute that can be useful to monitor. Introduce a new DAMON filter type, namely DAMON_FILTER_TYPE_MEMCG, for monitoring of this attribute. Signed-off-by: SeongJae Park --- include/linux/damon.h | 6 ++++++ mm/damon/core.c | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index d3b6296700a08..56a76781fde22 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -733,9 +733,11 @@ struct damon_intervals_goal { * enum damon_filter_type - Type of &struct damon_filter * * @DAMON_FILTER_TYPE_ANON: Anonymous pages. + * @DAMON_FILTER_TYPE_MEMCG: Specific memcg's pages. */ enum damon_filter_type { DAMON_FILTER_TYPE_ANON, + DAMON_FILTER_TYPE_MEMCG, }; =20 /** @@ -744,12 +746,16 @@ enum damon_filter_type { * @type: Type of the region. * @matching: Whether this filter is for the type-matching ones. * @allow: Whether the @type-@matching ones should pass this filter. + * @memcg_id: Memcg id of the question if @type is DAMON_FILTER_MEMCG. * @list: Siblings list. */ struct damon_filter { enum damon_filter_type type; bool matching; bool allow; + union { + u64 memcg_id; + }; struct list_head list; }; =20 diff --git a/mm/damon/core.c b/mm/damon/core.c index 11b513eb077fe..332d13d9f8603 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1422,6 +1422,13 @@ static void damon_commit_filter(struct damon_filter = *dst, dst->type =3D src->type; dst->matching =3D src->matching; dst->allow =3D src->allow; + switch (dst->type) { + case DAMON_FILTER_TYPE_MEMCG: + dst->memcg_id =3D src->memcg_id; + break; + default: + break; + } } =20 static int damon_commit_filters(struct damon_probe *dst, @@ -1446,6 +1453,13 @@ static int damon_commit_filters(struct damon_probe *= dst, src_filter->matching, src_filter->allow); if (!new_filter) return -ENOMEM; + switch (src_filter->type) { + case DAMON_FILTER_TYPE_MEMCG: + new_filter->memcg_id =3D src_filter->memcg_id; + break; + default: + break; + } damon_add_filter(dst, new_filter); } return 0; --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 178A0365A18; Sat, 16 May 2026 18:37:33 +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=1778956654; cv=none; b=o8tVJtIGXDgO7gWNWhORfZpm6+3eg0xTZw35UVbOsvTIHHqa5eh5idpVBOFa6H6mWgvhd6NKqDU2mk+ds53g7hKjoPd4pPXsXpXlmcM4K6f7C5ogUVGUgrbaYJxIiBD0cy6NXOH5qvYcPnfgxdgRMTdMNqLOwdZfOmeOKWLbqGI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956654; c=relaxed/simple; bh=onL2oA2hYb1zaxrnUJeL671RaJBAxGU6o7+rYnG/uh4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FFL+CL+SjX7rWV/TPqNQaBdLPOMqCyfN3aOqbIbu9OomRtfAgP5Zv+5axLNXAOyj344xoriPqygvXBsEKfX081XIPv5mAmeOTmTUg9T4/Ee0lBDt5QzMIyJwK57DeojmyBbWAd7Ecg8fQZ+7po5fYujF7vU6Z61X8GvvG2JaBg0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Qi0oWhV/; 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="Qi0oWhV/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 65F96C2BCC7; Sat, 16 May 2026 18:37:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956653; bh=onL2oA2hYb1zaxrnUJeL671RaJBAxGU6o7+rYnG/uh4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Qi0oWhV/hz3fVqVfc9dcYPFprssBLlVKN9rpYjeUANPC2uPTW25eSDIP712BxzE14 bD9+/aog6rGqovT/4eylDDDpeNJOn+fXT5udYwY+LTh+h7f42E6Rh+8X4TCMwAx9RO FY8ehGGRmRIPOXjx6M9/FZkZNPrfsScFYcJ550Rgblgi1APDA8ZL3SMLgKOT3vwDYd qyiiSMt3eFu4iwLI5gxdmTfkPS1cfboGcg75aP2J9p+DX0rylcuvV11X7+hf+l0g+w h5gohnM1hgfVVFw39wr1VSXmbOLW3Ydz6+HsOlnisy2tw3QPQxO7zTcGU3eKYByQpK 3YckedT71iVlA== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 23/28] mm/damon/paddr: support DAMON_FILTER_TYPE_MEMCG Date: Sat, 16 May 2026 11:37:04 -0700 Message-ID: <20260516183712.81393-24-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Implement the support of DAMON_FILTER_TYPE_MEMCG on the DAMON operation set implementation for the physical address space. Signed-off-by: SeongJae Park --- mm/damon/paddr.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c index 81780b05c175e..ad5a65f2398f0 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -124,6 +124,7 @@ 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: @@ -133,6 +134,19 @@ static bool damon_pa_filter_match(struct damon_filter = *filter, } 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; } --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 476AE36683D; Sat, 16 May 2026 18:37:34 +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=1778956654; cv=none; b=FYf9ndmfNe/DjajVODAQFrqRcB5uvd492dCqnyXELfJmwB1tBcjXRVtxFCquAoJC7Xu9q4WE4Q6xfgAv6Xk2pKqoKfTAzq0XspEpW1LoAm9sF/+gsIYPFSrxoOCAtJWhGOIQpNbOw4mjEU3jYGuPi4g3Att0Lmm6VpfMOuJt/JQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956654; c=relaxed/simple; bh=tDrZwwwBJNmUwPRaRB5h2nj7rIVewmnnPdFzESzb/3c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=B5k2dF2MAUADGQcGHMIsLpsIhAuG9KUE0hkh41ySJY2k4nmTUMfACAGjgcHjyZ9AWP3T8g8JIMswWAm2gOz7hQQLqqoCpmZdd3dvkSnfpQr4+4WiJRdXvCjfWkPLVJ7FkCAVspx6QDtzsVf/M08rJyW+xheWF/SB1h3MuzzLbTQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fyMPxbky; 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="fyMPxbky" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BD42AC19425; Sat, 16 May 2026 18:37:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956654; bh=tDrZwwwBJNmUwPRaRB5h2nj7rIVewmnnPdFzESzb/3c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fyMPxbkyE3jwDn8+alcqAvbygDtzlIldCESN+H++74MEQT9AEKEtEcvqMR9AFYugI XxPX3L9MlhlkHhA5si/Ayb9/wd7emxSkNRbpOKOZd3Jx6fcbfWGCxn5NdcSKp2Ci6n oP1NZ4RSpjidYjt4dhtn7Bsp8z9VAsBosThF2cchU/M1Tn3CG8uwfBccv5APmdRuRL 5vY76D7dAe3ClIl24EQnB2Up1/qvX+C63xjFfXL83aTK2nfwwqdnyG+dDT9uLunmM/ S3LulO3rpnW+7amTGKXmyRSnR4sywkTpAsR3Ijqd+lB1+O2CKd1Ucm1Z8pu54Anwmo GgBIAVHzq8kLw== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 24/28] mm/damon/sysfs: add filters//path file Date: Sat, 16 May 2026 11:37:05 -0700 Message-ID: <20260516183712.81393-25-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Introduce a new DAMON sysfs file for letting users setup the target memory cgroup of the belonging memory cgroup attribute monitoring. The file is named 'path', located under the probe filter directory. Users can set the target memory cgroup by writing the path to the memory cgroup from the cgroup mount point to the file. Signed-off-by: SeongJae Park --- mm/damon/sysfs.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index f1b7d79386866..2df1d670ee77d 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -756,6 +756,7 @@ struct damon_sysfs_filter { enum damon_filter_type type; bool matching; bool allow; + char *path; }; =20 static struct damon_sysfs_filter *damon_sysfs_filter_alloc(void) @@ -774,6 +775,10 @@ damon_sysfs_filter_type_names[] =3D { .type =3D DAMON_FILTER_TYPE_ANON, .name =3D "anon", }, + { + .type =3D DAMON_FILTER_TYPE_MEMCG, + .name =3D "memcg", + }, }; =20 static ssize_t type_show(struct kobject *kobj, @@ -862,11 +867,46 @@ static ssize_t allow_store(struct kobject *kobj, return count; } =20 +static ssize_t path_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + int len; + + if (!mutex_trylock(&damon_sysfs_lock)) + return -EBUSY; + len =3D sysfs_emit(buf, "%s\n", filter->path ? filter->path : ""); + mutex_unlock(&damon_sysfs_lock); + return len; +} + +static ssize_t path_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_filter *filter =3D container_of(kobj, + struct damon_sysfs_filter, kobj); + char *path =3D kmalloc_objs(*path, size_add(count, 1)); + + if (!path) + return -ENOMEM; + strscpy(path, buf, size_add(count, 1)); + if (!mutex_trylock(&damon_sysfs_lock)) { + kfree(path); + return -EBUSY; + } + kfree(filter->path); + filter->path =3D path; + mutex_unlock(&damon_sysfs_lock); + return count; +} + static void damon_sysfs_filter_release(struct kobject *kobj) { struct damon_sysfs_filter *filter =3D container_of(kobj, struct damon_sysfs_filter, kobj); =20 + kfree(filter->path); kfree(filter); } =20 @@ -879,10 +919,14 @@ static struct kobj_attribute damon_sysfs_filter_match= ing_attr =3D static struct kobj_attribute damon_sysfs_filter_allow_attr =3D __ATTR_RW_MODE(allow, 0600); =20 +static struct kobj_attribute damon_sysfs_filter_path_attr =3D + __ATTR_RW_MODE(path, 0600); + static struct attribute *damon_sysfs_filter_attrs[] =3D { &damon_sysfs_filter_type_attr.attr, &damon_sysfs_filter_matching_attr.attr, &damon_sysfs_filter_allow_attr.attr, + &damon_sysfs_filter_path_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_filter); --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 6F11C367F4D; Sat, 16 May 2026 18:37:34 +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=1778956654; cv=none; b=s3kXlhT0JUvFMcATymspDTKrtp5vulAwg9AfoPkgfsyXGTOHeelccMBkH37fyg+wX6BxT/Qt0CNtb9TYJzQ2dmnMMj3bu6Pe+AOPGumePC4BGNnxEQaO60HKMQZLlXJJocPU7Y3TpWXpqqftSK8Jw/gZcFlNX3npFsB3apLDHxk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956654; c=relaxed/simple; bh=qHHHZqgQa9Lg/3bYJzNijBUd9h6TB/zAV5V5qHZIdH8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AMDmewuhOKN2Th+emMdZvlergYB0HFHInfEfqEuUTXQiNrcOlBPJQqav2EKiDkv61mCpMA9FQW5Iqk1zK7wgWywiIRAU/3AjvJxzmF3amNenkrRu+Mt6GToSWLKCx7uc5FcflIX1od35blcmhgux0VIMxDMp5z3Me4ej++4iGI4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VvcVtMFp; 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="VvcVtMFp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 24849C2BCC9; Sat, 16 May 2026 18:37:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956654; bh=qHHHZqgQa9Lg/3bYJzNijBUd9h6TB/zAV5V5qHZIdH8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VvcVtMFpoNllpLjv58cFlkW9QPmJjBmBcKFmfW32PjdEBHy1vHGWF2b/XFCVPSByU 3V1wy+LZHO6MZgrll9javFT4mUsvstGPchlb8lcPrEGEm4z7xYYUlcLrUMKnjUsG0l hQHf1hUVgAOZjeLuruO11dX9gzpdR7FbycMlifCZ8q3KF3aAuAR1lJFR0aW4jAYMjy 6A+PzAPaLDlXA7xvU9PaNd1UC1DF6IncDcUOz1vslm6bvAGvUBh04yhtN6UUZHjn/5 PzrlrjO8BSwXYO47vs2lJpwtCW35s5rS7YUEJUEDqsDmw/usNG9DunzLzPWZTuzueN XdBOjplDLm7jg== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 25/28] mm/damon/sysfs-schemes: move memcg_path_to_id() to sysfs-common Date: Sat, 16 May 2026 11:37:06 -0700 Message-ID: <20260516183712.81393-26-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" The next commit will need to find the memcg id from the user-passed path to the memory cgroup, from sysfs.c. memcg_path_to_id() is doing that, but defined in sysfs-schemes.c as a static function. Move the function to sysfs-common.c and mark it as non-static, so that the next commit can reuse the function. Signed-off-by: SeongJae Park --- mm/damon/sysfs-common.c | 41 ++++++++++++++++++++++++++++++++++++++++ mm/damon/sysfs-common.h | 2 ++ mm/damon/sysfs-schemes.c | 40 --------------------------------------- 3 files changed, 43 insertions(+), 40 deletions(-) diff --git a/mm/damon/sysfs-common.c b/mm/damon/sysfs-common.c index 83e24a9b5a0db..bdc6ae2639e4f 100644 --- a/mm/damon/sysfs-common.c +++ b/mm/damon/sysfs-common.c @@ -104,3 +104,44 @@ const struct kobj_type damon_sysfs_ul_range_ktype =3D { .default_groups =3D damon_sysfs_ul_range_groups, }; =20 + +static bool damon_sysfs_memcg_path_eq(struct mem_cgroup *memcg, + char *memcg_path_buf, char *path) +{ +#ifdef CONFIG_MEMCG + cgroup_path(memcg->css.cgroup, memcg_path_buf, PATH_MAX); + if (sysfs_streq(memcg_path_buf, path)) + return true; +#endif /* CONFIG_MEMCG */ + return false; +} + +int damon_sysfs_memcg_path_to_id(char *memcg_path, u64 *id) +{ + struct mem_cgroup *memcg; + char *path; + bool found =3D false; + + if (!memcg_path) + return -EINVAL; + + path =3D kmalloc_array(PATH_MAX, sizeof(*path), GFP_KERNEL); + if (!path) + return -ENOMEM; + + for (memcg =3D mem_cgroup_iter(NULL, NULL, NULL); memcg; + memcg =3D mem_cgroup_iter(NULL, memcg, NULL)) { + /* skip offlined memcg */ + if (!mem_cgroup_online(memcg)) + continue; + if (damon_sysfs_memcg_path_eq(memcg, path, memcg_path)) { + *id =3D mem_cgroup_id(memcg); + found =3D true; + mem_cgroup_iter_break(NULL, memcg); + break; + } + } + + kfree(path); + return found ? 0 : -EINVAL; +} diff --git a/mm/damon/sysfs-common.h b/mm/damon/sysfs-common.h index 2099adee11d05..3079306966a91 100644 --- a/mm/damon/sysfs-common.h +++ b/mm/damon/sysfs-common.h @@ -59,3 +59,5 @@ int damos_sysfs_set_quota_scores(struct damon_sysfs_schem= es *sysfs_schemes, void damos_sysfs_update_effective_quotas( struct damon_sysfs_schemes *sysfs_schemes, struct damon_ctx *ctx); + +int damon_sysfs_memcg_path_to_id(char *memcg_path, u64 *id); diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index d680c785770a9..9462aba9c6cbc 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -2732,46 +2732,6 @@ const struct kobj_type damon_sysfs_schemes_ktype =3D= { .default_groups =3D damon_sysfs_schemes_groups, }; =20 -static bool damon_sysfs_memcg_path_eq(struct mem_cgroup *memcg, - char *memcg_path_buf, char *path) -{ -#ifdef CONFIG_MEMCG - cgroup_path(memcg->css.cgroup, memcg_path_buf, PATH_MAX); - if (sysfs_streq(memcg_path_buf, path)) - return true; -#endif /* CONFIG_MEMCG */ - return false; -} - -static int damon_sysfs_memcg_path_to_id(char *memcg_path, u64 *id) -{ - struct mem_cgroup *memcg; - char *path; - bool found =3D false; - - if (!memcg_path) - return -EINVAL; - - path =3D kmalloc_array(PATH_MAX, sizeof(*path), GFP_KERNEL); - if (!path) - return -ENOMEM; - - for (memcg =3D mem_cgroup_iter(NULL, NULL, NULL); memcg; - memcg =3D mem_cgroup_iter(NULL, memcg, NULL)) { - /* skip offlined memcg */ - if (!mem_cgroup_online(memcg)) - continue; - if (damon_sysfs_memcg_path_eq(memcg, path, memcg_path)) { - *id =3D mem_cgroup_id(memcg); - found =3D true; - break; - } - } - - kfree(path); - return found ? 0 : -EINVAL; -} - static int damon_sysfs_add_scheme_filters(struct damos *scheme, struct damon_sysfs_scheme_filters *sysfs_filters) { --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 C5AD7369972; Sat, 16 May 2026 18:37:34 +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=1778956654; cv=none; b=rzufy7DwvBNySZW2ZBN0T1MZXLgXqoFdFvTV60MVaO/33haii1FBALQiij7ROpeUbPwwU1t4uRpGMmGtj9YgpaA09grcqmwLucYbCh/8corOCJt3agzIO0kcyRJWx4AH23q/m4wgSPzFy3EZzuwTkYAA20u0PEEj+St8DT7Aj5c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956654; c=relaxed/simple; bh=Ee2xBoGCN0q1MWtaUMmJevs875atGOk3HcGVOqqc1ug=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u/jiQsixCEYCKHMbdgO561717MkR16+bPaJ5eXUS4NejBVSJS0RVSzobTbZhibjIus1cTWb0F4v1UWP2P8s/8yBEamLJwpQatHMs/QPNUOgWzjWl/mDg6og7cCLm5ZUglOpDF270lfC8OMahGKhPsceLqOdQtOeyY30RVqM0jss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=o3DBAiVJ; 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="o3DBAiVJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7AE5CC2BCC7; Sat, 16 May 2026 18:37:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956654; bh=Ee2xBoGCN0q1MWtaUMmJevs875atGOk3HcGVOqqc1ug=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=o3DBAiVJ3MOyg5p0ljt6P9bUyfyf8BBFbPeh3n5Hz8RWm6bVS8C8H4CN3aImIdGLu Ng9P99XpRtd/lXcJ/cnoA4kAL3KfJ4jiNmTsJ5rY56oaBM7uhuVE5W1Ied2qEvE3bk vJL5cazGQqPsXauaqrlwIfjModk646fKHHu5XMhXKOVdmon7XbfOmWuFnbZpN2pdKD qYfFl+G0V0MMAGymoj9JnCGhK0MkS6J8WhNx1iR7A+32rw0oY4vs8lovEw2B6CIH3D RDEodlKbeKiWmqqnRktIL7jb4GmQ6e1V8KacGiAzUNzBAQfmn+pNT38cV8w/4JrEHm tNyY90IBq7zbA== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 26/28] mm/damon/sysfs: setup damon_filter->memcg_id from path Date: Sat, 16 May 2026 11:37:07 -0700 Message-ID: <20260516183712.81393-27-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Find and set the memcg_id for damon_filter from the user-passed memory cgroup path when updating the DAMON input parameters. Signed-off-by: SeongJae Park --- include/linux/damon.h | 1 + mm/damon/core.c | 2 +- mm/damon/sysfs.c | 11 +++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/linux/damon.h b/include/linux/damon.h index 56a76781fde22..cd0c352a777dc 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -976,6 +976,7 @@ static inline unsigned long damon_sz_region(struct damo= n_region *r) struct damon_filter *damon_new_filter(enum damon_filter_type type, bool matching, bool allow); void damon_add_filter(struct damon_probe *probe, struct damon_filter *f); +void damon_destroy_filter(struct damon_filter *f); =20 struct damon_probe *damon_new_probe(void); void damon_add_probe(struct damon_ctx *ctx, struct damon_probe *probe); diff --git a/mm/damon/core.c b/mm/damon/core.c index 332d13d9f8603..b8fe4320c3da8 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -139,7 +139,7 @@ static void damon_free_filter(struct damon_filter *f) kfree(f); } =20 -static void damon_destroy_filter(struct damon_filter *f) +void damon_destroy_filter(struct damon_filter *f) { damon_del_filter(f); damon_free_filter(f); diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 2df1d670ee77d..8f927e3dba827 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -1897,6 +1897,17 @@ static int damon_sysfs_set_probes(struct damon_ctx *= ctx, sys_filter->allow); if (!filter) return -ENOMEM; + if (filter->type =3D=3D DAMON_FILTER_TYPE_MEMCG) { + int err; + + err =3D damon_sysfs_memcg_path_to_id( + sys_filter->path, + &filter->memcg_id); + if (err) { + damon_destroy_filter(filter); + return err; + } + } damon_add_filter(c, filter); } } --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 87E2036D9E7; Sat, 16 May 2026 18:37:35 +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=1778956655; cv=none; b=m/wA7umv9BtFHgcsUMw6D2Tj4ubt8uxpQuu+iiguSFtw7RcOBpNDcM9GuhpvAnZ4k8yyMMWa82qoGxL027qc6uPN1kFHq1P7zfTRZTGFOSspwqfRQhlBOXGcwVP2EOwVgLM2iEgBpeaVxbDazRV3zHN6X8rLaI2CjdxsODpny/o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956655; c=relaxed/simple; bh=bkzOsZ+u9cB/tv1smaMAlVTUS7NBHktW+3LSKT4hgrM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bx9KN4UGlbG09PHySFuj5W76asVUr1WYh4MDAIFY7JZNuHh5ejb7JSQt2D2YJn7HB51bKcyjKkLr+qOGPEqe8XjIYLz6ryZc+2l19NK22rE9Nju8adeD85qFYMrNBE/VOt6OjqDeiBl3j6zu8YLrzfosbK/64dkX+5PxOIwaVs8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IUF2xE1J; 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="IUF2xE1J" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D551DC19425; Sat, 16 May 2026 18:37:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956655; bh=bkzOsZ+u9cB/tv1smaMAlVTUS7NBHktW+3LSKT4hgrM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IUF2xE1Jg2MnEobOyg9RnlkwjukUdD4EnA9yERTUFrZ8ALkhO7gMOR+01OI5A71jP CH8937r40nphJCVvEoLEQzEXfCkoew1Yow9xncb4OwdKn9LSdQdTWK/RoYeqYSMER1 Wco1YQh0RUzwWWApRfhR3nux8PRMIlHIB8w/8/c7hMAYt2MTBy/Sej/XpvP7JNX7ZK VGVgLL4f5ddtcmAXHZzo3mmuljNSU4jLY/vtQCaUF+YW8Ie2lBzIkZMihQ95PVooYY QjPDHggOMP2F1wBQnbHRpeJj9CCdnygY5brVxCgfo6pZEWay4qG0ZRLVG3nS5o9zOl z8Nta5ezLLx6g== From: SeongJae Park To: Cc: SeongJae Park , "Liam R. Howlett" , Andrew Morton , David Hildenbrand , Jonathan Corbet , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Shuah Khan , Suren Baghdasaryan , Vlastimil Babka , damon@lists.linux.dev, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 27/28] Docs/mm/damon/design: update for memcg damon filter Date: Sat, 16 May 2026 11:37:08 -0700 Message-ID: <20260516183712.81393-28-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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" Update DAMON design document for the newly added belonging memory cgroup attribute monitoring feature. Signed-off-by: SeongJae Park --- Documentation/mm/damon/design.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/des= ign.rst index 85d668e929194..8a2d68cbcefca 100644 --- a/Documentation/mm/damon/design.rst +++ b/Documentation/mm/damon/design.rst @@ -286,8 +286,8 @@ registration is made by specifying a probe per attribut= e. Each of the probe specifies a rule to determine if a given memory region has the related attribute. The rule is constructed with multiple filters. The filters wo= rk same to :ref:`DAMOS filters ` except the suppo= rted -filter types. Currently only ``anon`` filter type is supported for data -attributes monitoring. +filter types. Currently only ``anon`` and ``memcg`` filter types are supp= orted +for data attributes monitoring. =20 If such probes are registered, DAMON executes the probes for each region's sampling memory when it does the access :ref:`sampling --=20 2.47.3 From nobody Mon May 25 04:33:39 2026 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 4222335DA46; Sat, 16 May 2026 18:37:36 +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=1778956658; cv=none; b=Le+fhX3UkTL/14KJrfsUP+uuSBz9mk9qgcOLOONM8xbKWkGeNXnlfvZxnN2xCYJhOcM6MLxMNpo8XVdvbW5jLqGKZJBPCMdeiuqPoaFPo0QWVJLGW+viVYeMl062hQSwEvTF6qJLhgpE9TRCRetyJE2MM9AP4ai5gPtqkNitl6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778956658; c=relaxed/simple; bh=2ezmr596RCMSl8GJn5iaP7SQwY6FO5nwtQYKenA48Qw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rBT0uUb2b0cZ2NU96x0/PcCIk+KFZn/0FZS1Rj7ojYIkLEXA2cMOc+faXKQ9xu6v/RklEHlo5Ca3KnsJPa4m364JNe7wTqPNZgDZhETd5xvwfKzHpV20bf5VNlDZAONnnFVBnB/4WLgUCa+c+XPlrE7GyS+vmW163Ap9UVrNgmY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AEvgDpTH; 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="AEvgDpTH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9452BC2BCF6; Sat, 16 May 2026 18:37:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778956656; bh=2ezmr596RCMSl8GJn5iaP7SQwY6FO5nwtQYKenA48Qw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AEvgDpTH3zyWW+YN6W72epS0dus/LicSC/g6uHpwevrjqMsjmJXObfl863R2HHT9b miL3e7k5t/sewh13qlcBGSUdM2CapWSO4SChKv4AcOSbEyDyIdH5JKtV/+1RHjfruC 78nXdWXqDQ6PTM3vnR3rKdXxX29VNXbLZJB9YIDY1u8DHv+gNhskr8DYgyCk13nS6O eWXFjn6jAXDtZThwLCd9hgqLtMK3y3o4NjjXyGG6/ynmbJ7a9dC97rN83TqX+jUIjb OMYfwxFxxDrkuwE1tSgqslrSBMQSago0ixpzXe8ExzKa5bNWIIDK+MrleBvkAKAgBx MeQSe21SJFK5g== From: SeongJae Park To: Cc: SeongJae Park , "Liam R. Howlett" , Andrew Morton , David Hildenbrand , Jonathan Corbet , Lorenzo Stoakes , Michal Hocko , Mike Rapoport , Shuah Khan , Suren Baghdasaryan , Vlastimil Babka , damon@lists.linux.dev, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH v3 28/28] Docs/admin-guide/mm/damon/usage: update for memcg damon filter Date: Sat, 16 May 2026 11:37:09 -0700 Message-ID: <20260516183712.81393-29-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260516183712.81393-1-sj@kernel.org> References: <20260516183712.81393-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 Update DAMON usage document for the newly added belonging memory cgroup attribute monitoring feature. Signed-off-by: SeongJae Park --- Documentation/admin-guide/mm/damon/usage.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Documentation/admin-guide/mm/damon/usage.rst b/Documentation/a= dmin-guide/mm/damon/usage.rst index 7b6074a1666f3..b4584c0e4cd72 100644 --- a/Documentation/admin-guide/mm/damon/usage.rst +++ b/Documentation/admin-guide/mm/damon/usage.rst @@ -73,7 +73,7 @@ comma (","). =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 nr_regions= /min,max =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 :ref:`prob= es `/nr_probes =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = 0/filters/nr_filters - =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 0/type,matching,allow + =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 0/type,matching,allow,path =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 ... =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 = ... =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 :ref:`targets `/nr_targets @@ -283,7 +283,9 @@ the data attribute for the probe. In the beginning, ``filters`` directory has only one file, ``nr_filters``. Writing a number (``N``) to the file creates the number of child directori= es named ``0`` to ``N-1``. Each directory represents each filter and works i= n a -way similar to that for :ref:`DAMOS filter `. +way similar to that for :ref:`DAMOS filter `. When the fil= ter +``type`` is ``memcg``, ``path`` file works the role of ``memcg_path`` for +:ref:`DAMOS filter `. =20 .. _sysfs_targets: =20 --=20 2.47.3