X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=kernel%2Fsched_clock.c;h=e1d16c9a76806ef945e4271a9cfcef9ac1a0a0d9;hb=195d1a96ae5fdfbedb8dc4b97afee578921fa99e;hp=390f33234bd007ea41da7006f252e715b6293b43;hpb=cc85906110e26fe8537c3bdbc08a74ae8110030b;p=karo-tx-linux.git diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c index 390f33234bd0..e1d16c9a7680 100644 --- a/kernel/sched_clock.c +++ b/kernel/sched_clock.c @@ -25,6 +25,7 @@ * consistent between cpus (never more than 2 jiffies difference). */ #include +#include #include #include #include @@ -37,7 +38,8 @@ */ unsigned long long __attribute__((weak)) sched_clock(void) { - return (unsigned long long)jiffies * (NSEC_PER_SEC / HZ); + return (unsigned long long)(jiffies - INITIAL_JIFFIES) + * (NSEC_PER_SEC / HZ); } static __read_mostly int sched_clock_running; @@ -154,6 +156,17 @@ u64 sched_clock_cpu(int cpu) return sched_clock(); scd = cpu_sdc(cpu); + + /* + * Normally this is not called in NMI context - but if it is, + * trying to do any locking here is totally lethal. + */ + if (unlikely(in_nmi())) + return scd->clock; + + if (unlikely(!sched_clock_running)) + return 0ull; + WARN_ON_ONCE(!irqs_disabled()); now = sched_clock();