]> rtime.felk.cvut.cz Git - can-eth-gw-linux.git/commitdiff
Merge branch 'tip/perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
authorIngo Molnar <mingo@kernel.org>
Sat, 8 Dec 2012 14:54:35 +0000 (15:54 +0100)
committerIngo Molnar <mingo@kernel.org>
Sat, 8 Dec 2012 14:54:35 +0000 (15:54 +0100)
Pull ftrace updates from Steve Rostedt.

Signed-off-by: Ingo Molnar <mingo@kernel.org>
37 files changed:
arch/alpha/include/asm/Kbuild
arch/arm/include/asm/Kbuild
arch/arm64/include/asm/Kbuild
arch/avr32/include/asm/Kbuild
arch/blackfin/include/asm/Kbuild
arch/c6x/include/asm/Kbuild
arch/cris/include/asm/Kbuild
arch/frv/include/asm/Kbuild
arch/h8300/include/asm/Kbuild
arch/hexagon/include/asm/Kbuild
arch/ia64/include/asm/Kbuild
arch/m32r/include/asm/Kbuild
arch/m68k/include/asm/Kbuild
arch/microblaze/include/asm/Kbuild
arch/mips/include/asm/Kbuild
arch/mn10300/include/asm/Kbuild
arch/openrisc/include/asm/Kbuild
arch/parisc/include/asm/Kbuild
arch/powerpc/include/asm/Kbuild
arch/s390/include/asm/Kbuild
arch/score/include/asm/Kbuild
arch/sh/include/asm/Kbuild
arch/sparc/include/asm/Kbuild
arch/tile/include/asm/Kbuild
arch/um/include/asm/Kbuild
arch/unicore32/include/asm/Kbuild
arch/x86/include/asm/trace_clock.h [new file with mode: 0644]
arch/x86/kernel/Makefile
arch/x86/kernel/trace_clock.c [new file with mode: 0644]
arch/xtensa/include/asm/Kbuild
include/asm-generic/trace_clock.h [new file with mode: 0644]
include/linux/ftrace_event.h
include/linux/trace_clock.h
include/trace/ftrace.h
kernel/trace/trace.c
kernel/trace/trace.h
kernel/trace/trace_output.c

index 64ffc9e9e5485a41b29e0836773389582dfac2fe..dcfabb9f05a07f99301849838dd9d39d6f729db2 100644 (file)
@@ -11,3 +11,4 @@ header-y += reg.h
 header-y += regdef.h
 header-y += sysinfo.h
 generic-y += exec.h
+generic-y += trace_clock.h
index f70ae175a3d6414b2edb2ef9c717b07038d0d117..514e398f1a07a8124df0d6cf59bc1ed02b4adcf5 100644 (file)
@@ -31,5 +31,6 @@ generic-y += sockios.h
 generic-y += termbits.h
 generic-y += termios.h
 generic-y += timex.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += unaligned.h
index a581a2205938db09064604a53244b756ca650d0a..6e9ca462127fc40263d26dd0fc3f3ee7c9a862f2 100644 (file)
@@ -43,6 +43,7 @@ generic-y += swab.h
 generic-y += termbits.h
 generic-y += termios.h
 generic-y += topology.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += unaligned.h
 generic-y += user.h
index 4807ded352c581ae20ea3407884ff92888093c55..4dd4f78d3dcc80a0799a96ab7fc629fe09b728ac 100644 (file)
@@ -1,3 +1,4 @@
 
 generic-y      += clkdev.h
 generic-y      += exec.h
+generic-y      += trace_clock.h
index 5a0625aad6a0a45fa773f2bffc9994b1c4577e4a..27d70759474c4e7a16313061c1036e4f4d15fefb 100644 (file)
@@ -38,6 +38,7 @@ generic-y += statfs.h
 generic-y += termbits.h
 generic-y += termios.h
 generic-y += topology.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += ucontext.h
 generic-y += unaligned.h
