KVM: PPC: Improve split mode
When in split mode, instruction relocation and data relocation are not equal. So far we implemented this mode by reserving a special pseudo-VSID for the two cases and flushing all PTEs when going into split mode, which is slow. Unfortunately 32bit Linux and Mac OS X use split mode extensively. So to not slow down things too much, I came up with a different idea: Mark the split mode with a bit in the VSID and then treat it like any other segment. This means we can just flush the shadow segment cache, but keep the PTEs intact. I verified that this works with ppc32 Linux and Mac OS X 10.4 guests and does speed them up. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:

committed by
Avi Kivity

parent
7fdaec997c
commit
f7bc74e1c3
@@ -330,30 +330,35 @@ static void kvmppc_mmu_book3s_32_tlbie(struct kvm_vcpu *vcpu, ulong ea, bool lar
|
||||
static int kvmppc_mmu_book3s_32_esid_to_vsid(struct kvm_vcpu *vcpu, ulong esid,
|
||||
u64 *vsid)
|
||||
{
|
||||
ulong ea = esid << SID_SHIFT;
|
||||
struct kvmppc_sr *sr;
|
||||
u64 gvsid = esid;
|
||||
|
||||
if (vcpu->arch.msr & (MSR_DR|MSR_IR)) {
|
||||
sr = find_sr(to_book3s(vcpu), ea);
|
||||
if (sr->valid)
|
||||
gvsid = sr->vsid;
|
||||
}
|
||||
|
||||
/* In case we only have one of MSR_IR or MSR_DR set, let's put
|
||||
that in the real-mode context (and hope RM doesn't access
|
||||
high memory) */
|
||||
switch (vcpu->arch.msr & (MSR_DR|MSR_IR)) {
|
||||
case 0:
|
||||
*vsid = (VSID_REAL >> 16) | esid;
|
||||
*vsid = VSID_REAL | esid;
|
||||
break;
|
||||
case MSR_IR:
|
||||
*vsid = (VSID_REAL_IR >> 16) | esid;
|
||||
*vsid = VSID_REAL_IR | gvsid;
|
||||
break;
|
||||
case MSR_DR:
|
||||
*vsid = (VSID_REAL_DR >> 16) | esid;
|
||||
*vsid = VSID_REAL_DR | gvsid;
|
||||
break;
|
||||
case MSR_DR|MSR_IR:
|
||||
{
|
||||
ulong ea = esid << SID_SHIFT;
|
||||
struct kvmppc_sr *sr = find_sr(to_book3s(vcpu), ea);
|
||||
|
||||
if (!sr->valid)
|
||||
return -1;
|
||||
|
||||
*vsid = sr->vsid;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
Reference in New Issue
Block a user