mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Roman Zippel <zippel@linux-m68k.org>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>,
	Christopher Friesen <cfriesen@nortel.com>,
	linux-kernel@vger.kernel.org, akpm@osdl.org, george@mvista.com,
	johnstul@us.ibm.com, paulmck@us.ibm.com
Subject: Re: [ANNOUNCE] ktimers subsystem
Date: Sun, 25 Sep 2005 01:45:07 +0200 (CEST)	[thread overview]
Message-ID: <Pine.LNX.4.61.0509250052390.3728@scrub.home> (raw)
In-Reply-To: <1127570212.15115.77.camel@tglx.tec.linutronix.de>

Hi,

On Sat, 24 Sep 2005, Thomas Gleixner wrote:

> #define timespec_gt(a,b)                       	\
>         (((a).tv_sec > (b).tv_sec) ? 1 :        \
>         (((a).tv_sec < (b).tv_sec) ? 0 :        \
>         ((a).tv_nsec > (b).tv_nsec)))
> 
> #define timespec_addptr(a,b)                            \
>         (a)->tv_sec = ((a)->tv_sec + (b)->tv_sec);      \
>         (a)->tv_nsec = ((a)->tv_nsec + (b)->tv_nsec);   \
>         if ((a)->tv_nsec >= NSEC_PER_SEC){               \
>                 (a)->tv_nsec -= NSEC_PER_SEC;           \
>                 (a)->tv_sec++;                          \
>         }
> 
> #define timespec_addppp(c,a,b)                          \
>         (c)->tv_sec = ((a)->tv_sec + (b)->tv_sec);      \
>         (c)->tv_nsec = ((a)->tv_nsec + (b)->tv_nsec);   \
>         if ((c)->tv_nsec >= NSEC_PER_SEC){               \
>                 (c)->tv_nsec -= NSEC_PER_SEC;           \
>                 (c)->tv_sec++;                          \
>         }

Alternative for ktimespec:

#define timespec_gt(a,b) ((a).tv64 > (b).tv64)

#if BITS_PER_LONG == 64
#define timespec_addptr(a,b)                            \
        (a).tv64 += (b).tv64;                           \
        if ((a).tv.nsec >= NSEC_PER_SEC) {              \
                (a).tv64 += (u32)-NSEC_PER_SEC;         \
        }
        
#define timespec_addppp(c,a,b)                          \
        (c).tv64 = (a).tv64 + (b).tv64;                 \
        if ((c).tv.nsec >= NSEC_PER_SEC) {              \
                (c).tv64 += (u32)-NSEC_PER_SEC;         \
        }
#else
#define timespec_addptr(a,b)                            \
        (a).tv.sec = ((a).tv.sec + (b).tv.sec);         \
        (a).tv.nsec = ((a).tv.nsec + (b).tv.nsec);      \
        if ((a).tv.nsec >= NSEC_PER_SEC) {              \
                (a).tv.nsec -= NSEC_PER_SEC;            \
                (a).tv.sec++;                           \
        }

#define timespec_addppp(c,a,b)                          \
        (c).tv.sec = ((a).tv.sec + (b).tv.sec);         \
        (c).tv.nsec = ((a).tv.nsec + (b).tv.nsec);      \
        if ((c).tv.nsec >= NSEC_PER_SEC) {              \
                (c).tv.nsec -= NSEC_PER_SEC;            \
                (c).tv.sec++;                           \
        }
#endif  

Adding the necessary conversion to the makes the difference even smaller.

> The only point, where (k)timespec has an advantage is that the userspace
> value must not be converted to nsec_t, but deducing therefor this is the
> better overall solution is a fallacy.

That's your opinion...

> nsec_t				ktimespec
> 
> syscall:
> 32x32 mul
> 64bit add			2 x 32bit move
> 
> arm timer:
> 64 bit add			2 x 32 bit add
> 				  32 bit compare
> 				  32 bit sub
> 				  32 bit add
> 
> The 3 operation compensate for the 32x32 
> multiplication.

The multiply is not necessarly cheap, if the arch has no 32x32->64 
instruction, gcc will generate a call to __muldi3().
Overall for the common case both variations don't differ much in speed 
and size (for a single code path). For a few timers it likely doesn't 
matter and for a lot of timers the tree insert likely dominates.

