Commit 2bac648d authored by Tejun Heo's avatar Tejun Heo
Browse files

tools/sched_ext: Sync with scx repo

Synchronize with https://github.com/sched-ext/scx

 at dc44584874f0 ("kernel:
Synchronize with kernel tools/sched_ext").

- READ/WRITE_ONCE() is made more proper and READA_ONCE_ARENA() is dropped.

- scale_by_task_weight[_inverse]() helpers added.

- Enum defs expanded to cover more and new enums.

- Don't trigger fatal error when some enums are missing from kernel BTF.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent f0c6eab5
Loading
Loading
Loading
Loading
+57 −28
Original line number Diff line number Diff line
@@ -586,35 +586,47 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
	}
}

/*
 * __unqual_typeof(x) - Declare an unqualified scalar type, leaving
 *			non-scalar types unchanged,
 *
 * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char'
 * is not type-compatible with 'signed char', and we define a separate case.
 *
 * This is copied verbatim from kernel's include/linux/compiler_types.h, but
 * with default expression (for pointers) changed from (x) to (typeof(x)0).
 *
 * This is because LLVM has a bug where for lvalue (x), it does not get rid of
 * an extra address_space qualifier, but does in case of rvalue (typeof(x)0).
 * Hence, for pointers, we need to create an rvalue expression to get the
 * desired type. See https://github.com/llvm/llvm-project/issues/53400.
 */
#define __scalar_type_to_expr_cases(type) \
	unsigned type : (unsigned type)0, signed type : (signed type)0

#define __unqual_typeof(x)                              \
	typeof(_Generic((x),                            \
		char: (char)0,                          \
		__scalar_type_to_expr_cases(char),      \
		__scalar_type_to_expr_cases(short),     \
		__scalar_type_to_expr_cases(int),       \
		__scalar_type_to_expr_cases(long),      \
		__scalar_type_to_expr_cases(long long), \
		default: (typeof(x))0))

#define READ_ONCE(x)								\
({										\
	union { typeof(x) __val; char __c[1]; } __u =	\
	union { __unqual_typeof(x) __val; char __c[1]; } __u =			\
		{ .__c = { 0 } };						\
	__read_once_size(&(x), __u.__c, sizeof(x));	\
	__read_once_size((__unqual_typeof(x) *)&(x), __u.__c, sizeof(x));	\
	__u.__val;								\
})

#define WRITE_ONCE(x, val)							\
({										\
	union { typeof(x) __val; char __c[1]; } __u =	\
	union { __unqual_typeof(x) __val; char __c[1]; } __u =			\
		{ .__val = (val) }; 						\
	__write_once_size(&(x), __u.__c, sizeof(x));	\
	__u.__val;					\
})

#define READ_ONCE_ARENA(type, x)				\
({								\
	union { type __val; char __c[1]; } __u =		\
		{ .__c = { 0 } };				\
	__read_once_size((void *)&(x), __u.__c, sizeof(x));	\
	__u.__val;						\
})

#define WRITE_ONCE_ARENA(type, x, val)				\
({								\
	union { type __val; char __c[1]; } __u =		\
		{ .__val = (val) }; 				\
	__write_once_size((void *)&(x), __u.__c, sizeof(x));	\
	__write_once_size((__unqual_typeof(x) *)&(x), __u.__c, sizeof(x));	\
	__u.__val;								\
})

@@ -648,6 +660,23 @@ static inline u32 log2_u64(u64 v)
                return log2_u32(v) + 1;
}

/*
 * Return a value proportionally scaled to the task's weight.
 */
static inline u64 scale_by_task_weight(const struct task_struct *p, u64 value)
{
	return (value * p->scx.weight) / 100;
}

/*
 * Return a value inversely proportional to the task's weight.
 */
static inline u64 scale_by_task_weight_inverse(const struct task_struct *p, u64 value)
{
	return value * 100 / p->scx.weight;
}


#include "compat.bpf.h"
#include "enums.bpf.h"

