mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
sched_ext: Generalize local-DSQ handling to rq-owned DSQs
The local DSQ is synchronized by the containing rq lock rather than its own dsq->lock. A later patch adds a second such DSQ. In preparation, factor the "rq owns the lock" test into dsq_is_rq_owned() and rename local_dsq_post_enq() to rq_owned_post_enq(), taking @rq explicitly. No behavior change. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: Andrea Righi <arighi@nvidia.com>
This commit is contained in:
parent
b81a6c018c
commit
bf6cf1886a
|
|
@ -96,6 +96,17 @@ static atomic_long_t scx_hotplug_seq = ATOMIC_LONG_INIT(0);
|
|||
/* Global cursor for the per-CPU tid allocator. Starts at 1; tid 0 is reserved. */
|
||||
static atomic64_t scx_tid_cursor = ATOMIC64_INIT(1);
|
||||
|
||||
/* is @dsq synchronized by the containing rq lock instead of dsq->lock? */
|
||||
static bool dsq_is_rq_owned(struct scx_dispatch_q *dsq)
|
||||
{
|
||||
switch (dsq->id) {
|
||||
case SCX_DSQ_LOCAL:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_EXT_SUB_SCHED
|
||||
/*
|
||||
* The sub sched being enabled. Used by scx_disable_and_exit_task() to exit
|
||||
|
|
@ -1270,11 +1281,10 @@ static void call_task_dequeue(struct scx_sched *sch, struct rq *rq,
|
|||
p->scx.flags &= ~SCX_TASK_IN_CUSTODY;
|
||||
}
|
||||
|
||||
static void local_dsq_post_enq(struct scx_sched *sch, struct scx_dispatch_q *dsq,
|
||||
struct task_struct *p, u64 enq_flags)
|
||||
static void rq_owned_post_enq(struct scx_sched *sch, struct rq *rq,
|
||||
struct scx_dispatch_q *dsq, struct task_struct *p,
|
||||
u64 enq_flags)
|
||||
{
|
||||
struct rq *rq = container_of(dsq, struct rq, scx.local_dsq);
|
||||
|
||||
call_task_dequeue(sch, rq, p, 0);
|
||||
|
||||
/*
|
||||
|
|
@ -1334,13 +1344,13 @@ static void scx_dispatch_enqueue(struct scx_sched *sch, struct rq *rq,
|
|||
struct scx_dispatch_q *dsq, struct task_struct *p,
|
||||
u64 enq_flags)
|
||||
{
|
||||
bool is_local = dsq->id == SCX_DSQ_LOCAL;
|
||||
bool is_rq_owned = dsq_is_rq_owned(dsq);
|
||||
|
||||
WARN_ON_ONCE(p->scx.dsq || !list_empty(&p->scx.dsq_list.node));
|
||||
WARN_ON_ONCE((p->scx.dsq_flags & SCX_TASK_DSQ_ON_PRIQ) ||
|
||||
!RB_EMPTY_NODE(&p->scx.dsq_priq));
|
||||
|
||||
if (!is_local) {
|
||||
if (!is_rq_owned) {
|
||||
raw_spin_lock_nested(&dsq->lock,
|
||||
(enq_flags & SCX_ENQ_NESTED) ? SINGLE_DEPTH_NESTING : 0);
|
||||
|
||||
|
|
@ -1435,8 +1445,8 @@ static void scx_dispatch_enqueue(struct scx_sched *sch, struct rq *rq,
|
|||
* ops_state first, both sides would modify p->scx.flags
|
||||
* concurrently in a non-atomic way.
|
||||
*/
|
||||
if (is_local) {
|
||||
local_dsq_post_enq(sch, dsq, p, enq_flags);
|
||||
if (is_rq_owned) {
|
||||
rq_owned_post_enq(sch, rq, dsq, p, enq_flags);
|
||||
} else {
|
||||
/*
|
||||
* Global and bypass DSQs are terminal - the task leaves the
|
||||
|
|
@ -1487,7 +1497,7 @@ static void task_unlink_from_dsq(struct task_struct *p,
|
|||
static void scx_dispatch_dequeue(struct rq *rq, struct task_struct *p)
|
||||
{
|
||||
struct scx_dispatch_q *dsq = p->scx.dsq;
|
||||
bool is_local = dsq == &rq->scx.local_dsq;
|
||||
bool is_rq_owned = dsq && dsq_is_rq_owned(dsq);
|
||||
|
||||
lockdep_assert_rq_held(rq);
|
||||
|
||||
|
|
@ -1511,7 +1521,7 @@ static void scx_dispatch_dequeue(struct rq *rq, struct task_struct *p)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!is_local)
|
||||
if (!is_rq_owned)
|
||||
raw_spin_lock(&dsq->lock);
|
||||
|
||||
/*
|
||||
|
|
@ -1533,7 +1543,7 @@ static void scx_dispatch_dequeue(struct rq *rq, struct task_struct *p)
|
|||
}
|
||||
p->scx.dsq = NULL;
|
||||
|
||||
if (!is_local)
|
||||
if (!is_rq_owned)
|
||||
raw_spin_unlock(&dsq->lock);
|
||||
}
|
||||
|
||||
|
|
@ -2085,7 +2095,7 @@ static void move_local_task_to_local_dsq(struct scx_sched *sch,
|
|||
dsq_inc_nr(dst_dsq, p, enq_flags);
|
||||
p->scx.dsq = dst_dsq;
|
||||
|
||||
local_dsq_post_enq(sch, dst_dsq, p, enq_flags);
|
||||
rq_owned_post_enq(sch, dst_rq, dst_dsq, p, enq_flags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user