From: Ingo Molnar <mingo@elte.hu>
To: Andy Lutomirski <luto@MIT.EDU>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
John Stultz <johnstul@us.ibm.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH 4/6] x86-64: vclock_gettime(CLOCK_MONOTONIC) can't ever see nsec < 0
Date: Tue, 29 Mar 2011 08:21:12 +0200 [thread overview]
Message-ID: <20110329062112.GC27398@elte.hu> (raw)
In-Reply-To: <75824c7636ab74a71598080867c927d313c8ab66.1301324270.git.luto@mit.edu>
* Andy Lutomirski <luto@MIT.EDU> wrote:
> vclock_gettime's do_monotonic helper can't ever generate a negative
> nsec value, so it doesn't need to check whether it's negative. This
> saves a single easily-predicted branch.
>
> Signed-off-by: Andy Lutomirski <luto@mit.edu>
> ---
> arch/x86/vdso/vclock_gettime.c | 40 ++++++++++++++++++++++------------------
> 1 files changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c
> index ee55754..67d54bb 100644
> --- a/arch/x86/vdso/vclock_gettime.c
> +++ b/arch/x86/vdso/vclock_gettime.c
> @@ -56,22 +56,6 @@ notrace static noinline int do_realtime(struct timespec *ts)
> return 0;
> }
>
> -/* Copy of the version in kernel/time.c which we cannot directly access */
> -notrace static void
> -vset_normalized_timespec(struct timespec *ts, long sec, long nsec)
> -{
> - while (nsec >= NSEC_PER_SEC) {
> - nsec -= NSEC_PER_SEC;
> - ++sec;
> - }
> - while (nsec < 0) {
> - nsec += NSEC_PER_SEC;
> - --sec;
> - }
> - ts->tv_sec = sec;
> - ts->tv_nsec = nsec;
> -}
> -
> notrace static noinline int do_monotonic(struct timespec *ts)
> {
> unsigned long seq, ns, secs;
> @@ -82,7 +66,17 @@ notrace static noinline int do_monotonic(struct timespec *ts)
> secs += gtod->wall_to_monotonic.tv_sec;
> ns += gtod->wall_to_monotonic.tv_nsec;
> } while (unlikely(read_seqretry(>od->lock, seq)));
> - vset_normalized_timespec(ts, secs, ns);
> +
> + /* wall_time_nsec, vgetns(), and wall_to_monotonic.tv_nsec
> + * are all guaranteed to be nonnegative.
> + */
> + while (ns >= NSEC_PER_SEC) {
> + ns -= NSEC_PER_SEC;
> + ++secs;
> + }
> + ts->tv_sec = secs;
> + ts->tv_nsec = ns;
> +
> return 0;
> }
>
> @@ -107,7 +101,17 @@ notrace static noinline int do_monotonic_coarse(struct timespec *ts)
> secs += gtod->wall_to_monotonic.tv_sec;
> ns += gtod->wall_to_monotonic.tv_nsec;
> } while (unlikely(read_seqretry(>od->lock, seq)));
> - vset_normalized_timespec(ts, secs, ns);
> +
> + /* wall_time_nsec and wall_to_monotonic.tv_nsec are
> + * guaranteed to be between 0 and NSEC_PER_SEC.
> + */
> + if (ns >= NSEC_PER_SEC) {
> + ns -= NSEC_PER_SEC;
> + ++secs;
> + }
> + ts->tv_sec = secs;
> + ts->tv_nsec = ns;
> +
> return 0;
Beyond the change you describe in the changelog, you also uninlined the helper
function.
You can use __always_inline instead and still keep the code maintainable.
Thanks,
Ingo
next prev parent reply other threads:[~2011-03-29 6:21 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-28 15:06 [PATCH 0/6] x86-64: Micro-optimize vclock_gettime Andy Lutomirski
2011-03-28 15:06 ` [PATCH 1/6] x86-64: Optimize vread_tsc's barriers Andy Lutomirski
2011-03-29 6:18 ` Ingo Molnar
2011-03-28 15:06 ` [PATCH 2/6] x86-64: Don't generate cmov in vread_tsc Andy Lutomirski
2011-03-29 6:15 ` Ingo Molnar
2011-03-29 11:52 ` Andrew Lutomirski
2011-03-28 15:06 ` [PATCH 3/6] x86-64: Put vsyscall_gtod_data at a fixed virtual address Andy Lutomirski
2011-03-28 17:49 ` Thomas Gleixner
2011-03-28 18:09 ` Andrew Lutomirski
2011-03-28 21:35 ` Andrew Lutomirski
2011-03-28 23:13 ` Thomas Gleixner
2011-03-28 15:06 ` [PATCH 4/6] x86-64: vclock_gettime(CLOCK_MONOTONIC) can't ever see nsec < 0 Andy Lutomirski
2011-03-29 6:21 ` Ingo Molnar [this message]
2011-03-29 11:54 ` Andrew Lutomirski
2011-03-28 15:06 ` [PATCH 5/6] x86-64: Omit frame pointers on vread_tsc Andy Lutomirski
2011-03-29 6:24 ` Ingo Molnar
2011-03-28 15:06 ` [PATCH 6/6] x86-64: Turn off -pg and turn on -foptimize-sibling-calls for vDSO Andy Lutomirski
2011-03-29 6:27 ` [PATCH 0/6] x86-64: Micro-optimize vclock_gettime Ingo Molnar
2011-04-06 18:20 ` Andi Kleen
2011-04-06 20:10 ` Andrew Lutomirski
2011-04-06 20:14 ` Andi Kleen
2011-04-06 20:49 ` Andrew Lutomirski
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=20110329062112.GC27398@elte.hu \
--to=mingo@elte.hu \
--cc=johnstul@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@MIT.EDU \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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.