+3 −0
Original line number Diff line number Diff line
@@ -88,6 +88,8 @@
#define HAVE_SCX_OPS_ENQ_LAST
#define HAVE_SCX_OPS_ENQ_EXITING
#define HAVE_SCX_OPS_SWITCH_PARTIAL
#define HAVE_SCX_OPS_ENQ_MIGRATION_DISABLED
#define HAVE_SCX_OPS_ALLOW_QUEUED_WAKEUP
#define HAVE_SCX_OPS_HAS_CGROUP_WEIGHT
#define HAVE_SCX_OPS_ALL_FLAGS
#define HAVE_SCX_OPSS_NONE
@@ -104,6 +106,7 @@
#define HAVE_SCX_RQ_BAL_PENDING
#define HAVE_SCX_RQ_BAL_KEEP
#define HAVE_SCX_RQ_BYPASSING
#define HAVE_SCX_RQ_CLK_VALID
#define HAVE_SCX_RQ_IN_WAKEUP
#define HAVE_SCX_RQ_IN_BALANCE
#define HAVE_SCX_TASK_NONE
+24 −0
Original line number Diff line number Diff line
@@ -13,6 +13,30 @@ const volatile u64 __SCX_SLICE_DFL __weak;
const volatile u64 __SCX_SLICE_INF __weak;
#define SCX_SLICE_INF __SCX_SLICE_INF

const volatile u64 __SCX_RQ_ONLINE __weak;
#define SCX_RQ_ONLINE __SCX_RQ_ONLINE

const volatile u64 __SCX_RQ_CAN_STOP_TICK __weak;
#define SCX_RQ_CAN_STOP_TICK __SCX_RQ_CAN_STOP_TICK

const volatile u64 __SCX_RQ_BAL_PENDING __weak;
#define SCX_RQ_BAL_PENDING __SCX_RQ_BAL_PENDING

const volatile u64 __SCX_RQ_BAL_KEEP __weak;
#define SCX_RQ_BAL_KEEP __SCX_RQ_BAL_KEEP

const volatile u64 __SCX_RQ_BYPASSING __weak;
#define SCX_RQ_BYPASSING __SCX_RQ_BYPASSING

const volatile u64 __SCX_RQ_CLK_VALID __weak;
#define SCX_RQ_CLK_VALID __SCX_RQ_CLK_VALID

const volatile u64 __SCX_RQ_IN_WAKEUP __weak;
#define SCX_RQ_IN_WAKEUP __SCX_RQ_IN_WAKEUP

const volatile u64 __SCX_RQ_IN_BALANCE __weak;
#define SCX_RQ_IN_BALANCE __SCX_RQ_IN_BALANCE

const volatile u64 __SCX_DSQ_FLAG_BUILTIN __weak;
#define SCX_DSQ_FLAG_BUILTIN __SCX_DSQ_FLAG_BUILTIN

+8 −0
Original line number Diff line number Diff line
@@ -8,6 +8,14 @@
	SCX_ENUM_SET(skel, scx_public_consts, SCX_OPS_NAME_LEN); \
	SCX_ENUM_SET(skel, scx_public_consts, SCX_SLICE_DFL); \
	SCX_ENUM_SET(skel, scx_public_consts, SCX_SLICE_INF); \
	SCX_ENUM_SET(skel, scx_rq_flags, SCX_RQ_ONLINE); \
	SCX_ENUM_SET(skel, scx_rq_flags, SCX_RQ_CAN_STOP_TICK); \
	SCX_ENUM_SET(skel, scx_rq_flags, SCX_RQ_BAL_PENDING); \
	SCX_ENUM_SET(skel, scx_rq_flags, SCX_RQ_BAL_KEEP); \
	SCX_ENUM_SET(skel, scx_rq_flags, SCX_RQ_BYPASSING); \
	SCX_ENUM_SET(skel, scx_rq_flags, SCX_RQ_CLK_VALID); \
	SCX_ENUM_SET(skel, scx_rq_flags, SCX_RQ_IN_WAKEUP); \
	SCX_ENUM_SET(skel, scx_rq_flags, SCX_RQ_IN_BALANCE); \
	SCX_ENUM_SET(skel, scx_dsq_id_flags, SCX_DSQ_FLAG_BUILTIN); \
	SCX_ENUM_SET(skel, scx_dsq_id_flags, SCX_DSQ_FLAG_LOCAL_ON); \
	SCX_ENUM_SET(skel, scx_dsq_id_flags, SCX_DSQ_INVALID); \
+2 −1
Original line number Diff line number Diff line
@@ -14,7 +14,8 @@ static inline void __ENUM_set(u64 *val, char *type, char *name)
	bool res;

	res = __COMPAT_read_enum(type, name, val);
	SCX_BUG_ON(!res, "enum not found(%s)", name);
	if (!res)
		*val = 0;
}

#define SCX_ENUM_SET(skel, type, name) do {			\