diff options
author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2019-04-01 12:43:09 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2019-04-01 14:18:09 -0400 |
commit | 70df6a7311186a7ab0b19f481dee4ca540a73837 (patch) | |
tree | 4b56b9f85d47d16ece31e434c92f1402800b4868 /tools/lib/traceevent/kbuffer-parse.c | |
parent | 6699ed712a97f70267e017f509126b890f6f6b28 (diff) |
tools lib traceevent: Add more debugging to see various internal ring buffer entries
When trace-cmd report --debug is set, show the internal ring buffer
entries like time-extends and padding. This requires adding new kbuffer
API to retrieve these items.
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Tzvetomir Stoyanov <tstoyanov@vmware.com>
Link: http://lkml.kernel.org/r/20190401164343.257591565@goodmis.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/lib/traceevent/kbuffer-parse.c')
-rw-r--r-- | tools/lib/traceevent/kbuffer-parse.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/tools/lib/traceevent/kbuffer-parse.c b/tools/lib/traceevent/kbuffer-parse.c index af2a1f3b7424..b887e7437d67 100644 --- a/tools/lib/traceevent/kbuffer-parse.c +++ b/tools/lib/traceevent/kbuffer-parse.c | |||
@@ -727,3 +727,52 @@ int kbuffer_start_of_data(struct kbuffer *kbuf) | |||
727 | { | 727 | { |
728 | return kbuf->start; | 728 | return kbuf->start; |
729 | } | 729 | } |
730 | |||
731 | /** | ||
732 | * kbuffer_raw_get - get raw buffer info | ||
733 | * @kbuf: The kbuffer | ||
734 | * @subbuf: Start of mapped subbuffer | ||
735 | * @info: Info descriptor to fill in | ||
736 | * | ||
737 | * For debugging. This can return internals of the ring buffer. | ||
738 | * Expects to have info->next set to what it will read. | ||
739 | * The type, length and timestamp delta will be filled in, and | ||
740 | * @info->next will be updated to the next element. | ||
741 | * The @subbuf is used to know if the info is passed the end of | ||
742 | * data and NULL will be returned if it is. | ||
743 | */ | ||
744 | struct kbuffer_raw_info * | ||
745 | kbuffer_raw_get(struct kbuffer *kbuf, void *subbuf, struct kbuffer_raw_info *info) | ||
746 | { | ||
747 | unsigned long long flags; | ||
748 | unsigned long long delta; | ||
749 | unsigned int type_len; | ||
750 | unsigned int size; | ||
751 | int start; | ||
752 | int length; | ||
753 | void *ptr = info->next; | ||
754 | |||
755 | if (!kbuf || !subbuf) | ||
756 | return NULL; | ||
757 | |||
758 | if (kbuf->flags & KBUFFER_FL_LONG_8) | ||
759 | start = 16; | ||
760 | else | ||
761 | start = 12; | ||
762 | |||
763 | flags = read_long(kbuf, subbuf + 8); | ||
764 | size = (unsigned int)flags & COMMIT_MASK; | ||
765 | |||
766 | if (ptr < subbuf || ptr >= subbuf + start + size) | ||
767 | return NULL; | ||
768 | |||
769 | type_len = translate_data(kbuf, ptr, &ptr, &delta, &length); | ||
770 | |||
771 | info->next = ptr + length; | ||
772 | |||
773 | info->type = type_len; | ||
774 | info->delta = delta; | ||
775 | info->length = length; | ||
776 | |||
777 | return info; | ||
778 | } | ||