Skip to content

Commit 0e86419

Browse files
committed
nettrace: add support to print call stack
Signed-off-by: Menglong Dong <imagedong@tencent.com>
1 parent 2cb4878 commit 0e86419

3 files changed

Lines changed: 62 additions & 16 deletions

File tree

src/nettrace.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ static void do_parse_args(int argc, char *argv[])
127127
"packet is not NATed to get better "
128128
"performance",
129129
},
130+
{
131+
.lname = "trace-stack", .dest = &trace_args->traces_stack,
132+
.type = OPTION_STRING,
133+
.desc = "print call stack for traces or group",
134+
},
130135
{ .type = OPTION_BLANK },
131136
{
132137
.sname = 'v', .dest = &show_log,

src/trace.c

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -140,41 +140,69 @@ trace_t *search_trace_enabled(char *name)
140140
return NULL;
141141
}
142142

143-
int trace_enable(char *name)
143+
int trace_enable(char *name, int target)
144144
{
145145
bool found = false;
146+
int err = 0;
146147
trace_t *t;
147148

148149
trace_for_each(t) {
149150
if (strcmp(t->name, name))
150151
continue;
151-
trace_set_enable(t);
152+
switch (target) {
153+
case 1:
154+
trace_set_enable(t);
155+
break;
156+
case 2:
157+
err = trace_set_stack(t);
158+
break;
159+
}
160+
if (err)
161+
return err;
152162
found = true;
153163
}
164+
if (!found)
165+
pr_err("trace not found: %s\n", name);
154166
return !found;
155167
}
156168

157-
static void _trace_group_enable(trace_group_t *group)
169+
static int __trace_group_enable(trace_group_t *group, int target)
158170
{
159171
trace_group_t *pos;
160172
trace_list_t *t;
173+
int err = 0;
161174

162-
list_for_each_entry(pos, &group->children, list)
163-
_trace_group_enable(pos);
175+
list_for_each_entry(pos, &group->children, list) {
176+
err = __trace_group_enable(pos, target);
177+
if (err)
178+
return err;
179+
}
164180

165-
list_for_each_entry(t, &group->traces, list)
166-
trace_set_enable(t->trace);
181+
list_for_each_entry(t, &group->traces, list) {
182+
switch (target) {
183+
case 1:
184+
trace_set_enable(t->trace);
185+
break;
186+
case 2:
187+
err = trace_set_stack(t->trace);
188+
break;
189+
}
190+
if (err)
191+
return err;
192+
}
193+
194+
return 0;
167195
}
168196

169197
/* enable all traces in the group of 'name' */
170-
int trace_group_enable(char *name)
198+
int trace_group_enable(char *name, int target)
171199
{
172200
trace_group_t *g = search_trace_group(name);
173201

174202
if (!g)
175-
return -1;
176-
_trace_group_enable(g);
177-
return 0;
203+
return trace_enable(name, target);
204+
205+
return __trace_group_enable(g, target);
178206
}
179207

180208
bool trace_analyzer_enabled(analyzer_t *analyzer)
@@ -231,6 +259,7 @@ static int trace_prepare_args()
231259
trace_t *drop_trace = search_trace_enabled("kfree_skb");
232260
bpf_args_t *bpf_args = &trace_ctx.bpf_args;
233261
trace_args_t *args = &trace_ctx.args;
262+
char *traces_stack = args->traces_stack;
234263
char *traces = args->traces;
235264
trace_t *trace;
236265
char *tmp, *cur;
@@ -263,6 +292,20 @@ static int trace_prepare_args()
263292
goto skip_trace;
264293
}
265294

295+
if (traces_stack) {
296+
tmp = calloc(strlen(traces_stack) + 1, 1);
297+
strcpy(tmp, traces_stack);
298+
cur = strtok(tmp, ",");
299+
while (cur) {
300+
if (trace_group_enable(cur, 2)) {
301+
free(tmp);
302+
goto err;
303+
}
304+
cur = strtok(NULL, ",");
305+
}
306+
free(tmp);
307+
}
308+
266309
if (!traces) {
267310
trace_for_each(trace)
268311
if (trace->def)
@@ -279,8 +322,7 @@ static int trace_prepare_args()
279322
strcpy(tmp, traces);
280323
cur = strtok(tmp, ",");
281324
while (cur) {
282-
if (trace_group_enable(cur) && trace_enable(cur)) {
283-
pr_err("trace not found: %s\n", cur);
325+
if (trace_group_enable(cur, 1)) {
284326
free(tmp);
285327
goto err;
286328
}
@@ -312,7 +354,7 @@ static int trace_prepare_args()
312354
trace_set_ret(trace);
313355
/* enable skb free/drop trace */
314356
if (!trace_has_end())
315-
trace_group_enable("life");
357+
trace_group_enable("life", 1);
316358
break;
317359
case TRACE_MODE_DROP:
318360
if (!trace_ctx.drop_reason)

src/trace.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ typedef struct trace_args {
105105
bool force;
106106
u32 min_latency;
107107
char *traces;
108+
char *traces_stack;
108109
} trace_args_t;
109110

110111
typedef struct {
@@ -266,8 +267,6 @@ static inline bool trace_mode_intel()
266267
void trace_show(trace_group_t *group);
267268
void init_trace_group();
268269
trace_group_t *search_trace_group(char *name);
269-
int trace_enable(char *name);
270-
int trace_group_enable(char *name);
271270
int trace_prepare();
272271
int trace_bpf_load_and_attach();
273272
int trace_poll();

0 commit comments

Comments
 (0)