diff options
Diffstat (limited to 'kernel/hrtimer.c')
-rw-r--r-- | kernel/hrtimer.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 62aad8e1a383..476cb0c0b4a4 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -585,6 +585,18 @@ static inline void hrtimer_init_timer_hres(struct hrtimer *timer) { } | |||
585 | 585 | ||
586 | #endif /* CONFIG_HIGH_RES_TIMERS */ | 586 | #endif /* CONFIG_HIGH_RES_TIMERS */ |
587 | 587 | ||
588 | #ifdef CONFIG_TIMER_STATS | ||
589 | void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer, void *addr) | ||
590 | { | ||
591 | if (timer->start_site) | ||
592 | return; | ||
593 | |||
594 | timer->start_site = addr; | ||
595 | memcpy(timer->start_comm, current->comm, TASK_COMM_LEN); | ||
596 | timer->start_pid = current->pid; | ||
597 | } | ||
598 | #endif | ||
599 | |||
588 | /* | 600 | /* |
589 | * Counterpart to lock_timer_base above: | 601 | * Counterpart to lock_timer_base above: |
590 | */ | 602 | */ |
@@ -743,6 +755,7 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base) | |||
743 | * reprogramming happens in the interrupt handler. This is a | 755 | * reprogramming happens in the interrupt handler. This is a |
744 | * rare case and less expensive than a smp call. | 756 | * rare case and less expensive than a smp call. |
745 | */ | 757 | */ |
758 | timer_stats_hrtimer_clear_start_info(timer); | ||
746 | reprogram = base->cpu_base == &__get_cpu_var(hrtimer_bases); | 759 | reprogram = base->cpu_base == &__get_cpu_var(hrtimer_bases); |
747 | __remove_hrtimer(timer, base, HRTIMER_STATE_INACTIVE, | 760 | __remove_hrtimer(timer, base, HRTIMER_STATE_INACTIVE, |
748 | reprogram); | 761 | reprogram); |
@@ -791,6 +804,8 @@ hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode) | |||
791 | } | 804 | } |
792 | timer->expires = tim; | 805 | timer->expires = tim; |
793 | 806 | ||
807 | timer_stats_hrtimer_set_start_info(timer); | ||
808 | |||
794 | enqueue_hrtimer(timer, new_base, base == new_base); | 809 | enqueue_hrtimer(timer, new_base, base == new_base); |
795 | 810 | ||
796 | unlock_hrtimer_base(timer, &flags); | 811 | unlock_hrtimer_base(timer, &flags); |
@@ -925,6 +940,12 @@ void hrtimer_init(struct hrtimer *timer, clockid_t clock_id, | |||
925 | 940 | ||
926 | timer->base = &cpu_base->clock_base[clock_id]; | 941 | timer->base = &cpu_base->clock_base[clock_id]; |
927 | hrtimer_init_timer_hres(timer); | 942 | hrtimer_init_timer_hres(timer); |
943 | |||
944 | #ifdef CONFIG_TIMER_STATS | ||
945 | timer->start_site = NULL; | ||
946 | timer->start_pid = -1; | ||
947 | memset(timer->start_comm, 0, TASK_COMM_LEN); | ||
948 | #endif | ||
928 | } | 949 | } |
929 | EXPORT_SYMBOL_GPL(hrtimer_init); | 950 | EXPORT_SYMBOL_GPL(hrtimer_init); |
930 | 951 | ||
@@ -1006,6 +1027,7 @@ void hrtimer_interrupt(struct clock_event_device *dev) | |||
1006 | 1027 | ||
1007 | __remove_hrtimer(timer, base, | 1028 | __remove_hrtimer(timer, base, |
1008 | HRTIMER_STATE_CALLBACK, 0); | 1029 | HRTIMER_STATE_CALLBACK, 0); |
1030 | timer_stats_account_hrtimer(timer); | ||
1009 | 1031 | ||
1010 | /* | 1032 | /* |
1011 | * Note: We clear the CALLBACK bit after | 1033 | * Note: We clear the CALLBACK bit after |
@@ -1050,6 +1072,8 @@ static void run_hrtimer_softirq(struct softirq_action *h) | |||
1050 | timer = list_entry(cpu_base->cb_pending.next, | 1072 | timer = list_entry(cpu_base->cb_pending.next, |
1051 | struct hrtimer, cb_entry); | 1073 | struct hrtimer, cb_entry); |
1052 | 1074 | ||
1075 | timer_stats_account_hrtimer(timer); | ||
1076 | |||
1053 | fn = timer->function; | 1077 | fn = timer->function; |
1054 | __remove_hrtimer(timer, timer->base, HRTIMER_STATE_CALLBACK, 0); | 1078 | __remove_hrtimer(timer, timer->base, HRTIMER_STATE_CALLBACK, 0); |
1055 | spin_unlock_irq(&cpu_base->lock); | 1079 | spin_unlock_irq(&cpu_base->lock); |
@@ -1106,6 +1130,8 @@ static inline void run_hrtimer_queue(struct hrtimer_cpu_base *cpu_base, | |||
1106 | if (base->softirq_time.tv64 <= timer->expires.tv64) | 1130 | if (base->softirq_time.tv64 <= timer->expires.tv64) |
1107 | break; | 1131 | break; |
1108 | 1132 | ||
1133 | timer_stats_account_hrtimer(timer); | ||
1134 | |||
1109 | fn = timer->function; | 1135 | fn = timer->function; |
1110 | __remove_hrtimer(timer, base, HRTIMER_STATE_CALLBACK, 0); | 1136 | __remove_hrtimer(timer, base, HRTIMER_STATE_CALLBACK, 0); |
1111 | spin_unlock_irq(&cpu_base->lock); | 1137 | spin_unlock_irq(&cpu_base->lock); |