Lines Matching refs:hist_data

110 	struct hist_trigger_data	*hist_data;  member
124 struct hist_trigger_data *hist_data; member
275 #define for_each_hist_field(i, hist_data) \ argument
276 for ((i) = 0; (i) < (hist_data)->n_fields; (i)++)
278 #define for_each_hist_val_field(i, hist_data) \ argument
279 for ((i) = 0; (i) < (hist_data)->n_vals; (i)++)
281 #define for_each_hist_key_field(i, hist_data) \ argument
282 for ((i) = (hist_data)->n_vals; (i) < (hist_data)->n_fields; (i)++)
344 struct hist_trigger_data *hist_data; member
382 typedef void (*action_fn_t) (struct hist_trigger_data *hist_data,
469 struct hist_trigger_data *hist_data; member
503 struct hist_trigger_data *hist_data) in track_data_alloc() argument
519 data->hist_data = hist_data; in track_data_alloc()
610 static void action_trace(struct hist_trigger_data *hist_data, in action_trace() argument
622 struct hist_trigger_data *hist_data; member
630 struct hist_trigger_data *hist_data = hist_field->hist_data; in hist_field_timestamp() local
631 struct trace_array *tr = hist_data->event_file->tr; in hist_field_timestamp()
635 if (hist_data->attrs->ts_in_usecs && trace_clock_in_ns(tr)) in hist_field_timestamp()
670 hist_field->var.hist_data == var_data) in check_field_for_var_ref()
688 static struct hist_field *find_var_ref(struct hist_trigger_data *hist_data, in find_var_ref() argument
695 for (i = 0; i < hist_data->n_var_refs; i++) { in find_var_ref()
696 hist_field = hist_data->var_refs[i]; in find_var_ref()
718 static struct hist_field *find_any_var_ref(struct hist_trigger_data *hist_data, in find_any_var_ref() argument
721 struct trace_array *tr = hist_data->event_file->tr; in find_any_var_ref()
726 if (var_data->hist_data == hist_data) in find_any_var_ref()
728 found = find_var_ref(var_data->hist_data, hist_data, var_idx); in find_any_var_ref()
749 static bool check_var_refs(struct hist_trigger_data *hist_data) in check_var_refs() argument
755 for_each_hist_field(i, hist_data) { in check_var_refs()
756 field = hist_data->fields[i]; in check_var_refs()
758 if (find_any_var_ref(hist_data, field->var.idx)) { in check_var_refs()
768 static struct hist_var_data *find_hist_vars(struct hist_trigger_data *hist_data) in find_hist_vars() argument
770 struct trace_array *tr = hist_data->event_file->tr; in find_hist_vars()
774 if (var_data->hist_data == hist_data) { in find_hist_vars()
809 static bool has_hist_vars(struct hist_trigger_data *hist_data) in has_hist_vars() argument
814 for_each_hist_field(i, hist_data) { in has_hist_vars()
815 hist_field = hist_data->fields[i]; in has_hist_vars()
823 static int save_hist_vars(struct hist_trigger_data *hist_data) in save_hist_vars() argument
825 struct trace_array *tr = hist_data->event_file->tr; in save_hist_vars()
828 var_data = find_hist_vars(hist_data); in save_hist_vars()
841 var_data->hist_data = hist_data; in save_hist_vars()
847 static void remove_hist_vars(struct hist_trigger_data *hist_data) in remove_hist_vars() argument
849 struct trace_array *tr = hist_data->event_file->tr; in remove_hist_vars()
852 var_data = find_hist_vars(hist_data); in remove_hist_vars()
856 if (WARN_ON(check_var_refs(hist_data))) in remove_hist_vars()
866 static struct hist_field *find_var_field(struct hist_trigger_data *hist_data, in find_var_field() argument
872 for_each_hist_field(i, hist_data) { in find_var_field()
873 hist_field = hist_data->fields[i]; in find_var_field()
884 static struct hist_field *find_var(struct hist_trigger_data *hist_data, in find_var() argument
894 hist_field = find_var_field(hist_data, var_name); in find_var()
923 var_hist_data = var_data->hist_data; in find_var_file()
963 find_match_var(struct hist_trigger_data *hist_data, char *var_name) in find_match_var() argument
965 struct trace_array *tr = hist_data->event_file->tr; in find_match_var()
970 for (i = 0; i < hist_data->n_actions; i++) { in find_match_var()
971 struct action_data *data = hist_data->actions[i]; in find_match_var()
995 static struct hist_field *find_event_var(struct hist_trigger_data *hist_data, in find_event_var() argument
1000 struct trace_array *tr = hist_data->event_file->tr; in find_event_var()
1005 hist_field = find_match_var(hist_data, var_name); in find_event_var()
1038 static bool resolve_var_refs(struct hist_trigger_data *hist_data, void *key, in resolve_var_refs() argument
1048 for (i = 0; i < hist_data->n_var_refs; i++) { in resolve_var_refs()
1049 hist_field = hist_data->var_refs[i]; in resolve_var_refs()
1051 var_data = hist_field->var.hist_data; in resolve_var_refs()
1058 if ((self && var_data != hist_data) || in resolve_var_refs()
1059 (!self && var_data == hist_data)) in resolve_var_refs()
1379 struct hist_trigger_data *hist_data = elt->map->private_data; in hist_trigger_elt_data_alloc() local
1389 for_each_hist_key_field(i, hist_data) { in hist_trigger_elt_data_alloc()
1390 key_field = hist_data->fields[i]; in hist_trigger_elt_data_alloc()
1402 n_str = hist_data->n_field_var_str + hist_data->n_save_var_str + in hist_trigger_elt_data_alloc()
1403 hist_data->n_var_str; in hist_trigger_elt_data_alloc()
1597 static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data, in create_hist_field() argument
1613 hist_field->hist_data = hist_data; in create_hist_field()
1640 hist_field->operands[0] = create_hist_field(hist_data, field, fl, NULL); in create_hist_field()
1713 static void destroy_hist_fields(struct hist_trigger_data *hist_data) in destroy_hist_fields() argument
1718 if (hist_data->fields[i]) { in destroy_hist_fields()
1719 destroy_hist_field(hist_data->fields[i], 0); in destroy_hist_fields()
1720 hist_data->fields[i] = NULL; in destroy_hist_fields()
1724 for (i = 0; i < hist_data->n_var_refs; i++) { in destroy_hist_fields()
1725 WARN_ON(!(hist_data->var_refs[i]->flags & HIST_FIELD_FL_VAR_REF)); in destroy_hist_fields()
1726 __destroy_hist_field(hist_data->var_refs[i]); in destroy_hist_fields()
1727 hist_data->var_refs[i] = NULL; in destroy_hist_fields()
1738 ref_field->var.hist_data = var_field->hist_data; in init_var_ref()
1787 static int find_var_ref_idx(struct hist_trigger_data *hist_data, in find_var_ref_idx() argument
1793 for (i = 0; i < hist_data->n_var_refs; i++) { in find_var_ref_idx()
1794 ref_field = hist_data->var_refs[i]; in find_var_ref_idx()
1796 ref_field->var.hist_data == var_field->hist_data) in find_var_ref_idx()
1818 static struct hist_field *create_var_ref(struct hist_trigger_data *hist_data, in create_var_ref() argument
1827 for (i = 0; i < hist_data->n_var_refs; i++) { in create_var_ref()
1828 ref_field = hist_data->var_refs[i]; in create_var_ref()
1830 ref_field->var.hist_data == var_field->hist_data) { in create_var_ref()
1836 ref_field = create_hist_field(var_field->hist_data, NULL, flags, NULL); in create_var_ref()
1843 hist_data->var_refs[hist_data->n_var_refs] = ref_field; in create_var_ref()
1844 ref_field->var_ref_idx = hist_data->n_var_refs++; in create_var_ref()
1858 static char *field_name_from_var(struct hist_trigger_data *hist_data, in field_name_from_var() argument
1864 for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) { in field_name_from_var()
1865 name = hist_data->attrs->var_defs.name[i]; in field_name_from_var()
1868 field = hist_data->attrs->var_defs.expr[i]; in field_name_from_var()
1878 static char *local_field_var_ref(struct hist_trigger_data *hist_data, in local_field_var_ref() argument
1885 call = hist_data->event_file->event_call; in local_field_var_ref()
1902 return field_name_from_var(hist_data, var_name); in local_field_var_ref()
1905 static struct hist_field *parse_var_ref(struct hist_trigger_data *hist_data, in parse_var_ref() argument
1910 struct trace_array *tr = hist_data->event_file->tr; in parse_var_ref()
1917 var_field = find_event_var(hist_data, system, event_name, var_name); in parse_var_ref()
1919 ref_field = create_var_ref(hist_data, var_field, in parse_var_ref()
1929 parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file, in parse_field() argument
1966 hist_data->enable_timestamps = true; in parse_field()
1968 hist_data->attrs->ts_in_usecs = true; in parse_field()
1985 static struct hist_field *create_alias(struct hist_trigger_data *hist_data, in create_alias() argument
1992 alias = create_hist_field(hist_data, NULL, flags, var_name); in create_alias()
2009 static struct hist_field *parse_atom(struct hist_trigger_data *hist_data, in parse_atom() argument
2036 s = local_field_var_ref(hist_data, ref_system, ref_event, ref_var); in parse_atom()
2038 hist_field = parse_var_ref(hist_data, ref_system, in parse_atom()
2042 hist_field = create_alias(hist_data, hist_field, var_name); in parse_atom()
2053 field = parse_field(hist_data, file, str, flags); in parse_atom()
2059 hist_field = create_hist_field(hist_data, field, *flags, var_name); in parse_atom()
2070 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
2075 static struct hist_field *parse_unary(struct hist_trigger_data *hist_data, in parse_unary() argument
2112 expr = create_hist_field(hist_data, NULL, flags, var_name); in parse_unary()
2119 operand1 = parse_expr(hist_data, file, str, operand_flags, NULL, ++level); in parse_unary()
2154 var = find_var_field(operand1->var.hist_data, operand1->name); in check_expr_operands()
2164 var = find_var_field(operand2->var.hist_data, operand2->name); in check_expr_operands()
2179 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, in parse_expr() argument
2197 return parse_atom(hist_data, file, str, &flags, var_name); in parse_expr()
2200 return parse_unary(hist_data, file, str, flags, var_name, ++level); in parse_expr()
2218 operand1 = parse_atom(hist_data, file, operand1_str, in parse_expr()
2228 operand2 = parse_expr(hist_data, file, str, operand_flags, NULL, ++level); in parse_expr()
2244 expr = create_hist_field(hist_data, NULL, flags, var_name); in parse_expr()
2284 static char *find_trigger_filter(struct hist_trigger_data *hist_data, in find_trigger_filter() argument
2293 if (test->private_data == hist_data) in find_trigger_filter()
2307 struct hist_trigger_data *hist_data, in compatible_keys() argument
2313 if (hist_data->n_fields - hist_data->n_vals != n_keys) in compatible_keys()
2316 i = hist_data->n_vals; in compatible_keys()
2320 hist_field = hist_data->fields[i + n]; in compatible_keys()
2338 struct hist_trigger_data *hist_data; in find_compatible_hist() local
2348 hist_data = test->private_data; in find_compatible_hist()
2350 if (compatible_keys(target_hist_data, hist_data, n_keys)) in find_compatible_hist()
2351 return hist_data; in find_compatible_hist()
2422 struct hist_trigger_data *hist_data; in create_field_var_hist() local
2450 hist_data = find_compatible_hist(target_hist_data, file); in create_field_var_hist()
2451 if (!hist_data) { in create_field_var_hist()
2475 for_each_hist_key_field(i, hist_data) { in create_field_var_hist()
2476 key_field = hist_data->fields[i]; in create_field_var_hist()
2490 saved_filter = find_trigger_filter(hist_data, file); in create_field_var_hist()
2504 var_hist->hist_data = hist_data; in create_field_var_hist()
2537 find_target_event_var(struct hist_trigger_data *hist_data, in find_target_event_var() argument
2540 struct trace_event_file *file = hist_data->event_file; in find_target_event_var()
2558 hist_field = find_var_field(hist_data, var_name); in find_target_event_var()
2593 static void update_field_vars(struct hist_trigger_data *hist_data, in update_field_vars() argument
2598 __update_field_vars(elt, rbe, rec, hist_data->field_vars, in update_field_vars()
2599 hist_data->n_field_vars, 0); in update_field_vars()
2602 static void save_track_data_vars(struct hist_trigger_data *hist_data, in save_track_data_vars() argument
2607 __update_field_vars(elt, rbe, rec, hist_data->save_vars, in save_track_data_vars()
2608 hist_data->n_save_vars, hist_data->n_field_var_str); in save_track_data_vars()
2611 static struct hist_field *create_var(struct hist_trigger_data *hist_data, in create_var() argument
2618 if (find_var(hist_data, file, name) && !hist_data->remove) { in create_var()
2629 idx = tracing_map_add_var(hist_data->map); in create_var()
2639 var->var.hist_data = var->hist_data = hist_data; in create_var()
2653 static struct field_var *create_field_var(struct hist_trigger_data *hist_data, in create_field_var() argument
2663 if (hist_data->n_field_vars >= SYNTH_FIELDS_MAX) { in create_field_var()
2669 val = parse_atom(hist_data, file, field_name, &flags, NULL); in create_field_var()
2676 var = create_var(hist_data, file, field_name, val->size, val->type); in create_field_var()
2761 static u64 get_track_val(struct hist_trigger_data *hist_data, in get_track_val() argument
2773 static void save_track_val(struct hist_trigger_data *hist_data, in save_track_val() argument
2782 static void save_track_data(struct hist_trigger_data *hist_data, in save_track_data() argument
2788 data->track_data.save_data(hist_data, elt, rec, rbe, key, data, var_ref_vals); in save_track_data()
2795 struct hist_trigger_data *hist_data; in check_track_val() local
2798 hist_data = data->track_data.track_var->hist_data; in check_track_val()
2799 track_val = get_track_val(hist_data, elt, data); in check_track_val()
2819 track_val = get_track_val(track_data->hist_data, context->elt, in cond_snapshot_update()
2838 static void save_track_data_snapshot(struct hist_trigger_data *hist_data, in save_track_data_snapshot() argument
2844 struct trace_event_file *file = hist_data->event_file; in save_track_data_snapshot()
2854 struct hist_trigger_data *hist_data,
2858 static struct action_data *snapshot_action(struct hist_trigger_data *hist_data) in snapshot_action() argument
2862 if (!hist_data->n_actions) in snapshot_action()
2865 for (i = 0; i < hist_data->n_actions; i++) { in snapshot_action()
2866 struct action_data *data = hist_data->actions[i]; in snapshot_action()
2876 struct hist_trigger_data *hist_data) in track_data_snapshot_print() argument
2878 struct trace_event_file *file = hist_data->event_file; in track_data_snapshot_print()
2889 action = snapshot_action(hist_data); in track_data_snapshot_print()
2899 hist_trigger_print_key(m, hist_data, track_data->key, &track_data->elt); in track_data_snapshot_print()
2907 static void save_track_data_snapshot(struct hist_trigger_data *hist_data, in save_track_data_snapshot() argument
2913 struct hist_trigger_data *hist_data) {} in track_data_snapshot_print() argument
2917 struct hist_trigger_data *hist_data, in track_data_print() argument
2921 u64 track_val = get_track_val(hist_data, elt, data); in track_data_print()
2932 for (i = 0; i < hist_data->n_save_vars; i++) { in track_data_print()
2933 struct hist_field *save_val = hist_data->save_vars[i]->val; in track_data_print()
2934 struct hist_field *save_var = hist_data->save_vars[i]->var; in track_data_print()
2949 static void ontrack_action(struct hist_trigger_data *hist_data, in ontrack_action() argument
2957 save_track_val(hist_data, elt, data, var_val); in ontrack_action()
2958 save_track_data(hist_data, elt, rec, rbe, key, data, var_ref_vals); in ontrack_action()
2981 static void track_data_destroy(struct hist_trigger_data *hist_data, in track_data_destroy() argument
2984 struct trace_event_file *file = hist_data->event_file; in track_data_destroy()
2992 if (track_data && track_data->hist_data == hist_data) { in track_data_destroy()
3003 static int action_create(struct hist_trigger_data *hist_data,
3006 static int track_data_create(struct hist_trigger_data *hist_data, in track_data_create() argument
3010 struct trace_event_file *file = hist_data->event_file; in track_data_create()
3022 var_field = find_target_event_var(hist_data, NULL, NULL, track_data_var_str); in track_data_create()
3028 ref_field = create_var_ref(hist_data, var_field, NULL, NULL); in track_data_create()
3035 track_var = create_var(hist_data, file, "__max", sizeof(u64), "u64"); in track_data_create()
3043 track_var = create_var(hist_data, file, "__change", sizeof(u64), "u64"); in track_data_create()
3051 ret = action_create(hist_data, data); in track_data_create()
3207 static struct action_data *track_data_parse(struct hist_trigger_data *hist_data, in track_data_parse() argument
3230 ret = action_parse(hist_data->event_file->tr, str, data, handler); in track_data_parse()
3236 track_data_destroy(hist_data, data); in track_data_parse()
3260 static void destroy_field_vars(struct hist_trigger_data *hist_data) in destroy_field_vars() argument
3264 for (i = 0; i < hist_data->n_field_vars; i++) in destroy_field_vars()
3265 destroy_field_var(hist_data->field_vars[i]); in destroy_field_vars()
3267 for (i = 0; i < hist_data->n_save_vars; i++) in destroy_field_vars()
3268 destroy_field_var(hist_data->save_vars[i]); in destroy_field_vars()
3271 static void save_field_var(struct hist_trigger_data *hist_data, in save_field_var() argument
3274 hist_data->field_vars[hist_data->n_field_vars++] = field_var; in save_field_var()
3277 hist_data->n_field_var_str++; in save_field_var()
3311 trace_action_find_var(struct hist_trigger_data *hist_data, in trace_action_find_var() argument
3315 struct trace_array *tr = hist_data->event_file->tr; in trace_action_find_var()
3320 hist_field = find_target_event_var(hist_data, system, event, var); in trace_action_find_var()
3327 hist_field = find_event_var(hist_data, system, event, var); in trace_action_find_var()
3337 trace_action_create_field_var(struct hist_trigger_data *hist_data, in trace_action_create_field_var() argument
3350 field_var = create_target_field_var(hist_data, system, event, var); in trace_action_create_field_var()
3353 save_field_var(hist_data, field_var); in trace_action_create_field_var()
3374 hist_field = create_field_var_hist(hist_data, system, event, var); in trace_action_create_field_var()
3386 static int trace_action_create(struct hist_trigger_data *hist_data, in trace_action_create() argument
3389 struct trace_array *tr = hist_data->event_file->tr; in trace_action_create()
3436 hist_field = trace_action_find_var(hist_data, data, in trace_action_create()
3440 hist_field = trace_action_create_field_var(hist_data, in trace_action_create()
3453 var_ref = create_var_ref(hist_data, hist_field, in trace_action_create()
3461 var_ref_idx = find_var_ref_idx(hist_data, var_ref); in trace_action_create()
3495 static int action_create(struct hist_trigger_data *hist_data, in action_create() argument
3498 struct trace_event_file *file = hist_data->event_file; in action_create()
3507 return trace_action_create(hist_data, data); in action_create()
3510 track_data = track_data_alloc(hist_data->key_size, data, hist_data); in action_create()
3525 if (hist_data->n_save_vars) { in action_create()
3538 field_var = create_target_field_var(hist_data, NULL, NULL, param); in action_create()
3547 hist_data->save_vars[hist_data->n_save_vars++] = field_var; in action_create()
3549 hist_data->n_save_var_str++; in action_create()
3557 static int onmatch_create(struct hist_trigger_data *hist_data, in onmatch_create() argument
3560 return action_create(hist_data, data); in onmatch_create()
3613 static int create_hitcount_val(struct hist_trigger_data *hist_data) in create_hitcount_val() argument
3615 hist_data->fields[HITCOUNT_IDX] = in create_hitcount_val()
3616 create_hist_field(hist_data, NULL, HIST_FIELD_FL_HITCOUNT, NULL); in create_hitcount_val()
3617 if (!hist_data->fields[HITCOUNT_IDX]) in create_hitcount_val()
3620 hist_data->n_vals++; in create_hitcount_val()
3621 hist_data->n_fields++; in create_hitcount_val()
3623 if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX)) in create_hitcount_val()
3629 static int __create_val_field(struct hist_trigger_data *hist_data, in __create_val_field() argument
3638 hist_field = parse_expr(hist_data, file, field_str, flags, var_name, 0); in __create_val_field()
3644 hist_data->fields[val_idx] = hist_field; in __create_val_field()
3646 ++hist_data->n_vals; in __create_val_field()
3647 ++hist_data->n_fields; in __create_val_field()
3649 if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX)) in __create_val_field()
3655 static int create_val_field(struct hist_trigger_data *hist_data, in create_val_field() argument
3663 return __create_val_field(hist_data, val_idx, file, NULL, field_str, 0); in create_val_field()
3666 static int create_var_field(struct hist_trigger_data *hist_data, in create_var_field() argument
3671 struct trace_array *tr = hist_data->event_file->tr; in create_var_field()
3678 if (find_var(hist_data, file, var_name) && !hist_data->remove) { in create_var_field()
3684 hist_data->n_vars++; in create_var_field()
3685 if (WARN_ON(hist_data->n_vars > TRACING_MAP_VARS_MAX)) in create_var_field()
3688 ret = __create_val_field(hist_data, val_idx, file, var_name, expr_str, flags); in create_var_field()
3690 if (!ret && hist_data->fields[val_idx]->flags & HIST_FIELD_FL_STRING) in create_var_field()
3691 hist_data->fields[val_idx]->var_str_idx = hist_data->n_var_str++; in create_var_field()
3696 static int create_val_fields(struct hist_trigger_data *hist_data, in create_val_fields() argument
3703 ret = create_hitcount_val(hist_data); in create_val_fields()
3707 fields_str = hist_data->attrs->vals_str; in create_val_fields()
3720 ret = create_val_field(hist_data, j++, file, field_str); in create_val_fields()
3731 static int create_key_field(struct hist_trigger_data *hist_data, in create_key_field() argument
3737 struct trace_array *tr = hist_data->event_file->tr; in create_key_field()
3751 hist_field = create_hist_field(hist_data, NULL, flags, NULL); in create_key_field()
3753 hist_field = parse_expr(hist_data, file, field_str, flags, in create_key_field()
3770 hist_data->fields[key_idx] = hist_field; in create_key_field()
3773 hist_data->fields[key_idx]->size = key_size; in create_key_field()
3774 hist_data->fields[key_idx]->offset = key_offset; in create_key_field()
3776 hist_data->key_size += key_size; in create_key_field()
3778 if (hist_data->key_size > HIST_KEY_SIZE_MAX) { in create_key_field()
3783 hist_data->n_keys++; in create_key_field()
3784 hist_data->n_fields++; in create_key_field()
3786 if (WARN_ON(hist_data->n_keys > TRACING_MAP_KEYS_MAX)) in create_key_field()
3794 static int create_key_fields(struct hist_trigger_data *hist_data, in create_key_fields() argument
3797 unsigned int i, key_offset = 0, n_vals = hist_data->n_vals; in create_key_fields()
3801 fields_str = hist_data->attrs->keys_str; in create_key_fields()
3809 ret = create_key_field(hist_data, i, key_offset, in create_key_fields()
3824 static int create_var_fields(struct hist_trigger_data *hist_data, in create_var_fields() argument
3827 unsigned int i, j = hist_data->n_vals; in create_var_fields()
3830 unsigned int n_vars = hist_data->attrs->var_defs.n_vars; in create_var_fields()
3833 char *var_name = hist_data->attrs->var_defs.name[i]; in create_var_fields()
3834 char *expr = hist_data->attrs->var_defs.expr[i]; in create_var_fields()
3836 ret = create_var_field(hist_data, j++, file, var_name, expr); in create_var_fields()
3844 static void free_var_defs(struct hist_trigger_data *hist_data) in free_var_defs() argument
3848 for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) { in free_var_defs()
3849 kfree(hist_data->attrs->var_defs.name[i]); in free_var_defs()
3850 kfree(hist_data->attrs->var_defs.expr[i]); in free_var_defs()
3853 hist_data->attrs->var_defs.n_vars = 0; in free_var_defs()
3856 static int parse_var_defs(struct hist_trigger_data *hist_data) in parse_var_defs() argument
3858 struct trace_array *tr = hist_data->event_file->tr; in parse_var_defs()
3863 for (i = 0; i < hist_data->attrs->n_assignments; i++) { in parse_var_defs()
3864 str = hist_data->attrs->assignment_str[i]; in parse_var_defs()
3889 hist_data->attrs->var_defs.name[n_vars] = s; in parse_var_defs()
3896 hist_data->attrs->var_defs.expr[n_vars++] = s; in parse_var_defs()
3898 hist_data->attrs->var_defs.n_vars = n_vars; in parse_var_defs()
3904 free_var_defs(hist_data); in parse_var_defs()
3909 static int create_hist_fields(struct hist_trigger_data *hist_data, in create_hist_fields() argument
3914 ret = parse_var_defs(hist_data); in create_hist_fields()
3918 ret = create_val_fields(hist_data, file); in create_hist_fields()
3922 ret = create_var_fields(hist_data, file); in create_hist_fields()
3926 ret = create_key_fields(hist_data, file); in create_hist_fields()
3930 free_var_defs(hist_data); in create_hist_fields()
3951 static int create_sort_keys(struct hist_trigger_data *hist_data) in create_sort_keys() argument
3953 struct trace_array *tr = hist_data->event_file->tr; in create_sort_keys()
3954 char *fields_str = hist_data->attrs->sort_key_str; in create_sort_keys()
3959 hist_data->n_sort_keys = 1; /* we always have at least one, hitcount */ in create_sort_keys()
3969 sort_key = &hist_data->sort_keys[i]; in create_sort_keys()
4004 for (j = 1, k = 1; j < hist_data->n_fields; j++) { in create_sort_keys()
4007 hist_field = hist_data->fields[j]; in create_sort_keys()
4026 if (j == hist_data->n_fields) { in create_sort_keys()
4033 hist_data->n_sort_keys = i; in create_sort_keys()
4038 static void destroy_actions(struct hist_trigger_data *hist_data) in destroy_actions() argument
4042 for (i = 0; i < hist_data->n_actions; i++) { in destroy_actions()
4043 struct action_data *data = hist_data->actions[i]; in destroy_actions()
4049 track_data_destroy(hist_data, data); in destroy_actions()
4055 static int parse_actions(struct hist_trigger_data *hist_data) in parse_actions() argument
4057 struct trace_array *tr = hist_data->event_file->tr; in parse_actions()
4064 for (i = 0; i < hist_data->attrs->n_actions; i++) { in parse_actions()
4065 str = hist_data->attrs->action_str[i]; in parse_actions()
4078 data = track_data_parse(hist_data, action_str, in parse_actions()
4087 data = track_data_parse(hist_data, action_str, in parse_actions()
4098 hist_data->actions[hist_data->n_actions++] = data; in parse_actions()
4104 static int create_actions(struct hist_trigger_data *hist_data) in create_actions() argument
4110 for (i = 0; i < hist_data->attrs->n_actions; i++) { in create_actions()
4111 data = hist_data->actions[i]; in create_actions()
4114 ret = onmatch_create(hist_data, data); in create_actions()
4119 ret = track_data_create(hist_data, data); in create_actions()
4132 struct hist_trigger_data *hist_data, in print_actions() argument
4137 for (i = 0; i < hist_data->n_actions; i++) { in print_actions()
4138 struct action_data *data = hist_data->actions[i]; in print_actions()
4145 track_data_print(m, hist_data, elt, data); in print_actions()
4150 struct hist_trigger_data *hist_data, in print_action_spec() argument
4156 for (i = 0; i < hist_data->n_save_vars; i++) { in print_action_spec()
4157 seq_printf(m, "%s", hist_data->save_vars[i]->var->var.name); in print_action_spec()
4158 if (i < hist_data->n_save_vars - 1) in print_action_spec()
4173 struct hist_trigger_data *hist_data, in print_track_data_spec() argument
4183 print_action_spec(m, hist_data, data); in print_track_data_spec()
4189 struct hist_trigger_data *hist_data, in print_onmatch_spec() argument
4197 print_action_spec(m, hist_data, data); in print_onmatch_spec()
4202 static bool actions_match(struct hist_trigger_data *hist_data, in actions_match() argument
4207 if (hist_data->n_actions != hist_data_test->n_actions) in actions_match()
4210 for (i = 0; i < hist_data->n_actions; i++) { in actions_match()
4211 struct action_data *data = hist_data->actions[i]; in actions_match()
4261 struct hist_trigger_data *hist_data) in print_actions_spec() argument
4265 for (i = 0; i < hist_data->n_actions; i++) { in print_actions_spec()
4266 struct action_data *data = hist_data->actions[i]; in print_actions_spec()
4269 print_onmatch_spec(m, hist_data, data); in print_actions_spec()
4272 print_track_data_spec(m, hist_data, data); in print_actions_spec()
4276 static void destroy_field_var_hists(struct hist_trigger_data *hist_data) in destroy_field_var_hists() argument
4280 for (i = 0; i < hist_data->n_field_var_hists; i++) { in destroy_field_var_hists()
4281 kfree(hist_data->field_var_hists[i]->cmd); in destroy_field_var_hists()
4282 kfree(hist_data->field_var_hists[i]); in destroy_field_var_hists()
4286 static void destroy_hist_data(struct hist_trigger_data *hist_data) in destroy_hist_data() argument
4288 if (!hist_data) in destroy_hist_data()
4291 destroy_hist_trigger_attrs(hist_data->attrs); in destroy_hist_data()
4292 destroy_hist_fields(hist_data); in destroy_hist_data()
4293 tracing_map_destroy(hist_data->map); in destroy_hist_data()
4295 destroy_actions(hist_data); in destroy_hist_data()
4296 destroy_field_vars(hist_data); in destroy_hist_data()
4297 destroy_field_var_hists(hist_data); in destroy_hist_data()
4299 kfree(hist_data); in destroy_hist_data()
4302 static int create_tracing_map_fields(struct hist_trigger_data *hist_data) in create_tracing_map_fields() argument
4304 struct tracing_map *map = hist_data->map; in create_tracing_map_fields()
4309 for_each_hist_field(i, hist_data) { in create_tracing_map_fields()
4310 hist_field = hist_data->fields[i]; in create_tracing_map_fields()
4340 hist_field->var.hist_data = hist_data; in create_tracing_map_fields()
4354 struct hist_trigger_data *hist_data; in create_hist_data() local
4357 hist_data = kzalloc(sizeof(*hist_data), GFP_KERNEL); in create_hist_data()
4358 if (!hist_data) in create_hist_data()
4361 hist_data->attrs = attrs; in create_hist_data()
4362 hist_data->remove = remove; in create_hist_data()
4363 hist_data->event_file = file; in create_hist_data()
4365 ret = parse_actions(hist_data); in create_hist_data()
4369 ret = create_hist_fields(hist_data, file); in create_hist_data()
4373 ret = create_sort_keys(hist_data); in create_hist_data()
4379 hist_data->map = tracing_map_create(map_bits, hist_data->key_size, in create_hist_data()
4380 map_ops, hist_data); in create_hist_data()
4381 if (IS_ERR(hist_data->map)) { in create_hist_data()
4382 ret = PTR_ERR(hist_data->map); in create_hist_data()
4383 hist_data->map = NULL; in create_hist_data()
4387 ret = create_tracing_map_fields(hist_data); in create_hist_data()
4391 return hist_data; in create_hist_data()
4393 hist_data->attrs = NULL; in create_hist_data()
4395 destroy_hist_data(hist_data); in create_hist_data()
4397 hist_data = ERR_PTR(ret); in create_hist_data()
4402 static void hist_trigger_elt_update(struct hist_trigger_data *hist_data, in hist_trigger_elt_update() argument
4415 for_each_hist_val_field(i, hist_data) { in hist_trigger_elt_update()
4416 hist_field = hist_data->fields[i]; in hist_trigger_elt_update()
4425 str_start = hist_data->n_field_var_str + in hist_trigger_elt_update()
4426 hist_data->n_save_var_str; in hist_trigger_elt_update()
4442 for_each_hist_key_field(i, hist_data) { in hist_trigger_elt_update()
4443 hist_field = hist_data->fields[i]; in hist_trigger_elt_update()
4451 update_field_vars(hist_data, elt, rbe, rec); in hist_trigger_elt_update()
4480 hist_trigger_actions(struct hist_trigger_data *hist_data, in hist_trigger_actions() argument
4488 for (i = 0; i < hist_data->n_actions; i++) { in hist_trigger_actions()
4489 data = hist_data->actions[i]; in hist_trigger_actions()
4490 data->fn(hist_data, elt, rec, rbe, key, data, var_ref_vals); in hist_trigger_actions()
4497 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger() local
4498 bool use_compound_key = (hist_data->n_keys > 1); in event_hist_trigger()
4508 memset(compound_key, 0, hist_data->key_size); in event_hist_trigger()
4510 for_each_hist_key_field(i, hist_data) { in event_hist_trigger()
4511 key_field = hist_data->fields[i]; in event_hist_trigger()
4534 if (hist_data->n_var_refs && in event_hist_trigger()
4535 !resolve_var_refs(hist_data, key, var_ref_vals, false)) in event_hist_trigger()
4538 elt = tracing_map_insert(hist_data->map, key); in event_hist_trigger()
4542 hist_trigger_elt_update(hist_data, elt, rec, rbe, var_ref_vals); in event_hist_trigger()
4544 if (resolve_var_refs(hist_data, key, var_ref_vals, true)) in event_hist_trigger()
4545 hist_trigger_actions(hist_data, elt, rec, rbe, key, var_ref_vals); in event_hist_trigger()
4567 struct hist_trigger_data *hist_data, in hist_trigger_print_key() argument
4580 for_each_hist_key_field(i, hist_data) { in hist_trigger_print_key()
4581 key_field = hist_data->fields[i]; in hist_trigger_print_key()
4583 if (i > hist_data->n_vals) in hist_trigger_print_key()
4648 struct hist_trigger_data *hist_data, in hist_trigger_entry_print() argument
4655 hist_trigger_print_key(m, hist_data, key, elt); in hist_trigger_entry_print()
4660 for (i = 1; i < hist_data->n_vals; i++) { in hist_trigger_entry_print()
4661 field_name = hist_field_name(hist_data->fields[i], 0); in hist_trigger_entry_print()
4663 if (hist_data->fields[i]->flags & HIST_FIELD_FL_VAR || in hist_trigger_entry_print()
4664 hist_data->fields[i]->flags & HIST_FIELD_FL_EXPR) in hist_trigger_entry_print()
4667 if (hist_data->fields[i]->flags & HIST_FIELD_FL_HEX) { in hist_trigger_entry_print()
4676 print_actions(m, hist_data, elt); in hist_trigger_entry_print()
4682 struct hist_trigger_data *hist_data) in print_entries() argument
4685 struct tracing_map *map = hist_data->map; in print_entries()
4688 n_entries = tracing_map_sort_entries(map, hist_data->sort_keys, in print_entries()
4689 hist_data->n_sort_keys, in print_entries()
4695 hist_trigger_entry_print(m, hist_data, in print_entries()
4707 struct hist_trigger_data *hist_data; in hist_trigger_show() local
4717 hist_data = data->private_data; in hist_trigger_show()
4718 n_entries = print_entries(m, hist_data); in hist_trigger_show()
4722 track_data_snapshot_print(m, hist_data); in hist_trigger_show()
4725 (u64)atomic64_read(&hist_data->map->hits), in hist_trigger_show()
4726 n_entries, (u64)atomic64_read(&hist_data->map->drops)); in hist_trigger_show()
4820 seq_printf(m, " var.hist_data: %p\n", field->var.hist_data); in hist_field_debug_show()
4904 struct hist_trigger_data *hist_data) in hist_actions_debug_show() argument
4908 if (hist_data->n_actions) in hist_actions_debug_show()
4911 for (i = 0; i < hist_data->n_actions; i++) { in hist_actions_debug_show()
4912 struct action_data *action = hist_data->actions[i]; in hist_actions_debug_show()
4919 if (hist_data->n_save_vars) in hist_actions_debug_show()
4922 for (i = 0; i < hist_data->n_save_vars; i++) { in hist_actions_debug_show()
4923 ret = field_var_debug_show(m, hist_data->save_vars[i], i, true); in hist_actions_debug_show()
4934 struct hist_trigger_data *hist_data; in hist_trigger_debug_show() local
4944 hist_data = data->private_data; in hist_trigger_debug_show()
4946 seq_printf(m, "hist_data: %p\n\n", hist_data); in hist_trigger_debug_show()
4947 seq_printf(m, " n_vals: %u\n", hist_data->n_vals); in hist_trigger_debug_show()
4948 seq_printf(m, " n_keys: %u\n", hist_data->n_keys); in hist_trigger_debug_show()
4949 seq_printf(m, " n_fields: %u\n", hist_data->n_fields); in hist_trigger_debug_show()
4954 ret = hist_field_debug_show(m, hist_data->fields[0], in hist_trigger_debug_show()
4959 for (i = 1; i < hist_data->n_vals; i++) { in hist_trigger_debug_show()
4961 ret = hist_field_debug_show(m, hist_data->fields[i], 0); in hist_trigger_debug_show()
4968 for (i = hist_data->n_vals; i < hist_data->n_fields; i++) { in hist_trigger_debug_show()
4970 ret = hist_field_debug_show(m, hist_data->fields[i], in hist_trigger_debug_show()
4976 if (hist_data->n_var_refs) in hist_trigger_debug_show()
4979 for (i = 0; i < hist_data->n_var_refs; i++) { in hist_trigger_debug_show()
4981 ret = hist_field_debug_show(m, hist_data->var_refs[i], in hist_trigger_debug_show()
4987 if (hist_data->n_field_vars) in hist_trigger_debug_show()
4990 for (i = 0; i < hist_data->n_field_vars; i++) { in hist_trigger_debug_show()
4991 ret = field_var_debug_show(m, hist_data->field_vars[i], i, false); in hist_trigger_debug_show()
4996 ret = hist_actions_debug_show(m, hist_data); in hist_trigger_debug_show()
5077 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_print() local
5089 for_each_hist_key_field(i, hist_data) { in event_hist_trigger_print()
5090 field = hist_data->fields[i]; in event_hist_trigger_print()
5092 if (i > hist_data->n_vals) in event_hist_trigger_print()
5103 for_each_hist_val_field(i, hist_data) { in event_hist_trigger_print()
5104 field = hist_data->fields[i]; in event_hist_trigger_print()
5123 for_each_hist_val_field(i, hist_data) { in event_hist_trigger_print()
5124 field = hist_data->fields[i]; in event_hist_trigger_print()
5136 for (i = 0; i < hist_data->n_sort_keys; i++) { in event_hist_trigger_print()
5141 first_key_idx = hist_data->n_vals - hist_data->n_vars; in event_hist_trigger_print()
5143 sort_key = &hist_data->sort_keys[i]; in event_hist_trigger_print()
5156 idx += hist_data->n_vars; in event_hist_trigger_print()
5157 hist_field_print(m, hist_data->fields[idx]); in event_hist_trigger_print()
5163 seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits)); in event_hist_trigger_print()
5164 if (hist_data->enable_timestamps) in event_hist_trigger_print()
5165 seq_printf(m, ":clock=%s", hist_data->attrs->clock); in event_hist_trigger_print()
5167 print_actions_spec(m, hist_data); in event_hist_trigger_print()
5185 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_init() local
5187 if (!data->ref && hist_data->attrs->name) in event_hist_trigger_init()
5188 save_named_trigger(hist_data->attrs->name, data); in event_hist_trigger_init()
5195 static void unregister_field_var_hists(struct hist_trigger_data *hist_data) in unregister_field_var_hists() argument
5202 for (i = 0; i < hist_data->n_field_var_hists; i++) { in unregister_field_var_hists()
5203 file = hist_data->field_var_hists[i]->hist_data->event_file; in unregister_field_var_hists()
5204 cmd = hist_data->field_var_hists[i]->cmd; in unregister_field_var_hists()
5213 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_free() local
5225 remove_hist_vars(hist_data); in event_hist_trigger_free()
5227 unregister_field_var_hists(hist_data); in event_hist_trigger_free()
5229 destroy_hist_data(hist_data); in event_hist_trigger_free()
5282 struct hist_trigger_data *hist_data = data->private_data; in hist_clear() local
5289 tracing_map_clear(hist_data->map); in hist_clear()
5320 struct hist_trigger_data *hist_data, *hist_data_test; in hist_trigger_match() local
5331 hist_data = data->private_data; in hist_trigger_match()
5334 if (hist_data->n_vals != hist_data_test->n_vals || in hist_trigger_match()
5335 hist_data->n_fields != hist_data_test->n_fields || in hist_trigger_match()
5336 hist_data->n_sort_keys != hist_data_test->n_sort_keys) in hist_trigger_match()
5345 for_each_hist_field(i, hist_data) { in hist_trigger_match()
5346 key_field = hist_data->fields[i]; in hist_trigger_match()
5366 for (i = 0; i < hist_data->n_sort_keys; i++) { in hist_trigger_match()
5367 sort_key = &hist_data->sort_keys[i]; in hist_trigger_match()
5379 if (!actions_match(hist_data, hist_data_test)) in hist_trigger_match()
5389 struct hist_trigger_data *hist_data = data->private_data; in hist_register_trigger() local
5394 if (hist_data->attrs->name) { in hist_register_trigger()
5395 named_data = find_named_trigger(hist_data->attrs->name); in hist_register_trigger()
5399 hist_err(tr, HIST_ERR_NAMED_MISMATCH, errpos(hist_data->attrs->name)); in hist_register_trigger()
5406 if (hist_data->attrs->name && !named_data) in hist_register_trigger()
5415 if (hist_data->attrs->pause) in hist_register_trigger()
5417 else if (hist_data->attrs->cont) in hist_register_trigger()
5419 else if (hist_data->attrs->clear) in hist_register_trigger()
5429 if (hist_data->attrs->cont || hist_data->attrs->clear) { in hist_register_trigger()
5435 if (hist_data->attrs->pause) in hist_register_trigger()
5450 if (hist_data->enable_timestamps) { in hist_register_trigger()
5451 char *clock = hist_data->attrs->clock; in hist_register_trigger()
5453 ret = tracing_set_clock(file->tr, hist_data->attrs->clock); in hist_register_trigger()
5463 destroy_hist_data(hist_data); in hist_register_trigger()
5491 struct hist_trigger_data *hist_data = data->private_data; in have_hist_trigger_match() local
5497 if (hist_data->attrs->name) in have_hist_trigger_match()
5498 named_data = find_named_trigger(hist_data->attrs->name); in have_hist_trigger_match()
5515 struct hist_trigger_data *hist_data = data->private_data; in hist_trigger_check_refs() local
5520 if (hist_data->attrs->name) in hist_trigger_check_refs()
5521 named_data = find_named_trigger(hist_data->attrs->name); in hist_trigger_check_refs()
5527 hist_data = test->private_data; in hist_trigger_check_refs()
5528 if (check_var_refs(hist_data)) in hist_trigger_check_refs()
5541 struct hist_trigger_data *hist_data = data->private_data; in hist_unregister_trigger() local
5547 if (hist_data->attrs->name) in hist_unregister_trigger()
5548 named_data = find_named_trigger(hist_data->attrs->name); in hist_unregister_trigger()
5565 if (hist_data->enable_timestamps) { in hist_unregister_trigger()
5566 if (!hist_data->remove || unregistered) in hist_unregister_trigger()
5573 struct hist_trigger_data *hist_data; in hist_file_check_refs() local
5580 hist_data = test->private_data; in hist_file_check_refs()
5581 if (check_var_refs(hist_data)) in hist_file_check_refs()
5592 struct hist_trigger_data *hist_data; in hist_unreg_all() local
5603 hist_data = test->private_data; in hist_unreg_all()
5613 if (hist_data->enable_timestamps) in hist_unreg_all()
5629 struct hist_trigger_data *hist_data; in event_hist_trigger_func() local
5688 hist_data = create_hist_data(hist_trigger_bits, attrs, file, remove); in event_hist_trigger_func()
5689 if (IS_ERR(hist_data)) { in event_hist_trigger_func()
5691 return PTR_ERR(hist_data); in event_hist_trigger_func()
5709 trigger_data->private_data = hist_data; in event_hist_trigger_func()
5752 if (has_hist_vars(hist_data)) in event_hist_trigger_func()
5753 save_hist_vars(hist_data); in event_hist_trigger_func()
5755 ret = create_actions(hist_data); in event_hist_trigger_func()
5759 ret = tracing_map_init(hist_data->map); in event_hist_trigger_func()
5784 remove_hist_vars(hist_data); in event_hist_trigger_func()
5788 destroy_hist_data(hist_data); in event_hist_trigger_func()