Linux Kernel Selftest development
 help / color / mirror / Atom feed
* [PATCH 00/10] mm/damon: misc fixes and improvements
@ 2024-05-03 18:03 SeongJae Park
  2024-05-03 18:03 ` [PATCH 02/10] selftests/damon/_damon_sysfs: check errors from nr_schemes file reads SeongJae Park
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: SeongJae Park @ 2024-05-03 18:03 UTC (permalink / raw)
  To: Andrew Morton
  Cc: SeongJae Park, Jonathan Corbet, Shuah Khan, damon, linux-mm,
	linux-doc, linux-kselftest, linux-kernel

Add miscelleneous and non-urgent fixes and improvements for DAMON code,
selftests, and documents.

SeongJae Park (10):
  mm/damon/core: initialize ->esz_bp from damos_quota_init_priv()
  selftests/damon/_damon_sysfs: check errors from nr_schemes file reads
  selftests/damon/_damon_sysfs: find sysfs mount point from /proc/mounts
  selftests/damon/_damon_sysfs: use 'is' instead of '==' for 'None'
  selftests/damon: classify tests for functionalities and regressions
  Docs/admin-guide/mm/damon/usage: fix wrong example of DAMOS filter
    matching sysfs file
  Docs/admin-guide/mm/damon/usage: fix wrong schemes effective quota
    update command
  Docs/mm/damon/design: use a list for supported filters
  Docs/mm/damon/maintainer-profile: change the maintainer's timezone
    from PST to PT
  Docs/mm/damon/maintainer-profile: allow posting patches based on
    damon/next tree

 Documentation/admin-guide/mm/damon/usage.rst  |  6 +-
 Documentation/mm/damon/design.rst             | 46 +++++----
 Documentation/mm/damon/maintainer-profile.rst | 13 +--
 mm/damon/core.c                               |  1 +
 tools/testing/selftests/damon/Makefile        | 13 ++-
 tools/testing/selftests/damon/_damon_sysfs.py | 95 +++++++++++--------
 6 files changed, 100 insertions(+), 74 deletions(-)


base-commit: fc7314cb6b750187a1366e0bf9da4c3ca8cfd064
-- 
2.39.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 02/10] selftests/damon/_damon_sysfs: check errors from nr_schemes file reads
  2024-05-03 18:03 [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park
@ 2024-05-03 18:03 ` SeongJae Park
  2024-05-03 18:03 ` [PATCH 03/10] selftests/damon/_damon_sysfs: find sysfs mount point from /proc/mounts SeongJae Park
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: SeongJae Park @ 2024-05-03 18:03 UTC (permalink / raw)
  To: Andrew Morton
  Cc: SeongJae Park, Shuah Khan, damon, linux-mm, linux-kselftest,
	linux-kernel

DAMON context staging method in _damon_sysfs.py is not checking the
returned error from nr_schemes file read.  Check it.

Fixes: f5f0e5a2bef9 ("selftests/damon/_damon_sysfs: implement kdamonds start function")
Signed-off-by: SeongJae Park <sj@kernel.org>
---
 tools/testing/selftests/damon/_damon_sysfs.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/selftests/damon/_damon_sysfs.py
index f80fdcef507c..fffa74a78bd7 100644
--- a/tools/testing/selftests/damon/_damon_sysfs.py
+++ b/tools/testing/selftests/damon/_damon_sysfs.py
@@ -341,6 +341,8 @@ class DamonCtx:
         nr_schemes_file = os.path.join(
                 self.sysfs_dir(), 'schemes', 'nr_schemes')
         content, err = read_file(nr_schemes_file)
+        if err is not None:
+            return err
         if int(content) != len(self.schemes):
             err = write_file(nr_schemes_file, '%d' % len(self.schemes))
             if err != None:
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 03/10] selftests/damon/_damon_sysfs: find sysfs mount point from /proc/mounts
  2024-05-03 18:03 [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park
  2024-05-03 18:03 ` [PATCH 02/10] selftests/damon/_damon_sysfs: check errors from nr_schemes file reads SeongJae Park
@ 2024-05-03 18:03 ` SeongJae Park
  2024-05-03 18:03 ` [PATCH 04/10] selftests/damon/_damon_sysfs: use 'is' instead of '==' for 'None' SeongJae Park
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: SeongJae Park @ 2024-05-03 18:03 UTC (permalink / raw)
  To: Andrew Morton
  Cc: SeongJae Park, Shuah Khan, damon, linux-mm, linux-kselftest,
	linux-kernel

