Lazy MSR save/restore
PATCH 1/1 Lazy MSR save/restore
Third time's a charm, right? :-)
Regards,
Anthony Liguori
From: Anthony Liguori <aliguori-r/[email protected]>
Subject: [PATCH][SVM] Only save/restore MSRs when needed
We only have to save/restore MSR_GS_BASE on every VMEXIT. The rest can be saved/restored when we leave the VCPU. Since we don't emulate the DEBUGCTL MSRs and the guest cannot write to them, we don't have to worry about saving/restoring them at all.
drivers/kvm/svm.c +15 -11
@@ -522,8 +522,6 @@ control->msrpm_base_pa = msrpm_base; control->tsc_offset =0 ; control->int_ctl =V_INTR_MASKING_MASK ; -if (svm_has (SVM_FEATURE_LBRV )) - control->lbr_ctl =1ULL ;init_seg (&save->es);init_seg (&save->ss);
@@ -611,7 +609,7 @@static void svm_vcpu_load (struct kvm_vcpu *vcpu) { -int cpu; +int cpu, i; cpu =get_cpu ();if (unlikely (cpu != vcpu->cpu)) {
@@ -626,10 +624,18 @@ vcpu->svm->vmcb->control.tsc_offset += delta; vcpu->cpu = cpu; } + +for (i =0 ; i <NR_HOST_SAVE_USER_MSRS ; i++) +rdmsrl (host_save_user_msrs[i], vcpu->svm->host_user_msrs[i]); }static void svm_vcpu_put (struct kvm_vcpu *vcpu) { +int i; + +for (i =0 ; i <NR_HOST_SAVE_USER_MSRS ; i++) +wrmsrl (host_save_user_msrs[i], vcpu->svm->host_user_msrs[i]); +rdtscll (vcpu->host_tsc);put_cpu (); }
@@ -815,18 +821,16 @@static void load_host_msrs (struct kvm_vcpu *vcpu) { -int i; - -for ( i =0 ; i <NR_HOST_SAVE_MSRS ; i++) -wrmsrl (host_save_msrs[i], vcpu->svm->host_msrs[i]); +#ifdef CONFIG_X86_64 +wrmsrl (MSR_GS_BASE , vcpu->svm->host_gs_base); +#endif }static void save_host_msrs (struct kvm_vcpu *vcpu) { -int i; - -for ( i =0 ; i <NR_HOST_SAVE_MSRS ; i++) -rdmsrl (host_save_msrs[i], vcpu->svm->host_msrs[i]); +#ifdef CONFIG_X86_64 +rdmsrl (MSR_GS_BASE , vcpu->svm->host_gs_base); +#endif }static void new_asid (struct kvm_vcpu *vcpu,struct svm_cpu_data *svm_data)
drivers/kvm/kvm_svm.h +5 -6
@@ -9,17 +9,15 @@#include "svm.h" #include "kvm.h" -static const u32 host_save_msrs[] = { +static const u32 host_save_user_msrs[] = { #ifdef CONFIG_X86_64MSR_STAR ,MSR_LSTAR ,MSR_CSTAR ,MSR_SYSCALL_MASK ,MSR_KERNEL_GS_BASE , -MSR_FS_BASE ,MSR_GS_BASE , +MSR_FS_BASE , #endifMSR_IA32_SYSENTER_CS ,MSR_IA32_SYSENTER_ESP ,MSR_IA32_SYSENTER_EIP , -MSR_IA32_DEBUGCTLMSR ,/*MSR_IA32_LASTBRANCHFROMIP, -MSR_IA32_LASTBRANCHTOIP, MSR_IA32_LASTINTFROMIP,MSR_IA32_LASTINTTOIP,*/ }; -#define NR_HOST_SAVE_MSRS ARRAY_SIZE(host_save_msrs) +#define NR_HOST_SAVE_USER_MSRS ARRAY_SIZE(host_save_user_msrs)#define NUM_DB_REGS 4struct vcpu_svm {
@@ -32,7 +30,8 @@u64 next_rip; -u64 host_msrs[NR_HOST_SAVE_MSRS ]; +u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS ]; +u64 host_gs_base;unsigned long host_cr2;unsigned long host_db_regs[NUM_DB_REGS ];unsigned long host_dr6;
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
kvm-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel
A message that is not in the archive (sent off-list or not yet received): 4633ED8D.4000806-r/[email protected]
Quoted 2 lines · Anthony Liguori
Third time's a charm, right? :-)
Right. I measured 2000 cycles saved out of a total of 5000!
Applied & thanks.
Signature · 8 lines
error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/