Skip to content

Commit f44bee3

Browse files
committed
sched/alt: Fix for v5.14-prjc-r0 fails on x86 UP build
Mainline add some sched-core related api which cause below fails on x86 UP build, torvalds#30.
1 parent 9d1640b commit f44bee3

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

kernel/sched/alt_core.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,30 @@ rq_unlock_irqrestore(struct rq *rq, struct rq_flags *rf)
492492
raw_spin_unlock_irqrestore(&rq->lock, rf->flags);
493493
}
494494

495+
void raw_spin_rq_lock_nested(struct rq *rq, int subclass)
496+
{
497+
raw_spinlock_t *lock;
498+
499+
/* Matches synchronize_rcu() in __sched_core_enable() */
500+
preempt_disable();
501+
502+
for (;;) {
503+
lock = __rq_lockp(rq);
504+
raw_spin_lock_nested(lock, subclass);
505+
if (likely(lock == __rq_lockp(rq))) {
506+
/* preempt_count *MUST* be > 1 */
507+
preempt_enable_no_resched();
508+
return;
509+
}
510+
raw_spin_unlock(lock);
511+
}
512+
}
513+
514+
void raw_spin_rq_unlock(struct rq *rq)
515+
{
516+
raw_spin_unlock(rq_lockp(rq));
517+
}
518+
495519
/*
496520
* RQ-clock updating methods:
497521
*/

kernel/sched/alt_sched.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,36 @@ this_rq_lock_irq(struct rq_flags *rf)
443443
return rq;
444444
}
445445

446+
extern void raw_spin_rq_lock_nested(struct rq *rq, int subclass);
447+
extern void raw_spin_rq_unlock(struct rq *rq);
448+
449+
static inline raw_spinlock_t *__rq_lockp(struct rq *rq)
450+
{
451+
return &rq->lock;
452+
}
453+
454+
static inline raw_spinlock_t *rq_lockp(struct rq *rq)
455+
{
456+
return __rq_lockp(rq);
457+
}
458+
459+
static inline void raw_spin_rq_lock(struct rq *rq)
460+
{
461+
raw_spin_rq_lock_nested(rq, 0);
462+
}
463+
464+
static inline void raw_spin_rq_lock_irq(struct rq *rq)
465+
{
466+
local_irq_disable();
467+
raw_spin_rq_lock(rq);
468+
}
469+
470+
static inline void raw_spin_rq_unlock_irq(struct rq *rq)
471+
{
472+
raw_spin_rq_unlock(rq);
473+
local_irq_enable();
474+
}
475+
446476
static inline int task_current(struct rq *rq, struct task_struct *p)
447477
{
448478
return rq->curr == p;

0 commit comments

Comments
 (0)