index 112a496d835589b27d3685cb1bf48768688a65a9..eae7b5963e860962fef1c91f3db98f150400b67b 100644 (file)
@@ -49,6 +49,7 @@ generic-y += termbits.h
 generic-y += termios.h
 generic-y += tlbflush.h
 generic-y += topology.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += ucontext.h
 generic-y += user.h
index 6d43a951b5ec0b5b217ca8a51405cfa274be5ffb..15a122c3767cb961b44fac15107ee7403ffbc6b4 100644 (file)
@@ -11,3 +11,4 @@ header-y += sync_serial.h
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += module.h
+generic-y += trace_clock.h
index 4a159da23633dbf359c9886513958ce49e842ce7..c5d76702830603f4d2fbde47e26412c179acfde6 100644 (file)
@@ -1,3 +1,4 @@
 
 generic-y += clkdev.h
 generic-y += exec.h
+generic-y += trace_clock.h
index 50bbf387b2f880d70a6783e8d7268eac764a4992..4bc8ae73e08a931b5441cadf0bad8a60cc9fa76f 100644 (file)
@@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += module.h
+generic-y += trace_clock.h
index 3bfa9b30f448b3f464d5087ba622f6dde4523446..bdb54ceb53bc9a8c564564cb2dfd2d3e0068db64 100644 (file)
@@ -48,6 +48,7 @@ generic-y += stat.h
 generic-y += termbits.h
 generic-y += termios.h
 generic-y += topology.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += ucontext.h
 generic-y += unaligned.h
index dd02f09b6eda6e2b41f1dd643a6ff550625a15e0..05b03ecd7933cdb87af9b532f15450ea024ec73f 100644 (file)
@@ -2,3 +2,4 @@
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += kvm_para.h
+generic-y += trace_clock.h
index 50bbf387b2f880d70a6783e8d7268eac764a4992..4bc8ae73e08a931b5441cadf0bad8a60cc9fa76f 100644 (file)
@@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += module.h
+generic-y += trace_clock.h
index 88fa3ac86fae9af988331112cba87ff711eb3555..7f1949c0e089e37bae15a368cda041ade22e509c 100644 (file)
@@ -24,6 +24,7 @@ generic-y += sections.h
 generic-y += siginfo.h
 generic-y += statfs.h
 generic-y += topology.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += word-at-a-time.h
 generic-y += xor.h
index 8653072d7e9f061479c5b11c5de056337cfdac7a..2957fcc71764513e6c083a1f656efef1036a9678 100644 (file)
@@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm
 header-y  += elf.h
 generic-y += clkdev.h
 generic-y += exec.h
+generic-y += trace_clock.h
index 533053d12cede054a47d225534b1a4ec34b07986..9b54b7a403d446b59073fe39fec03e0db7a432e8 100644 (file)
@@ -1 +1,2 @@
 # MIPS headers
+generic-y += trace_clock.h
index 4a159da23633dbf359c9886513958ce49e842ce7..c5d76702830603f4d2fbde47e26412c179acfde6 100644 (file)
@@ -1,3 +1,4 @@
 
 generic-y += clkdev.h
 generic-y += exec.h
+generic-y += trace_clock.h
index 78de6805268d1b6094986d02a7c790c35cb90f17..8971026e1c63fbee30dda6c1992176a63903e115 100644 (file)
@@ -60,6 +60,7 @@ generic-y += swab.h
 generic-y += termbits.h
 generic-y += termios.h
 generic-y += topology.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += ucontext.h
 generic-y += user.h
index bac8debecffb067ca8b550e0773a3c7c204d1e0b..ff4c9faed546da39c89d4bd6f1a851376a667040 100644 (file)
@@ -3,3 +3,4 @@ generic-y += word-at-a-time.h auxvec.h user.h cputime.h emergency-restart.h \
          segment.h topology.h vga.h device.h percpu.h hw_irq.h mutex.h \
          div64.h irq_regs.h kdebug.h kvm_para.h local64.h local.h param.h \
          poll.h xor.h clkdev.h exec.h
