* [PATCH] reduce msr efer reloads on heavyweight vmexit
@ 2007-09-16 10:48 Avi Kivity
0 siblings, 0 replies; 2+ messages in thread
From: Avi Kivity @ 2007-09-16 10:48 UTC (permalink / raw)
To: Dong, Eddie; +Cc: kvm-devel
[-- Attachment #1: Type: text/plain, Size: 242 bytes --]
Eddie, can you review the attached patch? It improves on your efer
reload patch by avoiding a reload even if EFER.SCE is different in the
guest and host, in some scenarios.
--
error compiling committee.c: too many arguments to function
[-- Attachment #2: 0001-KVM-VMX-Further-reduce-efer-reloads.patch --]
[-- Type: text/x-patch, Size: 3701 bytes --]
>From 6a59915f3720e3f33f1c9e81fd50e0f45699d035 Mon Sep 17 00:00:00 2001
From: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
Date: Wed, 29 Aug 2007 03:48:05 +0300
Subject: [PATCH] KVM: VMX: Further reduce efer reloads
KVM avoids reloading the efer msr when the difference between the guest
and host values consist of the long mode bits (which are switched by
hardware) and the NX bit (which is emulated by the KVM MMU).
This patch also allows KVM to ignore SCE (syscall enable) when the guest
is running in 32-bit mode. This is because the syscall instruction is
not available in 32-bit mode on Intel processors, so the SCE bit is
effectively meaningless.
Signed-off-by: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
---
drivers/kvm/vmx.c | 43 ++++++++++++++++++++-----------------------
1 files changed, 20 insertions(+), 23 deletions(-)
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
index 07ec556..c20c736 100644
--- a/drivers/kvm/vmx.c
+++ b/drivers/kvm/vmx.c
@@ -57,6 +57,7 @@ struct vcpu_vmx {
u16 fs_sel, gs_sel, ldt_sel;
int gs_ldt_reload_needed;
int fs_reload_needed;
+ int guest_efer_loaded;
}host_state;
};
@@ -74,8 +75,6 @@ static DEFINE_PER_CPU(struct vmcs *, current_vmcs);
static struct page *vmx_io_bitmap_a;
static struct page *vmx_io_bitmap_b;
-#define EFER_SAVE_RESTORE_BITS ((u64)EFER_SCE)
-
static struct vmcs_config {
int size;
int order;
@@ -138,18 +137,6 @@ static void save_msrs(struct kvm_msr_entry *e, int n)
rdmsrl(e[i].index, e[i].data);
}
-static inline u64 msr_efer_save_restore_bits(struct kvm_msr_entry msr)
-{
- return (u64)msr.data & EFER_SAVE_RESTORE_BITS;
-}
-
-static inline int msr_efer_need_save_restore(struct vcpu_vmx *vmx)
-{
- int efer_offset = vmx->msr_offset_efer;
- return msr_efer_save_restore_bits(vmx->host_msrs[efer_offset]) !=
- msr_efer_save_restore_bits(vmx->guest_msrs[efer_offset]);
-}
-
static inline int is_page_fault(u32 intr_info)
{
return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK |
@@ -344,13 +331,24 @@ static void reload_tss(void)
static void load_transition_efer(struct vcpu_vmx *vmx)
{
- u64 trans_efer;
int efer_offset = vmx->msr_offset_efer;
-
- trans_efer = vmx->host_msrs[efer_offset].data;
- trans_efer &= ~EFER_SAVE_RESTORE_BITS;
- trans_efer |= msr_efer_save_restore_bits(vmx->guest_msrs[efer_offset]);
- wrmsrl(MSR_EFER, trans_efer);
+ u64 host_efer = vmx->host_msrs[efer_offset].data;
+ u64 guest_efer = vmx->guest_msrs[efer_offset].data;
+ u64 ignore_bits;
+
+ /* NX is emulated; LMA and LME handled by hardware */
+ ignore_bits = EFER_NX | EFER_LMA | EFER_LME;
+ /* SCE is meaningless outside long mode */
+ if (!(guest_efer & EFER_LMA))
+ ignore_bits |= EFER_SCE;
+ vmx->host_state.guest_efer_loaded
+ = (guest_efer & ~ignore_bits) != (host_efer & ~ignore_bits);
+
+ if (!vmx->host_state.guest_efer_loaded)
+ return;
+ guest_efer &= ~ignore_bits;
+ guest_efer |= host_efer & ignore_bits;
+ wrmsrl(MSR_EFER, guest_efer);
vmx->vcpu.stat.efer_reload++;
}
@@ -399,8 +397,7 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
}
#endif
load_msrs(vmx->guest_msrs, vmx->save_nmsrs);
- if (msr_efer_need_save_restore(vmx))
- load_transition_efer(vmx);
+ load_transition_efer(vmx);
}
static void vmx_load_host_state(struct vcpu_vmx *vmx)
@@ -429,7 +426,7 @@ static void vmx_load_host_state(struct vcpu_vmx *vmx)
reload_tss();
save_msrs(vmx->guest_msrs, vmx->save_nmsrs);
load_msrs(vmx->host_msrs, vmx->save_nmsrs);
- if (msr_efer_need_save_restore(vmx))
+ if (vmx->host_state.guest_efer_loaded)
load_msrs(vmx->host_msrs + vmx->msr_offset_efer, 1);
}
--
1.5.3
[-- Attachment #3: Type: text/plain, Size: 228 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
[-- Attachment #4: Type: text/plain, Size: 186 bytes --]
_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] reduce msr efer reloads on heavyweight vmexit
@ 2007-09-18 15:13 Dong, Eddie
0 siblings, 0 replies; 2+ messages in thread
From: Dong, Eddie @ 2007-09-18 15:13 UTC (permalink / raw)
To: kvm-devel
[-- Attachment #1: Type: text/plain, Size: 554 bytes --]
Avi Kivity wrote:
> Eddie, can you review the attached patch? It improves on your efer
> reload patch by avoiding a reload even if EFER.SCE is different in the
> guest and host, in some scenarios.
>
Avi:
Good optimization! It should be safe since SYSCALL/SYSRET will check
following condition which will always leads to #UD in 32 bits guest no matter SCE is set or not.
IF (CS.L ≠ 1 ) or (IA32_EFER.LMA ≠ 1) or (IA32_EFER.SCE ≠ 1)
(* Not in 64-Bit Mode or SYSCALL/SYSRET not enabled in IA32_EFER *)
THEN #UD; FI;
thanks, eddie
[-- Attachment #2: Type: text/plain, Size: 228 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
[-- Attachment #3: Type: text/plain, Size: 186 bytes --]
_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-09-18 15:13 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-09-16 10:48 [PATCH] reduce msr efer reloads on heavyweight vmexit Avi Kivity
-- strict thread matches above, loose matches on Subject: below --
2007-09-18 15:13 Dong, Eddie
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox