diff options
Diffstat (limited to 'kernel/sched_clock.c')
-rw-r--r-- | kernel/sched_clock.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c index 390f33234bd0..819f17ac796e 100644 --- a/kernel/sched_clock.c +++ b/kernel/sched_clock.c | |||
@@ -25,6 +25,7 @@ | |||
25 | * consistent between cpus (never more than 2 jiffies difference). | 25 | * consistent between cpus (never more than 2 jiffies difference). |
26 | */ | 26 | */ |
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | #include <linux/hardirq.h> | ||
28 | #include <linux/module.h> | 29 | #include <linux/module.h> |
29 | #include <linux/percpu.h> | 30 | #include <linux/percpu.h> |
30 | #include <linux/ktime.h> | 31 | #include <linux/ktime.h> |
@@ -154,6 +155,17 @@ u64 sched_clock_cpu(int cpu) | |||
154 | return sched_clock(); | 155 | return sched_clock(); |
155 | 156 | ||
156 | scd = cpu_sdc(cpu); | 157 | scd = cpu_sdc(cpu); |
158 | |||
159 | /* | ||
160 | * Normally this is not called in NMI context - but if it is, | ||
161 | * trying to do any locking here is totally lethal. | ||
162 | */ | ||
163 | if (unlikely(in_nmi())) | ||
164 | return scd->clock; | ||
165 | |||
166 | if (unlikely(!sched_clock_running)) | ||
167 | return 0ull; | ||
168 | |||
157 | WARN_ON_ONCE(!irqs_disabled()); | 169 | WARN_ON_ONCE(!irqs_disabled()); |
158 | now = sched_clock(); | 170 | now = sched_clock(); |
159 | 171 | ||