+generic-y += trace_clock.h
index a4fe15e33c6f0e34e49446d89329d9c5cfd37a61..2d62b484b3fcd0599ca9ed1fcddcdf7c70b26a61 100644 (file)
@@ -2,3 +2,4 @@
 
 generic-y += clkdev.h
 generic-y += rwsem.h
+generic-y += trace_clock.h
index 0633dc6d254da93deff0e73019740dd46c88af33..f313f9cbcf44fa410c88e85b17642a865bf39a74 100644 (file)
@@ -1,3 +1,4 @@
 
 
 generic-y += clkdev.h
+generic-y += trace_clock.h
index ec697aeefd05436f34647fa85d61293b7aa575d9..16e41fe1a419f88a13c0605f043effde7ea98595 100644 (file)
@@ -3,3 +3,4 @@ include include/asm-generic/Kbuild.asm
 header-y +=
 
 generic-y += clkdev.h
+generic-y += trace_clock.h
index 29f83beeef7a4c463d814ee445f73e47e2ff24b8..280bea9e5e2be362a7ff32a36cdd966b5f38ffe6 100644 (file)
@@ -31,5 +31,6 @@ generic-y += socket.h
 generic-y += statfs.h
 generic-y += termbits.h
 generic-y += termios.h
+generic-y += trace_clock.h
 generic-y += ucontext.h
 generic-y += xor.h
index 645a58da0e8601cf0765db0a2fc4091199da702b..e26d430ce2fdb94b7c85281db75367acf41e2321 100644 (file)
@@ -8,4 +8,5 @@ generic-y += local64.h
 generic-y += irq_regs.h
 generic-y += local.h
 generic-y += module.h
+generic-y += trace_clock.h
 generic-y += word-at-a-time.h
index 6948015e08a2af582a8a539438460951ea3c8b45..b17b9b8e53cdcab7a9eb4f7a95e86402c27f2812 100644 (file)
@@ -34,5 +34,6 @@ generic-y += sockios.h
 generic-y += statfs.h
 generic-y += termbits.h
 generic-y += termios.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += xor.h
index 0f6e7b32826522249f9dbd170e4f5c97cfd9a414..b30f34a79882c4413e77de1495bba161ed61a9af 100644 (file)
@@ -2,3 +2,4 @@ generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h
 generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h
 generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h exec.h
 generic-y += switch_to.h clkdev.h
+generic-y += trace_clock.h
index 601e92f18af6d85d5bb314733e409f97436df804..89d8b6c4e39a09d5739bf215f4ce4c663a9f2ef3 100644 (file)
@@ -53,6 +53,7 @@ generic-y += syscalls.h
 generic-y += termbits.h
 generic-y += termios.h
 generic-y += topology.h
+generic-y += trace_clock.h
 generic-y += types.h
 generic-y += ucontext.h
 generic-y += unaligned.h
diff --git a/arch/x86/include/asm/trace_clock.h b/arch/x86/include/asm/trace_clock.h
new file mode 100644 (file)
index 0000000..beab86c
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef _ASM_X86_TRACE_CLOCK_H
+#define _ASM_X86_TRACE_CLOCK_H
+
+#include <linux/compiler.h>
+#include <linux/types.h>
+
+#ifdef CONFIG_X86_TSC
+
+extern u64 notrace trace_clock_x86_tsc(void);
+
+# define ARCH_TRACE_CLOCKS \
+       { trace_clock_x86_tsc,  "x86-tsc",      .in_ns = 0 },
+
+#else /* !CONFIG_X86_TSC */
+
+#define ARCH_TRACE_CLOCKS
+
+#endif
+
+#endif  /* _ASM_X86_TRACE_CLOCK_H */
index 9fd5eed3f8f5d30bf9256cdc88719df06f4dee5d..34e923a537628777aa4e5ac90741bef6ef575633 100644 (file)
@@ -61,6 +61,7 @@ obj-$(CONFIG_X86_REBOOTFIXUPS)        += reboot_fixups_32.o
 obj-$(CONFIG_DYNAMIC_FTRACE)   += ftrace.o
 obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
 obj-$(CONFIG_FTRACE_SYSCALLS)  += ftrace.o
