Hi Steve,

On Tue, 2025-11-18 at 22:10 -0500, Steven Rostedt wrote:
> From: Steven Rostedt <[email protected]>
> 
> The struct event_command has a callback function called get_trigger_ops().
> This callback returns the "trigger_ops" to use for the trigger. These ops
> define the trigger function, how to init the trigger, how to print the
> trigger and how to free it.
> 
> The only reason there's a callback function to get these ops is because
> some triggers have two types of operations. One is an "always on"
> operation, and the other is a "count down" operation. If a user passes in
> a parameter to say how many times the trigger should execute. For example:
> 
>   echo stacktrace:5 > events/kmem/kmem_cache_alloc/trigger
> 
> It will trigger the stacktrace for the first 5 times the kmem_cache_alloc
> event is hit.
> 
> Instead of having two different trigger_ops since the only difference
> between them is the tigger itself (the print, init and free functions are
> all the same), just use a single ops that the event_command points to and
> add a function field to the trigger_ops to have a count_func.
> 
> When a trigger is added to an event, if there's a count attached to it and
> the trigger ops has the count_func field, the data allocated to represent
> this trigger will have a new flag set called COUNT.
> 
> Then when the trigger executes, it will check if the COUNT data flag is
> set, and if so, it will call the ops count_func(). If that returns false,
> it returns without executing the trigger.
> 
> This removes the need for duplicate event_trigger_ops structures.
> 
> Signed-off-by: Steven Rostedt (Google) <[email protected]>

Very nice cleanup, thanks!

Reviewed-by: Tom Zanussi <[email protected]>

