Re: [PATCH v5 11/12] MIPS/Oprofile: use Perf-events framework as backend

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 05/27/2010 06:03 AM, Deng-Cheng Zhu wrote:
This patch is based on Will Deacon's work for ARM. The well-written
reasons and ideas can be found here:
http://lists.infradead.org/pipermail/linux-arm-kernel/2010-April/013210.html

This effort makes the bug-fixes shared by different pmu users/clients
(for now, Oprofile&  Perf-events), and make them coexist in the system
without lock issues, and make their results comparable.

So this patch moves Oprofile on top of Perf-events by replacing its
original interfaces with new ones calling Perf-events.

Oprofile uses raw events, so Perf-events (mipsxx in this patch) is
modified to support more mipsxx CPUs.

Signed-off-by: Deng-Cheng Zhu<dengcheng.zhu@xxxxxxxxx>
---
  arch/mips/kernel/perf_event.c        |    7 +-
  arch/mips/kernel/perf_event_mipsxx.c |  125 ++++++++++++------
  arch/mips/oprofile/common.c          |  237 +++++++++++++++++++++++++---------
  3 files changed, 266 insertions(+), 103 deletions(-)

[...]

  static int __init
@@ -963,35 +960,77 @@ init_hw_perf_events(void)
  	switch (current_cpu_type()) {
  	case CPU_24K:
  		mipsxxcore_pmu.id = MIPS_PMU_ID_24K;
-		mipsxxcore_pmu.num_counters = counters;
-		mipspmu =&mipsxxcore_pmu;
+		mipsxxcore_pmu.general_event_map =&mipsxxcore_event_map;
+		mipsxxcore_pmu.cache_event_map =&mipsxxcore_cache_map;
  		break;
  	case CPU_34K:
  		mipsxxcore_pmu.id = MIPS_PMU_ID_34K;
-		mipsxxcore_pmu.num_counters = counters;
-		mipspmu =&mipsxxcore_pmu;
+		mipsxxcore_pmu.general_event_map =&mipsxxcore_event_map;
+		mipsxxcore_pmu.cache_event_map =&mipsxxcore_cache_map;
  		break;

The mips perf events system should already know what type of cpu it is running on.

Can we have all this processor specific perf/counter stuff live in one place and simplify all of this?


[...]

+/*
+ * Attributes are created as "pinned" events and so are permanently
+ * scheduled on the PMU.
+ */
+static void op_perf_setup(void)
+{
+	int i;
+	u32 size = sizeof(struct perf_event_attr);
+	struct perf_event_attr *attr;
+
+	for (i = 0; i<  perf_num_counters; ++i) {
+		attr =&ctr[i].attr;
+		memset(attr, 0, size);
+		attr->type		= PERF_TYPE_RAW;
+		attr->size		= size;
+		attr->config		= ctr[i].event + (i&  0x1 ? 128 : 0);

Too many magic numbers.  Lets have symbolic names.

[...]

Thanks,
David Daney



[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux