1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2022 Meta Platforms, Inc. and affiliates. 4 * Copyright (c) 2022 Tejun Heo <tj@kernel.org> 5 * Copyright (c) 2022 David Vernet <dvernet@meta.com> 6 */ 7 #ifndef __SCX_COMMON_BPF_H 8 #define __SCX_COMMON_BPF_H 9 10 /* 11 * The generated kfunc prototypes in vmlinux.h are missing address space 12 * attributes which cause build failures. For now, suppress the generated 13 * prototypes. See https://github.com/sched-ext/scx/issues/1111. 14 */ 15 #define BPF_NO_KFUNC_PROTOTYPES 16 17 #ifdef LSP 18 #define __bpf__ 19 #include "../vmlinux.h" 20 #else 21 #include "vmlinux.h" 22 #endif 23 24 #include <bpf/bpf_helpers.h> 25 #include <bpf/bpf_tracing.h> 26 #include <asm-generic/errno.h> 27 #include "user_exit_info.bpf.h" 28 #include "enum_defs.autogen.h" 29 #include "bpf_arena_common.bpf.h" 30 31 #define PF_IDLE 0x00000002 /* I am an IDLE thread */ 32 #define PF_IO_WORKER 0x00000010 /* Task is an IO worker */ 33 #define PF_WQ_WORKER 0x00000020 /* I'm a workqueue worker */ 34 #define PF_KCOMPACTD 0x00010000 /* I am kcompactd */ 35 #define PF_KSWAPD 0x00020000 /* I am kswapd */ 36 #define PF_KTHREAD 0x00200000 /* I am a kernel thread */ 37 #define PF_EXITING 0x00000004 38 #define CLOCK_MONOTONIC 1 39 40 #ifndef NR_CPUS 41 #define NR_CPUS 1024 42 #endif 43 44 #ifndef NUMA_NO_NODE 45 #define NUMA_NO_NODE (-1) 46 #endif 47 48 extern int LINUX_KERNEL_VERSION __kconfig; 49 extern const char CONFIG_CC_VERSION_TEXT[64] __kconfig __weak; 50 extern const char CONFIG_LOCALVERSION[64] __kconfig __weak; 51 extern bool CONFIG_PREEMPT_RCU __kconfig __weak; 52 53 /* 54 * Earlier versions of clang/pahole lost upper 32bits in 64bit enums which can 55 * lead to really confusing misbehaviors. Let's trigger a build failure. 56 */ 57 static inline void ___vmlinux_h_sanity_check___(void) 58 { 59 _Static_assert(SCX_DSQ_FLAG_BUILTIN, 60 "bpftool generated vmlinux.h is missing high bits for 64bit enums, upgrade clang and pahole"); 61 } 62 63 s32 scx_bpf_create_dsq(u64 dsq_id, s32 node) __ksym; 64 s32 scx_bpf_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags, bool *is_idle) __ksym; 65 s32 __scx_bpf_select_cpu_and(struct task_struct *p, const struct cpumask *cpus_allowed, 66 struct scx_bpf_select_cpu_and_args *args) __ksym __weak; 67 bool __scx_bpf_dsq_insert_vtime(struct task_struct *p, struct scx_bpf_dsq_insert_vtime_args *args) __ksym __weak; 68 u32 scx_bpf_dispatch_nr_slots(void) __ksym; 69 void scx_bpf_dispatch_cancel(void) __ksym; 70 void scx_bpf_kick_cpu(s32 cpu, u64 flags) __ksym; 71 s32 scx_bpf_dsq_nr_queued(u64 dsq_id) __ksym; 72 void scx_bpf_destroy_dsq(u64 dsq_id) __ksym; 73 struct task_struct *scx_bpf_dsq_peek(u64 dsq_id) __ksym __weak; 74 int bpf_iter_scx_dsq_new(struct bpf_iter_scx_dsq *it, u64 dsq_id, u64 flags) __ksym __weak; 75 struct task_struct *bpf_iter_scx_dsq_next(struct bpf_iter_scx_dsq *it) __ksym __weak; 76 void bpf_iter_scx_dsq_destroy(struct bpf_iter_scx_dsq *it) __ksym __weak; 77 void scx_bpf_exit_bstr(s64 exit_code, char *fmt, unsigned long long *data, u32 data__sz) __ksym __weak; 78 void scx_bpf_error_bstr(char *fmt, unsigned long long *data, u32 data_len) __ksym; 79 void scx_bpf_dump_bstr(char *fmt, unsigned long long *data, u32 data_len) __ksym __weak; 80 u32 scx_bpf_cpuperf_cap(s32 cpu) __ksym __weak; 81 u32 scx_bpf_cpuperf_cur(s32 cpu) __ksym __weak; 82 void scx_bpf_cpuperf_set(s32 cpu, u32 perf) __ksym __weak; 83 u32 scx_bpf_nr_node_ids(void) __ksym __weak; 84 u32 scx_bpf_nr_cpu_ids(void) __ksym __weak; 85 int scx_bpf_cpu_node(s32 cpu) __ksym __weak; 86 const struct cpumask *scx_bpf_get_possible_cpumask(void) __ksym __weak; 87 const struct cpumask *scx_bpf_get_online_cpumask(void) __ksym __weak; 88 void scx_bpf_put_cpumask(const struct cpumask *cpumask) __ksym __weak; 89 const struct cpumask *scx_bpf_get_idle_cpumask_node(int node) __ksym __weak; 90 const struct cpumask *scx_bpf_get_idle_cpumask(void) __ksym; 91 const struct cpumask *scx_bpf_get_idle_smtmask_node(int node) __ksym __weak; 92 const struct cpumask *scx_bpf_get_idle_smtmask(void) __ksym; 93 void scx_bpf_put_idle_cpumask(const struct cpumask *cpumask) __ksym; 94 bool scx_bpf_test_and_clear_cpu_idle(s32 cpu) __ksym; 95 s32 scx_bpf_pick_idle_cpu_node(const cpumask_t *cpus_allowed, int node, u64 flags) __ksym __weak; 96 s32 scx_bpf_pick_idle_cpu(const cpumask_t *cpus_allowed, u64 flags) __ksym; 97 s32 scx_bpf_pick_any_cpu_node(const cpumask_t *cpus_allowed, int node, u64 flags) __ksym __weak; 98 s32 scx_bpf_pick_any_cpu(const cpumask_t *cpus_allowed, u64 flags) __ksym; 99 bool scx_bpf_task_running(const struct task_struct *p) __ksym; 100 s32 scx_bpf_task_cpu(const struct task_struct *p) __ksym; 101 struct rq *scx_bpf_cpu_rq(s32 cpu) __ksym __weak; 102 struct rq *scx_bpf_locked_rq(void) __ksym; 103 struct task_struct *scx_bpf_cpu_curr(s32 cpu) __ksym __weak; 104 struct task_struct *scx_bpf_tid_to_task(u64 tid) __ksym __weak; 105 u64 scx_bpf_now(void) __ksym __weak; 106 void scx_bpf_events(struct scx_event_stats *events, size_t events__sz) __ksym __weak; 107 s32 scx_bpf_cpu_to_cid(s32 cpu) __ksym __weak; 108 s32 scx_bpf_cid_to_cpu(s32 cid) __ksym __weak; 109 void scx_bpf_cid_topo(s32 cid, struct scx_cid_topo *out) __ksym __weak; 110 void scx_bpf_kick_cid(s32 cid, u64 flags) __ksym __weak; 111 s32 scx_bpf_task_cid(const struct task_struct *p) __ksym __weak; 112 s32 scx_bpf_this_cid(void) __ksym __weak; 113 struct task_struct *scx_bpf_cid_curr(s32 cid) __ksym __weak; 114 u32 scx_bpf_nr_cids(void) __ksym __weak; 115 u32 scx_bpf_nr_online_cids(void) __ksym __weak; 116 const void __arena *scx_bpf_online_cmask(void) __ksym __weak; 117 u32 scx_bpf_cidperf_cap(s32 cid) __ksym __weak; 118 u32 scx_bpf_cidperf_cur(s32 cid) __ksym __weak; 119 s32 scx_bpf_cidperf_set(s32 cid, u32 perf) __ksym __weak; 120 121 /* sub-scheduler cap control, scx_bpf_sub_caps() cgroup_id 0 == self */ 122 s32 scx_bpf_sub_grant(u64 cgroup_id, u64 caps, const struct scx_cmask __arena *cmask__arena, struct scx_cmask __arena *denied_out__arena__nullable) __ksym __weak; 123 void scx_bpf_sub_revoke(u64 cgroup_id, u64 caps, const struct scx_cmask __arena *cmask__arena) __ksym __weak; 124 s32 scx_bpf_sub_caps(u64 cgroup_id, u64 caps, struct scx_cmask __arena *out__arena) __ksym __weak; 125 s32 scx_bpf_sub_kill_bstr(u64 cgroup_id, char *fmt, unsigned long long *data, u32 data__sz) __ksym __weak; 126 127 /* 128 * Use the following as @it__iter when calling scx_bpf_dsq_move[_vtime]() from 129 * within bpf_for_each() loops. 130 */ 131 #define BPF_FOR_EACH_ITER (&___it) 132 133 #define scx_read_event(e, name) \ 134 (bpf_core_field_exists((e)->name) ? (e)->name : 0) 135 136 static inline __attribute__((format(printf, 1, 2))) 137 void ___scx_bpf_bstr_format_checker(const char *fmt, ...) {} 138 139 #define SCX_STRINGIFY(x) #x 140 #define SCX_TOSTRING(x) SCX_STRINGIFY(x) 141 142 /* 143 * Helper macro for initializing the fmt and variadic argument inputs to both 144 * bstr exit kfuncs. Callers to this function should use ___fmt and ___param to 145 * refer to the initialized list of inputs to the bstr kfunc. 146 */ 147 #define scx_bpf_bstr_preamble(fmt, args...) \ 148 static char ___fmt[] = fmt; \ 149 /* \ 150 * Note that __param[] must have at least one \ 151 * element to keep the verifier happy. \ 152 */ \ 153 unsigned long long ___param[___bpf_narg(args) ?: 1] = {}; \ 154 \ 155 _Pragma("GCC diagnostic push") \ 156 _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ 157 ___bpf_fill(___param, args); \ 158 _Pragma("GCC diagnostic pop") 159 160 /* 161 * scx_bpf_exit() wraps the scx_bpf_exit_bstr() kfunc with variadic arguments 162 * instead of an array of u64. Using this macro will cause the scheduler to 163 * exit cleanly with the specified exit code being passed to user space. 164 */ 165 #define scx_bpf_exit(code, fmt, args...) \ 166 ({ \ 167 scx_bpf_bstr_preamble(fmt, args) \ 168 scx_bpf_exit_bstr(code, ___fmt, ___param, sizeof(___param)); \ 169 ___scx_bpf_bstr_format_checker(fmt, ##args); \ 170 }) 171 172 /* 173 * scx_bpf_sub_kill() wraps the scx_bpf_sub_kill_bstr() kfunc with variadic 174 * arguments instead of an array of u64. It kills the direct child sub-scheduler 175 * @cgid, passing the formatted reason to its user space, and evaluates to the 176 * kfunc's return value. On a kernel without sub-scheduler support the kfunc is 177 * absent and it returns -EOPNOTSUPP. 178 */ 179 #define scx_bpf_sub_kill(cgid, fmt, args...) \ 180 ({ \ 181 scx_bpf_bstr_preamble(fmt, args) \ 182 ___scx_bpf_bstr_format_checker(fmt, ##args); \ 183 bpf_ksym_exists(scx_bpf_sub_kill_bstr) ? \ 184 scx_bpf_sub_kill_bstr((cgid), ___fmt, ___param, \ 185 sizeof(___param)) : -EOPNOTSUPP; \ 186 }) 187 188 /* 189 * scx_bpf_error() wraps the scx_bpf_error_bstr() kfunc with variadic arguments 190 * instead of an array of u64. Invoking this macro will cause the scheduler to 191 * exit in an erroneous state, with diagnostic information being passed to the 192 * user. It appends the file and line number to aid debugging. 193 */ 194 #define scx_bpf_error(fmt, args...) \ 195 ({ \ 196 scx_bpf_bstr_preamble( \ 197 __FILE__ ":" SCX_TOSTRING(__LINE__) ": " fmt, ##args) \ 198 scx_bpf_error_bstr(___fmt, ___param, sizeof(___param)); \ 199 ___scx_bpf_bstr_format_checker( \ 200 __FILE__ ":" SCX_TOSTRING(__LINE__) ": " fmt, ##args); \ 201 }) 202 203 /* 204 * scx_bpf_dump() wraps the scx_bpf_dump_bstr() kfunc with variadic arguments 205 * instead of an array of u64. To be used from ops.dump() and friends. 206 */ 207 #define scx_bpf_dump(fmt, args...) \ 208 ({ \ 209 scx_bpf_bstr_preamble(fmt, args) \ 210 scx_bpf_dump_bstr(___fmt, ___param, sizeof(___param)); \ 211 ___scx_bpf_bstr_format_checker(fmt, ##args); \ 212 }) 213 214 /* 215 * scx_bpf_dump_header() is a wrapper around scx_bpf_dump that adds a header 216 * of system information for debugging. 217 */ 218 #define scx_bpf_dump_header() \ 219 ({ \ 220 scx_bpf_dump("kernel: %d.%d.%d %s\ncc: %s\n", \ 221 LINUX_KERNEL_VERSION >> 16, \ 222 LINUX_KERNEL_VERSION >> 8 & 0xFF, \ 223 LINUX_KERNEL_VERSION & 0xFF, \ 224 CONFIG_LOCALVERSION, \ 225 CONFIG_CC_VERSION_TEXT); \ 226 }) 227 228 #define BPF_STRUCT_OPS(name, args...) \ 229 SEC("struct_ops/"#name) \ 230 BPF_PROG(name, ##args) 231 232 #define BPF_STRUCT_OPS_SLEEPABLE(name, args...) \ 233 SEC("struct_ops.s/"#name) \ 234 BPF_PROG(name, ##args) 235 236 /** 237 * RESIZABLE_ARRAY - Generates annotations for an array that may be resized 238 * @elfsec: the data section of the BPF program in which to place the array 239 * @arr: the name of the array 240 * 241 * libbpf has an API for setting map value sizes. Since data sections (i.e. 242 * bss, data, rodata) themselves are maps, a data section can be resized. If 243 * a data section has an array as its last element, the BTF info for that 244 * array will be adjusted so that length of the array is extended to meet the 245 * new length of the data section. This macro annotates an array to have an 246 * element count of one with the assumption that this array can be resized 247 * within the userspace program. It also annotates the section specifier so 248 * this array exists in a custom sub data section which can be resized 249 * independently. 250 * 251 * See RESIZE_ARRAY() for the userspace convenience macro for resizing an 252 * array declared with RESIZABLE_ARRAY(). 253 */ 254 #define RESIZABLE_ARRAY(elfsec, arr) arr[1] SEC("."#elfsec"."#arr) 255 256 /** 257 * MEMBER_VPTR - Obtain the verified pointer to a struct or array member 258 * @base: struct or array to index 259 * @member: dereferenced member (e.g. .field, [idx0][idx1], .field[idx0] ...) 260 * 261 * The verifier often gets confused by the instruction sequence the compiler 262 * generates for indexing struct fields or arrays. This macro forces the 263 * compiler to generate a code sequence which first calculates the byte offset, 264 * checks it against the struct or array size and add that byte offset to 265 * generate the pointer to the member to help the verifier. 266 * 267 * Ideally, we want to abort if the calculated offset is out-of-bounds. However, 268 * BPF currently doesn't support abort, so evaluate to %NULL instead. The caller 269 * must check for %NULL and take appropriate action to appease the verifier. To 270 * avoid confusing the verifier, it's best to check for %NULL and dereference 271 * immediately. 272 * 273 * vptr = MEMBER_VPTR(my_array, [i][j]); 274 * if (!vptr) 275 * return error; 276 * *vptr = new_value; 277 * 278 * sizeof(@base) should encompass the memory area to be accessed and thus can't 279 * be a pointer to the area. Use `MEMBER_VPTR(*ptr, .member)` instead of 280 * `MEMBER_VPTR(ptr, ->member)`. 281 */ 282 #ifndef MEMBER_VPTR 283 #define MEMBER_VPTR(base, member) (typeof((base) member) *) \ 284 ({ \ 285 u64 __base = (u64)&(base); \ 286 u64 __addr = (u64)&((base) member) - __base; \ 287 _Static_assert(sizeof(base) >= sizeof((base) member), \ 288 "@base is smaller than @member, is @base a pointer?"); \ 289 asm volatile ( \ 290 "if %0 <= %[max] goto +2\n" \ 291 "%0 = 0\n" \ 292 "goto +1\n" \ 293 "%0 += %1\n" \ 294 : "+r"(__addr) \ 295 : "r"(__base), \ 296 [max]"i"(sizeof(base) - sizeof((base) member))); \ 297 __addr; \ 298 }) 299 #endif /* MEMBER_VPTR */ 300 301 /** 302 * ARRAY_ELEM_PTR - Obtain the verified pointer to an array element 303 * @arr: array to index into 304 * @i: array index 305 * @n: number of elements in array 306 * 307 * Similar to MEMBER_VPTR() but is intended for use with arrays where the 308 * element count needs to be explicit. 309 * It can be used in cases where a global array is defined with an initial 310 * size but is intended to be be resized before loading the BPF program. 311 * Without this version of the macro, MEMBER_VPTR() will use the compile time 312 * size of the array to compute the max, which will result in rejection by 313 * the verifier. 314 */ 315 #ifndef ARRAY_ELEM_PTR 316 #define ARRAY_ELEM_PTR(arr, i, n) (typeof(arr[i]) *) \ 317 ({ \ 318 u64 __base = (u64)arr; \ 319 u64 __addr = (u64)&(arr[i]) - __base; \ 320 asm volatile ( \ 321 "if %0 <= %[max] goto +2\n" \ 322 "%0 = 0\n" \ 323 "goto +1\n" \ 324 "%0 += %1\n" \ 325 : "+r"(__addr) \ 326 : "r"(__base), \ 327 [max]"r"(sizeof(arr[0]) * ((n) - 1))); \ 328 __addr; \ 329 }) 330 #endif /* ARRAY_ELEM_PTR */ 331 332 /** 333 * __sink - Hide @expr's value from the compiler and BPF verifier 334 * @expr: The expression whose value should be opacified 335 * 336 * No-op at runtime. The empty inline assembly with a read-write constraint 337 * ("+g") has two effects at compile/verify time: 338 * 339 * 1. Compiler: treats @expr as both read and written, preventing dead-code 340 * elimination and keeping @expr (and any side effects that produced it) 341 * alive. 342 * 343 * 2. BPF verifier: forgets the precise value/range of @expr ("makes it 344 * imprecise"). The verifier normally tracks exact ranges for every register 345 * and stack slot. While useful, precision means each distinct value creates a 346 * separate verifier state. Inside loops this leads to state explosion - each 347 * iteration carries different precise values so states never merge and the 348 * verifier explores every iteration individually. 349 * 350 * Example - preventing loop state explosion:: 351 * 352 * u32 nr_intersects = 0, nr_covered = 0; 353 * __sink(nr_intersects); 354 * __sink(nr_covered); 355 * bpf_for(i, 0, nr_nodes) { 356 * if (intersects(cpumask, node_mask[i])) 357 * nr_intersects++; 358 * if (covers(cpumask, node_mask[i])) 359 * nr_covered++; 360 * } 361 * 362 * Without __sink(), the verifier tracks every possible (nr_intersects, 363 * nr_covered) pair across iterations, causing "BPF program is too large". With 364 * __sink(), the values become unknown scalars so all iterations collapse into 365 * one reusable state. 366 * 367 * Example - keeping a reference alive:: 368 * 369 * struct task_struct *t = bpf_task_acquire(task); 370 * __sink(t); 371 * 372 * Follows the convention from BPF selftests (bpf_misc.h). 373 */ 374 #define __sink(expr) asm volatile ("" : "+g"(expr)) 375 376 /* 377 * BPF declarations and helpers 378 */ 379 380 /* list and rbtree */ 381 #define __contains(name, node) __attribute__((btf_decl_tag("contains:" #name ":" #node))) 382 #define private(name) SEC(".data." #name) __hidden __attribute__((aligned(8))) 383 384 void *bpf_obj_new_impl(__u64 local_type_id, void *meta) __ksym; 385 void bpf_obj_drop_impl(void *kptr, void *meta) __ksym; 386 387 #define bpf_obj_new(type) ((type *)bpf_obj_new_impl(bpf_core_type_id_local(type), NULL)) 388 #define bpf_obj_drop(kptr) bpf_obj_drop_impl(kptr, NULL) 389 390 int bpf_list_push_front_impl(struct bpf_list_head *head, 391 struct bpf_list_node *node, 392 void *meta, __u64 off) __ksym; 393 #define bpf_list_push_front(head, node) bpf_list_push_front_impl(head, node, NULL, 0) 394 395 int bpf_list_push_back_impl(struct bpf_list_head *head, 396 struct bpf_list_node *node, 397 void *meta, __u64 off) __ksym; 398 #define bpf_list_push_back(head, node) bpf_list_push_back_impl(head, node, NULL, 0) 399 400 struct bpf_list_node *bpf_list_pop_front(struct bpf_list_head *head) __ksym; 401 struct bpf_list_node *bpf_list_pop_back(struct bpf_list_head *head) __ksym; 402 struct bpf_rb_node *bpf_rbtree_remove(struct bpf_rb_root *root, 403 struct bpf_rb_node *node) __ksym; 404 int bpf_rbtree_add_impl(struct bpf_rb_root *root, struct bpf_rb_node *node, 405 bool (less)(struct bpf_rb_node *a, const struct bpf_rb_node *b), 406 void *meta, __u64 off) __ksym; 407 #define bpf_rbtree_add(head, node, less) bpf_rbtree_add_impl(head, node, less, NULL, 0) 408 409 struct bpf_rb_node *bpf_rbtree_first(struct bpf_rb_root *root) __ksym; 410 411 void *bpf_refcount_acquire_impl(void *kptr, void *meta) __ksym; 412 #define bpf_refcount_acquire(kptr) bpf_refcount_acquire_impl(kptr, NULL) 413 414 /* task */ 415 struct task_struct *bpf_task_from_pid(s32 pid) __ksym; 416 struct task_struct *bpf_task_acquire(struct task_struct *p) __ksym; 417 void bpf_task_release(struct task_struct *p) __ksym; 418 419 /* cgroup */ 420 struct cgroup *bpf_cgroup_ancestor(struct cgroup *cgrp, int level) __ksym; 421 struct cgroup *bpf_cgroup_acquire(struct cgroup *cgrp) __ksym; 422 void bpf_cgroup_release(struct cgroup *cgrp) __ksym; 423 struct cgroup *bpf_cgroup_from_id(u64 cgid) __ksym; 424 425 /* css iteration */ 426 struct bpf_iter_css; 427 struct cgroup_subsys_state; 428 extern int bpf_iter_css_new(struct bpf_iter_css *it, 429 struct cgroup_subsys_state *start, 430 unsigned int flags) __weak __ksym; 431 extern struct cgroup_subsys_state * 432 bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym; 433 extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym; 434 435 /* cpumask */ 436 struct bpf_cpumask *bpf_cpumask_create(void) __ksym; 437 struct bpf_cpumask *bpf_cpumask_acquire(struct bpf_cpumask *cpumask) __ksym; 438 void bpf_cpumask_release(struct bpf_cpumask *cpumask) __ksym; 439 u32 bpf_cpumask_first(const struct cpumask *cpumask) __ksym; 440 u32 bpf_cpumask_first_zero(const struct cpumask *cpumask) __ksym; 441 void bpf_cpumask_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; 442 void bpf_cpumask_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; 443 bool bpf_cpumask_test_cpu(u32 cpu, const struct cpumask *cpumask) __ksym; 444 bool bpf_cpumask_test_and_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; 445 bool bpf_cpumask_test_and_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym; 446 void bpf_cpumask_setall(struct bpf_cpumask *cpumask) __ksym; 447 void bpf_cpumask_clear(struct bpf_cpumask *cpumask) __ksym; 448 bool bpf_cpumask_and(struct bpf_cpumask *dst, const struct cpumask *src1, 449 const struct cpumask *src2) __ksym; 450 void bpf_cpumask_or(struct bpf_cpumask *dst, const struct cpumask *src1, 451 const struct cpumask *src2) __ksym; 452 void bpf_cpumask_xor(struct bpf_cpumask *dst, const struct cpumask *src1, 453 const struct cpumask *src2) __ksym; 454 bool bpf_cpumask_equal(const struct cpumask *src1, const struct cpumask *src2) __ksym; 455 bool bpf_cpumask_intersects(const struct cpumask *src1, const struct cpumask *src2) __ksym; 456 bool bpf_cpumask_subset(const struct cpumask *src1, const struct cpumask *src2) __ksym; 457 bool bpf_cpumask_empty(const struct cpumask *cpumask) __ksym; 458 bool bpf_cpumask_full(const struct cpumask *cpumask) __ksym; 459 void bpf_cpumask_copy(struct bpf_cpumask *dst, const struct cpumask *src) __ksym; 460 u32 bpf_cpumask_any_distribute(const struct cpumask *cpumask) __ksym; 461 u32 bpf_cpumask_any_and_distribute(const struct cpumask *src1, 462 const struct cpumask *src2) __ksym; 463 u32 bpf_cpumask_weight(const struct cpumask *cpumask) __ksym; 464 465 int bpf_iter_bits_new(struct bpf_iter_bits *it, const u64 *unsafe_ptr__ign, u32 nr_words) __ksym; 466 int *bpf_iter_bits_next(struct bpf_iter_bits *it) __ksym; 467 void bpf_iter_bits_destroy(struct bpf_iter_bits *it) __ksym; 468 469 #define def_iter_struct(name) \ 470 struct bpf_iter_##name { \ 471 struct bpf_iter_bits it; \ 472 const struct cpumask *bitmap; \ 473 }; 474 475 #define def_iter_new(name) \ 476 static inline int bpf_iter_##name##_new( \ 477 struct bpf_iter_##name *it, const u64 *unsafe_ptr__ign, u32 nr_words) \ 478 { \ 479 it->bitmap = scx_bpf_get_##name##_cpumask(); \ 480 return bpf_iter_bits_new(&it->it, (const u64 *)it->bitmap, \ 481 sizeof(struct cpumask) / 8); \ 482 } 483 484 #define def_iter_next(name) \ 485 static inline int *bpf_iter_##name##_next(struct bpf_iter_##name *it) { \ 486 return bpf_iter_bits_next(&it->it); \ 487 } 488 489 #define def_iter_destroy(name) \ 490 static inline void bpf_iter_##name##_destroy(struct bpf_iter_##name *it) { \ 491 scx_bpf_put_cpumask(it->bitmap); \ 492 bpf_iter_bits_destroy(&it->it); \ 493 } 494 #define def_for_each_cpu(cpu, name) for_each_##name##_cpu(cpu) 495 496 /// Provides iterator for possible and online cpus. 497 /// 498 /// # Example 499 /// 500 /// ``` 501 /// static inline void example_use() { 502 /// int *cpu; 503 /// 504 /// for_each_possible_cpu(cpu){ 505 /// bpf_printk("CPU %d is possible", *cpu); 506 /// } 507 /// 508 /// for_each_online_cpu(cpu){ 509 /// bpf_printk("CPU %d is online", *cpu); 510 /// } 511 /// } 512 /// ``` 513 def_iter_struct(possible); 514 def_iter_new(possible); 515 def_iter_next(possible); 516 def_iter_destroy(possible); 517 #define for_each_possible_cpu(cpu) bpf_for_each(possible, cpu, NULL, 0) 518 519 def_iter_struct(online); 520 def_iter_new(online); 521 def_iter_next(online); 522 def_iter_destroy(online); 523 #define for_each_online_cpu(cpu) bpf_for_each(online, cpu, NULL, 0) 524 525 /* 526 * Access a cpumask in read-only mode (typically to check bits). 527 */ 528 static __always_inline const struct cpumask *cast_mask(struct bpf_cpumask *mask) 529 { 530 return (const struct cpumask *)mask; 531 } 532 533 /* 534 * True if the non-sleepable BPF trampoline prolog (__bpf_prog_enter) calls 535 * migrate_disable() for the current task. Recorded once by 536 * scx_lib_init_probe, an fentry program on bpf_scx_reg() that fires during 537 * the natural scheduler-attach call chain (auto-attached by scx_ops_attach!). 538 * 539 * Defaults to true (conservative). Over-reporting in is_migration_disabled() 540 * causes local-only dispatch, which is safe. Under-reporting can crash the 541 * scheduler, so we err high if the probe somehow fails to run. 542 */ 543 bool __scx_prolog_disables_migration __weak = true; 544 545 /* 546 * scx_lib_init_probe - non-sleepable prolog probe. 547 * 548 * Attached to bpf_scx_reg(), the .reg callback in bpf_sched_ext_ops 549 * (kernel/sched/ext.c). The kernel's struct_ops machinery invokes 550 * bpf_scx_reg when userspace creates the scheduler link, before 551 * ops.init() fires. Its address is taken in the vtable, so the symbol 552 * is non-inlinable and has been stable since introduction. 553 * 554 * Entering via fentry runs us through __bpf_prog_enter -- the 555 * non-sleepable prolog that consumers of is_migration_disabled() live 556 * under. 557 * 558 * Loud warning: the prolog adds at most 1 to migration_disabled. 559 * Reading > 1 means something upstream in the 560 * bpf_struct_ops_link_create -> bpf_scx_reg path disabled migration 561 * before the prolog ran, invalidating the probe; audit and adjust. 562 */ 563 SEC("fentry/bpf_scx_reg") __weak 564 int scx_lib_init_probe(void *ctx) 565 { 566 if (bpf_core_field_exists(((struct task_struct *)0)->migration_disabled)) { 567 const struct task_struct *p = bpf_get_current_task_btf(); 568 unsigned int md = p->migration_disabled; 569 570 if (md > 1) 571 bpf_printk("scx_lib_init_probe: unexpected migration_disabled=%u " 572 "upstream of BPF prolog; probe result unreliable", 573 md); 574 575 __scx_prolog_disables_migration = md > 0; 576 } 577 return 0; 578 } 579 580 /* 581 * Return true if task @p cannot migrate to a different CPU, false 582 * otherwise. 583 * 584 * IMPORTANT: designed for NON-SLEEPABLE BPF contexts only. Sleepable 585 * contexts (BPF_STRUCT_OPS_SLEEPABLE, SEC("syscall"), 586 * SEC("fentry.s/...")) enter via __bpf_prog_enter_sleepable() or 587 * __bpf_prog_enter_sleepable_recur(), both of which unconditionally 588 * call migrate_disable(); this helper can yield a false negative for 589 * p == current there, which can crash the scheduler. 590 */ 591 static inline bool is_migration_disabled(const struct task_struct *p) 592 { 593 /* 594 * Testing p->migration_disabled in BPF is tricky because the BPF prolog 595 * (__bpf_prog_enter) may call migrate_disable() for the current task, 596 * making migration_disabled == 1 even for tasks that are not truly 597 * migration-disabled. 598 * 599 * Since commit 8e4f0b1ebcf2 ("bpf: use rcu_read_lock_dont_migrate() for 600 * trampoline.c"), the BPF prolog calls migrate_disable() only when 601 * CONFIG_PREEMPT_RCU is enabled. Two fast paths cover the common cases: 602 * 603 * 1) CONFIG_PREEMPT_RCU: prolog always calls migrate_disable(), so 604 * migration_disabled == 1 for the current task is ambiguous. 605 * Disambiguate by checking p == current. 606 * 607 * 2) v6.18+ without CONFIG_PREEMPT_RCU: prolog never calls 608 * migrate_disable(), so migration_disabled == 1 is unambiguously 609 * a real migrate_disable() call. 610 * 611 * A slow path handles pre-v6.18 kernels without CONFIG_PREEMPT_RCU, 612 * where the prolog historically called migrate_disable() unconditionally 613 * but a cherry-picked downstream kernel may not. The runtime-probed flag 614 * __scx_prolog_disables_migration (set by scx_lib_init_probe) distinguishes 615 * the two cases without relying on the kernel version alone. 616 */ 617 if (bpf_core_field_exists(p->migration_disabled)) { 618 if (p->migration_disabled == 1) { 619 /* Fast path: prolog always disables migration */ 620 if (CONFIG_PREEMPT_RCU) 621 return bpf_get_current_task_btf() != p; 622 /* Fast path: prolog never disables migration */ 623 if (LINUX_KERNEL_VERSION >= KERNEL_VERSION(6, 18, 0)) 624 return true; 625 /* Slow path: pre-v6.18, !PREEMPT_RCU - use runtime flag */ 626 return __scx_prolog_disables_migration ? 627 bpf_get_current_task_btf() != p : true; 628 } 629 return p->migration_disabled; 630 } 631 return false; 632 } 633 634 /* rcu */ 635 void bpf_rcu_read_lock(void) __ksym; 636 void bpf_rcu_read_unlock(void) __ksym; 637 638 /* resilient qspinlock */ 639 int bpf_res_spin_lock(struct bpf_res_spin_lock *lock) __ksym __weak; 640 void bpf_res_spin_unlock(struct bpf_res_spin_lock *lock) __ksym __weak; 641 642 /* 643 * Time helpers, most of which are from jiffies.h. 644 */ 645 646 /** 647 * time_delta - Calculate the delta between new and old time stamp 648 * @after: first comparable as u64 649 * @before: second comparable as u64 650 * 651 * Return: the time difference, which is >= 0 652 */ 653 static inline s64 time_delta(u64 after, u64 before) 654 { 655 return (s64)(after - before) > 0 ? (s64)(after - before) : 0; 656 } 657 658 /** 659 * time_after - returns true if the time a is after time b. 660 * @a: first comparable as u64 661 * @b: second comparable as u64 662 * 663 * Do this with "<0" and ">=0" to only test the sign of the result. A 664 * good compiler would generate better code (and a really good compiler 665 * wouldn't care). Gcc is currently neither. 666 * 667 * Return: %true is time a is after time b, otherwise %false. 668 */ 669 static inline bool time_after(u64 a, u64 b) 670 { 671 return (s64)(b - a) < 0; 672 } 673 674 /** 675 * time_before - returns true if the time a is before time b. 676 * @a: first comparable as u64 677 * @b: second comparable as u64 678 * 679 * Return: %true is time a is before time b, otherwise %false. 680 */ 681 static inline bool time_before(u64 a, u64 b) 682 { 683 return time_after(b, a); 684 } 685 686 /** 687 * time_after_eq - returns true if the time a is after or the same as time b. 688 * @a: first comparable as u64 689 * @b: second comparable as u64 690 * 691 * Return: %true is time a is after or the same as time b, otherwise %false. 692 */ 693 static inline bool time_after_eq(u64 a, u64 b) 694 { 695 return (s64)(a - b) >= 0; 696 } 697 698 /** 699 * time_before_eq - returns true if the time a is before or the same as time b. 700 * @a: first comparable as u64 701 * @b: second comparable as u64 702 * 703 * Return: %true is time a is before or the same as time b, otherwise %false. 704 */ 705 static inline bool time_before_eq(u64 a, u64 b) 706 { 707 return time_after_eq(b, a); 708 } 709 710 /** 711 * time_in_range - Calculate whether a is in the range of [b, c]. 712 * @a: time to test 713 * @b: beginning of the range 714 * @c: end of the range 715 * 716 * Return: %true is time a is in the range [b, c], otherwise %false. 717 */ 718 static inline bool time_in_range(u64 a, u64 b, u64 c) 719 { 720 return time_after_eq(a, b) && time_before_eq(a, c); 721 } 722 723 /** 724 * time_in_range_open - Calculate whether a is in the range of [b, c). 725 * @a: time to test 726 * @b: beginning of the range 727 * @c: end of the range 728 * 729 * Return: %true is time a is in the range [b, c), otherwise %false. 730 */ 731 static inline bool time_in_range_open(u64 a, u64 b, u64 c) 732 { 733 return time_after_eq(a, b) && time_before(a, c); 734 } 735 736 737 /* 738 * Other helpers 739 */ 740 741 /* useful compiler attributes */ 742 #ifndef likely 743 #define likely(x) __builtin_expect(!!(x), 1) 744 #endif 745 #ifndef unlikely 746 #define unlikely(x) __builtin_expect(!!(x), 0) 747 #endif 748 #ifndef __maybe_unused 749 #define __maybe_unused __attribute__((__unused__)) 750 #endif 751 752 /* 753 * READ/WRITE_ONCE() are from kernel (include/asm-generic/rwonce.h). They 754 * prevent compiler from caching, redoing or reordering reads or writes. 755 */ 756 typedef __u8 __attribute__((__may_alias__)) __u8_alias_t; 757 typedef __u16 __attribute__((__may_alias__)) __u16_alias_t; 758 typedef __u32 __attribute__((__may_alias__)) __u32_alias_t; 759 typedef __u64 __attribute__((__may_alias__)) __u64_alias_t; 760 761 static __always_inline void __read_once_size(const volatile void *p, void *res, int size) 762 { 763 switch (size) { 764 case 1: *(__u8_alias_t *) res = *(volatile __u8_alias_t *) p; break; 765 case 2: *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break; 766 case 4: *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break; 767 case 8: *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break; 768 default: 769 barrier(); 770 __builtin_memcpy((void *)res, (const void *)p, size); 771 barrier(); 772 } 773 } 774 775 static __always_inline void __write_once_size(volatile void *p, void *res, int size) 776 { 777 switch (size) { 778 case 1: *(volatile __u8_alias_t *) p = *(__u8_alias_t *) res; break; 779 case 2: *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break; 780 case 4: *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break; 781 case 8: *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break; 782 default: 783 barrier(); 784 __builtin_memcpy((void *)p, (const void *)res, size); 785 barrier(); 786 } 787 } 788 789 /* 790 * __unqual_typeof(x) - Declare an unqualified scalar type, leaving 791 * non-scalar types unchanged, 792 * 793 * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char' 794 * is not type-compatible with 'signed char', and we define a separate case. 795 * 796 * This is copied verbatim from kernel's include/linux/compiler_types.h, but 797 * with default expression (for pointers) changed from (x) to (typeof(x)0). 798 * 799 * This is because LLVM has a bug where for lvalue (x), it does not get rid of 800 * an extra address_space qualifier, but does in case of rvalue (typeof(x)0). 801 * Hence, for pointers, we need to create an rvalue expression to get the 802 * desired type. See https://github.com/llvm/llvm-project/issues/53400. 803 */ 804 #define __scalar_type_to_expr_cases(type) \ 805 unsigned type : (unsigned type)0, signed type : (signed type)0 806 807 #define __unqual_typeof(x) \ 808 typeof(_Generic((x), \ 809 char: (char)0, \ 810 __scalar_type_to_expr_cases(char), \ 811 __scalar_type_to_expr_cases(short), \ 812 __scalar_type_to_expr_cases(int), \ 813 __scalar_type_to_expr_cases(long), \ 814 __scalar_type_to_expr_cases(long long), \ 815 default: (typeof(x))0)) 816 817 #define READ_ONCE(x) \ 818 ({ \ 819 union { __unqual_typeof(x) __val; char __c[1]; } __u = \ 820 { .__c = { 0 } }; \ 821 __read_once_size((__unqual_typeof(x) *)&(x), __u.__c, sizeof(x)); \ 822 __u.__val; \ 823 }) 824 825 #define WRITE_ONCE(x, val) \ 826 ({ \ 827 union { __unqual_typeof(x) __val; char __c[1]; } __u = \ 828 { .__val = (val) }; \ 829 __write_once_size((__unqual_typeof(x) *)&(x), __u.__c, sizeof(x)); \ 830 __u.__val; \ 831 }) 832 833 /* 834 * __calc_avg - Calculate exponential weighted moving average (EWMA) with 835 * @old and @new values. @decay represents how large the @old value remains. 836 * With a larger @decay value, the moving average changes slowly, exhibiting 837 * fewer fluctuations. 838 */ 839 #define __calc_avg(old, new, decay) ({ \ 840 typeof(decay) thr = 1 << (decay); \ 841 typeof(old) ret; \ 842 if (((old) < thr) || ((new) < thr)) { \ 843 if (((old) == 1) && ((new) == 0)) \ 844 ret = 0; \ 845 else \ 846 ret = ((old) - ((old) >> 1)) + ((new) >> 1); \ 847 } else { \ 848 ret = ((old) - ((old) >> (decay))) + ((new) >> (decay)); \ 849 } \ 850 ret; \ 851 }) 852 853 /* 854 * log2_u32 - Compute the base 2 logarithm of a 32-bit exponential value. 855 * @v: The value for which we're computing the base 2 logarithm. 856 */ 857 static inline u32 log2_u32(u32 v) 858 { 859 u32 r; 860 u32 shift; 861 862 r = (v > 0xFFFF) << 4; v >>= r; 863 shift = (v > 0xFF) << 3; v >>= shift; r |= shift; 864 shift = (v > 0xF) << 2; v >>= shift; r |= shift; 865 shift = (v > 0x3) << 1; v >>= shift; r |= shift; 866 r |= (v >> 1); 867 return r; 868 } 869 870 /* 871 * log2_u64 - Compute the base 2 logarithm of a 64-bit exponential value. 872 * @v: The value for which we're computing the base 2 logarithm. 873 */ 874 static inline u32 log2_u64(u64 v) 875 { 876 u32 hi = v >> 32; 877 if (hi) 878 return log2_u32(hi) + 32 + 1; 879 else 880 return log2_u32(v) + 1; 881 } 882 883 /* 884 * sqrt_u64 - Calculate the square root of value @x using Newton's method. 885 */ 886 static inline u64 __sqrt_u64(u64 x) 887 { 888 if (x == 0 || x == 1) 889 return x; 890 891 u64 r = ((1ULL << 32) > x) ? x : (1ULL << 32); 892 893 for (int i = 0; i < 8; ++i) { 894 u64 q = x / r; 895 if (r <= q) 896 break; 897 r = (r + q) >> 1; 898 } 899 return r; 900 } 901 902 /* 903 * ctzll -- Counts trailing zeros in an unsigned long long. If the input value 904 * is zero, the return value is undefined. 905 */ 906 static inline int ctzll(u64 v) 907 { 908 #if (!defined(__BPF__) && defined(__SCX_TARGET_ARCH_x86)) || \ 909 (defined(__BPF__) && defined(__clang_major__) && __clang_major__ >= 19) 910 /* 911 * Use the ctz builtin when: (1) building for native x86, or 912 * (2) building for BPF with clang >= 19 (BPF backend supports 913 * the intrinsic from clang 19 onward; earlier versions hit 914 * "unimplemented opcode" in the backend). 915 */ 916 return __builtin_ctzll(v); 917 #else 918 /* 919 * If neither the target architecture nor the toolchains support ctzll, 920 * use software-based emulation. Let's use the De Bruijn sequence-based 921 * approach to find LSB fastly. See the details of De Bruijn sequence: 922 * 923 * https://en.wikipedia.org/wiki/De_Bruijn_sequence 924 * https://www.chessprogramming.org/BitScan#De_Bruijn_Multiplication 925 */ 926 const int lookup_table[64] = { 927 0, 1, 48, 2, 57, 49, 28, 3, 61, 58, 50, 42, 38, 29, 17, 4, 928 62, 55, 59, 36, 53, 51, 43, 22, 45, 39, 33, 30, 24, 18, 12, 5, 929 63, 47, 56, 27, 60, 41, 37, 16, 54, 35, 52, 21, 44, 32, 23, 11, 930 46, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6, 931 }; 932 const u64 DEBRUIJN_CONSTANT = 0x03f79d71b4cb0a89ULL; 933 unsigned int index; 934 u64 lowest_bit; 935 const int *lt; 936 937 if (v == 0) 938 return -1; 939 940 /* 941 * Isolate the least significant bit (LSB). 942 * For example, if v = 0b...10100, then v & -v = 0b...00100 943 */ 944 lowest_bit = v & -v; 945 946 /* 947 * Each isolated bit produces a unique 6-bit value, guaranteed by the 948 * De Bruijn property. Calculate a unique index into the lookup table 949 * using the magic constant and a right shift. 950 * 951 * Multiplying by the 64-bit constant "spreads out" that 1-bit into a 952 * unique pattern in the top 6 bits. This uniqueness property is 953 * exactly what a De Bruijn sequence guarantees: Every possible 6-bit 954 * pattern (in top bits) occurs exactly once for each LSB position. So, 955 * the constant 0x03f79d71b4cb0a89ULL is carefully chosen to be a 956 * De Bruijn sequence, ensuring no collisions in the table index. 957 */ 958 index = (lowest_bit * DEBRUIJN_CONSTANT) >> 58; 959 960 /* 961 * Lookup in a precomputed table. No collision is guaranteed by the 962 * De Bruijn property. 963 */ 964 lt = MEMBER_VPTR(lookup_table, [index]); 965 return (lt)? *lt : -1; 966 #endif 967 } 968 969 /* 970 * Return a value proportionally scaled to the task's weight. 971 */ 972 static inline u64 scale_by_task_weight(const struct task_struct *p, u64 value) 973 { 974 return (value * p->scx.weight) / 100; 975 } 976 977 /* 978 * Return a value inversely proportional to the task's weight. 979 */ 980 static inline u64 scale_by_task_weight_inverse(const struct task_struct *p, u64 value) 981 { 982 return value * 100 / p->scx.weight; 983 } 984 985 986 /* 987 * Get a random u64 from the kernel's pseudo-random generator. 988 */ 989 static inline u64 get_prandom_u64() 990 { 991 return ((u64)bpf_get_prandom_u32() << 32) | bpf_get_prandom_u32(); 992 } 993 994 /* 995 * Define the shadow structure to avoid a compilation error when 996 * vmlinux.h does not enable necessary kernel configs. The ___local 997 * suffix is a CO-RE convention that tells the loader to match this 998 * against the base struct rq in the kernel. The attribute 999 * preserve_access_index tells the compiler to generate a CO-RE 1000 * relocation for these fields. 1001 */ 1002 struct rq___local { 1003 /* 1004 * A monotonically increasing clock per CPU. It is rq->clock minus 1005 * cumulative IRQ time and hypervisor steal time. Unlike rq->clock, 1006 * it does not advance during IRQ processing or hypervisor preemption. 1007 * It does advance during idle (the idle task counts as a running task 1008 * for this purpose). 1009 */ 1010 u64 clock_task; 1011 /* 1012 * Invariant version of clock_task scaled by CPU capacity and 1013 * frequency. For example, clock_pelt advances 2x slower on a CPU 1014 * with half the capacity. 1015 * 1016 * At idle exit, rq->clock_pelt jumps forward to resync with 1017 * clock_task. The kernel's rq_clock_pelt() corrects for this jump 1018 * by subtracting lost_idle_time, yielding a clock that appears 1019 * continuous across idle transitions. scx_clock_pelt() mirrors 1020 * rq_clock_pelt() by performing the same subtraction. 1021 */ 1022 u64 clock_pelt; 1023 /* 1024 * Accumulates the magnitude of each clock_pelt jump at idle exit. 1025 * Subtracting this from clock_pelt gives rq_clock_pelt(): a 1026 * continuous, capacity-invariant clock suitable for both task 1027 * execution time stamping and cross-idle measurements. 1028 */ 1029 unsigned long lost_idle_time; 1030 /* 1031 * Shadow of paravirt_steal_clock() (the hypervisor's cumulative 1032 * stolen time counter). Stays frozen while the hypervisor preempts 1033 * the vCPU; catches up the next time update_rq_clock_task() is 1034 * called. The delta is the stolen time not yet subtracted from 1035 * clock_task. 1036 * 1037 * Unlike irqtime->total (a plain kernel-side field), the live stolen 1038 * time counter lives in hypervisor-specific shared memory and has no 1039 * kernel-side equivalent readable from BPF in a hypervisor-agnostic 1040 * way. This field is therefore the only portable BPF-accessible 1041 * approximation of cumulative steal time. 1042 * 1043 * Available only when CONFIG_PARAVIRT_TIME_ACCOUNTING is on. 1044 */ 1045 u64 prev_steal_time_rq; 1046 } __attribute__((preserve_access_index)); 1047 1048 extern struct rq runqueues __ksym; 1049 1050 /* 1051 * Define the shadow structure to avoid a compilation error when 1052 * vmlinux.h does not enable necessary kernel configs. 1053 */ 1054 struct irqtime___local { 1055 /* 1056 * Cumulative IRQ time counter for this CPU, in nanoseconds. Advances 1057 * immediately at the exit of every hardirq and non-ksoftirqd softirq 1058 * via irqtime_account_irq(). ksoftirqd time is counted as normal 1059 * task time and is NOT included. NMI time is also NOT included. 1060 * 1061 * The companion field irqtime->sync (struct u64_stats_sync) protects 1062 * against 64-bit tearing on 32-bit architectures. On 64-bit kernels, 1063 * u64_stats_sync is an empty struct and all seqcount operations are 1064 * no-ops, so a plain BPF_CORE_READ of this field is safe. 1065 * 1066 * Available only when CONFIG_IRQ_TIME_ACCOUNTING is on. 1067 */ 1068 u64 total; 1069 } __attribute__((preserve_access_index)); 1070 1071 /* 1072 * cpu_irqtime is a per-CPU variable defined only when 1073 * CONFIG_IRQ_TIME_ACCOUNTING is on. Declare it as __weak so the BPF 1074 * loader sets its address to 0 (rather than failing) when the symbol 1075 * is absent from the running kernel. 1076 */ 1077 extern struct irqtime___local cpu_irqtime __ksym __weak; 1078 1079 static inline struct rq___local *get_current_rq(u32 cpu) 1080 { 1081 /* 1082 * This is a workaround to get an rq pointer now that 1083 * scx_bpf_cpu_rq() has been removed. 1084 * 1085 * WARNING: The caller must hold the rq lock for @cpu. This is 1086 * guaranteed when called from scheduling callbacks (ops.running, 1087 * ops.stopping, ops.enqueue, ops.dequeue, ops.dispatch, etc.). 1088 * There is no runtime check available in BPF for kernel spinlock 1089 * state — correctness is enforced by calling context only. 1090 */ 1091 return (void *)bpf_per_cpu_ptr(&runqueues, cpu); 1092 } 1093 1094 static inline u64 scx_clock_task(u32 cpu) 1095 { 1096 struct rq___local *rq = get_current_rq(cpu); 1097 1098 /* 1099 * Equivalent to the kernel's rq_clock_task(): wall-clock time minus 1100 * cumulative IRQ time (CONFIG_IRQ_TIME_ACCOUNTING) and hypervisor 1101 * steal time (CONFIG_PARAVIRT_TIME_ACCOUNTING). Without those configs, 1102 * it equals rq->clock. 1103 * 1104 * Conceptually this clock advances during idle (the idle task counts 1105 * as a running task), but rq->clock_task is only updated on scheduling 1106 * events. With NO_HZ_IDLE (the default), the periodic tick is stopped 1107 * on idle CPUs, so rq->clock_task is not refreshed while a CPU is 1108 * idle. Reading this clock for a remote idle CPU from a BPF timer 1109 * callback returns the value from when the CPU last went idle, making 1110 * the delta over an idle interval effectively zero. 1111 */ 1112 return rq ? rq->clock_task : 0; 1113 } 1114 1115 static inline u64 scx_clock_pelt(u32 cpu) 1116 { 1117 struct rq___local *rq = get_current_rq(cpu); 1118 1119 /* 1120 * Equivalent to the kernel's rq_clock_pelt(): subtracts 1121 * lost_idle_time from clock_pelt to absorb the jump that occurs 1122 * when clock_pelt resyncs with clock_task at idle exit. The intent 1123 * is a continuous, capacity- and frequency-invariant clock that is 1124 * frozen during idle, IRQ, and hypervisor steal. 1125 * 1126 * However, like scx_clock_task(), this clock has a stale-read issue 1127 * for remote idle CPUs with NO_HZ_IDLE (the default). clock_pelt 1128 * itself advances at wall-clock rate (hardware-clock based), but 1129 * lost_idle_time is only updated via update_rq_clock_pelt(), which 1130 * requires update_rq_clock() to be called. With NO_HZ_IDLE, the 1131 * periodic tick is stopped on idle CPUs, so lost_idle_time is not 1132 * refreshed during idle. Reading this clock for a remote idle CPU 1133 * from a BPF timer callback therefore returns a value that drifts 1134 * at wall-clock rate -- the same stale behaviour as scx_clock_task(). 1135 * 1136 * Without NO_HZ_IDLE, periodic ticks keep lost_idle_time nearly in 1137 * sync (stale by at most one tick period, ~1 ms), so the result is 1138 * accurate. 1139 */ 1140 return rq ? (rq->clock_pelt - rq->lost_idle_time) : 0; 1141 } 1142 1143 static inline u64 scx_clock_virt(u32 cpu) 1144 { 1145 struct rq___local *rq; 1146 1147 /* 1148 * Check field existence before calling get_current_rq() so we avoid 1149 * the per_cpu lookup entirely on kernels built without 1150 * CONFIG_PARAVIRT_TIME_ACCOUNTING. 1151 */ 1152 if (!bpf_core_field_exists(((struct rq___local *)0)->prev_steal_time_rq)) 1153 return 0; 1154 1155 /* Lagging shadow of the kernel's paravirt_steal_clock(). */ 1156 rq = get_current_rq(cpu); 1157 return rq ? BPF_CORE_READ(rq, prev_steal_time_rq) : 0; 1158 } 1159 1160 static inline u64 scx_clock_irq(u32 cpu) 1161 { 1162 struct irqtime___local *irqt; 1163 1164 /* 1165 * bpf_core_type_exists() resolves at load time: if struct irqtime is 1166 * absent from kernel BTF (CONFIG_IRQ_TIME_ACCOUNTING off), the loader 1167 * patches this into an unconditional return 0, making the 1168 * bpf_per_cpu_ptr() call below dead code that the verifier never sees. 1169 */ 1170 if (!bpf_core_type_exists(struct irqtime___local)) 1171 return 0; 1172 1173 /* Equivalent to the kernel's irq_time_read(). */ 1174 irqt = bpf_per_cpu_ptr(&cpu_irqtime, cpu); 1175 return irqt ? BPF_CORE_READ(irqt, total) : 0; 1176 } 1177 1178 /* Abbreviated forms of <linux/overflow.h>'s struct_size() family. */ 1179 #define flex_array_size(p, member, count) \ 1180 ((count) * sizeof(*(p)->member)) 1181 1182 #define struct_size(p, member, count) \ 1183 (offsetof(typeof(*(p)), member) + flex_array_size(p, member, count)) 1184 1185 #define struct_size_t(type, member, count) \ 1186 struct_size((type *)NULL, member, count) 1187 1188 #include "compat.bpf.h" 1189 #include "enums.bpf.h" 1190 #include "cid.bpf.h" 1191 1192 #endif /* __SCX_COMMON_BPF_H */ 1193