+obj-$(CONFIG_X86_TSC)          += trace_clock.o
 obj-$(CONFIG_KEXEC)            += machine_kexec_$(BITS).o
 obj-$(CONFIG_KEXEC)            += relocate_kernel_$(BITS).o crash.o
 obj-$(CONFIG_CRASH_DUMP)       += crash_dump_$(BITS).o
diff --git a/arch/x86/kernel/trace_clock.c b/arch/x86/kernel/trace_clock.c
new file mode 100644 (file)
index 0000000..25b9937
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * X86 trace clocks
+ */
+#include <asm/trace_clock.h>
+#include <asm/barrier.h>
+#include <asm/msr.h>
+
+/*
+ * trace_clock_x86_tsc(): A clock that is just the cycle counter.
+ *
+ * Unlike the other clocks, this is not in nanoseconds.
+ */
+u64 notrace trace_clock_x86_tsc(void)
+{
+       u64 ret;
+
+       rdtsc_barrier();
+       rdtscll(ret);
+
+       return ret;
+}
index 6d13027899957d528a142964db0b299d36b74a13..095f0a2244f7c473eba52ebafa66968d1fd4f10f 100644 (file)
@@ -25,4 +25,5 @@ generic-y += siginfo.h
 generic-y += statfs.h
 generic-y += termios.h
 generic-y += topology.h
+generic-y += trace_clock.h
 generic-y += xor.h
diff --git a/include/asm-generic/trace_clock.h b/include/asm-generic/trace_clock.h
new file mode 100644 (file)
index 0000000..6726f1b
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _ASM_GENERIC_TRACE_CLOCK_H
+#define _ASM_GENERIC_TRACE_CLOCK_H
+/*
+ * Arch-specific trace clocks.
+ */
+
+/*
+ * Additional trace clocks added to the trace_clocks
+ * array in kernel/trace/trace.c
+ * None if the architecture has not defined it.
+ */
+#ifndef ARCH_TRACE_CLOCKS
+# define ARCH_TRACE_CLOCKS
+#endif
+
+#endif  /* _ASM_GENERIC_TRACE_CLOCK_H */
index b80c8ddfbbdc89695361a8d5b14787df8ac327b3..a3d489531d83a7c396aaa6a24d09961eeae47929 100644 (file)
@@ -86,6 +86,12 @@ struct trace_iterator {
        cpumask_var_t           started;
 };
 
+enum trace_iter_flags {
+       TRACE_FILE_LAT_FMT      = 1,
+       TRACE_FILE_ANNOTATE     = 2,
+       TRACE_FILE_TIME_IN_NS   = 4,
+};
+
 
 struct trace_event;
 
index 4eb490237d4c20c0f65cae5581e2e07e8b8f2721..d563f37e1a1dfcfb3588c05b2117737448b3da18 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/compiler.h>
 #include <linux/types.h>
 
+#include <asm/trace_clock.h>
+
 extern u64 notrace trace_clock_local(void);
 extern u64 notrace trace_clock(void);
 extern u64 notrace trace_clock_global(void);
index 698f2a890322b10a51d736af9431b00e595b5e1f..40dc5e8fe3401a6ba1e5c601d17f5cfb18913250 100644 (file)
@@ -619,79 +619,6 @@ __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call
 
 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
 
