1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2024 Meta Platforms, Inc. and affiliates.
4 * Copyright (c) 2024 David Vernet <dvernet@meta.com>
7 #include <scx/common.bpf.h>
9 char _license
[] SEC("license") = "GPL";
11 #include "hotplug_test.h"
15 void BPF_STRUCT_OPS(hotplug_exit
, struct scx_exit_info
*ei
)
20 static void exit_from_hotplug(s32 cpu
, bool onlining
)
23 * Ignored, just used to verify that we can invoke blocking kfuncs
24 * from the hotplug path.
26 scx_bpf_create_dsq(0, -1);
28 s64 code
= SCX_ECODE_ACT_RESTART
| HOTPLUG_EXIT_RSN
;
31 code
|= HOTPLUG_ONLINING
;
33 scx_bpf_exit(code
, "hotplug event detected (%d going %s)", cpu
,
34 onlining
? "online" : "offline");
37 void BPF_STRUCT_OPS_SLEEPABLE(hotplug_cpu_online
, s32 cpu
)
39 exit_from_hotplug(cpu
, true);
42 void BPF_STRUCT_OPS_SLEEPABLE(hotplug_cpu_offline
, s32 cpu
)
44 exit_from_hotplug(cpu
, false);
47 SEC(".struct_ops.link")
48 struct sched_ext_ops hotplug_cb_ops
= {
49 .cpu_online
= (void *) hotplug_cpu_online
,
50 .cpu_offline
= (void *) hotplug_cpu_offline
,
51 .exit
= (void *) hotplug_exit
,
52 .name
= "hotplug_cbs",
56 SEC(".struct_ops.link")
57 struct sched_ext_ops hotplug_nocb_ops
= {
58 .exit
= (void *) hotplug_exit
,
59 .name
= "hotplug_nocbs",