From: Tom Zanussi <tom.zanussi@linux.intel.com>
To: rostedt@goodmis.org
Cc: daniel.wagner@bmw-carit.de, masami.hiramatsu.pt@hitachi.com,
namhyung@kernel.org, josh@joshtriplett.org, andi@firstfloor.org,
linux-kernel@vger.kernel.org,
Tom Zanussi <tom.zanussi@linux.intel.com>
Subject: [PATCH v9 10/22] tracing: Add hist trigger support for compound keys
Date: Thu, 16 Jul 2015 12:22:43 -0500 [thread overview]
Message-ID: <119af14e85f75fe807b49631f89c4ca45d6441bb.1437066836.git.tom.zanussi@linux.intel.com> (raw)
In-Reply-To: <cover.1437066836.git.tom.zanussi@linux.intel.com>
In-Reply-To: <cover.1437066836.git.tom.zanussi@linux.intel.com>
Allow users to specify multiple trace event fields to use in keys by
allowing multiple fields in the 'keys=' keyword. With this addition,
any unique combination of any of the fields named in the 'keys'
keyword will result in a new entry being added to the hash table.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
---
kernel/trace/trace.c | 8 +++++---
kernel/trace/trace_events_hist.c | 40 ++++++++++++++++++++++++++++++----------
2 files changed, 35 insertions(+), 13 deletions(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 8109b89..1e4801e 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3787,19 +3787,21 @@ static const char readme_msg[] =
"\t Filters can be ignored when removing a trigger.\n"
#ifdef CONFIG_HIST_TRIGGERS
" hist trigger\t- If set, event hits are aggregated into a hash table\n"
- "\t Format: hist:keys=<field1>\n"
+ "\t Format: hist:keys=<field1>[,field2,...]\n"
"\t [:values=<field1[,field2,...]]\n"
"\t [:size=#entries]\n"
"\t [if <filter>]\n\n"
"\t When a matching event is hit, an entry is added to a hash\n"
- "\t table using the key and value(s) named. Keys and values\n"
+ "\t table using the key(s) and value(s) named. Keys and values\n"
"\t correspond to fields in the event's format description.\n"
"\t Values must correspond to numeric fields - on an event hit,\n"
"\t the value(s) will be added to a sum kept for that field.\n"
"\t The special string 'hitcount' can be used in place of an\n"
"\t explicit value field - this is simply a count of event hits.\n"
"\t If 'values' is not specified, 'hitcount' will be assumed.\n"
- "\t of event hits. Keys can be any field.\n\n"
+ "\t of event hits. Keys can be any field. Compound keys\n"
+ "\t consisting of up to two fields can be specified by the 'keys'\n"
+ "\t keyword.\n\n"
"\t Reading the 'hist' file for the event will dump the hash\n"
"\t table in its entirety to stdout. Each printed hash table\n"
"\t entry is a simple list of the keys and values comprising the\n"
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 503df07..3d5433a 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -32,6 +32,7 @@ struct hist_field {
unsigned long flags;
hist_field_fn_t fn;
unsigned int size;
+ unsigned int offset;
};
static u64 hist_field_counter(struct hist_field *field, void *event)
@@ -64,8 +65,8 @@ DEFINE_HIST_FIELD_FN(s8);
DEFINE_HIST_FIELD_FN(u8);
#define HITCOUNT_IDX 0
-#define HIST_KEY_MAX 1
-#define HIST_KEY_SIZE_MAX MAX_FILTER_STR_VAL
+#define HIST_KEY_MAX 2
+#define HIST_KEY_SIZE_MAX (MAX_FILTER_STR_VAL + sizeof(u64))
enum hist_field_flags {
HIST_FIELD_HITCOUNT = 1,
@@ -327,6 +328,7 @@ static int create_val_fields(struct hist_trigger_data *hist_data,
static int create_key_field(struct hist_trigger_data *hist_data,
unsigned int key_idx,
+ unsigned int key_offset,
struct trace_event_file *file,
char *field_str)
{
@@ -353,7 +355,8 @@ static int create_key_field(struct hist_trigger_data *hist_data,
key_size = ALIGN(key_size, sizeof(u64));
hist_data->fields[key_idx]->size = key_size;
- hist_data->key_size = key_size;
+ hist_data->fields[key_idx]->offset = key_offset;
+ hist_data->key_size += key_size;
if (hist_data->key_size > HIST_KEY_SIZE_MAX) {
ret = -EINVAL;
goto out;
@@ -368,7 +371,7 @@ static int create_key_field(struct hist_trigger_data *hist_data,
static int create_key_fields(struct hist_trigger_data *hist_data,
struct trace_event_file *file)
{
- unsigned int i, n_vals = hist_data->n_vals;
+ unsigned int i, key_offset = 0, n_vals = hist_data->n_vals;
char *fields_str, *field_str;
int ret = -EINVAL;
@@ -384,9 +387,11 @@ static int create_key_fields(struct hist_trigger_data *hist_data,
field_str = strsep(&fields_str, ",");
if (!field_str)
break;
- ret = create_key_field(hist_data, i, file, field_str);
+ ret = create_key_field(hist_data, i, key_offset,
+ file, field_str);
if (ret < 0)
goto out;
+ key_offset += ret;
}
if (fields_str) {
ret = -EINVAL;
@@ -451,7 +456,10 @@ static int create_tracing_map_fields(struct hist_trigger_data *hist_data)
else
cmp_fn = tracing_map_cmp_num(field->size,
field->is_signed);
- idx = tracing_map_add_key_field(map, 0, cmp_fn);
+ idx = tracing_map_add_key_field(map,
+ hist_field->offset,
+ cmp_fn);
+
} else
idx = tracing_map_add_sum_field(map);
@@ -531,6 +539,7 @@ static void hist_trigger_elt_update(struct hist_trigger_data *hist_data,
static void event_hist_trigger(struct event_trigger_data *data, void *rec)
{
struct hist_trigger_data *hist_data = data->private_data;
+ char compound_key[HIST_KEY_SIZE_MAX];
struct hist_field *key_field;
struct tracing_map_elt *elt;
u64 field_contents;
@@ -542,6 +551,9 @@ static void event_hist_trigger(struct event_trigger_data *data, void *rec)
return;
}
+ if (hist_data->n_keys > 1)
+ memset(compound_key, 0, hist_data->key_size);
+
for (i = hist_data->n_vals; i < hist_data->n_fields; i++) {
key_field = hist_data->fields[i];
@@ -550,8 +562,16 @@ static void event_hist_trigger(struct event_trigger_data *data, void *rec)
key = (void *)field_contents;
else
key = (void *)&field_contents;
+
+ if (hist_data->n_keys > 1) {
+ memcpy(compound_key + key_field->offset, key,
+ key_field->size);
+ }
}
+ if (hist_data->n_keys > 1)
+ key = compound_key;
+
elt = tracing_map_insert(hist_data->map, key);
if (elt)
hist_trigger_elt_update(hist_data, elt, rec);
@@ -580,11 +600,11 @@ hist_trigger_entry_print(struct seq_file *m,
if (key_field->flags & HIST_FIELD_STRING) {
seq_printf(m, "%s: %-35s", key_field->field->name,
- (char *)key);
+ (char *)(key + key_field->offset));
} else {
- uval = *(u64 *)key;
- seq_printf(m, "%s: %10llu",
- key_field->field->name, uval);
+ uval = *(u64 *)(key + key_field->offset);
+ seq_printf(m, "%s: %10llu", key_field->field->name,
+ uval);
}
}
--
1.9.3
next prev parent reply other threads:[~2015-07-16 17:23 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-16 17:22 [PATCH v9 00/22] tracing: 'hist' triggers Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 01/22] tracing: Update cond flag when enabling or disabling a trigger Tom Zanussi
2015-07-21 10:04 ` Masami Hiramatsu
2015-07-16 17:22 ` [PATCH v9 02/22] tracing: Make ftrace_event_field checking functions available Tom Zanussi
2015-07-21 10:04 ` Masami Hiramatsu
2015-07-21 14:26 ` Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 03/22] tracing: Make event trigger " Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 04/22] tracing: Add event record param to trigger_ops.func() Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 05/22] tracing: Add get_syscall_name() Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 06/22] tracing: Add a per-event-trigger 'paused' field Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 07/22] tracing: Add lock-free tracing_map Tom Zanussi
2015-07-16 17:49 ` Peter Zijlstra
2015-07-16 21:41 ` Tom Zanussi
2015-07-16 22:32 ` Peter Zijlstra
2015-07-17 1:51 ` Tom Zanussi
2015-07-16 18:03 ` Peter Zijlstra
2015-07-16 21:33 ` Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 08/22] tracing: Add 'hist' event trigger command Tom Zanussi
2015-07-20 13:37 ` Masami Hiramatsu
2015-07-21 14:17 ` Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 09/22] tracing: Add hist trigger support for multiple values ('vals=' param) Tom Zanussi
2015-07-16 17:22 ` Tom Zanussi [this message]
2015-07-16 17:22 ` [PATCH v9 11/22] tracing: Add hist trigger support for user-defined sorting ('sort=' param) Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 12/22] tracing: Add hist trigger support for pausing and continuing a trace Tom Zanussi
2015-07-22 8:20 ` Masami Hiramatsu
2015-07-22 20:22 ` Tom Zanussi
2015-07-23 14:06 ` Masami Hiramatsu
2015-07-23 15:58 ` Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 13/22] tracing: Add hist trigger support for clearing " Tom Zanussi
2015-07-22 13:50 ` Masami Hiramatsu
2015-07-22 20:24 ` Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 14/22] tracing: Add hist trigger 'hex' modifier for displaying numeric fields Tom Zanussi
2015-07-19 13:22 ` Namhyung Kim
2015-07-21 14:10 ` Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 15/22] tracing: Add hist trigger 'sym' and 'sym-offset' modifiers Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 16/22] tracing: Add hist trigger 'execname' modifier Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 17/22] tracing: Add hist trigger 'syscall' modifier Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 18/22] tracing: Add hist trigger support for stacktraces as keys Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 19/22] tracing: Support string type key properly Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 20/22] tracing: Remove restriction on string position in hist trigger keys Tom Zanussi
2015-07-19 13:31 ` Namhyung Kim
2015-07-21 14:15 ` Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 21/22] tracing: Add enable_hist/disable_hist triggers Tom Zanussi
2015-07-20 14:57 ` Masami Hiramatsu
2015-07-21 16:10 ` Tom Zanussi
2015-07-22 14:21 ` Masami Hiramatsu
2015-07-22 20:18 ` Tom Zanussi
2015-07-16 17:22 ` [PATCH v9 22/22] tracing: Add 'hist' trigger Documentation Tom Zanussi
2015-07-21 9:40 ` [PATCH v9 00/22] tracing: 'hist' triggers Masami Hiramatsu
2015-07-21 14:18 ` Tom Zanussi
2015-07-22 18:29 ` Brendan Gregg
2015-07-23 1:55 ` Tom Zanussi
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=119af14e85f75fe807b49631f89c4ca45d6441bb.1437066836.git.tom.zanussi@linux.intel.com \
--to=tom.zanussi@linux.intel.com \
--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=namhyung@kernel.org \
--cc=rostedt@goodmis.org \
/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
all inboxes | Powered by JetHome®