From: Amos Kong <akong@redhat.com>
To: autotest@test.kernel.org
Cc: lmr@redhat.com, glommer@redhat.com, zamsden@redhat.com,
kvm@vger.kernel.org
Subject: [Autotest PATCH] KVM-test: TSC drift test
Date: Thu, 21 Apr 2011 15:33:02 +0800 [thread overview]
Message-ID: <20110421073302.12433.13463.stgit@t> (raw)
This case is used to test the drift between host and guest.
Use taskset to make tsc program execute in a single cpu.
If the drift ratio bigger than 10%, then fail this case.
Signed-off-by: Amos Kong <akong@redhat.com>
---
client/tests/kvm/deps/get_tsc.c | 27 ++++++++++
client/tests/kvm/tests/tsc_drift.py | 88 ++++++++++++++++++++++++++++++++
client/tests/kvm/tests_base.cfg.sample | 5 ++
3 files changed, 120 insertions(+), 0 deletions(-)
create mode 100644 client/tests/kvm/deps/get_tsc.c
create mode 100644 client/tests/kvm/tests/tsc_drift.py
diff --git a/client/tests/kvm/deps/get_tsc.c b/client/tests/kvm/deps/get_tsc.c
new file mode 100644
index 0000000..e91a41f
--- /dev/null
+++ b/client/tests/kvm/deps/get_tsc.c
@@ -0,0 +1,27 @@
+/*
+ * Programme to get cpu's TSC(time stamp counter)
+ * Copyright(C) 2009 Redhat, Inc.
+ * Amos Kong <akong@redhat.com>
+ * Dec 9, 2009
+ *
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdint.h>
+
+typedef unsigned long long u64;
+
+u64 rdtsc(void)
+{
+ unsigned tsc_lo, tsc_hi;
+
+ asm volatile("rdtsc" : "=a"(tsc_lo), "=d"(tsc_hi));
+ return tsc_lo | (u64)tsc_hi << 32;
+}
+
+int main(void)
+{
+ printf("%lld\n", rdtsc());
+ return 0;
+}
diff --git a/client/tests/kvm/tests/tsc_drift.py b/client/tests/kvm/tests/tsc_drift.py
new file mode 100644
index 0000000..de2fb76
--- /dev/null
+++ b/client/tests/kvm/tests/tsc_drift.py
@@ -0,0 +1,88 @@
+import time, os, logging, commands, re
+from autotest_lib.client.common_lib import error
+from autotest_lib.client.bin import local_host
+import kvm_test_utils
+
+
+def run_tsc_drift(test, params, env):
+ """
+ Check the TSC(time stamp counter) frequency of guest and host whether match
+ or not
+
+ 1) Computer average tsc frequency of host's cpus by C the program
+ 2) Copy the C code to the guest, complie and run it to get tsc
+ frequency of guest's vcpus
+ 3) Sleep sometimes and get the TSC of host and guest again
+ 4) Compute the TSC frequency of host and guest
+ 5) Compare the frequency deviation between host and guest with standard
+
+ @param test: Kvm test object
+ @param params: Dictionary with the test parameters.
+ @param env: Dictionary with test environment.
+ """
+ drift_threshold = float(params.get("drift_threshold"))
+ interval = float(params.get("interval"))
+ cpu_chk_cmd = params.get("cpu_chk_cmd")
+ tsc_freq_path = os.path.join(test.bindir, 'deps/get_tsc.c')
+ host_freq = 0
+
+ def get_tsc(machine="host", i=0):
+ cmd = "taskset -c %s /tmp/get_tsc" % i
+ if machine == "host":
+ s, o = commands.getstatusoutput(cmd)
+ else:
+ s, o = session.cmd_status_output(cmd)
+ if s != 0:
+ logging.debug(o)
+ raise error.TestError("Fail to get tsc of host, ncpu: %d" % i)
+ return float(re.findall("(\d+)",o)[0])
+
+ vm = env.get_vm(params["main_vm"])
+ vm.verify_alive()
+ timeout = float(params.get("login_timeout", 240))
+ session = vm.wait_for_login(timeout=timeout)
+
+ commands.getoutput("gcc %s -o /tmp/get_tsc" % tsc_freq_path)
+ ncpu = local_host.LocalHost().get_num_cpu()
+
+ logging.info("Interval is %s" % interval)
+ logging.info("Determine the TSC frequency in the host")
+ for i in range(ncpu):
+ tsc1 = get_tsc("host", i)
+ time.sleep(interval)
+ tsc2 = get_tsc("host", i)
+
+ delta = tsc2 - tsc1
+ logging.info("Host TSC delta for cpu %s is %s" % (i, delta))
+ if delta < 0:
+ raise error.TestError("Host TSC for cpu %s warps %s" % (i, delta))
+
+ host_freq += delta / ncpu
+ logging.info("Average frequency of host's cpus: %s" % host_freq)
+
+ vm.copy_files_to(tsc_freq_path,'/tmp/get_tsc.c')
+ session.cmd("gcc /tmp/get_tsc.c -o /tmp/get_tsc")
+
+ s, guest_ncpu = session.cmd_status_output(cpu_chk_cmd)
+
+ success = True
+ for i in range(int(guest_ncpu)):
+ tsc1 = get_tsc("guest", i)
+ time.sleep(interval)
+ tsc2 = get_tsc("guest", i)
+
+ delta = tsc2 - tsc1
+ logging.info("Guest TSC delta for vcpu %s is %s" % (i, delta))
+ if delta < 0:
+ logging.error("Guest TSC for vcpu %s warps %s" % (i, delta))
+
+ ratio = 100 * (delta - host_freq) / host_freq
+ logging.info("TSC drift ratio for vcpu %s is %s" % (i, ratio))
+ if abs(ratio) > drift_threshold:
+ logging.error("TSC drift found for vcpu %s ratio %s" % (i, ratio))
+ success = False
+
+ if not success:
+ raise error.TestFail("TSC drift found for the guest, please check the "
+ "log for details")
+ session.close()
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index ceafebe..8e70746 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -331,6 +331,11 @@ variants:
drift_threshold = 10
drift_threshold_single = 3
+ - tsc_drift:
+ type = tsc_drift
+ drift_threshold = 10
+ interval = 30
+
- balloon_check: install setup unattended_install.cdrom
type = balloon_check
extra_params += " -balloon virtio"
next reply other threads:[~2011-04-21 7:33 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-21 7:33 Amos Kong [this message]
2011-04-29 5:42 ` [Autotest PATCH] KVM-test: TSC drift test Lucas Meneghel Rodrigues
2011-05-06 15:00 ` Amos Kong
2011-07-26 18:45 ` [Autotest] " Lucas Meneghel Rodrigues
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=20110421073302.12433.13463.stgit@t \
--to=akong@redhat.com \
--cc=autotest@test.kernel.org \
--cc=glommer@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=lmr@redhat.com \
--cc=zamsden@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 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.