Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fixes from Thomas Gleixner:

 - Cure for not using zalloc in the first place, which leads to random
   crashes with CPUMASK_OFF_STACK.

 - Revert a user space visible change which broke udev

 - Add a missing cpu_online early return introduced by the new full
   dyntick conversions

 - Plug a long standing race in the timer wheel cpu hotplug code.
   Sigh...

 - Cleanup NOHZ per cpu data on cpu down to prevent stale data on cpu
   up.

* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  time: Revert ALWAYS_USE_PERSISTENT_CLOCK compile time optimizaitons
  timer: Don't reinitialize the cpu base lock during CPU_UP_PREPARE
  tick: Don't invoke tick_nohz_stop_sched_tick() if the cpu is offline
  tick: Cleanup NOHZ per cpu data on cpu down
  tick: Use zalloc_cpumask_var for allocating offstack cpumasks
This commit is contained in:
Linus Torvalds 2013-05-15 14:05:17 -07:00
commit cc51bf6e6d
7 changed files with 8 additions and 19 deletions

View File

@ -108,7 +108,6 @@ config X86
select GENERIC_CLOCKEVENTS_BROADCAST if X86_64 || (X86_32 && X86_LOCAL_APIC) select GENERIC_CLOCKEVENTS_BROADCAST if X86_64 || (X86_32 && X86_LOCAL_APIC)
select GENERIC_TIME_VSYSCALL if X86_64 select GENERIC_TIME_VSYSCALL if X86_64
select KTIME_SCALAR if X86_32 select KTIME_SCALAR if X86_32
select ALWAYS_USE_PERSISTENT_CLOCK
select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNCPY_FROM_USER
select GENERIC_STRNLEN_USER select GENERIC_STRNLEN_USER
select HAVE_CONTEXT_TRACKING if X86_64 select HAVE_CONTEXT_TRACKING if X86_64

View File

@ -20,7 +20,6 @@ if RTC_CLASS
config RTC_HCTOSYS config RTC_HCTOSYS
bool "Set system time from RTC on startup and resume" bool "Set system time from RTC on startup and resume"
default y default y
depends on !ALWAYS_USE_PERSISTENT_CLOCK
help help
If you say yes here, the system time (wall clock) will be set using If you say yes here, the system time (wall clock) will be set using
the value read from a specified RTC device. This is useful to avoid the value read from a specified RTC device. This is useful to avoid
@ -29,7 +28,6 @@ config RTC_HCTOSYS
config RTC_SYSTOHC config RTC_SYSTOHC
bool "Set the RTC time based on NTP synchronization" bool "Set the RTC time based on NTP synchronization"
default y default y
depends on !ALWAYS_USE_PERSISTENT_CLOCK
help help
If you say yes here, the system time (wall clock) will be stored If you say yes here, the system time (wall clock) will be stored
in the RTC specified by RTC_HCTOSYS_DEVICE approximately every 11 in the RTC specified by RTC_HCTOSYS_DEVICE approximately every 11

View File

@ -117,14 +117,10 @@ static inline bool timespec_valid_strict(const struct timespec *ts)
extern bool persistent_clock_exist; extern bool persistent_clock_exist;
#ifdef ALWAYS_USE_PERSISTENT_CLOCK
#define has_persistent_clock() true
#else
static inline bool has_persistent_clock(void) static inline bool has_persistent_clock(void)
{ {
return persistent_clock_exist; return persistent_clock_exist;
} }
#endif
extern void read_persistent_clock(struct timespec *ts); extern void read_persistent_clock(struct timespec *ts);
extern void read_boot_clock(struct timespec *ts); extern void read_boot_clock(struct timespec *ts);

View File

@ -12,11 +12,6 @@ config CLOCKSOURCE_WATCHDOG
config ARCH_CLOCKSOURCE_DATA config ARCH_CLOCKSOURCE_DATA
bool bool
# Platforms has a persistent clock
config ALWAYS_USE_PERSISTENT_CLOCK
bool
default n
# Timekeeping vsyscall support # Timekeeping vsyscall support
config GENERIC_TIME_VSYSCALL config GENERIC_TIME_VSYSCALL
bool bool

View File

@ -786,11 +786,11 @@ bool tick_broadcast_oneshot_available(void)
void __init tick_broadcast_init(void) void __init tick_broadcast_init(void)
{ {
alloc_cpumask_var(&tick_broadcast_mask, GFP_NOWAIT); zalloc_cpumask_var(&tick_broadcast_mask, GFP_NOWAIT);
alloc_cpumask_var(&tmpmask, GFP_NOWAIT); zalloc_cpumask_var(&tmpmask, GFP_NOWAIT);
#ifdef CONFIG_TICK_ONESHOT #ifdef CONFIG_TICK_ONESHOT
alloc_cpumask_var(&tick_broadcast_oneshot_mask, GFP_NOWAIT); zalloc_cpumask_var(&tick_broadcast_oneshot_mask, GFP_NOWAIT);
alloc_cpumask_var(&tick_broadcast_pending_mask, GFP_NOWAIT); zalloc_cpumask_var(&tick_broadcast_pending_mask, GFP_NOWAIT);
alloc_cpumask_var(&tick_broadcast_force_mask, GFP_NOWAIT); zalloc_cpumask_var(&tick_broadcast_force_mask, GFP_NOWAIT);
#endif #endif
} }

View File

@ -717,6 +717,7 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts)
if (unlikely(!cpu_online(cpu))) { if (unlikely(!cpu_online(cpu))) {
if (cpu == tick_do_timer_cpu) if (cpu == tick_do_timer_cpu)
tick_do_timer_cpu = TICK_DO_TIMER_NONE; tick_do_timer_cpu = TICK_DO_TIMER_NONE;
return false;
} }
if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
@ -1168,7 +1169,7 @@ void tick_cancel_sched_timer(int cpu)
hrtimer_cancel(&ts->sched_timer); hrtimer_cancel(&ts->sched_timer);
# endif # endif
ts->nohz_mode = NOHZ_MODE_INACTIVE; memset(ts, 0, sizeof(*ts));
} }
#endif #endif

View File

@ -1539,12 +1539,12 @@ static int __cpuinit init_timers_cpu(int cpu)
boot_done = 1; boot_done = 1;
base = &boot_tvec_bases; base = &boot_tvec_bases;
} }
spin_lock_init(&base->lock);
tvec_base_done[cpu] = 1; tvec_base_done[cpu] = 1;
} else { } else {
base = per_cpu(tvec_bases, cpu); base = per_cpu(tvec_bases, cpu);
} }
spin_lock_init(&base->lock);
for (j = 0; j < TVN_SIZE; j++) { for (j = 0; j < TVN_SIZE; j++) {
INIT_LIST_HEAD(base->tv5.vec + j); INIT_LIST_HEAD(base->tv5.vec + j);