summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2019-07-04 11:13:46 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2019-07-09 09:13:27 -0400
commite56fbc9dc79ce0fdc49ffadd062214ddd02f65b6 (patch)
treeb108e9b4fcb4cc1be29778253097089884b00f23
parentd8f9da240495b50766239410f9b0c715ca506a67 (diff)
perf tools: Use list_del_init() more thorougly
To allow for destructors to check if they're operating on a object still in a list, and to avoid going from use after free list entries into still valid, or even also other already removed from list entries. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Link: https://lkml.kernel.org/n/tip-deh17ub44atyox3j90e6rksu@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/builtin-ftrace.c2
-rw-r--r--tools/perf/builtin-lock.c8
-rw-r--r--tools/perf/pmu-events/jevents.c2
-rw-r--r--tools/perf/tests/switch-tracking.c2
-rw-r--r--tools/perf/ui/gtk/annotate.c2
-rw-r--r--tools/perf/util/annotate.c4
-rw-r--r--tools/perf/util/auxtrace.c4
-rw-r--r--tools/perf/util/bpf-loader.c2
-rw-r--r--tools/perf/util/call-path.c2
-rw-r--r--tools/perf/util/callchain.c10
-rw-r--r--tools/perf/util/db-export.c4
-rw-r--r--tools/perf/util/dso.c2
-rw-r--r--tools/perf/util/evsel.c2
-rw-r--r--tools/perf/util/hist.c4
-rw-r--r--tools/perf/util/ordered-events.c6
-rw-r--r--tools/perf/util/parse-events.c2
-rw-r--r--tools/perf/util/pmu.c2
-rw-r--r--tools/perf/util/probe-event.c2
-rw-r--r--tools/perf/util/s390-cpumsf.c2
-rw-r--r--tools/perf/util/srccode.c2
-rw-r--r--tools/perf/util/symbol-elf.c6
-rw-r--r--tools/perf/util/thread.c4
22 files changed, 38 insertions, 38 deletions
diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
index 9c228c55e1fb..66d5a6658daf 100644
--- a/tools/perf/builtin-ftrace.c
+++ b/tools/perf/builtin-ftrace.c
@@ -431,7 +431,7 @@ static void delete_filter_func(struct list_head *head)
431 struct filter_entry *pos, *tmp; 431 struct filter_entry *pos, *tmp;
432 432
433 list_for_each_entry_safe(pos, tmp, head, list) { 433 list_for_each_entry_safe(pos, tmp, head, list) {
434 list_del(&pos->list); 434 list_del_init(&pos->list);
435 free(pos); 435 free(pos);
436 } 436 }
437} 437}
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index c0be44e65e9d..574e30ec6d7c 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -454,7 +454,7 @@ broken:
454 /* broken lock sequence, discard it */ 454 /* broken lock sequence, discard it */
455 ls->discard = 1; 455 ls->discard = 1;
456 bad_hist[BROKEN_ACQUIRE]++; 456 bad_hist[BROKEN_ACQUIRE]++;
457 list_del(&seq->list); 457 list_del_init(&seq->list);
458 free(seq); 458 free(seq);
459 goto end; 459 goto end;
460 default: 460 default:
@@ -515,7 +515,7 @@ static int report_lock_acquired_event(struct perf_evsel *evsel,
515 /* broken lock sequence, discard it */ 515 /* broken lock sequence, discard it */
516 ls->discard = 1; 516 ls->discard = 1;
517 bad_hist[BROKEN_ACQUIRED]++; 517 bad_hist[BROKEN_ACQUIRED]++;
518 list_del(&seq->list); 518 list_del_init(&seq->list);
519 free(seq); 519 free(seq);
520 goto end; 520 goto end;
521 default: 521 default:
@@ -570,7 +570,7 @@ static int report_lock_contended_event(struct perf_evsel *evsel,
570 /* broken lock sequence, discard it */ 570 /* broken lock sequence, discard it */
571 ls->discard = 1; 571 ls->discard = 1;
572 bad_hist[BROKEN_CONTENDED]++; 572 bad_hist[BROKEN_CONTENDED]++;
573 list_del(&seq->list); 573 list_del_init(&seq->list);
574 free(seq); 574 free(seq);
575 goto end; 575 goto end;
576 default: 576 default:
@@ -639,7 +639,7 @@ static int report_lock_release_event(struct perf_evsel *evsel,
639 639
640 ls->nr_release++; 640 ls->nr_release++;
641free_seq: 641free_seq:
642 list_del(&seq->list); 642 list_del_init(&seq->list);
643 free(seq); 643 free(seq);
644end: 644end:
645 return 0; 645 return 0;
diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c
index 287a6f10ca48..1a91a197cafb 100644
--- a/tools/perf/pmu-events/jevents.c
+++ b/tools/perf/pmu-events/jevents.c
@@ -407,7 +407,7 @@ static void free_arch_std_events(void)
407 407
408 list_for_each_entry_safe(es, next, &arch_std_events, list) { 408 list_for_each_entry_safe(es, next, &arch_std_events, list) {
409 FOR_ALL_EVENT_STRUCT_FIELDS(FREE_EVENT_FIELD); 409 FOR_ALL_EVENT_STRUCT_FIELDS(FREE_EVENT_FIELD);
410 list_del(&es->list); 410 list_del_init(&es->list);
411 free(es); 411 free(es);
412 } 412 }
413} 413}
diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c
index 744409dce65f..6cdab5f4812a 100644
--- a/tools/perf/tests/switch-tracking.c
+++ b/tools/perf/tests/switch-tracking.c
@@ -238,7 +238,7 @@ static void free_event_nodes(struct list_head *events)
238 238
239 while (!list_empty(events)) { 239 while (!list_empty(events)) {
240 node = list_entry(events->next, struct event_node, list); 240 node = list_entry(events->next, struct event_node, list);
241 list_del(&node->list); 241 list_del_init(&node->list);
242 free(node); 242 free(node);
243 } 243 }
244} 244}
diff --git a/tools/perf/ui/gtk/annotate.c b/tools/perf/ui/gtk/annotate.c
index df49c9ba1785..3af87c18a914 100644
--- a/tools/perf/ui/gtk/annotate.c
+++ b/tools/perf/ui/gtk/annotate.c
@@ -152,7 +152,7 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,
152 gtk_container_add(GTK_CONTAINER(window), view); 152 gtk_container_add(GTK_CONTAINER(window), view);
153 153
154 list_for_each_entry_safe(pos, n, &notes->src->source, al.node) { 154 list_for_each_entry_safe(pos, n, &notes->src->source, al.node) {
155 list_del(&pos->al.node); 155 list_del_init(&pos->al.node);
156 disasm_line__free(pos); 156 disasm_line__free(pos);
157 } 157 }
158 158
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index ef0e6028684c..ac9ad2330f93 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1586,7 +1586,7 @@ static void delete_last_nop(struct symbol *sym)
1586 return; 1586 return;
1587 } 1587 }
1588 1588
1589 list_del(&dl->al.node); 1589 list_del_init(&dl->al.node);
1590 disasm_line__free(dl); 1590 disasm_line__free(dl);
1591 } 1591 }
1592} 1592}
@@ -2463,7 +2463,7 @@ void annotated_source__purge(struct annotated_source *as)
2463 struct annotation_line *al, *n; 2463 struct annotation_line *al, *n;
2464 2464
2465 list_for_each_entry_safe(al, n, &as->source, node) { 2465 list_for_each_entry_safe(al, n, &as->source, node) {
2466 list_del(&al->node); 2466 list_del_init(&al->node);
2467 disasm_line__free(disasm_line(al)); 2467 disasm_line__free(disasm_line(al));
2468 } 2468 }
2469} 2469}
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index b033a43dfe3b..ec0af36697c4 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -408,7 +408,7 @@ void auxtrace_queues__free(struct auxtrace_queues *queues)
408 408
409 buffer = list_entry(queues->queue_array[i].head.next, 409 buffer = list_entry(queues->queue_array[i].head.next,
410 struct auxtrace_buffer, list); 410 struct auxtrace_buffer, list);
411 list_del(&buffer->list); 411 list_del_init(&buffer->list);
412 auxtrace_buffer__free(buffer); 412 auxtrace_buffer__free(buffer);
413 } 413 }
414 } 414 }
@@ -612,7 +612,7 @@ void auxtrace_index__free(struct list_head *head)
612 struct auxtrace_index *auxtrace_index, *n; 612 struct auxtrace_index *auxtrace_index, *n;
613 613
614 list_for_each_entry_safe(auxtrace_index, n, head, list) { 614 list_for_each_entry_safe(auxtrace_index, n, head, list) {
615 list_del(&auxtrace_index->list); 615 list_del_init(&auxtrace_index->list);
616 free(auxtrace_index); 616 free(auxtrace_index);
617 } 617 }
618} 618}
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index 93d0f239ad4f..c61974a50aa5 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -829,7 +829,7 @@ static void
829bpf_map_op__delete(struct bpf_map_op *op) 829bpf_map_op__delete(struct bpf_map_op *op)
830{ 830{
831 if (!list_empty(&op->list)) 831 if (!list_empty(&op->list))
832 list_del(&op->list); 832 list_del_init(&op->list);
833 if (op->key_type == BPF_MAP_KEY_RANGES) 833 if (op->key_type == BPF_MAP_KEY_RANGES)
834 parse_events__clear_array(&op->k.array); 834 parse_events__clear_array(&op->k.array);
835 free(op); 835 free(op);
diff --git a/tools/perf/util/call-path.c b/tools/perf/util/call-path.c
index e8a80c41cba3..5c60b8be1cf6 100644
--- a/tools/perf/util/call-path.c
+++ b/tools/perf/util/call-path.c
@@ -40,7 +40,7 @@ void call_path_root__free(struct call_path_root *cpr)
40 struct call_path_block *pos, *n; 40 struct call_path_block *pos, *n;
41 41
42 list_for_each_entry_safe(pos, n, &cpr->blocks, node) { 42 list_for_each_entry_safe(pos, n, &cpr->blocks, node) {
43 list_del(&pos->node); 43 list_del_init(&pos->node);
44 free(pos); 44 free(pos);
45 } 45 }
46 free(cpr); 46 free(cpr);
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index b4af25dca5eb..8d7d8f62fcca 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -636,7 +636,7 @@ add_child(struct callchain_node *parent,
636 struct callchain_list *call, *tmp; 636 struct callchain_list *call, *tmp;
637 637
638 list_for_each_entry_safe(call, tmp, &new->val, list) { 638 list_for_each_entry_safe(call, tmp, &new->val, list) {
639 list_del(&call->list); 639 list_del_init(&call->list);
640 map__zput(call->ms.map); 640 map__zput(call->ms.map);
641 free(call); 641 free(call);
642 } 642 }
@@ -1002,7 +1002,7 @@ merge_chain_branch(struct callchain_cursor *cursor,
1002 callchain_cursor_append(cursor, list->ip, 1002 callchain_cursor_append(cursor, list->ip,
1003 list->ms.map, list->ms.sym, 1003 list->ms.map, list->ms.sym,
1004 false, NULL, 0, 0, 0, list->srcline); 1004 false, NULL, 0, 0, 0, list->srcline);
1005 list_del(&list->list); 1005 list_del_init(&list->list);
1006 map__zput(list->ms.map); 1006 map__zput(list->ms.map);
1007 free(list); 1007 free(list);
1008 } 1008 }
@@ -1453,13 +1453,13 @@ static void free_callchain_node(struct callchain_node *node)
1453 struct rb_node *n; 1453 struct rb_node *n;
1454 1454
1455 list_for_each_entry_safe(list, tmp, &node->parent_val, list) { 1455 list_for_each_entry_safe(list, tmp, &node->parent_val, list) {
1456 list_del(&list->list); 1456 list_del_init(&list->list);
1457 map__zput(list->ms.map); 1457 map__zput(list->ms.map);
1458 free(list); 1458 free(list);
1459 } 1459 }
1460 1460
1461 list_for_each_entry_safe(list, tmp, &node->val, list) { 1461 list_for_each_entry_safe(list, tmp, &node->val, list) {
1462 list_del(&list->list); 1462 list_del_init(&list->list);
1463 map__zput(list->ms.map); 1463 map__zput(list->ms.map);
1464 free(list); 1464 free(list);
1465 } 1465 }
@@ -1544,7 +1544,7 @@ int callchain_node__make_parent_list(struct callchain_node *node)
1544 1544
1545out: 1545out:
1546 list_for_each_entry_safe(chain, new, &head, list) { 1546 list_for_each_entry_safe(chain, new, &head, list) {
1547 list_del(&chain->list); 1547 list_del_init(&chain->list);
1548 map__zput(chain->ms.map); 1548 map__zput(chain->ms.map);
1549 free(chain); 1549 free(chain);
1550 } 1550 }
diff --git a/tools/perf/util/db-export.c b/tools/perf/util/db-export.c
index 3f2694ccfac7..2394c7506abe 100644
--- a/tools/perf/util/db-export.c
+++ b/tools/perf/util/db-export.c
@@ -34,7 +34,7 @@ static int db_export__deferred(struct db_export *dbe)
34 de = list_entry(dbe->deferred.next, struct deferred_export, 34 de = list_entry(dbe->deferred.next, struct deferred_export,
35 node); 35 node);
36 err = dbe->export_comm(dbe, de->comm); 36 err = dbe->export_comm(dbe, de->comm);
37 list_del(&de->node); 37 list_del_init(&de->node);
38 free(de); 38 free(de);
39 if (err) 39 if (err)
40 return err; 40 return err;
@@ -50,7 +50,7 @@ static void db_export__free_deferred(struct db_export *dbe)
50 while (!list_empty(&dbe->deferred)) { 50 while (!list_empty(&dbe->deferred)) {
51 de = list_entry(dbe->deferred.next, struct deferred_export, 51 de = list_entry(dbe->deferred.next, struct deferred_export,
52 node); 52 node);
53 list_del(&de->node); 53 list_del_init(&de->node);
54 free(de); 54 free(de);
55 } 55 }
56} 56}
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index ebacf07fc9ee..ebc9d46c15a7 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -434,7 +434,7 @@ static void dso__list_add(struct dso *dso)
434 434
435static void dso__list_del(struct dso *dso) 435static void dso__list_del(struct dso *dso)
436{ 436{
437 list_del(&dso->data.open_entry); 437 list_del_init(&dso->data.open_entry);
438 WARN_ONCE(dso__data_open_cnt <= 0, 438 WARN_ONCE(dso__data_open_cnt <= 0,
439 "DSO data fd counter out of bounds."); 439 "DSO data fd counter out of bounds.");
440 dso__data_open_cnt--; 440 dso__data_open_cnt--;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 7ede674edf07..ebb46da4dfe5 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -1298,7 +1298,7 @@ static void perf_evsel__free_config_terms(struct perf_evsel *evsel)
1298 struct perf_evsel_config_term *term, *h; 1298 struct perf_evsel_config_term *term, *h;
1299 1299
1300 list_for_each_entry_safe(term, h, &evsel->config_terms, list) { 1300 list_for_each_entry_safe(term, h, &evsel->config_terms, list) {
1301 list_del(&term->list); 1301 list_del_init(&term->list);
1302 free(term); 1302 free(term);
1303 } 1303 }
1304} 1304}
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 9b0ee0ef0f44..f24fd1954f6c 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -2741,10 +2741,10 @@ static void hists_evsel__exit(struct perf_evsel *evsel)
2741 2741
2742 list_for_each_entry_safe(node, tmp, &hists->hpp_formats, list) { 2742 list_for_each_entry_safe(node, tmp, &hists->hpp_formats, list) {
2743 perf_hpp_list__for_each_format_safe(&node->hpp, fmt, pos) { 2743 perf_hpp_list__for_each_format_safe(&node->hpp, fmt, pos) {
2744 list_del(&fmt->list); 2744 list_del_init(&fmt->list);
2745 free(fmt); 2745 free(fmt);
2746 } 2746 }
2747 list_del(&node->list); 2747 list_del_init(&node->list);
2748 free(node); 2748 free(node);
2749 } 2749 }
2750} 2750}
diff --git a/tools/perf/util/ordered-events.c b/tools/perf/util/ordered-events.c
index 989fed6f43b5..bb5f34b7ab44 100644
--- a/tools/perf/util/ordered-events.c
+++ b/tools/perf/util/ordered-events.c
@@ -138,7 +138,7 @@ static struct ordered_event *alloc_event(struct ordered_events *oe,
138 138
139 if (!list_empty(cache)) { 139 if (!list_empty(cache)) {
140 new = list_entry(cache->next, struct ordered_event, list); 140 new = list_entry(cache->next, struct ordered_event, list);
141 list_del(&new->list); 141 list_del_init(&new->list);
142 } else if (oe->buffer) { 142 } else if (oe->buffer) {
143 new = &oe->buffer->event[oe->buffer_idx]; 143 new = &oe->buffer->event[oe->buffer_idx];
144 if (++oe->buffer_idx == MAX_SAMPLE_BUFFER) 144 if (++oe->buffer_idx == MAX_SAMPLE_BUFFER)
@@ -394,13 +394,13 @@ void ordered_events__free(struct ordered_events *oe)
394 * yet, we need to free only allocated ones ... 394 * yet, we need to free only allocated ones ...
395 */ 395 */
396 if (oe->buffer) { 396 if (oe->buffer) {
397 list_del(&oe->buffer->list); 397 list_del_init(&oe->buffer->list);
398 ordered_events_buffer__free(oe->buffer, oe->buffer_idx, oe); 398 ordered_events_buffer__free(oe->buffer, oe->buffer_idx, oe);
399 } 399 }
400 400
401 /* ... and continue with the rest */ 401 /* ... and continue with the rest */
402 list_for_each_entry_safe(buffer, tmp, &oe->to_free, list) { 402 list_for_each_entry_safe(buffer, tmp, &oe->to_free, list) {
403 list_del(&buffer->list); 403 list_del_init(&buffer->list);
404 ordered_events_buffer__free(buffer, MAX_SAMPLE_BUFFER, oe); 404 ordered_events_buffer__free(buffer, MAX_SAMPLE_BUFFER, oe);
405 } 405 }
406} 406}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index aa439853f20a..371ff3aee769 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -652,7 +652,7 @@ static int add_bpf_event(const char *group, const char *event, int fd,
652 pr_debug("Failed to add BPF event %s:%s\n", 652 pr_debug("Failed to add BPF event %s:%s\n",
653 group, event); 653 group, event);
654 list_for_each_entry_safe(evsel, tmp, &new_evsels, node) { 654 list_for_each_entry_safe(evsel, tmp, &new_evsels, node) {
655 list_del(&evsel->node); 655 list_del_init(&evsel->node);
656 perf_evsel__delete(evsel); 656 perf_evsel__delete(evsel);
657 } 657 }
658 return err; 658 return err;
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 12b677902fbc..f32b710347db 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -1245,7 +1245,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
1245 info->metric_expr = alias->metric_expr; 1245 info->metric_expr = alias->metric_expr;
1246 info->metric_name = alias->metric_name; 1246 info->metric_name = alias->metric_name;
1247 1247
1248 list_del(&term->list); 1248 list_del_init(&term->list);
1249 free(term); 1249 free(term);
1250 } 1250 }
1251 1251
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 0a57b316c4dd..0c3b55d0617d 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2333,7 +2333,7 @@ static void kprobe_blacklist__delete(struct list_head *blacklist)
2333 while (!list_empty(blacklist)) { 2333 while (!list_empty(blacklist)) {
2334 node = list_first_entry(blacklist, 2334 node = list_first_entry(blacklist,
2335 struct kprobe_blacklist_node, list); 2335 struct kprobe_blacklist_node, list);
2336 list_del(&node->list); 2336 list_del_init(&node->list);
2337 zfree(&node->symbol); 2337 zfree(&node->symbol);
2338 free(node); 2338 free(node);
2339 } 2339 }
diff --git a/tools/perf/util/s390-cpumsf.c b/tools/perf/util/s390-cpumsf.c
index cca9cb851d02..83d2e149ef19 100644
--- a/tools/perf/util/s390-cpumsf.c
+++ b/tools/perf/util/s390-cpumsf.c
@@ -756,7 +756,7 @@ static int s390_cpumsf_run_decoder(struct s390_cpumsf_queue *sfq,
756 */ 756 */
757 if (err) { 757 if (err) {
758 sfq->buffer = NULL; 758 sfq->buffer = NULL;
759 list_del(&buffer->list); 759 list_del_init(&buffer->list);
760 auxtrace_buffer__free(buffer); 760 auxtrace_buffer__free(buffer);
761 if (err > 0) /* Buffer done, no error */ 761 if (err > 0) /* Buffer done, no error */
762 err = 0; 762 err = 0;
diff --git a/tools/perf/util/srccode.c b/tools/perf/util/srccode.c
index 688a85a3d454..adfcf1ff464c 100644
--- a/tools/perf/util/srccode.c
+++ b/tools/perf/util/srccode.c
@@ -83,7 +83,7 @@ static void fill_lines(char **lines, int maxline, char *map, int maplen)
83 83
84static void free_srcfile(struct srcfile *sf) 84static void free_srcfile(struct srcfile *sf)
85{ 85{
86 list_del(&sf->nd); 86 list_del_init(&sf->nd);
87 hlist_del(&sf->hash_nd); 87 hlist_del(&sf->hash_nd);
88 map_total_sz -= sf->maplen; 88 map_total_sz -= sf->maplen;
89 munmap(sf->map, sf->maplen); 89 munmap(sf->map, sf->maplen);
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 1d5447594f5d..7d504dc22108 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -1478,7 +1478,7 @@ static void kcore_copy__free_phdrs(struct kcore_copy_info *kci)
1478 struct phdr_data *p, *tmp; 1478 struct phdr_data *p, *tmp;
1479 1479
1480 list_for_each_entry_safe(p, tmp, &kci->phdrs, node) { 1480 list_for_each_entry_safe(p, tmp, &kci->phdrs, node) {
1481 list_del(&p->node); 1481 list_del_init(&p->node);
1482 free(p); 1482 free(p);
1483 } 1483 }
1484} 1484}
@@ -1501,7 +1501,7 @@ static void kcore_copy__free_syms(struct kcore_copy_info *kci)
1501 struct sym_data *s, *tmp; 1501 struct sym_data *s, *tmp;
1502 1502
1503 list_for_each_entry_safe(s, tmp, &kci->syms, node) { 1503 list_for_each_entry_safe(s, tmp, &kci->syms, node) {
1504 list_del(&s->node); 1504 list_del_init(&s->node);
1505 free(s); 1505 free(s);
1506 } 1506 }
1507} 1507}
@@ -2252,7 +2252,7 @@ int cleanup_sdt_note_list(struct list_head *sdt_notes)
2252 int nr_free = 0; 2252 int nr_free = 0;
2253 2253
2254 list_for_each_entry_safe(pos, tmp, sdt_notes, note_list) { 2254 list_for_each_entry_safe(pos, tmp, sdt_notes, note_list) {
2255 list_del(&pos->note_list); 2255 list_del_init(&pos->note_list);
2256 zfree(&pos->name); 2256 zfree(&pos->name);
2257 zfree(&pos->provider); 2257 zfree(&pos->provider);
2258 free(pos); 2258 free(pos);
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
index bbfb9c767f5f..873ab505ca80 100644
--- a/tools/perf/util/thread.c
+++ b/tools/perf/util/thread.c
@@ -93,14 +93,14 @@ void thread__delete(struct thread *thread)
93 down_write(&thread->namespaces_lock); 93 down_write(&thread->namespaces_lock);
94 list_for_each_entry_safe(namespaces, tmp_namespaces, 94 list_for_each_entry_safe(namespaces, tmp_namespaces,
95 &thread->namespaces_list, list) { 95 &thread->namespaces_list, list) {
96 list_del(&namespaces->list); 96 list_del_init(&namespaces->list);
97 namespaces__free(namespaces); 97 namespaces__free(namespaces);
98 } 98 }
99 up_write(&thread->namespaces_lock); 99 up_write(&thread->namespaces_lock);
100 100
101 down_write(&thread->comm_lock); 101 down_write(&thread->comm_lock);
102 list_for_each_entry_safe(comm, tmp_comm, &thread->comm_list, list) { 102 list_for_each_entry_safe(comm, tmp_comm, &thread->comm_list, list) {
103 list_del(&comm->list); 103 list_del_init(&comm->list);
104 comm__free(comm); 104 comm__free(comm);
105 } 105 }
106 up_write(&thread->comm_lock); 106 up_write(&thread->comm_lock);