> ---
>  kernel/trace/trace.h                |  26 ++-
>  kernel/trace/trace_eprobe.c         |   8 +-
>  kernel/trace/trace_events_hist.c    |  60 +------
>  kernel/trace/trace_events_trigger.c | 257 ++++++++++------------------
>  4 files changed, 116 insertions(+), 235 deletions(-)
> 
> diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
> index 58be6d741d72..036019ffc407 100644
> --- a/kernel/trace/trace.h
> +++ b/kernel/trace/trace.h
> @@ -1791,6 +1791,7 @@ extern void clear_event_triggers(struct trace_array 
> *tr);
>  
>  enum {
>       EVENT_TRIGGER_FL_PROBE          = BIT(0),
> +     EVENT_TRIGGER_FL_COUNT          = BIT(1),
>  };
>  
>  struct event_trigger_data {
> @@ -1822,6 +1823,10 @@ struct enable_trigger_data {
>       bool                            hist;
>  };
>  
> +bool event_trigger_count(struct event_trigger_data *data,
> +                      struct trace_buffer *buffer,  void *rec,
> +                      struct ring_buffer_event *event);
> +
>  extern int event_enable_trigger_print(struct seq_file *m,
>                                     struct event_trigger_data *data);
>  extern void event_enable_trigger_free(struct event_trigger_data *data);
> @@ -1909,6 +1914,11 @@ extern void event_file_put(struct trace_event_file 
> *file);
>   *   registered the trigger (see struct event_command) along with
>   *   the trace record, rec.
>   *
> + * @count_func: If defined and a numeric parameter is passed to the
> + *   trigger, then this function will be called before @trigger
> + *   is called. If this function returns false, then @trigger is not
> + *   executed.
> + *
>   * @init: An optional initialization function called for the trigger
>   *   when the trigger is registered (via the event_command reg()
>   *   function).  This can be used to perform per-trigger
> @@ -1936,6 +1946,10 @@ struct event_trigger_ops {
>                                          struct trace_buffer *buffer,
>                                          void *rec,
>                                          struct ring_buffer_event *rbe);
> +     bool                    (*count_func)(struct event_trigger_data *data,
> +                                           struct trace_buffer *buffer,
> +                                           void *rec,
> +                                           struct ring_buffer_event *rbe);
>       int                     (*init)(struct event_trigger_data *data);
>       void                    (*free)(struct event_trigger_data *data);
>       int                     (*print)(struct seq_file *m,
> @@ -1962,6 +1976,9 @@ struct event_trigger_ops {
>   * @name: The unique name that identifies the event command.  This is
>   *   the name used when setting triggers via trigger files.
>   *
> + * @trigger_ops: The event_trigger_ops implementation associated with
> + *   the command.
> + *
>   * @trigger_type: A unique id that identifies the event command
>   *   'type'.  This value has two purposes, the first to ensure that
>   *   only one trigger of the same type can be set at a given time
> @@ -2013,17 +2030,11 @@ struct event_trigger_ops {
>   *   event command, filters set by the user for the command will be
>   *   ignored.  This is usually implemented by the generic utility
>   *   function @set_trigger_filter() (see trace_event_triggers.c).
> - *
> - * @get_trigger_ops: The callback function invoked to retrieve the
> - *   event_trigger_ops implementation associated with the command.
> - *   This callback function allows a single event_command to
> - *   support multiple trigger implementations via different sets of
> - *   event_trigger_ops, depending on the value of the @param
> - *   string.
>   */
>  struct event_command {
>       struct list_head        list;
>       char                    *name;
> +     const struct event_trigger_ops *trigger_ops;
>       enum event_trigger_type trigger_type;
>       int                     flags;
>       int                     (*parse)(struct event_command *cmd_ops,
> @@ -2040,7 +2051,6 @@ struct event_command {
>       int                     (*set_filter)(char *filter_str,
>                                             struct event_trigger_data *data,
>                                             struct trace_event_file *file);
> -     const struct event_trigger_ops *(*get_trigger_ops)(char *cmd, char 
> *param);
>  };
>  
>  /**
> diff --git a/kernel/trace/trace_eprobe.c b/kernel/trace/trace_eprobe.c
> index a1d402124836..14ae896dbe75 100644
> --- a/kernel/trace/trace_eprobe.c
> +++ b/kernel/trace/trace_eprobe.c
> @@ -513,21 +513,15 @@ static void eprobe_trigger_unreg_func(char *glob,
>  
>  }
>  
> -static const struct event_trigger_ops *eprobe_trigger_get_ops(char *cmd,
> -                                                           char *param)
> -{
> -     return &eprobe_trigger_ops;
> -}
> -
>  static struct event_command event_trigger_cmd = {
>       .name                   = "eprobe",
>       .trigger_type           = ETT_EVENT_EPROBE,
>       .flags                  = EVENT_CMD_FL_NEEDS_REC,
> +     .trigger_ops            = &eprobe_trigger_ops,
>       .parse                  = eprobe_trigger_cmd_parse,
>       .reg                    = eprobe_trigger_reg_func,
>       .unreg                  = eprobe_trigger_unreg_func,
>       .unreg_all              = NULL,
> -     .get_trigger_ops        = eprobe_trigger_get_ops,
>       .set_filter             = NULL,
>  };
>  
> diff --git a/kernel/trace/trace_events_hist.c 
> b/kernel/trace/trace_events_hist.c
> index 1d536219b624..f9cc8d6a215b 100644
> --- a/kernel/trace/trace_events_hist.c
> +++ b/kernel/trace/trace_events_hist.c
> @@ -6363,12 +6363,6 @@ static const struct event_trigger_ops 
> event_hist_trigger_named_ops = {
>       .free                   = event_hist_trigger_named_free,
>  };
>  
> -static const struct event_trigger_ops *event_hist_get_trigger_ops(char *cmd,
> -                                                               char *param)
> -{
> -     return &event_hist_trigger_ops;
> -}
> -
>  static void hist_clear(struct event_trigger_data *data)
>  {
>       struct hist_trigger_data *hist_data = data->private_data;
> @@ -6908,11 +6902,11 @@ static struct event_command trigger_hist_cmd = {
>       .name                   = "hist",
>       .trigger_type           = ETT_EVENT_HIST,
>       .flags                  = EVENT_CMD_FL_NEEDS_REC,
> +     .trigger_ops            = &event_hist_trigger_ops,
>       .parse                  = event_hist_trigger_parse,
>       .reg                    = hist_register_trigger,
>       .unreg                  = hist_unregister_trigger,
>       .unreg_all              = hist_unreg_all,
> -     .get_trigger_ops        = event_hist_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  
> @@ -6945,29 +6939,9 @@ hist_enable_trigger(struct event_trigger_data *data,
>       }
>  }
>  
> -static void
> -hist_enable_count_trigger(struct event_trigger_data *data,
> -                       struct trace_buffer *buffer,  void *rec,
> -                       struct ring_buffer_event *event)
> -{
> -     if (!data->count)
> -             return;
> -
> -     if (data->count != -1)
> -             (data->count)--;
> -
> -     hist_enable_trigger(data, buffer, rec, event);
> -}
> -
>  static const struct event_trigger_ops hist_enable_trigger_ops = {
>       .trigger                = hist_enable_trigger,
> -     .print                  = event_enable_trigger_print,
> -     .init                   = event_trigger_init,
> -     .free                   = event_enable_trigger_free,
> -};
> -
> -static const struct event_trigger_ops hist_enable_count_trigger_ops = {
> -     .trigger                = hist_enable_count_trigger,
> +     .count_func             = event_trigger_count,
>       .print                  = event_enable_trigger_print,
>       .init                   = event_trigger_init,
>       .free                   = event_enable_trigger_free,
> @@ -6975,36 +6949,12 @@ static const struct event_trigger_ops 
> hist_enable_count_trigger_ops = {
>  
>  static const struct event_trigger_ops hist_disable_trigger_ops = {
>       .trigger                = hist_enable_trigger,
> +     .count_func             = event_trigger_count,
>       .print                  = event_enable_trigger_print,
>       .init                   = event_trigger_init,
>       .free                   = event_enable_trigger_free,
>  };
>  
> -static const struct event_trigger_ops hist_disable_count_trigger_ops = {
> -     .trigger                = hist_enable_count_trigger,
> -     .print                  = event_enable_trigger_print,
> -     .init                   = event_trigger_init,
> -     .free                   = event_enable_trigger_free,
> -};
> -
> -static const struct event_trigger_ops *
> -hist_enable_get_trigger_ops(char *cmd, char *param)
> -{
> -     const struct event_trigger_ops *ops;
> -     bool enable;
> -
> -     enable = (strcmp(cmd, ENABLE_HIST_STR) == 0);
> -
> -     if (enable)
> -             ops = param ? &hist_enable_count_trigger_ops :
> -                     &hist_enable_trigger_ops;
> -     else
> -             ops = param ? &hist_disable_count_trigger_ops :
> -                     &hist_disable_trigger_ops;
> -
> -     return ops;
> -}
> -
>  static void hist_enable_unreg_all(struct trace_event_file *file)
>  {
>       struct event_trigger_data *test, *n;
> @@ -7023,22 +6973,22 @@ static void hist_enable_unreg_all(struct 
> trace_event_file *file)
>  static struct event_command trigger_hist_enable_cmd = {
>       .name                   = ENABLE_HIST_STR,
>       .trigger_type           = ETT_HIST_ENABLE,
> +     .trigger_ops            = &hist_enable_trigger_ops,
>       .parse                  = event_enable_trigger_parse,
>       .reg                    = event_enable_register_trigger,
>       .unreg                  = event_enable_unregister_trigger,
>       .unreg_all              = hist_enable_unreg_all,
> -     .get_trigger_ops        = hist_enable_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  
>  static struct event_command trigger_hist_disable_cmd = {
>       .name                   = DISABLE_HIST_STR,
>       .trigger_type           = ETT_HIST_ENABLE,
> +     .trigger_ops            = &hist_disable_trigger_ops,
>       .parse                  = event_enable_trigger_parse,
>       .reg                    = event_enable_register_trigger,
>       .unreg                  = event_enable_unregister_trigger,
>       .unreg_all              = hist_enable_unreg_all,
> -     .get_trigger_ops        = hist_enable_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  
> diff --git a/kernel/trace/trace_events_trigger.c 
> b/kernel/trace/trace_events_trigger.c
> index cbfc306c0159..576bad18bcdb 100644
> --- a/kernel/trace/trace_events_trigger.c
> +++ b/kernel/trace/trace_events_trigger.c
> @@ -28,6 +28,20 @@ void trigger_data_free(struct event_trigger_data *data)
>       kfree(data);
>  }
>  
> +static inline void data_ops_trigger(struct event_trigger_data *data,
> +                                 struct trace_buffer *buffer,  void *rec,
> +                                 struct ring_buffer_event *event)
> +{
> +     const struct event_trigger_ops *ops = data->ops;
> +
> +     if (data->flags & EVENT_TRIGGER_FL_COUNT) {
> +             if (!ops->count_func(data, buffer, rec, event))
> +                     return;
> +     }
> +
> +     ops->trigger(data, buffer, rec, event);
> +}
> +
>  /**
>   * event_triggers_call - Call triggers associated with a trace event
>   * @file: The trace_event_file associated with the event
> @@ -70,7 +84,7 @@ event_triggers_call(struct trace_event_file *file,
>               if (data->paused)
>                       continue;
>               if (!rec) {
> -                     data->ops->trigger(data, buffer, rec, event);
> +                     data_ops_trigger(data, buffer, rec, event);
>                       continue;
>               }
>               filter = rcu_dereference_sched(data->filter);
> @@ -80,7 +94,7 @@ event_triggers_call(struct trace_event_file *file,
>                       tt |= data->cmd_ops->trigger_type;
>                       continue;
>               }
> -             data->ops->trigger(data, buffer, rec, event);
> +             data_ops_trigger(data, buffer, rec, event);
>       }
>       return tt;
>  }
> @@ -122,7 +136,7 @@ event_triggers_post_call(struct trace_event_file *file,
>               if (data->paused)
>                       continue;
>               if (data->cmd_ops->trigger_type & tt)
> -                     data->ops->trigger(data, NULL, NULL, NULL);
> +                     data_ops_trigger(data, NULL, NULL, NULL);
>       }
>  }
>  EXPORT_SYMBOL_GPL(event_triggers_post_call);
> @@ -377,6 +391,36 @@ __init int unregister_event_command(struct event_command 
> *cmd)
>       return -ENODEV;
>  }
>  
> +/**
> + * event_trigger_count - Optional count function for event triggers
> + * @data: Trigger-specific data
> + * @buffer: The ring buffer that the event is being written to
> + * @rec: The trace entry for the event, NULL for unconditional invocation
> + * @event: The event meta data in the ring buffer
> + *
> + * For triggers that can take a count parameter that doesn't do anything
> + * special, they can use this function to assign to their .count_func
> + * field.
> + *
> + * This simply does a count down of the @data->count field.
> + *
> + * If the @data->count is greater than zero, it will decrement it.
> + *
> + * Returns false if @data->count is zero, otherwise true.
> + */
> +bool event_trigger_count(struct event_trigger_data *data,
> +                      struct trace_buffer *buffer,  void *rec,
> +                      struct ring_buffer_event *event)
> +{
> +     if (!data->count)
> +             return false;
> +
> +     if (data->count != -1)
> +             (data->count)--;
> +
> +     return true;
> +}
> +
>  /**
>   * event_trigger_print - Generic event_trigger_ops @print implementation
>   * @name: The name of the event trigger
> @@ -807,9 +851,13 @@ int event_trigger_separate_filter(char 
> *param_and_filter, char **param,
>   * @private_data: User data to associate with the event trigger
>   *
>   * Allocate an event_trigger_data instance and initialize it.  The
> - * @cmd_ops are used along with the @cmd and @param to get the
> - * trigger_ops to assign to the event_trigger_data.  @private_data can
> - * also be passed in and associated with the event_trigger_data.
> + * @cmd_ops defines how the trigger will operate. If @param is set,
> + * and @cmd_ops->trigger_ops->count_func is non NULL, then the
> + * data->count is set to @param and before the trigger is executed, the
> + * @cmd_ops->trigger_ops->count_func() is called. If that function returns
> + * false, the @cmd_ops->trigger_ops->trigger() function will not be called.
> + * @private_data can also be passed in and associated with the
> + * event_trigger_data.
>   *
>   * Use trigger_data_free() to free an event_trigger_data object.
>   *
> @@ -821,18 +869,17 @@ struct event_trigger_data *trigger_data_alloc(struct 
> event_command *cmd_ops,
>                                             void *private_data)
>  {
>       struct event_trigger_data *trigger_data;
> -     const struct event_trigger_ops *trigger_ops;
> -
> -     trigger_ops = cmd_ops->get_trigger_ops(cmd, param);
>  
>       trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
>       if (!trigger_data)
>               return NULL;
>  
>       trigger_data->count = -1;
> -     trigger_data->ops = trigger_ops;
> +     trigger_data->ops = cmd_ops->trigger_ops;
>       trigger_data->cmd_ops = cmd_ops;
>       trigger_data->private_data = private_data;
> +     if (param && cmd_ops->trigger_ops->count_func)
> +             trigger_data->flags |= EVENT_TRIGGER_FL_COUNT;
>  
>       INIT_LIST_HEAD(&trigger_data->list);
>       INIT_LIST_HEAD(&trigger_data->named_list);
> @@ -1271,31 +1318,28 @@ traceon_trigger(struct event_trigger_data *data,
>       tracing_on();
>  }
>  
> -static void
> -traceon_count_trigger(struct event_trigger_data *data,
> -                   struct trace_buffer *buffer, void *rec,
> -                   struct ring_buffer_event *event)
> +static bool
> +traceon_count_func(struct event_trigger_data *data,
> +                struct trace_buffer *buffer, void *rec,
> +                struct ring_buffer_event *event)
>  {
>       struct trace_event_file *file = data->private_data;
>  
>       if (file) {
>               if (tracer_tracing_is_on(file->tr))
> -                     return;
> +                     return false;
>       } else {
>               if (tracing_is_on())
> -                     return;
> +                     return false;
>       }
>  
>       if (!data->count)
> -             return;
> +             return false;
>  
>       if (data->count != -1)
>               (data->count)--;
>  
> -     if (file)
> -             tracer_tracing_on(file->tr);
> -     else
> -             tracing_on();
> +     return true;
>  }
>  
>  static void
> @@ -1319,31 +1363,28 @@ traceoff_trigger(struct event_trigger_data *data,
>       tracing_off();
>  }
>  
> -static void
> -traceoff_count_trigger(struct event_trigger_data *data,
> -                    struct trace_buffer *buffer, void *rec,
> -                    struct ring_buffer_event *event)
> +static bool
> +traceoff_count_func(struct event_trigger_data *data,
> +                 struct trace_buffer *buffer, void *rec,
> +                 struct ring_buffer_event *event)
>  {
>       struct trace_event_file *file = data->private_data;
>  
>       if (file) {
>               if (!tracer_tracing_is_on(file->tr))
> -                     return;
> +                     return false;
>       } else {
>               if (!tracing_is_on())
> -                     return;
> +                     return false;
>       }
>  
>       if (!data->count)
> -             return;
> +             return false;
>  
>       if (data->count != -1)
>               (data->count)--;
>  
> -     if (file)
> -             tracer_tracing_off(file->tr);
> -     else
> -             tracing_off();
> +     return true;
>  }
>  
>  static int
> @@ -1362,13 +1403,7 @@ traceoff_trigger_print(struct seq_file *m, struct 
> event_trigger_data *data)
>  
>  static const struct event_trigger_ops traceon_trigger_ops = {
>       .trigger                = traceon_trigger,
> -     .print                  = traceon_trigger_print,
> -     .init                   = event_trigger_init,
> -     .free                   = event_trigger_free,
> -};
> -
> -static const struct event_trigger_ops traceon_count_trigger_ops = {
> -     .trigger                = traceon_count_trigger,
> +     .count_func             = traceon_count_func,
>       .print                  = traceon_trigger_print,
>       .init                   = event_trigger_init,
>       .free                   = event_trigger_free,
> @@ -1376,41 +1411,19 @@ static const struct event_trigger_ops 
> traceon_count_trigger_ops = {
>  
>  static const struct event_trigger_ops traceoff_trigger_ops = {
>       .trigger                = traceoff_trigger,
> +     .count_func             = traceoff_count_func,
>       .print                  = traceoff_trigger_print,
>       .init                   = event_trigger_init,
>       .free                   = event_trigger_free,
>  };
>  
> -static const struct event_trigger_ops traceoff_count_trigger_ops = {
> -     .trigger                = traceoff_count_trigger,
> -     .print                  = traceoff_trigger_print,
> -     .init                   = event_trigger_init,
> -     .free                   = event_trigger_free,
> -};
> -
> -static const struct event_trigger_ops *
> -onoff_get_trigger_ops(char *cmd, char *param)
> -{
> -     const struct event_trigger_ops *ops;
> -
> -     /* we register both traceon and traceoff to this callback */
> -     if (strcmp(cmd, "traceon") == 0)
> -             ops = param ? &traceon_count_trigger_ops :
> -                     &traceon_trigger_ops;
> -     else
> -             ops = param ? &traceoff_count_trigger_ops :
> -                     &traceoff_trigger_ops;
> -
> -     return ops;
> -}
> -
>  static struct event_command trigger_traceon_cmd = {
>       .name                   = "traceon",
>       .trigger_type           = ETT_TRACE_ONOFF,
> +     .trigger_ops            = &traceon_trigger_ops,
>       .parse                  = event_trigger_parse,
>       .reg                    = register_trigger,
>       .unreg                  = unregister_trigger,
> -     .get_trigger_ops        = onoff_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  
> @@ -1418,10 +1431,10 @@ static struct event_command trigger_traceoff_cmd = {
>       .name                   = "traceoff",
>       .trigger_type           = ETT_TRACE_ONOFF,
>       .flags                  = EVENT_CMD_FL_POST_TRIGGER,
> +     .trigger_ops            = &traceoff_trigger_ops,
>       .parse                  = event_trigger_parse,
>       .reg                    = register_trigger,
>       .unreg                  = unregister_trigger,
> -     .get_trigger_ops        = onoff_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  
> @@ -1439,20 +1452,6 @@ snapshot_trigger(struct event_trigger_data *data,
>               tracing_snapshot();
>  }
>  
> -static void
> -snapshot_count_trigger(struct event_trigger_data *data,
> -                    struct trace_buffer *buffer, void *rec,
> -                    struct ring_buffer_event *event)
> -{
> -     if (!data->count)
> -             return;
> -
> -     if (data->count != -1)
> -             (data->count)--;
> -
> -     snapshot_trigger(data, buffer, rec, event);
> -}
> -
>  static int
>  register_snapshot_trigger(char *glob,
>                         struct event_trigger_data *data,
> @@ -1486,31 +1485,19 @@ snapshot_trigger_print(struct seq_file *m, struct 
> event_trigger_data *data)
>  
>  static const struct event_trigger_ops snapshot_trigger_ops = {
>       .trigger                = snapshot_trigger,
> +     .count_func             = event_trigger_count,
>       .print                  = snapshot_trigger_print,
>       .init                   = event_trigger_init,
>       .free                   = event_trigger_free,
>  };
>  
> -static const struct event_trigger_ops snapshot_count_trigger_ops = {
> -     .trigger                = snapshot_count_trigger,
> -     .print                  = snapshot_trigger_print,
> -     .init                   = event_trigger_init,
> -     .free                   = event_trigger_free,
> -};
> -
> -static const struct event_trigger_ops *
> -snapshot_get_trigger_ops(char *cmd, char *param)
> -{
> -     return param ? &snapshot_count_trigger_ops : &snapshot_trigger_ops;
> -}
> -
>  static struct event_command trigger_snapshot_cmd = {
>       .name                   = "snapshot",
>       .trigger_type           = ETT_SNAPSHOT,
> +     .trigger_ops            = &snapshot_trigger_ops,
>       .parse                  = event_trigger_parse,
>       .reg                    = register_snapshot_trigger,
>       .unreg                  = unregister_snapshot_trigger,
> -     .get_trigger_ops        = snapshot_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  
> @@ -1558,20 +1545,6 @@ stacktrace_trigger(struct event_trigger_data *data,
>               trace_dump_stack(STACK_SKIP);
>  }
>  
> -static void
> -stacktrace_count_trigger(struct event_trigger_data *data,
> -                      struct trace_buffer *buffer, void *rec,
> -                      struct ring_buffer_event *event)
> -{
> -     if (!data->count)
> -             return;
> -
> -     if (data->count != -1)
> -             (data->count)--;
> -
> -     stacktrace_trigger(data, buffer, rec, event);
> -}
> -
>  static int
>  stacktrace_trigger_print(struct seq_file *m, struct event_trigger_data *data)
>  {
> @@ -1581,32 +1554,20 @@ stacktrace_trigger_print(struct seq_file *m, struct 
> event_trigger_data *data)
>  
>  static const struct event_trigger_ops stacktrace_trigger_ops = {
>       .trigger                = stacktrace_trigger,
> +     .count_func             = event_trigger_count,
>       .print                  = stacktrace_trigger_print,
>       .init                   = event_trigger_init,
>       .free                   = event_trigger_free,
>  };
>  
> -static const struct event_trigger_ops stacktrace_count_trigger_ops = {
> -     .trigger                = stacktrace_count_trigger,
> -     .print                  = stacktrace_trigger_print,
> -     .init                   = event_trigger_init,
> -     .free                   = event_trigger_free,
> -};
> -
> -static const struct event_trigger_ops *
> -stacktrace_get_trigger_ops(char *cmd, char *param)
> -{
> -     return param ? &stacktrace_count_trigger_ops : &stacktrace_trigger_ops;
> -}
> -
>  static struct event_command trigger_stacktrace_cmd = {
>       .name                   = "stacktrace",
>       .trigger_type           = ETT_STACKTRACE,
> +     .trigger_ops            = &stacktrace_trigger_ops,
>       .flags                  = EVENT_CMD_FL_POST_TRIGGER,
>       .parse                  = event_trigger_parse,
>       .reg                    = register_trigger,
>       .unreg                  = unregister_trigger,
> -     .get_trigger_ops        = stacktrace_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  
> @@ -1642,24 +1603,24 @@ event_enable_trigger(struct event_trigger_data *data,
>               set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, 
> &enable_data->file->flags);
>  }
>  
> -static void
> -event_enable_count_trigger(struct event_trigger_data *data,
> -                        struct trace_buffer *buffer,  void *rec,
> -                        struct ring_buffer_event *event)
> +static bool
> +event_enable_count_func(struct event_trigger_data *data,
> +                     struct trace_buffer *buffer,  void *rec,
> +                     struct ring_buffer_event *event)
>  {
>       struct enable_trigger_data *enable_data = data->private_data;
>  
>       if (!data->count)
> -             return;
> +             return false;
>  
>       /* Skip if the event is in a state we want to switch to */
>       if (enable_data->enable == !(enable_data->file->flags & 
> EVENT_FILE_FL_SOFT_DISABLED))
> -             return;
> +             return false;
>  
>       if (data->count != -1)
>               (data->count)--;
>  
> -     event_enable_trigger(data, buffer, rec, event);
> +     return true;
>  }
>  
>  int event_enable_trigger_print(struct seq_file *m,
> @@ -1706,13 +1667,7 @@ void event_enable_trigger_free(struct 
> event_trigger_data *data)
>  
>  static const struct event_trigger_ops event_enable_trigger_ops = {
>       .trigger                = event_enable_trigger,
> -     .print                  = event_enable_trigger_print,
> -     .init                   = event_trigger_init,
> -     .free                   = event_enable_trigger_free,
> -};
> -
> -static const struct event_trigger_ops event_enable_count_trigger_ops = {
> -     .trigger                = event_enable_count_trigger,
> +     .count_func             = event_enable_count_func,
>       .print                  = event_enable_trigger_print,
>       .init                   = event_trigger_init,
>       .free                   = event_enable_trigger_free,
> @@ -1720,13 +1675,7 @@ static const struct event_trigger_ops 
> event_enable_count_trigger_ops = {
>  
>  static const struct event_trigger_ops event_disable_trigger_ops = {
>       .trigger                = event_enable_trigger,
> -     .print                  = event_enable_trigger_print,
> -     .init                   = event_trigger_init,
> -     .free                   = event_enable_trigger_free,
> -};
> -
> -static const struct event_trigger_ops event_disable_count_trigger_ops = {
> -     .trigger                = event_enable_count_trigger,
> +     .count_func             = event_enable_count_func,
>       .print                  = event_enable_trigger_print,
>       .init                   = event_trigger_init,
>       .free                   = event_enable_trigger_free,
> @@ -1906,45 +1855,23 @@ void event_enable_unregister_trigger(char *glob,
>               data->ops->free(data);
>  }
>  
> -static const struct event_trigger_ops *
> -event_enable_get_trigger_ops(char *cmd, char *param)
> -{
> -     const struct event_trigger_ops *ops;
> -     bool enable;
> -
> -#ifdef CONFIG_HIST_TRIGGERS
> -     enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) ||
> -               (strcmp(cmd, ENABLE_HIST_STR) == 0));
> -#else
> -     enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
> -#endif
> -     if (enable)
> -             ops = param ? &event_enable_count_trigger_ops :
> -                     &event_enable_trigger_ops;
> -     else
> -             ops = param ? &event_disable_count_trigger_ops :
> -                     &event_disable_trigger_ops;
> -
> -     return ops;
> -}
> -
>  static struct event_command trigger_enable_cmd = {
>       .name                   = ENABLE_EVENT_STR,
>       .trigger_type           = ETT_EVENT_ENABLE,
> +     .trigger_ops            = &event_enable_trigger_ops,
>       .parse                  = event_enable_trigger_parse,
>       .reg                    = event_enable_register_trigger,
>       .unreg                  = event_enable_unregister_trigger,
> -     .get_trigger_ops        = event_enable_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  
>  static struct event_command trigger_disable_cmd = {
>       .name                   = DISABLE_EVENT_STR,
>       .trigger_type           = ETT_EVENT_ENABLE,
> +     .trigger_ops            = &event_disable_trigger_ops,
>       .parse                  = event_enable_trigger_parse,
>       .reg                    = event_enable_register_trigger,
>       .unreg                  = event_enable_unregister_trigger,
> -     .get_trigger_ops        = event_enable_get_trigger_ops,
>       .set_filter             = set_trigger_filter,
>  };
>  


Reply via email to