diff options
author | Joel Fernandes <joelaf@google.com> | 2016-10-20 00:34:05 -0700 |
---|---|---|
committer | Kees Cook <keescook@chromium.org> | 2016-11-15 16:34:27 -0800 |
commit | fbccdeb8d77d6830556bc4079eeed80298cc97dc (patch) | |
tree | c423e1973a8107db2ee1f6dd8ac70539fdee3fef /fs/pstore/ftrace.c | |
parent | a1cf53ac6d156721afa86453d5e8423461881231 (diff) |
pstore: Add ftrace timestamp counter
In preparation for merging the per CPU buffers into one buffer when
we retrieve the pstore ftrace data, we store the timestamp as a
counter in the ftrace pstore record. We store the CPU number as well
if !PSTORE_CPU_IN_IP, in this case we shift the counter and may lose
ordering there but we preserve the same record size. The timestamp counter
is also racy, and not doing any locking or synchronization here results
in the benefit of lower overhead. Since we don't care much here for exact
ordering of function traces across CPUs, we don't synchronize and may lose
some counter updates but I'm ok with that.
Using trace_clock() results in much lower performance so avoid using it
since we don't want accuracy in timestamp and need a rough ordering to
perform merge.
Signed-off-by: Joel Fernandes <joelaf@google.com>
[kees: updated commit message, added comments]
Signed-off-by: Kees Cook <keescook@chromium.org>
Diffstat (limited to 'fs/pstore/ftrace.c')
-rw-r--r-- | fs/pstore/ftrace.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/pstore/ftrace.c b/fs/pstore/ftrace.c index d4887705bb61..31548cc09e7b 100644 --- a/fs/pstore/ftrace.c +++ b/fs/pstore/ftrace.c @@ -27,6 +27,9 @@ #include <asm/barrier.h> #include "internal.h" +/* This doesn't need to be atomic: speed is chosen over correctness here. */ +static u64 pstore_ftrace_stamp; + static void notrace pstore_ftrace_call(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *op, @@ -42,6 +45,7 @@ static void notrace pstore_ftrace_call(unsigned long ip, rec.ip = ip; rec.parent_ip = parent_ip; + pstore_ftrace_write_timestamp(&rec, pstore_ftrace_stamp++); pstore_ftrace_encode_cpu(&rec, raw_smp_processor_id()); psinfo->write_buf(PSTORE_TYPE_FTRACE, 0, NULL, 0, (void *)&rec, 0, sizeof(rec), psinfo); |