This repository has been archived by the owner on Jun 18, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
scx: Add stress-test for loading schedulers in a tight loop
In #129, Andrea fixed a bug where we trip over a NULL pointer deref by trying to load multiple schedulers at a time. Let's add a stress test that tries to load multiple schedulers in a tight loop at the same time. Additionally, do a bit of cleanup in the build system to have testcases take all BPF progs as dependencies. We don't really gain anything by artificially coupling the name of testcases to the BPF progs they use. Signed-off-by: David Vernet <void@manifault.com>
- Loading branch information
Showing
2 changed files
with
85 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. | ||
* Copyright (c) 2023 David Vernet <dvernet@meta.com> | ||
* Copyright (c) 2023 Tejun Heo <tj@kernel.org> | ||
*/ | ||
#include <bpf/bpf.h> | ||
#include <pthread.h> | ||
#include <scx/common.h> | ||
#include <sys/wait.h> | ||
#include <unistd.h> | ||
#include "maximal.bpf.skel.h" | ||
#include "scx_test.h" | ||
|
||
static struct maximal *skel; | ||
static pthread_t threads[2]; | ||
|
||
bool force_exit = false; | ||
|
||
static enum scx_test_status setup(void **ctx) | ||
{ | ||
skel = maximal__open_and_load(); | ||
if (!skel) { | ||
SCX_ERR("Failed to open and load skel"); | ||
return SCX_TEST_FAIL; | ||
} | ||
|
||
return SCX_TEST_PASS; | ||
} | ||
|
||
static void *do_reload_loop(void *arg) | ||
{ | ||
u32 i; | ||
|
||
for (i = 0; i < 512 && !force_exit; i++) { | ||
struct bpf_link *link; | ||
|
||
link = bpf_map__attach_struct_ops(skel->maps.maximal_ops); | ||
if (link) | ||
bpf_link__destroy(link); | ||
} | ||
|
||
return NULL; | ||
} | ||
|
||
static enum scx_test_status run(void *ctx) | ||
{ | ||
int err; | ||
void *ret; | ||
|
||
err = pthread_create(&threads[0], NULL, do_reload_loop, NULL); | ||
SCX_FAIL_IF(err, "Failed to create thread 0"); | ||
|
||
err = pthread_create(&threads[1], NULL, do_reload_loop, NULL); | ||
SCX_FAIL_IF(err, "Failed to create thread 1"); | ||
|
||
SCX_FAIL_IF(pthread_join(threads[0], &ret), "thread 0 failed"); | ||
SCX_FAIL_IF(pthread_join(threads[1], &ret), "thread 1 failed"); | ||
|
||
return SCX_TEST_PASS; | ||
} | ||
|
||
static void cleanup(void *ctx) | ||
{ | ||
force_exit = true; | ||
maximal__destroy(skel); | ||
} | ||
|
||
struct scx_test reload_loop = { | ||
.name = "reload_loop", | ||
.description = "Stress test loading and unloading schedulers repeatedly in a tight loop", | ||
.setup = setup, | ||
.run = run, | ||
.cleanup = cleanup, | ||
}; | ||
REGISTER_SCX_TEST(&reload_loop) |