time: introduce xtime_seconds

improve performance of sys_time(). sys_time() returns time in seconds,
but it does so by calling do_gettimeofday() and then returning the
tv_sec portion of the GTOD time. But the data structure "xtime", which
is updated by every timer/scheduler tick, already offers HZ granularity
time.

the patch improves the sysbench oltp macrobenchmark by 4-5% on an AMD
dual-core system:

v2.6.23:

#threads

   1:     transactions:                        4073   (407.23 per sec.)
   2:     transactions:                        8530   (852.81 per sec.)
   3:     transactions:                        8321   (831.88 per sec.)
   4:     transactions:                        8407   (840.58 per sec.)
   5:     transactions:                        8070   (806.74 per sec.)

v2.6.23 + sys_time-speedup.patch:

   1:     transactions:                        4281   (428.09 per sec.)
   2:     transactions:                        8910   (890.85 per sec.)
   3:     transactions:                        8659   (865.79 per sec.)
   4:     transactions:                        8676   (867.34 per sec.)
   5:     transactions:                        8532   (852.91 per sec.)

and by 4-5% on an Intel dual-core system too:

2.6.23:

  1:     transactions:                        4560   (455.94 per sec.)
  2:     transactions:                        10094  (1009.30 per sec.)
  3:     transactions:                        9755   (975.36 per sec.)
  4:     transactions:                        9859   (985.78 per sec.)
  5:     transactions:                        9701   (969.72 per sec.)

2.6.23 + sys_time-speedup.patch:

  1:     transactions:                        4779   (477.84 per sec.)
  2:     transactions:                        10103  (1010.14 per sec.)
  3:     transactions:                        10141  (1013.93 per sec.)
  4:     transactions:                        10371  (1036.89 per sec.)
  5:     transactions:                        10178  (1017.50 per sec.)

(the more CPUs the system has, the more speedup this patch gives for
this particular workload.)

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Ingo Molnar 2007-10-16 16:09:20 +02:00 committed by Linus Torvalds
parent 8636225e8d
commit f20bf61256
2 changed files with 1 additions and 12 deletions

View file

@ -57,11 +57,7 @@ EXPORT_SYMBOL(sys_tz);
*/ */
asmlinkage long sys_time(time_t __user * tloc) asmlinkage long sys_time(time_t __user * tloc)
{ {
time_t i; time_t i = get_seconds();
struct timespec tv;
getnstimeofday(&tv);
i = tv.tv_sec;
if (tloc) { if (tloc) {
if (put_user(i,tloc)) if (put_user(i,tloc))

View file

@ -49,19 +49,12 @@ struct timespec wall_to_monotonic __attribute__ ((aligned (16)));
static unsigned long total_sleep_time; /* seconds */ static unsigned long total_sleep_time; /* seconds */
EXPORT_SYMBOL(xtime); EXPORT_SYMBOL(xtime);
#ifdef CONFIG_NO_HZ
static struct timespec xtime_cache __attribute__ ((aligned (16))); static struct timespec xtime_cache __attribute__ ((aligned (16)));
static inline void update_xtime_cache(u64 nsec) static inline void update_xtime_cache(u64 nsec)
{ {
xtime_cache = xtime; xtime_cache = xtime;
timespec_add_ns(&xtime_cache, nsec); timespec_add_ns(&xtime_cache, nsec);
} }
#else
#define xtime_cache xtime
/* We do *not* want to evaluate the argument for this case */
#define update_xtime_cache(n) do { } while (0)
#endif
static struct clocksource *clock; /* pointer to current clocksource */ static struct clocksource *clock; /* pointer to current clocksource */