public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Namhyung Kim <namhyung@kernel.org>
To: Tom Zanussi <tom.zanussi@linux.intel.com>
Cc: rostedt@goodmis.org, daniel.wagner@bmw-carit.de,
	masami.hiramatsu.pt@hitachi.com, josh@joshtriplett.org,
	andi@firstfloor.org, mathieu.desnoyers@efficios.com,
	peterz@infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v11 09/28] tracing: Add 'hist' event trigger command
Date: Thu, 29 Oct 2015 18:11:29 +0900	[thread overview]
Message-ID: <20151029091129.GB2617@sejong> (raw)
In-Reply-To: <0ccd6f1613dc5a8159fc900b5128e3840ad599f3.1445530672.git.tom.zanussi@linux.intel.com>

On Thu, Oct 22, 2015 at 01:14:13PM -0500, Tom Zanussi wrote:
> 'hist' triggers allow users to continually aggregate trace events,
> which can then be viewed afterwards by simply reading a 'hist' file
> containing the aggregation in a human-readable format.
> 
> The basic idea is very simple and boils down to a mechanism whereby
> trace events, rather than being exhaustively dumped in raw form and
> viewed directly, are automatically 'compressed' into meaningful tables
> completely defined by the user.
> 
> This is done strictly via single-line command-line commands and
> without the aid of any kind of programming language or interpreter.
> 
> A surprising number of typical use cases can be accomplished by users
> via this simple mechanism.  In fact, a large number of the tasks that
> users typically do using the more complicated script-based tracing
> tools, at least during the initial stages of an investigation, can be
> accomplished by simply specifying a set of keys and values to be used
> in the creation of a hash table.
> 
> The Linux kernel trace event subsystem happens to provide an extensive
> list of keys and values ready-made for such a purpose in the form of
> the event format files associated with each trace event.  By simply
> consulting the format file for field names of interest and by plugging
> them into the hist trigger command, users can create an endless number
> of useful aggregations to help with investigating various properties
> of the system.  See Documentation/trace/events.txt for examples.
> 
> hist triggers are implemented on top of the existing event trigger
> infrastructure, and as such are consistent with the existing triggers
> from a user's perspective as well.
> 
> The basic syntax follows the existing trigger syntax.  Users start an
> aggregation by writing a 'hist' trigger to the event of interest's
> trigger file:
> 
>   # echo hist:keys=xxx [ if filter] > event/trigger
> 
> Once a hist trigger has been set up, by default it continually
> aggregates every matching event into a hash table using the event key
> and a value field named 'hitcount'.
> 
> To view the aggregation at any point in time, simply read the 'hist'
> file in the same directory as the 'trigger' file:
> 
>   # cat event/hist
> 
> The detailed syntax provides additional options for user control, and
> is described exhaustively in Documentation/trace/events.txt and in the
> virtual tracing/README file in the tracing subsystem.
> 
> Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
> Tested-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> ---

[SNIP]
> +static int event_hist_trigger_func(struct event_command *cmd_ops,
> +				   struct trace_event_file *file,
> +				   char *glob, char *cmd, char *param)
> +{
> +	unsigned int hist_trigger_bits = TRACING_MAP_BITS_DEFAULT;
> +	struct event_trigger_data *trigger_data;
> +	struct hist_trigger_attrs *attrs;
> +	struct event_trigger_ops *trigger_ops;
> +	struct hist_trigger_data *hist_data;
> +	char *trigger;
> +	int ret = 0;
> +
> +	if (!param)
> +		return -EINVAL;
> +
> +	/* separate the trigger from the filter (k:v [if filter]) */
> +	trigger = strsep(&param, " \t");
> +	if (!trigger)
> +		return -EINVAL;
> +
> +	attrs = parse_hist_trigger_attrs(trigger);
> +	if (IS_ERR(attrs))
> +		return PTR_ERR(attrs);
> +
> +	if (!attrs->keys_str)
> +		return -EINVAL;

Wouldn't it leak the attrs?


> +
> +	if (attrs->map_bits)
> +		hist_trigger_bits = attrs->map_bits;
> +
> +	hist_data = create_hist_data(hist_trigger_bits, attrs, file);
> +	if (IS_ERR(hist_data))
> +		return PTR_ERR(hist_data);

It also can leak the attrs IMHO.


> +
> +	trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger);
> +
> +	ret = -ENOMEM;
> +	trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
> +	if (!trigger_data)
> +		goto out;

Here, the hist_data and the attr can be leaked.

Thanks,
Namhyung


