KVM: PPC: Fix sid map search after flush
authorAlexander Graf <agraf@suse.de>
Mon, 2 Aug 2010 11:38:18 +0000 (13:38 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 24 Oct 2010 08:52:03 +0000 (10:52 +0200)
After a flush the sid map contained lots of entries with 0 for their gvsid and
hvsid value. Unfortunately, 0 can be a real value the guest searches for when
looking up a vsid so it would incorrectly find the host's 0 hvsid mapping which
doesn't belong to our sid space.

So let's also check for the valid bit that indicated that the sid we're
looking at actually contains useful data.

Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/kvm/book3s_64_mmu_host.c

index aa516ad81de7547efef5aee872201c6f38a653af..ebb1b5ddabfbca8600612cb734c6367b46828af9 100644 (file)
@@ -65,14 +65,14 @@ static struct kvmppc_sid_map *find_sid_vsid(struct kvm_vcpu *vcpu, u64 gvsid)
 
        sid_map_mask = kvmppc_sid_hash(vcpu, gvsid);
        map = &to_book3s(vcpu)->sid_map[sid_map_mask];
-       if (map->guest_vsid == gvsid) {
+       if (map->valid && (map->guest_vsid == gvsid)) {
                dprintk_slb("SLB: Searching: 0x%llx -> 0x%llx\n",
                            gvsid, map->host_vsid);
                return map;
        }
 
        map = &to_book3s(vcpu)->sid_map[SID_MAP_MASK - sid_map_mask];
-       if (map->guest_vsid == gvsid) {
+       if (map->valid && (map->guest_vsid == gvsid)) {
                dprintk_slb("SLB: Searching 0x%llx -> 0x%llx\n",
                            gvsid, map->host_vsid);
                return map;