Re: [PATCH] Convert alpha to use arch_gettimeoffset()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux