Lines Matching refs:hist_data
154 struct hist_trigger_data *hist_data; member
164 struct hist_trigger_data *hist_data; member
476 #define for_each_hist_field(i, hist_data) \ argument
477 for ((i) = 0; (i) < (hist_data)->n_fields; (i)++)
479 #define for_each_hist_val_field(i, hist_data) \ argument
480 for ((i) = 0; (i) < (hist_data)->n_vals; (i)++)
482 #define for_each_hist_key_field(i, hist_data) \ argument
483 for ((i) = (hist_data)->n_vals; (i) < (hist_data)->n_fields; (i)++)
547 struct hist_trigger_data *hist_data; member
585 typedef void (*action_fn_t) (struct hist_trigger_data *hist_data,
673 struct hist_trigger_data *hist_data; member
727 struct hist_trigger_data *hist_data) in track_data_alloc() argument
743 data->hist_data = hist_data; in track_data_alloc()
846 static void action_trace(struct hist_trigger_data *hist_data, in action_trace() argument
859 struct hist_trigger_data *hist_data; member
868 struct hist_trigger_data *hist_data = hist_field->hist_data; in hist_field_timestamp() local
869 struct trace_array *tr = hist_data->event_file->tr; in hist_field_timestamp()
873 if (hist_data->attrs->ts_in_usecs && trace_clock_in_ns(tr)) in hist_field_timestamp()
918 hist_field->var.hist_data == var_data) in check_field_for_var_ref()
936 static struct hist_field *find_var_ref(struct hist_trigger_data *hist_data, in find_var_ref() argument
943 for (i = 0; i < hist_data->n_var_refs; i++) { in find_var_ref()
944 hist_field = hist_data->var_refs[i]; in find_var_ref()
966 static struct hist_field *find_any_var_ref(struct hist_trigger_data *hist_data, in find_any_var_ref() argument
969 struct trace_array *tr = hist_data->event_file->tr; in find_any_var_ref()
974 if (var_data->hist_data == hist_data) in find_any_var_ref()
976 found = find_var_ref(var_data->hist_data, hist_data, var_idx); in find_any_var_ref()
997 static bool check_var_refs(struct hist_trigger_data *hist_data) in check_var_refs() argument
1003 for_each_hist_field(i, hist_data) { in check_var_refs()
1004 field = hist_data->fields[i]; in check_var_refs()
1006 if (find_any_var_ref(hist_data, field->var.idx)) { in check_var_refs()
1016 static struct hist_var_data *find_hist_vars(struct hist_trigger_data *hist_data) in find_hist_vars() argument
1018 struct trace_array *tr = hist_data->event_file->tr; in find_hist_vars()
1022 if (var_data->hist_data == hist_data) { in find_hist_vars()
1057 static bool has_hist_vars(struct hist_trigger_data *hist_data) in has_hist_vars() argument
1062 for_each_hist_field(i, hist_data) { in has_hist_vars()
1063 hist_field = hist_data->fields[i]; in has_hist_vars()
1071 static int save_hist_vars(struct hist_trigger_data *hist_data) in save_hist_vars() argument
1073 struct trace_array *tr = hist_data->event_file->tr; in save_hist_vars()
1076 var_data = find_hist_vars(hist_data); in save_hist_vars()
1089 var_data->hist_data = hist_data; in save_hist_vars()
1095 static void remove_hist_vars(struct hist_trigger_data *hist_data) in remove_hist_vars() argument
1097 struct trace_array *tr = hist_data->event_file->tr; in remove_hist_vars()
1100 var_data = find_hist_vars(hist_data); in remove_hist_vars()
1104 if (WARN_ON(check_var_refs(hist_data))) in remove_hist_vars()
1114 static struct hist_field *find_var_field(struct hist_trigger_data *hist_data, in find_var_field() argument
1120 for_each_hist_field(i, hist_data) { in find_var_field()
1121 hist_field = hist_data->fields[i]; in find_var_field()
1132 static struct hist_field *find_var(struct hist_trigger_data *hist_data, in find_var() argument
1142 hist_field = find_var_field(hist_data, var_name); in find_var()
1171 var_hist_data = var_data->hist_data; in find_var_file()
1211 find_match_var(struct hist_trigger_data *hist_data, char *var_name) in find_match_var() argument
1213 struct trace_array *tr = hist_data->event_file->tr; in find_match_var()
1218 for (i = 0; i < hist_data->n_actions; i++) { in find_match_var()
1219 struct action_data *data = hist_data->actions[i]; in find_match_var()
1243 static struct hist_field *find_event_var(struct hist_trigger_data *hist_data, in find_event_var() argument
1248 struct trace_array *tr = hist_data->event_file->tr; in find_event_var()
1253 hist_field = find_match_var(hist_data, var_name); in find_event_var()
1287 static bool resolve_var_refs(struct hist_trigger_data *hist_data, void *key, in resolve_var_refs() argument
1297 for (i = 0; i < hist_data->n_var_refs; i++) { in resolve_var_refs()
1298 hist_field = hist_data->var_refs[i]; in resolve_var_refs()
1300 var_data = hist_field->var.hist_data; in resolve_var_refs()
1307 if ((self && var_data != hist_data) || in resolve_var_refs()
1308 (!self && var_data == hist_data)) in resolve_var_refs()
1637 struct hist_trigger_data *hist_data = elt->map->private_data; in hist_trigger_elt_data_alloc() local
1647 for_each_hist_field(i, hist_data) { in hist_trigger_elt_data_alloc()
1648 hist_field = hist_data->fields[i]; in hist_trigger_elt_data_alloc()
1660 n_str = hist_data->n_field_var_str + hist_data->n_save_var_str + in hist_trigger_elt_data_alloc()
1661 hist_data->n_var_str; in hist_trigger_elt_data_alloc()
1949 static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data, in create_hist_field() argument
1965 hist_field->hist_data = hist_data; in create_hist_field()
2007 hist_field->operands[0] = create_hist_field(hist_data, field, fl, NULL); in create_hist_field()
2090 static void destroy_hist_fields(struct hist_trigger_data *hist_data) in destroy_hist_fields() argument
2095 if (hist_data->fields[i]) { in destroy_hist_fields()
2096 destroy_hist_field(hist_data->fields[i], 0); in destroy_hist_fields()
2097 hist_data->fields[i] = NULL; in destroy_hist_fields()
2101 for (i = 0; i < hist_data->n_var_refs; i++) { in destroy_hist_fields()
2102 WARN_ON(!(hist_data->var_refs[i]->flags & HIST_FIELD_FL_VAR_REF)); in destroy_hist_fields()
2103 __destroy_hist_field(hist_data->var_refs[i]); in destroy_hist_fields()
2104 hist_data->var_refs[i] = NULL; in destroy_hist_fields()
2115 ref_field->var.hist_data = var_field->hist_data; in init_var_ref()
2167 static int find_var_ref_idx(struct hist_trigger_data *hist_data, in find_var_ref_idx() argument
2173 for (i = 0; i < hist_data->n_var_refs; i++) { in find_var_ref_idx()
2174 ref_field = hist_data->var_refs[i]; in find_var_ref_idx()
2176 ref_field->var.hist_data == var_field->hist_data) in find_var_ref_idx()
2198 static struct hist_field *create_var_ref(struct hist_trigger_data *hist_data, in create_var_ref() argument
2207 for (i = 0; i < hist_data->n_var_refs; i++) { in create_var_ref()
2208 ref_field = hist_data->var_refs[i]; in create_var_ref()
2210 ref_field->var.hist_data == var_field->hist_data) { in create_var_ref()
2216 if (hist_data->n_var_refs >= TRACING_MAP_VARS_MAX) in create_var_ref()
2218 ref_field = create_hist_field(var_field->hist_data, NULL, flags, NULL); in create_var_ref()
2225 hist_data->var_refs[hist_data->n_var_refs] = ref_field; in create_var_ref()
2226 ref_field->var_ref_idx = hist_data->n_var_refs++; in create_var_ref()
2240 static char *field_name_from_var(struct hist_trigger_data *hist_data, in field_name_from_var() argument
2246 for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) { in field_name_from_var()
2247 name = hist_data->attrs->var_defs.name[i]; in field_name_from_var()
2250 field = hist_data->attrs->var_defs.expr[i]; in field_name_from_var()
2260 static char *local_field_var_ref(struct hist_trigger_data *hist_data, in local_field_var_ref() argument
2267 call = hist_data->event_file->event_call; in local_field_var_ref()
2284 return field_name_from_var(hist_data, var_name); in local_field_var_ref()
2287 static struct hist_field *parse_var_ref(struct hist_trigger_data *hist_data, in parse_var_ref() argument
2292 struct trace_array *tr = hist_data->event_file->tr; in parse_var_ref()
2299 var_field = find_event_var(hist_data, system, event_name, var_name); in parse_var_ref()
2301 ref_field = create_var_ref(hist_data, var_field, in parse_var_ref()
2311 parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file, in parse_field() argument
2377 hist_data->enable_timestamps = true; in parse_field()
2379 hist_data->attrs->ts_in_usecs = true; in parse_field()
2418 static struct hist_field *create_alias(struct hist_trigger_data *hist_data, in create_alias() argument
2425 alias = create_hist_field(hist_data, NULL, flags, var_name); in create_alias()
2442 static struct hist_field *parse_const(struct hist_trigger_data *hist_data, in parse_const() argument
2446 struct trace_array *tr = hist_data->event_file->tr; in parse_const()
2456 field = create_hist_field(hist_data, NULL, *flags, var_name); in parse_const()
2465 static struct hist_field *parse_atom(struct hist_trigger_data *hist_data, in parse_atom() argument
2476 hist_field = parse_const(hist_data, str, var_name, flags); in parse_atom()
2502 s = local_field_var_ref(hist_data, ref_system, ref_event, ref_var); in parse_atom()
2504 hist_field = parse_var_ref(hist_data, ref_system, in parse_atom()
2508 hist_field = create_alias(hist_data, hist_field, var_name); in parse_atom()
2519 field = parse_field(hist_data, file, str, flags, &buckets); in parse_atom()
2525 hist_field = create_hist_field(hist_data, field, *flags, var_name); in parse_atom()
2537 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
2542 static struct hist_field *parse_unary(struct hist_trigger_data *hist_data, in parse_unary() argument
2590 expr = create_hist_field(hist_data, NULL, flags, var_name); in parse_unary()
2597 operand1 = parse_expr(hist_data, file, str, operand_flags, NULL, n_subexprs); in parse_unary()
2647 var = find_var_field(operand1->var.hist_data, operand1->name); in check_expr_operands()
2658 var = find_var_field(operand2->var.hist_data, operand2->name); in check_expr_operands()
2674 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, in parse_expr() argument
2695 return parse_atom(hist_data, file, str, &flags, var_name); in parse_expr()
2698 return parse_unary(hist_data, file, str, flags, var_name, n_subexprs); in parse_expr()
2718 operand1 = parse_expr(hist_data, file, operand1_str, operand_flags, NULL, n_subexprs); in parse_expr()
2730 operand2 = parse_expr(hist_data, file, str, operand_flags, NULL, n_subexprs); in parse_expr()
2777 expr = create_hist_field(hist_data, NULL, flags, var_name); in parse_expr()
2858 static char *find_trigger_filter(struct hist_trigger_data *hist_data, in find_trigger_filter() argument
2867 if (test->private_data == hist_data) in find_trigger_filter()
2882 struct hist_trigger_data *hist_data, in compatible_keys() argument
2888 if (hist_data->n_fields - hist_data->n_vals != n_keys) in compatible_keys()
2891 i = hist_data->n_vals; in compatible_keys()
2895 hist_field = hist_data->fields[i + n]; in compatible_keys()
2913 struct hist_trigger_data *hist_data; in find_compatible_hist() local
2923 hist_data = test->private_data; in find_compatible_hist()
2925 if (compatible_keys(target_hist_data, hist_data, n_keys)) in find_compatible_hist()
2926 return hist_data; in find_compatible_hist()
2996 struct hist_trigger_data *hist_data; in create_field_var_hist() local
3025 hist_data = find_compatible_hist(target_hist_data, file); in create_field_var_hist()
3026 if (!hist_data) { in create_field_var_hist()
3050 for_each_hist_key_field(i, hist_data) { in create_field_var_hist()
3051 key_field = hist_data->fields[i]; in create_field_var_hist()
3065 saved_filter = find_trigger_filter(hist_data, file); in create_field_var_hist()
3079 var_hist->hist_data = hist_data; in create_field_var_hist()
3112 find_target_event_var(struct hist_trigger_data *hist_data, in find_target_event_var() argument
3115 struct trace_event_file *file = hist_data->event_file; in find_target_event_var()
3133 hist_field = find_var_field(hist_data, var_name); in find_target_event_var()
3187 static void update_field_vars(struct hist_trigger_data *hist_data, in update_field_vars() argument
3193 __update_field_vars(elt, buffer, rbe, rec, hist_data->field_vars, in update_field_vars()
3194 hist_data->n_field_vars, 0); in update_field_vars()
3197 static void save_track_data_vars(struct hist_trigger_data *hist_data, in save_track_data_vars() argument
3203 __update_field_vars(elt, buffer, rbe, rec, hist_data->save_vars, in save_track_data_vars()
3204 hist_data->n_save_vars, hist_data->n_field_var_str); in save_track_data_vars()
3207 static struct hist_field *create_var(struct hist_trigger_data *hist_data, in create_var() argument
3214 if (find_var(hist_data, file, name) && !hist_data->remove) { in create_var()
3225 idx = tracing_map_add_var(hist_data->map); in create_var()
3235 var->var.hist_data = var->hist_data = hist_data; in create_var()
3249 static struct field_var *create_field_var(struct hist_trigger_data *hist_data, in create_field_var() argument
3259 if (hist_data->n_field_vars >= SYNTH_FIELDS_MAX) { in create_field_var()
3265 val = parse_atom(hist_data, file, field_name, &flags, NULL); in create_field_var()
3272 var = create_var(hist_data, file, field_name, val->size, val->type); in create_field_var()
3359 static u64 get_track_val(struct hist_trigger_data *hist_data, in get_track_val() argument
3371 static void save_track_val(struct hist_trigger_data *hist_data, in save_track_val() argument
3380 static void save_track_data(struct hist_trigger_data *hist_data, in save_track_data() argument
3387 data->track_data.save_data(hist_data, elt, buffer, rec, rbe, in save_track_data()
3395 struct hist_trigger_data *hist_data; in check_track_val() local
3398 hist_data = data->track_data.track_var->hist_data; in check_track_val()
3399 track_val = get_track_val(hist_data, elt, data); in check_track_val()
3419 track_val = get_track_val(track_data->hist_data, context->elt, in cond_snapshot_update()
3438 static void save_track_data_snapshot(struct hist_trigger_data *hist_data, in save_track_data_snapshot() argument
3445 struct trace_event_file *file = hist_data->event_file; in save_track_data_snapshot()
3455 struct hist_trigger_data *hist_data,
3459 static struct action_data *snapshot_action(struct hist_trigger_data *hist_data) in snapshot_action() argument
3463 if (!hist_data->n_actions) in snapshot_action()
3466 for (i = 0; i < hist_data->n_actions; i++) { in snapshot_action()
3467 struct action_data *data = hist_data->actions[i]; in snapshot_action()
3477 struct hist_trigger_data *hist_data) in track_data_snapshot_print() argument
3479 struct trace_event_file *file = hist_data->event_file; in track_data_snapshot_print()
3490 action = snapshot_action(hist_data); in track_data_snapshot_print()
3500 hist_trigger_print_key(m, hist_data, track_data->key, &track_data->elt); in track_data_snapshot_print()
3508 static void save_track_data_snapshot(struct hist_trigger_data *hist_data, in save_track_data_snapshot() argument
3515 struct hist_trigger_data *hist_data) {} in track_data_snapshot_print() argument
3519 struct hist_trigger_data *hist_data, in track_data_print() argument
3523 u64 track_val = get_track_val(hist_data, elt, data); in track_data_print()
3534 for (i = 0; i < hist_data->n_save_vars; i++) { in track_data_print()
3535 struct hist_field *save_val = hist_data->save_vars[i]->val; in track_data_print()
3536 struct hist_field *save_var = hist_data->save_vars[i]->var; in track_data_print()
3551 static void ontrack_action(struct hist_trigger_data *hist_data, in ontrack_action() argument
3560 save_track_val(hist_data, elt, data, var_val); in ontrack_action()
3561 save_track_data(hist_data, elt, buffer, rec, rbe, in ontrack_action()
3585 static void track_data_destroy(struct hist_trigger_data *hist_data, in track_data_destroy() argument
3588 struct trace_event_file *file = hist_data->event_file; in track_data_destroy()
3596 if (track_data && track_data->hist_data == hist_data) { in track_data_destroy()
3607 static int action_create(struct hist_trigger_data *hist_data,
3610 static int track_data_create(struct hist_trigger_data *hist_data, in track_data_create() argument
3614 struct trace_event_file *file = hist_data->event_file; in track_data_create()
3626 var_field = find_target_event_var(hist_data, NULL, NULL, track_data_var_str); in track_data_create()
3632 ref_field = create_var_ref(hist_data, var_field, NULL, NULL); in track_data_create()
3639 track_var = create_var(hist_data, file, "__max", sizeof(u64), "u64"); in track_data_create()
3647 track_var = create_var(hist_data, file, "__change", sizeof(u64), "u64"); in track_data_create()
3655 ret = action_create(hist_data, data); in track_data_create()
3812 static struct action_data *track_data_parse(struct hist_trigger_data *hist_data, in track_data_parse() argument
3835 ret = action_parse(hist_data->event_file->tr, str, data, handler); in track_data_parse()
3841 track_data_destroy(hist_data, data); in track_data_parse()
3865 static void destroy_field_vars(struct hist_trigger_data *hist_data) in destroy_field_vars() argument
3869 for (i = 0; i < hist_data->n_field_vars; i++) in destroy_field_vars()
3870 destroy_field_var(hist_data->field_vars[i]); in destroy_field_vars()
3872 for (i = 0; i < hist_data->n_save_vars; i++) in destroy_field_vars()
3873 destroy_field_var(hist_data->save_vars[i]); in destroy_field_vars()
3876 static void save_field_var(struct hist_trigger_data *hist_data, in save_field_var() argument
3879 hist_data->field_vars[hist_data->n_field_vars++] = field_var; in save_field_var()
3883 hist_data->n_field_var_str++; in save_field_var()
3920 trace_action_find_var(struct hist_trigger_data *hist_data, in trace_action_find_var() argument
3924 struct trace_array *tr = hist_data->event_file->tr; in trace_action_find_var()
3929 hist_field = find_target_event_var(hist_data, system, event, var); in trace_action_find_var()
3936 hist_field = find_event_var(hist_data, system, event, var); in trace_action_find_var()
3946 trace_action_create_field_var(struct hist_trigger_data *hist_data, in trace_action_create_field_var() argument
3959 field_var = create_target_field_var(hist_data, system, event, var); in trace_action_create_field_var()
3962 save_field_var(hist_data, field_var); in trace_action_create_field_var()
3985 hist_field = create_field_var_hist(hist_data, system, event, var); in trace_action_create_field_var()
3997 static int trace_action_create(struct hist_trigger_data *hist_data, in trace_action_create() argument
4000 struct trace_array *tr = hist_data->event_file->tr; in trace_action_create()
4051 hist_field = trace_action_find_var(hist_data, data, in trace_action_create()
4055 hist_field = trace_action_create_field_var(hist_data, in trace_action_create()
4068 var_ref = create_var_ref(hist_data, hist_field, in trace_action_create()
4076 var_ref_idx = find_var_ref_idx(hist_data, var_ref); in trace_action_create()
4111 static int action_create(struct hist_trigger_data *hist_data, in action_create() argument
4114 struct trace_event_file *file = hist_data->event_file; in action_create()
4123 return trace_action_create(hist_data, data); in action_create()
4126 track_data = track_data_alloc(hist_data->key_size, data, hist_data); in action_create()
4141 if (hist_data->n_save_vars) { in action_create()
4154 field_var = create_target_field_var(hist_data, NULL, NULL, param); in action_create()
4163 hist_data->save_vars[hist_data->n_save_vars++] = field_var; in action_create()
4166 hist_data->n_save_var_str++; in action_create()
4174 static int onmatch_create(struct hist_trigger_data *hist_data, in onmatch_create() argument
4177 return action_create(hist_data, data); in onmatch_create()
4230 static int create_hitcount_val(struct hist_trigger_data *hist_data) in create_hitcount_val() argument
4232 hist_data->fields[HITCOUNT_IDX] = in create_hitcount_val()
4233 create_hist_field(hist_data, NULL, HIST_FIELD_FL_HITCOUNT, NULL); in create_hitcount_val()
4234 if (!hist_data->fields[HITCOUNT_IDX]) in create_hitcount_val()
4237 hist_data->n_vals++; in create_hitcount_val()
4238 hist_data->n_fields++; in create_hitcount_val()
4240 if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX)) in create_hitcount_val()
4246 static int __create_val_field(struct hist_trigger_data *hist_data, in __create_val_field() argument
4255 hist_field = parse_expr(hist_data, file, field_str, flags, var_name, &n_subexprs); in __create_val_field()
4276 hist_data->fields[val_idx] = hist_field; in __create_val_field()
4278 ++hist_data->n_vals; in __create_val_field()
4279 ++hist_data->n_fields; in __create_val_field()
4281 if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX)) in __create_val_field()
4290 static int create_val_field(struct hist_trigger_data *hist_data, in create_val_field() argument
4298 return __create_val_field(hist_data, val_idx, file, NULL, field_str, 0); in create_val_field()
4421 static int create_var_field(struct hist_trigger_data *hist_data, in create_var_field() argument
4426 struct trace_array *tr = hist_data->event_file->tr; in create_var_field()
4433 if (find_var(hist_data, file, var_name) && !hist_data->remove) { in create_var_field()
4439 hist_data->n_vars++; in create_var_field()
4440 if (WARN_ON(hist_data->n_vars > TRACING_MAP_VARS_MAX)) in create_var_field()
4443 ret = __create_val_field(hist_data, val_idx, file, var_name, expr_str, flags); in create_var_field()
4445 if (!ret && hist_data->fields[val_idx]->flags & HIST_FIELD_FL_EXECNAME) in create_var_field()
4446 update_var_execname(hist_data->fields[val_idx]); in create_var_field()
4448 if (!ret && hist_data->fields[val_idx]->flags & in create_var_field()
4450 hist_data->fields[val_idx]->var_str_idx = hist_data->n_var_str++; in create_var_field()
4455 static int create_val_fields(struct hist_trigger_data *hist_data, in create_val_fields() argument
4462 ret = create_hitcount_val(hist_data); in create_val_fields()
4466 fields_str = hist_data->attrs->vals_str; in create_val_fields()
4481 ret = create_val_field(hist_data, j++, file, field_str); in create_val_fields()
4490 if (j == 1 && hist_data->attrs->no_hitcount) { in create_val_fields()
4491 hist_err(hist_data->event_file->tr, HIST_ERR_NEED_NOHC_VAL, 0); in create_val_fields()
4498 static int create_key_field(struct hist_trigger_data *hist_data, in create_key_field() argument
4504 struct trace_array *tr = hist_data->event_file->tr; in create_key_field()
4518 hist_field = create_hist_field(hist_data, NULL, flags, NULL); in create_key_field()
4520 hist_field = parse_expr(hist_data, file, field_str, flags, in create_key_field()
4537 hist_data->fields[key_idx] = hist_field; in create_key_field()
4540 hist_data->fields[key_idx]->size = key_size; in create_key_field()
4541 hist_data->fields[key_idx]->offset = key_offset; in create_key_field()
4543 hist_data->key_size += key_size; in create_key_field()
4545 if (hist_data->key_size > HIST_KEY_SIZE_MAX) { in create_key_field()
4550 hist_data->n_keys++; in create_key_field()
4551 hist_data->n_fields++; in create_key_field()
4553 if (WARN_ON(hist_data->n_keys > TRACING_MAP_KEYS_MAX)) in create_key_field()
4561 static int create_key_fields(struct hist_trigger_data *hist_data, in create_key_fields() argument
4564 unsigned int i, key_offset = 0, n_vals = hist_data->n_vals; in create_key_fields()
4568 fields_str = hist_data->attrs->keys_str; in create_key_fields()
4576 ret = create_key_field(hist_data, i, key_offset, in create_key_fields()
4591 static int create_var_fields(struct hist_trigger_data *hist_data, in create_var_fields() argument
4594 unsigned int i, j = hist_data->n_vals; in create_var_fields()
4597 unsigned int n_vars = hist_data->attrs->var_defs.n_vars; in create_var_fields()
4600 char *var_name = hist_data->attrs->var_defs.name[i]; in create_var_fields()
4601 char *expr = hist_data->attrs->var_defs.expr[i]; in create_var_fields()
4603 ret = create_var_field(hist_data, j++, file, var_name, expr); in create_var_fields()
4611 static void free_var_defs(struct hist_trigger_data *hist_data) in free_var_defs() argument
4615 for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) { in free_var_defs()
4616 kfree(hist_data->attrs->var_defs.name[i]); in free_var_defs()
4617 kfree(hist_data->attrs->var_defs.expr[i]); in free_var_defs()
4620 hist_data->attrs->var_defs.n_vars = 0; in free_var_defs()
4623 static int parse_var_defs(struct hist_trigger_data *hist_data) in parse_var_defs() argument
4625 struct trace_array *tr = hist_data->event_file->tr; in parse_var_defs()
4630 for (i = 0; i < hist_data->attrs->n_assignments; i++) { in parse_var_defs()
4631 str = hist_data->attrs->assignment_str[i]; in parse_var_defs()
4656 hist_data->attrs->var_defs.name[n_vars] = s; in parse_var_defs()
4660 kfree(hist_data->attrs->var_defs.name[n_vars]); in parse_var_defs()
4661 hist_data->attrs->var_defs.name[n_vars] = NULL; in parse_var_defs()
4665 hist_data->attrs->var_defs.expr[n_vars++] = s; in parse_var_defs()
4667 hist_data->attrs->var_defs.n_vars = n_vars; in parse_var_defs()
4673 free_var_defs(hist_data); in parse_var_defs()
4678 static int create_hist_fields(struct hist_trigger_data *hist_data, in create_hist_fields() argument
4683 ret = parse_var_defs(hist_data); in create_hist_fields()
4687 ret = create_val_fields(hist_data, file); in create_hist_fields()
4691 ret = create_var_fields(hist_data, file); in create_hist_fields()
4695 ret = create_key_fields(hist_data, file); in create_hist_fields()
4698 free_var_defs(hist_data); in create_hist_fields()
4719 static int create_sort_keys(struct hist_trigger_data *hist_data) in create_sort_keys() argument
4721 struct trace_array *tr = hist_data->event_file->tr; in create_sort_keys()
4722 char *fields_str = hist_data->attrs->sort_key_str; in create_sort_keys()
4727 hist_data->n_sort_keys = 1; /* we always have at least one, hitcount */ in create_sort_keys()
4737 sort_key = &hist_data->sort_keys[i]; in create_sort_keys()
4772 for (j = 1, k = 1; j < hist_data->n_fields; j++) { in create_sort_keys()
4775 hist_field = hist_data->fields[j]; in create_sort_keys()
4794 if (j == hist_data->n_fields) { in create_sort_keys()
4801 hist_data->n_sort_keys = i; in create_sort_keys()
4806 static void destroy_actions(struct hist_trigger_data *hist_data) in destroy_actions() argument
4810 for (i = 0; i < hist_data->n_actions; i++) { in destroy_actions()
4811 struct action_data *data = hist_data->actions[i]; in destroy_actions()
4817 track_data_destroy(hist_data, data); in destroy_actions()
4823 static int parse_actions(struct hist_trigger_data *hist_data) in parse_actions() argument
4825 struct trace_array *tr = hist_data->event_file->tr; in parse_actions()
4832 for (i = 0; i < hist_data->attrs->n_actions; i++) { in parse_actions()
4836 str = hist_data->attrs->action_str[i]; in parse_actions()
4853 data = track_data_parse(hist_data, action_str, hid); in parse_actions()
4865 hist_data->actions[hist_data->n_actions++] = data; in parse_actions()
4871 static int create_actions(struct hist_trigger_data *hist_data) in create_actions() argument
4877 for (i = 0; i < hist_data->attrs->n_actions; i++) { in create_actions()
4878 data = hist_data->actions[i]; in create_actions()
4881 ret = onmatch_create(hist_data, data); in create_actions()
4886 ret = track_data_create(hist_data, data); in create_actions()
4899 struct hist_trigger_data *hist_data, in print_actions() argument
4904 for (i = 0; i < hist_data->n_actions; i++) { in print_actions()
4905 struct action_data *data = hist_data->actions[i]; in print_actions()
4912 track_data_print(m, hist_data, elt, data); in print_actions()
4917 struct hist_trigger_data *hist_data, in print_action_spec() argument
4923 for (i = 0; i < hist_data->n_save_vars; i++) { in print_action_spec()
4924 seq_printf(m, "%s", hist_data->save_vars[i]->var->var.name); in print_action_spec()
4925 if (i < hist_data->n_save_vars - 1) in print_action_spec()
4940 struct hist_trigger_data *hist_data, in print_track_data_spec() argument
4950 print_action_spec(m, hist_data, data); in print_track_data_spec()
4956 struct hist_trigger_data *hist_data, in print_onmatch_spec() argument
4964 print_action_spec(m, hist_data, data); in print_onmatch_spec()
4969 static bool actions_match(struct hist_trigger_data *hist_data, in actions_match() argument
4974 if (hist_data->n_actions != hist_data_test->n_actions) in actions_match()
4977 for (i = 0; i < hist_data->n_actions; i++) { in actions_match()
4978 struct action_data *data = hist_data->actions[i]; in actions_match()
5028 struct hist_trigger_data *hist_data) in print_actions_spec() argument
5032 for (i = 0; i < hist_data->n_actions; i++) { in print_actions_spec()
5033 struct action_data *data = hist_data->actions[i]; in print_actions_spec()
5036 print_onmatch_spec(m, hist_data, data); in print_actions_spec()
5039 print_track_data_spec(m, hist_data, data); in print_actions_spec()
5043 static void destroy_field_var_hists(struct hist_trigger_data *hist_data) in destroy_field_var_hists() argument
5047 for (i = 0; i < hist_data->n_field_var_hists; i++) { in destroy_field_var_hists()
5048 kfree(hist_data->field_var_hists[i]->cmd); in destroy_field_var_hists()
5049 kfree(hist_data->field_var_hists[i]); in destroy_field_var_hists()
5053 static void destroy_hist_data(struct hist_trigger_data *hist_data) in destroy_hist_data() argument
5055 if (!hist_data) in destroy_hist_data()
5058 destroy_hist_trigger_attrs(hist_data->attrs); in destroy_hist_data()
5059 destroy_hist_fields(hist_data); in destroy_hist_data()
5060 tracing_map_destroy(hist_data->map); in destroy_hist_data()
5062 destroy_actions(hist_data); in destroy_hist_data()
5063 destroy_field_vars(hist_data); in destroy_hist_data()
5064 destroy_field_var_hists(hist_data); in destroy_hist_data()
5066 kfree(hist_data); in destroy_hist_data()
5069 static int create_tracing_map_fields(struct hist_trigger_data *hist_data) in create_tracing_map_fields() argument
5071 struct tracing_map *map = hist_data->map; in create_tracing_map_fields()
5076 for_each_hist_field(i, hist_data) { in create_tracing_map_fields()
5077 hist_field = hist_data->fields[i]; in create_tracing_map_fields()
5107 hist_field->var.hist_data = hist_data; in create_tracing_map_fields()
5121 struct hist_trigger_data *hist_data; in create_hist_data() local
5124 hist_data = kzalloc(sizeof(*hist_data), GFP_KERNEL); in create_hist_data()
5125 if (!hist_data) in create_hist_data()
5128 hist_data->attrs = attrs; in create_hist_data()
5129 hist_data->remove = remove; in create_hist_data()
5130 hist_data->event_file = file; in create_hist_data()
5132 ret = parse_actions(hist_data); in create_hist_data()
5136 ret = create_hist_fields(hist_data, file); in create_hist_data()
5140 ret = create_sort_keys(hist_data); in create_hist_data()
5146 hist_data->map = tracing_map_create(map_bits, hist_data->key_size, in create_hist_data()
5147 map_ops, hist_data); in create_hist_data()
5148 if (IS_ERR(hist_data->map)) { in create_hist_data()
5149 ret = PTR_ERR(hist_data->map); in create_hist_data()
5150 hist_data->map = NULL; in create_hist_data()
5154 ret = create_tracing_map_fields(hist_data); in create_hist_data()
5158 return hist_data; in create_hist_data()
5160 hist_data->attrs = NULL; in create_hist_data()
5162 destroy_hist_data(hist_data); in create_hist_data()
5164 hist_data = ERR_PTR(ret); in create_hist_data()
5169 static void hist_trigger_elt_update(struct hist_trigger_data *hist_data, in hist_trigger_elt_update() argument
5183 for_each_hist_val_field(i, hist_data) { in hist_trigger_elt_update()
5184 hist_field = hist_data->fields[i]; in hist_trigger_elt_update()
5195 str_start = hist_data->n_field_var_str + in hist_trigger_elt_update()
5196 hist_data->n_save_var_str; in hist_trigger_elt_update()
5225 for_each_hist_key_field(i, hist_data) { in hist_trigger_elt_update()
5226 hist_field = hist_data->fields[i]; in hist_trigger_elt_update()
5234 update_field_vars(hist_data, elt, buffer, rbe, rec); in hist_trigger_elt_update()
5265 hist_trigger_actions(struct hist_trigger_data *hist_data, in hist_trigger_actions() argument
5274 for (i = 0; i < hist_data->n_actions; i++) { in hist_trigger_actions()
5275 data = hist_data->actions[i]; in hist_trigger_actions()
5276 data->fn(hist_data, elt, buffer, rec, rbe, key, data, var_ref_vals); in hist_trigger_actions()
5363 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger() local
5364 bool use_compound_key = (hist_data->n_keys > 1); in event_hist_trigger()
5379 memset(hist_pad->compound_key, 0, hist_data->key_size); in event_hist_trigger()
5381 for_each_hist_key_field(i, hist_data) { in event_hist_trigger()
5382 key_field = hist_data->fields[i]; in event_hist_trigger()
5416 if (hist_data->n_var_refs && in event_hist_trigger()
5417 !resolve_var_refs(hist_data, key, hist_pad->var_ref_vals, false)) in event_hist_trigger()
5420 elt = tracing_map_insert(hist_data->map, key); in event_hist_trigger()
5424 hist_trigger_elt_update(hist_data, elt, buffer, rec, rbe, hist_pad->var_ref_vals); in event_hist_trigger()
5426 if (resolve_var_refs(hist_data, key, hist_pad->var_ref_vals, true)) { in event_hist_trigger()
5427 hist_trigger_actions(hist_data, elt, buffer, rec, rbe, in event_hist_trigger()
5454 struct hist_trigger_data *hist_data, in hist_trigger_print_key() argument
5466 for_each_hist_key_field(i, hist_data) { in hist_trigger_print_key()
5467 key_field = hist_data->fields[i]; in hist_trigger_print_key()
5469 if (i > hist_data->n_vals) in hist_trigger_print_key()
5611 struct hist_trigger_data *hist_data, in hist_trigger_entry_print() argument
5620 hist_trigger_print_key(m, hist_data, key, elt); in hist_trigger_entry_print()
5623 if (!hist_data->attrs->no_hitcount) in hist_trigger_entry_print()
5626 for (i = 1; i < hist_data->n_vals; i++) { in hist_trigger_entry_print()
5627 field_name = hist_field_name(hist_data->fields[i], 0); in hist_trigger_entry_print()
5628 flags = hist_data->fields[i]->flags; in hist_trigger_entry_print()
5636 print_actions(m, hist_data, elt); in hist_trigger_entry_print()
5642 struct hist_trigger_data *hist_data) in print_entries() argument
5645 struct tracing_map *map = hist_data->map; in print_entries()
5650 n_entries = tracing_map_sort_entries(map, hist_data->sort_keys, in print_entries()
5651 hist_data->n_sort_keys, in print_entries()
5657 for (j = 0; j < hist_data->n_vals; j++) { in print_entries()
5658 if (!(hist_data->fields[j]->flags & in print_entries()
5662 stats = kcalloc(hist_data->n_vals, sizeof(*stats), in print_entries()
5678 hist_trigger_entry_print(m, hist_data, stats, in print_entries()
5692 struct hist_trigger_data *hist_data; in hist_trigger_show() local
5702 hist_data = data->private_data; in hist_trigger_show()
5703 n_entries = print_entries(m, hist_data); in hist_trigger_show()
5707 track_data_snapshot_print(m, hist_data); in hist_trigger_show()
5710 (u64)atomic64_read(&hist_data->map->hits), in hist_trigger_show()
5711 n_entries, (u64)atomic64_read(&hist_data->map->drops)); in hist_trigger_show()
5722 struct hist_trigger_data *hist_data; in get_hist_hit_count() local
5728 hist_data = data->private_data; in get_hist_hit_count()
5729 ret += atomic64_read(&hist_data->map->hits); in get_hist_hit_count()
5900 seq_printf(m, " var.hist_data: %p\n", field->var.hist_data); in hist_field_debug_show()
5984 struct hist_trigger_data *hist_data) in hist_actions_debug_show() argument
5988 if (hist_data->n_actions) in hist_actions_debug_show()
5991 for (i = 0; i < hist_data->n_actions; i++) { in hist_actions_debug_show()
5992 struct action_data *action = hist_data->actions[i]; in hist_actions_debug_show()
5999 if (hist_data->n_save_vars) in hist_actions_debug_show()
6002 for (i = 0; i < hist_data->n_save_vars; i++) { in hist_actions_debug_show()
6003 ret = field_var_debug_show(m, hist_data->save_vars[i], i, true); in hist_actions_debug_show()
6014 struct hist_trigger_data *hist_data; in hist_trigger_debug_show() local
6024 hist_data = data->private_data; in hist_trigger_debug_show()
6026 seq_printf(m, "hist_data: %p\n\n", hist_data); in hist_trigger_debug_show()
6027 seq_printf(m, " n_vals: %u\n", hist_data->n_vals); in hist_trigger_debug_show()
6028 seq_printf(m, " n_keys: %u\n", hist_data->n_keys); in hist_trigger_debug_show()
6029 seq_printf(m, " n_fields: %u\n", hist_data->n_fields); in hist_trigger_debug_show()
6034 ret = hist_field_debug_show(m, hist_data->fields[0], in hist_trigger_debug_show()
6039 for (i = 1; i < hist_data->n_vals; i++) { in hist_trigger_debug_show()
6041 ret = hist_field_debug_show(m, hist_data->fields[i], 0); in hist_trigger_debug_show()
6048 for (i = hist_data->n_vals; i < hist_data->n_fields; i++) { in hist_trigger_debug_show()
6050 ret = hist_field_debug_show(m, hist_data->fields[i], in hist_trigger_debug_show()
6056 if (hist_data->n_var_refs) in hist_trigger_debug_show()
6059 for (i = 0; i < hist_data->n_var_refs; i++) { in hist_trigger_debug_show()
6061 ret = hist_field_debug_show(m, hist_data->var_refs[i], in hist_trigger_debug_show()
6067 if (hist_data->n_field_vars) in hist_trigger_debug_show()
6070 for (i = 0; i < hist_data->n_field_vars; i++) { in hist_trigger_debug_show()
6071 ret = field_var_debug_show(m, hist_data->field_vars[i], i, false); in hist_trigger_debug_show()
6076 ret = hist_actions_debug_show(m, hist_data); in hist_trigger_debug_show()
6162 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_print() local
6175 for_each_hist_key_field(i, hist_data) { in event_hist_trigger_print()
6176 field = hist_data->fields[i]; in event_hist_trigger_print()
6178 if (i > hist_data->n_vals) in event_hist_trigger_print()
6192 for_each_hist_val_field(i, hist_data) { in event_hist_trigger_print()
6193 field = hist_data->fields[i]; in event_hist_trigger_print()
6200 if (hist_data->attrs->no_hitcount) in event_hist_trigger_print()
6216 for_each_hist_val_field(i, hist_data) { in event_hist_trigger_print()
6217 field = hist_data->fields[i]; in event_hist_trigger_print()
6229 for (i = 0; i < hist_data->n_sort_keys; i++) { in event_hist_trigger_print()
6234 first_key_idx = hist_data->n_vals - hist_data->n_vars; in event_hist_trigger_print()
6236 sort_key = &hist_data->sort_keys[i]; in event_hist_trigger_print()
6249 idx += hist_data->n_vars; in event_hist_trigger_print()
6250 hist_field_print(m, hist_data->fields[idx]); in event_hist_trigger_print()
6256 seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits)); in event_hist_trigger_print()
6257 if (hist_data->enable_timestamps) in event_hist_trigger_print()
6258 seq_printf(m, ":clock=%s", hist_data->attrs->clock); in event_hist_trigger_print()
6259 if (hist_data->attrs->no_hitcount) in event_hist_trigger_print()
6262 print_actions_spec(m, hist_data); in event_hist_trigger_print()
6279 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_init() local
6284 if (!data->ref && hist_data->attrs->name) in event_hist_trigger_init()
6285 save_named_trigger(hist_data->attrs->name, data); in event_hist_trigger_init()
6292 static void unregister_field_var_hists(struct hist_trigger_data *hist_data) in unregister_field_var_hists() argument
6299 for (i = 0; i < hist_data->n_field_var_hists; i++) { in unregister_field_var_hists()
6300 file = hist_data->field_var_hists[i]->hist_data->event_file; in unregister_field_var_hists()
6301 cmd = hist_data->field_var_hists[i]->cmd; in unregister_field_var_hists()
6310 struct hist_trigger_data *hist_data = data->private_data; in event_hist_trigger_free() local
6322 remove_hist_vars(hist_data); in event_hist_trigger_free()
6324 unregister_field_var_hists(hist_data); in event_hist_trigger_free()
6326 destroy_hist_data(hist_data); in event_hist_trigger_free()
6367 struct hist_trigger_data *hist_data = data->private_data; in hist_clear() local
6374 tracing_map_clear(hist_data->map); in hist_clear()
6405 struct hist_trigger_data *hist_data, *hist_data_test; in hist_trigger_match() local
6416 hist_data = data->private_data; in hist_trigger_match()
6419 if (hist_data->n_vals != hist_data_test->n_vals || in hist_trigger_match()
6420 hist_data->n_fields != hist_data_test->n_fields || in hist_trigger_match()
6421 hist_data->n_sort_keys != hist_data_test->n_sort_keys) in hist_trigger_match()
6430 for_each_hist_field(i, hist_data) { in hist_trigger_match()
6431 key_field = hist_data->fields[i]; in hist_trigger_match()
6451 for (i = 0; i < hist_data->n_sort_keys; i++) { in hist_trigger_match()
6452 sort_key = &hist_data->sort_keys[i]; in hist_trigger_match()
6464 if (!actions_match(hist_data, hist_data_test)) in hist_trigger_match()
6474 struct hist_trigger_data *hist_data = data->private_data; in existing_hist_update_only() local
6478 if (!hist_data->attrs->pause && !hist_data->attrs->cont && in existing_hist_update_only()
6479 !hist_data->attrs->clear) in existing_hist_update_only()
6482 if (hist_data->attrs->name) { in existing_hist_update_only()
6483 named_data = find_named_trigger(hist_data->attrs->name); in existing_hist_update_only()
6491 if (hist_data->attrs->name && !named_data) in existing_hist_update_only()
6498 if (hist_data->attrs->pause) in existing_hist_update_only()
6500 else if (hist_data->attrs->cont) in existing_hist_update_only()
6502 else if (hist_data->attrs->clear) in existing_hist_update_only()
6516 struct hist_trigger_data *hist_data = data->private_data; in hist_register_trigger() local
6521 if (hist_data->attrs->name) { in hist_register_trigger()
6522 named_data = find_named_trigger(hist_data->attrs->name); in hist_register_trigger()
6526 hist_err(tr, HIST_ERR_NAMED_MISMATCH, errpos(hist_data->attrs->name)); in hist_register_trigger()
6533 if (hist_data->attrs->name && !named_data) in hist_register_trigger()
6548 if (hist_data->attrs->cont || hist_data->attrs->clear) { in hist_register_trigger()
6554 if (hist_data->attrs->pause) in hist_register_trigger()
6580 if (hist_data->enable_timestamps) { in hist_register_trigger()
6581 char *clock = hist_data->attrs->clock; in hist_register_trigger()
6583 ret = tracing_set_clock(file->tr, hist_data->attrs->clock); in hist_register_trigger()
6593 destroy_hist_data(hist_data); in hist_register_trigger()
6619 struct hist_trigger_data *hist_data = data->private_data; in have_hist_trigger_match() local
6625 if (hist_data->attrs->name) in have_hist_trigger_match()
6626 named_data = find_named_trigger(hist_data->attrs->name); in have_hist_trigger_match()
6643 struct hist_trigger_data *hist_data = data->private_data; in hist_trigger_check_refs() local
6648 if (hist_data->attrs->name) in hist_trigger_check_refs()
6649 named_data = find_named_trigger(hist_data->attrs->name); in hist_trigger_check_refs()
6655 hist_data = test->private_data; in hist_trigger_check_refs()
6656 if (check_var_refs(hist_data)) in hist_trigger_check_refs()
6670 struct hist_trigger_data *hist_data = data->private_data; in hist_unregister_trigger() local
6674 if (hist_data->attrs->name) in hist_unregister_trigger()
6675 named_data = find_named_trigger(hist_data->attrs->name); in hist_unregister_trigger()
6692 if (hist_data->enable_timestamps) { in hist_unregister_trigger()
6693 if (!hist_data->remove || test) in hist_unregister_trigger()
6700 struct hist_trigger_data *hist_data; in hist_file_check_refs() local
6707 hist_data = test->private_data; in hist_file_check_refs()
6708 if (check_var_refs(hist_data)) in hist_file_check_refs()
6719 struct hist_trigger_data *hist_data; in hist_unreg_all() local
6730 hist_data = test->private_data; in hist_unreg_all()
6740 if (hist_data->enable_timestamps) in hist_unreg_all()
6756 struct hist_trigger_data *hist_data; in event_hist_trigger_parse() local
6827 hist_data = create_hist_data(hist_trigger_bits, attrs, file, remove); in event_hist_trigger_parse()
6828 if (IS_ERR(hist_data)) { in event_hist_trigger_parse()
6830 return PTR_ERR(hist_data); in event_hist_trigger_parse()
6833 trigger_data = trigger_data_alloc(cmd_ops, cmd, param, hist_data); in event_hist_trigger_parse()
6866 ret = create_actions(hist_data); in event_hist_trigger_parse()
6870 if (has_hist_vars(hist_data) || hist_data->n_var_refs) { in event_hist_trigger_parse()
6871 ret = save_hist_vars(hist_data); in event_hist_trigger_parse()
6876 ret = tracing_map_init(hist_data->map); in event_hist_trigger_parse()
6903 remove_hist_vars(hist_data); in event_hist_trigger_parse()
6907 destroy_hist_data(hist_data); in event_hist_trigger_parse()