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 v1.1 3/6] selftests/damon/_damon_sysfs: implement DamonProbes
Date: Wed, 29 Jul 2026 21:39:40 -0700 [thread overview]
Message-ID: <20260730043944.146030-4-sj@kernel.org> (raw)
In-Reply-To: <20260730043944.146030-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 | 125 +++++++++++++++++-
1 file changed, 124 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/selftests/damon/_damon_sysfs.py
index e6a2265d721e8..94bf0aaae9f59 100644
--- a/tools/testing/selftests/damon/_damon_sysfs.py
+++ b/tools/testing/selftests/damon/_damon_sysfs.py
@@ -558,6 +558,117 @@ 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)
+ if err is not None:
+ return err
+ 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 +676,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 +689,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 +702,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 +734,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-30 4:39 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-30 4:39 [RFC PATCH v1.1 0/6] mm/damon: add kunit and selftests for probes and probe weights SJ Park
2026-07-30 4:39 ` [RFC PATCH v1.1 1/6] mm/damon/tests/core-kunit: test damon_commit_filter() SJ Park
2026-07-30 4:39 ` [RFC PATCH v1.1 2/6] mm/damon/tests/core-kunit: add damon_commit_probes() test SJ Park
2026-07-30 4:39 ` SJ Park [this message]
2026-07-30 4:39 ` [RFC PATCH v1.1 4/6] selftests/damon/drgn_dump_damon_status: dump probes SJ Park
2026-07-30 4:39 ` [RFC PATCH v1.1 5/6] selftests/damon/sysfs.py: extend commit assertion function for probes SJ Park
2026-07-30 4:39 ` [RFC PATCH v1.1 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=20260730043944.146030-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.