clockevents: Enforce oneshot broadcast when broadcast mask is set on resume

The jinxed VAIO refuses to resume without hitting keys on the keyboard
when this is not enforced. It is unclear why the cpu ends up in a lower
C State without notifying the clock events layer, but enforcing the
oneshot broadcast here is safe.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

authored by Thomas Gleixner and committed by Thomas Gleixner 07eec6af 729c6ba3

+12 -1
+12 -1
kernel/time/tick-broadcast.c
··· 382 383 int tick_resume_broadcast_oneshot(struct clock_event_device *bc) 384 { 385 clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); 386 387 if(!cpus_empty(tick_broadcast_oneshot_mask)) 388 tick_broadcast_set_event(ktime_get(), 1); 389 390 - return cpu_isset(smp_processor_id(), tick_broadcast_oneshot_mask); 391 } 392 393 /*
··· 382 383 int tick_resume_broadcast_oneshot(struct clock_event_device *bc) 384 { 385 + int cpu = smp_processor_id(); 386 + 387 + /* 388 + * If the CPU is marked for broadcast, enforce oneshot 389 + * broadcast mode. The jinxed VAIO does not resume otherwise. 390 + * No idea why it ends up in a lower C State during resume 391 + * without notifying the clock events layer. 392 + */ 393 + if (cpu_isset(cpu, tick_broadcast_mask)) 394 + cpu_set(cpu, tick_broadcast_oneshot_mask); 395 + 396 clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT); 397 398 if(!cpus_empty(tick_broadcast_oneshot_mask)) 399 tick_broadcast_set_event(ktime_get(), 1); 400 401 + return cpu_isset(cpu, tick_broadcast_oneshot_mask); 402 } 403 404 /*