Skip to content
  • Thomas Gleixner's avatar
    timer: Replace timer base by a cpu index · 0eeda71b
    Thomas Gleixner authored
    
    
    Instead of storing a pointer to the per cpu tvec_base we can simply
    cache a CPU index in the timer_list and use that to get hold of the
    correct per cpu tvec_base. This is only used in lock_timer_base() and
    the slightly larger code is peanuts versus the spinlock operation and
    the d-cache foot print of the timer wheel.
    
    Aside of that this allows to get rid of following nuisances:
    
     - boot_tvec_base
    
       That statically allocated 4k bss data is just kept around so the
       timer has a home when it gets statically initialized. It serves no
       other purpose.
    
       With the CPU index we assign the timer to CPU0 at static
       initialization time and therefor can avoid the whole boot_tvec_base
       dance.  That also simplifies the init code, which just can use the
       per cpu base.
    
       Before:
         text	   data	    bss	    dec	    hex	filename
        17491	   9201	   4160	  30852	   7884	../build/kernel/time/timer.o
       After:
         text	   data	    bss	    dec	    hex	filename
        17440	   9193	      0	  26633	   6809	../build/kernel/time/timer.o
    
     - Overloading the base pointer with various flags
    
       The CPU index has enough space to hold the flags (deferrable,
       irqsafe) so we can get rid of the extra masking and bit fiddling
       with the base pointer.
    
    As a benefit we reduce the size of struct timer_list on 64 bit
    machines. 4 - 8 bytes, a size reduction up to 15% per struct timer_list,
    which is a real win as we have tons of them embedded in other structs.
    
    This changes also the newly added deferrable printout of the timer
    start trace point to capture and print all timer->flags, which allows
    us to decode the target cpu of the timer as well.
    
    We might have used bitfields for this, but that would change the
    static initializers and the init function for no value to accomodate
    big endian bitfields.
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Viresh Kumar <viresh.kumar@linaro.org>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Joonwoo Park <joonwoop@codeaurora.org>
    Cc: Wenbo Wang <wenbo.wang@memblaze.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Badhri Jagan Sridharan <Badhri@google.com>
    Link: http://lkml.kernel.org/r/20150526224511.950084301@linutronix.de
    
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    0eeda71b