History

Merge tag 'locking-urgent-2026-08-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull locking fix from Ingo Molnar: - Revert a commit to spinlock cleanup guards that got caught up in the subtle limitations & fragility of guards (again...) and caused a regression (Peter Zijlstra) * tag 'locking-urgent-2026-08-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: locking: Revert switching guards to _irq_{disable,enable}()

Linus Torvalds committed 2 months ago

Commit 63783652 parents f59c074 46094a72 files · +20 −18Browse files

Unified · Split

2 files
  1. include/linux/spinlock.h +14 −12
  2. kernel/sched/fair.c +6 −6
include/linux/spinlock.h+14−12
@@ -572,12 +572,12 @@ DECLARE_LOCK_GUARD_1_ATTRS(raw_spinlock_nested, __acquires(_T), __releases(*(raw · 571 unmodified lines
572572 #define class_raw_spinlock_nested_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(raw_spinlock_nested, _T)
573573
574574 DEFINE_LOCK_GUARD_1(raw_spinlock_irq, raw_spinlock_t,
575− raw_spin_lock_irq_disable(_T->lock),
576− raw_spin_unlock_irq_enable(_T->lock))
575+ raw_spin_lock_irq(_T->lock),
576+ raw_spin_unlock_irq(_T->lock))
577577 DECLARE_LOCK_GUARD_1_ATTRS(raw_spinlock_irq, __acquires(_T), __releases(*(raw_spinlock_t **)_T))
578578 #define class_raw_spinlock_irq_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(raw_spinlock_irq, _T)
579579
580−DEFINE_LOCK_GUARD_1_COND(raw_spinlock_irq, _try, raw_spin_trylock_irq_disable(_T->lock))
580+DEFINE_LOCK_GUARD_1_COND(raw_spinlock_irq, _try, raw_spin_trylock_irq(_T->lock))
581581 DECLARE_LOCK_GUARD_1_ATTRS(raw_spinlock_irq_try, __acquires(_T), __releases(*(raw_spinlock_t **)_T))
582582 #define class_raw_spinlock_irq_try_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(raw_spinlock_irq_try, _T)
583583
@@ -592,13 +592,14 @@ DECLARE_LOCK_GUARD_1_ATTRS(raw_spinlock_bh_try, __acquires(_T), __releases(*(raw · 8 unmodified lines
592592 #define class_raw_spinlock_bh_try_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(raw_spinlock_bh_try, _T)
593593
594594 DEFINE_LOCK_GUARD_1(raw_spinlock_irqsave, raw_spinlock_t,
595− raw_spin_lock_irq_disable(_T->lock),
596− raw_spin_unlock_irq_enable(_T->lock))
595+ raw_spin_lock_irqsave(_T->lock, _T->flags),
596+ raw_spin_unlock_irqrestore(_T->lock, _T->flags),
597+ unsigned long flags)
597598 DECLARE_LOCK_GUARD_1_ATTRS(raw_spinlock_irqsave, __acquires(_T), __releases(*(raw_spinlock_t **)_T))
598599 #define class_raw_spinlock_irqsave_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(raw_spinlock_irqsave, _T)
599600
600601 DEFINE_LOCK_GUARD_1_COND(raw_spinlock_irqsave, _try,
601− raw_spin_trylock_irq_disable(_T->lock))
602+ raw_spin_trylock_irqsave(_T->lock, _T->flags))
602603 DECLARE_LOCK_GUARD_1_ATTRS(raw_spinlock_irqsave_try, __acquires(_T), __releases(*(raw_spinlock_t **)_T))
603604 #define class_raw_spinlock_irqsave_try_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(raw_spinlock_irqsave_try, _T)
604605
@@ -617,13 +618,13 @@ DECLARE_LOCK_GUARD_1_ATTRS(spinlock_try, __acquires(_T), __releases(*(spinlock_t · 12 unmodified lines
617618 #define class_spinlock_try_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(spinlock_try, _T)
618619
619620 DEFINE_LOCK_GUARD_1(spinlock_irq, spinlock_t,
620− spin_lock_irq_disable(_T->lock),
621− spin_unlock_irq_enable(_T->lock))
621+ spin_lock_irq(_T->lock),
622+ spin_unlock_irq(_T->lock))
622623 DECLARE_LOCK_GUARD_1_ATTRS(spinlock_irq, __acquires(_T), __releases(*(spinlock_t **)_T))
623624 #define class_spinlock_irq_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(spinlock_irq, _T)
624625
625626 DEFINE_LOCK_GUARD_1_COND(spinlock_irq, _try,
626− spin_trylock_irq_disable(_T->lock))
627+ spin_trylock_irq(_T->lock))
627628 DECLARE_LOCK_GUARD_1_ATTRS(spinlock_irq_try, __acquires(_T), __releases(*(spinlock_t **)_T))
628629 #define class_spinlock_irq_try_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(spinlock_irq_try, _T)
629630
@@ -639,13 +640,14 @@ DECLARE_LOCK_GUARD_1_ATTRS(spinlock_bh_try, __acquires(_T), __releases(*(spinloc · 9 unmodified lines
639640 #define class_spinlock_bh_try_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(spinlock_bh_try, _T)
640641
641642 DEFINE_LOCK_GUARD_1(spinlock_irqsave, spinlock_t,
642− spin_lock_irq_disable(_T->lock),
643− spin_unlock_irq_enable(_T->lock))
643+ spin_lock_irqsave(_T->lock, _T->flags),
644+ spin_unlock_irqrestore(_T->lock, _T->flags),
645+ unsigned long flags)
644646 DECLARE_LOCK_GUARD_1_ATTRS(spinlock_irqsave, __acquires(_T), __releases(*(spinlock_t **)_T))
645647 #define class_spinlock_irqsave_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(spinlock_irqsave, _T)
646648
647649 DEFINE_LOCK_GUARD_1_COND(spinlock_irqsave, _try,
648− spin_trylock_irq_disable(_T->lock))
650+ spin_trylock_irqsave(_T->lock, _T->flags))
649651 DECLARE_LOCK_GUARD_1_ATTRS(spinlock_irqsave_try, __acquires(_T), __releases(*(spinlock_t **)_T))
650652 #define class_spinlock_irqsave_try_constructor(_T) WITH_LOCK_GUARD_1_ATTRS(spinlock_irqsave_try, _T)
651653
kernel/sched/fair.c+6−6
@@ -7253,7 +7253,7 @@ static bool distribute_cfs_runtime(struct cfs_bandwidth *cfs_b) · 7252 unmodified lines
72537253 * period the timer is deactivated until scheduling resumes; cfs_b->idle is
72547254 * used to track this state.
72557255 */
7256−static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun)
7256+static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun, unsigned long flags)
72577257 __must_hold(&cfs_b->lock)
72587258 {
72597259 int throttled;
@@ -7288,10 +7288,10 @@ static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun) · 28 unmodified lines
72887288 * This check is repeated as we release cfs_b->lock while we unthrottle.
72897289 */
72907290 while (throttled && cfs_b->runtime > 0) {
7291− raw_spin_unlock_irq_enable(&cfs_b->lock);
7291+ raw_spin_unlock_irqrestore(&cfs_b->lock, flags);
72927292 /* we can't nest cfs_b->lock while distributing bandwidth */
72937293 throttled = distribute_cfs_runtime(cfs_b);
7294− raw_spin_lock_irq_disable(&cfs_b->lock);
7294+ raw_spin_lock_irqsave(&cfs_b->lock, flags);
72957295 }
72967296
72977297 /*
@@ -7399,7 +7399,7 @@ static __always_inline void return_cfs_rq_runtime(struct cfs_rq *cfs_rq) · 101 unmodified lines
73997399 static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b)
74007400 {
74017401 /* confirm we're still not at a refresh boundary */
7402− scoped_guard(raw_spinlock_irq, &cfs_b->lock) {
7402+ scoped_guard(raw_spinlock_irqsave, &cfs_b->lock) {
74037403 u64 runtime = 0, slice = sched_cfs_bandwidth_slice();
74047404
74057405 cfs_b->slack_started = false;
@@ -7484,14 +7484,14 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) · 78 unmodified lines
74847484 int idle = 0;
74857485 int count = 0;
74867486
7487− guard(raw_spinlock_irq)(&cfs_b->lock);
7487+ CLASS(raw_spinlock_irqsave, cfsb_guard)(&cfs_b->lock);
74887488
74897489 for (;;) {
74907490 overrun = hrtimer_forward_now(timer, cfs_b->period);
74917491 if (!overrun)
74927492 break;
74937493
7494− idle = do_sched_cfs_period_timer(cfs_b, overrun);
7494+ idle = do_sched_cfs_period_timer(cfs_b, overrun, cfsb_guard.flags);
74957495
74967496 if (++count > 3) {
74977497 u64 new, old = ktime_to_ns(cfs_b->period);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t