KVM: nSVM: Optimize vmcb12 to vmcb02 save area copies
Use the vmcb12 control clean field to determine which vmcb12.save registers were marked dirty in order to minimize register copies when switching from L1 to L2. Those vmcb12 registers marked as dirty need to be copied to L0's vmcb02 as they will be used to update the vmcb state cache for the L2 VMRUN. In the case where we have a different vmcb12 from the last L2 VMRUN all vmcb12.save registers must be copied over to L2.save. Tested: kvm-unit-tests kvm selftests Fedora L1 L2 Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Cathy Avery <cavery@redhat.com> Message-Id: <20210301200844.2000-1-cavery@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
d00b99c514
commit
8173396e94
@@ -93,6 +93,7 @@ struct svm_nested_state {
|
||||
u64 hsave_msr;
|
||||
u64 vm_cr_msr;
|
||||
u64 vmcb12_gpa;
|
||||
u64 last_vmcb12_gpa;
|
||||
|
||||
/* These are the merged vectors */
|
||||
u32 *msrpm;
|
||||
@@ -247,6 +248,11 @@ static inline void vmcb_mark_dirty(struct vmcb *vmcb, int bit)
|
||||
vmcb->control.clean &= ~(1 << bit);
|
||||
}
|
||||
|
||||
static inline bool vmcb_is_dirty(struct vmcb *vmcb, int bit)
|
||||
{
|
||||
return !test_bit(bit, (unsigned long *)&vmcb->control.clean);
|
||||
}
|
||||
|
||||
static inline struct vcpu_svm *to_svm(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return container_of(vcpu, struct vcpu_svm, vcpu);
|
||||
|
||||
Reference in New Issue
Block a user