Loading include/linux/timer.h +2 −0 Original line number Diff line number Diff line Loading @@ -172,6 +172,8 @@ extern void add_timer(struct timer_list *timer); extern int try_to_del_timer_sync(struct timer_list *timer); extern struct timer_base timer_base_deferrable; #ifdef CONFIG_SMP extern int del_timer_sync(struct timer_list *timer); #else Loading kernel/time/timer.c +14 −5 Original line number Diff line number Diff line Loading @@ -206,6 +206,7 @@ struct timer_base { } ____cacheline_aligned; static DEFINE_PER_CPU(struct timer_base, timer_bases[NR_BASES]); struct timer_base timer_base_deferrable; #ifdef CONFIG_NO_HZ_COMMON Loading Loading @@ -837,8 +838,11 @@ static inline struct timer_base *get_timer_cpu_base(u32 tflags, u32 cpu) * If the timer is deferrable and NO_HZ_COMMON is set then we need * to use the deferrable base. */ if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) { base = &timer_base_deferrable; if (tflags & TIMER_PINNED) base = per_cpu_ptr(&timer_bases[BASE_DEF], cpu); } return base; } Loading @@ -850,8 +854,11 @@ static inline struct timer_base *get_timer_this_cpu_base(u32 tflags) * If the timer is deferrable and NO_HZ_COMMON is set then we need * to use the deferrable base. */ if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) { base = &timer_base_deferrable; if (tflags & TIMER_PINNED) base = this_cpu_ptr(&timer_bases[BASE_DEF]); } return base; } Loading Loading @@ -1696,9 +1703,11 @@ static __latent_entropy void run_timer_softirq(struct softirq_action *h) struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); __run_timers(base); if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) { __run_timers(&timer_base_deferrable); __run_timers(this_cpu_ptr(&timer_bases[BASE_DEF])); } } /* * Called by the local, per-CPU timer interrupt on SMP. Loading Loading
include/linux/timer.h +2 −0 Original line number Diff line number Diff line Loading @@ -172,6 +172,8 @@ extern void add_timer(struct timer_list *timer); extern int try_to_del_timer_sync(struct timer_list *timer); extern struct timer_base timer_base_deferrable; #ifdef CONFIG_SMP extern int del_timer_sync(struct timer_list *timer); #else Loading
kernel/time/timer.c +14 −5 Original line number Diff line number Diff line Loading @@ -206,6 +206,7 @@ struct timer_base { } ____cacheline_aligned; static DEFINE_PER_CPU(struct timer_base, timer_bases[NR_BASES]); struct timer_base timer_base_deferrable; #ifdef CONFIG_NO_HZ_COMMON Loading Loading @@ -837,8 +838,11 @@ static inline struct timer_base *get_timer_cpu_base(u32 tflags, u32 cpu) * If the timer is deferrable and NO_HZ_COMMON is set then we need * to use the deferrable base. */ if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) { base = &timer_base_deferrable; if (tflags & TIMER_PINNED) base = per_cpu_ptr(&timer_bases[BASE_DEF], cpu); } return base; } Loading @@ -850,8 +854,11 @@ static inline struct timer_base *get_timer_this_cpu_base(u32 tflags) * If the timer is deferrable and NO_HZ_COMMON is set then we need * to use the deferrable base. */ if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) { base = &timer_base_deferrable; if (tflags & TIMER_PINNED) base = this_cpu_ptr(&timer_bases[BASE_DEF]); } return base; } Loading Loading @@ -1696,9 +1703,11 @@ static __latent_entropy void run_timer_softirq(struct softirq_action *h) struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); __run_timers(base); if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) { __run_timers(&timer_base_deferrable); __run_timers(this_cpu_ptr(&timer_bases[BASE_DEF])); } } /* * Called by the local, per-CPU timer interrupt on SMP. Loading