diff options
Diffstat (limited to 'kernel/time/timer.c')
-rw-r--r-- | kernel/time/timer.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index ffebcf878fba..89a9e1b4264a 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c | |||
@@ -823,11 +823,10 @@ static inline struct timer_base *get_timer_cpu_base(u32 tflags, u32 cpu) | |||
823 | struct timer_base *base = per_cpu_ptr(&timer_bases[BASE_STD], cpu); | 823 | struct timer_base *base = per_cpu_ptr(&timer_bases[BASE_STD], cpu); |
824 | 824 | ||
825 | /* | 825 | /* |
826 | * If the timer is deferrable and nohz is active then we need to use | 826 | * If the timer is deferrable and NO_HZ_COMMON is set then we need |
827 | * the deferrable base. | 827 | * to use the deferrable base. |
828 | */ | 828 | */ |
829 | if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && base->nohz_active && | 829 | if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) |
830 | (tflags & TIMER_DEFERRABLE)) | ||
831 | base = per_cpu_ptr(&timer_bases[BASE_DEF], cpu); | 830 | base = per_cpu_ptr(&timer_bases[BASE_DEF], cpu); |
832 | return base; | 831 | return base; |
833 | } | 832 | } |
@@ -837,11 +836,10 @@ static inline struct timer_base *get_timer_this_cpu_base(u32 tflags) | |||
837 | struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); | 836 | struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); |
838 | 837 | ||
839 | /* | 838 | /* |
840 | * If the timer is deferrable and nohz is active then we need to use | 839 | * If the timer is deferrable and NO_HZ_COMMON is set then we need |
841 | * the deferrable base. | 840 | * to use the deferrable base. |
842 | */ | 841 | */ |
843 | if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && base->nohz_active && | 842 | if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && (tflags & TIMER_DEFERRABLE)) |
844 | (tflags & TIMER_DEFERRABLE)) | ||
845 | base = this_cpu_ptr(&timer_bases[BASE_DEF]); | 843 | base = this_cpu_ptr(&timer_bases[BASE_DEF]); |
846 | return base; | 844 | return base; |
847 | } | 845 | } |
@@ -1009,8 +1007,6 @@ __mod_timer(struct timer_list *timer, unsigned long expires, unsigned int option | |||
1009 | if (!ret && (options & MOD_TIMER_PENDING_ONLY)) | 1007 | if (!ret && (options & MOD_TIMER_PENDING_ONLY)) |
1010 | goto out_unlock; | 1008 | goto out_unlock; |
1011 | 1009 | ||
1012 | debug_activate(timer, expires); | ||
1013 | |||
1014 | new_base = get_target_base(base, timer->flags); | 1010 | new_base = get_target_base(base, timer->flags); |
1015 | 1011 | ||
1016 | if (base != new_base) { | 1012 | if (base != new_base) { |
@@ -1034,6 +1030,8 @@ __mod_timer(struct timer_list *timer, unsigned long expires, unsigned int option | |||
1034 | } | 1030 | } |
1035 | } | 1031 | } |
1036 | 1032 | ||
1033 | debug_activate(timer, expires); | ||
1034 | |||
1037 | timer->expires = expires; | 1035 | timer->expires = expires; |
1038 | /* | 1036 | /* |
1039 | * If 'idx' was calculated above and the base time did not advance | 1037 | * If 'idx' was calculated above and the base time did not advance |
@@ -1684,7 +1682,7 @@ static __latent_entropy void run_timer_softirq(struct softirq_action *h) | |||
1684 | base->must_forward_clk = false; | 1682 | base->must_forward_clk = false; |
1685 | 1683 | ||
1686 | __run_timers(base); | 1684 | __run_timers(base); |
1687 | if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && base->nohz_active) | 1685 | if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) |
1688 | __run_timers(this_cpu_ptr(&timer_bases[BASE_DEF])); | 1686 | __run_timers(this_cpu_ptr(&timer_bases[BASE_DEF])); |
1689 | } | 1687 | } |
1690 | 1688 | ||
@@ -1855,6 +1853,21 @@ static void migrate_timer_list(struct timer_base *new_base, struct hlist_head *h | |||
1855 | } | 1853 | } |
1856 | } | 1854 | } |
1857 | 1855 | ||
1856 | int timers_prepare_cpu(unsigned int cpu) | ||
1857 | { | ||
1858 | struct timer_base *base; | ||
1859 | int b; | ||
1860 | |||
1861 | for (b = 0; b < NR_BASES; b++) { | ||
1862 | base = per_cpu_ptr(&timer_bases[b], cpu); | ||
1863 | base->clk = jiffies; | ||
1864 | base->next_expiry = base->clk + NEXT_TIMER_MAX_DELTA; | ||
1865 | base->is_idle = false; | ||
1866 | base->must_forward_clk = true; | ||
1867 | } | ||
1868 | return 0; | ||
1869 | } | ||
1870 | |||
1858 | int timers_dead_cpu(unsigned int cpu) | 1871 | int timers_dead_cpu(unsigned int cpu) |
1859 | { | 1872 | { |
1860 | struct timer_base *old_base; | 1873 | struct timer_base *old_base; |