@@ -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
180208bool 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 )
0 commit comments