-/*
- * Define the insertion callback to perf events
- *
- * The job is very similar to ftrace_raw_event_<call> except that we don't
- * insert in the ring buffer but in a perf counter.
- *
- * static void ftrace_perf_<call>(proto)
- * {
- *     struct ftrace_data_offsets_<call> __maybe_unused __data_offsets;
- *     struct ftrace_event_call *event_call = &event_<call>;
- *     extern void perf_tp_event(int, u64, u64, void *, int);
- *     struct ftrace_raw_##call *entry;
- *     struct perf_trace_buf *trace_buf;
- *     u64 __addr = 0, __count = 1;
- *     unsigned long irq_flags;
- *     struct trace_entry *ent;
- *     int __entry_size;
- *     int __data_size;
- *     int __cpu
- *     int pc;
- *
- *     pc = preempt_count();
- *
- *     __data_size = ftrace_get_offsets_<call>(&__data_offsets, args);
- *
- *     // Below we want to get the aligned size by taking into account
- *     // the u32 field that will later store the buffer size
- *     __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),
- *                          sizeof(u64));
- *     __entry_size -= sizeof(u32);
- *
- *     // Protect the non nmi buffer
- *     // This also protects the rcu read side
- *     local_irq_save(irq_flags);
- *     __cpu = smp_processor_id();
- *
- *     if (in_nmi())
- *             trace_buf = rcu_dereference_sched(perf_trace_buf_nmi);
- *     else
- *             trace_buf = rcu_dereference_sched(perf_trace_buf);
- *
- *     if (!trace_buf)
- *             goto end;
- *
- *     trace_buf = per_cpu_ptr(trace_buf, __cpu);
- *
- *     // Avoid recursion from perf that could mess up the buffer
- *     if (trace_buf->recursion++)
- *             goto end_recursion;
- *
- *     raw_data = trace_buf->buf;
- *
- *     // Make recursion update visible before entering perf_tp_event
- *     // so that we protect from perf recursions.
- *
- *     barrier();
- *
- *     //zero dead bytes from alignment to avoid stack leak to userspace:
- *     *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL;
- *     entry = (struct ftrace_raw_<call> *)raw_data;
- *     ent = &entry->ent;
- *     tracing_generic_entry_update(ent, irq_flags, pc);
- *     ent->type = event_call->id;
- *
- *     <tstruct> <- do some jobs with dynamic arrays
- *
- *     <assign>  <- affect our values
- *
- *     perf_tp_event(event_call->id, __addr, __count, entry,
- *                  __entry_size);  <- submit them to perf counter
- *
- * }
- */
 
 #ifdef CONFIG_PERF_EVENTS
 
index c1434b5ce4d1471e1122ec3121055aa73ebd820d..b69cc380322dbfe17983e582a9537d6e53e1ce7b 100644 (file)
@@ -484,10 +484,12 @@ static const char *trace_options[] = {
 static struct {
        u64 (*func)(void);
        const char *name;
+       int in_ns;              /* is this clock in nanoseconds? */
 } trace_clocks[] = {
-       { trace_clock_local,    "local" },
-       { trace_clock_global,   "global" },
-       { trace_clock_counter,  "counter" },
+       { trace_clock_local,    "local",        1 },
+       { trace_clock_global,   "global",       1 },
+       { trace_clock_counter,  "counter",      0 },
+       ARCH_TRACE_CLOCKS
 };
 
 int trace_clock_id;
@@ -2477,6 +2479,10 @@ __tracing_open(struct inode *inode, struct file *file)
        if (ring_buffer_overruns(iter->tr->buffer))
                iter->iter_flags |= TRACE_FILE_ANNOTATE;
 
+       /* Output in nanoseconds only if we are using a clock in nanoseconds. */
+       if (trace_clocks[trace_clock_id].in_ns)
+               iter->iter_flags |= TRACE_FILE_TIME_IN_NS;
+
        /* stop the trace while dumping */
        tracing_stop();
 
@@ -3338,6 +3344,10 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp)
        if (trace_flags & TRACE_ITER_LATENCY_FMT)
                iter->iter_flags |= TRACE_FILE_LAT_FMT;
 
+       /* Output in nanoseconds only if we are using a clock in nanoseconds. */
+       if (trace_clocks[trace_clock_id].in_ns)
+               iter->iter_flags |= TRACE_FILE_TIME_IN_NS;
+
        iter->cpu_file = cpu_file;
        iter->tr = &global_trace;
        mutex_init(&iter->mutex);
