Skip to content

Commit

Permalink
MIPS/Perf-events: Remove pmu and event state checking in validate_eve…
Browse files Browse the repository at this point in the history
…nt()

Why removing pmu checking:
Since 3.2-rc1, when arch level event init is called, the event is already
connected to its PMU. Also, validate_event() is _only_ called by
validate_group() in event init, so there is no need of checking or
temporarily assigning event pmu during validate_group().

Why removing event state checking:
Events could be created in PERF_EVENT_STATE_OFF (attr->disabled == 1), when
these events go through this checking, validate_group() does dummy work.
But we do need to do group scheduling emulation for them in event init.
Again, validate_event() is _only_ called by validate_group().

Reference: http://www.spinics.net/lists/mips/msg42190.html
Signed-off-by: Deng-Cheng Zhu <dczhu@mips.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: David Daney <david.daney@cavium.com>
Cc: Eyal Barzilay <eyal@mips.com>
Cc: Zenon Fortuna <zenon@mips.com>
Patchwork: https://patchwork.linux-mips.org/patch/3108/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
  • Loading branch information
Deng-Cheng Zhu authored and Ralf Baechle committed Dec 7, 2011
1 parent 74653cc commit 266623b
Showing 1 changed file with 3 additions and 15 deletions.
18 changes: 3 additions & 15 deletions arch/mips/kernel/perf_event_mipsxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -707,34 +707,22 @@ static const struct mips_perf_event *mipspmu_map_cache_event(u64 config)

}

static int validate_event(struct cpu_hw_events *cpuc,
struct perf_event *event)
{
struct hw_perf_event fake_hwc = event->hw;

/* Allow mixed event group. So return 1 to pass validation. */
if (event->pmu != &pmu || event->state <= PERF_EVENT_STATE_OFF)
return 1;

return mipsxx_pmu_alloc_counter(cpuc, &fake_hwc) >= 0;
}

static int validate_group(struct perf_event *event)
{
struct perf_event *sibling, *leader = event->group_leader;
struct cpu_hw_events fake_cpuc;

memset(&fake_cpuc, 0, sizeof(fake_cpuc));

if (!validate_event(&fake_cpuc, leader))
if (mipsxx_pmu_alloc_counter(&fake_cpuc, &leader->hw) < 0)
return -ENOSPC;

list_for_each_entry(sibling, &leader->sibling_list, group_entry) {
if (!validate_event(&fake_cpuc, sibling))
if (mipsxx_pmu_alloc_counter(&fake_cpuc, &sibling->hw) < 0)
return -ENOSPC;
}

if (!validate_event(&fake_cpuc, event))
if (mipsxx_pmu_alloc_counter(&fake_cpuc, &event->hw) < 0)
return -ENOSPC;

return 0;
Expand Down

0 comments on commit 266623b

Please sign in to comment.