@@ -204,6 +204,8 @@ static void trace_events_free(struct trace_events *events)
204204
205205 tevent = tevent -> next ;
206206
207+ if (free_event -> trigger )
208+ free (free_event -> trigger );
207209 free (free_event -> system );
208210 free (free_event );
209211 }
@@ -235,6 +237,48 @@ struct trace_events *trace_event_alloc(const char *event_string)
235237 return tevent ;
236238}
237239
240+ /*
241+ * trace_event_add_trigger - record an event trigger action
242+ */
243+ int trace_event_add_trigger (struct trace_events * event , char * trigger )
244+ {
245+ if (event -> trigger )
246+ free (event -> trigger );
247+
248+ event -> trigger = strdup (trigger );
249+ if (!event -> trigger )
250+ return 1 ;
251+
252+ return 0 ;
253+ }
254+
255+ /*
256+ * trace_event_disable_trigger - disable an event trigger
257+ */
258+ static void trace_event_disable_trigger (struct trace_instance * instance ,
259+ struct trace_events * tevent )
260+ {
261+ char trigger [1024 ];
262+ int retval ;
263+
264+ if (!tevent -> trigger )
265+ return ;
266+
267+ if (!tevent -> trigger_enabled )
268+ return ;
269+
270+ debug_msg ("Disabling %s:%s trigger %s\n" , tevent -> system ,
271+ tevent -> event ? : "*" , tevent -> trigger );
272+
273+ snprintf (trigger , 1024 , "!%s\n" , tevent -> trigger );
274+
275+ retval = tracefs_event_file_write (instance -> inst , tevent -> system ,
276+ tevent -> event , "trigger" , trigger );
277+ if (retval < 0 )
278+ err_msg ("Error disabling %s:%s trigger %s\n" , tevent -> system ,
279+ tevent -> event ? : "*" , tevent -> trigger );
280+ }
281+
238282/*
239283 * trace_events_disable - disable all trace events
240284 */
@@ -248,14 +292,52 @@ void trace_events_disable(struct trace_instance *instance,
248292
249293 while (tevent ) {
250294 debug_msg ("Disabling event %s:%s\n" , tevent -> system , tevent -> event ? : "*" );
251- if (tevent -> enabled )
295+ if (tevent -> enabled ) {
296+ trace_event_disable_trigger (instance , tevent );
252297 tracefs_event_disable (instance -> inst , tevent -> system , tevent -> event );
298+ }
253299
254300 tevent -> enabled = 0 ;
255301 tevent = tevent -> next ;
256302 }
257303}
258304
305+ /*
306+ * trace_event_enable_trigger - enable an event trigger associated with an event
307+ */
308+ static int trace_event_enable_trigger (struct trace_instance * instance ,
309+ struct trace_events * tevent )
310+ {
311+ char trigger [1024 ];
312+ int retval ;
313+
314+ if (!tevent -> trigger )
315+ return 0 ;
316+
317+ if (!tevent -> event ) {
318+ err_msg ("Trigger %s applies only for single events, not for all %s:* events\n" ,
319+ tevent -> trigger , tevent -> system );
320+ return 1 ;
321+ }
322+
323+ snprintf (trigger , 1024 , "%s\n" , tevent -> trigger );
324+
325+ debug_msg ("Enabling %s:%s trigger %s\n" , tevent -> system ,
326+ tevent -> event ? : "*" , tevent -> trigger );
327+
328+ retval = tracefs_event_file_write (instance -> inst , tevent -> system ,
329+ tevent -> event , "trigger" , trigger );
330+ if (retval < 0 ) {
331+ err_msg ("Error enabling %s:%s trigger %s\n" , tevent -> system ,
332+ tevent -> event ? : "*" , tevent -> trigger );
333+ return 1 ;
334+ }
335+
336+ tevent -> trigger_enabled = 1 ;
337+
338+ return 0 ;
339+ }
340+
259341/*
260342 * trace_events_enable - enable all events
261343 */
@@ -275,6 +357,10 @@ int trace_events_enable(struct trace_instance *instance,
275357 }
276358
277359
360+ retval = trace_event_enable_trigger (instance , tevent );
361+ if (retval )
362+ return 1 ;
363+
278364 tevent -> enabled = 1 ;
279365 tevent = tevent -> next ;
280366 }
0 commit comments