public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
	alex.williamson@redhat.com, mtosatti@redhat.com, gleb@kernel.org,
	jan.kiszka@siemens.com
Subject: Re: [PATCH 3/7] KVM: x86: Allow the guest to run with dirty debug registers
Date: Sun, 09 Mar 2014 21:07:08 +0100	[thread overview]
Message-ID: <531CC9EC.1000804@redhat.com> (raw)
In-Reply-To: <20140309182825.GA11078@potion.redhat.com>

Il 09/03/2014 19:28, Radim Krčmář ha scritto:
>> >  	/*
>> > +	 * Do this here before restoring debug registers on the host.  And
>> > +	 * since we do this before handling the vmexit, a DR access vmexit
>> > +	 * can (a) read the correct value of the debug registers, (b) set
>> > +	 * KVM_DEBUGREG_WONT_EXIT again.
> We re-enable intercepts on the next exit for the sake of simplicity?
> (Batched accesses make perfect sense, but it seems we don't have to care
>  about DRs at all, without guest-debug.)

It's not just for the sake of simplicity.  Synchronizing debug registers 
on entry does have some cost, and it's required for running without 
debug register intercepts.  You would incur this cost always, since 
no-guest-debug is actually the common case.

We're well into diminishing returns; Alex timed this patch vs. one that 
completely ignores MOV DR exits and (to the surprise of both of us) this 
patch completely restored performance despite still having a few tens of 
thousands MOV DR exits/second.

In the problematic case, each context switch will do a save and restore 
of debug registers; that's in total 13 debug register accesses (read 6 
registers, write DR7 to disable all registers, write 6 registers 
including DR7 which enables breakpoints), all very close in time.  It's 
quite likely that the final DR7 write is very expensive (e.g. it might 
have to flush the pipeline).  Also, this test case must be very heavy on 
context switches, and each context switch already incurs a few exits 
(for example to inject the interrupt that causes it, to read the current 
time).

A different optimization could be to skip the LOAD_DEBUG_CONTROLS 
vm-entry control if DR7 == host DR7 == 0x400 && MOV DR exits are 
enabled.  Not sure it's worthwhile though, and there's also the DEBUGCTL 
MSR to take into account.  Better do these kinds of tweaks if they 
actually show up in the profile: Alex's testcase shows that when they 
do, the impact is massive.

>> +		kvm_x86_ops->sync_dirty_debug_regs(vcpu);
>
> Sneaky functionality ... it would be nicer to split 'enable DR
> intercepts' into a new kvm op.

Why?  "Disable DR intercepts" is already folded into the handler for MOV 
DR exits.

> And we don't have to modify DR intercepts then, which is probably the
> main reason why sync_dirty_debug_regs() does two things.

Another is that indirect calls are relatively expensive and add 
complexity; in this case they would always be used back-to-back.

Paolo

  reply	other threads:[~2014-03-09 20:07 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-07 11:42 [PATCH 0/7] KVM: x86: Let the guest write to multiple debug registers with one vmexit Paolo Bonzini
2014-03-07 11:42 ` [PATCH 1/7] KVM: vmx: we do rely on loading DR7 on entry Paolo Bonzini
2014-03-07 11:42 ` [PATCH 2/7] KVM: x86: change vcpu->arch.switch_db_regs to a bit mask Paolo Bonzini
2014-03-07 11:42 ` [PATCH 3/7] KVM: x86: Allow the guest to run with dirty debug registers Paolo Bonzini
2014-03-09 18:28   ` Radim Krčmář
2014-03-09 20:07     ` Paolo Bonzini [this message]
2014-03-10 12:11       ` Radim Krčmář
2014-03-07 11:42 ` [PATCH 4/7] KVM: vmx: " Paolo Bonzini
2014-03-09 18:26   ` Radim Krčmář
2014-03-09 20:12     ` Paolo Bonzini
2014-03-10 12:17       ` Radim Krčmář
2014-03-10 12:24         ` Paolo Bonzini
2014-03-07 11:42 ` [PATCH 5/7] KVM: nVMX: Allow nested guests " Paolo Bonzini
2014-03-07 11:42 ` [PATCH 6/7] KVM: svm: set/clear all DR intercepts in one swoop Paolo Bonzini
2014-03-07 11:42 ` [PATCH 7/7] KVM: svm: Allow the guest to run with dirty debug registers Paolo Bonzini
2014-03-09  8:11 ` [PATCH 0/7] KVM: x86: Let the guest write to multiple debug registers with one vmexit Jan Kiszka
2014-03-09  8:15   ` Jan Kiszka
2014-03-09  8:31     ` Paolo Bonzini
2014-03-10 12:23 ` Radim Krčmář

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=531CC9EC.1000804@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=alex.williamson@redhat.com \
    --cc=gleb@kernel.org \
    --cc=jan.kiszka@siemens.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=rkrcmar@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox