Commit ef08f0ff authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

sched/clock: Remove local_irq_disable() from the clocks

Now that x86 no longer requires IRQs disabled for sched_clock() and
ia64 never had this requirement (it doesn't seem to do cpufreq at
all), we can remove the requirement of disabling IRQs.

                        MAINLINE   PRE        POST

    sched_clock_stable: 1          1          1
    (cold) sched_clock: 329841     257223     221876
    (cold) local_clock: 301773     309889     234692
    (warm) sched_clock: 38375      25280      25602
    (warm) local_clock: 100371     85268      33265
    (warm) rdtsc:       27340      24247      24214
    sched_clock_stable: 0          0          0
    (cold) sched_clock: 382634     301224     235941
    (cold) local_clock: 396890     399870     297017
    (warm) sched_clock: 38194      25630      25233
    (warm) local_clock: 143452     129629     71234
    (warm) rdtsc:       27345      24307      24245
Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Link: http://lkml.kernel.org/n/tip-36e5kohiasnr106d077mgubp@git.kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 20d1c86a
...@@ -26,9 +26,10 @@ ...@@ -26,9 +26,10 @@
* at 0 on boot (but people really shouldn't rely on that). * at 0 on boot (but people really shouldn't rely on that).
* *
* cpu_clock(i) -- can be used from any context, including NMI. * cpu_clock(i) -- can be used from any context, including NMI.
* sched_clock_cpu(i) -- must be used with local IRQs disabled (implied by NMI)
* local_clock() -- is cpu_clock() on the current cpu. * local_clock() -- is cpu_clock() on the current cpu.
* *
* sched_clock_cpu(i)
*
* How: * How:
* *
* The implementation either uses sched_clock() when * The implementation either uses sched_clock() when
...@@ -50,15 +51,6 @@ ...@@ -50,15 +51,6 @@
* Furthermore, explicit sleep and wakeup hooks allow us to account for time * Furthermore, explicit sleep and wakeup hooks allow us to account for time
* that is otherwise invisible (TSC gets stopped). * that is otherwise invisible (TSC gets stopped).
* *
*
* Notes:
*
* The !IRQ-safetly of sched_clock() and sched_clock_cpu() comes from things
* like cpufreq interrupts that can change the base clock (TSC) multiplier
* and cause funny jumps in time -- although the filtering provided by
* sched_clock_cpu() should mitigate serious artifacts we cannot rely on it
* in general since for !CONFIG_HAVE_UNSTABLE_SCHED_CLOCK we fully rely on
* sched_clock().
*/ */
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/hardirq.h> #include <linux/hardirq.h>
...@@ -242,20 +234,20 @@ u64 sched_clock_cpu(int cpu) ...@@ -242,20 +234,20 @@ u64 sched_clock_cpu(int cpu)
struct sched_clock_data *scd; struct sched_clock_data *scd;
u64 clock; u64 clock;
WARN_ON_ONCE(!irqs_disabled());
if (sched_clock_stable) if (sched_clock_stable)
return sched_clock(); return sched_clock();
if (unlikely(!sched_clock_running)) if (unlikely(!sched_clock_running))
return 0ull; return 0ull;
preempt_disable();
scd = cpu_sdc(cpu); scd = cpu_sdc(cpu);
if (cpu != smp_processor_id()) if (cpu != smp_processor_id())
clock = sched_clock_remote(scd); clock = sched_clock_remote(scd);
else else
clock = sched_clock_local(scd); clock = sched_clock_local(scd);
preempt_enable();
return clock; return clock;
} }
...@@ -316,14 +308,7 @@ EXPORT_SYMBOL_GPL(sched_clock_idle_wakeup_event); ...@@ -316,14 +308,7 @@ EXPORT_SYMBOL_GPL(sched_clock_idle_wakeup_event);
*/ */
u64 cpu_clock(int cpu) u64 cpu_clock(int cpu)
{ {
u64 clock; return sched_clock_cpu(cpu);
unsigned long flags;
local_irq_save(flags);
clock = sched_clock_cpu(cpu);
local_irq_restore(flags);
return clock;
} }
/* /*
...@@ -335,14 +320,7 @@ u64 cpu_clock(int cpu) ...@@ -335,14 +320,7 @@ u64 cpu_clock(int cpu)
*/ */
u64 local_clock(void) u64 local_clock(void)
{ {
u64 clock; return sched_clock_cpu(raw_smp_processor_id());
unsigned long flags;
local_irq_save(flags);
clock = sched_clock_cpu(smp_processor_id());
local_irq_restore(flags);
return clock;
} }
#else /* CONFIG_HAVE_UNSTABLE_SCHED_CLOCK */ #else /* CONFIG_HAVE_UNSTABLE_SCHED_CLOCK */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment