vcpu->arch.dtl.dirty = true;
 }
 
+/* See if there is a doorbell interrupt pending for a vcpu */
+static bool kvmppc_doorbell_pending(struct kvm_vcpu *vcpu)
+{
+       int thr;
+       struct kvmppc_vcore *vc;
+
+       vc = vcpu->arch.vcore;
+       thr = vcpu->vcpu_id - vc->first_vcpuid;
+       return !!(vc->dpdes & (1 << thr));
+}
+
 static bool kvmppc_power8_compatible(struct kvm_vcpu *vcpu)
 {
        if (vcpu->arch.vcore->arch_compat >= PVR_ARCH_207)
                vc->halt_poll_ns /= halt_poll_ns_shrink;
 }
 
+static bool kvmppc_vcpu_woken(struct kvm_vcpu *vcpu)
+{
+       if (vcpu->arch.pending_exceptions || vcpu->arch.prodded ||
+           kvmppc_doorbell_pending(vcpu))
+               return true;
+
+       return false;
+}
+
 /*
  * Check to see if any of the runnable vcpus on the vcore have pending
  * exceptions or are no longer ceded
        int i;
 
        for_each_runnable_thread(i, vcpu, vc) {
-               if (vcpu->arch.pending_exceptions || !vcpu->arch.ceded ||
-                   vcpu->arch.prodded)
+               if (!vcpu->arch.ceded || kvmppc_vcpu_woken(vcpu))
                        return 1;
        }
 
                        break;
                n_ceded = 0;
                for_each_runnable_thread(i, v, vc) {
-                       if (!v->arch.pending_exceptions && !v->arch.prodded)
+                       if (!kvmppc_vcpu_woken(v))
                                n_ceded += v->arch.ceded;
                        else
                                v->arch.ceded = 0;