Add two simple example BPF schedulers - simple and qmap. * simple: In terms of scheduling, it behaves identical to not having any operation implemented at all. The two operations it implements are only to improve visibility and exit handling. On certain homogeneous configurations, this actually can perform pretty well. * qmap: A fixed five level priority scheduler to demonstrate queueing PIDs on BPF maps for scheduling. While not very practical, this is useful as a simple example and will be used to demonstrate different features. v7: - Compat helpers stripped out in prepartion of upstreaming as the upstreamed patchset will be the baselinfe. Utility macros that can be used to implement compat features are kept. - Explicitly disable map autoattach on struct_ops to avoid trying to attach twice while maintaining compatbility with older libbpf. v6: - Common header files reorganized and cleaned up. Compat helpers are added to demonstrate how schedulers can maintain backward compatibility with older kernels while making use of newly added features. - simple_select_cpu() added to keep track of the number of local dispatches. This is needed because the default ops.select_cpu() implementation is updated to dispatch directly and won't call ops.enqueue(). - Updated to reflect the sched_ext API changes. Switching all tasks is the default behavior now and scx_qmap supports partial switching when `-p` is specified. - tools/sched_ext/Kconfig dropped. This will be included in the doc instead. v5: - Improve Makefile. Build artifects are now collected into a separate dir which change be changed. Install and help targets are added and clean actually cleans everything. - MEMBER_VPTR() improved to improve access to structs. ARRAY_ELEM_PTR() and RESIZEABLE_ARRAY() are added to support resizable arrays in .bss. - Add scx_common.h which provides common utilities to user code such as SCX_BUG[_ON]() and RESIZE_ARRAY(). - Use SCX_BUG[_ON]() to simplify error handling. v4: - Dropped _example prefix from scheduler names. v3: - Rename scx_example_dummy to scx_example_simple and restructure a bit to ease later additions. Comment updates. - Added declarations for BPF inline iterators. In the future, hopefully, these will be consolidated into a generic BPF header so that they don't need to be replicated here. v2: - Updated with the generic BPF cpumask helpers. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: David Vernet <dvernet@meta.com> Acked-by: Josh Don <joshdon@google.com> Acked-by: Hao Luo <haoluo@google.com> Acked-by: Barret Rhoden <brho@google.com>
64 lines
1.7 KiB
C
64 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Define struct user_exit_info which is shared between BPF and userspace parts
|
|
* to communicate exit status and other information.
|
|
*
|
|
* Copyright (c) 2022 Meta Platforms, Inc. and affiliates.
|
|
* Copyright (c) 2022 Tejun Heo <tj@kernel.org>
|
|
* Copyright (c) 2022 David Vernet <dvernet@meta.com>
|
|
*/
|
|
#ifndef __USER_EXIT_INFO_H
|
|
#define __USER_EXIT_INFO_H
|
|
|
|
enum uei_sizes {
|
|
UEI_REASON_LEN = 128,
|
|
UEI_MSG_LEN = 1024,
|
|
};
|
|
|
|
struct user_exit_info {
|
|
int kind;
|
|
s64 exit_code;
|
|
char reason[UEI_REASON_LEN];
|
|
char msg[UEI_MSG_LEN];
|
|
};
|
|
|
|
#ifdef __bpf__
|
|
|
|
#include "vmlinux.h"
|
|
#include <bpf/bpf_core_read.h>
|
|
|
|
#define UEI_DEFINE(__name) \
|
|
struct user_exit_info __name SEC(".data")
|
|
|
|
#define UEI_RECORD(__uei_name, __ei) ({ \
|
|
bpf_probe_read_kernel_str(__uei_name.reason, \
|
|
sizeof(__uei_name.reason), (__ei)->reason); \
|
|
bpf_probe_read_kernel_str(__uei_name.msg, \
|
|
sizeof(__uei_name.msg), (__ei)->msg); \
|
|
if (bpf_core_field_exists((__ei)->exit_code)) \
|
|
__uei_name.exit_code = (__ei)->exit_code; \
|
|
/* use __sync to force memory barrier */ \
|
|
__sync_val_compare_and_swap(&__uei_name.kind, __uei_name.kind, \
|
|
(__ei)->kind); \
|
|
})
|
|
|
|
#else /* !__bpf__ */
|
|
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
|
|
#define UEI_EXITED(__skel, __uei_name) ({ \
|
|
/* use __sync to force memory barrier */ \
|
|
__sync_val_compare_and_swap(&(__skel)->data->__uei_name.kind, -1, -1); \
|
|
})
|
|
|
|
#define UEI_REPORT(__skel, __uei_name) ({ \
|
|
struct user_exit_info *__uei = &(__skel)->data->__uei_name; \
|
|
fprintf(stderr, "EXIT: %s", __uei->reason); \
|
|
if (__uei->msg[0] != '\0') \
|
|
fprintf(stderr, " (%s)", __uei->msg); \
|
|
fputs("\n", stderr); \
|
|
})
|
|
|
|
#endif /* __bpf__ */
|
|
#endif /* __USER_EXIT_INFO_H */
|