|
@@ -239,6 +239,7 @@ static void cs_etm__free(struct perf_session *session)
|
|
for (i = 0; i < aux->num_cpu; i++)
|
|
for (i = 0; i < aux->num_cpu; i++)
|
|
zfree(&aux->metadata[i]);
|
|
zfree(&aux->metadata[i]);
|
|
|
|
|
|
|
|
+ thread__zput(aux->unknown_thread);
|
|
zfree(&aux->metadata);
|
|
zfree(&aux->metadata);
|
|
zfree(&aux);
|
|
zfree(&aux);
|
|
}
|
|
}
|
|
@@ -612,8 +613,8 @@ cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
|
|
return buff->len;
|
|
return buff->len;
|
|
}
|
|
}
|
|
|
|
|
|
-static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
|
|
|
|
- struct auxtrace_queue *queue)
|
|
|
|
|
|
+static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
|
|
|
|
+ struct auxtrace_queue *queue)
|
|
{
|
|
{
|
|
struct cs_etm_queue *etmq = queue->priv;
|
|
struct cs_etm_queue *etmq = queue->priv;
|
|
|
|
|
|
@@ -1357,6 +1358,23 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
|
|
etm->auxtrace.free = cs_etm__free;
|
|
etm->auxtrace.free = cs_etm__free;
|
|
session->auxtrace = &etm->auxtrace;
|
|
session->auxtrace = &etm->auxtrace;
|
|
|
|
|
|
|
|
+ etm->unknown_thread = thread__new(999999999, 999999999);
|
|
|
|
+ if (!etm->unknown_thread)
|
|
|
|
+ goto err_free_queues;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Initialize list node so that at thread__zput() we can avoid
|
|
|
|
+ * segmentation fault at list_del_init().
|
|
|
|
+ */
|
|
|
|
+ INIT_LIST_HEAD(&etm->unknown_thread->node);
|
|
|
|
+
|
|
|
|
+ err = thread__set_comm(etm->unknown_thread, "unknown", 0);
|
|
|
|
+ if (err)
|
|
|
|
+ goto err_delete_thread;
|
|
|
|
+
|
|
|
|
+ if (thread__init_map_groups(etm->unknown_thread, etm->machine))
|
|
|
|
+ goto err_delete_thread;
|
|
|
|
+
|
|
if (dump_trace) {
|
|
if (dump_trace) {
|
|
cs_etm__print_auxtrace_info(auxtrace_info->priv, num_cpu);
|
|
cs_etm__print_auxtrace_info(auxtrace_info->priv, num_cpu);
|
|
return 0;
|
|
return 0;
|
|
@@ -1371,16 +1389,18 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
|
|
|
|
|
|
err = cs_etm__synth_events(etm, session);
|
|
err = cs_etm__synth_events(etm, session);
|
|
if (err)
|
|
if (err)
|
|
- goto err_free_queues;
|
|
|
|
|
|
+ goto err_delete_thread;
|
|
|
|
|
|
err = auxtrace_queues__process_index(&etm->queues, session);
|
|
err = auxtrace_queues__process_index(&etm->queues, session);
|
|
if (err)
|
|
if (err)
|
|
- goto err_free_queues;
|
|
|
|
|
|
+ goto err_delete_thread;
|
|
|
|
|
|
etm->data_queued = etm->queues.populated;
|
|
etm->data_queued = etm->queues.populated;
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+err_delete_thread:
|
|
|
|
+ thread__zput(etm->unknown_thread);
|
|
err_free_queues:
|
|
err_free_queues:
|
|
auxtrace_queues__free(&etm->queues);
|
|
auxtrace_queues__free(&etm->queues);
|
|
session->auxtrace = NULL;
|
|
session->auxtrace = NULL;
|