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 | ||
