Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Steven Rostedt (Red Hat) and committed by
Arnaldo Carvalho de Melo
70df6a73 6699ed71

+62
+49
tools/lib/traceevent/kbuffer-parse.c
··· 727 727 { 728 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 + }
+13
tools/lib/traceevent/kbuffer.h
··· 65 65 void kbuffer_set_old_format(struct kbuffer *kbuf); 66 66 int kbuffer_start_of_data(struct kbuffer *kbuf); 67 67 68 + /* Debugging */ 69 + 70 + struct kbuffer_raw_info { 71 + int type; 72 + int length; 73 + unsigned long long delta; 74 + void *next; 75 + }; 76 + 77 + /* Read raw data */ 78 + struct kbuffer_raw_info *kbuffer_raw_get(struct kbuffer *kbuf, void *subbuf, 79 + struct kbuffer_raw_info *info); 80 + 68 81 #endif /* _K_BUFFER_H */