mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 20:14:06 +02:00
Fix timer stalls caused by incorrect handling of
the dev->next_event_forced flag. Signed-off-by: Ingo Molnar <mingo@kernel.org> -----BEGIN PGP SIGNATURE----- iQJFBAABCgAvFiEEBpT5eoXrXCwVQwEKEnMQ0APhK1gFAmnl1/4RHG1pbmdvQGtl cm5lbC5vcmcACgkQEnMQ0APhK1g/ww/7BI4CyQUJLSCpYMjvkj+87Rrfd5u6FGqt jz0dGeQpY0LvRGSqASwICe+1r0zwHF+xDsUfJvA13mRaPM6D6bEU+JE6ffK8B6T9 EIyYwEwQ2a7DrdIu9+FCXTwqXDUoGLFsguD50b4qupQKFcDlwgZbg4UAWi/ptau9 Ww+5T/+sfw/SMR9EwXBSKH79N0gOOGpDNfGtpDv+0X0qPQvo9QGAxMfIUgMf7ZaA y55agXi5iOdM+mAIrE69WLinBzrBvXHWNr66/SaMadQs93I1hU54sLpir4ft1yCs WnDtTRWG11Y0HBHUqqgbnN8BR/2VIFDVe9BtRDoDUD70iEJ8TGqJjOvF8v7C00MK ets0zNel9Rqbz9wjrjTekPYUHfC/t9qqzV77c0TdU1IR6FArf/OT9Ge34AVr60EX a5s4aX7ECLjwuTwgQPLXsSedOD0eQndf/VYdEQ86fTUfyyujVg2NCxbFEfDr3eho SbjcNv1UQ1WY/7miJzYaiA2aVNtwuX25YNI+t3f3pX/1tGqmx9oB1tNzJqgGfuN9 3/Rx3uP0kH+gpbw1lKAugFJazOEHDLJG8LBgF0PYbmlVdIGn57IuBlQL5GDLe77O G+sFUhrLNpkrIJVhNWODkM+K/z9vvKzENiRgG4hB0oAbQEUuqTA6ppayKWWs8KDb 9fdgLSkdjtI= =GPvm -----END PGP SIGNATURE----- Merge tag 'timers-urgent-2026-04-20' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull timer fix from Ingo Molnar: "Fix timer stalls caused by incorrect handling of the dev->next_event_forced flag" * tag 'timers-urgent-2026-04-20' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: clockevents: Add missing resets of the next_event_forced flag
This commit is contained in:
commit
ccbc9fdb32
|
|
@ -94,6 +94,9 @@ static int __clockevents_switch_state(struct clock_event_device *dev,
|
|||
if (dev->features & CLOCK_EVT_FEAT_DUMMY)
|
||||
return 0;
|
||||
|
||||
/* On state transitions clear the forced flag unconditionally */
|
||||
dev->next_event_forced = 0;
|
||||
|
||||
/* Transition with new state-specific callbacks */
|
||||
switch (state) {
|
||||
case CLOCK_EVT_STATE_DETACHED:
|
||||
|
|
@ -366,8 +369,10 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires, b
|
|||
if (delta > (int64_t)dev->min_delta_ns) {
|
||||
delta = min(delta, (int64_t) dev->max_delta_ns);
|
||||
cycles = ((u64)delta * dev->mult) >> dev->shift;
|
||||
if (!dev->set_next_event((unsigned long) cycles, dev))
|
||||
if (!dev->set_next_event((unsigned long) cycles, dev)) {
|
||||
dev->next_event_forced = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (dev->next_event_forced)
|
||||
|
|
|
|||
|
|
@ -108,6 +108,7 @@ static struct clock_event_device *tick_get_oneshot_wakeup_device(int cpu)
|
|||
|
||||
static void tick_oneshot_wakeup_handler(struct clock_event_device *wd)
|
||||
{
|
||||
wd->next_event_forced = 0;
|
||||
/*
|
||||
* If we woke up early and the tick was reprogrammed in the
|
||||
* meantime then this may be spurious but harmless.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user