Frederic Weisbecker wrote: > On Tue, Nov 03, 2009 at 08:58:52PM +0100, Jan Kiszka wrote: >> Frederic Weisbecker wrote: >>> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c >>> index fc2974a..6560129 100644 >>> --- a/arch/x86/kvm/x86.c >>> +++ b/arch/x86/kvm/x86.c >>> @@ -42,6 +42,7 @@ >>> #define CREATE_TRACE_POINTS >>> #include "trace.h" >>> >>> +#include >>> #include >>> #include >>> #include >>> @@ -3643,14 +3644,12 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) >>> trace_kvm_entry(vcpu->vcpu_id); >>> kvm_x86_ops->run(vcpu, kvm_run); >>> >>> - if (unlikely(vcpu->arch.switch_db_regs || test_thread_flag(TIF_DEBUG))) { >>> - set_debugreg(current->thread.debugreg[0], 0); >>> - set_debugreg(current->thread.debugreg[1], 1); >>> - set_debugreg(current->thread.debugreg[2], 2); >>> - set_debugreg(current->thread.debugreg[3], 3); >>> - set_debugreg(current->thread.debugreg6, 6); >>> - set_debugreg(current->thread.debugreg7, 7); >>> - } >>> + /* >>> + * CHECKME: is vcpu->arch.switch_db_regs sufficient to check >>> + * if the guest is using breakpoints? If so we may want to do >>> + * this check before. >>> + */ >>> + hw_breakpoint_restore(); >> Obviously, this variant will make KVM users very unhappy. But trying to >> reduce this performance regression via vcpu->arch.switch_db_regs will >> make hw-breakpoint users unhappy: KVM leaves at least dr7 clobbered >> behind, even if the guest does not use breakpoints. > > > Yeah, that's why I've made unconditionally. At least it works in every > cases, but this is temporary. > > >> We really need a replacement for TIF_DEBUG (but we only need this [1]). >> >> Jan >> >> [1]http://thread.gmane.org/gmane.comp.emulators.kvm.devel/39784/focus=39827 >> > > > Thinking about it, this check should cover every cases: > > if (vcpu->arch.switch_db_regs || __get_cpu_var(dr7) & DR_GLOBAL_ENABLE_MASK) > > If we have __get_cpu_var(dr7) & DR_GLOBAL_ENABLE_MASK, it means there is an > active breakpoint and then we should restore the current state. > And what about (__get_cpu_var(dr7) & DR_GLOBAL_ENABLE_MASK) only? Would you be able to live with unsync'ed hardware and software states? Jan