diff options
author | Hollis Blanchard <hollisb@us.ibm.com> | 2008-11-10 15:57:35 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2008-12-31 09:52:26 -0500 |
commit | df9b856c454e331bc394c80903fcdea19cae2a33 (patch) | |
tree | aa266ad64c3bed1f895d2f8132b62c25bae882e4 /arch | |
parent | bf5d4025c9fe8a64c5905c00bf4292319d634903 (diff) |
KVM: ppc: use prefetchable mappings for guest memory
Bare metal Linux on 440 can "overmap" RAM in the kernel linear map, so that it
can use large (256MB) mappings even if memory isn't a multiple of 256MB. To
prevent the hardware prefetcher from loading from an invalid physical address
through that mapping, it's marked Guarded.
However, KVM must ensure that all guest mappings are backed by real physical
RAM (since a deliberate access through a guarded mapping could still cause a
machine check). Accordingly, we don't need to make our mappings guarded, so
let's allow prefetching as the designers intended.
Curiously this patch didn't affect performance at all on the quick test I
tried, but it's clearly the right thing to do anyways and may improve other
workloads.
Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kvm/44x_tlb.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c index 260fa8bc4608..6fadbd696021 100644 --- a/arch/powerpc/kvm/44x_tlb.c +++ b/arch/powerpc/kvm/44x_tlb.c | |||
@@ -28,6 +28,8 @@ | |||
28 | 28 | ||
29 | #include "44x_tlb.h" | 29 | #include "44x_tlb.h" |
30 | 30 | ||
31 | #define PPC44x_TLB_UATTR_MASK \ | ||
32 | (PPC44x_TLB_U0|PPC44x_TLB_U1|PPC44x_TLB_U2|PPC44x_TLB_U3) | ||
31 | #define PPC44x_TLB_USER_PERM_MASK (PPC44x_TLB_UX|PPC44x_TLB_UR|PPC44x_TLB_UW) | 33 | #define PPC44x_TLB_USER_PERM_MASK (PPC44x_TLB_UX|PPC44x_TLB_UR|PPC44x_TLB_UW) |
32 | #define PPC44x_TLB_SUPER_PERM_MASK (PPC44x_TLB_SX|PPC44x_TLB_SR|PPC44x_TLB_SW) | 34 | #define PPC44x_TLB_SUPER_PERM_MASK (PPC44x_TLB_SX|PPC44x_TLB_SR|PPC44x_TLB_SW) |
33 | 35 | ||
@@ -63,8 +65,8 @@ void kvmppc_dump_tlbs(struct kvm_vcpu *vcpu) | |||
63 | 65 | ||
64 | static u32 kvmppc_44x_tlb_shadow_attrib(u32 attrib, int usermode) | 66 | static u32 kvmppc_44x_tlb_shadow_attrib(u32 attrib, int usermode) |
65 | { | 67 | { |
66 | /* Mask off reserved bits. */ | 68 | /* We only care about the guest's permission and user bits. */ |
67 | attrib &= PPC44x_TLB_PERM_MASK|PPC44x_TLB_ATTR_MASK; | 69 | attrib &= PPC44x_TLB_PERM_MASK|PPC44x_TLB_UATTR_MASK; |
68 | 70 | ||
69 | if (!usermode) { | 71 | if (!usermode) { |
70 | /* Guest is in supervisor mode, so we need to translate guest | 72 | /* Guest is in supervisor mode, so we need to translate guest |
@@ -76,6 +78,9 @@ static u32 kvmppc_44x_tlb_shadow_attrib(u32 attrib, int usermode) | |||
76 | /* Make sure host can always access this memory. */ | 78 | /* Make sure host can always access this memory. */ |
77 | attrib |= PPC44x_TLB_SX|PPC44x_TLB_SR|PPC44x_TLB_SW; | 79 | attrib |= PPC44x_TLB_SX|PPC44x_TLB_SR|PPC44x_TLB_SW; |
78 | 80 | ||
81 | /* WIMGE = 0b00100 */ | ||
82 | attrib |= PPC44x_TLB_M; | ||
83 | |||
79 | return attrib; | 84 | return attrib; |
80 | } | 85 | } |
81 | 86 | ||