aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/cs-etm.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 3011c6cae531..aac07f950074 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -175,6 +175,10 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
175 175
176 /* Use metadata to fill in trace parameters for trace decoder */ 176 /* Use metadata to fill in trace parameters for trace decoder */
177 t_params = zalloc(sizeof(*t_params) * etm->num_cpu); 177 t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
178
179 if (!t_params)
180 return;
181
178 for (i = 0; i < etm->num_cpu; i++) { 182 for (i = 0; i < etm->num_cpu; i++) {
179 if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) { 183 if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
180 u32 etmidr = etm->metadata[i][CS_ETM_ETMIDR]; 184 u32 etmidr = etm->metadata[i][CS_ETM_ETMIDR];
@@ -206,14 +210,12 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
206 /* Set decoder parameters to simply print the trace packets */ 210 /* Set decoder parameters to simply print the trace packets */
207 if (cs_etm__init_decoder_params(&d_params, NULL, 211 if (cs_etm__init_decoder_params(&d_params, NULL,
208 CS_ETM_OPERATION_PRINT)) 212 CS_ETM_OPERATION_PRINT))
209 return; 213 goto out_free;
210 214
211 decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params); 215 decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
212 216
213 zfree(&t_params);
214
215 if (!decoder) 217 if (!decoder)
216 return; 218 goto out_free;
217 do { 219 do {
218 size_t consumed; 220 size_t consumed;
219 221
@@ -228,6 +230,9 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
228 } while (buffer_used < buffer->size); 230 } while (buffer_used < buffer->size);
229 231
230 cs_etm_decoder__free(decoder); 232 cs_etm_decoder__free(decoder);
233
234out_free:
235 zfree(&t_params);
231} 236}
232 237
233static int cs_etm__flush_events(struct perf_session *session, 238static int cs_etm__flush_events(struct perf_session *session,
@@ -379,7 +384,7 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
379{ 384{
380 int i; 385 int i;
381 struct cs_etm_decoder_params d_params; 386 struct cs_etm_decoder_params d_params;
382 struct cs_etm_trace_params *t_params; 387 struct cs_etm_trace_params *t_params = NULL;
383 struct cs_etm_queue *etmq; 388 struct cs_etm_queue *etmq;
384 size_t szp = sizeof(struct cs_etm_packet); 389 size_t szp = sizeof(struct cs_etm_packet);
385 390
@@ -461,8 +466,6 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
461 466
462 etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params); 467 etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
463 468
464 zfree(&t_params);
465
466 if (!etmq->decoder) 469 if (!etmq->decoder)
467 goto out_free; 470 goto out_free;
468 471
@@ -475,6 +478,8 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
475 cs_etm__mem_access)) 478 cs_etm__mem_access))
476 goto out_free_decoder; 479 goto out_free_decoder;
477 480
481 zfree(&t_params);
482
478 etmq->offset = 0; 483 etmq->offset = 0;
479 etmq->period_instructions = 0; 484 etmq->period_instructions = 0;
480 485
@@ -483,6 +488,7 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
483out_free_decoder: 488out_free_decoder:
484 cs_etm_decoder__free(etmq->decoder); 489 cs_etm_decoder__free(etmq->decoder);
485out_free: 490out_free:
491 zfree(&t_params);
486 zfree(&etmq->event_buf); 492 zfree(&etmq->event_buf);
487 zfree(&etmq->last_branch); 493 zfree(&etmq->last_branch);
488 zfree(&etmq->last_branch_rb); 494 zfree(&etmq->last_branch_rb);