KVM: PPC: Book3S PR: Take SRCU read lock around RTAS kvm_read_guest() call
authorPaul Mackerras <paulus@samba.org>
Sat, 19 Jul 2014 07:59:35 +0000 (17:59 +1000)
committerAlexander Graf <agraf@suse.de>
Mon, 28 Jul 2014 13:23:16 +0000 (15:23 +0200)
This does for PR KVM what c9438092cae4 ("KVM: PPC: Book3S HV: Take SRCU
read lock around kvm_read_guest() call") did for HV KVM, that is,
eliminate a "suspicious rcu_dereference_check() usage!" warning by
taking the SRCU lock around the call to kvmppc_rtas_hcall().

It also fixes a return of RESUME_HOST to return EMULATE_FAIL instead,
since kvmppc_h_pr() is supposed to return EMULATE_* values.

Signed-off-by: Paul Mackerras <paulus@samba.org>
Cc: stable@vger.kernel.org
Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/kvm/book3s_pr_papr.c

index 6d0143fbeb63879cb31118a2535226a7a5a406d5..ce3c893d509b17b3611e6fe5050a50424ba5d83d 100644 (file)
@@ -267,6 +267,8 @@ static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
 
 int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
 {
+       int rc, idx;
+
        if (cmd <= MAX_HCALL_OPCODE &&
            !test_bit(cmd/4, vcpu->kvm->arch.enabled_hcalls))
                return EMULATE_FAIL;
@@ -299,8 +301,11 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
                break;
        case H_RTAS:
                if (list_empty(&vcpu->kvm->arch.rtas_tokens))
-                       return RESUME_HOST;
-               if (kvmppc_rtas_hcall(vcpu))
+                       break;
+               idx = srcu_read_lock(&vcpu->kvm->srcu);
+               rc = kvmppc_rtas_hcall(vcpu);
+               srcu_read_unlock(&vcpu->kvm->srcu, idx);
+               if (rc)
                        break;
                kvmppc_set_gpr(vcpu, 3, 0);
                return EMULATE_DONE;