Skip to content

Commit 6b5201c

Browse files
committed
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
2 parents d4ec49d + ba0e41c commit 6b5201c

File tree

2 files changed

+105
-7
lines changed

2 files changed

+105
-7
lines changed

kernel/trace/trace_events_hist.c

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -738,16 +738,30 @@ static void free_synth_field(struct synth_field *field)
738738
kfree(field);
739739
}
740740

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)
743743
{
744744
struct synth_field *field;
745+
const char *prefix = NULL;
746+
char *field_type = argv[0], *field_name;
745747
int len, ret = 0;
746748
char *array;
747749

748750
if (field_type[0] == ';')
749751
field_type++;
750752

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+
}
764+
751765
len = strlen(field_name);
752766
if (field_name[len - 1] == ';')
753767
field_name[len - 1] = '\0';
@@ -760,11 +774,15 @@ static struct synth_field *parse_synth_field(char *field_type,
760774
array = strchr(field_name, '[');
761775
if (array)
762776
len += strlen(array);
777+
if (prefix)
778+
len += strlen(prefix);
763779
field->type = kzalloc(len, GFP_KERNEL);
764780
if (!field->type) {
765781
ret = -ENOMEM;
766782
goto free;
767783
}
784+
if (prefix)
785+
strcat(field->type, prefix);
768786
strcat(field->type, field_type);
769787
if (array) {
770788
strcat(field->type, array);
@@ -1009,7 +1027,7 @@ static int create_synth_event(int argc, char **argv)
10091027
struct synth_field *field, *fields[SYNTH_FIELDS_MAX];
10101028
struct synth_event *event = NULL;
10111029
bool delete_event = false;
1012-
int i, n_fields = 0, ret = 0;
1030+
int i, consumed = 0, n_fields = 0, ret = 0;
10131031
char *name;
10141032

10151033
mutex_lock(&synth_event_mutex);
@@ -1061,16 +1079,16 @@ static int create_synth_event(int argc, char **argv)
10611079
goto err;
10621080
}
10631081

1064-
field = parse_synth_field(argv[i], argv[i + 1]);
1082+
field = parse_synth_field(argc - i, &argv[i], &consumed);
10651083
if (IS_ERR(field)) {
10661084
ret = PTR_ERR(field);
10671085
goto err;
10681086
}
1069-
fields[n_fields] = field;
1070-
i++; n_fields++;
1087+
fields[n_fields++] = field;
1088+
i += consumed - 1;
10711089
}
10721090

1073-
if (i < argc) {
1091+
if (i < argc && strcmp(argv[i], ";") != 0) {
10741092
ret = -EINVAL;
10751093
goto err;
10761094
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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

0 commit comments

Comments
 (0)