> The backward conversion from nsec_t to timespec is almost a non issue.
> The vast majority of callers dont provide the second argument to
> nanosleep(), setitimer(), set_timer() which makes the conversion
> necessary and I think we optimize for the common use case.

You know very well, that the conversion back to timespec is the killer in 
your calculation. You graciously decide that the "vast majority" doesn't 
want to read the timer, how did you get to that conclusion?

> Besides that the representation of time in nsec_t values is much
> clearer. 

Well, that depends on the bigger picture, mainly how the timesource 
manages the time. We want to optimize them for a fast get(ns)timeofday, so 
we have already timespec based interfaces. Tick based sources will keep a 
cached xtime timespec, so they either have to convert that to ns or 
maintain another cached value just for your ktimers.
As long as you can't get rid of timespec completely (which is impossible), 
there is a value in keeping it as much as possible as timespec.

bye, Roman

  parent reply	other threads:[~2005-09-24 23:45 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-19 16:48 tglx
2005-09-19 16:48 ` [PATCH] " tglx
2005-09-19 21:47 ` [ANNOUNCE] " Thomas Gleixner
2005-09-19 22:03 ` Christoph Lameter
2005-09-19 22:17   ` Thomas Gleixner
2005-09-19 22:24     ` Christoph Lameter
2005-09-19 22:44       ` Thomas Gleixner
2005-09-19 22:50         ` john stultz
2005-09-19 22:58           ` Thomas Gleixner
2005-09-19 23:04         ` Christoph Lameter
2005-09-19 23:12           ` Thomas Gleixner
2005-09-20  7:14             ` Ingo Molnar
2005-09-20  7:10       ` Ingo Molnar
2005-09-21 19:24       ` Pavel Machek
2005-09-19 22:39     ` Christopher Friesen
2005-09-19 22:54       ` Thomas Gleixner
2005-09-20  4:57         ` Christopher Friesen
2005-09-20  5:11           ` Thomas Gleixner
2005-09-20  0:43   ` George Anzinger
2005-09-21 19:50 ` Roman Zippel
2005-09-21 22:41   ` Thomas Gleixner
2005-09-22 12:59     ` Ingo Molnar
2005-09-22 23:09     ` Roman Zippel
2005-09-22 23:31       ` Christopher Friesen
2005-09-23  0:25         ` Roman Zippel
2005-09-23  6:49           ` Thomas Gleixner
2005-09-24  3:15             ` Roman Zippel
2005-09-24  5:16               ` Ingo Molnar
2005-09-24 10:35                 ` Roman Zippel
2005-09-24 13:56                   ` Thomas Gleixner
2005-09-24 16:51                     ` Daniel Walker
2005-09-24 23:45                     ` Roman Zippel [this message]
2005-09-25 21:00                       ` Thomas Gleixner
2005-09-27 16:54                         ` Roman Zippel
2005-09-27 19:03                           ` Tim Bird
2005-09-28 16:36                             ` Roman Zippel
2005-09-25 21:02                       ` Thomas Gleixner
2005-09-27 16:48                         ` Roman Zippel
2005-09-27 18:38                           ` Tim Bird
2005-09-27 20:36                             ` George Anzinger
2005-09-23  2:25       ` john stultz
2005-09-23  8:27       ` Thomas Gleixner
2005-09-24  2:43         ` Roman Zippel
2005-09-24  5:03           ` Ingo Molnar
2005-09-24  9:04           ` James Bruce
2005-09-23 15:21       ` Paul E. McKenney
2005-09-24  3:38         ` Roman Zippel
2005-09-25 15:48 Sid Boyce
2005-09-25 18:20 ` Zwane Mwaikambo
2005-09-26  0:02   ` Sid Boyce

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=Pine.LNX.4.61.0509250052390.3728@scrub.home \
    --to=zippel@linux-m68k.org \
    --cc=akpm@osdl.org \
    --cc=cfriesen@nortel.com \
    --cc=george@mvista.com \
    --cc=johnstul@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=paulmck@us.ibm.com \
    --cc=tglx@linutronix.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®