1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2024 Meta Platforms, Inc. and affiliates. 4 * Copyright (c) 2024 David Vernet <dvernet@meta.com> 5 */ 6 7 #include <scx/common.bpf.h> 8 9 char _license[] SEC("license") = "GPL"; 10 11 #include "hotplug_test.h" 12 13 UEI_DEFINE(uei); 14 15 void BPF_STRUCT_OPS(hotplug_exit, struct scx_exit_info *ei) 16 { 17 UEI_RECORD(uei, ei); 18 } 19 20 static void exit_from_hotplug(s32 cpu, bool onlining) 21 { 22 /* 23 * Ignored, just used to verify that we can invoke blocking kfuncs 24 * from the hotplug path. 25 */ 26 scx_bpf_create_dsq(0, -1); 27 28 s64 code = SCX_ECODE_ACT_RESTART | HOTPLUG_EXIT_RSN; 29 30 if (onlining) 31 code |= HOTPLUG_ONLINING; 32 33 scx_bpf_exit(code, "hotplug event detected (%d going %s)", cpu, 34 onlining ? "online" : "offline"); 35 } 36 37 void BPF_STRUCT_OPS_SLEEPABLE(hotplug_cpu_online, s32 cpu) 38 { 39 exit_from_hotplug(cpu, true); 40 } 41 42 void BPF_STRUCT_OPS_SLEEPABLE(hotplug_cpu_offline, s32 cpu) 43 { 44 exit_from_hotplug(cpu, false); 45 } 46 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", 53 .timeout_ms = 1000U, 54 }; 55 56 SEC(".struct_ops.link") 57 struct sched_ext_ops hotplug_nocb_ops = { 58 .exit = (void *) hotplug_exit, 59 .name = "hotplug_nocbs", 60 .timeout_ms = 1000U, 61 }; 62