1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2024 Meta Platforms, Inc. and affiliates. 4 * Copyright (c) 2024 David Vernet <[email protected]> 5 */ 6 #include <bpf/bpf.h> 7 #include <sched.h> 8 #include <scx/common.h> 9 #include <sys/wait.h> 10 #include <unistd.h> 11 #include "exit.bpf.skel.h" 12 #include "scx_test.h" 13 14 #include "exit_test.h" 15 run(void * ctx)16static enum scx_test_status run(void *ctx) 17 { 18 enum exit_test_case tc; 19 20 for (tc = 0; tc < NUM_EXITS; tc++) { 21 struct exit *skel; 22 struct bpf_link *link; 23 char buf[16]; 24 25 skel = exit__open(); 26 SCX_ENUM_INIT(skel); 27 skel->rodata->exit_point = tc; 28 exit__load(skel); 29 link = bpf_map__attach_struct_ops(skel->maps.exit_ops); 30 if (!link) { 31 SCX_ERR("Failed to attach scheduler"); 32 exit__destroy(skel); 33 return SCX_TEST_FAIL; 34 } 35 36 /* Assumes uei.kind is written last */ 37 while (skel->data->uei.kind == EXIT_KIND(SCX_EXIT_NONE)) 38 sched_yield(); 39 40 SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_UNREG_BPF)); 41 SCX_EQ(skel->data->uei.exit_code, tc); 42 sprintf(buf, "%d", tc); 43 SCX_ASSERT(!strcmp(skel->data->uei.msg, buf)); 44 bpf_link__destroy(link); 45 exit__destroy(skel); 46 } 47 48 return SCX_TEST_PASS; 49 } 50 51 struct scx_test exit_test = { 52 .name = "exit", 53 .description = "Verify we can cleanly exit a scheduler in multiple places", 54 .run = run, 55 }; 56 REGISTER_SCX_TEST(&exit_test) 57