Perf: Fix PID for tracepoints
Make previous value of PID a per_cpu variable.
This is required to get the correct value for previous_pid.
Change-Id: I63baf8164ae9226189c745339b122d806901789d
Signed-off-by: Sheetal Sahasrabudhe <sheetals@codeaurora.org>
diff --git a/arch/arm/mach-msm/perf_debug.c b/arch/arm/mach-msm/perf_debug.c
index c4c036f..d163fb1 100644
--- a/arch/arm/mach-msm/perf_debug.c
+++ b/arch/arm/mach-msm/perf_debug.c
@@ -42,6 +42,7 @@
"17 msm: perf: initialise krait perf L2 counter enables\n"
"18 msm: perf: clean up duplicate constraint events\n"
"19 Perf: Make per-process counters cumulative\n"
+ "20 Perf: Fix PID for tracepoints\n"
;
static ssize_t desc_read(struct file *fp, char __user *buf,
diff --git a/arch/arm/mach-msm/perf_trace_counters.c b/arch/arm/mach-msm/perf_trace_counters.c
index 0b6a75e..f847b5d 100644
--- a/arch/arm/mach-msm/perf_trace_counters.c
+++ b/arch/arm/mach-msm/perf_trace_counters.c
@@ -20,6 +20,7 @@
DEFINE_PER_CPU(u32, previous_ccnt);
DEFINE_PER_CPU(u32[NUM_L1_CTRS], previous_l1_cnts);
DEFINE_PER_CPU(u32[NUM_L2_PERCPU], previous_l2_cnts);
+DEFINE_PER_CPU(u32, old_pid);
/* Reset per_cpu variables that store counter values uppn CPU hotplug */
static int tracectr_cpu_hotplug_notifier(struct notifier_block *self,
unsigned long action, void *hcpu)
@@ -45,18 +46,19 @@
static int tracectr_notifier(struct notifier_block *self, unsigned long cmd,
void *v)
{
- static int old_pid = -1;
struct thread_info *thread = v;
int current_pid;
+ u32 cpu = smp_processor_id();
if (cmd != THREAD_NOTIFY_SWITCH)
- return old_pid;
+ return -EFAULT;
current_pid = thread->task->pid;
- if (old_pid != -1)
- trace_sched_switch_with_ctrs(old_pid, current_pid);
- old_pid = current_pid;
- return old_pid;
+ if (per_cpu(old_pid, cpu) != -1)
+ trace_sched_switch_with_ctrs(per_cpu(old_pid, cpu),
+ current_pid);
+ per_cpu(old_pid, cpu) = current_pid;
+ return NOTIFY_OK;
}
static struct notifier_block tracectr_notifier_block = {
@@ -127,6 +129,7 @@
struct dentry *dir;
struct dentry *file;
unsigned int value = 1;
+ int cpu;
dir = debugfs_create_dir("perf_debug_tp", NULL);
if (!dir)
@@ -138,6 +141,8 @@
return -ENOMEM;
}
register_cpu_notifier(&tracectr_cpu_hotplug_notifier_block);
+ for_each_possible_cpu(cpu)
+ per_cpu(old_pid, cpu) = -1;
return 0;
}