From: SJ Park <sj@kernel.org>
Cc: SJ Park <sj@kernel.org>, Shuah Khan <shuah@kernel.org>,
damon@lists.linux.dev, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org, linux-mm@kvack.org
Subject: [RFC PATCH 3/6] selftests/damon/_damon_sysfs: implement DamonProbes
Date: Wed, 29 Jul 2026 07:47:34 -0700 [thread overview]
Message-ID: <20260729144738.90895-4-sj@kernel.org> (raw)
In-Reply-To: <20260729144738.90895-1-sj@kernel.org>
Extend _damon_sysfs.py to support staging and committing DAMON probes.
It will be used for setting DAMON probes via sysfs changes for testing
purposes.
Signed-off-by: SJ Park <sj@kernel.org>
---
tools/testing/selftests/damon/_damon_sysfs.py | 123 +++++++++++++++++-
1 file changed, 122 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/selftests/damon/_damon_sysfs.py
index e6a2265d721e8..d6afb5b2f0a4a 100644
--- a/tools/testing/selftests/damon/_damon_sysfs.py
+++ b/tools/testing/selftests/damon/_damon_sysfs.py
@@ -558,6 +558,115 @@ class IntervalsGoal:
return err
return None
+class DamonFilter:
+ type_ = None
+ matching = None
+ allow = None
+ filters = None
+ path = None
+ idx = None
+
+ def __init__(self, type_='anon', matching=False, allow=False, path=None):
+ self.type_ = type_
+ self.matching = matching
+ self.allow = allow
+ self.path = path
+
+ def sysfs_dir(self):
+ return os.path.join(self.filters.sysfs_dir(), '%d' % self.idx)
+
+ def stage(self):
+ err = write_file(os.path.join(self.sysfs_dir(), 'type'), self.type_)
+ if err is not None:
+ return err
+ err = write_file(os.path.join(self.sysfs_dir(), 'matching'),
+ 'Y' if self.matching else 'N')
+ if err is not None:
+ return err
+ err = write_file(os.path.join(self.sysfs_dir(), 'allow'),
+ 'Y' if self.allow else 'N')
+ if err is not None:
+ return err
+ if self.type_ == 'memcg':
+ err = write_file(os.path.join(self.sysfs_dir(), 'path'), self.path)
+ if err is not None:
+ return err
+ return None
+
+class DamonFilters:
+ filters = None
+ probe = None
+
+ def __init__(self, filters=None):
+ if filters is None:
+ filters = []
+ self.filters = filters
+ for idx, filter in enumerate(self.filters):
+ filter.filters = self
+ filter.idx = idx
+
+ def sysfs_dir(self):
+ return os.path.join(self.probe.sysfs_dir(), 'filters')
+
+ def stage(self):
+ err = write_file(
+ os.path.join(self.sysfs_dir(), 'nr_filters'),
+ len(self.filters))
+ if err is not None:
+ return err
+ for filter in self.filters:
+ err = filter.stage()
+ if err is not None:
+ return err
+ return None
+
+class DamonProbe:
+ weight = None
+ filters = None
+ probes = None
+ idx = None
+
+ def __init__(self, weight=0, filters=None):
+ self.weight = weight
+ if filters is None:
+ filters = DamonFilters()
+ self.filters = filters
+ self.filters.probe = self
+
+ def sysfs_dir(self):
+ return os.path.join(self.probes.sysfs_dir(), '%d' % self.idx)
+
+ def stage(self):
+ err = write_file(
+ os.path.join(self.sysfs_dir(), 'weight'), '%d' % self.weight)
+ return self.filters.stage()
+
+class DamonProbes:
+ probes = None
+ attrs = None
+
+ def __init__(self, probes=None):
+ if probes is None:
+ probes = []
+ self.probes = probes
+ for idx, probe in enumerate(self.probes):
+ probe.probes = self
+ probe.idx = idx
+
+ def sysfs_dir(self):
+ return os.path.join(self.attrs.sysfs_dir(), 'probes')
+
+ def stage(self):
+ err = write_file(os.path.join(self.sysfs_dir(), 'nr_probes'),
+ len(self.probes))
+ if err is not None:
+ return err
+ for probe in self.probes:
+ err = probe.stage()
+ if err is not None:
+ return err
+ return None
+
class DamonAttrs:
sample_us = None
aggr_us = None
@@ -565,11 +674,12 @@ class DamonAttrs:
update_us = None
min_nr_regions = None
max_nr_regions = None
+ probes = None
context = None
def __init__(self, sample_us=5000, aggr_us=100000,
intervals_goal=IntervalsGoal(), update_us=1000000,
- min_nr_regions=10, max_nr_regions=1000):
+ min_nr_regions=10, max_nr_regions=1000, probes=None):
self.sample_us = sample_us
self.aggr_us = aggr_us
self.intervals_goal = intervals_goal
@@ -577,6 +687,10 @@ class DamonAttrs:
self.update_us = update_us
self.min_nr_regions = min_nr_regions
self.max_nr_regions = max_nr_regions
+ if probes is None:
+ probes = DamonProbes()
+ self.probes = probes
+ self.probes.attrs = self
def interval_sysfs_dir(self):
return os.path.join(self.context.sysfs_dir(), 'monitoring_attrs',
@@ -586,6 +700,9 @@ class DamonAttrs:
return os.path.join(self.context.sysfs_dir(), 'monitoring_attrs',
'nr_regions')
+ def sysfs_dir(self):
+ return os.path.join(self.context.sysfs_dir(), 'monitoring_attrs')
+
def stage(self):
err = write_file(os.path.join(self.interval_sysfs_dir(), 'sample_us'),
self.sample_us)
@@ -615,6 +732,10 @@ class DamonAttrs:
if err is not None:
return err
+ err = self.probes.stage()
+ if err is not None:
+ return err
+
class DamonCtx:
ops = None
monitoring_attrs = None
--
2.47.3
next prev parent reply other threads:[~2026-07-29 14:48 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-29 14:47 [RFC PATCH 0/6] mm/damon: add kunit and selftests for probes and probe weights SJ Park
2026-07-29 14:47 ` [RFC PATCH 1/6] mm/damon/tests/core-kunit: test damon_commit_filter() SJ Park
2026-07-29 14:47 ` [RFC PATCH 2/6] mm/damon/tests/core-kunit: add damon_commit_probes() test SJ Park
2026-07-29 14:47 ` SJ Park [this message]
2026-07-29 14:47 ` [RFC PATCH 4/6] selftests/damon/drgn_dump_damon_status: dump probes SJ Park
2026-07-29 14:47 ` [RFC PATCH 5/6] selftests/damon/sysfs.py: extend commit assertion function for probes SJ Park
2026-07-29 14:47 ` [RFC PATCH 6/6] selftests/damon/sysfs.py: test damon probes SJ Park
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260729144738.90895-4-sj@kernel.org \
--to=sj@kernel.org \
--cc=damon@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox