All of lore.kernel.org
 help / color / mirror / Atom feed
From: john stultz <johnstul@us.ibm.com>
To: Daniel Walker <dwalker@mvista.com>
Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org, mingo@elte.hu
Subject: Re: [PATCH] timekeeping: drop irq-context clocksource polling
Date: Thu, 05 Apr 2007 14:25:19 -0700	[thread overview]
Message-ID: <1175808319.28526.26.camel@localhost> (raw)
In-Reply-To: <20070405210316.785839431@mvista.com>

On Thu, 2007-04-05 at 14:03 -0700, Daniel Walker wrote:
> Before this change the timekeeping code would poll the clocksource
> list every interrupt. This changes that so the clocksource list is
> only checked when there has been and update, and no longer checks
> in interrupt context.
> 
> This also has a few small space and line cleanups.
> 
> Boot tested on i386, compile tested on x86_64 .. However, I couldn't
> find a !GENERIC_TIME that compiled without this change so it's untested..
> 
> Signed-Off-By: Daniel Walker <dwalker@mvista.com>

Err.. I think you need to be holding a write on the xtime_lock (as is
done before calling update_wall_time()) when changing the clocksource.

-john



> ---
>  include/linux/timekeeping.h |   10 ++++++++++
>  kernel/time/clocksource.c   |    7 +++++++
>  kernel/time/timekeeping.c   |   17 ++++++++---------
>  3 files changed, 25 insertions(+), 9 deletions(-)
> 
> Index: linux-2.6.20/include/linux/timekeeping.h
> ===================================================================
> --- /dev/null
> +++ linux-2.6.20/include/linux/timekeeping.h
> @@ -0,0 +1,10 @@
> +#ifndef _LINUX_TIMEKEEPING_H
> +#define _LINUX_TIMEKEEPING_H
> +
> +#ifdef CONFIG_GENERIC_TIME
> +extern void timekeeping_change_clocksource(void);
> +#else
> +static inline void timekeeping_change_clocksource(void) { }
> +#endif
> +
> +#endif
> Index: linux-2.6.20/kernel/time/clocksource.c
> ===================================================================
> --- linux-2.6.20.orig/kernel/time/clocksource.c
> +++ linux-2.6.20/kernel/time/clocksource.c
> @@ -30,6 +30,7 @@
>  #include <linux/module.h>
>  #include <linux/sched.h> /* for spin_unlock_irq() using preempt_count() m68k */
>  #include <linux/tick.h>
> +#include <linux/timekeeping.h>
> 
>  /* XXX - Would like a better way for initializing curr_clocksource */
>  extern struct clocksource clocksource_jiffies;
> @@ -279,6 +280,8 @@ int clocksource_register(struct clocksou
> 
>  	clocksource_check_watchdog(c);
> 
> +	timekeeping_change_clocksource();
> +
>  	return 0;
>  }
>  EXPORT_SYMBOL(clocksource_register);
> @@ -297,6 +300,8 @@ void clocksource_change_rating(struct cl
>  	clocksource_enqueue(cs);
>  	next_clocksource = select_clocksource();
>  	spin_unlock_irqrestore(&clocksource_lock, flags);
> +
> +	timekeeping_change_clocksource();
>  }
> 
>  #ifdef CONFIG_SYSFS
> @@ -374,6 +379,8 @@ static ssize_t sysfs_override_clocksourc
> 
>  	spin_unlock_irq(&clocksource_lock);
> 
> +	timekeeping_change_clocksource();
> +
>  	return ret;
>  }
> 
> Index: linux-2.6.20/kernel/time/timekeeping.c
> ===================================================================
> --- linux-2.6.20.orig/kernel/time/timekeeping.c
> +++ linux-2.6.20/kernel/time/timekeeping.c
> @@ -18,7 +18,7 @@
>  #include <linux/jiffies.h>
>  #include <linux/time.h>
>  #include <linux/tick.h>
> -
> +#include <linux/timekeeping.h>
> 
>  /*
>   * This read-write spinlock protects us from races in SMP while
> @@ -42,10 +42,8 @@ struct timespec wall_to_monotonic __attr
> 
>  EXPORT_SYMBOL(xtime);
> 
> -
>  static struct clocksource *clock; /* pointer to current clocksource */
> 
> -
>  #ifdef CONFIG_GENERIC_TIME
>  /**
>   * __get_nsec_offset - Returns nanoseconds since last call to periodic_hook
> @@ -168,9 +166,10 @@ EXPORT_SYMBOL(do_settimeofday);
>   *
>   * Accumulates current time interval and initializes new clocksource
>   */
> -static void change_clocksource(void)
> +void timekeeping_change_clocksource(void)
>  {
>  	struct clocksource *new;
> +	unsigned long flags;
>  	cycle_t now;
>  	u64 nsec;
> 
> @@ -179,8 +178,10 @@ static void change_clocksource(void)
>  	if (clock == new)
>  		return;
> 
> +	write_seqlock_irqsave(&xtime_lock, flags);
> +
>  	now = clocksource_read(new);
> -	nsec =  __get_nsec_offset();
> +	nsec = __get_nsec_offset();
>  	timespec_add_ns(&xtime, nsec);
> 
>  	clock = new;
> @@ -192,11 +193,11 @@ static void change_clocksource(void)
> 
>  	tick_clock_notify();
> 
> +	write_sequnlock_irqrestore(&xtime_lock, flags);
> +
>  	printk(KERN_INFO "Time: %s clocksource has been installed.\n",
>  	       clock->name);
>  }
> -#else
> -static inline void change_clocksource(void) { }
>  #endif
> 
>  /**
> @@ -470,7 +471,5 @@ void update_wall_time(void)
>  	xtime.tv_nsec = (s64)clock->xtime_nsec >> clock->shift;
>  	clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift;
> 
> -	/* check to see if there is a new clocksource to use */
> -	change_clocksource();
>  	update_vsyscall(&xtime, clock);
>  }
> -- 
> 


  reply	other threads:[~2007-04-05 21:25 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-05 21:03 [PATCH] timekeeping: drop irq-context clocksource polling Daniel Walker
2007-04-05 21:25 ` john stultz [this message]
2007-04-05 21:29   ` Daniel Walker
2007-04-05 21:38     ` john stultz
2007-04-05 21:36   ` Andrew Morton
2007-04-05 21:50     ` john stultz
2007-04-07  1:21 ` Andrew Morton
2007-04-07  2:04   ` Daniel Walker
2007-04-07 10:19 ` Andrew Morton
2007-04-07 17:43   ` Daniel Walker
2007-04-07 20:50     ` Thomas Gleixner
2007-04-07 21:30       ` Daniel Walker
2007-04-08  8:33         ` Thomas Gleixner
2007-04-08 20:02           ` Daniel Walker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1175808319.28526.26.camel@localhost \
    --to=johnstul@us.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=dwalker@mvista.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.