Lines Matching refs:hist_data
111 struct hist_trigger_data *hist_data; member
124 struct hist_trigger_data *hist_data; member
273 #define for_each_hist_field(i, hist_data) \ argument
274 for ((i) = 0; (i) < (hist_data)->n_fields; (i)++)
276 #define for_each_hist_val_field(i, hist_data) \ argument
277 for ((i) = 0; (i) < (hist_data)->n_vals; (i)++)
279 #define for_each_hist_key_field(i, hist_data) \ argument
280 for ((i) = (hist_data)->n_vals; (i) < (hist_data)->n_fields; (i)++)
342 struct hist_trigger_data *hist_data; member
440 typedef void (*action_fn_t) (struct hist_trigger_data *hist_data,
526 struct hist_trigger_data *hist_data; member
560 struct hist_trigger_data *hist_data) in track_data_alloc() argument
576 data->hist_data = hist_data; in track_data_alloc()
1255 static void action_trace(struct hist_trigger_data *hist_data, in action_trace() argument
1267 struct hist_trigger_data *hist_data; member
1488 struct hist_trigger_data *hist_data = hist_field->hist_data; in hist_field_timestamp() local
1489 struct trace_array *tr = hist_data->event_file->tr; in hist_field_timestamp()
1493 if (hist_data->attrs->ts_in_usecs && trace_clock_in_ns(tr)) in hist_field_timestamp()
1528 hist_field->var.hist_data == var_data) in check_field_for_var_ref()
1546 static struct hist_field *find_var_ref(struct hist_trigger_data *hist_data, in find_var_ref() argument
1553 for (i = 0; i < hist_data->n_var_refs; i++) { in find_var_ref()
1554 hist_field = hist_data->var_refs[i]; in find_var_ref()
1576 static struct hist_field *find_any_var_ref(struct hist_trigger_data *hist_data, in find_any_var_ref() argument
1579 struct trace_array *tr = hist_data->event_file->tr; in find_any_var_ref()
1584 if (var_data->hist_data == hist_data) in find_any_var_ref()
1586 found = find_var_ref(var_data->hist_data, hist_data, var_idx); in find_any_var_ref()
1607 static bool check_var_refs(struct hist_trigger_data *hist_data) in check_var_refs() argument
1613 for_each_hist_field(i, hist_data) { in check_var_refs()
1614 field = hist_data->fields[i]; in check_var_refs()
1616 if (find_any_var_ref(hist_data, field->var.idx)) { in check_var_refs()
1626 static struct hist_var_data *find_hist_vars(struct hist_trigger_data *hist_data) in find_hist_vars() argument
1628 struct trace_array *tr = hist_data->event_file->tr; in find_hist_vars()
1632 if (var_data->hist_data == hist_data) { in find_hist_vars()
1667 static bool has_hist_vars(struct hist_trigger_data *hist_data) in has_hist_vars() argument
1672 for_each_hist_field(i, hist_data) { in has_hist_vars()
1673 hist_field = hist_data->fields[i]; in has_hist_vars()
1681 static int save_hist_vars(struct hist_trigger_data *hist_data) in save_hist_vars() argument
1683 struct trace_array *tr = hist_data->event_file->tr; in save_hist_vars()
1686 var_data = find_hist_vars(hist_data); in save_hist_vars()
1699 var_data->hist_data = hist_data; in save_hist_vars()
1705 static void remove_hist_vars(struct hist_trigger_data *hist_data) in remove_hist_vars() argument
1707 struct trace_array *tr = hist_data->event_file->tr; in remove_hist_vars()
1710 var_data = find_hist_vars(hist_data); in remove_hist_vars()
1714 if (WARN_ON(check_var_refs(hist_data))) in remove_hist_vars()
1724 static struct hist_field *find_var_field(struct hist_trigger_data *hist_data, in find_var_field() argument
1730 for_each_hist_field(i, hist_data) { in find_var_field()
1731 hist_field = hist_data->fields[i]; in find_var_field()
1742 static struct hist_field *find_var(struct hist_trigger_data *hist_data, in find_var() argument
1750 hist_field = find_var_field(hist_data, var_name); in find_var()
1779 var_hist_data = var_data->hist_data; in find_var_file()
1817 find_match_var(struct hist_trigger_data *hist_data, char *var_name) in find_match_var() argument
1819 struct trace_array *tr = hist_data->event_file->tr; in find_match_var()
1824 for (i = 0; i < hist_data->n_actions; i++) { in find_match_var()
1825 struct action_data *data = hist_data->actions[i]; in find_match_var()
1849 static struct hist_field *find_event_var(struct hist_trigger_data *hist_data, in find_event_var() argument
1854 struct trace_array *tr = hist_data->event_file->tr; in find_event_var()
1859 hist_field = find_match_var(hist_data, var_name); in find_event_var()
1892 static bool resolve_var_refs(struct hist_trigger_data *hist_data, void *key, in resolve_var_refs() argument
1902 for (i = 0; i < hist_data->n_var_refs; i++) { in resolve_var_refs()
1903 hist_field = hist_data->var_refs[i]; in resolve_var_refs()
1905 var_data = hist_field->var.hist_data; in resolve_var_refs()
1912 if ((self && var_data != hist_data) || in resolve_var_refs()
1913 (!self && var_data == hist_data)) in resolve_var_refs()
2236 struct hist_trigger_data *hist_data = elt->map->private_data; in hist_trigger_elt_data_alloc() local
2246 for_each_hist_key_field(i, hist_data) { in hist_trigger_elt_data_alloc()
2247 key_field = hist_data->fields[i]; in hist_trigger_elt_data_alloc()
2259 n_str = hist_data->n_field_var_str + hist_data->n_save_var_str; in hist_trigger_elt_data_alloc()
2436 static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data, in create_hist_field() argument
2450 hist_field->hist_data = hist_data; in create_hist_field()
2477 hist_field->operands[0] = create_hist_field(hist_data, field, fl, NULL); in create_hist_field()
2550 static void destroy_hist_fields(struct hist_trigger_data *hist_data) in destroy_hist_fields() argument
2555 if (hist_data->fields[i]) { in destroy_hist_fields()
2556 destroy_hist_field(hist_data->fields[i], 0); in destroy_hist_fields()
2557 hist_data->fields[i] = NULL; in destroy_hist_fields()
2561 for (i = 0; i < hist_data->n_var_refs; i++) { in destroy_hist_fields()
2562 WARN_ON(!(hist_data->var_refs[i]->flags & HIST_FIELD_FL_VAR_REF)); in destroy_hist_fields()
2563 __destroy_hist_field(hist_data->var_refs[i]); in destroy_hist_fields()
2564 hist_data->var_refs[i] = NULL; in destroy_hist_fields()
2575 ref_field->var.hist_data = var_field->hist_data; in init_var_ref()
2639 static struct hist_field *create_var_ref(struct hist_trigger_data *hist_data, in create_var_ref() argument
2646 ref_field = create_hist_field(var_field->hist_data, NULL, flags, NULL); in create_var_ref()
2653 hist_data->var_refs[hist_data->n_var_refs] = ref_field; in create_var_ref()
2654 ref_field->var_ref_idx = hist_data->n_var_refs++; in create_var_ref()
2668 static char *field_name_from_var(struct hist_trigger_data *hist_data, in field_name_from_var() argument
2674 for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) { in field_name_from_var()
2675 name = hist_data->attrs->var_defs.name[i]; in field_name_from_var()
2678 field = hist_data->attrs->var_defs.expr[i]; in field_name_from_var()
2688 static char *local_field_var_ref(struct hist_trigger_data *hist_data, in local_field_var_ref() argument
2695 call = hist_data->event_file->event_call; in local_field_var_ref()
2712 return field_name_from_var(hist_data, var_name); in local_field_var_ref()
2715 static struct hist_field *parse_var_ref(struct hist_trigger_data *hist_data, in parse_var_ref() argument
2720 struct trace_array *tr = hist_data->event_file->tr; in parse_var_ref()
2727 var_field = find_event_var(hist_data, system, event_name, var_name); in parse_var_ref()
2729 ref_field = create_var_ref(hist_data, var_field, in parse_var_ref()
2739 parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file, in parse_field() argument
2776 hist_data->enable_timestamps = true; in parse_field()
2778 hist_data->attrs->ts_in_usecs = true; in parse_field()
2795 static struct hist_field *create_alias(struct hist_trigger_data *hist_data, in create_alias() argument
2802 alias = create_hist_field(hist_data, NULL, flags, var_name); in create_alias()
2819 static struct hist_field *parse_atom(struct hist_trigger_data *hist_data, in parse_atom() argument
2846 s = local_field_var_ref(hist_data, ref_system, ref_event, ref_var); in parse_atom()
2848 hist_field = parse_var_ref(hist_data, ref_system, in parse_atom()
2852 hist_field = create_alias(hist_data, hist_field, var_name); in parse_atom()
2863 field = parse_field(hist_data, file, str, flags); in parse_atom()
2869 hist_field = create_hist_field(hist_data, field, *flags, var_name); in parse_atom()
2880 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
2885 static struct hist_field *parse_unary(struct hist_trigger_data *hist_data, in parse_unary() argument
2922 expr = create_hist_field(hist_data, NULL, flags, var_name); in parse_unary()
2929 operand1 = parse_expr(hist_data, file, str, operand_flags, NULL, ++level); in parse_unary()
2964 var = find_var_field(operand1->var.hist_data, operand1->name); in check_expr_operands()
2974 var = find_var_field(operand2->var.hist_data, operand2->name); in check_expr_operands()
2989 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, in parse_expr() argument
3007 return parse_atom(hist_data, file, str, &flags, var_name); in parse_expr()
3010 return parse_unary(hist_data, file, str, flags, var_name, ++level); in parse_expr()
3028 operand1 = parse_atom(hist_data, file, operand1_str, in parse_expr()
3038 operand2 = parse_expr(hist_data, file, str, operand_flags, NULL, ++level); in parse_expr()
3054 expr = create_hist_field(hist_data, NULL, flags, var_name); in parse_expr()
3094 static char *find_trigger_filter(struct hist_trigger_data *hist_data, in find_trigger_filter() argument
3101 if (test->private_data == hist_data) in find_trigger_filter()
3115 struct hist_trigger_data *hist_data, in compatible_keys() argument
3121 if (hist_data->n_fields - hist_data->n_vals != n_keys) in compatible_keys()
3124 i = hist_data->n_vals; in compatible_keys()
3128 hist_field = hist_data->fields[i + n]; in compatible_keys()
3146 struct hist_trigger_data *hist_data; in find_compatible_hist() local
3154 hist_data = test->private_data; in find_compatible_hist()
3156 if (compatible_keys(target_hist_data, hist_data, n_keys)) in find_compatible_hist()
3157 return hist_data; in find_compatible_hist()
3228 struct hist_trigger_data *hist_data; in create_field_var_hist() local
3256 hist_data = find_compatible_hist(target_hist_data, file); in create_field_var_hist()
3257 if (!hist_data) { in create_field_var_hist()
3281 for_each_hist_key_field(i, hist_data) { in create_field_var_hist()
3282 key_field = hist_data->fields[i]; in create_field_var_hist()
3296 saved_filter = find_trigger_filter(hist_data, file); in create_field_var_hist()
3310 var_hist->hist_data = hist_data; in create_field_var_hist()
3343 find_target_event_var(struct hist_trigger_data *hist_data, in find_target_event_var() argument
3346 struct trace_event_file *file = hist_data->event_file; in find_target_event_var()
3364 hist_field = find_var_field(hist_data, var_name); in find_target_event_var()
3399 static void update_field_vars(struct hist_trigger_data *hist_data, in update_field_vars() argument
3404 __update_field_vars(elt, rbe, rec, hist_data->field_vars, in update_field_vars()
3405 hist_data->n_field_vars, 0); in update_field_vars()
3408 static void save_track_data_vars(struct hist_trigger_data *hist_data, in save_track_data_vars() argument
3413 __update_field_vars(elt, rbe, rec, hist_data->save_vars, in save_track_data_vars()
3414 hist_data->n_save_vars, hist_data->n_field_var_str); in save_track_data_vars()
3417 static struct hist_field *create_var(struct hist_trigger_data *hist_data, in create_var() argument
3424 if (find_var(hist_data, file, name) && !hist_data->remove) { in create_var()
3435 idx = tracing_map_add_var(hist_data->map); in create_var()
3444 var->var.hist_data = var->hist_data = hist_data; in create_var()
3458 static struct field_var *create_field_var(struct hist_trigger_data *hist_data, in create_field_var() argument
3468 if (hist_data->n_field_vars >= SYNTH_FIELDS_MAX) { in create_field_var()
3474 val = parse_atom(hist_data, file, field_name, &flags, NULL); in create_field_var()
3481 var = create_var(hist_data, file, field_name, val->size, val->type); in create_field_var()
3566 static u64 get_track_val(struct hist_trigger_data *hist_data, in get_track_val() argument
3578 static void save_track_val(struct hist_trigger_data *hist_data, in save_track_val() argument
3587 static void save_track_data(struct hist_trigger_data *hist_data, in save_track_data() argument
3593 data->track_data.save_data(hist_data, elt, rec, rbe, key, data, var_ref_vals); in save_track_data()
3600 struct hist_trigger_data *hist_data; in check_track_val() local
3603 hist_data = data->track_data.track_var->hist_data; in check_track_val()
3604 track_val = get_track_val(hist_data, elt, data); in check_track_val()
3624 track_val = get_track_val(track_data->hist_data, context->elt, in cond_snapshot_update()
3643 static void save_track_data_snapshot(struct hist_trigger_data *hist_data, in save_track_data_snapshot() argument
3649 struct trace_event_file *file = hist_data->event_file; in save_track_data_snapshot()
3659 struct hist_trigger_data *hist_data,
3663 static struct action_data *snapshot_action(struct hist_trigger_data *hist_data) in snapshot_action() argument
3667 if (!hist_data->n_actions) in snapshot_action()
3670 for (i = 0; i < hist_data->n_actions; i++) { in snapshot_action()
3671 struct action_data *data = hist_data->actions[i]; in snapshot_action()
3681 struct hist_trigger_data *hist_data) in track_data_snapshot_print() argument
3683 struct trace_event_file *file = hist_data->event_file; in track_data_snapshot_print()
3694 action = snapshot_action(hist_data); in track_data_snapshot_print()
3704 hist_trigger_print_key(m, hist_data, track_data->key, &track_data->elt); in track_data_snapshot_print()
3712 static void save_track_data_snapshot(struct hist_trigger_data *hist_data, in save_track_data_snapshot() argument
3718 struct hist_trigger_data *hist_data) {} in track_data_snapshot_print() argument
3722 struct hist_trigger_data *hist_data, in track_data_print() argument
3726 u64 track_val = get_track_val(hist_data, elt, data); in track_data_print()
3737 for (i = 0; i < hist_data->n_save_vars; i++) { in track_data_print()
3738 struct hist_field *save_val = hist_data->save_vars[i]->val; in track_data_print()
3739 struct hist_field *save_var = hist_data->save_vars[i]->var; in track_data_print()
3754 static void ontrack_action(struct hist_trigger_data *hist_data, in ontrack_action() argument
3762 save_track_val(hist_data, elt, data, var_val); in ontrack_action()
3763 save_track_data(hist_data, elt, rec, rbe, key, data, var_ref_vals); in ontrack_action()
3786 static void track_data_destroy(struct hist_trigger_data *hist_data, in track_data_destroy() argument
3789 struct trace_event_file *file = hist_data->event_file; in track_data_destroy()
3797 if (track_data && track_data->hist_data == hist_data) { in track_data_destroy()
3808 static int action_create(struct hist_trigger_data *hist_data,
3811 static int track_data_create(struct hist_trigger_data *hist_data, in track_data_create() argument
3815 struct trace_event_file *file = hist_data->event_file; in track_data_create()
3827 var_field = find_target_event_var(hist_data, NULL, NULL, track_data_var_str); in track_data_create()
3833 ref_field = create_var_ref(hist_data, var_field, NULL, NULL); in track_data_create()
3840 track_var = create_var(hist_data, file, "__max", sizeof(u64), "u64"); in track_data_create()
3848 track_var = create_var(hist_data, file, "__change", sizeof(u64), "u64"); in track_data_create()
3856 ret = action_create(hist_data, data); in track_data_create()
4012 static struct action_data *track_data_parse(struct hist_trigger_data *hist_data, in track_data_parse() argument
4035 ret = action_parse(hist_data->event_file->tr, str, data, handler); in track_data_parse()
4041 track_data_destroy(hist_data, data); in track_data_parse()
4065 static void destroy_field_vars(struct hist_trigger_data *hist_data) in destroy_field_vars() argument
4069 for (i = 0; i < hist_data->n_field_vars; i++) in destroy_field_vars()
4070 destroy_field_var(hist_data->field_vars[i]); in destroy_field_vars()
4073 static void save_field_var(struct hist_trigger_data *hist_data, in save_field_var() argument
4076 hist_data->field_vars[hist_data->n_field_vars++] = field_var; in save_field_var()
4079 hist_data->n_field_var_str++; in save_field_var()
4101 trace_action_find_var(struct hist_trigger_data *hist_data, in trace_action_find_var() argument
4105 struct trace_array *tr = hist_data->event_file->tr; in trace_action_find_var()
4110 hist_field = find_target_event_var(hist_data, system, event, var); in trace_action_find_var()
4117 hist_field = find_event_var(hist_data, system, event, var); in trace_action_find_var()
4127 trace_action_create_field_var(struct hist_trigger_data *hist_data, in trace_action_create_field_var() argument
4140 field_var = create_target_field_var(hist_data, system, event, var); in trace_action_create_field_var()
4143 save_field_var(hist_data, field_var); in trace_action_create_field_var()
4164 hist_field = create_field_var_hist(hist_data, system, event, var); in trace_action_create_field_var()
4176 static int trace_action_create(struct hist_trigger_data *hist_data, in trace_action_create() argument
4179 struct trace_array *tr = hist_data->event_file->tr; in trace_action_create()
4203 var_ref_idx = hist_data->n_var_refs; in trace_action_create()
4228 hist_field = trace_action_find_var(hist_data, data, in trace_action_create()
4232 hist_field = trace_action_create_field_var(hist_data, in trace_action_create()
4245 var_ref = create_var_ref(hist_data, hist_field, in trace_action_create()
4280 static int action_create(struct hist_trigger_data *hist_data, in action_create() argument
4283 struct trace_event_file *file = hist_data->event_file; in action_create()
4292 return trace_action_create(hist_data, data); in action_create()
4295 track_data = track_data_alloc(hist_data->key_size, data, hist_data); in action_create()
4310 if (hist_data->n_save_vars) { in action_create()
4323 field_var = create_target_field_var(hist_data, NULL, NULL, param); in action_create()
4332 hist_data->save_vars[hist_data->n_save_vars++] = field_var; in action_create()
4334 hist_data->n_save_var_str++; in action_create()
4342 static int onmatch_create(struct hist_trigger_data *hist_data, in onmatch_create() argument
4345 return action_create(hist_data, data); in onmatch_create()
4398 static int create_hitcount_val(struct hist_trigger_data *hist_data) in create_hitcount_val() argument
4400 hist_data->fields[HITCOUNT_IDX] = in create_hitcount_val()
4401 create_hist_field(hist_data, NULL, HIST_FIELD_FL_HITCOUNT, NULL); in create_hitcount_val()
4402 if (!hist_data->fields[HITCOUNT_IDX]) in create_hitcount_val()
4405 hist_data->n_vals++; in create_hitcount_val()
4406 hist_data->n_fields++; in create_hitcount_val()
4408 if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX)) in create_hitcount_val()
4414 static int __create_val_field(struct hist_trigger_data *hist_data, in __create_val_field() argument
4423 hist_field = parse_expr(hist_data, file, field_str, flags, var_name, 0); in __create_val_field()
4429 hist_data->fields[val_idx] = hist_field; in __create_val_field()
4431 ++hist_data->n_vals; in __create_val_field()
4432 ++hist_data->n_fields; in __create_val_field()
4434 if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX)) in __create_val_field()
4440 static int create_val_field(struct hist_trigger_data *hist_data, in create_val_field() argument
4448 return __create_val_field(hist_data, val_idx, file, NULL, field_str, 0); in create_val_field()
4451 static int create_var_field(struct hist_trigger_data *hist_data, in create_var_field() argument
4456 struct trace_array *tr = hist_data->event_file->tr; in create_var_field()
4462 if (find_var(hist_data, file, var_name) && !hist_data->remove) { in create_var_field()
4468 hist_data->n_vars++; in create_var_field()
4469 if (WARN_ON(hist_data->n_vars > TRACING_MAP_VARS_MAX)) in create_var_field()
4472 return __create_val_field(hist_data, val_idx, file, var_name, expr_str, flags); in create_var_field()
4475 static int create_val_fields(struct hist_trigger_data *hist_data, in create_val_fields() argument
4482 ret = create_hitcount_val(hist_data); in create_val_fields()
4486 fields_str = hist_data->attrs->vals_str; in create_val_fields()
4503 ret = create_val_field(hist_data, j++, file, field_str); in create_val_fields()
4514 static int create_key_field(struct hist_trigger_data *hist_data, in create_key_field() argument
4520 struct trace_array *tr = hist_data->event_file->tr; in create_key_field()
4534 hist_field = create_hist_field(hist_data, NULL, flags, NULL); in create_key_field()
4536 hist_field = parse_expr(hist_data, file, field_str, flags, in create_key_field()
4553 hist_data->fields[key_idx] = hist_field; in create_key_field()
4556 hist_data->fields[key_idx]->size = key_size; in create_key_field()
4557 hist_data->fields[key_idx]->offset = key_offset; in create_key_field()
4559 hist_data->key_size += key_size; in create_key_field()
4561 if (hist_data->key_size > HIST_KEY_SIZE_MAX) { in create_key_field()
4566 hist_data->n_keys++; in create_key_field()
4567 hist_data->n_fields++; in create_key_field()
4569 if (WARN_ON(hist_data->n_keys > TRACING_MAP_KEYS_MAX)) in create_key_field()
4577 static int create_key_fields(struct hist_trigger_data *hist_data, in create_key_fields() argument
4580 unsigned int i, key_offset = 0, n_vals = hist_data->n_vals; in create_key_fields()
4584 fields_str = hist_data->attrs->keys_str; in create_key_fields()
4596 ret = create_key_field(hist_data, i, key_offset, in create_key_fields()
4611 static int create_var_fields(struct hist_trigger_data *hist_data, in create_var_fields() argument
4614 unsigned int i, j = hist_data->n_vals; in create_var_fields()
4617 unsigned int n_vars = hist_data->attrs->var_defs.n_vars; in create_var_fields()
4620 char *var_name = hist_data->attrs->var_defs.name[i]; in create_var_fields()
4621 char *expr = hist_data->attrs->var_defs.expr[i]; in create_var_fields()
4623 ret = create_var_field(hist_data, j++, file, var_name, expr); in create_var_fields()
4631 static void free_var_defs(struct hist_trigger_data *hist_data) in free_var_defs() argument
4635 for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) { in free_var_defs()
4636 kfree(hist_data->attrs->var_defs.name[i]); in free_var_defs()
4637 kfree(hist_data->attrs->var_defs.expr[i]); in free_var_defs()
4640 hist_data->attrs->var_defs.n_vars = 0; in free_var_defs()
4643 static int parse_var_defs(struct hist_trigger_data *hist_data) in parse_var_defs() argument
4645 struct trace_array *tr = hist_data->event_file->tr; in parse_var_defs()
4650 for (i = 0; i < hist_data->attrs->n_assignments; i++) { in parse_var_defs()
4651 str = hist_data->attrs->assignment_str[i]; in parse_var_defs()
4676 hist_data->attrs->var_defs.name[n_vars] = s; in parse_var_defs()
4680 kfree(hist_data->attrs->var_defs.name[n_vars]); in parse_var_defs()
4684 hist_data->attrs->var_defs.expr[n_vars++] = s; in parse_var_defs()
4686 hist_data->attrs->var_defs.n_vars = n_vars; in parse_var_defs()
4692 free_var_defs(hist_data); in parse_var_defs()
4697 static int create_hist_fields(struct hist_trigger_data *hist_data, in create_hist_fields() argument
4702 ret = parse_var_defs(hist_data); in create_hist_fields()
4706 ret = create_val_fields(hist_data, file); in create_hist_fields()
4710 ret = create_var_fields(hist_data, file); in create_hist_fields()
4714 ret = create_key_fields(hist_data, file); in create_hist_fields()
4718 free_var_defs(hist_data); in create_hist_fields()
4737 static int create_sort_keys(struct hist_trigger_data *hist_data) in create_sort_keys() argument
4739 char *fields_str = hist_data->attrs->sort_key_str; in create_sort_keys()
4744 hist_data->n_sort_keys = 1; /* we always have at least one, hitcount */ in create_sort_keys()
4760 sort_key = &hist_data->sort_keys[i]; in create_sort_keys()
4790 for (j = 1, k = 1; j < hist_data->n_fields; j++) { in create_sort_keys()
4793 hist_field = hist_data->fields[j]; in create_sort_keys()
4812 if (j == hist_data->n_fields) { in create_sort_keys()
4818 hist_data->n_sort_keys = i; in create_sort_keys()
4823 static void destroy_actions(struct hist_trigger_data *hist_data) in destroy_actions() argument
4827 for (i = 0; i < hist_data->n_actions; i++) { in destroy_actions()
4828 struct action_data *data = hist_data->actions[i]; in destroy_actions()
4834 track_data_destroy(hist_data, data); in destroy_actions()
4840 static int parse_actions(struct hist_trigger_data *hist_data) in parse_actions() argument
4842 struct trace_array *tr = hist_data->event_file->tr; in parse_actions()
4849 for (i = 0; i < hist_data->attrs->n_actions; i++) { in parse_actions()
4850 str = hist_data->attrs->action_str[i]; in parse_actions()
4863 data = track_data_parse(hist_data, action_str, in parse_actions()
4872 data = track_data_parse(hist_data, action_str, in parse_actions()
4883 hist_data->actions[hist_data->n_actions++] = data; in parse_actions()
4889 static int create_actions(struct hist_trigger_data *hist_data) in create_actions() argument
4895 for (i = 0; i < hist_data->attrs->n_actions; i++) { in create_actions()
4896 data = hist_data->actions[i]; in create_actions()
4899 ret = onmatch_create(hist_data, data); in create_actions()
4904 ret = track_data_create(hist_data, data); in create_actions()
4917 struct hist_trigger_data *hist_data, in print_actions() argument
4922 for (i = 0; i < hist_data->n_actions; i++) { in print_actions()
4923 struct action_data *data = hist_data->actions[i]; in print_actions()
4930 track_data_print(m, hist_data, elt, data); in print_actions()
4935 struct hist_trigger_data *hist_data, in print_action_spec() argument
4941 for (i = 0; i < hist_data->n_save_vars; i++) { in print_action_spec()
4942 seq_printf(m, "%s", hist_data->save_vars[i]->var->var.name); in print_action_spec()
4943 if (i < hist_data->n_save_vars - 1) in print_action_spec()
4958 struct hist_trigger_data *hist_data, in print_track_data_spec() argument
4968 print_action_spec(m, hist_data, data); in print_track_data_spec()
4974 struct hist_trigger_data *hist_data, in print_onmatch_spec() argument
4982 print_action_spec(m, hist_data, data); in print_onmatch_spec()
4987 static bool actions_match(struct hist_trigger_data *hist_data, in actions_match() argument
4992 if (hist_data->n_actions != hist_data_test->n_actions) in actions_match()
4995 for (i = 0; i < hist_data->n_actions; i++) { in actions_match()
4996 struct action_data *data = hist_data->actions[i]; in actions_match()
5046 struct hist_trigger_data *hist_data) in print_actions_spec() argument
5050 for (i = 0; i < hist_data->n_actions; i++) { in print_actions_spec()
5051 struct action_data *data = hist_data->actions[i]; in print_actions_spec()
5054 print_onmatch_spec(m, hist_data, data); in print_actions_spec()
5057 print_track_data_spec(m, hist_data, data); in print_actions_spec()
5061 static void destroy_field_var_hists(struct hist_trigger_data *hist_data) in destroy_field_var_hists() argument
5065 for (i = 0; i < hist_data->n_field_var_hists; i++) { in destroy_field_var_hists()
5066 kfree(hist_data->field_var_hists[i]->cmd); in destroy_field_var_hists()
5067 kfree(hist_data->field_var_hists[i]); in destroy_field_var_hists()
5071 static void destroy_hist_data(struct hist_trigger_data *hist_data) in destroy_hist_data() argument
5073 if (!hist_data) in destroy_hist_data()
5076 destroy_hist_trigger_attrs(hist_data->attrs); in destroy_hist_data()
5077 destroy_hist_fields(hist_data); in destroy_hist_data()
5078 tracing_map_destroy(hist_data->map); in destroy_hist_data()
5080 destroy_actions(hist_data); in destroy_hist_data()
5081 destroy_field_vars(hist_data); in destroy_hist_data()
5082 destroy_field_var_hists(hist_data); in destroy_hist_data()
5084 kfree(hist_data); in destroy_hist_data()
5087 static int create_tracing_map_fields(struct hist_trigger_data *hist_data) in create_tracing_map_fields() argument
5089 struct tracing_map *map = hist_data->map; in create_tracing_map_fields()
5094 for_each_hist_field(i, hist_data) { in create_tracing_map_fields()
5095 hist_field = hist_data->fields[i]; in create_tracing_map_fields()
5125 hist_field->var.hist_data = hist_data; in create_tracing_map_fields()
5139 struct hist_trigger_data *hist_data; in create_hist_data() local
5142 hist_data = kzalloc(sizeof(*hist_data), GFP_KERNEL); in create_hist_data()
5143 if (!hist_data) in create_hist_data()
5146 hist_data->attrs = attrs; in create_hist_data()
5147 hist_data->remove = remove; in create_hist_data()
5148 hist_data->event_file = file; in create_hist_data()
5150 ret = parse_actions(hist_data); in create_hist_data()
5154 ret = create_hist_fields(hist_data, file); in create_hist_data()
5158 ret = create_sort_keys(hist_data); in create_hist_data()
5164 hist_data->map = tracing_map_create(map_bits, hist_data->key_size, in create_hist_data()
5165 map_ops, hist_data); in create_hist_data()
5166 if (IS_ERR(hist_data->map)) { in create_hist_data()
5167 ret = PTR_ERR(hist_data->map); in create_hist_data()
5168 hist_data->map = NULL; in create_hist_data()
5172 ret = create_tracing_map_fields(hist_data); in create_hist_data()
5176 return hist_data; in create_hist_data()
5178 hist_data->attrs = NULL; in create_hist_data()
5180 destroy_hist_data(hist_data); in create_hist_data()
5182 hist_data = ERR_PTR(ret); in create_hist_data()
5187 static void hist_trigger_elt_update(struct hist_trigger_data *hist_data, in hist_trigger_elt_update() argument
5200 for_each_hist_val_field(i, hist_data) { in hist_trigger_elt_update()
5201 hist_field = hist_data->fields[i]; in hist_trigger_elt_update()
5211 for_each_hist_key_field(i, hist_data) { in hist_trigger_elt_update()
5212 hist_field = hist_data->fields[i]; in hist_trigger_elt_update()
5220 update_field_vars(hist_data, elt, rbe, rec); in hist_trigger_elt_update()
5249 hist_trigger_actions(struct hist_trigger_data *hist_data, in hist_trigger_actions() argument
5257 for (i = 0; i < hist_data->n_actions; i++) { in hist_trigger_actions()
5258 data = hist_data->actions[i]; in hist_trigger_actions()
5259 data->fn(hist_data, elt, rec, rbe, key, data, var_ref_vals); in hist_trigger_actions()
5266 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger() local
5267 bool use_compound_key = (hist_data->n_keys > 1); in event_hist_trigger()
5277 memset(compound_key, 0, hist_data->key_size); in event_hist_trigger()
5279 for_each_hist_key_field(i, hist_data) { in event_hist_trigger()
5280 key_field = hist_data->fields[i]; in event_hist_trigger()
5303 if (hist_data->n_var_refs && in event_hist_trigger()
5304 !resolve_var_refs(hist_data, key, var_ref_vals, false)) in event_hist_trigger()
5307 elt = tracing_map_insert(hist_data->map, key); in event_hist_trigger()
5311 hist_trigger_elt_update(hist_data, elt, rec, rbe, var_ref_vals); in event_hist_trigger()
5313 if (resolve_var_refs(hist_data, key, var_ref_vals, true)) in event_hist_trigger()
5314 hist_trigger_actions(hist_data, elt, rec, rbe, key, var_ref_vals); in event_hist_trigger()
5336 struct hist_trigger_data *hist_data, in hist_trigger_print_key() argument
5349 for_each_hist_key_field(i, hist_data) { in hist_trigger_print_key()
5350 key_field = hist_data->fields[i]; in hist_trigger_print_key()
5352 if (i > hist_data->n_vals) in hist_trigger_print_key()
5417 struct hist_trigger_data *hist_data, in hist_trigger_entry_print() argument
5424 hist_trigger_print_key(m, hist_data, key, elt); in hist_trigger_entry_print()
5429 for (i = 1; i < hist_data->n_vals; i++) { in hist_trigger_entry_print()
5430 field_name = hist_field_name(hist_data->fields[i], 0); in hist_trigger_entry_print()
5432 if (hist_data->fields[i]->flags & HIST_FIELD_FL_VAR || in hist_trigger_entry_print()
5433 hist_data->fields[i]->flags & HIST_FIELD_FL_EXPR) in hist_trigger_entry_print()
5436 if (hist_data->fields[i]->flags & HIST_FIELD_FL_HEX) { in hist_trigger_entry_print()
5445 print_actions(m, hist_data, elt); in hist_trigger_entry_print()
5451 struct hist_trigger_data *hist_data) in print_entries() argument
5454 struct tracing_map *map = hist_data->map; in print_entries()
5457 n_entries = tracing_map_sort_entries(map, hist_data->sort_keys, in print_entries()
5458 hist_data->n_sort_keys, in print_entries()
5464 hist_trigger_entry_print(m, hist_data, in print_entries()
5476 struct hist_trigger_data *hist_data; in hist_trigger_show() local
5486 hist_data = data->private_data; in hist_trigger_show()
5487 n_entries = print_entries(m, hist_data); in hist_trigger_show()
5491 track_data_snapshot_print(m, hist_data); in hist_trigger_show()
5494 (u64)atomic64_read(&hist_data->map->hits), in hist_trigger_show()
5495 n_entries, (u64)atomic64_read(&hist_data->map->drops)); in hist_trigger_show()
5573 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_print() local
5585 for_each_hist_key_field(i, hist_data) { in event_hist_trigger_print()
5586 field = hist_data->fields[i]; in event_hist_trigger_print()
5588 if (i > hist_data->n_vals) in event_hist_trigger_print()
5599 for_each_hist_val_field(i, hist_data) { in event_hist_trigger_print()
5600 field = hist_data->fields[i]; in event_hist_trigger_print()
5619 for_each_hist_val_field(i, hist_data) { in event_hist_trigger_print()
5620 field = hist_data->fields[i]; in event_hist_trigger_print()
5632 for (i = 0; i < hist_data->n_sort_keys; i++) { in event_hist_trigger_print()
5637 first_key_idx = hist_data->n_vals - hist_data->n_vars; in event_hist_trigger_print()
5639 sort_key = &hist_data->sort_keys[i]; in event_hist_trigger_print()
5652 idx += hist_data->n_vars; in event_hist_trigger_print()
5653 hist_field_print(m, hist_data->fields[idx]); in event_hist_trigger_print()
5659 seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits)); in event_hist_trigger_print()
5660 if (hist_data->enable_timestamps) in event_hist_trigger_print()
5661 seq_printf(m, ":clock=%s", hist_data->attrs->clock); in event_hist_trigger_print()
5663 print_actions_spec(m, hist_data); in event_hist_trigger_print()
5681 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_init() local
5683 if (!data->ref && hist_data->attrs->name) in event_hist_trigger_init()
5684 save_named_trigger(hist_data->attrs->name, data); in event_hist_trigger_init()
5691 static void unregister_field_var_hists(struct hist_trigger_data *hist_data) in unregister_field_var_hists() argument
5698 for (i = 0; i < hist_data->n_field_var_hists; i++) { in unregister_field_var_hists()
5699 file = hist_data->field_var_hists[i]->hist_data->event_file; in unregister_field_var_hists()
5700 cmd = hist_data->field_var_hists[i]->cmd; in unregister_field_var_hists()
5709 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_free() local
5721 remove_hist_vars(hist_data); in event_hist_trigger_free()
5723 unregister_field_var_hists(hist_data); in event_hist_trigger_free()
5725 destroy_hist_data(hist_data); in event_hist_trigger_free()
5778 struct hist_trigger_data *hist_data = data->private_data; in hist_clear() local
5785 tracing_map_clear(hist_data->map); in hist_clear()
5816 struct hist_trigger_data *hist_data, *hist_data_test; in hist_trigger_match() local
5827 hist_data = data->private_data; in hist_trigger_match()
5830 if (hist_data->n_vals != hist_data_test->n_vals || in hist_trigger_match()
5831 hist_data->n_fields != hist_data_test->n_fields || in hist_trigger_match()
5832 hist_data->n_sort_keys != hist_data_test->n_sort_keys) in hist_trigger_match()
5841 for_each_hist_field(i, hist_data) { in hist_trigger_match()
5842 key_field = hist_data->fields[i]; in hist_trigger_match()
5862 for (i = 0; i < hist_data->n_sort_keys; i++) { in hist_trigger_match()
5863 sort_key = &hist_data->sort_keys[i]; in hist_trigger_match()
5875 if (!actions_match(hist_data, hist_data_test)) in hist_trigger_match()
5885 struct hist_trigger_data *hist_data = data->private_data; in hist_register_trigger() local
5890 if (hist_data->attrs->name) { in hist_register_trigger()
5891 named_data = find_named_trigger(hist_data->attrs->name); in hist_register_trigger()
5895 hist_err(tr, HIST_ERR_NAMED_MISMATCH, errpos(hist_data->attrs->name)); in hist_register_trigger()
5902 if (hist_data->attrs->name && !named_data) in hist_register_trigger()
5909 if (hist_data->attrs->pause) in hist_register_trigger()
5911 else if (hist_data->attrs->cont) in hist_register_trigger()
5913 else if (hist_data->attrs->clear) in hist_register_trigger()
5923 if (hist_data->attrs->cont || hist_data->attrs->clear) { in hist_register_trigger()
5929 if (hist_data->attrs->pause) in hist_register_trigger()
5944 if (hist_data->enable_timestamps) { in hist_register_trigger()
5945 char *clock = hist_data->attrs->clock; in hist_register_trigger()
5947 ret = tracing_set_clock(file->tr, hist_data->attrs->clock); in hist_register_trigger()
5957 destroy_hist_data(hist_data); in hist_register_trigger()
5985 struct hist_trigger_data *hist_data = data->private_data; in have_hist_trigger_match() local
5989 if (hist_data->attrs->name) in have_hist_trigger_match()
5990 named_data = find_named_trigger(hist_data->attrs->name); in have_hist_trigger_match()
6007 struct hist_trigger_data *hist_data = data->private_data; in hist_trigger_check_refs() local
6010 if (hist_data->attrs->name) in hist_trigger_check_refs()
6011 named_data = find_named_trigger(hist_data->attrs->name); in hist_trigger_check_refs()
6017 hist_data = test->private_data; in hist_trigger_check_refs()
6018 if (check_var_refs(hist_data)) in hist_trigger_check_refs()
6031 struct hist_trigger_data *hist_data = data->private_data; in hist_unregister_trigger() local
6035 if (hist_data->attrs->name) in hist_unregister_trigger()
6036 named_data = find_named_trigger(hist_data->attrs->name); in hist_unregister_trigger()
6053 if (hist_data->enable_timestamps) { in hist_unregister_trigger()
6054 if (!hist_data->remove || unregistered) in hist_unregister_trigger()
6061 struct hist_trigger_data *hist_data; in hist_file_check_refs() local
6066 hist_data = test->private_data; in hist_file_check_refs()
6067 if (check_var_refs(hist_data)) in hist_file_check_refs()
6078 struct hist_trigger_data *hist_data; in hist_unreg_all() local
6089 hist_data = test->private_data; in hist_unreg_all()
6099 if (hist_data->enable_timestamps) in hist_unreg_all()
6115 struct hist_trigger_data *hist_data; in event_hist_trigger_func() local
6174 hist_data = create_hist_data(hist_trigger_bits, attrs, file, remove); in event_hist_trigger_func()
6175 if (IS_ERR(hist_data)) { in event_hist_trigger_func()
6177 return PTR_ERR(hist_data); in event_hist_trigger_func()
6195 trigger_data->private_data = hist_data; in event_hist_trigger_func()
6238 if (has_hist_vars(hist_data)) in event_hist_trigger_func()
6239 save_hist_vars(hist_data); in event_hist_trigger_func()
6241 ret = create_actions(hist_data); in event_hist_trigger_func()
6245 ret = tracing_map_init(hist_data->map); in event_hist_trigger_func()
6270 remove_hist_vars(hist_data); in event_hist_trigger_func()
6274 destroy_hist_data(hist_data); in event_hist_trigger_func()