|
@@ -21,6 +21,7 @@
|
|
#include "oprof.h"
|
|
#include "oprof.h"
|
|
|
|
|
|
static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer);
|
|
static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer);
|
|
|
|
+static int ctr_running;
|
|
|
|
|
|
static enum hrtimer_restart oprofile_hrtimer_notify(struct hrtimer *hrtimer)
|
|
static enum hrtimer_restart oprofile_hrtimer_notify(struct hrtimer *hrtimer)
|
|
{
|
|
{
|
|
@@ -33,6 +34,9 @@ static void __oprofile_hrtimer_start(void *unused)
|
|
{
|
|
{
|
|
struct hrtimer *hrtimer = &__get_cpu_var(oprofile_hrtimer);
|
|
struct hrtimer *hrtimer = &__get_cpu_var(oprofile_hrtimer);
|
|
|
|
|
|
|
|
+ if (!ctr_running)
|
|
|
|
+ return;
|
|
|
|
+
|
|
hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
|
hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
|
hrtimer->function = oprofile_hrtimer_notify;
|
|
hrtimer->function = oprofile_hrtimer_notify;
|
|
|
|
|
|
@@ -42,7 +46,10 @@ static void __oprofile_hrtimer_start(void *unused)
|
|
|
|
|
|
static int oprofile_hrtimer_start(void)
|
|
static int oprofile_hrtimer_start(void)
|
|
{
|
|
{
|
|
|
|
+ get_online_cpus();
|
|
|
|
+ ctr_running = 1;
|
|
on_each_cpu(__oprofile_hrtimer_start, NULL, 1);
|
|
on_each_cpu(__oprofile_hrtimer_start, NULL, 1);
|
|
|
|
+ put_online_cpus();
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -50,6 +57,9 @@ static void __oprofile_hrtimer_stop(int cpu)
|
|
{
|
|
{
|
|
struct hrtimer *hrtimer = &per_cpu(oprofile_hrtimer, cpu);
|
|
struct hrtimer *hrtimer = &per_cpu(oprofile_hrtimer, cpu);
|
|
|
|
|
|
|
|
+ if (!ctr_running)
|
|
|
|
+ return;
|
|
|
|
+
|
|
hrtimer_cancel(hrtimer);
|
|
hrtimer_cancel(hrtimer);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -57,8 +67,11 @@ static void oprofile_hrtimer_stop(void)
|
|
{
|
|
{
|
|
int cpu;
|
|
int cpu;
|
|
|
|
|
|
|
|
+ get_online_cpus();
|
|
for_each_online_cpu(cpu)
|
|
for_each_online_cpu(cpu)
|
|
__oprofile_hrtimer_stop(cpu);
|
|
__oprofile_hrtimer_stop(cpu);
|
|
|
|
+ ctr_running = 0;
|
|
|
|
+ put_online_cpus();
|
|
}
|
|
}
|
|
|
|
|
|
static int __cpuinit oprofile_cpu_notify(struct notifier_block *self,
|
|
static int __cpuinit oprofile_cpu_notify(struct notifier_block *self,
|