1*5897ca15SCheng-Yang Chou /* SPDX-License-Identifier: GPL-2.0 */ 2*5897ca15SCheng-Yang Chou /* 3*5897ca15SCheng-Yang Chou * Verify that context-sensitive SCX kfuncs (even "unlocked" ones) are 4*5897ca15SCheng-Yang Chou * restricted to only SCX struct_ops programs. Non-SCX struct_ops programs, 5*5897ca15SCheng-Yang Chou * such as TCP congestion control programs, should be rejected by the BPF 6*5897ca15SCheng-Yang Chou * verifier when attempting to call these kfuncs. 7*5897ca15SCheng-Yang Chou * 8*5897ca15SCheng-Yang Chou * Copyright (C) 2026 Ching-Chun (Jim) Huang <jserv@ccns.ncku.edu.tw> 9*5897ca15SCheng-Yang Chou * Copyright (C) 2026 Cheng-Yang Chou <yphbchou0911@gmail.com> 10*5897ca15SCheng-Yang Chou */ 11*5897ca15SCheng-Yang Chou 12*5897ca15SCheng-Yang Chou #include <bpf/bpf.h> 13*5897ca15SCheng-Yang Chou #include <scx/common.h> 14*5897ca15SCheng-Yang Chou #include <unistd.h> 15*5897ca15SCheng-Yang Chou #include <errno.h> 16*5897ca15SCheng-Yang Chou #include <stdio.h> 17*5897ca15SCheng-Yang Chou #include "non_scx_kfunc_deny.bpf.skel.h" 18*5897ca15SCheng-Yang Chou #include "scx_test.h" 19*5897ca15SCheng-Yang Chou run(void * ctx)20*5897ca15SCheng-Yang Choustatic enum scx_test_status run(void *ctx) 21*5897ca15SCheng-Yang Chou { 22*5897ca15SCheng-Yang Chou struct non_scx_kfunc_deny *skel; 23*5897ca15SCheng-Yang Chou int err; 24*5897ca15SCheng-Yang Chou 25*5897ca15SCheng-Yang Chou skel = non_scx_kfunc_deny__open(); 26*5897ca15SCheng-Yang Chou if (!skel) { 27*5897ca15SCheng-Yang Chou SCX_ERR("Failed to open skel"); 28*5897ca15SCheng-Yang Chou return SCX_TEST_FAIL; 29*5897ca15SCheng-Yang Chou } 30*5897ca15SCheng-Yang Chou 31*5897ca15SCheng-Yang Chou err = non_scx_kfunc_deny__load(skel); 32*5897ca15SCheng-Yang Chou non_scx_kfunc_deny__destroy(skel); 33*5897ca15SCheng-Yang Chou 34*5897ca15SCheng-Yang Chou if (err == 0) { 35*5897ca15SCheng-Yang Chou SCX_ERR("non-SCX BPF program loaded when it should have been rejected"); 36*5897ca15SCheng-Yang Chou return SCX_TEST_FAIL; 37*5897ca15SCheng-Yang Chou } 38*5897ca15SCheng-Yang Chou 39*5897ca15SCheng-Yang Chou return SCX_TEST_PASS; 40*5897ca15SCheng-Yang Chou } 41*5897ca15SCheng-Yang Chou 42*5897ca15SCheng-Yang Chou struct scx_test non_scx_kfunc_deny = { 43*5897ca15SCheng-Yang Chou .name = "non_scx_kfunc_deny", 44*5897ca15SCheng-Yang Chou .description = "Verify that non-SCX struct_ops programs cannot call SCX kfuncs", 45*5897ca15SCheng-Yang Chou .run = run, 46*5897ca15SCheng-Yang Chou }; 47*5897ca15SCheng-Yang Chou REGISTER_SCX_TEST(&non_scx_kfunc_deny) 48