@@ -4378,13 +4388,24 @@ tracing_stats_read(struct file *filp, char __user *ubuf,
        cnt = ring_buffer_bytes_cpu(tr->buffer, cpu);
        trace_seq_printf(s, "bytes: %ld\n", cnt);
 
-       t = ns2usecs(ring_buffer_oldest_event_ts(tr->buffer, cpu));
-       usec_rem = do_div(t, USEC_PER_SEC);
-       trace_seq_printf(s, "oldest event ts: %5llu.%06lu\n", t, usec_rem);
+       if (trace_clocks[trace_clock_id].in_ns) {
+               /* local or global for trace_clock */
+               t = ns2usecs(ring_buffer_oldest_event_ts(tr->buffer, cpu));
+               usec_rem = do_div(t, USEC_PER_SEC);
+               trace_seq_printf(s, "oldest event ts: %5llu.%06lu\n",
+                                                               t, usec_rem);
 
-       t = ns2usecs(ring_buffer_time_stamp(tr->buffer, cpu));
-       usec_rem = do_div(t, USEC_PER_SEC);
-       trace_seq_printf(s, "now ts: %5llu.%06lu\n", t, usec_rem);
+               t = ns2usecs(ring_buffer_time_stamp(tr->buffer, cpu));
+               usec_rem = do_div(t, USEC_PER_SEC);
+               trace_seq_printf(s, "now ts: %5llu.%06lu\n", t, usec_rem);
+       } else {
+               /* counter or tsc mode for trace_clock */
+               trace_seq_printf(s, "oldest event ts: %llu\n",
+                               ring_buffer_oldest_event_ts(tr->buffer, cpu));
+
+               trace_seq_printf(s, "now ts: %llu\n",
+                               ring_buffer_time_stamp(tr->buffer, cpu));
+       }
 
        cnt = ring_buffer_dropped_events_cpu(tr->buffer, cpu);
        trace_seq_printf(s, "dropped events: %ld\n", cnt);
index 55010ed175f00af807aec5d3ae14d41435a44fb5..c75d7988902caa5b7ce38d3cdad888d9ade9f105 100644 (file)
@@ -406,10 +406,6 @@ void tracing_stop_sched_switch_record(void);
 void tracing_start_sched_switch_record(void);
 int register_tracer(struct tracer *type);
 int is_tracing_stopped(void);
-enum trace_file_type {
-       TRACE_FILE_LAT_FMT      = 1,
-       TRACE_FILE_ANNOTATE     = 2,
-};
 
 extern cpumask_var_t __read_mostly tracing_buffer_mask;
 
index 123b189c732c4142965252d80e9d49745127fe39..194d79602dc73f1881969a9d27e7e141fb545117 100644 (file)
@@ -610,24 +610,54 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
        return trace_print_lat_fmt(s, entry);
 }
 
-static unsigned long preempt_mark_thresh = 100;
+static unsigned long preempt_mark_thresh_us = 100;
 
 static int
