|
@@ -77,10 +77,12 @@ DEFINE_HIST_FIELD_FN(u8);
|
|
#define HIST_KEY_SIZE_MAX (MAX_FILTER_STR_VAL + sizeof(u64))
|
|
#define HIST_KEY_SIZE_MAX (MAX_FILTER_STR_VAL + sizeof(u64))
|
|
|
|
|
|
enum hist_field_flags {
|
|
enum hist_field_flags {
|
|
- HIST_FIELD_FL_HITCOUNT = 1,
|
|
|
|
- HIST_FIELD_FL_KEY = 2,
|
|
|
|
- HIST_FIELD_FL_STRING = 4,
|
|
|
|
- HIST_FIELD_FL_HEX = 8,
|
|
|
|
|
|
+ HIST_FIELD_FL_HITCOUNT = 1,
|
|
|
|
+ HIST_FIELD_FL_KEY = 2,
|
|
|
|
+ HIST_FIELD_FL_STRING = 4,
|
|
|
|
+ HIST_FIELD_FL_HEX = 8,
|
|
|
|
+ HIST_FIELD_FL_SYM = 16,
|
|
|
|
+ HIST_FIELD_FL_SYM_OFFSET = 32,
|
|
};
|
|
};
|
|
|
|
|
|
struct hist_trigger_attrs {
|
|
struct hist_trigger_attrs {
|
|
@@ -397,6 +399,10 @@ static int create_key_field(struct hist_trigger_data *hist_data,
|
|
if (field_str) {
|
|
if (field_str) {
|
|
if (strcmp(field_str, "hex") == 0)
|
|
if (strcmp(field_str, "hex") == 0)
|
|
flags |= HIST_FIELD_FL_HEX;
|
|
flags |= HIST_FIELD_FL_HEX;
|
|
|
|
+ else if (strcmp(field_str, "sym") == 0)
|
|
|
|
+ flags |= HIST_FIELD_FL_SYM;
|
|
|
|
+ else if (strcmp(field_str, "sym-offset") == 0)
|
|
|
|
+ flags |= HIST_FIELD_FL_SYM_OFFSET;
|
|
else {
|
|
else {
|
|
ret = -EINVAL;
|
|
ret = -EINVAL;
|
|
goto out;
|
|
goto out;
|
|
@@ -726,6 +732,7 @@ hist_trigger_entry_print(struct seq_file *m,
|
|
struct tracing_map_elt *elt)
|
|
struct tracing_map_elt *elt)
|
|
{
|
|
{
|
|
struct hist_field *key_field;
|
|
struct hist_field *key_field;
|
|
|
|
+ char str[KSYM_SYMBOL_LEN];
|
|
unsigned int i;
|
|
unsigned int i;
|
|
u64 uval;
|
|
u64 uval;
|
|
|
|
|
|
@@ -741,6 +748,16 @@ hist_trigger_entry_print(struct seq_file *m,
|
|
uval = *(u64 *)(key + key_field->offset);
|
|
uval = *(u64 *)(key + key_field->offset);
|
|
seq_printf(m, "%s: %llx",
|
|
seq_printf(m, "%s: %llx",
|
|
key_field->field->name, uval);
|
|
key_field->field->name, uval);
|
|
|
|
+ } else if (key_field->flags & HIST_FIELD_FL_SYM) {
|
|
|
|
+ uval = *(u64 *)(key + key_field->offset);
|
|
|
|
+ sprint_symbol_no_offset(str, uval);
|
|
|
|
+ seq_printf(m, "%s: [%llx] %-45s",
|
|
|
|
+ key_field->field->name, uval, str);
|
|
|
|
+ } else if (key_field->flags & HIST_FIELD_FL_SYM_OFFSET) {
|
|
|
|
+ uval = *(u64 *)(key + key_field->offset);
|
|
|
|
+ sprint_symbol(str, uval);
|
|
|
|
+ seq_printf(m, "%s: [%llx] %-55s",
|
|
|
|
+ key_field->field->name, uval, str);
|
|
} else if (key_field->flags & HIST_FIELD_FL_STRING) {
|
|
} else if (key_field->flags & HIST_FIELD_FL_STRING) {
|
|
seq_printf(m, "%s: %-50s", key_field->field->name,
|
|
seq_printf(m, "%s: %-50s", key_field->field->name,
|
|
(char *)(key + key_field->offset));
|
|
(char *)(key + key_field->offset));
|
|
@@ -856,6 +873,10 @@ static const char *get_hist_field_flags(struct hist_field *hist_field)
|
|
|
|
|
|
if (hist_field->flags & HIST_FIELD_FL_HEX)
|
|
if (hist_field->flags & HIST_FIELD_FL_HEX)
|
|
flags_str = "hex";
|
|
flags_str = "hex";
|
|
|
|
+ else if (hist_field->flags & HIST_FIELD_FL_SYM)
|
|
|
|
+ flags_str = "sym";
|
|
|
|
+ else if (hist_field->flags & HIST_FIELD_FL_SYM_OFFSET)
|
|
|
|
+ flags_str = "sym-offset";
|
|
|
|
|
|
return flags_str;
|
|
return flags_str;
|
|
}
|
|
}
|