static void kvmppc_update_vpas(struct kvm_vcpu *vcpu)
 {
+       if (!(vcpu->arch.vpa.update_pending ||
+             vcpu->arch.slb_shadow.update_pending ||
+             vcpu->arch.dtl.update_pending))
+               return;
+
        spin_lock(&vcpu->arch.vpa_update_lock);
        if (vcpu->arch.vpa.update_pending) {
                kvmppc_update_vpa(vcpu, &vcpu->arch.vpa);
        vc->n_woken = 0;
        vc->nap_count = 0;
        vc->entry_exit_count = 0;
-       vc->vcore_state = VCORE_RUNNING;
+       vc->vcore_state = VCORE_STARTING;
        vc->in_guest = 0;
        vc->napping_threads = 0;
 
                kvmppc_create_dtl_entry(vcpu, vc);
        }
 
+       vc->vcore_state = VCORE_RUNNING;
        preempt_disable();
        spin_unlock(&vc->lock);
 
        srcu_idx = srcu_read_lock(&vcpu0->kvm->srcu);
 
        __kvmppc_vcore_entry(NULL, vcpu0);
-       for (i = 0; i < threads_per_core; ++i)
-               kvmppc_release_hwthread(vc->pcpu + i);
 
        spin_lock(&vc->lock);
        /* disable sending of IPIs on virtual external irqs */
        /* wait for secondary threads to finish writing their state to memory */
        if (vc->nap_count < vc->n_woken)
                kvmppc_wait_for_nap(vc);
+       for (i = 0; i < threads_per_core; ++i)
+               kvmppc_release_hwthread(vc->pcpu + i);
        /* prevent other vcpu threads from doing kvmppc_start_thread() now */
        vc->vcore_state = VCORE_EXITING;
        spin_unlock(&vc->lock);
        kvm_run->exit_reason = 0;
        vcpu->arch.ret = RESUME_GUEST;
        vcpu->arch.trap = 0;
+       kvmppc_update_vpas(vcpu);
 
        /*
         * Synchronize with other threads in this virtual core
                if (vc->vcore_state == VCORE_RUNNING &&
                    VCORE_EXIT_COUNT(vc) == 0) {
                        vcpu->arch.ptid = vc->n_runnable - 1;
+                       kvmppc_create_dtl_entry(vcpu, vc);
                        kvmppc_start_thread(vcpu);
                }