selftests/damon/_damon_sysfs: support DAMOS watermarks setup

Patch series "selftests/damon/sysfs.py: test all parameters".

sysfs.py tests if DAMON sysfs interface is passing the user-requested
parameters to DAMON as expected.  But only the default (minimum)
parameters are being tested.  This is partially because _damon_sysfs.py,
which is the library for making the parameter requests, is not supporting
the entire parameters.  The internal DAMON status dump script
(drgn_dump_damon_status.py) is also not dumping entire parameters.  Extend
the test coverage by updating parameters input and status dumping scripts
to support all parameters, and writing additional tests using those.

This increased test coverage actually found one real bug
(https://lore.kernel.org/20250719181932.72944-1-sj@kernel.org).

First seven patches (1-7) extend _damon_sysfs.py for all parameters setup.
The eight patch (8) fixes _damon_sysfs.py to use correct max nr_acceses
and age values for their type.  Following three patches (9-11) extend
drgn_dump_damon_status.py to dump full DAMON parameters.  Following nine
patches (12-20) refactor sysfs.py for general testing code reuse, and
extend it for full parameters check.  Finally, two patches (21 and 22) add
test cases in sysfs.py for full parameters testing.


This patch (of 22):

_damon_sysfs.py contains code for test-purpose DAMON sysfs interface
control.  Add support of DAMOS watermarks setup for more tests.

Link: https://lkml.kernel.org/r/20250720171652.92309-1-sj@kernel.org
Link: https://lkml.kernel.org/r/20250720171652.92309-2-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
SeongJae Park 2025-07-20 10:16:31 -07:00 committed by Andrew Morton
parent cf20cb9ad1
commit 6da5e2961f

View File

@ -165,6 +165,42 @@ class DamosQuota:
return err
return None
class DamosWatermarks:
metric = None
interval = None
high = None
mid = None
low = None
scheme = None # owner scheme
def __init__(self, metric='none', interval=0, high=0, mid=0, low=0):
self.metric = metric
self.interval = interval
self.high = high
self.mid = mid
self.low = low
def sysfs_dir(self):
return os.path.join(self.scheme.sysfs_dir(), 'watermarks')
def stage(self):
err = write_file(os.path.join(self.sysfs_dir(), 'metric'), self.metric)
if err is not None:
return err
err = write_file(os.path.join(self.sysfs_dir(), 'interval_us'),
self.interval)
if err is not None:
return err
err = write_file(os.path.join(self.sysfs_dir(), 'high'), self.high)
if err is not None:
return err
err = write_file(os.path.join(self.sysfs_dir(), 'mid'), self.mid)
if err is not None:
return err
err = write_file(os.path.join(self.sysfs_dir(), 'low'), self.low)
if err is not None:
return err
class DamosStats:
nr_tried = None
sz_tried = None
@ -190,6 +226,7 @@ class Damos:
action = None
access_pattern = None
quota = None
watermarks = None
apply_interval_us = None
# todo: Support watermarks, stats
idx = None
@ -199,12 +236,15 @@ class Damos:
tried_regions = None
def __init__(self, action='stat', access_pattern=DamosAccessPattern(),
quota=DamosQuota(), apply_interval_us=0):
quota=DamosQuota(), watermarks=DamosWatermarks(),
apply_interval_us=0):
self.action = action
self.access_pattern = access_pattern
self.access_pattern.scheme = self
self.quota = quota
self.quota.scheme = self
self.watermarks = watermarks
self.watermarks.scheme = self
self.apply_interval_us = apply_interval_us
def sysfs_dir(self):
@ -227,9 +267,7 @@ class Damos:
if err is not None:
return err
# disable watermarks
err = write_file(
os.path.join(self.sysfs_dir(), 'watermarks', 'metric'), 'none')
err = self.watermarks.stage()
if err is not None:
return err