static void do_trace_mem(struct tracecmd_input *handle) { struct pevent *pevent = tracecmd_get_pevent(handle); struct event_format *event; struct pevent_record *record; int missed_events = 0; int cpus; int cpu; int ret; ret = tracecmd_init_data(handle); if (ret < 0) die("failed to init data"); if (ret > 0) die("trace-cmd mem does not work with latency traces\n"); cpus = tracecmd_cpus(handle); /* Need to get any event */ for (cpu = 0; cpu < cpus; cpu++) { record = tracecmd_peek_data(handle, cpu); if (record) break; } if (!record) die("No records found in file"); ret = pevent_data_type(pevent, record); event = pevent_data_event_from_type(pevent, ret); common_type_field = pevent_find_common_field(event, "common_type"); if (!common_type_field) die("Can't find a 'type' field?"); update_kmalloc(pevent); update_kmalloc_node(pevent); update_kfree(pevent); update_kmem_cache_alloc(pevent); update_kmem_cache_alloc_node(pevent); update_kmem_cache_free(pevent); while ((record = tracecmd_read_next_data(handle, &cpu))) { /* record missed event */ if (!missed_events && record->missed_events) missed_events = 1; process_record(pevent, record); free_record(record); } sort_list(); print_list(); }
TraceViewStore * trace_view_store_new (struct tracecmd_input *handle) { TraceViewStore *newstore; struct record *data; gint cpu, count, total=0; struct temp { guint64 offset; guint64 ts; struct temp *next; } *list, **next, *rec; newstore = (TraceViewStore*) g_object_new (TRACE_VIEW_STORE_TYPE, NULL); g_assert( newstore != NULL ); newstore->handle = handle; newstore->cpus = tracecmd_cpus(handle); tracecmd_ref(handle); newstore->event_filter = pevent_filter_alloc(tracecmd_get_pevent(handle)); newstore->cpu_list = g_new(TraceViewRecord *, newstore->cpus); g_assert(newstore->cpu_list != NULL); newstore->cpu_items = g_new(gint, newstore->cpus); g_assert(newstore->cpu_items != NULL); newstore->all_cpus = 1; newstore->all_events = 1; newstore->cpu_mask = g_new0(guint64, (newstore->cpus >> 6) + 1); g_assert(newstore->cpu_mask != NULL); mask_set_cpus(newstore, newstore->cpus); for (cpu = 0; cpu < newstore->cpus; cpu++) { count = 0; list = NULL; next = &list; data = tracecmd_read_cpu_first(handle, cpu); while (data) { *next = rec = g_malloc(sizeof(*rec)); g_assert(rec != NULL); rec->offset = data->offset; rec->ts = data->ts; rec->next = NULL; next = &rec->next; free_record(data); count++; data = tracecmd_read_data(handle, cpu); } if (count) { TraceViewRecord *trec; struct temp *t; gint i; rec = list; trec = g_new(TraceViewRecord, count); g_assert(trec != NULL); for (i = 0; i < count; i++) { g_assert(rec != NULL); trec[i].cpu = cpu; trec[i].timestamp = rec->ts; trec[i].offset = rec->offset; trec[i].visible = 1; trec[i].pos = i; t = rec; rec = rec->next; g_free(t); } g_assert(rec == NULL); newstore->cpu_list[cpu] = trec; } else newstore->cpu_list[cpu] = NULL; newstore->cpu_items[cpu] = count; total += count; } newstore->actual_rows = total; newstore->rows = g_malloc(sizeof(*newstore->rows) * total + 1); merge_sort_rows_ts(newstore); return newstore; }
static void do_trace_hist(struct tracecmd_input *handle) { struct pevent *pevent = tracecmd_get_pevent(handle); struct event_format *event; struct pevent_record *record; int cpus; int cpu; int ret; ret = tracecmd_init_data(handle); if (ret < 0) die("failed to init data"); if (ret > 0) die("trace-cmd hist does not work with latency traces\n"); cpus = tracecmd_cpus(handle); /* Need to get any event */ for (cpu = 0; cpu < cpus; cpu++) { record = tracecmd_peek_data(handle, cpu); if (record) break; } if (!record) die("No records found in file"); ret = pevent_data_type(pevent, record); event = pevent_data_event_from_type(pevent, ret); long_size = tracecmd_long_size(handle); common_type_field = pevent_find_common_field(event, "common_type"); if (!common_type_field) die("Can't find a 'type' field?"); common_pid_field = pevent_find_common_field(event, "common_pid"); if (!common_pid_field) die("Can't find a 'pid' field?"); update_sched_wakeup(pevent); update_sched_wakeup_new(pevent); update_sched_switch(pevent); update_function(pevent); update_function_graph_entry(pevent); update_function_graph_exit(pevent); update_kernel_stack(pevent); for (cpu = 0; cpu < cpus; cpu++) { for (;;) { struct pevent_record *record; record = tracecmd_read_data(handle, cpu); if (!record) break; /* If we missed events, just flush out the current stack */ if (record->missed_events) flush_stack(); process_record(pevent, record); free_record(record); } } if (current_pid >= 0) save_call_chain(current_pid, ips, ips_idx, 0); if (pending_pid >= 0) save_call_chain(pending_pid, pending_ips, pending_ips_idx, 1); save_stored_stacks(); sort_chains(); print_chains(pevent); }