]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/damon/access_memory: add repeat mode
authorSeongJae Park <sj@kernel.org>
Sat, 17 Jan 2026 02:07:26 +0000 (18:07 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 31 Jan 2026 22:22:44 +0000 (14:22 -0800)
'access_memory' is an artificial memory access generator program that is
used for a few DAMON selftests.  It accesses a given number of regions one
by one only once, and exits.  Depending on systems, the test workload may
exit faster than expected, making the tests unreliable.  For reliable
control of the artificial memory access pattern, add a mode to make it
repeat running.

Link: https://lkml.kernel.org/r/20260117020731.226785-4-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>
tools/testing/selftests/damon/access_memory.c

index 56b17e8fe1be83fe0bdfc7b18a4126cb8fe04f6a..567793b11107b044cac990fa8109a9a919709fbf 100644 (file)
@@ -8,6 +8,11 @@
 #include <string.h>
 #include <time.h>
 
+enum access_mode {
+       ACCESS_MODE_ONCE,
+       ACCESS_MODE_REPEAT,
+};
+
 int main(int argc, char *argv[])
 {
        char **regions;
@@ -15,10 +20,12 @@ int main(int argc, char *argv[])
        int nr_regions;
        int sz_region;
        int access_time_ms;
+       enum access_mode mode = ACCESS_MODE_ONCE;
+
        int i;
 
-       if (argc != 4) {
-               printf("Usage: %s <number> <size (bytes)> <time (ms)>\n",
+       if (argc < 4) {
+               printf("Usage: %s <number> <size (bytes)> <time (ms)> [mode]\n",
                                argv[0]);
                return -1;
        }
@@ -27,15 +34,21 @@ int main(int argc, char *argv[])
        sz_region = atoi(argv[2]);
        access_time_ms = atoi(argv[3]);
 
+       if (argc > 4 && !strcmp(argv[4], "repeat"))
+               mode = ACCESS_MODE_REPEAT;
+
        regions = malloc(sizeof(*regions) * nr_regions);
        for (i = 0; i < nr_regions; i++)
                regions[i] = malloc(sz_region);
 
-       for (i = 0; i < nr_regions; i++) {
-               start_clock = clock();
-               while ((clock() - start_clock) * 1000 / CLOCKS_PER_SEC <
-                               access_time_ms)
-                       memset(regions[i], i, sz_region);
-       }
+       do {
+               for (i = 0; i < nr_regions; i++) {
+                       start_clock = clock();
+                       while ((clock() - start_clock) * 1000 / CLOCKS_PER_SEC
+                                       < access_time_ms)
+                               memset(regions[i], i, sz_region);
+               }
+       } while (mode == ACCESS_MODE_REPEAT);
+
        return 0;
 }