From nobody Mon Dec 1 22:04:03 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8069722FDEA for ; Fri, 28 Nov 2025 01:23:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764293002; cv=none; b=Att7TmBY+Dz41mYEAiNNd1vwP3ITlHAsV4R/VztC8bSPYAbSXl8ejlvogd5i8/YpCN73FsKes4u6oX9rHhKA9+Freg0xuiNub+Q5uW4ZqiWwJpVAv6pQ3pM+nOSbRb6X+N3IFC2OuEjvE7IbT73yveEiCT6XPSmdf006Kc1GaGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764293002; c=relaxed/simple; bh=Jm5RCOozgAQ+Rgd3IkB7A93KXTr2wZVW6QBNThRNNR0=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=G3cJBBb2ew0bZDMpojWlRuBMRE0PbnnrnELJ6rWZ3bRelrpQID5ZD2FPlJAEwnGlN16AMFtag7rgzfXKO5OKfPXNCl5zzUEPVYjAjJ6ITEd1u6E012gtwo22E+tWQzhu/5sVoeDsC+Fmq/CQTdD7fpeCCZJbDCjYdPlB0qRQAdg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UEnsiCGA; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UEnsiCGA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 35317C116C6; Fri, 28 Nov 2025 01:23:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764293002; bh=Jm5RCOozgAQ+Rgd3IkB7A93KXTr2wZVW6QBNThRNNR0=; h=Date:From:To:Cc:Subject:References:From; b=UEnsiCGA6oUatfukuyGV6qjC69tzp4nip1EoAa3grrLNivtgLNXO1A/pNrRiGrCF6 WX3Fa/b3lH2BJRhFEZRW5fcBz3SSgCIHHz9Mj8PI4gmrHAV1O3RAuXyOT9ZHxrqjQu YVDx67x4rDN6IISuQYU0XTEpivrd0/dc6nSjF6EPGA3vOmJcZ9wBAE2xQMKc1Mg4vD JH9W5/IltT9/lkHWCIBEXJDxlgfu9x0JyxVanEctiy4c8RUj8H9m73WBHlCn53DiGk TR73iEtahf/euGGSCndw3GZkQcsyvQ4TFz6SXpvf6aRg26fDaCkq6yHjXQ4KPUDa4v o7SJfNgVW+goA== Received: from rostedt by gandalf with local (Exim 4.98.2) (envelope-from ) id 1vOnDX-00000006gfl-3LCw; Thu, 27 Nov 2025 20:24:11 -0500 Message-ID: <20251128012411.644283122@kernel.org> User-Agent: quilt/0.68 Date: Thu, 27 Nov 2025 20:23:36 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Tom Zanussi Subject: [for-next][PATCH 05/13] tracing: Remove get_trigger_ops() and add count_func() from trigger ops References: <20251128012331.307010654@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Steven Rostedt 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. Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: Andrew Morton Link: https://patch.msgid.link/20251125200932.274566147@kernel.org Reviewed-by: Tom Zanussi Signed-off-by: Steven Rostedt (Google) --- 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 da5d9527ebd6..b9c59d9f9a0c 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1791,6 +1791,7 @@ extern void clear_event_triggers(struct trace_array *= tr); =20 enum { EVENT_TRIGGER_FL_PROBE =3D BIT(0), + EVENT_TRIGGER_FL_COUNT =3D BIT(1), }; =20 struct event_trigger_data { @@ -1822,6 +1823,10 @@ struct enable_trigger_data { bool hist; }; =20 +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= ); }; =20 /** 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, =20 } =20 -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 =3D { .name =3D "eprobe", .trigger_type =3D ETT_EVENT_EPROBE, .flags =3D EVENT_CMD_FL_NEEDS_REC, + .trigger_ops =3D &eprobe_trigger_ops, .parse =3D eprobe_trigger_cmd_parse, .reg =3D eprobe_trigger_reg_func, .unreg =3D eprobe_trigger_unreg_func, .unreg_all =3D NULL, - .get_trigger_ops =3D eprobe_trigger_get_ops, .set_filter =3D NULL, }; =20 diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.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_tri= gger_named_ops =3D { .free =3D event_hist_trigger_named_free, }; =20 -static const struct event_trigger_ops *event_hist_get_trigger_ops(char *cm= d, - char *param) -{ - return &event_hist_trigger_ops; -} - static void hist_clear(struct event_trigger_data *data) { struct hist_trigger_data *hist_data =3D data->private_data; @@ -6908,11 +6902,11 @@ static struct event_command trigger_hist_cmd =3D { .name =3D "hist", .trigger_type =3D ETT_EVENT_HIST, .flags =3D EVENT_CMD_FL_NEEDS_REC, + .trigger_ops =3D &event_hist_trigger_ops, .parse =3D event_hist_trigger_parse, .reg =3D hist_register_trigger, .unreg =3D hist_unregister_trigger, .unreg_all =3D hist_unreg_all, - .get_trigger_ops =3D event_hist_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 @@ -6945,29 +6939,9 @@ hist_enable_trigger(struct event_trigger_data *data, } } =20 -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 !=3D -1) - (data->count)--; - - hist_enable_trigger(data, buffer, rec, event); -} - static const struct event_trigger_ops hist_enable_trigger_ops =3D { .trigger =3D hist_enable_trigger, - .print =3D event_enable_trigger_print, - .init =3D event_trigger_init, - .free =3D event_enable_trigger_free, -}; - -static const struct event_trigger_ops hist_enable_count_trigger_ops =3D { - .trigger =3D hist_enable_count_trigger, + .count_func =3D event_trigger_count, .print =3D event_enable_trigger_print, .init =3D event_trigger_init, .free =3D event_enable_trigger_free, @@ -6975,36 +6949,12 @@ static const struct event_trigger_ops hist_enable_c= ount_trigger_ops =3D { =20 static const struct event_trigger_ops hist_disable_trigger_ops =3D { .trigger =3D hist_enable_trigger, + .count_func =3D event_trigger_count, .print =3D event_enable_trigger_print, .init =3D event_trigger_init, .free =3D event_enable_trigger_free, }; =20 -static const struct event_trigger_ops hist_disable_count_trigger_ops =3D { - .trigger =3D hist_enable_count_trigger, - .print =3D event_enable_trigger_print, - .init =3D event_trigger_init, - .free =3D 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 =3D (strcmp(cmd, ENABLE_HIST_STR) =3D=3D 0); - - if (enable) - ops =3D param ? &hist_enable_count_trigger_ops : - &hist_enable_trigger_ops; - else - ops =3D 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_even= t_file *file) static struct event_command trigger_hist_enable_cmd =3D { .name =3D ENABLE_HIST_STR, .trigger_type =3D ETT_HIST_ENABLE, + .trigger_ops =3D &hist_enable_trigger_ops, .parse =3D event_enable_trigger_parse, .reg =3D event_enable_register_trigger, .unreg =3D event_enable_unregister_trigger, .unreg_all =3D hist_enable_unreg_all, - .get_trigger_ops =3D hist_enable_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 static struct event_command trigger_hist_disable_cmd =3D { .name =3D DISABLE_HIST_STR, .trigger_type =3D ETT_HIST_ENABLE, + .trigger_ops =3D &hist_disable_trigger_ops, .parse =3D event_enable_trigger_parse, .reg =3D event_enable_register_trigger, .unreg =3D event_enable_unregister_trigger, .unreg_all =3D hist_enable_unreg_all, - .get_trigger_ops =3D hist_enable_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_event= s_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); } =20 +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 =3D 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 =3D rcu_dereference_sched(data->filter); @@ -80,7 +94,7 @@ event_triggers_call(struct trace_event_file *file, tt |=3D 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_comma= nd *cmd) return -ENODEV; } =20 +/** + * 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 !=3D -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_filt= er, 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 =3D cmd_ops->get_trigger_ops(cmd, param); =20 trigger_data =3D kzalloc(sizeof(*trigger_data), GFP_KERNEL); if (!trigger_data) return NULL; =20 trigger_data->count =3D -1; - trigger_data->ops =3D trigger_ops; + trigger_data->ops =3D cmd_ops->trigger_ops; trigger_data->cmd_ops =3D cmd_ops; trigger_data->private_data =3D private_data; + if (param && cmd_ops->trigger_ops->count_func) + trigger_data->flags |=3D EVENT_TRIGGER_FL_COUNT; =20 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(); } =20 -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 =3D data->private_data; =20 if (file) { if (tracer_tracing_is_on(file->tr)) - return; + return false; } else { if (tracing_is_on()) - return; + return false; } =20 if (!data->count) - return; + return false; =20 if (data->count !=3D -1) (data->count)--; =20 - if (file) - tracer_tracing_on(file->tr); - else - tracing_on(); + return true; } =20 static void @@ -1319,31 +1363,28 @@ traceoff_trigger(struct event_trigger_data *data, tracing_off(); } =20 -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 =3D data->private_data; =20 if (file) { if (!tracer_tracing_is_on(file->tr)) - return; + return false; } else { if (!tracing_is_on()) - return; + return false; } =20 if (!data->count) - return; + return false; =20 if (data->count !=3D -1) (data->count)--; =20 - if (file) - tracer_tracing_off(file->tr); - else - tracing_off(); + return true; } =20 static int @@ -1362,13 +1403,7 @@ traceoff_trigger_print(struct seq_file *m, struct ev= ent_trigger_data *data) =20 static const struct event_trigger_ops traceon_trigger_ops =3D { .trigger =3D traceon_trigger, - .print =3D traceon_trigger_print, - .init =3D event_trigger_init, - .free =3D event_trigger_free, -}; - -static const struct event_trigger_ops traceon_count_trigger_ops =3D { - .trigger =3D traceon_count_trigger, + .count_func =3D traceon_count_func, .print =3D traceon_trigger_print, .init =3D event_trigger_init, .free =3D event_trigger_free, @@ -1376,41 +1411,19 @@ static const struct event_trigger_ops traceon_count= _trigger_ops =3D { =20 static const struct event_trigger_ops traceoff_trigger_ops =3D { .trigger =3D traceoff_trigger, + .count_func =3D traceoff_count_func, .print =3D traceoff_trigger_print, .init =3D event_trigger_init, .free =3D event_trigger_free, }; =20 -static const struct event_trigger_ops traceoff_count_trigger_ops =3D { - .trigger =3D traceoff_count_trigger, - .print =3D traceoff_trigger_print, - .init =3D event_trigger_init, - .free =3D 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") =3D=3D 0) - ops =3D param ? &traceon_count_trigger_ops : - &traceon_trigger_ops; - else - ops =3D param ? &traceoff_count_trigger_ops : - &traceoff_trigger_ops; - - return ops; -} - static struct event_command trigger_traceon_cmd =3D { .name =3D "traceon", .trigger_type =3D ETT_TRACE_ONOFF, + .trigger_ops =3D &traceon_trigger_ops, .parse =3D event_trigger_parse, .reg =3D register_trigger, .unreg =3D unregister_trigger, - .get_trigger_ops =3D onoff_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 @@ -1418,10 +1431,10 @@ static struct event_command trigger_traceoff_cmd = =3D { .name =3D "traceoff", .trigger_type =3D ETT_TRACE_ONOFF, .flags =3D EVENT_CMD_FL_POST_TRIGGER, + .trigger_ops =3D &traceoff_trigger_ops, .parse =3D event_trigger_parse, .reg =3D register_trigger, .unreg =3D unregister_trigger, - .get_trigger_ops =3D onoff_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 @@ -1439,20 +1452,6 @@ snapshot_trigger(struct event_trigger_data *data, tracing_snapshot(); } =20 -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 !=3D -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 e= vent_trigger_data *data) =20 static const struct event_trigger_ops snapshot_trigger_ops =3D { .trigger =3D snapshot_trigger, + .count_func =3D event_trigger_count, .print =3D snapshot_trigger_print, .init =3D event_trigger_init, .free =3D event_trigger_free, }; =20 -static const struct event_trigger_ops snapshot_count_trigger_ops =3D { - .trigger =3D snapshot_count_trigger, - .print =3D snapshot_trigger_print, - .init =3D event_trigger_init, - .free =3D 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 =3D { .name =3D "snapshot", .trigger_type =3D ETT_SNAPSHOT, + .trigger_ops =3D &snapshot_trigger_ops, .parse =3D event_trigger_parse, .reg =3D register_snapshot_trigger, .unreg =3D unregister_snapshot_trigger, - .get_trigger_ops =3D snapshot_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 @@ -1558,20 +1545,6 @@ stacktrace_trigger(struct event_trigger_data *data, trace_dump_stack(STACK_SKIP); } =20 -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 !=3D -1) - (data->count)--; - - stacktrace_trigger(data, buffer, rec, event); -} - static int stacktrace_trigger_print(struct seq_file *m, struct event_trigger_data *da= ta) { @@ -1581,32 +1554,20 @@ stacktrace_trigger_print(struct seq_file *m, struct= event_trigger_data *data) =20 static const struct event_trigger_ops stacktrace_trigger_ops =3D { .trigger =3D stacktrace_trigger, + .count_func =3D event_trigger_count, .print =3D stacktrace_trigger_print, .init =3D event_trigger_init, .free =3D event_trigger_free, }; =20 -static const struct event_trigger_ops stacktrace_count_trigger_ops =3D { - .trigger =3D stacktrace_count_trigger, - .print =3D stacktrace_trigger_print, - .init =3D event_trigger_init, - .free =3D 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 =3D { .name =3D "stacktrace", .trigger_type =3D ETT_STACKTRACE, + .trigger_ops =3D &stacktrace_trigger_ops, .flags =3D EVENT_CMD_FL_POST_TRIGGER, .parse =3D event_trigger_parse, .reg =3D register_trigger, .unreg =3D unregister_trigger, - .get_trigger_ops =3D stacktrace_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 @@ -1642,24 +1603,24 @@ event_enable_trigger(struct event_trigger_data *dat= a, set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags); } =20 -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 =3D data->private_data; =20 if (!data->count) - return; + return false; =20 /* Skip if the event is in a state we want to switch to */ if (enable_data->enable =3D=3D !(enable_data->file->flags & EVENT_FILE_FL= _SOFT_DISABLED)) - return; + return false; =20 if (data->count !=3D -1) (data->count)--; =20 - event_enable_trigger(data, buffer, rec, event); + return true; } =20 int event_enable_trigger_print(struct seq_file *m, @@ -1706,13 +1667,7 @@ void event_enable_trigger_free(struct event_trigger_= data *data) =20 static const struct event_trigger_ops event_enable_trigger_ops =3D { .trigger =3D event_enable_trigger, - .print =3D event_enable_trigger_print, - .init =3D event_trigger_init, - .free =3D event_enable_trigger_free, -}; - -static const struct event_trigger_ops event_enable_count_trigger_ops =3D { - .trigger =3D event_enable_count_trigger, + .count_func =3D event_enable_count_func, .print =3D event_enable_trigger_print, .init =3D event_trigger_init, .free =3D event_enable_trigger_free, @@ -1720,13 +1675,7 @@ static const struct event_trigger_ops event_enable_c= ount_trigger_ops =3D { =20 static const struct event_trigger_ops event_disable_trigger_ops =3D { .trigger =3D event_enable_trigger, - .print =3D event_enable_trigger_print, - .init =3D event_trigger_init, - .free =3D event_enable_trigger_free, -}; - -static const struct event_trigger_ops event_disable_count_trigger_ops =3D { - .trigger =3D event_enable_count_trigger, + .count_func =3D event_enable_count_func, .print =3D event_enable_trigger_print, .init =3D event_trigger_init, .free =3D event_enable_trigger_free, @@ -1906,45 +1855,23 @@ void event_enable_unregister_trigger(char *glob, data->ops->free(data); } =20 -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 =3D ((strcmp(cmd, ENABLE_EVENT_STR) =3D=3D 0) || - (strcmp(cmd, ENABLE_HIST_STR) =3D=3D 0)); -#else - enable =3D strcmp(cmd, ENABLE_EVENT_STR) =3D=3D 0; -#endif - if (enable) - ops =3D param ? &event_enable_count_trigger_ops : - &event_enable_trigger_ops; - else - ops =3D param ? &event_disable_count_trigger_ops : - &event_disable_trigger_ops; - - return ops; -} - static struct event_command trigger_enable_cmd =3D { .name =3D ENABLE_EVENT_STR, .trigger_type =3D ETT_EVENT_ENABLE, + .trigger_ops =3D &event_enable_trigger_ops, .parse =3D event_enable_trigger_parse, .reg =3D event_enable_register_trigger, .unreg =3D event_enable_unregister_trigger, - .get_trigger_ops =3D event_enable_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 static struct event_command trigger_disable_cmd =3D { .name =3D DISABLE_EVENT_STR, .trigger_type =3D ETT_EVENT_ENABLE, + .trigger_ops =3D &event_disable_trigger_ops, .parse =3D event_enable_trigger_parse, .reg =3D event_enable_register_trigger, .unreg =3D event_enable_unregister_trigger, - .get_trigger_ops =3D event_enable_get_trigger_ops, .set_filter =3D set_trigger_filter, }; =20 --=20 2.51.0