_damon_sysfs.py assumes sysfs is mounted at /sys.  In some systems, that
might not be true.  Find the mount point from /proc/mounts file content.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 tools/testing/selftests/damon/_damon_sysfs.py | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/selftests/damon/_damon_sysfs.py
index fffa74a78bd7..5367e98817a9 100644
--- a/tools/testing/selftests/damon/_damon_sysfs.py
+++ b/tools/testing/selftests/damon/_damon_sysfs.py
@@ -2,7 +2,18 @@
 
 import os
 
-sysfs_root = '/sys/kernel/mm/damon/admin'
+ksft_skip=4
+
+sysfs_root = None
+with open('/proc/mounts', 'r') as f:
+    for line in f:
+        dev_name, mount_point, dev_fs = line.split()[:3]
+        if dev_fs == 'sysfs':
+            sysfs_root = '%s/kernel/mm/damon/admin' % mount_point
+            break
+if sysfs_root is None:
+    print('Seems sysfs not mounted?')
+    exit(ksft_skip)
 
 def write_file(path, string):
     "Returns error string if failed, or None otherwise"
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 04/10] selftests/damon/_damon_sysfs: use 'is' instead of '==' for 'None'
  2024-05-03 18:03 [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park
  2024-05-03 18:03 ` [PATCH 02/10] selftests/damon/_damon_sysfs: check errors from nr_schemes file reads SeongJae Park
  2024-05-03 18:03 ` [PATCH 03/10] selftests/damon/_damon_sysfs: find sysfs mount point from /proc/mounts SeongJae Park
@ 2024-05-03 18:03 ` SeongJae Park
  2024-05-03 18:03 ` [PATCH 05/10] selftests/damon: classify tests for functionalities and regressions SeongJae Park
  2024-05-03 18:06 ` [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park
  4 siblings, 0 replies; 6+ messages in thread
From: SeongJae Park @ 2024-05-03 18:03 UTC (permalink / raw)
  To: Andrew Morton
  Cc: SeongJae Park, Shuah Khan, damon, linux-mm, linux-kselftest,
	linux-kernel

_damon_sysfs.py is using '==' or '!=' for 'None'.  Since 'None' is a
singleton, using 'is' or 'is not' is more efficient.  Use the more
efficient one.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 tools/testing/selftests/damon/_damon_sysfs.py | 80 +++++++++----------
 1 file changed, 40 insertions(+), 40 deletions(-)

diff --git a/tools/testing/selftests/damon/_damon_sysfs.py b/tools/testing/selftests/damon/_damon_sysfs.py
index 5367e98817a9..01d4b8022d50 100644
--- a/tools/testing/selftests/damon/_damon_sysfs.py
+++ b/tools/testing/selftests/damon/_damon_sysfs.py
@@ -45,11 +45,11 @@ class DamosAccessPattern:
         self.nr_accesses = nr_accesses
         self.age = age
 
-        if self.size == None:
+        if self.size is None:
             self.size = [0, 2**64 - 1]
-        if self.nr_accesses == None:
+        if self.nr_accesses is None:
             self.nr_accesses = [0, 2**64 - 1]
-        if self.age == None:
+        if self.age is None:
             self.age = [0, 2**64 - 1]
 
     def sysfs_dir(self):
@@ -58,27 +58,27 @@ class DamosAccessPattern:
     def stage(self):
         err = write_file(
                 os.path.join(self.sysfs_dir(), 'sz', 'min'), self.size[0])
-        if err != None:
+        if err is not None:
             return err
         err = write_file(
                 os.path.join(self.sysfs_dir(), 'sz', 'max'), self.size[1])
-        if err != None:
+        if err is not None:
             return err
         err = write_file(os.path.join(self.sysfs_dir(), 'nr_accesses', 'min'),
                 self.nr_accesses[0])
-        if err != None:
+        if err is not None:
             return err
         err = write_file(os.path.join(self.sysfs_dir(), 'nr_accesses', 'max'),
                 self.nr_accesses[1])
-        if err != None:
+        if err is not None:
             return err
         err = write_file(
                 os.path.join(self.sysfs_dir(), 'age', 'min'), self.age[0])
-        if err != None:
+        if err is not None:
             return err
         err = write_file(
                 os.path.join(self.sysfs_dir(), 'age', 'max'), self.age[1])
-        if err != None:
+        if err is not None:
             return err
 
 qgoal_metric_user_input = 'user_input'
@@ -137,14 +137,14 @@ class DamosQuota:
 
     def stage(self):
         err = write_file(os.path.join(self.sysfs_dir(), 'bytes'), self.sz)
-        if err != None:
+        if err is not None:
             return err
         err = write_file(os.path.join(self.sysfs_dir(), 'ms'), self.ms)
-        if err != None:
+        if err is not None:
             return err
         err = write_file(os.path.join(self.sysfs_dir(), 'reset_interval_ms'),
                          self.reset_interval_ms)
-        if err != None:
+        if err is not None:
             return err
 
         nr_goals_file = os.path.join(self.sysfs_dir(), 'goals', 'nr_goals')
@@ -201,30 +201,30 @@ class Damos:
 
     def stage(self):
         err = write_file(os.path.join(self.sysfs_dir(), 'action'), self.action)
-        if err != None:
+        if err is not None:
             return err
         err = self.access_pattern.stage()
-        if err != None:
+        if err is not None:
             return err
         err = write_file(os.path.join(self.sysfs_dir(), 'apply_interval_us'),
                          '%d' % self.apply_interval_us)
-        if err != None:
+        if err is not None:
             return err
 
         err = self.quota.stage()
-        if err != None:
+        if err is not None:
             return err
 
         # disable watermarks
         err = write_file(
                 os.path.join(self.sysfs_dir(), 'watermarks', 'metric'), 'none')
-        if err != None:
+        if err is not None:
             return err
 
         # disable filters
         err = write_file(
                 os.path.join(self.sysfs_dir(), 'filters', 'nr_filters'), '0')
-        if err != None:
+        if err is not None:
             return err
 
 class DamonTarget:
@@ -243,7 +243,7 @@ class DamonTarget:
     def stage(self):
         err = write_file(
                 os.path.join(self.sysfs_dir(), 'regions', 'nr_regions'), '0')
-        if err != None:
+        if err is not None:
             return err
         return write_file(
                 os.path.join(self.sysfs_dir(), 'pid_target'), self.pid)
@@ -275,27 +275,27 @@ class DamonAttrs:
     def stage(self):
         err = write_file(os.path.join(self.interval_sysfs_dir(), 'sample_us'),
                 self.sample_us)
-        if err != None:
+        if err is not None:
             return err
         err = write_file(os.path.join(self.interval_sysfs_dir(), 'aggr_us'),
                 self.aggr_us)
-        if err != None:
+        if err is not None:
             return err
         err = write_file(os.path.join(self.interval_sysfs_dir(), 'update_us'),
                 self.update_us)
-        if err != None:
+        if err is not None:
             return err
 
         err = write_file(
                 os.path.join(self.nr_regions_range_sysfs_dir(), 'min'),
                 self.min_nr_regions)
-        if err != None:
+        if err is not None:
             return err
 
         err = write_file(
                 os.path.join(self.nr_regions_range_sysfs_dir(), 'max'),
                 self.max_nr_regions)
-        if err != None:
+        if err is not None:
             return err
 
 class DamonCtx:
@@ -329,24 +329,24 @@ class DamonCtx:
     def stage(self):
         err = write_file(
                 os.path.join(self.sysfs_dir(), 'operations'), self.ops)
-        if err != None:
+        if err is not None:
             return err
         err = self.monitoring_attrs.stage()
-        if err != None:
+        if err is not None:
             return err
 
         nr_targets_file = os.path.join(
                 self.sysfs_dir(), 'targets', 'nr_targets')
         content, err = read_file(nr_targets_file)
-        if err != None:
+        if err is not None:
             return err
         if int(content) != len(self.targets):
             err = write_file(nr_targets_file, '%d' % len(self.targets))
-            if err != None:
+            if err is not None:
                 return err
         for target in self.targets:
             err = target.stage()
-            if err != None:
+            if err is not None:
                 return err
 
         nr_schemes_file = os.path.join(
@@ -356,11 +356,11 @@ class DamonCtx:
             return err
         if int(content) != len(self.schemes):
             err = write_file(nr_schemes_file, '%d' % len(self.schemes))
-            if err != None:
+            if err is not None:
                 return err
         for scheme in self.schemes:
             err = scheme.stage()
-            if err != None:
+            if err is not None:
                 return err
         return None
 
@@ -384,16 +384,16 @@ class Kdamond:
         nr_contexts_file = os.path.join(self.sysfs_dir(),
                 'contexts', 'nr_contexts')
         content, err = read_file(nr_contexts_file)
-        if err != None:
+        if err is not None:
             return err
         if int(content) != len(self.contexts):
             err = write_file(nr_contexts_file, '%d' % len(self.contexts))
-            if err != None:
+            if err is not None:
                 return err
 
         for context in self.contexts:
             err = context.stage()
-            if err != None:
+            if err is not None:
                 return err
         err = write_file(os.path.join(self.sysfs_dir(), 'state'), 'on')
         return err
@@ -401,20 +401,20 @@ class Kdamond:
     def update_schemes_tried_bytes(self):
         err = write_file(os.path.join(self.sysfs_dir(), 'state'),
                 'update_schemes_tried_bytes')
-        if err != None:
+        if err is not None:
             return err
         for context in self.contexts:
             for scheme in context.schemes:
                 content, err = read_file(os.path.join(scheme.sysfs_dir(),
                     'tried_regions', 'total_bytes'))
-                if err != None:
+                if err is not None:
                     return err
                 scheme.tried_bytes = int(content)
 
     def update_schemes_stats(self):
         err = write_file(os.path.join(self.sysfs_dir(), 'state'),
                 'update_schemes_stats')
-        if err != None:
+        if err is not None:
             return err
         for context in self.contexts:
             for scheme in context.schemes:
@@ -423,7 +423,7 @@ class Kdamond:
                              'sz_applied', 'qt_exceeds']:
                     content, err = read_file(
                             os.path.join(scheme.sysfs_dir(), 'stats', stat))
-                    if err != None:
+                    if err is not None:
                         return err
                     stat_values.append(int(content))
                 scheme.stats = DamosStats(*stat_values)
@@ -471,10 +471,10 @@ class Kdamonds:
     def start(self):
         err = write_file(os.path.join(self.sysfs_dir(),  'nr_kdamonds'),
                 '%s' % len(self.kdamonds))
-        if err != None:
+        if err is not None:
             return err
         for kdamond in self.kdamonds:
             err = kdamond.start()
-            if err != None:
+            if err is not None:
                 return err
         return None
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 05/10] selftests/damon: classify tests for functionalities and regressions
  2024-05-03 18:03 [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park
                   ` (2 preceding siblings ...)
  2024-05-03 18:03 ` [PATCH 04/10] selftests/damon/_damon_sysfs: use 'is' instead of '==' for 'None' SeongJae Park
@ 2024-05-03 18:03 ` SeongJae Park
  2024-05-03 18:06 ` [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park
  4 siblings, 0 replies; 6+ messages in thread
From: SeongJae Park @ 2024-05-03 18:03 UTC (permalink / raw)
  To: Andrew Morton
  Cc: SeongJae Park, Shuah Khan, damon, linux-mm, linux-kselftest,
	linux-kernel

DAMON selftests can be classified into two categories: functionalities
and regressions.  Functionality tests are for checking if the function
is working as specified, while the regression tests are basically
reproducers of previously reported and fixed bugs.  The tests of the
categories are mixed in the selftests Makefile.  Separate those for
easier understanding of the types of tests.

Signed-off-by: SeongJae Park <sj@kernel.org>
---
 tools/testing/selftests/damon/Makefile | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/damon/Makefile b/tools/testing/selftests/damon/Makefile
index 06c248880172..29a22f50e762 100644
--- a/tools/testing/selftests/damon/Makefile
+++ b/tools/testing/selftests/damon/Makefile
@@ -7,16 +7,21 @@ TEST_GEN_FILES += debugfs_target_ids_pid_leak
 TEST_GEN_FILES += access_memory
 
 TEST_FILES = _chk_dependency.sh _debugfs_common.sh
+
+# functionality tests
 TEST_PROGS = debugfs_attrs.sh debugfs_schemes.sh debugfs_target_ids.sh
+TEST_PROGS += sysfs.sh
+TEST_PROGS += sysfs_update_schemes_tried_regions_wss_estimation.py
+TEST_PROGS += damos_quota.py damos_quota_goal.py damos_apply_interval.py
+TEST_PROGS += reclaim.sh lru_sort.sh
+
+# regression tests (reproducers of previously found bugs)
 TEST_PROGS += debugfs_empty_targets.sh debugfs_huge_count_read_write.sh
 TEST_PROGS += debugfs_duplicate_context_creation.sh
 TEST_PROGS += debugfs_rm_non_contexts.sh
 TEST_PROGS += debugfs_target_ids_read_before_terminate_race.sh
 TEST_PROGS += debugfs_target_ids_pid_leak.sh
-TEST_PROGS += sysfs.sh sysfs_update_removed_scheme_dir.sh
+TEST_PROGS += sysfs_update_removed_scheme_dir.sh
 TEST_PROGS += sysfs_update_schemes_tried_regions_hang.py
-TEST_PROGS += sysfs_update_schemes_tried_regions_wss_estimation.py
-TEST_PROGS += damos_quota.py damos_quota_goal.py damos_apply_interval.py
-TEST_PROGS += reclaim.sh lru_sort.sh
 
 include ../lib.mk
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 00/10] mm/damon: misc fixes and improvements
  2024-05-03 18:03 [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park
                   ` (3 preceding siblings ...)
  2024-05-03 18:03 ` [PATCH 05/10] selftests/damon: classify tests for functionalities and regressions SeongJae Park
@ 2024-05-03 18:06 ` SeongJae Park
  4 siblings, 0 replies; 6+ messages in thread
From: SeongJae Park @ 2024-05-03 18:06 UTC (permalink / raw)
  To: Andrew Morton
  Cc: SeongJae Park, Jonathan Corbet, Shuah Khan, damon, linux-mm,
	linux-doc, linux-kselftest, linux-kernel

Andrew, please add DAMON selftests patchset[1] that I posted yesterday before
this patchset.  Otherwise, patches would get conflicts.

[1] https://lore.kernel.org/20240502172718.74166-1-sj@kernel.org


Thanks,
SJ

On Fri,  3 May 2024 11:03:08 -0700 SeongJae Park <sj@kernel.org> wrote:

> Add miscelleneous and non-urgent fixes and improvements for DAMON code,
> selftests, and documents.
> 
> SeongJae Park (10):
>   mm/damon/core: initialize ->esz_bp from damos_quota_init_priv()
>   selftests/damon/_damon_sysfs: check errors from nr_schemes file reads
>   selftests/damon/_damon_sysfs: find sysfs mount point from /proc/mounts
>   selftests/damon/_damon_sysfs: use 'is' instead of '==' for 'None'
>   selftests/damon: classify tests for functionalities and regressions
>   Docs/admin-guide/mm/damon/usage: fix wrong example of DAMOS filter
>     matching sysfs file
>   Docs/admin-guide/mm/damon/usage: fix wrong schemes effective quota
>     update command
>   Docs/mm/damon/design: use a list for supported filters
>   Docs/mm/damon/maintainer-profile: change the maintainer's timezone
>     from PST to PT
>   Docs/mm/damon/maintainer-profile: allow posting patches based on
>     damon/next tree
> 
>  Documentation/admin-guide/mm/damon/usage.rst  |  6 +-
>  Documentation/mm/damon/design.rst             | 46 +++++----
>  Documentation/mm/damon/maintainer-profile.rst | 13 +--
>  mm/damon/core.c                               |  1 +
>  tools/testing/selftests/damon/Makefile        | 13 ++-
>  tools/testing/selftests/damon/_damon_sysfs.py | 95 +++++++++++--------
>  6 files changed, 100 insertions(+), 74 deletions(-)
> 
> 
> base-commit: fc7314cb6b750187a1366e0bf9da4c3ca8cfd064
> -- 
> 2.39.2

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-05-03 18:06 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-03 18:03 [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park
2024-05-03 18:03 ` [PATCH 02/10] selftests/damon/_damon_sysfs: check errors from nr_schemes file reads SeongJae Park
2024-05-03 18:03 ` [PATCH 03/10] selftests/damon/_damon_sysfs: find sysfs mount point from /proc/mounts SeongJae Park
2024-05-03 18:03 ` [PATCH 04/10] selftests/damon/_damon_sysfs: use 'is' instead of '==' for 'None' SeongJae Park
2024-05-03 18:03 ` [PATCH 05/10] selftests/damon: classify tests for functionalities and regressions SeongJae Park
2024-05-03 18:06 ` [PATCH 00/10] mm/damon: misc fixes and improvements SeongJae Park

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox