Bear, Some comments below. On Wed, May 06, 2009 at 12:02:21PM +0800, Bear Yang wrote: > Hello everyone, > > I like to submit patch to add a new function for 'time drift check' for > guest running on KVM. > > The TimeDrift design logic is below: > 1. Set the host as the NTP server > 2. Guest only sync it's clock with host *once* when it booted up. > * if the offset value of ntpdate large than 1 sec, the guest will sync > the clock with host. > * if the offset value of ntpdate less than 1 sec, the guest doesn't need > sync it's clock with host. > > 3. Then the cpu stress testing will running on guest. > * a C program will give the real load to guest cpu > 4.when the cpustress testing finished. running the commandline <ntpdate > -q host-ip> totally 20 times on guest to query the time from host and > judge whether the guest clock has drift or not. > > The details of my patch is attached. > > thanks. > > Bear. > diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c > --- kvm_runtest_2.bak/cpu_stress.c 1969-12-31 19:00:00.000000000 -0500 > +++ kvm_runtest_2/cpu_stress.c 2009-05-05 22:35:34.000000000 -0400 > @@ -0,0 +1,61 @@ > +#define _GNU_SOURCE > +#include <stdio.h> > +#include <pthread.h> > +#include <sched.h> > +#include <stdlib.h> > +#include <fcntl.h> > +#include <math.h> > +#include <unistd.h> > + > +#define MAX_CPUS 256 > +#define BUFFSIZE 1024 > + > + > +void worker_child(int cpu) > +{ > + int cur_freq; > + int min_freq; > + int max_freq; > + int last_freq; > + cpu_set_t mask; > + int i; > + double x; > + int d = 0; > + /* > + * bind this thread to the specified cpu > + */ > + CPU_ZERO(&mask); > + CPU_SET(cpu, &mask); > + sched_setaffinity(0, CPU_SETSIZE, &mask); > + > + while (d++ != 500000) { > + for (i=0; i<100000; i++) > + x = sqrt(x); > + } > + > + _exit(0); > + > +} > + > + > +main() { > + cpu_set_t mask; > + int i; > + int code; > + > + if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){ > + perror ("sched_getaffinity"); > + exit(1); > + } > + > + for (i=0; i<CPU_SETSIZE; i++) > + if (CPU_ISSET(i, &mask)){ > + printf ("CPU%d\n",i); > + if (fork() == 0) > + worker_child(i); > + } > + > + > + wait(&code); > + exit (WEXITSTATUS(code)); > +} > diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py > --- kvm_runtest_2.bak/kvm_runtest_2.py 2009-04-29 06:17:29.000000000 -0400 > +++ kvm_runtest_2/kvm_runtest_2.py 2009-04-29 08:06:32.000000000 -0400 > @@ -36,6 +36,8 @@ > "autotest": test_routine("kvm_tests", "run_autotest"), > "kvm_install": test_routine("kvm_install", "run_kvm_install"), > "linux_s3": test_routine("kvm_tests", "run_linux_s3"), > + "ntp_server_setup": test_routine("kvm_tests", "run_ntp_server_setup"), > + "timedrift": test_routine("kvm_tests", "run_timedrift"), > } > > # Make it possible to import modules from the test's bindir > diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample > --- kvm_runtest_2.bak/kvm_tests.cfg.sample 2009-04-29 06:17:29.000000000 -0400 > +++ kvm_runtest_2/kvm_tests.cfg.sample 2009-04-29 08:09:36.000000000 -0400 > @@ -81,6 +81,10 @@ > - linux_s3: install setup > type = linux_s3 > > + - ntp_server_setup: > + type = ntp_server_setup > + - timedrift: ntp_server_setup > + type = timedrift > # NICs > variants: > - @rtl8139: > diff -urN kvm_runtest_2.bak/kvm_tests.py kvm_runtest_2/kvm_tests.py > --- kvm_runtest_2.bak/kvm_tests.py 2009-04-29 06:17:29.000000000 -0400 > +++ kvm_runtest_2/kvm_tests.py 2009-05-05 23:45:57.000000000 -0400 > @@ -394,3 +394,235 @@ > kvm_log.info("VM resumed after S3") > > session.close() > + > +def run_ntp_server_setup(test, params, env): > + > + """NTP server configuration and related network file modification > + """ > + kvm_log.debug("run ntp server setup") > + status = 1 > + # stop firewall for NTP server if it is running. > + status = os.system("/etc/init.d/iptables status") > + if status == 0: > + os.system("/etc/init.d/iptables stop") > + status = 1 > + > + # prevent dhcp client modify the ntp.conf > + kvm_log.info("prevent dhcp client modify the ntp.conf") > + > + config_file = "/etc/sysconfig/network" > + network_file = open("/etc/sysconfig/network", "a") > + string = "PEERNTP=no" > + > + if os.system("grep %s %s" % (string, config_file)): > + network_file.writelines(str(string)+'\n') > + > + network_file.close() > + > + # start ntp server on host > + kvm_log.info("backup ntp config file") > + > + ntp_filename = os.path.expanduser("/etc/ntp.conf") > + # backup ntp config file > + backup_bootloader_filename = ntp_filename + "_backup" > + if os.path.exists(ntp_filename): > + os.rename(ntp_filename, backup_bootloader_filename) > + > + status = os.system("/etc/init.d/ntpd status") > + if status == 0: > + os.system("/etc/init.d/ntpd stop") > + status = 1 > + > + kvm_log.info("start ntp server on host") > + > + ntp_cmd = ''' > + echo "restrict default kod nomodify notrap nopeer noquery" >> /etc/ntp.conf;\ > + echo "restrict 127.0.0.1" >> /etc/ntp.conf;\ > + echo "driftfile /var/lib/ntp/drift" >> /etc/ntp.conf;\ > + echo "keys /etc/ntp/keys" >> /etc/ntp.conf;\ > + echo "server 127.127.1.0" >> /etc/ntp.conf;\ > + echo "fudge 127.127.1.0 stratum 1" >> /etc/ntp.conf;\ > + service ntpd start; > + ''' I think it would be better to copy /etc/ntp.conf to a temporary file, modify that, and start ntpd with the -c option. After the test is finished, restart ntpd with the default config (if it was running) via service ntpd restart. Also I don't see whether your script reports the content of /sys/devices/system/clocksource/clocksource0/current_clocksource On the guest? Its important that information is displayed on the test report. Looks fine to me other than that, but the kvm-autotest guys probably have more comments. Thanks -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html