Lines Matching full:hist_data

153  * hist_data.  The hist_var idx is the unique index assigned to the
160 struct hist_trigger_data *hist_data;
170 struct hist_trigger_data *hist_data;
481 #define for_each_hist_field(i, hist_data) \
482 for ((i) = 0; (i) < (hist_data)->n_fields; (i)++)
484 #define for_each_hist_val_field(i, hist_data) \
485 for ((i) = 0; (i) < (hist_data)->n_vals; (i)++)
487 #define for_each_hist_key_field(i, hist_data) \
488 for ((i) = (hist_data)->n_vals; (i) < (hist_data)->n_fields; (i)++)
552 struct hist_trigger_data *hist_data;
590 typedef void (*action_fn_t) (struct hist_trigger_data *hist_data,
678 struct hist_trigger_data *hist_data;
732 struct hist_trigger_data *hist_data)
748 data->hist_data = hist_data;
851 static void action_trace(struct hist_trigger_data *hist_data,
864 struct hist_trigger_data *hist_data;
873 struct hist_trigger_data *hist_data = hist_field->hist_data;
874 struct trace_array *tr = hist_data->event_file->tr;
878 if (hist_data->attrs->ts_in_usecs && trace_clock_in_ns(tr))
923 hist_field->var.hist_data == var_data)
931 * @hist_data: The hist trigger that might have a reference to the variable
941 static struct hist_field *find_var_ref(struct hist_trigger_data *hist_data,
948 for (i = 0; i < hist_data->n_var_refs; i++) {
949 hist_field = hist_data->var_refs[i];
959 * @hist_data: The hist trigger
971 static struct hist_field *find_any_var_ref(struct hist_trigger_data *hist_data,
974 struct trace_array *tr = hist_data->event_file->tr;
979 if (var_data->hist_data == hist_data)
981 found = find_var_ref(var_data->hist_data, hist_data, var_idx);
991 * @hist_data: The hist trigger
1002 static bool check_var_refs(struct hist_trigger_data *hist_data)
1008 for_each_hist_field(i, hist_data) {
1009 field = hist_data->fields[i];
1011 if (find_any_var_ref(hist_data, field->var.idx)) {
1021 static struct hist_var_data *find_hist_vars(struct hist_trigger_data *hist_data)
1023 struct trace_array *tr = hist_data->event_file->tr;
1027 if (var_data->hist_data == hist_data) {
1062 static bool has_hist_vars(struct hist_trigger_data *hist_data)
1067 for_each_hist_field(i, hist_data) {
1068 hist_field = hist_data->fields[i];
1076 static int save_hist_vars(struct hist_trigger_data *hist_data)
1078 struct trace_array *tr = hist_data->event_file->tr;
1081 var_data = find_hist_vars(hist_data);
1094 var_data->hist_data = hist_data;
1100 static void remove_hist_vars(struct hist_trigger_data *hist_data)
1102 struct trace_array *tr = hist_data->event_file->tr;
1105 var_data = find_hist_vars(hist_data);
1109 if (WARN_ON(check_var_refs(hist_data)))
1119 static struct hist_field *find_var_field(struct hist_trigger_data *hist_data,
1125 for_each_hist_field(i, hist_data) {
1126 hist_field = hist_data->fields[i];
1137 static struct hist_field *find_var(struct hist_trigger_data *hist_data,
1147 hist_field = find_var_field(hist_data, var_name);
1176 var_hist_data = var_data->hist_data;
1216 find_match_var(struct hist_trigger_data *hist_data, char *var_name)
1218 struct trace_array *tr = hist_data->event_file->tr;
1223 for (i = 0; i < hist_data->n_actions; i++) {
1224 struct action_data *data = hist_data->actions[i];
1248 static struct hist_field *find_event_var(struct hist_trigger_data *hist_data,
1253 struct trace_array *tr = hist_data->event_file->tr;
1258 hist_field = find_match_var(hist_data, var_name);
1292 static bool resolve_var_refs(struct hist_trigger_data *hist_data, void *key,
1302 for (i = 0; i < hist_data->n_var_refs; i++) {
1303 hist_field = hist_data->var_refs[i];
1305 var_data = hist_field->var.hist_data;
1312 if ((self && var_data != hist_data) ||
1313 (!self && var_data == hist_data))
1643 struct hist_trigger_data *hist_data = elt->map->private_data;
1651 n_str = hist_data->n_field_var_str + hist_data->n_save_var_str +
1652 hist_data->n_var_str;
1662 for_each_hist_field(i, hist_data) {
1663 hist_field = hist_data->fields[i];
1949 static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data,
1963 hist_field->hist_data = hist_data;
2003 hist_field->operands[0] = create_hist_field(hist_data, field, fl, NULL);
2095 static void destroy_hist_fields(struct hist_trigger_data *hist_data)
2100 if (hist_data->fields[i]) {
2101 destroy_hist_field(hist_data->fields[i], 0);
2102 hist_data->fields[i] = NULL;
2106 for (i = 0; i < hist_data->n_var_refs; i++) {
2107 WARN_ON(!(hist_data->var_refs[i]->flags & HIST_FIELD_FL_VAR_REF));
2108 __destroy_hist_field(hist_data->var_refs[i]);
2109 hist_data->var_refs[i] = NULL;
2120 ref_field->var.hist_data = var_field->hist_data;
2172 static int find_var_ref_idx(struct hist_trigger_data *hist_data,
2178 for (i = 0; i < hist_data->n_var_refs; i++) {
2179 ref_field = hist_data->var_refs[i];
2181 ref_field->var.hist_data == var_field->hist_data)
2190 * @hist_data: The trigger that will be referencing the variable
2203 static struct hist_field *create_var_ref(struct hist_trigger_data *hist_data,
2212 for (i = 0; i < hist_data->n_var_refs; i++) {
2213 ref_field = hist_data->var_refs[i];
2215 ref_field->var.hist_data == var_field->hist_data)
2218 /* Sanity check to avoid out-of-bound write on 'hist_data->var_refs' */
2219 if (hist_data->n_var_refs >= TRACING_MAP_VARS_MAX)
2221 ref_field = create_hist_field(var_field->hist_data, NULL, flags, NULL);
2228 hist_data->var_refs[hist_data->n_var_refs] = ref_field;
2229 ref_field->var_ref_idx = hist_data->n_var_refs++;
2243 static char *field_name_from_var(struct hist_trigger_data *hist_data,
2249 for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) {
2250 name = hist_data->attrs->var_defs.name[i];
2253 field = hist_data->attrs->var_defs.expr[i];
2263 static char *local_field_var_ref(struct hist_trigger_data *hist_data,
2270 call = hist_data->event_file->event_call;
2287 return field_name_from_var(hist_data, var_name);
2290 static struct hist_field *parse_var_ref(struct hist_trigger_data *hist_data,
2295 struct trace_array *tr = hist_data->event_file->tr;
2302 var_field = find_event_var(hist_data, system, event_name, var_name);
2304 ref_field = create_var_ref(hist_data, var_field,
2314 parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file,
2382 hist_data->enable_timestamps = true;
2384 hist_data->attrs->ts_in_usecs = true;
2430 static struct hist_field *create_alias(struct hist_trigger_data *hist_data,
2437 alias = create_hist_field(hist_data, NULL, flags, var_name);
2454 static struct hist_field *parse_const(struct hist_trigger_data *hist_data,
2458 struct trace_array *tr = hist_data->event_file->tr;
2468 field = create_hist_field(hist_data, NULL, *flags, var_name);
2477 static struct hist_field *parse_atom(struct hist_trigger_data *hist_data,
2488 hist_field = parse_const(hist_data, str, var_name, flags);
2514 s = local_field_var_ref(hist_data, ref_system, ref_event, ref_var);
2516 hist_field = parse_var_ref(hist_data, ref_system,
2520 hist_field = create_alias(hist_data, hist_field, var_name);
2531 field = parse_field(hist_data, file, str, flags, &buckets);
2537 hist_field = create_hist_field(hist_data, field, *flags, var_name);
2549 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
2554 static struct hist_field *parse_unary(struct hist_trigger_data *hist_data,
2602 expr = create_hist_field(hist_data, NULL, flags, var_name);
2609 operand1 = parse_expr(hist_data, file, str, operand_flags, NULL, n_subexprs);
2664 var = find_var_field(operand1->var.hist_data, operand1->name);
2675 var = find_var_field(operand2->var.hist_data, operand2->name);
2691 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
2712 return parse_atom(hist_data, file, str, &flags, var_name);
2715 return parse_unary(hist_data, file, str, flags, var_name, n_subexprs);
2735 operand1 = parse_expr(hist_data, file, operand1_str, operand_flags, NULL, n_subexprs);
2747 operand2 = parse_expr(hist_data, file, str, operand_flags, NULL, n_subexprs);
2794 expr = create_hist_field(hist_data, NULL, flags, var_name);
2885 static char *find_trigger_filter(struct hist_trigger_data *hist_data,
2894 if (test->private_data == hist_data)
2909 struct hist_trigger_data *hist_data,
2915 if (hist_data->n_fields - hist_data->n_vals != n_keys)
2918 i = hist_data->n_vals;
2922 hist_field = hist_data->fields[i + n];
2940 struct hist_trigger_data *hist_data;
2950 hist_data = test->private_data;
2952 if (compatible_keys(target_hist_data, hist_data, n_keys))
2953 return hist_data;
3032 struct hist_trigger_data *hist_data;
3062 hist_data = find_compatible_hist(target_hist_data, file);
3063 if (!hist_data) {
3089 for_each_hist_key_field(i, hist_data) {
3090 key_field = hist_data->fields[i];
3101 saved_filter = find_trigger_filter(hist_data, file);
3122 var_hist->hist_data = hist_data;
3155 find_target_event_var(struct hist_trigger_data *hist_data,
3158 struct trace_event_file *file = hist_data->event_file;
3176 hist_field = find_var_field(hist_data, var_name);
3230 static void update_field_vars(struct hist_trigger_data *hist_data,
3236 __update_field_vars(elt, buffer, rbe, rec, hist_data->field_vars,
3237 hist_data->n_field_vars, 0);
3240 static void save_track_data_vars(struct hist_trigger_data *hist_data,
3246 __update_field_vars(elt, buffer, rbe, rec, hist_data->save_vars,
3247 hist_data->n_save_vars, hist_data->n_field_var_str);
3250 static struct hist_field *create_var(struct hist_trigger_data *hist_data,
3257 if (find_var(hist_data, file, name) && !hist_data->remove) {
3268 idx = tracing_map_add_var(hist_data->map);
3277 var->var.hist_data = var->hist_data = hist_data;
3291 static struct field_var *create_field_var(struct hist_trigger_data *hist_data,
3301 if (hist_data->n_field_vars >= SYNTH_FIELDS_MAX) {
3307 val = parse_atom(hist_data, file, field_name, &flags, NULL);
3314 var = create_var(hist_data, file, field_name, val->size, val->type);
3401 static u64 get_track_val(struct hist_trigger_data *hist_data,
3413 static void save_track_val(struct hist_trigger_data *hist_data,
3422 static void save_track_data(struct hist_trigger_data *hist_data,
3429 data->track_data.save_data(hist_data, elt, buffer, rec, rbe,
3437 struct hist_trigger_data *hist_data;
3440 hist_data = data->track_data.track_var->hist_data;
3441 track_val = get_track_val(hist_data, elt, data);
3461 track_val = get_track_val(track_data->hist_data, context->elt,
3480 static void save_track_data_snapshot(struct hist_trigger_data *hist_data,
3487 struct trace_event_file *file = hist_data->event_file;
3497 struct hist_trigger_data *hist_data,
3501 static struct action_data *snapshot_action(struct hist_trigger_data *hist_data)
3505 if (!hist_data->n_actions)
3508 for (i = 0; i < hist_data->n_actions; i++) {
3509 struct action_data *data = hist_data->actions[i];
3519 struct hist_trigger_data *hist_data)
3521 struct trace_event_file *file = hist_data->event_file;
3532 action = snapshot_action(hist_data);
3542 hist_trigger_print_key(m, hist_data, track_data->key, &track_data->elt);
3550 static void save_track_data_snapshot(struct hist_trigger_data *hist_data,
3557 struct hist_trigger_data *hist_data) {}
3561 struct hist_trigger_data *hist_data,
3565 u64 track_val = get_track_val(hist_data, elt, data);
3576 for (i = 0; i < hist_data->n_save_vars; i++) {
3577 struct hist_field *save_val = hist_data->save_vars[i]->val;
3578 struct hist_field *save_var = hist_data->save_vars[i]->var;
3593 static void ontrack_action(struct hist_trigger_data *hist_data,
3602 save_track_val(hist_data, elt, data, var_val);
3603 save_track_data(hist_data, elt, buffer, rec, rbe,
3627 static void track_data_destroy(struct hist_trigger_data *hist_data,
3630 struct trace_event_file *file = hist_data->event_file;
3638 if (track_data && track_data->hist_data == hist_data) {
3649 static int action_create(struct hist_trigger_data *hist_data,
3652 static int track_data_create(struct hist_trigger_data *hist_data,
3656 struct trace_event_file *file = hist_data->event_file;
3668 var_field = find_target_event_var(hist_data, NULL, NULL, track_data_var_str);
3674 ref_field = create_var_ref(hist_data, var_field, NULL, NULL);
3681 track_var = create_var(hist_data, file, "__max", sizeof(u64), "u64");
3689 track_var = create_var(hist_data, file, "__change", sizeof(u64), "u64");
3697 ret = action_create(hist_data, data);
3854 static struct action_data *track_data_parse(struct hist_trigger_data *hist_data,
3877 ret = action_parse(hist_data->event_file->tr, str, data, handler);
3883 track_data_destroy(hist_data, data);
3907 static void destroy_field_vars(struct hist_trigger_data *hist_data)
3911 for (i = 0; i < hist_data->n_field_vars; i++)
3912 destroy_field_var(hist_data->field_vars[i]);
3914 for (i = 0; i < hist_data->n_save_vars; i++)
3915 destroy_field_var(hist_data->save_vars[i]);
3918 static void save_field_var(struct hist_trigger_data *hist_data,
3921 hist_data->field_vars[hist_data->n_field_vars++] = field_var;
3925 hist_data->n_field_var_str++;
3962 trace_action_find_var(struct hist_trigger_data *hist_data,
3966 struct trace_array *tr = hist_data->event_file->tr;
3971 hist_field = find_target_event_var(hist_data, system, event, var);
3978 hist_field = find_event_var(hist_data, system, event, var);
3988 trace_action_create_field_var(struct hist_trigger_data *hist_data,
4001 field_var = create_target_field_var(hist_data, system, event, var);
4004 save_field_var(hist_data, field_var);
4027 hist_field = create_field_var_hist(hist_data, system, event, var);
4039 static int trace_action_create(struct hist_trigger_data *hist_data,
4042 struct trace_array *tr = hist_data->event_file->tr;
4093 hist_field = trace_action_find_var(hist_data, data,
4097 hist_field = trace_action_create_field_var(hist_data,
4110 var_ref = create_var_ref(hist_data, hist_field,
4118 var_ref_idx = find_var_ref_idx(hist_data, var_ref);
4153 static int action_create(struct hist_trigger_data *hist_data,
4156 struct trace_event_file *file = hist_data->event_file;
4165 return trace_action_create(hist_data, data);
4168 track_data = track_data_alloc(hist_data->key_size, data, hist_data);
4183 if (hist_data->n_save_vars) {
4196 field_var = create_target_field_var(hist_data, NULL, NULL, param);
4205 hist_data->save_vars[hist_data->n_save_vars++] = field_var;
4208 hist_data->n_save_var_str++;
4216 static int onmatch_create(struct hist_trigger_data *hist_data,
4219 return action_create(hist_data, data);
4272 static int create_hitcount_val(struct hist_trigger_data *hist_data)
4274 hist_data->fields[HITCOUNT_IDX] =
4275 create_hist_field(hist_data, NULL, HIST_FIELD_FL_HITCOUNT, NULL);
4276 if (!hist_data->fields[HITCOUNT_IDX])
4279 hist_data->n_vals++;
4280 hist_data->n_fields++;
4282 if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX))
4288 static int __create_val_field(struct hist_trigger_data *hist_data,
4297 hist_field = parse_expr(hist_data, file, field_str, flags, var_name, &n_subexprs);
4317 hist_data->fields[val_idx] = hist_field;
4319 ++hist_data->n_vals;
4320 ++hist_data->n_fields;
4322 if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX))
4332 static int create_val_field(struct hist_trigger_data *hist_data,
4340 return __create_val_field(hist_data, val_idx, file, NULL, field_str, 0);
4463 static int create_var_field(struct hist_trigger_data *hist_data,
4468 struct trace_array *tr = hist_data->event_file->tr;
4475 if (find_var(hist_data, file, var_name) && !hist_data->remove) {
4481 hist_data->n_vars++;
4482 if (WARN_ON(hist_data->n_vars > TRACING_MAP_VARS_MAX))
4485 ret = __create_val_field(hist_data, val_idx, file, var_name, expr_str, flags);
4487 if (!ret && hist_data->fields[val_idx]->flags & HIST_FIELD_FL_EXECNAME)
4488 update_var_execname(hist_data->fields[val_idx]);
4490 if (!ret && hist_data->fields[val_idx]->flags &
4492 hist_data->fields[val_idx]->var_str_idx = hist_data->n_var_str++;
4497 static int create_val_fields(struct hist_trigger_data *hist_data,
4504 ret = create_hitcount_val(hist_data);
4508 fields_str = hist_data->attrs->vals_str;
4523 ret = create_val_field(hist_data, j++, file, field_str);
4532 if (j == 1 && hist_data->attrs->no_hitcount) {
4533 hist_err(hist_data->event_file->tr, HIST_ERR_NEED_NOHC_VAL, 0);
4540 static int create_key_field(struct hist_trigger_data *hist_data,
4546 struct trace_array *tr = hist_data->event_file->tr;
4560 hist_field = create_hist_field(hist_data, NULL, flags, NULL);
4562 hist_field = parse_expr(hist_data, file, field_str, flags,
4579 hist_data->fields[key_idx] = hist_field;
4582 hist_data->fields[key_idx]->size = key_size;
4583 hist_data->fields[key_idx]->offset = key_offset;
4585 hist_data->key_size += key_size;
4587 if (hist_data->key_size > HIST_KEY_SIZE_MAX) {
4592 hist_data->n_keys++;
4593 hist_data->n_fields++;
4595 if (WARN_ON(hist_data->n_keys > TRACING_MAP_KEYS_MAX))
4603 static int create_key_fields(struct hist_trigger_data *hist_data,
4606 unsigned int i, key_offset = 0, n_vals = hist_data->n_vals;
4610 fields_str = hist_data->attrs->keys_str;
4618 ret = create_key_field(hist_data, i, key_offset,
4633 static int create_var_fields(struct hist_trigger_data *hist_data,
4636 unsigned int i, j = hist_data->n_vals;
4639 unsigned int n_vars = hist_data->attrs->var_defs.n_vars;
4642 char *var_name = hist_data->attrs->var_defs.name[i];
4643 char *expr = hist_data->attrs->var_defs.expr[i];
4645 ret = create_var_field(hist_data, j++, file, var_name, expr);
4653 static void free_var_defs(struct hist_trigger_data *hist_data)
4657 for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) {
4658 kfree(hist_data->attrs->var_defs.name[i]);
4659 kfree(hist_data->attrs->var_defs.expr[i]);
4662 hist_data->attrs->var_defs.n_vars = 0;
4665 static int parse_var_defs(struct hist_trigger_data *hist_data)
4667 struct trace_array *tr = hist_data->event_file->tr;
4672 for (i = 0; i < hist_data->attrs->n_assignments; i++) {
4673 str = hist_data->attrs->assignment_str[i];
4698 hist_data->attrs->var_defs.name[n_vars] = s;
4702 kfree(hist_data->attrs->var_defs.name[n_vars]);
4703 hist_data->attrs->var_defs.name[n_vars] = NULL;
4707 hist_data->attrs->var_defs.expr[n_vars++] = s;
4709 hist_data->attrs->var_defs.n_vars = n_vars;
4715 free_var_defs(hist_data);
4720 static int create_hist_fields(struct hist_trigger_data *hist_data,
4725 ret = parse_var_defs(hist_data);
4729 ret = create_val_fields(hist_data, file);
4733 ret = create_var_fields(hist_data, file);
4737 ret = create_key_fields(hist_data, file);
4740 free_var_defs(hist_data);
4761 static int create_sort_keys(struct hist_trigger_data *hist_data)
4763 struct trace_array *tr = hist_data->event_file->tr;
4764 char *fields_str = hist_data->attrs->sort_key_str;
4769 hist_data->n_sort_keys = 1; /* we always have at least one, hitcount */
4779 sort_key = &hist_data->sort_keys[i];
4814 for (j = 1, k = 1; j < hist_data->n_fields; j++) {
4817 hist_field = hist_data->fields[j];
4836 if (j == hist_data->n_fields) {
4843 hist_data->n_sort_keys = i;
4848 static void destroy_actions(struct hist_trigger_data *hist_data)
4852 for (i = 0; i < hist_data->n_actions; i++) {
4853 struct action_data *data = hist_data->actions[i];
4859 track_data_destroy(hist_data, data);
4865 static int parse_actions(struct hist_trigger_data *hist_data)
4867 struct trace_array *tr = hist_data->event_file->tr;
4874 for (i = 0; i < hist_data->attrs->n_actions; i++) {
4878 str = hist_data->attrs->action_str[i];
4895 data = track_data_parse(hist_data, action_str, hid);
4907 hist_data->actions[hist_data->n_actions++] = data;
4913 static int create_actions(struct hist_trigger_data *hist_data)
4919 for (i = 0; i < hist_data->attrs->n_actions; i++) {
4920 data = hist_data->actions[i];
4923 ret = onmatch_create(hist_data, data);
4928 ret = track_data_create(hist_data, data);
4941 struct hist_trigger_data *hist_data,
4946 for (i = 0; i < hist_data->n_actions; i++) {
4947 struct action_data *data = hist_data->actions[i];
4954 track_data_print(m, hist_data, elt, data);
4959 struct hist_trigger_data *hist_data,
4965 for (i = 0; i < hist_data->n_save_vars; i++) {
4966 seq_printf(m, "%s", hist_data->save_vars[i]->var->var.name);
4967 if (i < hist_data->n_save_vars - 1)
4982 struct hist_trigger_data *hist_data,
4992 print_action_spec(m, hist_data, data);
4998 struct hist_trigger_data *hist_data,
5006 print_action_spec(m, hist_data, data);
5011 static bool actions_match(struct hist_trigger_data *hist_data,
5016 if (hist_data->n_actions != hist_data_test->n_actions)
5019 for (i = 0; i < hist_data->n_actions; i++) {
5020 struct action_data *data = hist_data->actions[i];
5070 struct hist_trigger_data *hist_data)
5074 for (i = 0; i < hist_data->n_actions; i++) {
5075 struct action_data *data = hist_data->actions[i];
5078 print_onmatch_spec(m, hist_data, data);
5081 print_track_data_spec(m, hist_data, data);
5085 static void destroy_field_var_hists(struct hist_trigger_data *hist_data)
5089 for (i = 0; i < hist_data->n_field_var_hists; i++) {
5090 kfree(hist_data->field_var_hists[i]->cmd);
5091 kfree(hist_data->field_var_hists[i]);
5095 static void destroy_hist_data(struct hist_trigger_data *hist_data)
5097 if (!hist_data)
5100 destroy_hist_trigger_attrs(hist_data->attrs);
5101 destroy_hist_fields(hist_data);
5102 tracing_map_destroy(hist_data->map);
5104 destroy_actions(hist_data);
5105 destroy_field_vars(hist_data);
5106 destroy_field_var_hists(hist_data);
5108 kfree(hist_data);
5111 static int create_tracing_map_fields(struct hist_trigger_data *hist_data)
5113 struct tracing_map *map = hist_data->map;
5118 for_each_hist_field(i, hist_data) {
5119 hist_field = hist_data->fields[i];
5149 hist_field->var.hist_data = hist_data;
5163 struct hist_trigger_data *hist_data;
5166 hist_data = kzalloc_obj(*hist_data);
5167 if (!hist_data)
5170 hist_data->attrs = attrs;
5171 hist_data->remove = remove;
5172 hist_data->event_file = file;
5174 ret = parse_actions(hist_data);
5178 ret = create_hist_fields(hist_data, file);
5182 ret = create_sort_keys(hist_data);
5188 hist_data->map = tracing_map_create(map_bits, hist_data->key_size,
5189 map_ops, hist_data);
5190 if (IS_ERR(hist_data->map)) {
5191 ret = PTR_ERR(hist_data->map);
5192 hist_data->map = NULL;
5196 ret = create_tracing_map_fields(hist_data);
5200 return hist_data;
5202 hist_data->attrs = NULL;
5204 destroy_hist_data(hist_data);
5206 hist_data = ERR_PTR(ret);
5211 static void hist_trigger_elt_update(struct hist_trigger_data *hist_data,
5225 for_each_hist_val_field(i, hist_data) {
5226 hist_field = hist_data->fields[i];
5237 str_start = hist_data->n_field_var_str +
5238 hist_data->n_save_var_str;
5267 for_each_hist_key_field(i, hist_data) {
5268 hist_field = hist_data->fields[i];
5276 update_field_vars(hist_data, elt, buffer, rbe, rec);
5307 hist_trigger_actions(struct hist_trigger_data *hist_data,
5316 for (i = 0; i < hist_data->n_actions; i++) {
5317 data = hist_data->actions[i];
5318 data->fn(hist_data, elt, buffer, rec, rbe, key, data, var_ref_vals);
5405 struct hist_trigger_data *hist_data = data->private_data;
5406 bool use_compound_key = (hist_data->n_keys > 1);
5421 memset(hist_pad->compound_key, 0, hist_data->key_size);
5423 for_each_hist_key_field(i, hist_data) {
5424 key_field = hist_data->fields[i];
5458 if (hist_data->n_var_refs &&
5459 !resolve_var_refs(hist_data, key, hist_pad->var_ref_vals, false))
5462 elt = tracing_map_insert(hist_data->map, key);
5466 hist_trigger_elt_update(hist_data, elt, buffer, rec, rbe, hist_pad->var_ref_vals);
5468 if (resolve_var_refs(hist_data, key, hist_pad->var_ref_vals, true)) {
5469 hist_trigger_actions(hist_data, elt, buffer, rec, rbe,
5496 struct hist_trigger_data *hist_data,
5508 for_each_hist_key_field(i, hist_data) {
5509 key_field = hist_data->fields[i];
5511 if (i > hist_data->n_vals)
5653 struct hist_trigger_data *hist_data,
5662 hist_trigger_print_key(m, hist_data, key, elt);
5665 if (!hist_data->attrs->no_hitcount)
5668 for (i = 1; i < hist_data->n_vals; i++) {
5669 field_name = hist_field_name(hist_data->fields[i], 0);
5670 flags = hist_data->fields[i]->flags;
5678 print_actions(m, hist_data, elt);
5684 struct hist_trigger_data *hist_data)
5687 struct tracing_map *map = hist_data->map;
5692 n_entries = tracing_map_sort_entries(map, hist_data->sort_keys,
5693 hist_data->n_sort_keys,
5701 for (j = 0; j < hist_data->n_vals; j++) {
5702 if (!(hist_data->fields[j]->flags &
5706 stats = kzalloc_objs(*stats, hist_data->n_vals);
5721 hist_trigger_entry_print(m, hist_data, stats,
5735 struct hist_trigger_data *hist_data;
5745 hist_data = data->private_data;
5746 n_entries = print_entries(m, hist_data);
5750 track_data_snapshot_print(m, hist_data);
5753 (u64)atomic64_read(&hist_data->map->hits),
5754 n_entries, (u64)atomic64_read(&hist_data->map->drops));
5765 struct hist_trigger_data *hist_data;
5771 hist_data = data->private_data;
5772 ret += atomic64_read(&hist_data->map->hits);
5940 seq_printf(m, " var_ref_idx (into hist_data->var_refs[]): %u\n",
5947 seq_printf(m, " var.hist_data: %p\n", field->var.hist_data);
5948 seq_printf(m, " var_ref_idx (into hist_data->var_refs[]): %u\n",
5972 seq_printf(m, "\n hist_data->%s[%d]:\n", vars_name, i);
6008 seq_printf(m, "\n hist_data->actions[%d].track_data.var_ref:\n", i);
6014 seq_printf(m, "\n hist_data->actions[%d].track_data.track_var:\n", i);
6022 seq_printf(m, "\n hist_data->actions[%d].match_data.event_system: %s\n",
6024 seq_printf(m, " hist_data->actions[%d].match_data.event: %s\n",
6032 struct hist_trigger_data *hist_data)
6036 if (hist_data->n_actions)
6039 for (i = 0; i < hist_data->n_actions; i++) {
6040 struct action_data *action = hist_data->actions[i];
6047 if (hist_data->n_save_vars)
6050 for (i = 0; i < hist_data->n_save_vars; i++) {
6051 ret = field_var_debug_show(m, hist_data->save_vars[i], i, true);
6062 struct hist_trigger_data *hist_data;
6072 hist_data = data->private_data;
6074 seq_printf(m, "hist_data: %p\n\n", hist_data);
6075 seq_printf(m, " n_vals: %u\n", hist_data->n_vals);
6076 seq_printf(m, " n_keys: %u\n", hist_data->n_keys);
6077 seq_printf(m, " n_fields: %u\n", hist_data->n_fields);
6081 seq_puts(m, " hist_data->fields[0]:\n");
6082 ret = hist_field_debug_show(m, hist_data->fields[0],
6087 for (i = 1; i < hist_data->n_vals; i++) {
6088 seq_printf(m, "\n hist_data->fields[%d]:\n", i);
6089 ret = hist_field_debug_show(m, hist_data->fields[i], 0);
6096 for (i = hist_data->n_vals; i < hist_data->n_fields; i++) {
6097 seq_printf(m, "\n hist_data->fields[%d]:\n", i);
6098 ret = hist_field_debug_show(m, hist_data->fields[i],
6104 if (hist_data->n_var_refs)
6107 for (i = 0; i < hist_data->n_var_refs; i++) {
6108 seq_printf(m, "\n hist_data->var_refs[%d]:\n", i);
6109 ret = hist_field_debug_show(m, hist_data->var_refs[i],
6115 if (hist_data->n_field_vars)
6118 for (i = 0; i < hist_data->n_field_vars; i++) {
6119 ret = field_var_debug_show(m, hist_data->field_vars[i], i, false);
6124 ret = hist_actions_debug_show(m, hist_data);
6209 struct hist_trigger_data *hist_data = data->private_data;
6222 for_each_hist_key_field(i, hist_data) {
6223 field = hist_data->fields[i];
6225 if (i > hist_data->n_vals)
6239 for_each_hist_val_field(i, hist_data) {
6240 field = hist_data->fields[i];
6247 if (hist_data->attrs->no_hitcount)
6263 for_each_hist_val_field(i, hist_data) {
6264 field = hist_data->fields[i];
6276 for (i = 0; i < hist_data->n_sort_keys; i++) {
6281 first_key_idx = hist_data->n_vals - hist_data->n_vars;
6283 sort_key = &hist_data->sort_keys[i];
6296 idx += hist_data->n_vars;
6297 hist_field_print(m, hist_data->fields[idx]);
6303 seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits));
6304 if (hist_data->enable_timestamps)
6305 seq_printf(m, ":clock=%s", hist_data->attrs->clock);
6306 if (hist_data->attrs->no_hitcount)
6309 print_actions_spec(m, hist_data);
6326 struct hist_trigger_data *hist_data = data->private_data;
6331 if (!data->ref && hist_data->attrs->name)
6332 save_named_trigger(hist_data->attrs->name, data);
6339 static void unregister_field_var_hists(struct hist_trigger_data *hist_data)
6346 for (i = 0; i < hist_data->n_field_var_hists; i++) {
6347 file = hist_data->field_var_hists[i]->hist_data->event_file;
6348 cmd = hist_data->field_var_hists[i]->cmd;
6357 struct hist_trigger_data *hist_data = data->private_data;
6370 remove_hist_vars(hist_data);
6372 unregister_field_var_hists(hist_data);
6374 destroy_hist_data(hist_data);
6417 struct hist_trigger_data *hist_data = data->private_data;
6424 tracing_map_clear(hist_data->map);
6455 struct hist_trigger_data *hist_data, *hist_data_test;
6466 hist_data = data->private_data;
6469 if (hist_data->n_vals != hist_data_test->n_vals ||
6470 hist_data->n_fields != hist_data_test->n_fields ||
6471 hist_data->n_sort_keys != hist_data_test->n_sort_keys)
6480 for_each_hist_field(i, hist_data) {
6481 key_field = hist_data->fields[i];
6501 for (i = 0; i < hist_data->n_sort_keys; i++) {
6502 sort_key = &hist_data->sort_keys[i];
6514 if (!actions_match(hist_data, hist_data_test))
6524 struct hist_trigger_data *hist_data = data->private_data;
6528 if (!hist_data->attrs->pause && !hist_data->attrs->cont &&
6529 !hist_data->attrs->clear)
6532 if (hist_data->attrs->name) {
6533 named_data = find_named_trigger(hist_data->attrs->name);
6541 if (hist_data->attrs->name && !named_data)
6548 if (hist_data->attrs->pause)
6550 else if (hist_data->attrs->cont)
6552 else if (hist_data->attrs->clear)
6586 struct hist_trigger_data *hist_data = data->private_data;
6591 if (hist_data->attrs->name) {
6592 named_data = find_named_trigger(hist_data->attrs->name);
6596 hist_err(tr, HIST_ERR_NAMED_MISMATCH, errpos(hist_data->attrs->name));
6603 if (hist_data->attrs->name && !named_data)
6618 if (hist_data->attrs->cont || hist_data->attrs->clear) {
6624 if (hist_data->attrs->pause)
6644 if (hist_data->enable_timestamps) {
6645 char *clock = hist_data->attrs->clock;
6647 ret = tracing_set_clock(file->tr, hist_data->attrs->clock);
6659 if (hist_data->enable_timestamps)
6666 remove_hist_vars(hist_data);
6667 destroy_hist_data(hist_data);
6695 struct hist_trigger_data *hist_data = data->private_data;
6701 if (hist_data->attrs->name)
6702 named_data = find_named_trigger(hist_data->attrs->name);
6719 struct hist_trigger_data *hist_data = data->private_data;
6724 if (hist_data->attrs->name)
6725 named_data = find_named_trigger(hist_data->attrs->name);
6731 hist_data = test->private_data;
6732 if (check_var_refs(hist_data))
6746 struct hist_trigger_data *hist_data = data->private_data;
6750 if (hist_data->attrs->name)
6751 named_data = find_named_trigger(hist_data->attrs->name);
6765 if (hist_data->enable_timestamps) {
6766 if (!hist_data->remove || test)
6776 struct hist_trigger_data *hist_data;
6783 hist_data = test->private_data;
6784 if (check_var_refs(hist_data))
6795 struct hist_trigger_data *hist_data;
6806 hist_data = test->private_data;
6816 if (hist_data->enable_timestamps)
6832 struct hist_trigger_data *hist_data;
6903 hist_data = create_hist_data(hist_trigger_bits, attrs, file, remove);
6904 if (IS_ERR(hist_data)) {
6906 return PTR_ERR(hist_data);
6909 trigger_data = trigger_data_alloc(cmd_ops, cmd, param, hist_data);
6942 ret = create_actions(hist_data);
6946 if (has_hist_vars(hist_data) || hist_data->n_var_refs) {
6947 ret = save_hist_vars(hist_data);
6952 ret = tracing_map_init(hist_data->map);
6979 remove_hist_vars(hist_data);
6983 destroy_hist_data(hist_data);