On Fri, 19 Oct 2018 at 04:44, Christian Ehrhardt <lk@xxxxxxx> wrote: > > > Change efdab992: "KVM: x86: fix escape of guest dr6 to the host" > has negative effects if Linux runs as the L1 guest in a nested > VM setup: > > Each call to kvm_arch_vcpu_put causes an additional L1->L0 exit due > to the %dr6 write even if neither L1 nor L2 uses debug registers. > As the current hardware value of %dr6 is already in vcpu->arch.dr6 > we can avoid the debug register write if all non-reserved bits have > their default value. > > Update the comment and reformat it while there. > > Signed-off-by: Christian Ehrhardt <lk@xxxxxxx> Reviewed-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> > --- > arch/x86/kvm/x86.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index ca717737347e..fcca60adc037 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -3185,11 +3185,13 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) > kvm_x86_ops->vcpu_put(vcpu); > vcpu->arch.last_host_tsc = rdtsc(); > /* > - * If userspace has set any breakpoints or watchpoints, dr6 is restored > - * on every vmexit, but if not, we might have a stale dr6 from the > - * guest. do_debug expects dr6 to be cleared after it runs, do the same. > + * If userspace has set any breakpoints or watchpoints, dr6 is > + * restored on every vmexit, but if not, we might have a stale > + * dr6 from the guest. Thus reset the hardware value of dr6 to > + * its reset value. Avoid the debug register write if possible. > */ > - set_debugreg(0, 6); > + if (vcpu->arch.dr6 != DR6_INIT) > + set_debugreg(DR6_INIT, 6); > } > > static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu, > -- > 2.17.1 >