Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6776AC433F5 for ; Fri, 12 Nov 2021 20:23:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id F275061106 for ; Fri, 12 Nov 2021 20:23:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235599AbhKLU0j (ORCPT ); Fri, 12 Nov 2021 15:26:39 -0500 Received: from mail.kernel.org ([198.145.29.99]:50710 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235570AbhKLU0i (ORCPT ); Fri, 12 Nov 2021 15:26:38 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 30B3F60F55; Fri, 12 Nov 2021 20:23:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1636748626; bh=9RIsYFNulE1ssq1LOPQjywGuLCUGG2Htlx3rRK+zZl4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:In-Reply-To: References:From; b=l+DwGLI6uQeWCyjHKVGK0XUEiVWlsfR1xdFtMmoIA8LhDks/AI6uthtqKIxr3tuYd 0l8Bzj+pTDE5GCDMQ73OZFQWcn32aGmw4Se9JmrSibUsNFYvIeQ0IFA6ryBDozdb5g AWl3jVzdZLKNAjUrR6nenmWe1optMANwtRjopN+2MjsvyagKuMhJkxF7jleM6UPIEi qK6T6c4+oo3GqZnbTooBnbEaTScWu26GHH+OYk7GBtBAfpNbpSgTmFZqLF8g68bx7C T+V6lkV9T8+rAyaKPCaNcCIE/BEt/rTQqxKCrrn6198wiLhp0IlpF5ejeDbG7cVYYH jwbnI3hKo97Fg== From: Tom Zanussi To: rostedt@goodmis.org Cc: mhiramat@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/2] tracing: Have existing event_command implementations use helpers Date: Fri, 12 Nov 2021 14:23:40 -0600 Message-Id: <84eb6a8a61565e308b9908cbc63a897fde300c57.1636748267.git.zanussi@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Simplify the existing event_command implementations by making use of the helper functions previously introduced. Signed-off-by: Tom Zanussi --- kernel/trace/trace_events_hist.c | 52 +++------ kernel/trace/trace_events_trigger.c | 158 ++++++---------------------- 2 files changed, 51 insertions(+), 159 deletions(-) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 8ff572a31fd3..c99b1d075d9d 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -6128,10 +6128,11 @@ static int event_hist_trigger_func(struct event_command *cmd_ops, struct hist_trigger_attrs *attrs; struct event_trigger_ops *trigger_ops; struct hist_trigger_data *hist_data; + char *trigger, *p, *start; struct synth_event *se; const char *se_name; - bool remove = false; - char *trigger, *p, *start; + int n_registered; + bool remove; int ret = 0; lockdep_assert_held(&event_mutex); @@ -6141,11 +6142,9 @@ static int event_hist_trigger_func(struct event_command *cmd_ops, last_cmd_set(file, param); } - if (!param) - return -EINVAL; - - if (glob[0] == '!') - remove = true; + ret = event_trigger_check(glob, &trigger, ¶m, &remove, true, false); + if (ret) + return ret; /* * separate the trigger from the filter (k:v [if filter]) @@ -6202,29 +6201,15 @@ static int event_hist_trigger_func(struct event_command *cmd_ops, return PTR_ERR(hist_data); } - trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); - - trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); + trigger_data = event_trigger_alloc(cmd_ops, trigger, cmd, hist_data); if (!trigger_data) { ret = -ENOMEM; goto out_free; } - trigger_data->count = -1; - trigger_data->ops = trigger_ops; - trigger_data->cmd_ops = cmd_ops; - - INIT_LIST_HEAD(&trigger_data->list); - RCU_INIT_POINTER(trigger_data->filter, NULL); - - trigger_data->private_data = hist_data; - - /* if param is non-empty, it's supposed to be a filter */ - if (param && cmd_ops->set_filter) { - ret = cmd_ops->set_filter(param, trigger_data, file); - if (ret < 0) - goto out_free; - } + ret = event_trigger_set_filter(cmd_ops, file, param, trigger_data); + if (ret < 0) + goto out_free; if (remove) { if (!have_hist_trigger_match(trigger_data, file)) @@ -6244,18 +6229,14 @@ static int event_hist_trigger_func(struct event_command *cmd_ops, goto out_free; } - ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file); - /* - * The above returns on success the # of triggers registered, - * but if it didn't register any it returns zero. Consider no - * triggers registered a failure too. - */ - if (!ret) { + ret = event_trigger_register(cmd_ops, file, glob, cmd, trigger, trigger_data, &n_registered); + if (ret) + goto out_free; + if ((ret == 0) && (n_registered == 0)) { if (!(attrs->pause || attrs->cont || attrs->clear)) ret = -ENOENT; goto out_free; - } else if (ret < 0) - goto out_free; + } if (get_named_trigger_data(trigger_data)) goto enable; @@ -6289,8 +6270,7 @@ static int event_hist_trigger_func(struct event_command *cmd_ops, out_unreg: cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file); out_free: - if (cmd_ops->set_filter) - cmd_ops->set_filter(NULL, trigger_data, NULL); + event_trigger_reset_filter(cmd_ops, trigger_data); remove_hist_vars(hist_data); diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index 2eda0b8eb5b3..91c856de1438 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c @@ -781,89 +781,45 @@ event_trigger_callback(struct event_command *cmd_ops, struct event_trigger_data *trigger_data; struct event_trigger_ops *trigger_ops; char *trigger = NULL; - char *number; + bool remove; int ret; - /* separate the trigger from the filter (t:n [if filter]) */ - if (param && isdigit(param[0])) { - trigger = strsep(¶m, " \t"); - if (param) { - param = skip_spaces(param); - if (!*param) - param = NULL; - } - } - - trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); + ret = event_trigger_check(glob, &trigger, ¶m, &remove, false, true); + if (ret) + return ret; ret = -ENOMEM; - trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); + trigger_data = event_trigger_alloc(cmd_ops, trigger, cmd, file); if (!trigger_data) goto out; - trigger_data->count = -1; - trigger_data->ops = trigger_ops; - trigger_data->cmd_ops = cmd_ops; - trigger_data->private_data = file; - INIT_LIST_HEAD(&trigger_data->list); - INIT_LIST_HEAD(&trigger_data->named_list); - - if (glob[0] == '!') { + if (remove) { cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file); - kfree(trigger_data); ret = 0; goto out; } - if (trigger) { - number = strsep(&trigger, ":"); - - ret = -EINVAL; - if (!strlen(number)) - goto out_free; - - /* - * We use the callback data field (which is a pointer) - * as our counter. - */ - ret = kstrtoul(number, 0, &trigger_data->count); - if (ret) - goto out_free; - } - - if (!param) /* if param is non-empty, it's supposed to be a filter */ - goto out_reg; - - if (!cmd_ops->set_filter) - goto out_reg; + ret = event_trigger_parse_num(trigger, trigger_data); + if (ret) + goto out_free; - ret = cmd_ops->set_filter(param, trigger_data, file); + ret = event_trigger_set_filter(cmd_ops, file, param, trigger_data); if (ret < 0) goto out_free; - out_reg: /* Up the trigger_data count to make sure reg doesn't free it on failure */ event_trigger_init(trigger_ops, trigger_data); - ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file); - /* - * The above returns on success the # of functions enabled, - * but if it didn't find any functions it returns zero. - * Consider no functions a failure too. - */ - if (!ret) { - cmd_ops->unreg(glob, trigger_ops, trigger_data, file); - ret = -ENOENT; - } else if (ret > 0) - ret = 0; + + ret = event_trigger_register(cmd_ops, file, glob, cmd, trigger, trigger_data, NULL); + if (ret) + goto out_free; /* Down the counter of trigger_data or free it if not used anymore */ event_trigger_free(trigger_ops, trigger_data); out: return ret; - out_free: - if (cmd_ops->set_filter) - cmd_ops->set_filter(NULL, trigger_data, NULL); + event_trigger_reset_filter(cmd_ops, trigger_data); kfree(trigger_data); goto out; } @@ -1525,26 +1481,16 @@ int event_enable_trigger_func(struct event_command *cmd_ops, struct event_trigger_data *trigger_data; struct event_trigger_ops *trigger_ops; struct trace_array *tr = file->tr; + bool enable, remove; const char *system; const char *event; bool hist = false; char *trigger; - char *number; - bool enable; int ret; - if (!param) - return -EINVAL; - - /* separate the trigger from the filter (s:e:n [if filter]) */ - trigger = strsep(¶m, " \t"); - if (!trigger) - return -EINVAL; - if (param) { - param = skip_spaces(param); - if (!*param) - param = NULL; - } + ret = event_trigger_check(glob, &trigger, ¶m, &remove, true, true); + if (ret) + return ret; system = strsep(&trigger, ":"); if (!trigger) @@ -1569,28 +1515,23 @@ int event_enable_trigger_func(struct event_command *cmd_ops, trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); ret = -ENOMEM; - trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); - if (!trigger_data) - goto out; - enable_data = kzalloc(sizeof(*enable_data), GFP_KERNEL); if (!enable_data) { kfree(trigger_data); goto out; } - trigger_data->count = -1; - trigger_data->ops = trigger_ops; - trigger_data->cmd_ops = cmd_ops; - INIT_LIST_HEAD(&trigger_data->list); - RCU_INIT_POINTER(trigger_data->filter, NULL); - enable_data->hist = hist; enable_data->enable = enable; enable_data->file = event_enable_file; - trigger_data->private_data = enable_data; - if (glob[0] == '!') { + trigger_data = event_trigger_alloc(cmd_ops, trigger, cmd, enable_data); + if (!trigger_data) { + kfree(enable_data); + goto out; + } + + if (remove) { cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file); kfree(trigger_data); kfree(enable_data); @@ -1601,33 +1542,14 @@ int event_enable_trigger_func(struct event_command *cmd_ops, /* Up the trigger_data count to make sure nothing frees it on failure */ event_trigger_init(trigger_ops, trigger_data); - if (trigger) { - number = strsep(&trigger, ":"); - - ret = -EINVAL; - if (!strlen(number)) - goto out_free; - - /* - * We use the callback data field (which is a pointer) - * as our counter. - */ - ret = kstrtoul(number, 0, &trigger_data->count); - if (ret) - goto out_free; - } - - if (!param) /* if param is non-empty, it's supposed to be a filter */ - goto out_reg; - - if (!cmd_ops->set_filter) - goto out_reg; + ret = event_trigger_parse_num(trigger, trigger_data); + if (ret) + goto out_free; - ret = cmd_ops->set_filter(param, trigger_data, file); + ret = event_trigger_set_filter(cmd_ops, file, param, trigger_data); if (ret < 0) goto out_free; - out_reg: /* Don't let event modules unload while probe registered */ ret = trace_event_try_get_ref(event_enable_file->event_call); if (!ret) { @@ -1638,30 +1560,20 @@ int event_enable_trigger_func(struct event_command *cmd_ops, ret = trace_event_enable_disable(event_enable_file, 1, 1); if (ret < 0) goto out_put; - ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file); - /* - * The above returns on success the # of functions enabled, - * but if it didn't find any functions it returns zero. - * Consider no functions a failure too. - */ - if (!ret) { - ret = -ENOENT; - goto out_disable; - } else if (ret < 0) + + ret = event_trigger_register(cmd_ops, file, glob, cmd, trigger, trigger_data, NULL); + if (ret) goto out_disable; - /* Just return zero, not the number of enabled functions */ - ret = 0; + event_trigger_free(trigger_ops, trigger_data); out: return ret; - out_disable: trace_event_enable_disable(event_enable_file, 0, 1); out_put: trace_event_put_ref(event_enable_file->event_call); out_free: - if (cmd_ops->set_filter) - cmd_ops->set_filter(NULL, trigger_data, NULL); + event_trigger_reset_filter(cmd_ops, trigger_data); event_trigger_free(trigger_ops, trigger_data); kfree(enable_data); goto out; -- 2.17.1