Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465/* SPDX-License-Identifier: GPL-2.0 *//* * Copyright (c) 2024 Meta Platforms, Inc. and affiliates. * Copyright (c) 2024 David Vernet <dvernet@meta.com> */#include <bpf/bpf.h>#include <sched.h>#include <scx/common.h>#include <sys/wait.h>#include <unistd.h>#include "exit.bpf.skel.h"#include "scx_test.h"
#include "exit_test.h"
static enum scx_test_status run(void *ctx){ enum exit_test_case tc;
for (tc = 0; tc < NUM_EXITS; tc++) { struct exit *skel; struct bpf_link *link; char buf[16];
/* * On single-CPU systems, ops.select_cpu() is never * invoked, so skip this test to avoid getting stuck * indefinitely. */ if (tc == EXIT_SELECT_CPU && libbpf_num_possible_cpus() == 1) continue;
skel = exit__open(); SCX_ENUM_INIT(skel); skel->rodata->exit_point = tc; SCX_FAIL_IF(exit__load(skel), "Failed to load skel"); link = bpf_map__attach_struct_ops(skel->maps.exit_ops); if (!link) { SCX_ERR("Failed to attach scheduler"); exit__destroy(skel); return SCX_TEST_FAIL; }
/* Assumes uei.kind is written last */ while (skel->data->uei.kind == EXIT_KIND(SCX_EXIT_NONE)) sched_yield();
SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_UNREG_BPF)); SCX_EQ(skel->data->uei.exit_code, tc); sprintf(buf, "%d", tc); SCX_ASSERT(!strcmp(skel->data->uei.msg, buf)); bpf_link__destroy(link); exit__destroy(skel); }
return SCX_TEST_PASS;}
struct scx_test exit_test = { .name = "exit", .description = "Verify we can cleanly exit a scheduler in multiple places", .run = run,};REGISTER_SCX_TEST(&exit_test)