-lat_print_timestamp(struct trace_seq *s, u64 abs_usecs,
-                   unsigned long rel_usecs)
+lat_print_timestamp(struct trace_iterator *iter, u64 next_ts)
 {
-       return trace_seq_printf(s, " %4lldus%c: ", abs_usecs,
-                               rel_usecs > preempt_mark_thresh ? '!' :
-                                 rel_usecs > 1 ? '+' : ' ');
+       unsigned long verbose = trace_flags & TRACE_ITER_VERBOSE;
+       unsigned long in_ns = iter->iter_flags & TRACE_FILE_TIME_IN_NS;
+       unsigned long long abs_ts = iter->ts - iter->tr->time_start;
+       unsigned long long rel_ts = next_ts - iter->ts;
+       struct trace_seq *s = &iter->seq;
+
+       if (in_ns) {
+               abs_ts = ns2usecs(abs_ts);
+               rel_ts = ns2usecs(rel_ts);
+       }
+
+       if (verbose && in_ns) {
+               unsigned long abs_usec = do_div(abs_ts, USEC_PER_MSEC);
+               unsigned long abs_msec = (unsigned long)abs_ts;
+               unsigned long rel_usec = do_div(rel_ts, USEC_PER_MSEC);
+               unsigned long rel_msec = (unsigned long)rel_ts;
+
+               return trace_seq_printf(
+                               s, "[%08llx] %ld.%03ldms (+%ld.%03ldms): ",
+                               ns2usecs(iter->ts),
+                               abs_msec, abs_usec,
+                               rel_msec, rel_usec);
+       } else if (verbose && !in_ns) {
+               return trace_seq_printf(
+                               s, "[%016llx] %lld (+%lld): ",
+                               iter->ts, abs_ts, rel_ts);
+       } else if (!verbose && in_ns) {
+               return trace_seq_printf(
+                               s, " %4lldus%c: ",
+                               abs_ts,
+                               rel_ts > preempt_mark_thresh_us ? '!' :
+                                 rel_ts > 1 ? '+' : ' ');
+       } else { /* !verbose && !in_ns */
+               return trace_seq_printf(s, " %4lld: ", abs_ts);
+       }
 }
 
 int trace_print_context(struct trace_iterator *iter)
 {
        struct trace_seq *s = &iter->seq;
        struct trace_entry *entry = iter->ent;
-       unsigned long long t = ns2usecs(iter->ts);
-       unsigned long usec_rem = do_div(t, USEC_PER_SEC);
-       unsigned long secs = (unsigned long)t;
+       unsigned long long t;
+       unsigned long secs, usec_rem;
        char comm[TASK_COMM_LEN];
        int ret;
 
@@ -644,8 +674,13 @@ int trace_print_context(struct trace_iterator *iter)
                        return 0;
        }
 
-       return trace_seq_printf(s, " %5lu.%06lu: ",
-                               secs, usec_rem);
+       if (iter->iter_flags & TRACE_FILE_TIME_IN_NS) {
+               t = ns2usecs(iter->ts);
+               usec_rem = do_div(t, USEC_PER_SEC);
+               secs = (unsigned long)t;
+               return trace_seq_printf(s, " %5lu.%06lu: ", secs, usec_rem);
+       } else
+               return trace_seq_printf(s, " %12llu: ", iter->ts);
 }
 
 int trace_print_lat_context(struct trace_iterator *iter)
@@ -659,36 +694,29 @@ int trace_print_lat_context(struct trace_iterator *iter)
                           *next_entry = trace_find_next_entry(iter, NULL,
                                                               &next_ts);
        unsigned long verbose = (trace_flags & TRACE_ITER_VERBOSE);
-       unsigned long abs_usecs = ns2usecs(iter->ts - iter->tr->time_start);
-       unsigned long rel_usecs;
 
        /* Restore the original ent_size */
        iter->ent_size = ent_size;
 
        if (!next_entry)
                next_ts = iter->ts;
-       rel_usecs = ns2usecs(next_ts - iter->ts);
 
        if (verbose) {
                char comm[TASK_COMM_LEN];
 
                trace_find_cmdline(entry->pid, comm);
 
-               ret = trace_seq_printf(s, "%16s %5d %3d %d %08x %08lx [%08llx]"
-                                      " %ld.%03ldms (+%ld.%03ldms): ", comm,
-                                      entry->pid, iter->cpu, entry->flags,
-                                      entry->preempt_count, iter->idx,
-                                      ns2usecs(iter->ts),
-                                      abs_usecs / USEC_PER_MSEC,
-                                      abs_usecs % USEC_PER_MSEC,
-                                      rel_usecs / USEC_PER_MSEC,
-                                      rel_usecs % USEC_PER_MSEC);
+               ret = trace_seq_printf(
+                               s, "%16s %5d %3d %d %08x %08lx ",
+                               comm, entry->pid, iter->cpu, entry->flags,
+                               entry->preempt_count, iter->idx);
        } else {
                ret = lat_print_generic(s, entry, iter->cpu);
-               if (ret)
-                       ret = lat_print_timestamp(s, abs_usecs, rel_usecs);
        }
 
+       if (ret)
+               ret = lat_print_timestamp(iter, next_ts);
+
        return ret;
 }