]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests: cgroup: Allow longer timeout for kmem_dead_cgroups cleanup
authorSebastian Chlad <sebastianchlad@gmail.com>
Wed, 2 Jul 2025 13:23:36 +0000 (15:23 +0200)
committerTejun Heo <tj@kernel.org>
Sat, 12 Jul 2025 17:34:49 +0000 (07:34 -1000)
The test_kmem_dead_cgroups test currently assumes that RCU and
memory reclaim will complete within 5 seconds. In some environments
this timeout may be insufficient, leading to spurious test failures.

This patch introduces max_time set to 20 which is then used in the
test. After 5th sec the debug message is printed to indicate the
cleanup is still ongoing.

In the system under test with 16 CPUs the original test was failing
most of the time and the cleanup time took usually approx. 6sec.
Further tests were conducted with and without do_rcu_barrier and the
results (respectively) are as follow:
quantiles 0  0.25  0.5  0.75  1
          1    2    3    8    20 (mean = 4.7667)
          3    5    8    8    20 (mean = 7.6667)

Acked-by: Michal Koutny <mkoutny@suse.com>
Signed-off-by: Sebastian Chlad <sebastian.chlad@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
tools/testing/selftests/cgroup/test_kmem.c

index 96693d8772be244874545f6e33726d7561e21aea..63b3c9aad399aaef0d66ce294a7ae89cc2c6e21d 100644 (file)
@@ -308,6 +308,7 @@ static int test_kmem_dead_cgroups(const char *root)
        char *parent;
        long dead;
        int i;
+       int max_time = 20;
 
        parent = cg_name(root, "kmem_dead_cgroups_test");
        if (!parent)
@@ -322,7 +323,7 @@ static int test_kmem_dead_cgroups(const char *root)
        if (cg_run_in_subcgroups(parent, alloc_dcache, (void *)100, 30))
                goto cleanup;
 
-       for (i = 0; i < 5; i++) {
+       for (i = 0; i < max_time; i++) {
                dead = cg_read_key_long(parent, "cgroup.stat",
                                        "nr_dying_descendants ");
                if (dead == 0) {
@@ -334,6 +335,8 @@ static int test_kmem_dead_cgroups(const char *root)
                 * let's wait a bit and repeat.
                 */
                sleep(1);
+               if (i > 5)
+                       printf("Waiting time longer than 5s; wait: %ds (dead: %ld)\n", i, dead);
        }
 
 cleanup: