// SPDX-License-Identifier: GPL-2.0 #include #include #include #include #include #include "sched.h" DEFINE_STATIC_KEY_FALSE(bpf_sched_enabled_key); /* * For every hook declare a nop function where a BPF program can be attached. */ #define BPF_SCHED_HOOK(RET, DEFAULT, NAME, ...) \ noinline RET bpf_sched_##NAME(__VA_ARGS__) \ { \ return DEFAULT; \ } #include #undef BPF_SCHED_HOOK #define BPF_SCHED_HOOK(RET, DEFAULT, NAME, ...) BTF_ID(func, bpf_sched_##NAME) BTF_SET_START(bpf_sched_hooks) #include #undef BPF_SCHED_HOOK BTF_SET_END(bpf_sched_hooks) int bpf_sched_verify_prog(struct bpf_verifier_log *vlog, const struct bpf_prog *prog) { if (!prog->gpl_compatible) { bpf_log(vlog, "sched programs must have a GPL compatible license\n"); return -EINVAL; } if (!btf_id_set_contains(&bpf_sched_hooks, prog->aux->attach_btf_id)) { bpf_log(vlog, "attach_btf_id %u points to wrong type name %s\n", prog->aux->attach_btf_id, prog->aux->attach_func_name); return -EINVAL; } return 0; } static const struct bpf_func_proto * bpf_sched_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) { switch (func_id) { case BPF_FUNC_trace_printk: return bpf_get_trace_printk_proto(); default: return bpf_base_func_proto(func_id); } } const struct bpf_prog_ops bpf_sched_prog_ops = { }; const struct bpf_verifier_ops bpf_sched_verifier_ops = { .get_func_proto = bpf_sched_func_proto, .is_valid_access = btf_ctx_access, };