Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 20d1c86a
Loading
Loading
Loading
Loading
+6 −28
Original line number Original line Diff line number Diff line
@@ -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 @@
 * 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)
	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);
 */
 */
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)
 */
 */
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 */