public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] oprofile: Fix the hang while offline the cpu
@ 2010-10-27 15:17 Santosh Shilimkar
  2010-10-28  0:12 ` Robert Richter
  0 siblings, 1 reply; 2+ messages in thread
From: Santosh Shilimkar @ 2010-10-27 15:17 UTC (permalink / raw)
  To: oprofile-list; +Cc: linux-kernel, Santosh Shilimkar, sricharan, Robert Richter

The kernel build with CONFIG_OPROFILE and CPU_HOTPLUG enabled.
The oprofile is initialised using system timer in absence of hardware
counters supports. Oprofile isn't started from userland.

In this setup while doing a CPU offline the kernel hangs in infinite
for loop inside lock_hrtimer_base() function

This happens because as part of oprofile_cpu_notify(, it tries to
stop an hrtimer which was never started. These per-cpu hrtimers
are started when the oprfile is started.
	echo 1	> /dev/oprofile/enable

This problem also existwhen the cpu is booted with maxcpus parameter
set. When bringing the remaining cpus online the timers are started
even if oprofile is not yet enabled.

This patch fix this issue by adding a state variable so that
these hrtimer start/stop is only attempted when oprofile is
started

Reported-by: Jan Sebastien <s-jan@ti.com>
Signed-off-by: sricharan <r.sricharan@ti.com>
Tested-by: sricharan <r.sricharan@ti.com>
Cc: Robert Richter <robert.richter@amd.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
---
V2: Updated patch with comments from Robert Richter
 drivers/oprofile/timer_int.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/drivers/oprofile/timer_int.c b/drivers/oprofile/timer_int.c
index dc0ae4d..0107251 100644
--- a/drivers/oprofile/timer_int.c
+++ b/drivers/oprofile/timer_int.c
@@ -21,6 +21,7 @@
 #include "oprof.h"
 
 static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer);
+static int ctr_running;
 
 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);
 
+	if (!ctr_running)
+		return;
+
 	hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	hrtimer->function = oprofile_hrtimer_notify;
 
@@ -42,7 +46,10 @@ static void __oprofile_hrtimer_start(void *unused)
 
 static int oprofile_hrtimer_start(void)
 {
+	get_online_cpus();
+	ctr_running = 1;
 	on_each_cpu(__oprofile_hrtimer_start, NULL, 1);
+	put_online_cpus();
 	return 0;
 }
 
@@ -50,6 +57,9 @@ static void __oprofile_hrtimer_stop(int cpu)
 {
 	struct hrtimer *hrtimer = &per_cpu(oprofile_hrtimer, cpu);
 
+	if (!ctr_running)
+		return;
+
 	hrtimer_cancel(hrtimer);
 }
 
@@ -57,8 +67,11 @@ static void oprofile_hrtimer_stop(void)
 {
 	int cpu;
 
+	get_online_cpus();
 	for_each_online_cpu(cpu)
 		__oprofile_hrtimer_stop(cpu);
+	ctr_running = 0;
+	put_online_cpus();
 }
 
 static int __cpuinit oprofile_cpu_notify(struct notifier_block *self,
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] oprofile: Fix the hang while offline the cpu
  2010-10-27 15:17 [PATCH v2] oprofile: Fix the hang while offline the cpu Santosh Shilimkar
@ 2010-10-28  0:12 ` Robert Richter
  0 siblings, 0 replies; 2+ messages in thread
From: Robert Richter @ 2010-10-28  0:12 UTC (permalink / raw)
  To: Santosh Shilimkar
  Cc: oprofile-list@lists.sf.net, linux-kernel@vger.kernel.org,
	sricharan

On 27.10.10 11:17:15, Santosh Shilimkar wrote:
> The kernel build with CONFIG_OPROFILE and CPU_HOTPLUG enabled.
> The oprofile is initialised using system timer in absence of hardware
> counters supports. Oprofile isn't started from userland.
> 
> In this setup while doing a CPU offline the kernel hangs in infinite
> for loop inside lock_hrtimer_base() function
> 
> This happens because as part of oprofile_cpu_notify(, it tries to
> stop an hrtimer which was never started. These per-cpu hrtimers
> are started when the oprfile is started.
> 	echo 1	> /dev/oprofile/enable
> 
> This problem also existwhen the cpu is booted with maxcpus parameter
> set. When bringing the remaining cpus online the timers are started
> even if oprofile is not yet enabled.
> 
> This patch fix this issue by adding a state variable so that
> these hrtimer start/stop is only attempted when oprofile is
> started
> 
> Reported-by: Jan Sebastien <s-jan@ti.com>
> Signed-off-by: sricharan <r.sricharan@ti.com>
> Tested-by: sricharan <r.sricharan@ti.com>
> Cc: Robert Richter <robert.richter@amd.com>
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> ---
> V2: Updated patch with comments from Robert Richter
>  drivers/oprofile/timer_int.c |   13 +++++++++++++
>  1 files changed, 13 insertions(+), 0 deletions(-)

Applied to oprofile/urgent, thanks Santosh.

-Robert

-- 
Advanced Micro Devices, Inc.
Operating System Research Center


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-10-28  0:13 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-27 15:17 [PATCH v2] oprofile: Fix the hang while offline the cpu Santosh Shilimkar
2010-10-28  0:12 ` Robert Richter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox