Re: [PATCH] clean up FIXME in do_timer_interrupt-lock fix

Andrew Morton
2005-03-19T21:22:10Z

George Anzinger <george@mvista.com> wrote:
>
> Did you pick this up? First sent on 3-11.

I did, although now looking at it I have issues.

> I was not happy with the locking on this. Two changes:
> 1) Turn off irq while setting the clock.
> 2) Call the timer code only through the timer interface
> (set a short timer to do it from the ntp call).

I would consider this to be an inadequate description :(

> Signed-off-by: George Anzinger <george@mvista.com>
>
> time.c | 6 +++---
> 1 files changed, 3 insertions(+), 3 deletions(-)
>
> Index: linux-2.6.12-rc/arch/i386/kernel/time.c
> ===================================================================
> --- linux-2.6.12-rc.orig/arch/i386/kernel/time.c
> +++ linux-2.6.12-rc/arch/i386/kernel/time.c
> @@ -176,12 +176,12 @@ static int set_rtc_mmss(unsigned long no
> int retval;
>
> /* gets recalled with irq locally disabled */
> - spin_lock(&rtc_lock);
> + spin_lock_irq(&rtc_lock);
> if (efi_enabled)
> retval = efi_set_rtc_mmss(nowtime);
> else
> retval = mach_set_rtc_mmss(nowtime);
> - spin_unlock(&rtc_lock);
> + spin_unlock_irq(&rtc_lock);
>
> return retval;
> }

If the comment is correct, and this code is called with local irq's
disabled then this patch should be using spin_lock_irqsave()

> @@ -338,7 +338,7 @@ static void sync_cmos_clock(unsigned lon
> }
> void notify_arch_cmos_timer(void)
> {
> - sync_cmos_clock(0);
> + mod_timer(&sync_cmos_timer, jiffies + 1);
> }
> static long clock_cmos_diff, sleep_start;
>

Your description says what this does, but it doesn't way why it was done?