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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'trace-v4.19-rc8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace

Steven writes:
"tracing: A few small fixes to synthetic events

Masami found some issues with the creation of synthetic events. The
first two patches fix handling of unsigned type, and handling of a
space before an ending semi-colon.

The third patch adds a selftest to test the processing of synthetic
events."

* tag 'trace-v4.19-rc8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
selftests: ftrace: Add synthetic event syntax testcase
tracing: Fix synthetic event to allow semicolon at end
tracing: Fix synthetic event to accept unsigned modifier

+105 -7
+25 -7
kernel/trace/trace_events_hist.c
··· 738 738 kfree(field); 739 739 } 740 740 741 - static struct synth_field *parse_synth_field(char *field_type, 742 - char *field_name) 741 + static struct synth_field *parse_synth_field(int argc, char **argv, 742 + int *consumed) 743 743 { 744 744 struct synth_field *field; 745 + const char *prefix = NULL; 746 + char *field_type = argv[0], *field_name; 745 747 int len, ret = 0; 746 748 char *array; 747 749 748 750 if (field_type[0] == ';') 749 751 field_type++; 752 + 753 + if (!strcmp(field_type, "unsigned")) { 754 + if (argc < 3) 755 + return ERR_PTR(-EINVAL); 756 + prefix = "unsigned "; 757 + field_type = argv[1]; 758 + field_name = argv[2]; 759 + *consumed = 3; 760 + } else { 761 + field_name = argv[1]; 762 + *consumed = 2; 763 + } 750 764 751 765 len = strlen(field_name); 752 766 if (field_name[len - 1] == ';') ··· 774 760 array = strchr(field_name, '['); 775 761 if (array) 776 762 len += strlen(array); 763 + if (prefix) 764 + len += strlen(prefix); 777 765 field->type = kzalloc(len, GFP_KERNEL); 778 766 if (!field->type) { 779 767 ret = -ENOMEM; 780 768 goto free; 781 769 } 770 + if (prefix) 771 + strcat(field->type, prefix); 782 772 strcat(field->type, field_type); 783 773 if (array) { 784 774 strcat(field->type, array); ··· 1027 1009 struct synth_field *field, *fields[SYNTH_FIELDS_MAX]; 1028 1010 struct synth_event *event = NULL; 1029 1011 bool delete_event = false; 1030 - int i, n_fields = 0, ret = 0; 1012 + int i, consumed = 0, n_fields = 0, ret = 0; 1031 1013 char *name; 1032 1014 1033 1015 mutex_lock(&synth_event_mutex); ··· 1079 1061 goto err; 1080 1062 } 1081 1063 1082 - field = parse_synth_field(argv[i], argv[i + 1]); 1064 + field = parse_synth_field(argc - i, &argv[i], &consumed); 1083 1065 if (IS_ERR(field)) { 1084 1066 ret = PTR_ERR(field); 1085 1067 goto err; 1086 1068 } 1087 - fields[n_fields] = field; 1088 - i++; n_fields++; 1069 + fields[n_fields++] = field; 1070 + i += consumed - 1; 1089 1071 } 1090 1072 1091 - if (i < argc) { 1073 + if (i < argc && strcmp(argv[i], ";") != 0) { 1092 1074 ret = -EINVAL; 1093 1075 goto err; 1094 1076 }
+80
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-syntax.tc
··· 1 + #!/bin/sh 2 + # SPDX-License-Identifier: GPL-2.0 3 + # description: event trigger - test synthetic_events syntax parser 4 + 5 + do_reset() { 6 + reset_trigger 7 + echo > set_event 8 + clear_trace 9 + } 10 + 11 + fail() { #msg 12 + do_reset 13 + echo $1 14 + exit_fail 15 + } 16 + 17 + if [ ! -f set_event ]; then 18 + echo "event tracing is not supported" 19 + exit_unsupported 20 + fi 21 + 22 + if [ ! -f synthetic_events ]; then 23 + echo "synthetic event is not supported" 24 + exit_unsupported 25 + fi 26 + 27 + reset_tracer 28 + do_reset 29 + 30 + echo "Test synthetic_events syntax parser" 31 + 32 + echo > synthetic_events 33 + 34 + # synthetic event must have a field 35 + ! echo "myevent" >> synthetic_events 36 + echo "myevent u64 var1" >> synthetic_events 37 + 38 + # synthetic event must be found in synthetic_events 39 + grep "myevent[[:space:]]u64 var1" synthetic_events 40 + 41 + # it is not possible to add same name event 42 + ! echo "myevent u64 var2" >> synthetic_events 43 + 44 + # Non-append open will cleanup all events and add new one 45 + echo "myevent u64 var2" > synthetic_events 46 + 47 + # multiple fields with different spaces 48 + echo "myevent u64 var1; u64 var2;" > synthetic_events 49 + grep "myevent[[:space:]]u64 var1; u64 var2" synthetic_events 50 + echo "myevent u64 var1 ; u64 var2 ;" > synthetic_events 51 + grep "myevent[[:space:]]u64 var1; u64 var2" synthetic_events 52 + echo "myevent u64 var1 ;u64 var2" > synthetic_events 53 + grep "myevent[[:space:]]u64 var1; u64 var2" synthetic_events 54 + 55 + # test field types 56 + echo "myevent u32 var" > synthetic_events 57 + echo "myevent u16 var" > synthetic_events 58 + echo "myevent u8 var" > synthetic_events 59 + echo "myevent s64 var" > synthetic_events 60 + echo "myevent s32 var" > synthetic_events 61 + echo "myevent s16 var" > synthetic_events 62 + echo "myevent s8 var" > synthetic_events 63 + 64 + echo "myevent char var" > synthetic_events 65 + echo "myevent int var" > synthetic_events 66 + echo "myevent long var" > synthetic_events 67 + echo "myevent pid_t var" > synthetic_events 68 + 69 + echo "myevent unsigned char var" > synthetic_events 70 + echo "myevent unsigned int var" > synthetic_events 71 + echo "myevent unsigned long var" > synthetic_events 72 + grep "myevent[[:space:]]unsigned long var" synthetic_events 73 + 74 + # test string type 75 + echo "myevent char var[10]" > synthetic_events 76 + grep "myevent[[:space:]]char\[10\] var" synthetic_events 77 + 78 + do_reset 79 + 80 + exit 0