From 69b987530222050a826df9228af94fa4601ef13d Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Fri, 17 Aug 2012 02:31:10 -0700 Subject: [PATCH] --- yaml --- r: 327332 b: refs/heads/master c: b38e99f5bdf62f37d7552311fef1bff00bec6308 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/sparc/kernel/perf_event.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 702e30f120fc..37f9e0f26633 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6faaeb8ea30e55c9fd7cf65d05f3ce44973d1d12 +refs/heads/master: b38e99f5bdf62f37d7552311fef1bff00bec6308 diff --git a/trunk/arch/sparc/kernel/perf_event.c b/trunk/arch/sparc/kernel/perf_event.c index dd12aa35805d..11b424bb0b2b 100644 --- a/trunk/arch/sparc/kernel/perf_event.c +++ b/trunk/arch/sparc/kernel/perf_event.c @@ -148,6 +148,9 @@ struct sparc_pmu { int irq_bit; int upper_nop; int lower_nop; + unsigned int flags; +#define SPARC_PMU_ALL_EXCLUDES_SAME 0x00000001 +#define SPARC_PMU_HAS_CONFLICTS 0x00000002 }; static const struct perf_event_map ultra3_perfmon_event_map[] = { @@ -272,6 +275,8 @@ static const struct sparc_pmu ultra3_pmu = { .event_mask = 0x3f, .upper_nop = 0x1c, .lower_nop = 0x14, + .flags = (SPARC_PMU_ALL_EXCLUDES_SAME | + SPARC_PMU_HAS_CONFLICTS), }; /* Niagara1 is very limited. The upper PIC is hard-locked to count @@ -401,6 +406,8 @@ static const struct sparc_pmu niagara1_pmu = { .event_mask = 0x7, .upper_nop = 0x0, .lower_nop = 0x0, + .flags = (SPARC_PMU_ALL_EXCLUDES_SAME | + SPARC_PMU_HAS_CONFLICTS), }; static const struct perf_event_map niagara2_perfmon_event_map[] = { @@ -529,6 +536,8 @@ static const struct sparc_pmu niagara2_pmu = { .irq_bit = 0x30, .upper_nop = 0x220, .lower_nop = 0x220, + .flags = (SPARC_PMU_ALL_EXCLUDES_SAME | + SPARC_PMU_HAS_CONFLICTS), }; static const struct sparc_pmu *sparc_pmu __read_mostly; @@ -944,6 +953,14 @@ static int sparc_check_constraints(struct perf_event **evts, if (n_ev > MAX_HWEVENTS) return -1; + if (!(sparc_pmu->flags & SPARC_PMU_HAS_CONFLICTS)) { + int i; + + for (i = 0; i < n_ev; i++) + evts[i]->hw.idx = i; + return 0; + } + msk0 = perf_event_get_msk(events[0]); if (n_ev == 1) { if (msk0 & PIC_LOWER) @@ -999,6 +1016,9 @@ static int check_excludes(struct perf_event **evts, int n_prev, int n_new) struct perf_event *event; int i, n, first; + if (!(sparc_pmu->flags & SPARC_PMU_ALL_EXCLUDES_SAME)) + return 0; + n = n_prev + n_new; if (n <= 1) return 0;