-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 140807 b: refs/heads/master c: 14131f2 h: refs/heads/master i: 140805: f9f88dc 140803: 2e8fa54 140799: 06625dc v: v3
- Loading branch information
Ingo Molnar
committed
Feb 26, 2009
1 parent
b5e9251
commit 771f109
Showing
5 changed files
with
124 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 6409c4da289d6905f7ae2bd0630438368439bda2 | ||
refs/heads/master: 14131f2f98ac350ee9e73faed916d2238a8b6a0d |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#ifndef _LINUX_TRACE_CLOCK_H | ||
#define _LINUX_TRACE_CLOCK_H | ||
|
||
/* | ||
* 3 trace clock variants, with differing scalability/precision | ||
* tradeoffs: | ||
* | ||
* - local: CPU-local trace clock | ||
* - medium: scalable global clock with some jitter | ||
* - global: globally monotonic, serialized clock | ||
*/ | ||
#include <linux/compiler.h> | ||
#include <linux/types.h> | ||
|
||
extern u64 notrace trace_clock_local(void); | ||
extern u64 notrace trace_clock(void); | ||
extern u64 notrace trace_clock_global(void); | ||
|
||
#endif /* _LINUX_TRACE_CLOCK_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
/* | ||
* tracing clocks | ||
* | ||
* Copyright (C) 2009 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | ||
* | ||
* Implements 3 trace clock variants, with differing scalability/precision | ||
* tradeoffs: | ||
* | ||
* - local: CPU-local trace clock | ||
* - medium: scalable global clock with some jitter | ||
* - global: globally monotonic, serialized clock | ||
* | ||
* Tracer plugins will chose a default from these clocks. | ||
*/ | ||
#include <linux/spinlock.h> | ||
#include <linux/hardirq.h> | ||
#include <linux/module.h> | ||
#include <linux/percpu.h> | ||
#include <linux/sched.h> | ||
#include <linux/ktime.h> | ||
|
||
/* | ||
* trace_clock_local(): the simplest and least coherent tracing clock. | ||
* | ||
* Useful for tracing that does not cross to other CPUs nor | ||
* does it go through idle events. | ||
*/ | ||
u64 notrace trace_clock_local(void) | ||
{ | ||
/* | ||
* sched_clock() is an architecture implemented, fast, scalable, | ||
* lockless clock. It is not guaranteed to be coherent across | ||
* CPUs, nor across CPU idle events. | ||
*/ | ||
return sched_clock(); | ||
} | ||
|
||
/* | ||
* trace_clock(): 'inbetween' trace clock. Not completely serialized, | ||
* but not completely incorrect when crossing CPUs either. | ||
* | ||
* This is based on cpu_clock(), which will allow at most ~1 jiffy of | ||
* jitter between CPUs. So it's a pretty scalable clock, but there | ||
* can be offsets in the trace data. | ||
*/ | ||
u64 notrace trace_clock(void) | ||
{ | ||
return cpu_clock(raw_smp_processor_id()); | ||
} | ||
|
||
|
||
/* | ||
* trace_clock_global(): special globally coherent trace clock | ||
* | ||
* It has higher overhead than the other trace clocks but is still | ||
* an order of magnitude faster than GTOD derived hardware clocks. | ||
* | ||
* Used by plugins that need globally coherent timestamps. | ||
*/ | ||
|
||
static u64 prev_trace_clock_time; | ||
|
||
static raw_spinlock_t trace_clock_lock ____cacheline_aligned_in_smp = | ||
(raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED; | ||
|
||
u64 notrace trace_clock_global(void) | ||
{ | ||
unsigned long flags; | ||
int this_cpu; | ||
u64 now; | ||
|
||
raw_local_irq_save(flags); | ||
|
||
this_cpu = raw_smp_processor_id(); | ||
now = cpu_clock(this_cpu); | ||
/* | ||
* If in an NMI context then dont risk lockups and return the | ||
* cpu_clock() time: | ||
*/ | ||
if (unlikely(in_nmi())) | ||
goto out; | ||
|
||
__raw_spin_lock(&trace_clock_lock); | ||
|
||
/* | ||
* TODO: if this happens often then maybe we should reset | ||
* my_scd->clock to prev_trace_clock_time+1, to make sure | ||
* we start ticking with the local clock from now on? | ||
*/ | ||
if ((s64)(now - prev_trace_clock_time) < 0) | ||
now = prev_trace_clock_time + 1; | ||
|
||
prev_trace_clock_time = now; | ||
|
||
__raw_spin_unlock(&trace_clock_lock); | ||
|
||
out: | ||
raw_local_irq_restore(flags); | ||
|
||
return now; | ||
} |