mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
sched_ext: Inline small ext.c helpers shared across the sub.c split
The following trivial helpers in ext.c are called from both ext.c and the sub-scheduler code. Define them as static inline in internal.h. - scx_bypass_dsq() - scx_bypass_dsp_enabled() - scx_ops_sanitize_err() - scx_schedule_reenq_local() No functional change. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: Andrea Righi <arighi@nvidia.com>
This commit is contained in:
parent
a56469087c
commit
305f86e8a7
|
|
@ -368,11 +368,6 @@ static const struct sched_class *scx_setscheduler_class(struct task_struct *p)
|
|||
return __setscheduler_class(p->policy, p->prio);
|
||||
}
|
||||
|
||||
static struct scx_dispatch_q *scx_bypass_dsq(struct scx_sched *sch, s32 cpu)
|
||||
{
|
||||
return &per_cpu_ptr(sch->pcpu, cpu)->bypass_dsq;
|
||||
}
|
||||
|
||||
static struct scx_dispatch_q *bypass_enq_target_dsq(struct scx_sched *sch, s32 cpu)
|
||||
{
|
||||
#ifdef CONFIG_EXT_SUB_SCHED
|
||||
|
|
@ -394,26 +389,6 @@ static struct scx_dispatch_q *bypass_enq_target_dsq(struct scx_sched *sch, s32 c
|
|||
return scx_bypass_dsq(sch, cpu);
|
||||
}
|
||||
|
||||
/**
|
||||
* scx_bypass_dsp_enabled - Check if bypass dispatch path is enabled
|
||||
* @sch: scheduler to check
|
||||
*
|
||||
* When a descendant scheduler enters bypass mode, bypassed tasks are scheduled
|
||||
* by the nearest non-bypassing ancestor, or the root scheduler if all ancestors
|
||||
* are bypassing. In the former case, the ancestor is not itself bypassing but
|
||||
* its bypass DSQs will be populated with bypassed tasks from descendants. Thus,
|
||||
* the ancestor's bypass dispatch path must be active even though its own
|
||||
* bypass_depth remains zero.
|
||||
*
|
||||
* This function checks bypass_dsp_enable_depth which is managed separately from
|
||||
* bypass_depth to enable this decoupling. See enable_bypass_dsp() and
|
||||
* scx_disable_bypass_dsp().
|
||||
*/
|
||||
static bool scx_bypass_dsp_enabled(struct scx_sched *sch)
|
||||
{
|
||||
return unlikely(atomic_read(&sch->bypass_dsp_enable_depth));
|
||||
}
|
||||
|
||||
/**
|
||||
* rq_is_open - Is the rq available for immediate execution of an SCX task?
|
||||
* @rq: rq to test
|
||||
|
|
@ -1060,28 +1035,6 @@ bool scx_cpu_valid(struct scx_sched *sch, s32 cpu, const char *where)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* scx_ops_sanitize_err - Sanitize a -errno value
|
||||
* @sch: scx_sched to error out on error
|
||||
* @ops_name: operation to blame on failure
|
||||
* @err: -errno value to sanitize
|
||||
*
|
||||
* Verify @err is a valid -errno. If not, trigger scx_error() and return
|
||||
* -%EPROTO. This is necessary because returning a rogue -errno up the chain can
|
||||
* cause misbehaviors. For an example, a large negative return from
|
||||
* ops.init_task() triggers an oops when passed up the call chain because the
|
||||
* value fails IS_ERR() test after being encoded with ERR_PTR() and then is
|
||||
* handled as a pointer.
|
||||
*/
|
||||
static int scx_ops_sanitize_err(struct scx_sched *sch, const char *ops_name, s32 err)
|
||||
{
|
||||
if (err < 0 && err >= -MAX_ERRNO)
|
||||
return err;
|
||||
|
||||
scx_error(sch, "ops.%s() returned an invalid errno %d", ops_name, err);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
static void deferred_bal_cb_workfn(struct rq *rq)
|
||||
{
|
||||
run_deferred(rq);
|
||||
|
|
@ -1233,16 +1186,6 @@ void schedule_dsq_reenq(struct scx_sched *sch, struct scx_dispatch_q *dsq,
|
|||
schedule_deferred(rq);
|
||||
}
|
||||
|
||||
static void scx_schedule_reenq_local(struct rq *rq, u64 reenq_flags)
|
||||
{
|
||||
struct scx_sched *root = rcu_dereference_sched(scx_root);
|
||||
|
||||
if (WARN_ON_ONCE(!root))
|
||||
return;
|
||||
|
||||
schedule_dsq_reenq(root, &rq->scx.local_dsq, reenq_flags, rq);
|
||||
}
|
||||
|
||||
/**
|
||||
* touch_core_sched - Update timestamp used for core-sched task ordering
|
||||
* @rq: rq to read clock from, must be locked
|
||||
|
|
|
|||
|
|
@ -1640,6 +1640,63 @@ extern struct scx_sched *scx_enabling_sub_sched;
|
|||
#define scx_error(sch, fmt, args...) \
|
||||
scx_exit((sch), SCX_EXIT_ERROR, 0, fmt, ##args)
|
||||
|
||||
static inline struct scx_dispatch_q *scx_bypass_dsq(struct scx_sched *sch, s32 cpu)
|
||||
{
|
||||
return &per_cpu_ptr(sch->pcpu, cpu)->bypass_dsq;
|
||||
}
|
||||
|
||||
/**
|
||||
* scx_bypass_dsp_enabled - Check if bypass dispatch path is enabled
|
||||
* @sch: scheduler to check
|
||||
*
|
||||
* When a descendant scheduler enters bypass mode, bypassed tasks are scheduled
|
||||
* by the nearest non-bypassing ancestor, or the root scheduler if all ancestors
|
||||
* are bypassing. In the former case, the ancestor is not itself bypassing but
|
||||
* its bypass DSQs will be populated with bypassed tasks from descendants. Thus,
|
||||
* the ancestor's bypass dispatch path must be active even though its own
|
||||
* bypass_depth remains zero.
|
||||
*
|
||||
* This function checks bypass_dsp_enable_depth which is managed separately from
|
||||
* bypass_depth to enable this decoupling. See enable_bypass_dsp() and
|
||||
* scx_disable_bypass_dsp().
|
||||
*/
|
||||
static inline bool scx_bypass_dsp_enabled(struct scx_sched *sch)
|
||||
{
|
||||
return unlikely(atomic_read(&sch->bypass_dsp_enable_depth));
|
||||
}
|
||||
|
||||
/**
|
||||
* scx_ops_sanitize_err - Sanitize a -errno value
|
||||
* @sch: scx_sched to error out on error
|
||||
* @ops_name: operation to blame on failure
|
||||
* @err: -errno value to sanitize
|
||||
*
|
||||
* Verify @err is a valid -errno. If not, trigger scx_error() and return
|
||||
* -%EPROTO. This is necessary because returning a rogue -errno up the chain can
|
||||
* cause misbehaviors. For an example, a large negative return from
|
||||
* ops.init_task() triggers an oops when passed up the call chain because the
|
||||
* value fails IS_ERR() test after being encoded with ERR_PTR() and then is
|
||||
* handled as a pointer.
|
||||
*/
|
||||
static inline int scx_ops_sanitize_err(struct scx_sched *sch, const char *ops_name, s32 err)
|
||||
{
|
||||
if (err < 0 && err >= -MAX_ERRNO)
|
||||
return err;
|
||||
|
||||
scx_error(sch, "ops.%s() returned an invalid errno %d", ops_name, err);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
static inline void scx_schedule_reenq_local(struct rq *rq, u64 reenq_flags)
|
||||
{
|
||||
struct scx_sched *root = rcu_dereference_sched(scx_root);
|
||||
|
||||
if (WARN_ON_ONCE(!root))
|
||||
return;
|
||||
|
||||
schedule_dsq_reenq(root, &rq->scx.local_dsq, reenq_flags, rq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the rq currently locked from an scx callback, or NULL if no rq is
|
||||
* locked.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user