Re: [PATCH] Convert alpha to use arch_gettimeoffset()
From: Dialup Jon Norstog
Date: Thu Jun 11 2009 - 19:21:04 EST
John,
Thank you so much!
jn
---------- Original Message -----------
From: john stultz <johnstul@xxxxxxxxxx>
To: rth@xxxxxxxxxxx, ink@xxxxxxxxxxxxxxxxxxxx
Cc: lkml <linux-kernel@xxxxxxxxxxxxxxx>, linux-alpha@xxxxxxxxxxxxxxx
Sent: Thu, 11 Jun 2009 15:10:10 -0700
Subject: [PATCH] Convert alpha to use arch_gettimeoffset()
> This patch converts alpha to use GENERIC_TIME via the
> arch_getoffset() infrastructure, reducing the amount of arch
> specific code we need to maintain.
>
> I suspect the alpha arch could even be further improved to provide
> and rpcc() based clocksource, but not having the hardware, I don't feel
> comfortable attempting the more complicated conversion (but I'd be glad
> to help if anyone else is interested).
>
> This patch applies on top of Linus' current -git tree (pre 2.6.31-
> rc1).
>
> I've taken my best swing at converting this, but I'm not 100% confident
> I got it right. It does cross compile, so that's hopefully a good sign.
> Any assistance from arch maintainers or testers to get this merged would
> be great.
>
> thanks
> -john
>
> Signed-off-by: John Stultz <johnstul@xxxxxxxxxx>
> ---
>
> Kconfig | 8 ++++++
> kernel/time.c | 72 +++--------------------------------------------
> ----------- 2 files changed, 12 insertions(+), 68 deletions(-)
>
> diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig
> index 9fb8aae..4434481 100644
> --- a/arch/alpha/Kconfig
> +++ b/arch/alpha/Kconfig
> @@ -45,6 +45,14 @@ config GENERIC_CALIBRATE_DELAY
> bool
> default y
>
> +config GENERIC_TIME
> + bool
> + default y
> +
> +config ARCH_USES_GETTIMEOFFSET
> + bool
> + default y
> +
> config ZONE_DMA
> bool
> default y
> diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c
> index b04e2cb..8f7eb6d 100644
> --- a/arch/alpha/kernel/time.c
> +++ b/arch/alpha/kernel/time.c
> @@ -408,28 +408,17 @@ time_init(void)
> * part. So we can't do the "find absolute time in terms of
> cycles" thing * that the other ports do. */ -void -
> do_gettimeofday(struct timeval *tv) +u32 arch_gettimeoffset(void) { -
> unsigned long flags; - unsigned long sec, usec, seq; unsigned long
> delta_cycles, delta_usec, partial_tick;
>
> - do {
> - seq = read_seqbegin_irqsave(&xtime_lock, flags);
> -
> - delta_cycles = rpcc() - state.last_time;
> - sec = xtime.tv_sec;
> - usec = (xtime.tv_nsec / 1000);
> - partial_tick = state.partial_tick;
> -
> - } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
> -
> #ifdef CONFIG_SMP
> /* Until and unless we figure out how to get cpu cycle counters
> in sync and keep them there, we can't use the rpcc tricks. */
> delta_usec = 0;
> #else
> + delta_cycles = rpcc() - state.last_time;
> + partial_tick = state.partial_tick;
> /*
> * usec = cycles * ticks_per_cycle * 2**48 * 1e6 / (2**48 * ticks)
> * = cycles * (s_t_p_c) * 1e6 / (2**48 * ticks)
> @@ -448,62 +437,9 @@ do_gettimeofday(struct timeval *tv)
> delta_usec = ((delta_usec / ((1UL << (FIX_SHIFT-6-1)) * HZ)) + 1)
> / 2; #endif
>
> - usec += delta_usec;
> - if (usec >= 1000000) {
> - sec += 1;
> - usec -= 1000000;
> - }
> -
> - tv->tv_sec = sec;
> - tv->tv_usec = usec;
> -}
> -
> -EXPORT_SYMBOL(do_gettimeofday);
> -
> -int
> -do_settimeofday(struct timespec *tv)
> -{
> - time_t wtm_sec, sec = tv->tv_sec;
> - long wtm_nsec, nsec = tv->tv_nsec;
> - unsigned long delta_nsec;
> -
> - if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
> - return -EINVAL;
> -
> - write_seqlock_irq(&xtime_lock);
> -
> - /* The offset that is added into time in do_gettimeofday above
> - must be subtracted out here to keep a coherent view of the
> - time. Without this, a full-tick error is possible. */
> -
> -#ifdef CONFIG_SMP
> - delta_nsec = 0;
> -#else
> - delta_nsec = rpcc() - state.last_time;
> - delta_nsec = (delta_nsec * state.scaled_ticks_per_cycle
> - + state.partial_tick) * 15625;
> - delta_nsec = ((delta_nsec / ((1UL << (FIX_SHIFT-6-1)) * HZ)) + 1)
> / 2; - delta_nsec *= 1000; -#endif
> -
> - nsec -= delta_nsec;
> -
> - wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
> - wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
> -
> - set_normalized_timespec(&xtime, sec, nsec);
> - set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
> -
> - ntp_clear();
> -
> - write_sequnlock_irq(&xtime_lock);
> - clock_was_set();
> - return 0;
> + return delta_usec * 1000;
> }
>
> -EXPORT_SYMBOL(do_settimeofday);
> -
> -
> /*
> * In order to set the CMOS clock precisely, set_rtc_mmss has to be
> * called 500 ms after the second nowtime has started, because when
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-
> alpha" in the body of a message to majordomo@xxxxxxxxxxxxxxx More
> majordomo info at http://vger.kernel.org/majordomo-info.html
>
> --
> This message has been scanned for viruses and
> dangerous content by MailScanner, and is
> believed to be clean.
------- End of Original Message -------
--
To unsubscribe from this list: send the line "unsubscribe linux-alpha" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html