r = set_vpa(vcpu, &vcpu->arch.dtl, addr, len);
                break;
        case KVM_REG_PPC_TB_OFFSET:
+       {
                /* round up to multiple of 2^24 */
-               vcpu->arch.vcore->tb_offset =
-                       ALIGN(set_reg_val(id, *val), 1UL << 24);
+               u64 tb_offset = ALIGN(set_reg_val(id, *val), 1UL << 24);
+
+               /*
+                * Now that we know the timebase offset, update the
+                * decrementer expiry with a guest timebase value. If
+                * the userspace does not set DEC_EXPIRY, this ensures
+                * a migrated vcpu at least starts with an expired
+                * decrementer, which is better than a large one that
+                * causes a hang.
+                */
+               if (!vcpu->arch.dec_expires && tb_offset)
+                       vcpu->arch.dec_expires = get_tb() + tb_offset;
+
+               vcpu->arch.vcore->tb_offset = tb_offset;
                break;
+       }
        case KVM_REG_PPC_LPCR:
                kvmppc_set_lpcr(vcpu, set_reg_val(id, *val), true);
                break;
 
 
        hrtimer_init(&vcpu->arch.dec_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
        vcpu->arch.dec_timer.function = kvmppc_decrementer_wakeup;
-       vcpu->arch.dec_expires = get_tb();
 
 #ifdef CONFIG_KVM_EXIT_TIMING
        mutex_init(&vcpu->arch.exit_timing_lock);