1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2023 Meta Platforms, Inc. and affiliates. 4 * Copyright (c) 2023 David Vernet <dvernet@meta.com> 5 * Copyright (c) 2023 Tejun Heo <tj@kernel.org> 6 */ 7 #include <bpf/bpf.h> 8 #include <scx/common.h> 9 #include <sys/wait.h> 10 #include <unistd.h> 11 #include "enq_last_no_enq_fails.bpf.skel.h" 12 #include "scx_test.h" 13 setup(void ** ctx)14static enum scx_test_status setup(void **ctx) 15 { 16 struct enq_last_no_enq_fails *skel; 17 18 skel = enq_last_no_enq_fails__open_and_load(); 19 if (!skel) { 20 SCX_ERR("Failed to open and load skel"); 21 return SCX_TEST_FAIL; 22 } 23 *ctx = skel; 24 25 return SCX_TEST_PASS; 26 } 27 run(void * ctx)28static enum scx_test_status run(void *ctx) 29 { 30 struct enq_last_no_enq_fails *skel = ctx; 31 struct bpf_link *link; 32 33 link = bpf_map__attach_struct_ops(skel->maps.enq_last_no_enq_fails_ops); 34 if (!link) { 35 SCX_ERR("Incorrectly failed at attaching scheduler"); 36 return SCX_TEST_FAIL; 37 } 38 if (!skel->bss->exit_kind) { 39 SCX_ERR("Incorrectly stayed loaded"); 40 return SCX_TEST_FAIL; 41 } 42 43 bpf_link__destroy(link); 44 45 return SCX_TEST_PASS; 46 } 47 cleanup(void * ctx)48static void cleanup(void *ctx) 49 { 50 struct enq_last_no_enq_fails *skel = ctx; 51 52 enq_last_no_enq_fails__destroy(skel); 53 } 54 55 struct scx_test enq_last_no_enq_fails = { 56 .name = "enq_last_no_enq_fails", 57 .description = "Verify we eject a scheduler if we specify " 58 "the SCX_OPS_ENQ_LAST flag without defining " 59 "ops.enqueue()", 60 .setup = setup, 61 .run = run, 62 .cleanup = cleanup, 63 }; 64 REGISTER_SCX_TEST(&enq_last_no_enq_fails) 65