Skip to content

Commit 7c7b722

Browse files
committed
nettrace: make trace is able to be in multi group
Signed-off-by: Menglong Dong <imagedong@tencent.com>
1 parent e3db531 commit 7c7b722

3 files changed

Lines changed: 53 additions & 10 deletions

File tree

src/gen_trace.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ def gen_name(name, is_trace=False):
101101

102102

103103
btf_data = None
104+
105+
104106
def get_arg_count(name):
105107
global btf_data
106108
if not btf_data:
@@ -155,6 +157,7 @@ def append_trace_field(field, trace, type='string'):
155157
return f'\n\t.{field} = {trace[field]},'
156158
return ''
157159

160+
158161
def append_filed(field, value, type='string'):
159162
if type == 'string':
160163
return f'\n\t.{field} = "{value}",'
@@ -166,7 +169,34 @@ def append_filed(field, value, type='string'):
166169
return ''
167170

168171

172+
def gen_trace_list(trace, p_name):
173+
name = trace['define_name']
174+
list_count = trace.get('list_count', 1)
175+
list_count += 1
176+
trace['list_count'] = list_count
177+
trace_name = 'trace_' + name
178+
trace_list = f'{trace_name}_list_{list_count}'
179+
define_str = f'''
180+
trace_list_t {trace_list} = {{
181+
\t.trace = &{trace_name},
182+
\t.list = LIST_HEAD_INIT({trace_list}.list)
183+
}};
184+
'''
185+
init_str = f'\tlist_add_tail(&{trace_list}.list, &{p_name}.traces);\n'
186+
187+
return {
188+
'define_str': define_str,
189+
'init_str': init_str,
190+
'probe_str': '',
191+
'index_str': ''
192+
}
193+
194+
169195
def gen_trace(trace, group, p_name):
196+
# trace is already defined, just define corresponding trace_list for it
197+
if 'define_name' in trace:
198+
return gen_trace_list(trace, p_name)
199+
170200
name = gen_name(trace["name"], True)
171201
trace_name = 'trace_' + name
172202
trace['define_name'] = name
@@ -197,7 +227,8 @@ def gen_trace(trace, group, p_name):
197227
else:
198228
arg_count = trace['arg_count']
199229
if not arg_count:
200-
print(f"BTF not found for {target}, skip monitor", file=sys.stderr)
230+
print(
231+
f"BTF not found for {target}, skip monitor", file=sys.stderr)
201232
trace['monitor'] = 0
202233
else:
203234
fields_str += append_trace_field('arg_count', trace, 'raw')
@@ -244,12 +275,16 @@ def gen_trace(trace, group, p_name):
244275
\t.prog = "__trace_{name}",
245276
\t.parent = &{p_name},
246277
\t.sk = {sk_index},
247-
\t.rules = LIST_HEAD_INIT({trace_name}.rules),
278+
\t.rules = LIST_HEAD_INIT({trace_name}.rules),
279+
}};
280+
trace_list_t {trace_name}_list = {{
281+
\t.trace = &{trace_name},
282+
\t.list = LIST_HEAD_INIT({trace_name}_list.list)
248283
}};
249284
{rule_str}
250285
'''
251286

252-
init_str += f'''\tlist_add_tail(&{trace_name}.list, &{p_name}.traces);
287+
init_str += f'''\tlist_add_tail(&{trace_name}_list.list, &{p_name}.traces);
253288
\tall_traces[INDEX_{name}] = &{trace_name};
254289
\tlist_add_tail(&{trace_name}.all, &trace_list);
255290
'''

src/trace.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ trace_ops_t *trace_ops_all[] = { &tracing_ops, &probe_ops };
2424

2525
static bool trace_group_valid(trace_group_t *group)
2626
{
27+
trace_list_t *trace_list;
2728
trace_group_t *pos;
28-
trace_t *trace;
2929

3030
if (!list_empty(&group->traces)) {
31-
list_for_each_entry(trace, &group->traces, list)
32-
if (!trace_is_invalid(trace))
31+
list_for_each_entry(trace_list, &group->traces, list)
32+
if (!trace_is_invalid(trace_list->trace))
3333
return true;
3434
return false;
3535
}
@@ -45,8 +45,10 @@ static bool trace_group_valid(trace_group_t *group)
4545
static void __print_trace_group(trace_group_t *group, int level)
4646
{
4747
char prefix[32] = {}, buf[32], *name;
48+
trace_list_t *trace_list;
4849
trace_group_t *pos;
4950
trace_t *trace;
51+
u32 status;
5052
int i = 0;
5153

5254
for (; i< level; i++)
@@ -68,8 +70,9 @@ static void __print_trace_group(trace_group_t *group, int level)
6870

6971
return;
7072
print_trace:
71-
list_for_each_entry(trace, &group->traces, list) {
72-
u32 status = trace->status;
73+
list_for_each_entry(trace_list, &group->traces, list) {
74+
trace = trace_list->trace;
75+
status = trace->status;
7376

7477
#if 1
7578
if (trace_is_invalid(trace))
@@ -154,13 +157,13 @@ int trace_enable(char *name)
154157
static void _trace_group_enable(trace_group_t *group)
155158
{
156159
trace_group_t *pos;
157-
trace_t *t;
160+
trace_list_t *t;
158161

159162
list_for_each_entry(pos, &group->children, list)
160163
_trace_group_enable(pos);
161164

162165
list_for_each_entry(t, &group->traces, list)
163-
trace_set_enable(t);
166+
trace_set_enable(t->trace);
164167
}
165168

166169
/* enable all traces in the group of 'name' */

src/trace.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ typedef struct trace {
8383
bool def;
8484
} trace_t;
8585

86+
typedef struct {
87+
struct list_head list;
88+
trace_t * trace;
89+
} trace_list_t;
90+
8691
typedef struct trace_args {
8792
bool timeline;
8893
bool ret;

0 commit comments

Comments
 (0)