diff options
author | Peter Zijlstra <peterz@infradead.org> | 2018-03-15 12:36:56 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-03-16 15:44:12 -0400 |
commit | edb39592a5877bd91b2e6ee15194268f35b04892 (patch) | |
tree | 6396a76854da50f0df271c7bf4b6cc7c1d45ca8a | |
parent | 32ff77e8cc9e66cc4fb38098f64fd54cc8f54573 (diff) |
perf: Fix sibling iteration
Mark noticed that the change to sibling_list changed some iteration
semantics; because previously we used group_list as list entry,
sibling events would always have an empty sibling_list.
But because we now use sibling_list for both list head and list entry,
siblings will report as having siblings.
Fix this with a custom for_each_sibling_event() iterator.
Fixes: 8343aae66167 ("perf/core: Remove perf_event::group_entry")
Reported-by: Mark Rutland <mark.rutland@arm.com>
Suggested-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: vincent.weaver@maine.edu
Cc: alexander.shishkin@linux.intel.com
Cc: torvalds@linux-foundation.org
Cc: alexey.budankov@linux.intel.com
Cc: valery.cherepennikov@intel.com
Cc: eranian@google.com
Cc: acme@redhat.com
Cc: linux-tip-commits@vger.kernel.org
Cc: davidcc@google.com
Cc: kan.liang@intel.com
Cc: Dmitry.Prohorov@intel.com
Cc: jolsa@redhat.com
Link: https://lkml.kernel.org/r/20180315170129.GX4043@hirez.programming.kicks-ass.net
-rw-r--r-- | arch/alpha/kernel/perf_event.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-imx/mmdc.c | 2 | ||||
-rw-r--r-- | arch/arm/mm/cache-l2x0-pmu.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/perf_event_mipsxx.c | 2 | ||||
-rw-r--r-- | arch/powerpc/perf/core-book3s.c | 2 | ||||
-rw-r--r-- | arch/powerpc/perf/core-fsl-emb.c | 2 | ||||
-rw-r--r-- | arch/sparc/kernel/perf_event.c | 2 | ||||
-rw-r--r-- | arch/x86/events/core.c | 2 | ||||
-rw-r--r-- | arch/x86/events/intel/uncore.c | 2 | ||||
-rw-r--r-- | drivers/bus/arm-cci.c | 2 | ||||
-rw-r--r-- | drivers/bus/arm-ccn.c | 4 | ||||
-rw-r--r-- | drivers/perf/arm_dsu_pmu.c | 2 | ||||
-rw-r--r-- | drivers/perf/arm_pmu.c | 2 | ||||
-rw-r--r-- | drivers/perf/hisilicon/hisi_uncore_pmu.c | 2 | ||||
-rw-r--r-- | drivers/perf/qcom_l2_pmu.c | 7 | ||||
-rw-r--r-- | drivers/perf/qcom_l3_pmu.c | 2 | ||||
-rw-r--r-- | drivers/perf/xgene_pmu.c | 4 | ||||
-rw-r--r-- | include/linux/perf_event.h | 4 | ||||
-rw-r--r-- | kernel/events/core.c | 34 |
19 files changed, 41 insertions, 40 deletions
diff --git a/arch/alpha/kernel/perf_event.c b/arch/alpha/kernel/perf_event.c index 435864c24479..5613aa378a83 100644 --- a/arch/alpha/kernel/perf_event.c +++ b/arch/alpha/kernel/perf_event.c | |||
@@ -351,7 +351,7 @@ static int collect_events(struct perf_event *group, int max_count, | |||
351 | evtype[n] = group->hw.event_base; | 351 | evtype[n] = group->hw.event_base; |
352 | current_idx[n++] = PMC_NO_INDEX; | 352 | current_idx[n++] = PMC_NO_INDEX; |
353 | } | 353 | } |
354 | list_for_each_entry(pe, &group->sibling_list, sibling_list) { | 354 | for_each_sibling_event(pe, group) { |
355 | if (!is_software_event(pe) && pe->state != PERF_EVENT_STATE_OFF) { | 355 | if (!is_software_event(pe) && pe->state != PERF_EVENT_STATE_OFF) { |
356 | if (n >= max_count) | 356 | if (n >= max_count) |
357 | return -1; | 357 | return -1; |
diff --git a/arch/arm/mach-imx/mmdc.c b/arch/arm/mach-imx/mmdc.c index 27a9ca20933e..04b3bf71de94 100644 --- a/arch/arm/mach-imx/mmdc.c +++ b/arch/arm/mach-imx/mmdc.c | |||
@@ -269,7 +269,7 @@ static bool mmdc_pmu_group_is_valid(struct perf_event *event) | |||
269 | return false; | 269 | return false; |
270 | } | 270 | } |
271 | 271 | ||
272 | list_for_each_entry(sibling, &leader->sibling_list, sibling_list) { | 272 | for_each_sibling_event(sibling, leader) { |
273 | if (!mmdc_pmu_group_event_is_valid(sibling, pmu, &counter_mask)) | 273 | if (!mmdc_pmu_group_event_is_valid(sibling, pmu, &counter_mask)) |
274 | return false; | 274 | return false; |
275 | } | 275 | } |
diff --git a/arch/arm/mm/cache-l2x0-pmu.c b/arch/arm/mm/cache-l2x0-pmu.c index 3a89ea4c2b57..afe5b4c7b164 100644 --- a/arch/arm/mm/cache-l2x0-pmu.c +++ b/arch/arm/mm/cache-l2x0-pmu.c | |||
@@ -293,7 +293,7 @@ static bool l2x0_pmu_group_is_valid(struct perf_event *event) | |||
293 | else if (!is_software_event(leader)) | 293 | else if (!is_software_event(leader)) |
294 | return false; | 294 | return false; |
295 | 295 | ||
296 | list_for_each_entry(sibling, &leader->sibling_list, sibling_list) { | 296 | for_each_sibling_event(sibling, leader) { |
297 | if (sibling->pmu == pmu) | 297 | if (sibling->pmu == pmu) |
298 | num_hw++; | 298 | num_hw++; |
299 | else if (!is_software_event(sibling)) | 299 | else if (!is_software_event(sibling)) |
diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index 46097ff3208b..ee73550f0b9a 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c | |||
@@ -711,7 +711,7 @@ static int validate_group(struct perf_event *event) | |||
711 | if (mipsxx_pmu_alloc_counter(&fake_cpuc, &leader->hw) < 0) | 711 | if (mipsxx_pmu_alloc_counter(&fake_cpuc, &leader->hw) < 0) |
712 | return -EINVAL; | 712 | return -EINVAL; |
713 | 713 | ||
714 | list_for_each_entry(sibling, &leader->sibling_list, sibling_list) { | 714 | for_each_sibling_event(sibling, leader) { |
715 | if (mipsxx_pmu_alloc_counter(&fake_cpuc, &sibling->hw) < 0) | 715 | if (mipsxx_pmu_alloc_counter(&fake_cpuc, &sibling->hw) < 0) |
716 | return -EINVAL; | 716 | return -EINVAL; |
717 | } | 717 | } |
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 7c1f66050433..f8908ea4ea73 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
@@ -1426,7 +1426,7 @@ static int collect_events(struct perf_event *group, int max_count, | |||
1426 | flags[n] = group->hw.event_base; | 1426 | flags[n] = group->hw.event_base; |
1427 | events[n++] = group->hw.config; | 1427 | events[n++] = group->hw.config; |
1428 | } | 1428 | } |
1429 | list_for_each_entry(event, &group->sibling_list, sibling_list) { | 1429 | for_each_sibling_event(event, group) { |
1430 | if (event->pmu->task_ctx_nr == perf_hw_context && | 1430 | if (event->pmu->task_ctx_nr == perf_hw_context && |
1431 | event->state != PERF_EVENT_STATE_OFF) { | 1431 | event->state != PERF_EVENT_STATE_OFF) { |
1432 | if (n >= max_count) | 1432 | if (n >= max_count) |
diff --git a/arch/powerpc/perf/core-fsl-emb.c b/arch/powerpc/perf/core-fsl-emb.c index 94c2e63662c6..85f1d18e5fd3 100644 --- a/arch/powerpc/perf/core-fsl-emb.c +++ b/arch/powerpc/perf/core-fsl-emb.c | |||
@@ -277,7 +277,7 @@ static int collect_events(struct perf_event *group, int max_count, | |||
277 | ctrs[n] = group; | 277 | ctrs[n] = group; |
278 | n++; | 278 | n++; |
279 | } | 279 | } |
280 | list_for_each_entry(event, &group->sibling_list, sibling_list) { | 280 | for_each_sibling_event(event, group) { |
281 | if (!is_software_event(event) && | 281 | if (!is_software_event(event) && |
282 | event->state != PERF_EVENT_STATE_OFF) { | 282 | event->state != PERF_EVENT_STATE_OFF) { |
283 | if (n >= max_count) | 283 | if (n >= max_count) |
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index a0a86d369119..d3149baaa33c 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c | |||
@@ -1342,7 +1342,7 @@ static int collect_events(struct perf_event *group, int max_count, | |||
1342 | events[n] = group->hw.event_base; | 1342 | events[n] = group->hw.event_base; |
1343 | current_idx[n++] = PIC_NO_INDEX; | 1343 | current_idx[n++] = PIC_NO_INDEX; |
1344 | } | 1344 | } |
1345 | list_for_each_entry(event, &group->sibling_list, sibling_list) { | 1345 | for_each_sibling_event(event, group) { |
1346 | if (!is_software_event(event) && | 1346 | if (!is_software_event(event) && |
1347 | event->state != PERF_EVENT_STATE_OFF) { | 1347 | event->state != PERF_EVENT_STATE_OFF) { |
1348 | if (n >= max_count) | 1348 | if (n >= max_count) |
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c index 77a4125b6b1f..bfc8f43909c1 100644 --- a/arch/x86/events/core.c +++ b/arch/x86/events/core.c | |||
@@ -990,7 +990,7 @@ static int collect_events(struct cpu_hw_events *cpuc, struct perf_event *leader, | |||
990 | if (!dogrp) | 990 | if (!dogrp) |
991 | return n; | 991 | return n; |
992 | 992 | ||
993 | list_for_each_entry(event, &leader->sibling_list, sibling_list) { | 993 | for_each_sibling_event(event, leader) { |
994 | if (!is_x86_event(event) || | 994 | if (!is_x86_event(event) || |
995 | event->state <= PERF_EVENT_STATE_OFF) | 995 | event->state <= PERF_EVENT_STATE_OFF) |
996 | continue; | 996 | continue; |
diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c index 9e374cd22ad2..a7956fc7ca1d 100644 --- a/arch/x86/events/intel/uncore.c +++ b/arch/x86/events/intel/uncore.c | |||
@@ -354,7 +354,7 @@ uncore_collect_events(struct intel_uncore_box *box, struct perf_event *leader, | |||
354 | if (!dogrp) | 354 | if (!dogrp) |
355 | return n; | 355 | return n; |
356 | 356 | ||
357 | list_for_each_entry(event, &leader->sibling_list, sibling_list) { | 357 | for_each_sibling_event(event, leader) { |
358 | if (!is_box_event(box, event) || | 358 | if (!is_box_event(box, event) || |
359 | event->state <= PERF_EVENT_STATE_OFF) | 359 | event->state <= PERF_EVENT_STATE_OFF) |
360 | continue; | 360 | continue; |
diff --git a/drivers/bus/arm-cci.c b/drivers/bus/arm-cci.c index c98435bdb64f..c4c0c8560cce 100644 --- a/drivers/bus/arm-cci.c +++ b/drivers/bus/arm-cci.c | |||
@@ -1311,7 +1311,7 @@ validate_group(struct perf_event *event) | |||
1311 | if (!validate_event(event->pmu, &fake_pmu, leader)) | 1311 | if (!validate_event(event->pmu, &fake_pmu, leader)) |
1312 | return -EINVAL; | 1312 | return -EINVAL; |
1313 | 1313 | ||
1314 | list_for_each_entry(sibling, &leader->sibling_list, sibling_list) { | 1314 | for_each_sibling_event(sibling, leader) { |
1315 | if (!validate_event(event->pmu, &fake_pmu, sibling)) | 1315 | if (!validate_event(event->pmu, &fake_pmu, sibling)) |
1316 | return -EINVAL; | 1316 | return -EINVAL; |
1317 | } | 1317 | } |
diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c index 1c310a4be000..65b7e4042ece 100644 --- a/drivers/bus/arm-ccn.c +++ b/drivers/bus/arm-ccn.c | |||
@@ -846,11 +846,11 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) | |||
846 | !is_software_event(event->group_leader)) | 846 | !is_software_event(event->group_leader)) |
847 | return -EINVAL; | 847 | return -EINVAL; |
848 | 848 | ||
849 | list_for_each_entry(sibling, &event->group_leader->sibling_list, | 849 | for_each_sibling_event(sibling, event->group_leader) { |
850 | sibling_list) | ||
851 | if (sibling->pmu != event->pmu && | 850 | if (sibling->pmu != event->pmu && |
852 | !is_software_event(sibling)) | 851 | !is_software_event(sibling)) |
853 | return -EINVAL; | 852 | return -EINVAL; |
853 | } | ||
854 | 854 | ||
855 | return 0; | 855 | return 0; |
856 | } | 856 | } |
diff --git a/drivers/perf/arm_dsu_pmu.c b/drivers/perf/arm_dsu_pmu.c index 660680d78147..660cb8ac886a 100644 --- a/drivers/perf/arm_dsu_pmu.c +++ b/drivers/perf/arm_dsu_pmu.c | |||
@@ -536,7 +536,7 @@ static bool dsu_pmu_validate_group(struct perf_event *event) | |||
536 | memset(fake_hw.used_mask, 0, sizeof(fake_hw.used_mask)); | 536 | memset(fake_hw.used_mask, 0, sizeof(fake_hw.used_mask)); |
537 | if (!dsu_pmu_validate_event(event->pmu, &fake_hw, leader)) | 537 | if (!dsu_pmu_validate_event(event->pmu, &fake_hw, leader)) |
538 | return false; | 538 | return false; |
539 | list_for_each_entry(sibling, &leader->sibling_list, sibling_list) { | 539 | for_each_sibling_event(sibling, leader) { |
540 | if (!dsu_pmu_validate_event(event->pmu, &fake_hw, sibling)) | 540 | if (!dsu_pmu_validate_event(event->pmu, &fake_hw, sibling)) |
541 | return false; | 541 | return false; |
542 | } | 542 | } |
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c index 628d7a7b9526..344e2083e941 100644 --- a/drivers/perf/arm_pmu.c +++ b/drivers/perf/arm_pmu.c | |||
@@ -311,7 +311,7 @@ validate_group(struct perf_event *event) | |||
311 | if (!validate_event(event->pmu, &fake_pmu, leader)) | 311 | if (!validate_event(event->pmu, &fake_pmu, leader)) |
312 | return -EINVAL; | 312 | return -EINVAL; |
313 | 313 | ||
314 | list_for_each_entry(sibling, &leader->sibling_list, sibling_list) { | 314 | for_each_sibling_event(sibling, leader) { |
315 | if (!validate_event(event->pmu, &fake_pmu, sibling)) | 315 | if (!validate_event(event->pmu, &fake_pmu, sibling)) |
316 | return -EINVAL; | 316 | return -EINVAL; |
317 | } | 317 | } |
diff --git a/drivers/perf/hisilicon/hisi_uncore_pmu.c b/drivers/perf/hisilicon/hisi_uncore_pmu.c index e3356087fd76..44df61397a38 100644 --- a/drivers/perf/hisilicon/hisi_uncore_pmu.c +++ b/drivers/perf/hisilicon/hisi_uncore_pmu.c | |||
@@ -82,7 +82,7 @@ static bool hisi_validate_event_group(struct perf_event *event) | |||
82 | counters++; | 82 | counters++; |
83 | } | 83 | } |
84 | 84 | ||
85 | list_for_each_entry(sibling, &event->group_leader->sibling_list, sibling_list) { | 85 | for_each_sibling_event(sibling, event->group_leader) { |
86 | if (is_software_event(sibling)) | 86 | if (is_software_event(sibling)) |
87 | continue; | 87 | continue; |
88 | if (sibling->pmu != event->pmu) | 88 | if (sibling->pmu != event->pmu) |
diff --git a/drivers/perf/qcom_l2_pmu.c b/drivers/perf/qcom_l2_pmu.c index 5e535a718965..842135cf35a3 100644 --- a/drivers/perf/qcom_l2_pmu.c +++ b/drivers/perf/qcom_l2_pmu.c | |||
@@ -534,14 +534,14 @@ static int l2_cache_event_init(struct perf_event *event) | |||
534 | return -EINVAL; | 534 | return -EINVAL; |
535 | } | 535 | } |
536 | 536 | ||
537 | list_for_each_entry(sibling, &event->group_leader->sibling_list, | 537 | for_each_sibling_event(sibling, event->group_leader) { |
538 | sibling_list) | ||
539 | if (sibling->pmu != event->pmu && | 538 | if (sibling->pmu != event->pmu && |
540 | !is_software_event(sibling)) { | 539 | !is_software_event(sibling)) { |
541 | dev_dbg_ratelimited(&l2cache_pmu->pdev->dev, | 540 | dev_dbg_ratelimited(&l2cache_pmu->pdev->dev, |
542 | "Can't create mixed PMU group\n"); | 541 | "Can't create mixed PMU group\n"); |
543 | return -EINVAL; | 542 | return -EINVAL; |
544 | } | 543 | } |
544 | } | ||
545 | 545 | ||
546 | cluster = get_cluster_pmu(l2cache_pmu, event->cpu); | 546 | cluster = get_cluster_pmu(l2cache_pmu, event->cpu); |
547 | if (!cluster) { | 547 | if (!cluster) { |
@@ -571,8 +571,7 @@ static int l2_cache_event_init(struct perf_event *event) | |||
571 | return -EINVAL; | 571 | return -EINVAL; |
572 | } | 572 | } |
573 | 573 | ||
574 | list_for_each_entry(sibling, &event->group_leader->sibling_list, | 574 | for_each_sibling_event(sibling, event->group_leader) { |
575 | sibling_list) { | ||
576 | if ((sibling != event) && | 575 | if ((sibling != event) && |
577 | !is_software_event(sibling) && | 576 | !is_software_event(sibling) && |
578 | (L2_EVT_GROUP(sibling->attr.config) == | 577 | (L2_EVT_GROUP(sibling->attr.config) == |
diff --git a/drivers/perf/qcom_l3_pmu.c b/drivers/perf/qcom_l3_pmu.c index 5dedf4b1a552..2dc63d61f2ea 100644 --- a/drivers/perf/qcom_l3_pmu.c +++ b/drivers/perf/qcom_l3_pmu.c | |||
@@ -468,7 +468,7 @@ static bool qcom_l3_cache__validate_event_group(struct perf_event *event) | |||
468 | counters = event_num_counters(event); | 468 | counters = event_num_counters(event); |
469 | counters += event_num_counters(leader); | 469 | counters += event_num_counters(leader); |
470 | 470 | ||
471 | list_for_each_entry(sibling, &leader->sibling_list, sibling_list) { | 471 | for_each_sibling_event(sibling, leader) { |
472 | if (is_software_event(sibling)) | 472 | if (is_software_event(sibling)) |
473 | continue; | 473 | continue; |
474 | if (sibling->pmu != event->pmu) | 474 | if (sibling->pmu != event->pmu) |
diff --git a/drivers/perf/xgene_pmu.c b/drivers/perf/xgene_pmu.c index f1f4a56cab5e..6bdb1dad805f 100644 --- a/drivers/perf/xgene_pmu.c +++ b/drivers/perf/xgene_pmu.c | |||
@@ -949,11 +949,11 @@ static int xgene_perf_event_init(struct perf_event *event) | |||
949 | !is_software_event(event->group_leader)) | 949 | !is_software_event(event->group_leader)) |
950 | return -EINVAL; | 950 | return -EINVAL; |
951 | 951 | ||
952 | list_for_each_entry(sibling, &event->group_leader->sibling_list, | 952 | for_each_sibling_event(sibling, event->group_leader) { |
953 | sibling_list) | ||
954 | if (sibling->pmu != event->pmu && | 953 | if (sibling->pmu != event->pmu && |
955 | !is_software_event(sibling)) | 954 | !is_software_event(sibling)) |
956 | return -EINVAL; | 955 | return -EINVAL; |
956 | } | ||
957 | 957 | ||
958 | return 0; | 958 | return 0; |
959 | } | 959 | } |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 2bb200e1bbea..ff39ab011376 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -536,6 +536,10 @@ struct pmu_event_list { | |||
536 | struct list_head list; | 536 | struct list_head list; |
537 | }; | 537 | }; |
538 | 538 | ||
539 | #define for_each_sibling_event(sibling, event) \ | ||
540 | if ((event)->group_leader == (event)) \ | ||
541 | list_for_each_entry((sibling), &(event)->sibling_list, sibling_list) | ||
542 | |||
539 | /** | 543 | /** |
540 | * struct perf_event - performance event kernel representation: | 544 | * struct perf_event - performance event kernel representation: |
541 | */ | 545 | */ |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 3b4c7792a6ac..4d7a460d6669 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -643,7 +643,7 @@ static void perf_event_update_sibling_time(struct perf_event *leader) | |||
643 | { | 643 | { |
644 | struct perf_event *sibling; | 644 | struct perf_event *sibling; |
645 | 645 | ||
646 | list_for_each_entry(sibling, &leader->sibling_list, sibling_list) | 646 | for_each_sibling_event(sibling, leader) |
647 | perf_event_update_time(sibling); | 647 | perf_event_update_time(sibling); |
648 | } | 648 | } |
649 | 649 | ||
@@ -1828,7 +1828,7 @@ static void perf_group_attach(struct perf_event *event) | |||
1828 | 1828 | ||
1829 | perf_event__header_size(group_leader); | 1829 | perf_event__header_size(group_leader); |
1830 | 1830 | ||
1831 | list_for_each_entry(pos, &group_leader->sibling_list, sibling_list) | 1831 | for_each_sibling_event(pos, group_leader) |
1832 | perf_event__header_size(pos); | 1832 | perf_event__header_size(pos); |
1833 | } | 1833 | } |
1834 | 1834 | ||
@@ -1928,7 +1928,7 @@ static void perf_group_detach(struct perf_event *event) | |||
1928 | out: | 1928 | out: |
1929 | perf_event__header_size(event->group_leader); | 1929 | perf_event__header_size(event->group_leader); |
1930 | 1930 | ||
1931 | list_for_each_entry(tmp, &event->group_leader->sibling_list, sibling_list) | 1931 | for_each_sibling_event(tmp, event->group_leader) |
1932 | perf_event__header_size(tmp); | 1932 | perf_event__header_size(tmp); |
1933 | } | 1933 | } |
1934 | 1934 | ||
@@ -1951,13 +1951,13 @@ static inline int __pmu_filter_match(struct perf_event *event) | |||
1951 | */ | 1951 | */ |
1952 | static inline int pmu_filter_match(struct perf_event *event) | 1952 | static inline int pmu_filter_match(struct perf_event *event) |
1953 | { | 1953 | { |
1954 | struct perf_event *child; | 1954 | struct perf_event *sibling; |
1955 | 1955 | ||
1956 | if (!__pmu_filter_match(event)) | 1956 | if (!__pmu_filter_match(event)) |
1957 | return 0; | 1957 | return 0; |
1958 | 1958 | ||
1959 | list_for_each_entry(child, &event->sibling_list, sibling_list) { | 1959 | for_each_sibling_event(sibling, event) { |
1960 | if (!__pmu_filter_match(child)) | 1960 | if (!__pmu_filter_match(sibling)) |
1961 | return 0; | 1961 | return 0; |
1962 | } | 1962 | } |
1963 | 1963 | ||
@@ -2031,7 +2031,7 @@ group_sched_out(struct perf_event *group_event, | |||
2031 | /* | 2031 | /* |
2032 | * Schedule out siblings (if any): | 2032 | * Schedule out siblings (if any): |
2033 | */ | 2033 | */ |
2034 | list_for_each_entry(event, &group_event->sibling_list, sibling_list) | 2034 | for_each_sibling_event(event, group_event) |
2035 | event_sched_out(event, cpuctx, ctx); | 2035 | event_sched_out(event, cpuctx, ctx); |
2036 | 2036 | ||
2037 | perf_pmu_enable(ctx->pmu); | 2037 | perf_pmu_enable(ctx->pmu); |
@@ -2310,7 +2310,7 @@ group_sched_in(struct perf_event *group_event, | |||
2310 | /* | 2310 | /* |
2311 | * Schedule in siblings as one group (if any): | 2311 | * Schedule in siblings as one group (if any): |
2312 | */ | 2312 | */ |
2313 | list_for_each_entry(event, &group_event->sibling_list, sibling_list) { | 2313 | for_each_sibling_event(event, group_event) { |
2314 | if (event_sched_in(event, cpuctx, ctx)) { | 2314 | if (event_sched_in(event, cpuctx, ctx)) { |
2315 | partial_group = event; | 2315 | partial_group = event; |
2316 | goto group_error; | 2316 | goto group_error; |
@@ -2326,7 +2326,7 @@ group_error: | |||
2326 | * partial group before returning: | 2326 | * partial group before returning: |
2327 | * The events up to the failed event are scheduled out normally. | 2327 | * The events up to the failed event are scheduled out normally. |
2328 | */ | 2328 | */ |
2329 | list_for_each_entry(event, &group_event->sibling_list, sibling_list) { | 2329 | for_each_sibling_event(event, group_event) { |
2330 | if (event == partial_group) | 2330 | if (event == partial_group) |
2331 | break; | 2331 | break; |
2332 | 2332 | ||
@@ -3863,7 +3863,7 @@ static void __perf_event_read(void *info) | |||
3863 | 3863 | ||
3864 | pmu->read(event); | 3864 | pmu->read(event); |
3865 | 3865 | ||
3866 | list_for_each_entry(sub, &event->sibling_list, sibling_list) { | 3866 | for_each_sibling_event(sub, event) { |
3867 | if (sub->state == PERF_EVENT_STATE_ACTIVE) { | 3867 | if (sub->state == PERF_EVENT_STATE_ACTIVE) { |
3868 | /* | 3868 | /* |
3869 | * Use sibling's PMU rather than @event's since | 3869 | * Use sibling's PMU rather than @event's since |
@@ -4711,7 +4711,7 @@ static int __perf_read_group_add(struct perf_event *leader, | |||
4711 | if (read_format & PERF_FORMAT_ID) | 4711 | if (read_format & PERF_FORMAT_ID) |
4712 | values[n++] = primary_event_id(leader); | 4712 | values[n++] = primary_event_id(leader); |
4713 | 4713 | ||
4714 | list_for_each_entry(sub, &leader->sibling_list, sibling_list) { | 4714 | for_each_sibling_event(sub, leader) { |
4715 | values[n++] += perf_event_count(sub); | 4715 | values[n++] += perf_event_count(sub); |
4716 | if (read_format & PERF_FORMAT_ID) | 4716 | if (read_format & PERF_FORMAT_ID) |
4717 | values[n++] = primary_event_id(sub); | 4717 | values[n++] = primary_event_id(sub); |
@@ -4905,7 +4905,7 @@ static void perf_event_for_each(struct perf_event *event, | |||
4905 | event = event->group_leader; | 4905 | event = event->group_leader; |
4906 | 4906 | ||
4907 | perf_event_for_each_child(event, func); | 4907 | perf_event_for_each_child(event, func); |
4908 | list_for_each_entry(sibling, &event->sibling_list, sibling_list) | 4908 | for_each_sibling_event(sibling, event) |
4909 | perf_event_for_each_child(sibling, func); | 4909 | perf_event_for_each_child(sibling, func); |
4910 | } | 4910 | } |
4911 | 4911 | ||
@@ -6077,7 +6077,7 @@ static void perf_output_read_group(struct perf_output_handle *handle, | |||
6077 | 6077 | ||
6078 | __output_copy(handle, values, n * sizeof(u64)); | 6078 | __output_copy(handle, values, n * sizeof(u64)); |
6079 | 6079 | ||
6080 | list_for_each_entry(sub, &leader->sibling_list, sibling_list) { | 6080 | for_each_sibling_event(sub, leader) { |
6081 | n = 0; | 6081 | n = 0; |
6082 | 6082 | ||
6083 | if ((sub != event) && | 6083 | if ((sub != event) && |
@@ -10662,8 +10662,7 @@ SYSCALL_DEFINE5(perf_event_open, | |||
10662 | perf_remove_from_context(group_leader, 0); | 10662 | perf_remove_from_context(group_leader, 0); |
10663 | put_ctx(gctx); | 10663 | put_ctx(gctx); |
10664 | 10664 | ||
10665 | list_for_each_entry(sibling, &group_leader->sibling_list, | 10665 | for_each_sibling_event(sibling, group_leader) { |
10666 | sibling_list) { | ||
10667 | perf_remove_from_context(sibling, 0); | 10666 | perf_remove_from_context(sibling, 0); |
10668 | put_ctx(gctx); | 10667 | put_ctx(gctx); |
10669 | } | 10668 | } |
@@ -10684,8 +10683,7 @@ SYSCALL_DEFINE5(perf_event_open, | |||
10684 | * By installing siblings first we NO-OP because they're not | 10683 | * By installing siblings first we NO-OP because they're not |
10685 | * reachable through the group lists. | 10684 | * reachable through the group lists. |
10686 | */ | 10685 | */ |
10687 | list_for_each_entry(sibling, &group_leader->sibling_list, | 10686 | for_each_sibling_event(sibling, group_leader) { |
10688 | sibling_list) { | ||
10689 | perf_event__state_init(sibling); | 10687 | perf_event__state_init(sibling); |
10690 | perf_install_in_context(ctx, sibling, sibling->cpu); | 10688 | perf_install_in_context(ctx, sibling, sibling->cpu); |
10691 | get_ctx(ctx); | 10689 | get_ctx(ctx); |
@@ -11324,7 +11322,7 @@ static int inherit_group(struct perf_event *parent_event, | |||
11324 | * case inherit_event() will create individual events, similar to what | 11322 | * case inherit_event() will create individual events, similar to what |
11325 | * perf_group_detach() would do anyway. | 11323 | * perf_group_detach() would do anyway. |
11326 | */ | 11324 | */ |
11327 | list_for_each_entry(sub, &parent_event->sibling_list, sibling_list) { | 11325 | for_each_sibling_event(sub, parent_event) { |
11328 | child_ctr = inherit_event(sub, parent, parent_ctx, | 11326 | child_ctr = inherit_event(sub, parent, parent_ctx, |
11329 | child, leader, child_ctx); | 11327 | child, leader, child_ctx); |
11330 | if (IS_ERR(child_ctr)) | 11328 | if (IS_ERR(child_ctr)) |