On Thu, Aug 09, 2012 at 03:53:24PM +0300, Avi Kivity wrote: > On 08/09/2012 02:57 PM, Gerd Hoffmann wrote: > > Use kvmclock for tsc calibration when running on kvm. Without this the > > tsc frequency calibrated by seabios can be *way* off in case the virtual > > machine is booted on a loaded host. I've seen seabios calibrating 27 > > instead of ca. 2800 MHz, resulting in timeouts being to short by factor > > 100. Which in turn leads to disk I/O errors due to timeouts, especially > > as I/O requests tend to take a bit longer than usual on a loaded box ... > > > + > > +struct pvclock_vcpu_time_info { > > + u32 version; > > + u32 pad0; > > + u64 tsc_timestamp; > > + u64 system_time; > > + u32 tsc_to_system_mul; > > + s8 tsc_shift; > > + u8 flags; > > + u8 pad[2]; > > +} PACKED; > > + > > + > > +u64 kvm_tsc_khz(void) > > +{ > > + u32 eax, ebx, ecx, edx, msr; > > + struct pvclock_vcpu_time_info time; > > + u32 addr = (u32)(&time); > > + u64 khz; > > + > > + /* check presence and figure msr number */ > > + cpuid(KVM_CPUID_FEATURES, &eax, &ebx, &ecx, &edx); > > + if (eax & KVM_FEATURE_CLOCKSOURCE2) { > > + msr = MSR_KVM_SYSTEM_TIME_NEW; > > + } else if (eax & KVM_FEATURE_CLOCKSOURCE) { > > + msr = MSR_KVM_SYSTEM_TIME; > > + } else { > > + return 0; > > + } > > + > > + /* ask kvm hypervisor to fill struct */ > > + memset(&time, 0, sizeof(time)); > > + wrmsr(msr, addr | 1); > > How can this work? There is a 64-byte alignment requirement. > > > + wrmsr(msr, 0); > > + if (time.version < 2 || time.tsc_to_system_mul == 0) > > + return 0; > > + > > + /* go figure tsc frequency */ > > + khz = pvclock_tsc_khz(&time); > > + dprintf(1, "Using kvmclock, msr 0x%x, tsc %d MHz\n", > > + msr, (u32)khz / 1000); > > + return khz; > > That's a meaningless number. You can be migrated to a cpu or a machine > with very different tsc. Thats why there exists hardware tsc frequency scaling and the software equivalent for that on kvm. > You want accurate time on kvm, don't use the tsc. > > > -- > error compiling committee.c: too many arguments to function > -- > 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 -- 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