From nobody Fri Jun 19 07:44:00 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 3ECE824DCF9; Sun, 26 Apr 2026 20:52: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=1777236755; cv=none; b=kYkvJFxeH6WvVWHAXUTBYsRPY8QinG40e5ND9rDwVZi1EbfiO37/Bs9G6XMZKjRgvv1ubMa8CCJYO6kGJlClvZ1LukX0RyWtIgIMBoRz6L8iSNXGknWxTmkWYNYQdRZu16pQKAivymz/ZRGm6n9WEPBJhzCOtioF5w3j66zy3AI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236755; c=relaxed/simple; bh=1QadOMZa6i8GGLgIPAt5QhHokee8K5qEtWxld82M5Rk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q5i69IpK0fW1xWxPQEuQiwRernbMe8mAEOETKN1q7LRp+BUIaOmXLuh+j8J/tLH7ZY1np6Aa5ioACxgi6N8me0U8LGXlgrR5OX0QBvBTfw6jC42yzBtNB1dCPVCpYC7580n/e0w0X9o155cQifvWidi7p6SFPV0F7v46VQPGfRM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y3D5pfiu; 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="Y3D5pfiu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E9C4FC2BCC6; Sun, 26 Apr 2026 20:52:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236755; bh=1QadOMZa6i8GGLgIPAt5QhHokee8K5qEtWxld82M5Rk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y3D5pfiuhVeOi1wvnghj0VOW2j7fSBJtl6ggiQ/1yfV7+xkW46C3RLmgV6u25eDYQ 91CwAItN3QN/RDzy822cJJwXzvE5GOOKoT9gJ3d7BuJMZhTcja8z3GAQdjBXTnx15C bDPq9to9W+sxbOHVJyeERJjT6D+6p/Uf+PTZJ7I9q+jyUKtgX2lTzAfSUHPRzuTqGL UWhNpOO/hAPJ2mYL1Wskclhn9bmpCVVB5CM+w3T6PEsSvqu8IR/yq3cL1Bvn/jPw/C 4qnUJy8WC17BSO6uqXCxLFj32UFaRx5y0dNPJ6jcRkE5HOrY/JEd2WT9WmtS4xrweM 1SAj2DZPsBGxw== From: SeongJae Park To: Cc: SeongJae Park , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 01/19] mm/damon/core: introduce struct damon_probe Date: Sun, 26 Apr 2026 13:52:02 -0700 Message-ID: <20260426205222.93895-2-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 7314fd9ff0d9b..da2f026eac725 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -732,6 +732,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 Fri Jun 19 07:44:00 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 8630D2EF652; Sun, 26 Apr 2026 20:52: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=1777236755; cv=none; b=UQqnk8TBN5Tu6FSH8MyFtTOp/ocf/HDmHrZY2eTsrLG6bwlLchvE39jI5JJKB9/GVex8OsSs6w8qzLON0WEUhMPBcDX0X/8mqoJyNrM+BLrCGcce9kbIP3p2pDxoH8kx7D/ms4YxbgsRIxIbFsUX0I2JrzunJ9ISSBmtz/4Uftw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236755; c=relaxed/simple; bh=MBnxsMb7aVVsu9fBOqUd4whtHJLGz98akhVkcLMVfko=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hj+4TCgqvRmOF5f0dZ4pVbZBV1T6zTZJ7gemfgb/hlj9NIgqQtE1ffP/0dA05iq9QqNWC9oi6psVZAJa1wkFE6R9Tv0mgEnF3eXCUoZF5fwjxKzT5qQ8cRE9KStc//hFmjShsd1q8sNAig7oaqo8FRWCNv4MeJSWYwwOwrfiyAA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WFUVNBJY; 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="WFUVNBJY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3E900C2BCC7; Sun, 26 Apr 2026 20:52:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236755; bh=MBnxsMb7aVVsu9fBOqUd4whtHJLGz98akhVkcLMVfko=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WFUVNBJYGo8GJ+nlSDyoHTMLKuEEuU98keMZ2AGVXQTenj6xfcYgVLnHrj2M481eC dPaja58+UYFgsTShSVrUwMLM85x/A5KpstSajf5D9sSJIBmTDUVM6xJsibDDpLeyIP igJwLFtVvvtx+eKwIAe8prraRVNAyGKxhq6xrluZFcfSONUjB7+De3oe2UuGq7OO9A lMusAHSUv6VV+wrhE+MpGDvcMsWdwbb27qQHF5fUJP2hHa6x1MQEzjM2mtmULWI/Jb jXgTWkuI3WTDBVtDQzqGYQVukL+m8LoTQhIFpXYhRHWkh2INbD4gRRTAc3rmkM60oK p5ZeWbwpnPgFA== 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 02/19] mm/damon/core: embed damon_probe objects in damon_ctx Date: Sun, 26 Apr 2026 13:52:03 -0700 Message-ID: <20260426205222.93895-3-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 da2f026eac725..65d7ee0a70ac0 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -859,6 +859,7 @@ struct damon_ctx { =20 /* public: */ struct damon_operations ops; + struct list_head probes; unsigned long addr_unit; unsigned long min_region_sz; bool pause; @@ -892,6 +893,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) @@ -934,6 +940,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 int damon_set_regions(struct damon_target *t, struct damon_addr_range *ran= ges, diff --git a/mm/damon/core.c b/mm/damon/core.c index f556786597c83..861ab977d1edf 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) { @@ -633,6 +665,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 @@ -653,12 +687,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 Fri Jun 19 07:44:00 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 D2B2C2F1FEF; Sun, 26 Apr 2026 20:52: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=1777236755; cv=none; b=A6aVQjisyWD2zjI4jMzJDxf113BUtO8LEoBJEAsIU0QGu+xgF3hgroa0jFkPujm3RDXzYhkd6i5NB0mv1Q6lExSLRUZ4HyvoOGEpKWGCQzF30L5j/oZxpk2QtPqaXXDfAOiDkK9Ce1BGyFe0XVHFiwMTy2OgqpkUgsAivsuBe5c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236755; c=relaxed/simple; bh=ssUx+oZtCnXAftQFdGVKJ2duGR6qwdo9mJW3FrliT4o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fQg4EPqvHRIqowiw7ezmxko90JjJjWAhKm0bRq99j+mEEda5Mdwj2K02f+3vRzm1XbgqbSqqNmlCgx3X2j9I2OOMmyQicRegAmmGXaobwYs+SueMiYLTL3NVVwfrSudEZP+EeHlH4AYrzNoOdh83zlqGW0LWu7FxwUJvTjHgYlA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=D4ybWyt1; 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="D4ybWyt1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8E9E8C2BCB4; Sun, 26 Apr 2026 20:52:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236755; bh=ssUx+oZtCnXAftQFdGVKJ2duGR6qwdo9mJW3FrliT4o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=D4ybWyt1ndP5z/2On8DxGztXhJNX5X+YtMrrJCoV2D4wzTwKcgbCmbHnDx6tHubF6 uviyhSgXNMgpPEcU37xIktpHGf3dwx2oR/QyVDZ2MAH1K183q5RLhDKRFyP/b2NAgF 7enksJBYZa6xHYFvU1AI3nUJ+bQ0nqqKqFT6DpRScAoqdBtzMWySbxWJ4txqFwLTdO 3GT0ZWG7VTao4tyPEnIvMHng5vPlAFYZYY3wKI34tYfiK7ZEZeO1575hK5DpGTcMpx MmYSC+iwrmE2RFYcB+IZl66VFLU6CfxJz/7EIvE+4NdaPM1HXfg5KlSpzCju8REm1V J3s3GgfW0fPAA== 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 03/19] mm/damon/core: introduce damon_filter Date: Sun, 26 Apr 2026 13:52:04 -0700 Message-ID: <20260426205222.93895-4-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 65d7ee0a70ac0..3290792eab547 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -732,12 +732,38 @@ struct damon_intervals_goal { unsigned long max_sample_us; }; =20 +/** + * enum damon_filter_type - Type of &struct damon_filter + * + * @DAMON_TEST_TYPE_ANON: Anonymous pages. + */ +enum damon_filter_type { + DAMON_TEST_TYPE_ANON, +}; + +/** + * struct damon_filter - DAMON region filter for &struct damon_probe. + * + * @type: Type of the region. + * @matcing: 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 @@ -893,6 +919,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 @@ -940,6 +972,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 861ab977d1edf..170abba8fdf2a 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 Fri Jun 19 07:44:00 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 681302F5491; Sun, 26 Apr 2026 20:52: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=1777236756; cv=none; b=qnbJh8cp1O9ngFqY5W3yiCfjvtb0cfK4xDs6NdEKXeM/byAkKxVpUlQTpoyQPMxyKZd+pbUWospYV+3vDZuf78ilegisoiGQDui38lG9YXeD0uBPyh54FwsWgmP5i0w0+Etk2+IK8jyp5nTOdNHdh9YH7G5pwFjfqu/XtPo/NNk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236756; c=relaxed/simple; bh=o22ugjrNFWbpUtXu+ccYCDc/5RGuMV8QTJSNQEdoQzs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i8vRFk7uJnPQ+OV8Y0yA/Z1KFgqI6ss4Fy6J7MlF+SujfmuvMzas7BvfoVGOWtRvY8Y/q5J3odqzo2z/KO5x9/wk1FH2gEcog4RO1xrV+fuJYEVd+YxHB5GylqYRZTGO9jyif6EoEGRBp9M1Uqh0aO6GfbhXvW40b6d03zAYxSw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SDQJoe1N; 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="SDQJoe1N" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DEB8BC2BCB6; Sun, 26 Apr 2026 20:52:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236756; bh=o22ugjrNFWbpUtXu+ccYCDc/5RGuMV8QTJSNQEdoQzs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SDQJoe1NFwHYqANaMOcCpJgaKxKqgUOOQFcaHK+dQDBzj62M2kqwbRu7YI4QitFf3 63l7CpBP7+tA7bhepE122ngllyQHBSstJ78Zg9v5v+3soPmmbQTQlNDix+guqzZIwO Tmq70z1SV+5T0Co9FVYXpvu3PCfrX3gM6V1vC44viR2SjLBat6ZSBv+FiAlPojytMQ /OlnA1g1WkSBbENnbAiR+tdtHyCneE+SiVkYq9wGTlIESAmfOPC5Si3jb69Dudw5AA vxnw91V5zasqUR/fp6yDLfWZGDnvbwSQHMG1sEQZ18zpODH7bUp+FkBb87McGC7RDu r8rKzWNedcTeA== 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 04/19] mm/damon/core: commit probes Date: Sun, 26 Apr 2026 13:52:05 -0700 Message-ID: <20260426205222.93895-5-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 170abba8fdf2a..2ab1d6dd47da4 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) { @@ -1412,6 +1447,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. @@ -1453,6 +1554,9 @@ int damon_commit_ctx(struct damon_ctx *dst, struct da= mon_ctx *src) } dst->pause =3D src->pause; 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 Fri Jun 19 07:44:01 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 8B25E2F745C; Sun, 26 Apr 2026 20:52: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=1777236756; cv=none; b=qWBUG6AGLUUbFGcg5RQ5hjPKkq1AJpZucNNA0iGl1Fes4KWVSaq92/zn0j6HcNMobb5LO+X3A4kvrm6kxuHNuF65HRtCd5TzdOoJflGH9MUoNe3namSyM3yNzYlLGQZmtKY7GZ85kDTNwx/7bdHjlyNiLPem4cIryI43ihTNg6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236756; c=relaxed/simple; bh=wQ5jrgZcCcBYXHxkXe5BHmR4YJYJ4CSttqynLoS/qrw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aZLt30bgI1O/hkauq0LXtawbVjnXTeG2ihiRaFdAizcfx3fKZCXsLIg8rhg5aIvK9PzgJPLSf5J8dExPz4pQXmAMqP6JAT06JzhsC7UarJD0UpP5PlxuHw0n1fsKW92rhzGEKzew6AtZeLUDhDc76J4eOEEmcciQOnNi06WCkO8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NVBouhCn; 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="NVBouhCn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3EC08C2BCC6; Sun, 26 Apr 2026 20:52:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236756; bh=wQ5jrgZcCcBYXHxkXe5BHmR4YJYJ4CSttqynLoS/qrw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NVBouhCnGZ8rz+3zC5fPPGDXlLEnJ7IYAnHrjKhKdRldcrRnYNjB/4y0E2qWRv8Ko bYZakYEIUOv7m+AXJ5r+WN/V1lcdPFRmVoso3wXahATS8iBfrm9flDwD3TJMR4qnbE V33sUp57SXx1Livw0cjPDxcQYpJceJg8r+/cMo0T+P9pBSg/7EWKkhBzLBPS3g2u/X sGl+oHOVYRi7dz2Lfe2hZvMkqLTKPwChlcd19cVf0VLS6OuL0Fk0E340N9FkABj817 U2P5CwZ0/1j249CEcMzQVZizaCZ3LfDfsNnREc0bAuFUv7o1adK7Gy4fbmXcxlk8sm XRRh/l3wyfAog== 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 05/19] mm/damon/core: introduce damon_region->probe_hits Date: Sun, 26 Apr 2026 13:52:06 -0700 Message-ID: <20260426205222.93895-6-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 | 3 +++ 2 files changed, 7 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index 3290792eab547..766d6daa52a3e 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 2ab1d6dd47da4..d4779b647a495 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; --=20 2.47.3 From nobody Fri Jun 19 07:44:01 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 CB14B2FB97B; Sun, 26 Apr 2026 20:52: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=1777236756; cv=none; b=N5RiJabLdugYYwg75HQECCVS+s4lBao18OnLYQFkrHs4ilVs2lVL20ursxhirTm8dxRxxvgwz/eGvVLoGoRAm+i5dqgim87sxydElYr2PpHmn3UTQVjh7xpTo6PYLdUK8OfC/hdyG0AGNXEwnN9azONXbSFrYqmg5bIyWgOd+0E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236756; c=relaxed/simple; bh=eeiUmDXDACMbPx16b5hdV72jEFWacDugbdDQW4vjkpk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EYxiKqAjm3omh6WyYd/Nh6xtOpmHiZ4Diqz8rcCD/IyeMSRJ4uAR/NXR6DwG/KUnplHQeUizv5EwEDexSi9qwZ8XBV2oM+yw9V/nMbkGiJQNYXgJV9Eu5KMfst1soh8SJXVGQbfvqrk3FjZg21QBzxxlbmvwjvDWFIh4LyAJrZQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GXMKqhsQ; 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="GXMKqhsQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8FDD0C2BCAF; Sun, 26 Apr 2026 20:52:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236756; bh=eeiUmDXDACMbPx16b5hdV72jEFWacDugbdDQW4vjkpk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GXMKqhsQ5FoHGqmoLFZYr3lIcs2q57qa/lQj1+BBzHZ1w2UubNCRvee/ZMw/MzLxb kXtHOuZXZneHfiZIyWEP785KCR9MZFl4ck3t6TFIllQrSyoM0UmRZQfkuQcDIdllXe jS28y9pkO4ol6pOBWw47bC6B04X/7xAGdFOn6ljQOO7ao79j/i3/jIXzX8/JTatk4j Wm2HswnkcWuDwZBTKm6j1Z0WhWVu3C+mov2cf2wMDvTQu8+RJnOHUqWFzM9v7d113y DZMbbP9WwWbpUl7Qx0ismbDLp9ccDL8gbnn/kVSVGxKKs9lDNvkWoQz3wrDfkihcin 9OvrzP3HkxDEQ== From: SeongJae Park To: Cc: SeongJae Park , damon@lists.linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 06/19] mm/damon/core: introduce damon_ops->apply_probes Date: Sun, 26 Apr 2026 13:52:07 -0700 Message-ID: <20260426205222.93895-7-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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_probe. 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 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index 766d6daa52a3e..4266fcb121a33 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -632,6 +632,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. @@ -675,6 +676,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 Fri Jun 19 07:44:01 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 430B92FF66A; Sun, 26 Apr 2026 20:52:37 +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=1777236757; cv=none; b=eibE7KwEHQDmwLP86pkCCy/yCMtcw6yh3zpDDk6+CiNGu9xitFdf5cRmHSO82d83gxi4Dr8syvJwDDXuOX8HtPOi2nLuKtdcoGCePxQh+HnMDbVwTVEmwmEeO51S79IYjVJYTjeXiFInixrzwOmDDhCva4Af1hQbxfE4IqseF2o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236757; c=relaxed/simple; bh=blGlhx9hlnhuQ75ddAmdhCx+qtv30Q5dipQv2/NkGPw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U5i1FCtjtcq1KGsnzffXSRgJYsG8GCfei1MyLbdicEVV/baZJbhE10q+dZ8VZ2dPSnd5K4OD+5vkfzFQnPdPp9tdCiAjJYXFnwEwsXuvgl65HBoXBOK9N9u2Km1+1GwUtvXqLJRIK4hiOUa4sAwNfTjBeHcKFlpxeGyQ4ybFgfE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aTRBdK/2; 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="aTRBdK/2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DAF92C2BCB8; Sun, 26 Apr 2026 20:52:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236757; bh=blGlhx9hlnhuQ75ddAmdhCx+qtv30Q5dipQv2/NkGPw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aTRBdK/2U3yntQylTgNKqIttVqxCUE3i+E4RHYiq5BGShm5gYKI9lXdpgIG+21tIk /7KmfS3xmC2nVEkKgiFZsJuvygaXRI01ala5hy6z3ZgMSQ+DLOTrEZX+4xClsbHgsc gzs9XEFLxs7viJvj585MSs59aGhoTgBLQjRmb153PNpkemLfR/qoswyWrfXLbWbPRQ mcsbH30utTdYkhvxBQopPL/RhH4AKdX/W6tcjbEzyB3HK+AI0HAurxBQ/5fE7BMtxd YjElo4oWhhqZOSVFxLLON9/MwmI6QCRYjFt/okmA3yjTS3o709v9vGQXLrCnBPCCx2 4CNfgwSSHq17A== 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 07/19] mm/damon/core: do data attributes monitoring Date: Sun, 26 Apr 2026 13:52:08 -0700 Message-ID: <20260426205222.93895-8-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 d4779b647a495..fe14971d72747 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1921,10 +1921,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++; @@ -3288,6 +3292,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 Fri Jun 19 07:44:01 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 8E944301493; Sun, 26 Apr 2026 20:52:37 +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=1777236757; cv=none; b=UlNJEsen+4ZTUlhCx5ulOerwI5cTy2Hx0l4vq92weJaFHM42oMxmvSehQ/fRZBHLoRyhliAcrcQfNGjiNIX8II9G4AzjVc0LTBx4ye810s612yjJYHlNstp67+4qYtDjWglqLpWbpmAaXVVwAYBDx60ZMLikHD2vuR7XrWW/0B8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236757; c=relaxed/simple; bh=HJ0qb7oUAaoxmDsZao082N7cLDcGDLFu+2qQv2Gc5Gs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j4Q4jR7MHUhWI6HisnCduqzIEMEA+UWSdbPVsD3YWfFSmc5UcI5xWZO5p8Kpl0/1NE71BAbPwdTj1ZlwtDy/k25G61PJCMdtoNBvhuWoQkZ9f2GE//9roumUN1ZjKR/VwNhR7FBSksTGYj4R68qyKStWGRgJDocyR7fNPmkbsc0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S/0Ya48K; 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="S/0Ya48K" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 39A56C2BCAF; Sun, 26 Apr 2026 20:52:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236757; bh=HJ0qb7oUAaoxmDsZao082N7cLDcGDLFu+2qQv2Gc5Gs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S/0Ya48KYKkrK37e94LOhSRnzfxTxt14tjEDmMpyuAEmdpPr/MpPbp3Isb6DiSJlG g023Jo+R7gYbNW7X5FYNE+ZkLLBl2BVuudJpdDT9G7/fdjtnr2YXsnfxAe1gX+fGVS 8iPf1vJepsINzLzdF1A7JjG/87G8eJwktjsszHJMtGh27ztaUdbdfm9E3X3e/QF3l8 iKi5CFIv+zuO6tMx9EAIYnp28uyWShjISOa5Ro7I3cafTL0JL2e4B39oB7Mcar64fu i+8YqOLe/2oacF8dnDUBtGdKfRuASXeEekr5PlNfxqi+pQd9/fyxS9M1w773Vc9p6D PZX8TQfQRSVxw== 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 08/19] mm/damon/paddr: support data attributes monitoring Date: Sun, 26 Apr 2026 13:52:09 -0700 Message-ID: <20260426205222.93895-9-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c index 5cdcc5037cbc1..cacfbf774ca4f 100644 --- a/mm/damon/paddr.c +++ b/mm/damon/paddr.c @@ -120,6 +120,50 @@ static unsigned int damon_pa_check_accesses(struct dam= on_ctx *ctx) return max_nr_accesses; } =20 +static bool damon_pa_filter_pass(phys_addr_t pa, struct damon_probe *p) +{ + struct damon_filter *f; + bool default_pass =3D true; + + damon_for_each_filter(f, p) { + bool matched =3D false; + + if (f->type =3D=3D DAMON_TEST_TYPE_ANON) { + struct folio *folio =3D damon_get_folio(PHYS_PFN(pa)); + + if (folio) + matched =3D folio_test_anon(folio); + } + if (matched) + return f->allow; + default_pass =3D !f->allow; + } + return default_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; + + damon_for_each_probe(p, ctx) { + phys_addr_t pa; + + pa =3D damon_pa_phys_addr(r->sampling_addr, + ctx->addr_unit); + if (damon_pa_filter_pass(pa, p)) + r->probe_hits[i]++; + i++; + } + } + } +} + /* * damos_pa_filter_out - Return true if the page should be filtered out. */ @@ -371,6 +415,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 Fri Jun 19 07:44:01 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 D0BB63033FB; Sun, 26 Apr 2026 20:52:37 +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=1777236757; cv=none; b=BDXJYLXe+wW5A3hUMfWwty5AL/9d+lLwEo1aT1rva6NvddaZXL3yObF/AkDrbAsbXN7e8GQGjs+PlmFutxiUe6CB8P2jr5c91UsddqEhSDx6pci00xMqKmZFYeevRlHj8eZ5Hy/ENzfS6yDHirfr5BUSw9mDqadsUi/McrRAwQk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236757; c=relaxed/simple; bh=MsWu2zyYAy4V2rgxAX8KgVIMloArlsZthg7SEALRXSU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u6g0R2VjCPoreeMcse+I0cbZoyQF5joYpIkB883GGj/9zsWCsqY07l6OCGWrT17ZSflFcS1XHslcsOoRhbPBt9oq9CkU3zcSkFVrpfgVrCxpC2Z9pHKoJs0u1NP4hMxHix3juRWQBEZo8aHmNe97lnKcQv0Vyn3dpNhKC23+FYw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ueKhhBVw; 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="ueKhhBVw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8C31CC2BCB6; Sun, 26 Apr 2026 20:52:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236757; bh=MsWu2zyYAy4V2rgxAX8KgVIMloArlsZthg7SEALRXSU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ueKhhBVwMR6jMZ/LjOfl2hzJDOZPBed2629Gzm+zgB5LaZGOehI0gdnBKtA0+zysQ 33ZS7ayJPnmmPZQzJjJwPO09V3faxejpoTHFXc7Rhdr4cl8wFI6QUHiHhJZmECpwN2 7PSx+FC8sheHDpSo5lVoW6ECe12Adv8nD2QaQHOU/qowWvqpJt9uB8Id4mjt/kMLGy /u6iekceO4NoCKCWW63K+wTdhxwzEjjLae0LyyrVKhxXKCndCrRpq3RORjrthiRfgD qoahDN5BJ9AXJh9A2m2948iD+gpr+7SEhd/vqMOvN9HnfpRQlWt3wSj1uuvrr4cDuB xMss2r93Zyp1w== 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 09/19] mm/damon/sysfs: implement probes dir Date: Sun, 26 Apr 2026 13:52:10 -0700 Message-ID: <20260426205222.93895-10-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 d5863cc33d230..ccd19fc062f31 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 Fri Jun 19 07:44:01 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 3157F304BDF; Sun, 26 Apr 2026 20:52:38 +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=1777236758; cv=none; b=I6EXkcNfjaBKzeos5RihgYsHXS1otG0sH6k+f1YnsAIvqnApwkrVVXIpQ46pmKK9EYJkChZzoIJCaWoSsbGMHxpVQKyEiF0hsZEoc+1ChC5s4XBccdmNue3oDJVR5awOKlVXi3pRMx9fT0bitf7rkVVapIBYGDSgotkL3WC8TwA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236758; c=relaxed/simple; bh=SZZB/8Y34d4c5OpPrN0Tt1+a+YDiqj7LFYZQ5Lka3iE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZUc/zIjzWcUIQ+0hnEbRxlaA5NfagSK8FcbX5P4UQmU/owpXdtOsGl8uplayxV3etn68ft83M9Hw301z/cquKhsQoreVqMt00DtjhYhOVaL2GeCNsfVqCA3uTVEUiRNI69OcZzj4trNj9SizjTykMDfs5wH29iVqUErh57oZkM4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RszYeCK/; 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="RszYeCK/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DFF33C2BCB4; Sun, 26 Apr 2026 20:52:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236758; bh=SZZB/8Y34d4c5OpPrN0Tt1+a+YDiqj7LFYZQ5Lka3iE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RszYeCK/blYhK2m9WFnoBbe2hjrXRWV+VXfeFXYKhrWVzfuV/d8YoeCV1o+t1txxv NJg6uGYJX4zqwrCX9E4Enfmy+ojzPihTFyS6EPM1Posl3NRIQ5FEaAGifgfVh+xb9V K9KuSYJ6NlzPFxZS4Hve8faBOuxDLtb3fTKS4K8wkeqFsq5G+XGKuEPEh7h2ozhEni hLt2iRka8fobuAqNWMjtR77IRjRVidj8+ohyq/u/wshqoLkKxX7OVx6A+zB7De8afi gUM69orKJE4naCQtC3GBQ3nbPDv6QG0dsjoK5fDheFBJGeUVcIyKF5G8982C57L4O4 etKo5RAMHabNA== 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 10/19] mm/damon/sysfs: implement probe dir Date: Sun, 26 Apr 2026 13:52:11 -0700 Message-ID: <20260426205222.93895-11-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 ccd19fc062f31..fac4e37aa2851 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); + +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 Fri Jun 19 07:44:01 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 B3A66308F3B; Sun, 26 Apr 2026 20:52:38 +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=1777236758; cv=none; b=JeAZPGybdZxQ0QnVMLkIVDVVBc8uJObp9UZpjhyimvEbPlS3y87lDRdenjRMBfnScEYllUjJVTyspcJDd6/WUmg8gJOgO8g6MMixgTQc/OXbaNZwqWLEz6semDUf9ORGd4fqgYPaXlYsZaXVewW4gor+KOrAGnb9vRnmegK7rmg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236758; c=relaxed/simple; bh=1X/9elsFEwb1GaGkMj7npSZAXZWCxyW00t9PKZHBG7M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iT+4ZvG10J0JRixZI7lsG57doi0OTQlwrUyirzWL3c2Tv/NmVK5X0TeVaoieVZmU7vxDD4cMTi7StLfeitAPRN2esu/+w0HReNk6UoWk6RatrLNfMplOAsnduYYVbuLJjC2nlAzzE2Mud7BL5ABmKmKfe+CDpD0uHrsAS14/CbI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uEjdlSR1; 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="uEjdlSR1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3D7DBC2BCB8; Sun, 26 Apr 2026 20:52:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236758; bh=1X/9elsFEwb1GaGkMj7npSZAXZWCxyW00t9PKZHBG7M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uEjdlSR1yVbl+gKDDdPas54B+DvBcCMZFzXzhSS9T/EwvC+WIjSxbcGSDCCpL1Ayv 0wpJERPKk9rxezxVGi7kk+WvSDh66h6U5zSpBjtdvHw9LtUe1p+dZHRpZl69kMuZ3k JcL83ApzIrGgGZvc+4BGSMaiPiwEB+FGx2QsUiu393OmrN1jc/CKwTufzK+wwJsiJg oVLzdlByWVLvJFWFdfmPgvPm5TeL67hX5zxBur8XnKce3VIe/QctKLyp7KYzpNJgjn gbhTUZJlYozYkqPyJZc6hyTUHKz879AO9LVAtpAKqQCx6TINPNOnKHVeASDwsQIC0l ZwXzeMMRIKPcA== 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 11/19] mm/damon/sysfs: implement filters directory Date: Sun, 26 Apr 2026 13:52:12 -0700 Message-ID: <20260426205222.93895-12-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 fac4e37aa2851..250208d3de21b 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 Fri Jun 19 07:44:01 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 EA0AA30AD00; Sun, 26 Apr 2026 20:52:38 +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=1777236759; cv=none; b=ZvK4wn6FYxcGqZGY2AcIZt7c+l9Oi9HK5aFIenaKjZvJIbsRlNka+aTBhSYnajLhka5yZdHe8nBSATBePQwjIM3skV/jwDN+7f4t6BHwzi4yhiRFL4SnyyJ42VQWAV8MmTcTEFP3oePsj7j3Xjax7O28wdDtjOAilJEv7rHDCeY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236759; c=relaxed/simple; bh=RwyqlL/z+o4fkUQKNxBQap95FJCMMs79UsQe2MpywvU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dNBS7QwQVtl/Rp23JOpyfuZPV55HlxJy7JCoTIj+BMXvK3Ic5p78ia+6fbtcOMetT6KFPTmjnqSKhI6rzVdoG/UaxDiCujbqfCf/xeC+6/4gurSGLGK2Z4MxVliLAAAZFNBFDlRUynDQyZ16uZsFIHYZJjSY6RL9OsfpIMBbpIw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YDgndp7j; 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="YDgndp7j" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8FFA6C2BCB4; Sun, 26 Apr 2026 20:52:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236758; bh=RwyqlL/z+o4fkUQKNxBQap95FJCMMs79UsQe2MpywvU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YDgndp7jN1PfXy2bb28amtVbildpF/U5g5j6n0mItxpbPyyGcBnlofjj7jSVd3aI9 fWd/aeV9+93ivO/j93n6EKq84oY6trRNCxA1yHfOqira9eEwa95sizpqv7GxBPkoFg UMX03Rdhq9QO6aKKlGOkYKp8OdeVKhMd5mF53roU3FGF+OqDcqmf5AS6CI0e6lx27d gycxXtEVX6Elrr8fWiybo+5wd8AEq8kDcC0T3M+iHBV+CIJCde0IuLtu6IR5BsZwV/ d89STqKfd5wC2yK6d2Zgu4ynK7Ntqg95mC3bvVQK2KrIdwdWaQCKaqRNuIAuFFQL+2 NCWU4pVitJgtQ== 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 12/19] mm/damon/sysfs: implement filter dir Date: Sun, 26 Apr 2026 13:52:13 -0700 Message-ID: <20260426205222.93895-13-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 250208d3de21b..25487a0268cbe 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 Fri Jun 19 07:44:01 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 3384530C608; Sun, 26 Apr 2026 20:52:39 +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=1777236759; cv=none; b=clQ93MZ5BaxFlE8sJQY0f1n2ElhcSC7rVOrI4jxvnJG2VUpXJKhZm0eVdVFqRFC3qkJSVgPaO0jh2Ty2KzHoO5Z6HDoNKV0+EjYonw9brb0qzJymI7OtWa5jLrnnkF+lRe0+neVWrT5SR58XOo9nRqcwd2xLCvv1uV+72CLPAFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236759; c=relaxed/simple; bh=3u3zgK6Y4SMO63Qqlb5LCCFkNgTg1crzSGGdU4/aQYU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a8CZNRXHyWblEtK4FLR1vYcrAnEmSclFcRtJRAtQYY58qN0KcUfVwDS3wiDw0z0dTUj2LzXrBDHAnvO/BkyQnVehCqJMD9lrHCHMAf5S4aMjhsKG9DrM9qNHKvjTBddgFDnzOWpno6zSvz58F4TKJmK2hWuFVxItFYf2le6/sSo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GCzEf8JI; 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="GCzEf8JI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E371EC2BCAF; Sun, 26 Apr 2026 20:52:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236759; bh=3u3zgK6Y4SMO63Qqlb5LCCFkNgTg1crzSGGdU4/aQYU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GCzEf8JIgKuwpVxirzBj9NGN5xAhR2irUV3Lb1yAmeF3PZERbNZfo+8cC4B4CJOZO FAoHkIPgEsVGzrRaYcu4XEGs+R4MV1PeQKv/iX5k1IoGTEKr9ib7lNXjXAqdN0bgIO Q2bKK05jk8ACq4gitwjtu2lly8FnyARRqSA0OtbcIxJpYLDAtU7BDNw/3ntTUkdHq1 TCHfjtOwDM40T4czjv+Dt22T9XAAIxvyAg0SRyCPAjCPNk2BvMBO17pSnGBqmuUg+O 0NuU6UPa4SW4ebsIeUu1YKqMgsFucs5+81wcVbJXnaZ/bUeBpFGQE4lLFTSQFQPGQF rYsm8wKbSyuhw== 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 13/19] mm/damon/sysfs: implement filter dir files Date: Sun, 26 Apr 2026 13:52:14 -0700 Message-ID: <20260426205222.93895-14-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 25487a0268cbe..2e0b7eca6bcbf 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_TEST_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 Fri Jun 19 07:44:01 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 89C8A30DD3C; Sun, 26 Apr 2026 20:52:39 +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=1777236759; cv=none; b=KUA8ChVzOLxh/TGDDXJwL+uRTSyZoDHBBhHmuzJx+/CMnL7gNwDSdJZUC0zKpkIrPJUHdWzUlDvJr1H3ZOEOMqn2oqjVr/C2iN2QU1GkzSehGZz5dUbwJ5kUAXHRnhAIlj9dQ4kKnF0R96U3i9UOOjbLhkKTFlQ8fmRZez+afNA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236759; c=relaxed/simple; bh=YkBI5K8l4kX9GxDYWU0L93ohTAXKAjjCaL6+mqVkPmk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kAKmy9KElBVdJv+mwkVLDclzsLzdZukPYNA+jY/4SR6Hf6I1Pjwu/iHbnfjlpEg2MtVG17H/PGLBvNOeZrkzbWH6ziMsmMEtwbUplWXo1584HTYK5z4KriBWpHDUCjh9qOT07hRlD35UhovPAwCThNDL0aRdfVNA6pBf4n6djqA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ie4ISYBB; 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="Ie4ISYBB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 428E7C2BCB6; Sun, 26 Apr 2026 20:52:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236759; bh=YkBI5K8l4kX9GxDYWU0L93ohTAXKAjjCaL6+mqVkPmk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ie4ISYBBbYbks+BRWXlN8FTrrPZPAbU077AJgFANVwD/kLYdI1OgtmoZX+j8cajXU b8rTYtiHOyYBocsuvSOcK72XG9M634CHBkY7D0t8eQHTgeiVa0ISodBBRt8OipRSDN 3zzJvgUYWBzCz26Luodu113b196lFHXF/lyNV6jIaeXpZRnYLUFRFhdeoWCm+tcSFs z73AvTRrN+na2Qbp6lsj0GUCbcodwiDNYtjPcVD32hpG/WSmDamlmRDCm8VTVwdzF4 WAQZa0E9do+5y+CKpKG2+JoWKlGIycRjypC0f5UVNs569nhKhuRGuZCEIi2mg309o5 ksNHeCcJQq6Tg== 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 14/19] mm/damon/sysfs: setup probes on DAMON core API parameters Date: Sun, 26 Apr 2026 13:52:15 -0700 Message-ID: <20260426205222.93895-15-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 2e0b7eca6bcbf..8007961295d3d 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -1855,6 +1855,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 *t; + + t =3D damon_new_filter(sys_filter->type, + sys_filter->matching, + sys_filter->allow); + if (!t) + return -ENOMEM; + damon_add_filter(c, t); + } + } + return 0; +} + static int damon_sysfs_set_regions(struct damon_target *t, struct damon_sysfs_regions *sysfs_regions, unsigned long min_region_sz) @@ -1967,6 +2001,9 @@ static int damon_sysfs_apply_inputs(struct damon_ctx = *ctx, DAMON_MIN_REGION_SZ / sys_ctx->addr_unit, 1); ctx->pause =3D sys_ctx->pause; 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 Fri Jun 19 07:44:01 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 1602B310652; Sun, 26 Apr 2026 20:52:39 +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=1777236760; cv=none; b=pmQQq/6FPy9i0G6WRI0RTroP9XjhoE/AyGt6lW+mQPqFxkYk6fiY+0JMy8A4VpdkCG3j83lnBOu0yaJNa1v7DGvquu+ssOsIvEy/+9J9oK+5AfuXcJZlvDv36KueOQGsBUGPrdpodVW8iel8prwP57X19rzvwesq3lCTFoUS8bU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236760; c=relaxed/simple; bh=n8NHvN0HAPPSe4MQZU6Swveu54v2WkmDhfNoQjsKaCo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r0OaIN/idcWWipoFCVERv7AgCEF4Oloh1N7/Zpizje4Gp/oteGwwWHGcPWaPF7MlK0pW4zkqdUfSfSz2NpQXMYP5+wnj8U2oVZUz4MLYvRerRfLMoV6gUdlXjWC7uThtHA329QaXMSxDUDUQsvB/IrBrqN717Tscs3FiE5ehb8k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NH9APUYW; 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="NH9APUYW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 970B4C2BCF4; Sun, 26 Apr 2026 20:52:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236759; bh=n8NHvN0HAPPSe4MQZU6Swveu54v2WkmDhfNoQjsKaCo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NH9APUYWZFrbBawnXc54h5wO3jk22Ljsb8FDaKjTPE4XtsmgvJsPZWYjK7R+cE1oC 9E4cSDT7r3TU0S8msSsBt0coiwCm78j4lonit803zJjWXwVgLf45ncS0frVteVeilU 3WllJgUzE9vksddpywRtfMEM77ScUhUc47u7VmPm3zEfNx2QbIEUqb3Q9CPvxuVwzX H1hGcCSB63BG32JEsucHLoiInOAUEn25GLjBFF8Tz7a+67ib7WNeuxBTIEnmPiyjZn 16wEiGIygzm+g9iwxzJ5M89VcwKnk0j0qEGYqAKxQt/MYgMYJVMKqB1tFNg+Ievn5A bFup5naqx51XQ== 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 15/19] mm/damon/sysfs-schemes: implement tried_region/probe_hits file Date: Sun, 26 Apr 2026 13:52:16 -0700 Message-ID: <20260426205222.93895-16-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 file for letting users read the per-region per-probe positive samples count. Signed-off-by: SeongJae Park --- mm/damon/sysfs-schemes.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index c3c1ff6108863..48a949484a052 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -20,6 +20,7 @@ struct damon_sysfs_scheme_region { unsigned int nr_accesses; unsigned int age; unsigned long sz_filter_passed; + unsigned char probe_hits[DAMON_MAX_PROBES]; struct list_head list; }; =20 @@ -34,6 +35,9 @@ static struct damon_sysfs_scheme_region *damon_sysfs_sche= me_region_alloc( sysfs_region->ar =3D region->ar; sysfs_region->nr_accesses =3D region->nr_accesses_bp / 10000; sysfs_region->age =3D region->age; + memcpy(sysfs_region->probe_hits, region->probe_hits, + sizeof(*sysfs_region->probe_hits) * + ARRAY_SIZE(sysfs_region->probe_hits)); INIT_LIST_HEAD(&sysfs_region->list); return sysfs_region; } @@ -83,6 +87,28 @@ static ssize_t sz_filter_passed_show(struct kobject *kob= j, return sysfs_emit(buf, "%lu\n", region->sz_filter_passed); } =20 +static ssize_t probe_hits_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_scheme_region *region =3D container_of(kobj, + struct damon_sysfs_scheme_region, kobj); + char *str; + int ret, i; + + str =3D kcalloc(2048, sizeof(*str), GFP_KERNEL); + if (!str) + return -ENOMEM; + for (i =3D 0; i < DAMON_MAX_PROBES; i++) { + snprintf(&str[strlen(str)], 2048 - strlen(str), "%hhu", + region->probe_hits[i]); + if (i < DAMON_MAX_PROBES - 1) + snprintf(&str[strlen(str)], 2048 - strlen(str), ","); + } + ret =3D sysfs_emit(buf, "%s\n", str); + kfree(str); + return ret; +} + static void damon_sysfs_scheme_region_release(struct kobject *kobj) { struct damon_sysfs_scheme_region *region =3D container_of(kobj, @@ -107,12 +133,16 @@ static struct kobj_attribute damon_sysfs_scheme_regio= n_age_attr =3D static struct kobj_attribute damon_sysfs_scheme_region_sz_filter_passed_at= tr =3D __ATTR_RO_MODE(sz_filter_passed, 0400); =20 +static struct kobj_attribute damon_sysfs_scheme_region_probe_hits_attr =3D + __ATTR_RO_MODE(probe_hits, 0400); + static struct attribute *damon_sysfs_scheme_region_attrs[] =3D { &damon_sysfs_scheme_region_start_attr.attr, &damon_sysfs_scheme_region_end_attr.attr, &damon_sysfs_scheme_region_nr_accesses_attr.attr, &damon_sysfs_scheme_region_age_attr.attr, &damon_sysfs_scheme_region_sz_filter_passed_attr.attr, + &damon_sysfs_scheme_region_probe_hits_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_scheme_region); --=20 2.47.3 From nobody Fri Jun 19 07:44:01 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 8F6243148D3; Sun, 26 Apr 2026 20:52:40 +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=1777236760; cv=none; b=JIODRI0Svsp/sOr15Wn0sJhWx44V+Zd9zt++s9SaDj7ElzNU9KJwDb0NmU6Yf6WQSyDcIigRJTHYIzBjACvL9P/OB+NLwgsW0H/gnMSwKDQVX/oNlX/sjJQKsf0usMdYPbsj3vVtZa+UBCcrp1Z23n9E483mx2MtqLKsDq+HIyw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236760; c=relaxed/simple; bh=+a7yddQciqqedy5ZtwOx7GN0gf1QkvZ1siaztRsfHgQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mTXcZ3hOxt5+crOAFBvDmUWmi74ts8j2T7ghtQGYU165NHJz+MnfFgaotm55sFr/RZQ16XZ9qT8QjZ8JS2IumgC6+J1wiR9eLf5GlcIxq4KDmUioOuJnfCAHFbYULfXEzBJQYBJx3GShLNRYSkAnoEgugtJByC6xOZc+Drt7tDI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XueNJUqJ; 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="XueNJUqJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB18EC2BCB9; Sun, 26 Apr 2026 20:52:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236760; bh=+a7yddQciqqedy5ZtwOx7GN0gf1QkvZ1siaztRsfHgQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XueNJUqJZxVOF0+nCu81W73Mun0zKB4VqEyoU8g4s5CAtrjiTruK9zvTirpu4L8cJ jBBt/Evy/xW27IQjHPwK49MHrkWVWLb+jkvgXH/bdIK9UON6ceLjLnrjG0X6QUKxdD PmLFt0zBMdWppzB8Pgc8QXExTy4exESNBfaWrxNo2vLjfifc1XznkA7lg3MYou2edR rULL3h6aQbqYiLlveadLZsukd7kQyGQMtVk6YQWnirRHV9PFfqJa6YxJUkahzYfh9f wzhQhh5ypTUQ3UP7s0cdmKfiTg93GOEdrJVKoTYCFtGCJm9tcU3J9M5Zzkj0jCpnPd 95hpqoQGgQUuA== 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 16/19] mm/damon: trace probe_hits Date: Sun, 26 Apr 2026 13:52:17 -0700 Message-ID: <20260426205222.93895-17-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 | 41 ++++++++++++++++++++++++++++++++++++ mm/damon/core.c | 1 + 2 files changed, 42 insertions(+) diff --git a/include/trace/events/damon.h b/include/trace/events/damon.h index 7e25f4469b81b..121d7bc3a2c27 100644 --- a/include/trace/events/damon.h +++ b/include/trace/events/damon.h @@ -130,6 +130,47 @@ TRACE_EVENT(damon_monitor_intervals_tune, TP_printk("sample_us=3D%lu", __entry->sample_us) ); =20 +TRACE_EVENT(damon_aggregated_v2, + + TP_PROTO(unsigned int target_id, struct damon_region *r, + unsigned int nr_regions), + + TP_ARGS(target_id, r, nr_regions), + + TP_STRUCT__entry( + __field(unsigned long, target_id) + __field(unsigned int, nr_regions) + __field(unsigned long, start) + __field(unsigned long, end) + __field(unsigned int, nr_accesses) + __field(unsigned int, age) + __field(unsigned char, probe_hit0) + __field(unsigned char, probe_hit1) + __field(unsigned char, probe_hit2) + __field(unsigned char, probe_hit3) + ), + + TP_fast_assign( + __entry->target_id =3D target_id; + __entry->nr_regions =3D nr_regions; + __entry->start =3D r->ar.start; + __entry->end =3D r->ar.end; + __entry->nr_accesses =3D r->nr_accesses; + __entry->age =3D r->age; + __entry->probe_hit0 =3D r->probe_hits[0]; + __entry->probe_hit1 =3D r->probe_hits[1]; + __entry->probe_hit2 =3D r->probe_hits[2]; + __entry->probe_hit3 =3D r->probe_hits[3]; + ), + + TP_printk("target_id=3D%lu nr_regions=3D%u %lu-%lu: %u %u %hhu %hhu %hhu = %hhu", + __entry->target_id, __entry->nr_regions, + __entry->start, __entry->end, + __entry->nr_accesses, __entry->age, + __entry->probe_hit0, __entry->probe_hit1, + __entry->probe_hit2, __entry->probe_hit3) +); + 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 fe14971d72747..54834b74efef4 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1924,6 +1924,7 @@ static void kdamond_reset_aggregated(struct damon_ctx= *c) int i; =20 trace_damon_aggregated(ti, r, damon_nr_regions(t)); + trace_damon_aggregated_v2(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; --=20 2.47.3 From nobody Fri Jun 19 07:44:01 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 D71542F3C26; Sun, 26 Apr 2026 20:52:40 +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=1777236760; cv=none; b=H0sUxuohMzlsKoHi7fQnkePN5GjFDZut4M2pUf2ogNWKRlBsgA4gfCze/2xBw6Pp8DyRUa0ZzT+OE/ZllENsi+b4mh5jB6uH81Sh0i3maVlKxuSlF6H/QZWPunym37nrgdgUtgabzrpsW/3SHRru9hfKa7GrsPzQ8u4gdQbBVTE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236760; c=relaxed/simple; bh=EauBIBzKjl6rFCRlEGSo/s6NrgLL9HoVh8TIqUsq9vs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uv5Cj5pMR4uyd/tPO0QjhmFyTk8H6Yw30fbnv5fB47oPPVK/ZgWN7JioML0JOdtVbViriobK8iA45c+vuHsjLetEUMuCCDoNflBzMsQf+gvp8uqpzQLQwPKbR+JFgO3KOvzske3WhZpLKKgp3oPLXe8P5ypOGbTljo15F3bUsk4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gRx7UFjK; 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="gRx7UFjK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 76993C2BCC6; Sun, 26 Apr 2026 20:52:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236760; bh=EauBIBzKjl6rFCRlEGSo/s6NrgLL9HoVh8TIqUsq9vs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gRx7UFjKG7iVz+GBgkB2NmPpNVPR17CgtwZ/i2OJDocLdRNO/cyy/JAcgUfnzrADA T3VkslyLFV+bjCWVyIyyCc1gHTvMiha4EuOIpjqYzHU7lPZNkWX3lQkTfbZXE0+mDg kFeTjAO9roxZMD3wrgRcG1+scESM5dczc1DR6QNGQiERnv+TxkDGYXQ19h0LWH29S2 oZNiJIJRW8DIa1mZl9MefTbCVtwvBD5u7tKvkcjgmKFRArMx18X9M3+dILfcX+Vyw/ cDlmsVCBULjjjwokPNCFDUFKtytHBttrMIcFAUEXme6capLt1uprvgpHISbnZNpj+v GQ8E1rc9gtC0A== 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 17/19] selftests/damon/sysfs.sh: test probes dir Date: Sun, 26 Apr 2026 13:52:18 -0700 Message-ID: <20260426205222.93895-18-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 Fri Jun 19 07:44:01 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 864A92F7478; Sun, 26 Apr 2026 20:52:41 +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=1777236761; cv=none; b=en8TCU7DdG2p692A2WiHZEvhiAVqt2FStgkuw/euCkVFRYHEOO0vWZkK4OX3i3NWR6/cJY2RGGX5Psy9OLbcelZkXSKbPjuF4FkXkGpmAmFla2laBlW3AzFOCZ/RRMRm8st48cq0PcpouWeJurs0mu5D+awI+fQXY1dU8GOVL3A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236761; c=relaxed/simple; bh=wSosBJ8m1YWd2zOlUhMAmjSvy68tqvEfvThHsZfgYFY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YTC9bgM/94KkUD21z5Wz70luf25cXsetXEr88BhVTQVTak+sYz/gzhwDzlk8V4NaOdD814E1YLHZmfOwVhrlH/TBk7qZZgo1CT3GyToS7P90bzQxM96BcYuYM/E24uqytUrpelnyLendeZZq2lWY9cOpsHosFGM8CZ2Yk8BT1og= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eKei9MSL; 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="eKei9MSL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D4EE4C2BCAF; Sun, 26 Apr 2026 20:52:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236761; bh=wSosBJ8m1YWd2zOlUhMAmjSvy68tqvEfvThHsZfgYFY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eKei9MSLej3nBQoIt35TXjx08PyE2lIFrsCiVH0/Db+cqf2NdpqutXo1dWu15EuW6 W+yz70+C8plwYoW+u2T/GwzygsHdjMmeQmAjxz/NZiaxeu9gGDc70DSykNKBsDKpx4 bdigEK/hhI6sjbUTEo77Tjw2+l6356TPUKMcwQHJM2WCcbSLbXLyoxXx4pAIagyhxx WA0Nwe69ZaQRWBakOMonl5LWFPWsN3WhUmD93EPngyblc55ZUzTIzx81XzwD29fF2v eCInb9rkNMxRMXcnJ0koevDoFalxQo/ehg/rFqbYUIHCnp4rPEADrPbL+6WKSWay6T CH08RjmYjyPeg== 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 18/19] Docs/mm/damon/design: document data attributes monitoring Date: Sun, 26 Apr 2026 13:52:19 -0700 Message-ID: <20260426205222.93895-19-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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 | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/des= ign.rst index fa7392b5a331d..bada2010ad1ca 100644 --- a/Documentation/mm/damon/design.rst +++ b/Documentation/mm/damon/design.rst @@ -276,6 +276,41 @@ 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 that similar to +:ref:`DAMOS filter `. + +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 Fri Jun 19 07:44:01 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 5AB193242B5; Sun, 26 Apr 2026 20:52:42 +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=1777236762; cv=none; b=ELxN5H9712qGq3cl05Ej/QhhrH4dgavodG4K26MmgxzeLzfMZNowoiC+QSxAqyrKHv3/JzEbYbRWwHQ3Qbd9BC1WAeXkiT3Q37RPQ8863hwQH7jmtQ4rGXXGSL04cXqV4bFjEUvUujfJrXtstbLVVUAHVoQ+7r8OeLWAe4cDDAA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777236762; c=relaxed/simple; bh=jWZtEYC4wpgJ869rcJBTeYX65E0OwiGQ6QxZ8akF1Bo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FYKRlDzKpQcfBKy2hFy96D5RDwlyo3BmjLG4nNJ0VPU4FN92rcVQbKZJlp0LLD/rBl0zgmYW2Q30m8bQFybbVE0WrNN+LCuGcYhU3ZM4r7CEFupaRm/+nyCbmS+4w73ssEsBwGnzhg2bbjkuy0OjBXMZctlCORNw+AUnk8LPZK4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Wik89Mgn; 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="Wik89Mgn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8609FC2BCB6; Sun, 26 Apr 2026 20:52:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777236762; bh=jWZtEYC4wpgJ869rcJBTeYX65E0OwiGQ6QxZ8akF1Bo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Wik89Mgnzr4HtAStJRJvoasrrOnWhUE5QGd6dU6Xxi8DeHbnuTzMW8ljVuivcZ89w PY7vZ8SEXqIwgbJE7wgwxeBfRI4yVyYCqYE2phydAfUfXpUykiihIt5fpXQ0RptNFp FqVAi9KnoKTd0z7oAGpdeOa9LiAyrrXZI4kmUDrR8BPq7CXTrTN5msGUX7jPX+2R6z t574ji7UaEa1EGRijZoxd5rbN+lyxQzgD/85Q7SYTgpME/Wv+go7g6IWVb6jAwuQOC 2gz3d8yID0Ml8SiBFwVIkcvnalDJtg8QE7ghiuv742aYgwV85wcL4vqxV9LCNXcqsz t5dpBRMwjIwNQ== 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 19/19] Docs/admin-guide/mm/damon/usage: document data attributes monitoring Date: Sun, 26 Apr 2026 13:52:20 -0700 Message-ID: <20260426205222.93895-20-sj@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260426205222.93895-1-sj@kernel.org> References: <20260426205222.93895-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, 39 insertions(+), 7 deletions(-) diff --git a/Documentation/admin-guide/mm/damon/usage.rst b/Documentation/a= dmin-guide/mm/damon/usage.rst index 11c75a598393c..397820ac8bbb0 100644 --- a/Documentation/admin-guide/mm/damon/usage.rst +++ b/Documentation/admin-guide/mm/damon/usage.rst @@ -72,6 +72,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 =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 =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 @@ -97,7 +102,8 @@ comma (","). =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/id,weight =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 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 probe_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 ... @@ -227,8 +233,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, two directories, ``intervals``, ``nr_regions`` and ``probes`` +exist in this directory. =20 Under ``intervals`` directory, three files for DAMON's sampling interval (``sample_us``), aggregation interval (``aggr_us``), and update interval @@ -262,6 +268,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`` exist. The directory +contains files for installingt filters for the probe, that is used to dete= rmine +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 work in= a +way similar to that for :ref:`DAMOS filter `. + .. _sysfs_targets: =20 contexts//targets/ @@ -614,10 +641,13 @@ set the ``access pattern`` as their interested patter= n that they want to query. 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 -show the properties of the region that corresponding DAMON-based operation -scheme ``action`` has tried to be applied. +In each region directory, you will find six files (``start``, ``end``, +``nr_accesses``, ``age``, ``sz_filter_passed`` and ``probe_hits``). Readi= ng +the files will show the properties of the region that corresponding DAMON-= based +operation scheme ``action`` has tried to be applied. + +Reading ``probe_hists`` shows the number of data attributes monitoring +probe-hit positive samples of the region. =20 Example ~~~~~~~ diff --git a/Documentation/mm/damon/design.rst b/Documentation/mm/damon/des= ign.rst index bada2010ad1ca..2b68a1880a4a1 100644 --- a/Documentation/mm/damon/design.rst +++ b/Documentation/mm/damon/design.rst @@ -276,6 +276,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