1. 02 Apr, 2015 4 commits
    • Peter Zijlstra's avatar
      timer: Allocate per-cpu tvec_base's statically · b337a938
      Peter Zijlstra authored
      Memory for the 'tvec_base' array is allocated separately for the boot CPU (statically)
      and non-boot CPUs (dynamically).
      
      The reason is because __TIMER_INITIALIZER() needs to set ->base to a
      valid pointer (because we've made NULL special, hint: lock_timer_base())
      and we cannot get a compile time pointer to per-cpu entries because we
      don't know where we'll map the section, even for the boot cpu.
      
      This can be simplified a bit by statically allocating per-cpu memory.
      The only disadvantage is that memory for one of the structures will stay
      unused, i.e. for the boot CPU, which uses boot_tvec_bases.
      
      This will also guarantee that tvec_base is cacheline aligned. Even
      though tvec_base has ____cacheline_aligned stuck on, kzalloc_node() does
      not actually respect that (but guarantees a minimum u64 alignment).
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Link: http://lkml.kernel.org/r/17cdf560f2727f687ab159707d0aa591f8a2f82d.1427814611.git.viresh.kumar@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
      b337a938
    • Preeti U Murthy's avatar
      clockevents: Fix cpu_down() race for hrtimer based broadcasting · 345527b1
      Preeti U Murthy authored
      It was found when doing a hotplug stress test on POWER, that the
      machine either hit softlockups or rcu_sched stall warnings.  The
      issue was traced to commit:
      
        7cba160a ("powernv/cpuidle: Redesign idle states management")
      
      which exposed the cpu_down() race with hrtimer based broadcast mode:
      
        5d1638ac ("tick: Introduce hrtimer based broadcast")
      
      The race is the following:
      
      Assume CPU1 is the CPU which holds the hrtimer broadcasting duty
      before it is taken down.
      
      	CPU0					CPU1
      
      	cpu_down()				take_cpu_down()
      						disable_interrupts()
      
      	cpu_die()
      
      	while (CPU1 != CPU_DEAD) {
      		msleep(100);
      		switch_to_idle();
      		stop_cpu_timer();
      		schedule_broadcast();
      	}
      
      	tick_cleanup_cpu_dead()
      		take_over_broadcast()
      
      So after CPU1 disabled interrupts it cannot handle the broadcast
      hrtimer anymore, so CPU0 will be stuck forever.
      
      Fix this by explicitly taking over broadcast duty before cpu_die().
      
      This is a temporary workaround. What we really want is a callback
      in the clockevent device which allows us to do that from the dying
      CPU by pushing the hrtimer onto a different cpu. That might involve
      an IPI and is definitely more complex than this immediate fix.
      
      Changelog was picked up from:
      
          https://lkml.org/lkml/2015/2/16/213Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Tested-by: default avatarNicolas Pitre <nico@linaro.org>
      Signed-off-by: default avatarPreeti U. Murthy <preeti@linux.vnet.ibm.com>
      Cc: linuxppc-dev@lists.ozlabs.org
      Cc: mpe@ellerman.id.au
      Cc: nicolas.pitre@linaro.org
      Cc: peterz@infradead.org
      Cc: rjw@rjwysocki.net
      Fixes: http://linuxppc.10917.n7.nabble.com/offlining-cpus-breakage-td88619.html
      Link: http://lkml.kernel.org/r/20150330092410.24979.59887.stgit@preeti.in.ibm.com
      [ Merged it to the latest timer tree, renamed the callback, tidied up the changelog. ]
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      345527b1
    • Ingo Molnar's avatar
      clockevents: Clean up clockchips.h · 9eed56e8
      Ingo Molnar authored
      Do various cleanups on the clockchips.h file:
      
       - indent preprocessor blocks to make it more clear which block we are in,
         this also makes merge resolution easier
      
       - comment larger preprocessor blocks consistently, using the:
      
           #if FOO
           ...
           #else /* !FOO: */
           ...
           #endif /* !FOO */
      
         notation.
      
       - unbreak lines
      
       - etc.
      
      No change in functionality.
      
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      9eed56e8
    • Ingo Molnar's avatar
      tick: Further simplify tick-internal.h · 3ae7a939
      Ingo Molnar authored
      Move the broadcasting related section to the GENERIC_CLOCKEVENTS=y
      section - this also solves build failures on architectures that
      don't use generic clockevents yet.
      
      Also standardize include file style to make it easier to read, and
      use nesting depth aware preprocessor directives to make future merges
      easier.
      
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      3ae7a939
  2. 01 Apr, 2015 9 commits
  3. 31 Mar, 2015 11 commits
  4. 29 Mar, 2015 7 commits
  5. 28 Mar, 2015 9 commits