The whole disable-RCU, enable-IRQS dance is very intricate since changing IRQ state is traced, which depends on RCU. Add two helpers for the cpuidle case that mirror the entry code: ct_cpuidle_enter() ct_cpuidle_exit() And fix all the cases where the enter/exit dance was buggy.
Showing the changes to kernel/time (1 of 15 files). Show all
Unified · Split
| @@ -622,9 +622,13 @@ struct cpumask *tick_get_broadcast_oneshot_mask(void) · 621 unmodified lines | ||
| 622 | 622 | * to avoid a deep idle transition as we are about to get the |
| 623 | 623 | * broadcast IPI right away. |
| 624 | 624 | */ |
| 625 | −int tick_check_broadcast_expired(void) | |
| 625 | +noinstr int tick_check_broadcast_expired(void) | |
| 626 | 626 | { |
| 627 | +#ifdef _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H | |
| 628 | + return arch_test_bit(smp_processor_id(), cpumask_bits(tick_broadcast_force_mask)); | |
| 629 | +#else | |
| 627 | 630 | return cpumask_test_cpu(smp_processor_id(), tick_broadcast_force_mask); |
| 631 | +#endif | |
| 628 | 632 | } |
| 629 | 633 | |
| 630 | 634 | /* |