for (i = 0; i < (unsignedlong)arg; i++) {
snprintf(buf, sizeof(buf), "/something-non-existent-with-a-long-name-%64lu-%d",
i, getpid());
stat(buf, &st);
}
return0;
}
/* *Thistestallocates100000ofnegativedentrieswithlongnames. *Thenitchecksthat"slab"inmemory.statislargerthan1M. *Thenitsetsmemory.highto1Mandchecksthatatleast1/2 *ofslabmemoryhasbeenreclaimed.
*/ staticint test_kmem_basic(constchar *root)
{ int ret = KSFT_FAIL; char *cg = NULL; long slab0, slab1, current;
cg = cg_name(root, "kmem_basic_test"); if (!cg) goto cleanup;
if (cg_create(cg)) goto cleanup;
if (cg_run(cg, alloc_dcache, (void *)100000)) goto cleanup;
staticint spawn_1000_threads(constchar *cgroup, void *arg)
{ int nr_threads = 1000;
pthread_t *tinfo; unsignedlong i; long stack; int ret = -1;
tinfo = calloc(nr_threads, sizeof(pthread_t)); if (tinfo == NULL) return -1;
for (i = 0; i < nr_threads; i++) { if (pthread_create(&tinfo[i], NULL, &pthread_wait_fn,
(void *)i)) {
free(tinfo); return(-1);
}
}
stack = cg_read_key_long(cgroup, "memory.stat", "kernel_stack "); if (stack >= 4096 * 1000)
ret = 0;
free(tinfo); return ret;
}
/* *Thetestspawnsaprocess,whichspawns1000threads.Thenitchecks *thatmemory.stat'skernel_stackisatleast1000pageslarge.
*/ staticint test_kmem_kernel_stacks(constchar *root)
{ int ret = KSFT_FAIL; char *cg = NULL;
cg = cg_name(root, "kmem_kernel_stacks_test"); if (!cg) goto cleanup;
if (cg_create(cg)) goto cleanup;
if (cg_run(cg, spawn_1000_threads, NULL)) goto cleanup;
ret = KSFT_PASS;
cleanup:
cg_destroy(cg);
free(cg);
return ret;
}
/* *Thistestsequentionallycreates30childcgroups,allocatessome *kernelmemoryineachofthem,anddeletesthem.Thenitchecks *thatthenumberofdyingcgroupsontheparentlevelis0.
*/ staticint test_kmem_dead_cgroups(constchar *root)
{ int ret = KSFT_FAIL; char *parent; long dead; int i; int max_time = 20;
parent = cg_name(root, "kmem_dead_cgroups_test"); if (!parent) goto cleanup;
if (cg_create(parent)) goto cleanup;
if (cg_write(parent, "cgroup.subtree_control", "+memory")) goto cleanup;
if (cg_run_in_subcgroups(parent, alloc_dcache, (void *)100, 30)) goto cleanup;
for (i = 0; i < max_time; i++) {
dead = cg_read_key_long(parent, "cgroup.stat", "nr_dying_descendants "); if (dead == 0) {
ret = KSFT_PASS; break;
} /* *Reclaimingcgroupsmighttakesometime, *let'swaitabitandrepeat.
*/
sleep(1); if (i > 5)
printf("Waiting time longer than 5s; wait: %ds (dead: %ld)\n", i, dead);
}
cleanup:
cg_destroy(parent);
free(parent);
return ret;
}
/* *Thistestcreatesasub-treewith1000memorycgroups. *Thenitchecksthatthememory.currentontheparentlevel *isgreaterthan0andapproximatesmatchesthepercpuvalue *frommemory.stat.
*/ staticint test_percpu_basic(constchar *root)
{ int ret = KSFT_FAIL; char *parent, *child; long current, percpu; int i;
parent = cg_name(root, "percpu_basic_test"); if (!parent) goto cleanup;
if (cg_create(parent)) goto cleanup;
if (cg_write(parent, "cgroup.subtree_control", "+memory")) goto cleanup;
for (i = 0; i < 1000; i++) {
child = cg_name_indexed(parent, "child", i); if (!child) return -1;
if (cg_create(child)) goto cleanup_children;
free(child);
}
current = cg_read_long(parent, "memory.current");
percpu = cg_read_key_long(parent, "memory.stat", "percpu ");
if (cg_read_strstr(root, "cgroup.subtree_control", "memory")) if (cg_write(root, "cgroup.subtree_control", "+memory"))
ksft_exit_skip("Failed to set memory controller\n");
for (i = 0; i < ARRAY_SIZE(tests); i++) { switch (tests[i].fn(root)) { case KSFT_PASS:
ksft_test_result_pass("%s\n", tests[i].name); break; case KSFT_SKIP:
ksft_test_result_skip("%s\n", tests[i].name); break; default:
ret = EXIT_FAILURE;
ksft_test_result_fail("%s\n", tests[i].name); break;
}
}
return ret;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-10-12)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.