linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Zachary Amsden <zamsden@redhat.com>
To: KVM <kvm@vger.kernel.org>, Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Glauber Costa <glommer@redhat.com>
Cc: Linux-kernel <linux-kernel@vger.kernel.org>,
	Zachary Amsden <zamsden@redhat.com>, Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Glauber Costa <glommer@redhat.com>
Subject: [PATCH 13/18] Move scale_delta into common header
Date: Mon, 12 Jul 2010 16:25:33 -1000	[thread overview]
Message-ID: <1278987938-23873-14-git-send-email-zamsden@redhat.com> (raw)
In-Reply-To: <1278987938-23873-1-git-send-email-zamsden@redhat.com>

The scale_delta function for shift / multiply with 31-bit
precision moves to a common header so it can be used by both
kernel and kvm module.

Signed-off-by: Zachary Amsden <zamsden@redhat.com>
---
 arch/x86/include/asm/pvclock.h |   38 ++++++++++++++++++++++++++++++++++++++
 arch/x86/kernel/pvclock.c      |    3 ++-
 2 files changed, 40 insertions(+), 1 deletions(-)

diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h
index cd02f32..7f7e577 100644
--- a/arch/x86/include/asm/pvclock.h
+++ b/arch/x86/include/asm/pvclock.h
@@ -12,4 +12,42 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
 			    struct pvclock_vcpu_time_info *vcpu,
 			    struct timespec *ts);
 
+/*
+ * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
+ * yielding a 64-bit result.
+ */
+static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift)
+{
+	u64 product;
+#ifdef __i386__
+	u32 tmp1, tmp2;
+#endif
+
+	if (shift < 0)
+		delta >>= -shift;
+	else
+		delta <<= shift;
+
+#ifdef __i386__
+	__asm__ (
+		"mul  %5       ; "
+		"mov  %4,%%eax ; "
+		"mov  %%edx,%4 ; "
+		"mul  %5       ; "
+		"xor  %5,%5    ; "
+		"add  %4,%%eax ; "
+		"adc  %5,%%edx ; "
+		: "=A" (product), "=r" (tmp1), "=r" (tmp2)
+		: "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
+#elif defined(__x86_64__)
+	__asm__ (
+		"mul %%rdx ; shrd $32,%%rdx,%%rax"
+		: "=a" (product) : "0" (delta), "d" ((u64)mul_frac) );
+#else
+#error implement me!
+#endif
+
+	return product;
+}
+
 #endif /* _ASM_X86_PVCLOCK_H */
diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c
index 239427c..bab3b9e 100644
--- a/arch/x86/kernel/pvclock.c
+++ b/arch/x86/kernel/pvclock.c
@@ -82,7 +82,8 @@ static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
 static u64 pvclock_get_nsec_offset(struct pvclock_shadow_time *shadow)
 {
 	u64 delta = native_read_tsc() - shadow->tsc_timestamp;
-	return scale_delta(delta, shadow->tsc_to_nsec_mul, shadow->tsc_shift);
+	return pvclock_scale_delta(delta, shadow->tsc_to_nsec_mul,
+				   shadow->tsc_shift);
 }
 
 /*
-- 
1.7.1


  parent reply	other threads:[~2010-07-13  2:26 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-13  2:25 KVM timekeeping fixes, V2 Zachary Amsden
2010-07-13  2:25 ` [PATCH 01/18] Make TSC offset writes non-preemptible Zachary Amsden
2010-07-13 21:33   ` Rik van Riel
2010-07-18 14:28   ` Avi Kivity
2010-07-18 14:30   ` Avi Kivity
2010-07-13  2:25 ` [PATCH 02/18] Fix SVM VMCB reset Zachary Amsden
2010-07-13 21:37   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 03/18] TSC reset compensation Zachary Amsden
2010-07-13 22:11   ` Rik van Riel
2010-07-18 14:34   ` Avi Kivity
2010-07-19 20:01     ` Zachary Amsden
2010-07-13  2:25 ` [PATCH 04/18] Make cpu_tsc_khz updates use local CPU Zachary Amsden
2010-07-14 14:41   ` Rik van Riel
2010-07-18 14:45   ` Avi Kivity
2010-07-19 20:06     ` Zachary Amsden
2010-07-20  8:53       ` Avi Kivity
2010-07-20 21:57         ` Zachary Amsden
2010-07-13  2:25 ` [PATCH 05/18] Warn about unstable TSC Zachary Amsden
2010-07-14 15:02   ` Rik van Riel
2010-07-18 14:47   ` Avi Kivity
2010-07-13  2:25 ` [PATCH 06/18] Unify TSC logic Zachary Amsden
2010-07-14 15:53   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 07/18] Fix deep C-state TSC desynchronization Zachary Amsden
2010-07-14 16:14   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 08/18] Add helper functions for time computation Zachary Amsden
2010-07-14 19:02   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 09/18] Robust TSC compensation Zachary Amsden
2010-07-13 20:34   ` Marcelo Tosatti
2010-07-13 21:15     ` Zachary Amsden
2010-07-13 21:42       ` David S. Ahern
2010-07-13 21:45         ` Zachary Amsden
2010-07-13 23:32         ` Zachary Amsden
2010-07-14 22:33   ` Rik van Riel
2010-07-18 14:52   ` Avi Kivity
2010-07-19 20:39     ` Zachary Amsden
2010-07-13  2:25 ` [PATCH 10/18] Keep SMP VMs more in sync on unstable TSC Zachary Amsden
2010-07-15  2:13   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 11/18] Perform hardware_enable in CPU_STARTING callback Zachary Amsden
2010-07-15  2:15   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 12/18] Add clock sync request to hardware enable Zachary Amsden
2010-07-15  2:32   ` Rik van Riel
2010-07-13  2:25 ` Zachary Amsden [this message]
2010-07-15  2:35   ` [PATCH 13/18] Move scale_delta into common header Rik van Riel
2010-07-13  2:25 ` [PATCH 14/18] Fix a possible backwards warp of kvmclock Zachary Amsden
2010-07-15  2:37   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 15/18] Implement getnsboottime kernel API Zachary Amsden
2010-07-15  2:41   ` Rik van Riel
2010-07-18 15:07   ` Avi Kivity
2010-07-13  2:25 ` [PATCH 16/18] Use getnsboottime in KVM Zachary Amsden
2010-07-15  2:43   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 17/18] Indicate reliable TSC in kvmclock Zachary Amsden
2010-07-15  2:44   ` Rik van Riel
2010-07-13  2:25 ` [PATCH 18/18] Add timekeeping documentation Zachary Amsden
2010-07-14  7:16   ` Takuya Yoshikawa
2010-07-14 20:28     ` Zachary Amsden
2010-07-16 13:19 ` KVM timekeeping fixes, V2 Joerg Roedel
2010-07-16 17:20   ` Zachary Amsden
2010-07-16 19:26     ` Joerg Roedel
2010-07-18 14:22       ` Avi Kivity
2010-07-18 15:08 ` Avi Kivity
2010-07-19  8:11   ` Zachary Amsden
  -- strict thread matches above, loose matches on Subject: below --
2010-07-13  2:07 KVM timekeeping fixes Zachary Amsden
2010-07-13  2:08 ` [PATCH 13/18] Move scale_delta into common header Zachary Amsden

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=1278987938-23873-14-git-send-email-zamsden@redhat.com \
    --to=zamsden@redhat.com \
    --cc=avi@redhat.com \
    --cc=glommer@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    /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;
as well as URLs for NNTP newsgroup(s).