kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] KVM: nSVM: Additions to optimizing L12 to L2 vmcb.save copies
@ 2021-03-17 16:29 Cathy Avery
  2021-03-23 16:08 ` Sean Christopherson
  0 siblings, 1 reply; 2+ messages in thread
From: Cathy Avery @ 2021-03-17 16:29 UTC (permalink / raw)
  To: linux-kernel, kvm, pbonzini; +Cc: vkuznets, wei.huang2, seanjc

Extend using the vmcb12 control clean field to determine which
vmcb12.save registers were marked dirty in order to minimize
register copies by including the CR bit.

This patch also fixes the init of last_vmcb12_gpa by using an invalid
physical address instead of 0.

Tested:
kvm-unit-tests
kvm selftests
Fedora L1 L2

Signed-off-by: Cathy Avery <cavery@redhat.com>
---
 arch/x86/kvm/svm/nested.c | 9 ++++++---
 arch/x86/kvm/svm/svm.c    | 2 +-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c
index 8523f60adb92..6f9a40e002bc 100644
--- a/arch/x86/kvm/svm/nested.c
+++ b/arch/x86/kvm/svm/nested.c
@@ -449,9 +449,12 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12
 	}
 
 	kvm_set_rflags(&svm->vcpu, vmcb12->save.rflags | X86_EFLAGS_FIXED);
-	svm_set_efer(&svm->vcpu, vmcb12->save.efer);
-	svm_set_cr0(&svm->vcpu, vmcb12->save.cr0);
-	svm_set_cr4(&svm->vcpu, vmcb12->save.cr4);
+
+	if (unlikely(new_vmcb12 || vmcb_is_dirty(vmcb12, VMCB_CR))) {
+		svm_set_efer(&svm->vcpu, vmcb12->save.efer);
+		svm_set_cr0(&svm->vcpu, vmcb12->save.cr0);
+		svm_set_cr4(&svm->vcpu, vmcb12->save.cr4);
+	}
 
 	svm->vcpu.arch.cr2 = vmcb12->save.cr2;
 
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 271196400495..41f5cd1009ca 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -1234,7 +1234,7 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
 	svm->asid = 0;
 
 	svm->nested.vmcb12_gpa = 0;
-	svm->nested.last_vmcb12_gpa = 0;
+	svm->nested.last_vmcb12_gpa = -1;
 	vcpu->arch.hflags = 0;
 
 	if (!kvm_pause_in_guest(vcpu->kvm)) {
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] KVM: nSVM: Additions to optimizing L12 to L2 vmcb.save copies
  2021-03-17 16:29 [PATCH] KVM: nSVM: Additions to optimizing L12 to L2 vmcb.save copies Cathy Avery
@ 2021-03-23 16:08 ` Sean Christopherson
  0 siblings, 0 replies; 2+ messages in thread
From: Sean Christopherson @ 2021-03-23 16:08 UTC (permalink / raw)
  To: Cathy Avery; +Cc: linux-kernel, kvm, pbonzini, vkuznets, wei.huang2

On Wed, Mar 17, 2021, Cathy Avery wrote:
> Extend using the vmcb12 control clean field to determine which
> vmcb12.save registers were marked dirty in order to minimize
> register copies by including the CR bit.
> 
> This patch also fixes the init of last_vmcb12_gpa by using an invalid
> physical address instead of 0.
> 
> Tested:
> kvm-unit-tests
> kvm selftests
> Fedora L1 L2
> 
> Signed-off-by: Cathy Avery <cavery@redhat.com>
> ---
>  arch/x86/kvm/svm/nested.c | 9 ++++++---
>  arch/x86/kvm/svm/svm.c    | 2 +-
>  2 files changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c
> index 8523f60adb92..6f9a40e002bc 100644
> --- a/arch/x86/kvm/svm/nested.c
> +++ b/arch/x86/kvm/svm/nested.c
> @@ -449,9 +449,12 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12
>  	}
>  
>  	kvm_set_rflags(&svm->vcpu, vmcb12->save.rflags | X86_EFLAGS_FIXED);
> -	svm_set_efer(&svm->vcpu, vmcb12->save.efer);
> -	svm_set_cr0(&svm->vcpu, vmcb12->save.cr0);
> -	svm_set_cr4(&svm->vcpu, vmcb12->save.cr4);
> +
> +	if (unlikely(new_vmcb12 || vmcb_is_dirty(vmcb12, VMCB_CR))) {
> +		svm_set_efer(&svm->vcpu, vmcb12->save.efer);
> +		svm_set_cr0(&svm->vcpu, vmcb12->save.cr0);
> +		svm_set_cr4(&svm->vcpu, vmcb12->save.cr4);

This doesn't seem correct.  Regardless of when vmcb12 was last touched, KVM
still needs to set L2's state in vcpu->arch and set the correct MMU context.

> +	}
>  
>  	svm->vcpu.arch.cr2 = vmcb12->save.cr2;
>  
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index 271196400495..41f5cd1009ca 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -1234,7 +1234,7 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
>  	svm->asid = 0;
>  
>  	svm->nested.vmcb12_gpa = 0;
> -	svm->nested.last_vmcb12_gpa = 0;
> +	svm->nested.last_vmcb12_gpa = -1;

INVALID_PAGE would be even better.

>  	vcpu->arch.hflags = 0;
>  
>  	if (!kvm_pause_in_guest(vcpu->kvm)) {
> -- 
> 2.26.2
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-03-23 16:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-17 16:29 [PATCH] KVM: nSVM: Additions to optimizing L12 to L2 vmcb.save copies Cathy Avery
2021-03-23 16:08 ` Sean Christopherson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).