public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] NTP: remove clock_was_set() call to prevent deadlock
@ 2007-07-03 18:05 Thomas Gleixner
  2007-07-03 19:41 ` Ingo Molnar
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Thomas Gleixner @ 2007-07-03 18:05 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: LKML, Dave Jones, Andrew Morton, john stultz, Ingo Molnar,
	Stable Team, Fortier,Vincent [Montreal]

The clock_was_set() call in seconds_overflow() which happens only when
leap seconds are inserted / deleted is wrong in two aspects:

1. it results in a call to on_each_cpu() with interrupts disabled
2. it is potential deadlock source vs. call_lock in smp_call_function()

The only possible side effect of the removal might be, that an absolute
CLOCK_REALTIME timer fires 1 second too late, in the rare case of leap
second deletion and an absolute CLOCK_REALTIME timer which expires in
the affected time frame. It will never fire too early.

This was probably observed by the reporter of a June 30th -> July 1st
hang: http://lkml.org/lkml/2007/7/3/

A similar problem was observed by Dave Jones, who provided a screen shot
with a lockdep back trace, which allowed to analyse the problem.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -122,7 +122,6 @@ void second_overflow(void)
 			 */
 			time_interpolator_update(-NSEC_PER_SEC);
 			time_state = TIME_OOP;
-			clock_was_set();
 			printk(KERN_NOTICE "Clock: inserting leap second "
 					"23:59:60 UTC\n");
 		}
@@ -137,7 +136,6 @@ void second_overflow(void)
 			 */
 			time_interpolator_update(NSEC_PER_SEC);
 			time_state = TIME_WAIT;
-			clock_was_set();
 			printk(KERN_NOTICE "Clock: deleting leap second "
 					"23:59:59 UTC\n");
 		}



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

* Re: [PATCH] NTP: remove clock_was_set() call to prevent deadlock
  2007-07-03 18:05 [PATCH] NTP: remove clock_was_set() call to prevent deadlock Thomas Gleixner
@ 2007-07-03 19:41 ` Ingo Molnar
  2007-07-03 19:56 ` Thomas Gleixner
  2007-07-04 11:06 ` Roman Zippel
  2 siblings, 0 replies; 5+ messages in thread
From: Ingo Molnar @ 2007-07-03 19:41 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: Linus Torvalds, LKML, Dave Jones, Andrew Morton, john stultz,
	Stable Team, Fortier,Vincent [Montreal]


* Thomas Gleixner <tglx@linutronix.de> wrote:

> The clock_was_set() call in seconds_overflow() which happens only when 
> leap seconds are inserted / deleted is wrong in two aspects:
> 
> 1. it results in a call to on_each_cpu() with interrupts disabled
> 2. it is potential deadlock source vs. call_lock in smp_call_function()
> 
> The only possible side effect of the removal might be, that an 
> absolute CLOCK_REALTIME timer fires 1 second too late, in the rare 
> case of leap second deletion and an absolute CLOCK_REALTIME timer 
> which expires in the affected time frame. It will never fire too 
> early.
> 
> This was probably observed by the reporter of a June 30th -> July 1st 
> hang: http://lkml.org/lkml/2007/7/3/
> 
> A similar problem was observed by Dave Jones, who provided a screen 
> shot with a lockdep back trace, which allowed to analyse the problem.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

looks good to me.

Acked-by: Ingo Molnar <mingo@elte.hu>

	Ingo

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

* Re: [PATCH] NTP: remove clock_was_set() call to prevent deadlock
  2007-07-03 18:05 [PATCH] NTP: remove clock_was_set() call to prevent deadlock Thomas Gleixner
  2007-07-03 19:41 ` Ingo Molnar
@ 2007-07-03 19:56 ` Thomas Gleixner
  2007-07-04 11:06 ` Roman Zippel
  2 siblings, 0 replies; 5+ messages in thread
From: Thomas Gleixner @ 2007-07-03 19:56 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: LKML, Dave Jones, Andrew Morton, john stultz, Ingo Molnar,
	Stable Team, Fortier,Vincent [Montreal]

On Tue, 2007-07-03 at 20:05 +0200, Thomas Gleixner wrote:
> The clock_was_set() call in seconds_overflow() which happens only when
> leap seconds are inserted / deleted is wrong in two aspects:
> 
> 1. it results in a call to on_each_cpu() with interrupts disabled
> 2. it is potential deadlock source vs. call_lock in smp_call_function()
> 
> The only possible side effect of the removal might be, that an absolute
> CLOCK_REALTIME timer fires 1 second too late, in the rare case of leap
> second deletion and an absolute CLOCK_REALTIME timer which expires in
> the affected time frame. It will never fire too early.
> 
> This was probably observed by the reporter of a June 30th -> July 1st
> hang: http://lkml.org/lkml/2007/7/3/

Ooops, missed the full reference:

http://lkml.org/lkml/2007/7/3/103

	tglx



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

* Re: [PATCH] NTP: remove clock_was_set() call to prevent deadlock
  2007-07-03 18:05 [PATCH] NTP: remove clock_was_set() call to prevent deadlock Thomas Gleixner
  2007-07-03 19:41 ` Ingo Molnar
  2007-07-03 19:56 ` Thomas Gleixner
@ 2007-07-04 11:06 ` Roman Zippel
  2007-07-04 11:15   ` Thomas Gleixner
  2 siblings, 1 reply; 5+ messages in thread
From: Roman Zippel @ 2007-07-04 11:06 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: Linus Torvalds, LKML, Dave Jones, Andrew Morton, john stultz,
	Ingo Molnar, Stable Team, Fortier,Vincent [Montreal]

Hi,

On Tuesday 03 July 2007, Thomas Gleixner wrote:

> The clock_was_set() call in seconds_overflow() which happens only when
> leap seconds are inserted / deleted is wrong in two aspects:
>
> 1. it results in a call to on_each_cpu() with interrupts disabled
> 2. it is potential deadlock source vs. call_lock in smp_call_function()
>
> The only possible side effect of the removal might be, that an absolute
> CLOCK_REALTIME timer fires 1 second too late, in the rare case of leap
> second deletion and an absolute CLOCK_REALTIME timer which expires in
> the affected time frame. It will never fire too early.

That's a bit of an easy solution and doesn't fix the real problem. The 
clock_was_set() calls were correct, what's broken is the locking. Why wasn't 
that fixed instead?
I would at least like to see a comment there, why these calls were removed.

bye, Roman

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

* Re: [PATCH] NTP: remove clock_was_set() call to prevent deadlock
  2007-07-04 11:06 ` Roman Zippel
@ 2007-07-04 11:15   ` Thomas Gleixner
  0 siblings, 0 replies; 5+ messages in thread
From: Thomas Gleixner @ 2007-07-04 11:15 UTC (permalink / raw)
  To: Roman Zippel
  Cc: Linus Torvalds, LKML, Dave Jones, Andrew Morton, john stultz,
	Ingo Molnar, Stable Team, Fortier,Vincent [Montreal]

On Wed, 2007-07-04 at 13:06 +0200, Roman Zippel wrote:
> Hi,
> 
> On Tuesday 03 July 2007, Thomas Gleixner wrote:
> 
> > The clock_was_set() call in seconds_overflow() which happens only when
> > leap seconds are inserted / deleted is wrong in two aspects:
> >
> > 1. it results in a call to on_each_cpu() with interrupts disabled
> > 2. it is potential deadlock source vs. call_lock in smp_call_function()
> >
> > The only possible side effect of the removal might be, that an absolute
> > CLOCK_REALTIME timer fires 1 second too late, in the rare case of leap
> > second deletion and an absolute CLOCK_REALTIME timer which expires in
> > the affected time frame. It will never fire too early.
> 
> That's a bit of an easy solution and doesn't fix the real problem. The 
> clock_was_set() calls were correct, what's broken is the locking. Why wasn't 
> that fixed instead?
> I would at least like to see a comment there, why these calls were removed.

We can not fix the locking that late in the cycle. I doubt that we can
fix it at all, as smp_call_function _must_ run with interrupts enabled,
therefor it can not run in interrupt context. It needs to run from
thread context only.

	tglx





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

end of thread, other threads:[~2007-07-04 11:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-03 18:05 [PATCH] NTP: remove clock_was_set() call to prevent deadlock Thomas Gleixner
2007-07-03 19:41 ` Ingo Molnar
2007-07-03 19:56 ` Thomas Gleixner
2007-07-04 11:06 ` Roman Zippel
2007-07-04 11:15   ` Thomas Gleixner

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