> +
> +	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 (glob[0] == '!') {
> +		cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
> +		ret = 0;
> +		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 = cmd_ops->set_filter(param, trigger_data, file);
> +	if (ret < 0)
> +		goto out_free;
> + out_reg:
> +	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 = -ENOENT;
> +		goto out_free;
> +	} else if (ret < 0)
> +		goto out_free;
> +	/* Just return zero, not the number of registered triggers */
> +	ret = 0;
> + out:
> +	return ret;
> + out_free:
> +	if (cmd_ops->set_filter)
> +		cmd_ops->set_filter(NULL, trigger_data, NULL);
> +
> +	kfree(trigger_data);
> +
> +	destroy_hist_data(hist_data);
> +	goto out;
> +}

  reply	other threads:[~2015-10-29  9:11 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-22 18:14 [PATCH 00/28] tracing: 'hist' triggers Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 01/28] tracing: Update cond flag when enabling or disabling a trigger Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 02/28] tracing: Make ftrace_event_field checking functions available Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 03/28] tracing: Make event trigger " Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 04/28] tracing: Add event record param to trigger_ops.func() Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 05/28] tracing: Add get_syscall_name() Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 06/28] tracing: Add a per-event-trigger 'paused' field Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 07/28] tracing: Add needs_rec flag to event triggers Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 08/28] tracing: Add lock-free tracing_map Tom Zanussi
2015-10-29  8:31   ` Namhyung Kim
2015-10-29 18:35     ` Tom Zanussi
2015-11-02  7:08       ` Namhyung Kim
2015-11-04  1:47         ` Tom Zanussi
2015-11-04  2:26           ` Namhyung Kim
2015-11-04  2:56             ` Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 09/28] tracing: Add 'hist' event trigger command Tom Zanussi
2015-10-29  9:11   ` Namhyung Kim [this message]
2015-10-29 18:37     ` Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 10/28] tracing: Add hist trigger support for multiple values ('vals=' param) Tom Zanussi
2015-11-02  7:42   ` Namhyung Kim
2015-10-22 18:14 ` [PATCH v11 11/28] tracing: Add hist trigger support for compound keys Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 12/28] tracing: Add hist trigger support for user-defined sorting ('sort=' param) Tom Zanussi
2015-11-02  8:03   ` Namhyung Kim
2015-10-22 18:14 ` [PATCH v11 13/28] tracing: Add hist trigger support for pausing and continuing a trace Tom Zanussi
2015-11-03  8:38   ` Namhyung Kim
2015-11-04  1:53     ` Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 14/28] tracing: Add hist trigger support for clearing " Tom Zanussi
2015-11-03  8:43   ` Namhyung Kim
2015-10-22 18:14 ` [PATCH v11 15/28] tracing: Add hist trigger 'hex' modifier for displaying numeric fields Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 16/28] tracing: Add hist trigger 'sym' and 'sym-offset' modifiers Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 17/28] tracing: Add hist trigger 'execname' modifier Tom Zanussi
2015-11-02 14:10   ` Namhyung Kim
2015-11-04  2:37     ` Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 18/28] tracing: Add hist trigger 'syscall' modifier Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 19/28] tracing: Add hist trigger support for stacktraces as keys Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 20/28] tracing: Support string type key properly Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 21/28] tracing: Remove restriction on string position in hist trigger keys Tom Zanussi
2015-11-02 14:40   ` Namhyung Kim
2015-10-22 18:14 ` [PATCH v11 22/28] tracing: Add enable_hist/disable_hist triggers Tom Zanussi
2015-11-03  8:55   ` Namhyung Kim
2015-11-04  1:58     ` Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 23/28] tracing: Add 'hist' trigger Documentation Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 24/28] tracing: Add support for multiple hist triggers per event Tom Zanussi
2015-11-03  0:34   ` Namhyung Kim
2015-11-04  1:52     ` Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 25/28] tracing: Add support for named triggers Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 26/28] tracing: Add support for named hist triggers Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 27/28] kselftests/ftrace : Add event trigger testcases Tom Zanussi
2015-10-22 18:14 ` [PATCH v11 28/28] kselftests/ftrace: Add hist " Tom Zanussi
2015-10-22 18:21 ` [PATCH 00/28] tracing: 'hist' triggers Steven Rostedt
2015-10-22 18:31   ` Tom Zanussi
2015-11-05 14:43 ` Namhyung Kim
2015-11-05 14:59   ` 平松雅巳 / HIRAMATU,MASAMI
2015-11-05 22:13   ` Tom Zanussi
2015-11-05 23:18     ` Namhyung Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151029091129.GB2617@sejong \
    --to=namhyung@kernel.org \
    --cc=andi@firstfloor.org \
    --cc=daniel.wagner@bmw-carit.de \
    --cc=josh@joshtriplett.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tom.zanussi@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox