mirror of
https://github.com/torvalds/linux.git
synced 2026-09-27 11:02:03 +02:00
sched_ext: Route task slice writes through set_task_slice()
A later change makes set_task_slice() also drop a pending out-of-band slice request, so the BPF-triggered writes to p->scx.slice need to funnel through one place. Introduce set_task_slice() and route those writes through it. update_curr_scx() decrements curr->scx.slice directly for accounting and is left alone. No functional change - the helper only assigns p->scx.slice. v2: Reword the set_task_slice comment to "BPF-triggered writes". (Andrea) Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: Andrea Righi <arighi@nvidia.com>
This commit is contained in:
parent
61d564fcdf
commit
c00158ef28
|
|
@ -1165,6 +1165,12 @@ static void touch_core_sched_dispatch(struct rq *rq, struct task_struct *p)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* set @p's slice, BPF-triggered writes to p->scx.slice go through here */
|
||||
static void set_task_slice(struct task_struct *p, u64 slice)
|
||||
{
|
||||
p->scx.slice = slice;
|
||||
}
|
||||
|
||||
static void update_curr_scx(struct rq *rq)
|
||||
{
|
||||
struct task_struct *curr = rq->curr;
|
||||
|
|
@ -1250,7 +1256,7 @@ static void dsq_dec_nr(struct scx_dispatch_q *dsq, struct task_struct *p)
|
|||
|
||||
static void refill_task_slice_dfl(struct scx_sched *sch, struct task_struct *p)
|
||||
{
|
||||
p->scx.slice = READ_ONCE(sch->slice_dfl);
|
||||
set_task_slice(p, READ_ONCE(sch->slice_dfl));
|
||||
__scx_add_event(sch, SCX_EV_REFILL_SLICE_DFL, 1);
|
||||
}
|
||||
|
||||
|
|
@ -1345,7 +1351,7 @@ static void rq_owned_post_enq(struct scx_sched *sch, struct rq *rq,
|
|||
|
||||
if ((enq_flags & SCX_ENQ_PREEMPT) && p != rq->curr &&
|
||||
rq->curr->sched_class == &ext_sched_class) {
|
||||
rq->curr->scx.slice = 0;
|
||||
set_task_slice(rq->curr, 0);
|
||||
resched_curr(rq);
|
||||
}
|
||||
}
|
||||
|
|
@ -2058,7 +2064,7 @@ static void yield_task_scx(struct rq *rq)
|
|||
if (SCX_HAS_OP(sch, yield))
|
||||
SCX_CALL_OP_2TASKS_RET(sch, yield, rq, p, NULL);
|
||||
else
|
||||
p->scx.slice = 0;
|
||||
set_task_slice(p, 0);
|
||||
}
|
||||
|
||||
static bool yield_to_task_scx(struct rq *rq, struct task_struct *to)
|
||||
|
|
@ -3302,7 +3308,7 @@ static void task_tick_scx(struct rq *rq, struct task_struct *curr, int queued)
|
|||
* we can't trust the slice management or ops.core_sched_before().
|
||||
*/
|
||||
if (scx_bypassing(sch, cpu_of(rq))) {
|
||||
curr->scx.slice = 0;
|
||||
set_task_slice(curr, 0);
|
||||
touch_core_sched(rq, curr);
|
||||
} else if (SCX_HAS_OP(sch, tick)) {
|
||||
SCX_CALL_OP_TASK(sch, tick, rq, curr);
|
||||
|
|
@ -3441,7 +3447,7 @@ static void scx_disable_task(struct scx_sched *sch, struct task_struct *p)
|
|||
* control, after ops.disable() has observed their final values.
|
||||
*/
|
||||
p->scx.dsq_vtime = 0;
|
||||
p->scx.slice = 0;
|
||||
set_task_slice(p, 0);
|
||||
|
||||
/*
|
||||
* Verify the task is not in BPF scheduler's custody. If flag
|
||||
|
|
@ -7093,7 +7099,7 @@ static void scx_root_enable_workfn(struct kthread_work *work)
|
|||
queue_flags |= DEQUEUE_CLASS;
|
||||
|
||||
scoped_guard (sched_change, p, queue_flags) {
|
||||
p->scx.slice = READ_ONCE(sch->slice_dfl);
|
||||
set_task_slice(p, READ_ONCE(sch->slice_dfl));
|
||||
p->sched_class = new_class;
|
||||
}
|
||||
}
|
||||
|
|
@ -7736,7 +7742,7 @@ static bool kick_one_cpu(s32 cpu, struct scx_sched_pcpu *pcpu, struct rq *this_r
|
|||
!sched_class_above(cur_class, &ext_sched_class)) {
|
||||
if (cpumask_test_cpu(cpu, pcpu->cpus_to_preempt)) {
|
||||
if (cur_class == &ext_sched_class)
|
||||
rq->curr->scx.slice = 0;
|
||||
set_task_slice(rq->curr, 0);
|
||||
cpumask_clear_cpu(cpu, pcpu->cpus_to_preempt);
|
||||
}
|
||||
|
||||
|
|
@ -8086,9 +8092,9 @@ __bpf_kfunc bool scx_bpf_dsq_insert___v2(struct task_struct *p, u64 dsq_id,
|
|||
return false;
|
||||
|
||||
if (slice)
|
||||
p->scx.slice = slice;
|
||||
set_task_slice(p, slice);
|
||||
else
|
||||
p->scx.slice = p->scx.slice ?: 1;
|
||||
set_task_slice(p, p->scx.slice ?: 1);
|
||||
|
||||
scx_dsq_insert_commit(sch, p, dsq_id, enq_flags);
|
||||
|
||||
|
|
@ -8112,9 +8118,9 @@ static bool scx_dsq_insert_vtime(struct scx_sched *sch, struct task_struct *p,
|
|||
return false;
|
||||
|
||||
if (slice)
|
||||
p->scx.slice = slice;
|
||||
set_task_slice(p, slice);
|
||||
else
|
||||
p->scx.slice = p->scx.slice ?: 1;
|
||||
set_task_slice(p, p->scx.slice ?: 1);
|
||||
|
||||
p->scx.dsq_vtime = vtime;
|
||||
|
||||
|
|
@ -8296,7 +8302,7 @@ static bool scx_dsq_move(struct bpf_iter_scx_dsq_kern *kit,
|
|||
if (kit->cursor.flags & __SCX_DSQ_ITER_HAS_VTIME)
|
||||
p->scx.dsq_vtime = kit->vtime;
|
||||
if (kit->cursor.flags & __SCX_DSQ_ITER_HAS_SLICE)
|
||||
p->scx.slice = kit->slice;
|
||||
set_task_slice(p, kit->slice);
|
||||
|
||||
/* execute move */
|
||||
locked_rq = move_task_between_dsqs(sch, p, enq_flags, src_dsq, dst_dsq);
|
||||
|
|
@ -8689,7 +8695,7 @@ __bpf_kfunc bool scx_bpf_task_set_slice(struct task_struct *p, u64 slice,
|
|||
if (unlikely(!sch || !scx_task_on_sched(sch, p)))
|
||||
return false;
|
||||
|
||||
p->scx.slice = slice;
|
||||
set_task_slice(p, slice);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user