In order to track a regression that happens using kvmclock
in guests, add test of the clock_getres() syscall, to see
what is the clocksource resolution reported by the guest.
This, combined with variants that set different -cpu params
for the qemu command line, will give us the desired outcome.

Signed-off-by: Lucas Meneghel Rodrigues <[email protected]>
---
 client/tests/kvm/deps/test_clock_getres/Makefile   |   11 ++++
 .../kvm/deps/test_clock_getres/test_clock_getres.c |   58 ++++++++++++++++++++
 client/tests/kvm/tests/clock_getres.py             |   44 +++++++++++++++
 client/tests/kvm/tests_base.cfg.sample             |    3 +
 4 files changed, 116 insertions(+), 0 deletions(-)
 create mode 100644 client/tests/kvm/deps/test_clock_getres/Makefile
 create mode 100644 client/tests/kvm/deps/test_clock_getres/test_clock_getres.c
 create mode 100644 client/tests/kvm/tests/clock_getres.py

diff --git a/client/tests/kvm/deps/test_clock_getres/Makefile 
b/client/tests/kvm/deps/test_clock_getres/Makefile
new file mode 100644
index 0000000..b4f73c7
--- /dev/null
+++ b/client/tests/kvm/deps/test_clock_getres/Makefile
@@ -0,0 +1,11 @@
+CC = gcc
+PROG = test_clock_getres
+SRC = test_clock_getres.c
+LIBS = -lrt
+
+all: $(PROG)
+
+$(PROG):
+       $(CC) $(LIBS) -o $(PROG) $(SRC)
+clean:
+       rm -f $(PROG)
diff --git a/client/tests/kvm/deps/test_clock_getres/test_clock_getres.c 
b/client/tests/kvm/deps/test_clock_getres/test_clock_getres.c
new file mode 100644
index 0000000..81d3b9c
--- /dev/null
+++ b/client/tests/kvm/deps/test_clock_getres/test_clock_getres.c
@@ -0,0 +1,58 @@
+/*
+ *  Test clock resolution for KVM guests that have kvm-clock as clock source
+ *
+ *  Copyright (c) 2010 Red Hat, Inc
+ *  Author: Lucas Meneghel Rodrigues <[email protected]>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdio.h>
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(void) {
+       struct timespec res;
+       int clock_return = clock_getres(CLOCK_MONOTONIC, &res);
+       char clocksource[50];
+       char line[80];
+       FILE *fr;
+       if ((fr = fopen(
+                       
"/sys/devices/system/clocksource/clocksource0/current_clocksource",
+                       "rt")) == NULL) {
+               perror("fopen");
+               return EXIT_FAILURE;
+       }
+       while (fgets(line, 80, fr) != NULL) {
+               sscanf(line, "%s", &clocksource);
+       }
+       fclose(fr);
+       if (!strncmp(clocksource, "kvm-clock", strlen("kvm-clock"))) {
+               if (clock_return == 0) {
+                       if (res.tv_sec > 1 || res.tv_nsec > 100) {
+                               printf("FAIL: clock_getres returned bad clock 
resolution\n");
+                               return EXIT_FAILURE;
+                       } else {
+                               printf("PASS: check successful\n");
+                               return EXIT_SUCCESS;
+                       }
+               } else {
+                       printf("FAIL: clock_getres failed\n");
+                       return EXIT_FAILURE;
+               }
+       } else {
+               printf("FAIL: invalid clock source: %s\n", clocksource);
+               return EXIT_FAILURE;
+       }
+}
diff --git a/client/tests/kvm/tests/clock_getres.py 
b/client/tests/kvm/tests/clock_getres.py
new file mode 100644
index 0000000..7cadae8
--- /dev/null
+++ b/client/tests/kvm/tests/clock_getres.py
@@ -0,0 +1,44 @@
+import logging, time, os
+from autotest_lib.client.common_lib import error
+from autotest_lib.client.common_lib import utils
+import kvm_test_utils, kvm_utils
+
+
+def run_clock_getres(test, params, env):
+    """
+    Verify if guests using kvm-clock as the time source have a sane clock
+    resolution.
+
+    @param test: kvm test object.
+    @param params: Dictionary with test parameters.
+    @param env: Dictionary with the test environment.
+    """
+    t_name = "test_clock_getres"
+    base_dir = "/tmp"
+
+    deps_dir = os.path.join(test.bindir, "deps", t_name)
+    os.chdir(deps_dir)
+    try:
+        utils.system("make clean")
+        utils.system("make")
+    except:
+        raise error.TestError("Failed to compile %s" % t_name)
+
+    test_clock = os.path.join(deps_dir, t_name)
+    if not os.path.isfile(test_clock):
+        raise error.TestError("Could not find %s" % t_name)
+
+    vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+    timeout = int(params.get("login_timeout", 360))
+    session = kvm_test_utils.wait_for_login(vm, timeout=timeout)
+    if not vm.copy_files_to(test_clock, base_dir):
+        raise error.TestError("Failed to copy %s to VM" % t_name)
+    s, o = session.get_command_status_output(os.path.join(base_dir, t_name))
+    if s:
+        raise error.TestError("Execution of %s failed: %s" % (t_name, o))
+    else:
+        logging.info("PASS: Guest reported an appropriate clock source "
+                     "resolution")
+    s, o = session.get_command_status_output("dmesg")
+    logging.info("guest's dmesg:")
+    logging.info(o)
diff --git a/client/tests/kvm/tests_base.cfg.sample 
b/client/tests/kvm/tests_base.cfg.sample
index 40ecf4a..7e36841 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -663,6 +663,9 @@ variants:
                 image_name_snapshot1 = sn1
                 image_name_snapshot2 = sn2
 
+    - clock_getres: install setup unattended_install.cdrom
+        type = clock_getres
+
     # system_powerdown, system_reset and shutdown *must* be the last ones
     # defined (in this order), since the effect of such tests can leave
     # the VM on a bad state.
-- 
1.7.2.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to