* state update in HW (ie bus transactions) so we can handle them
         * separately here as well.
         */
-       if (resend)
+       if (resend) {
                icp->rm_action |= XICS_RM_CHECK_RESEND;
+               icp->rm_resend_icp = icp;
+       }
 }
 
 
         * nothing needs to be done as there can be no XISR to
         * reject.
         *
+        * ICP state: Check_IPI
+        *
         * If the CPPR is less favored, then we might be replacing
-        * an interrupt, and thus need to possibly reject it as in
+        * an interrupt, and thus need to possibly reject it.
         *
-        * ICP state: Check_IPI
+        * ICP State: IPI
+        *
+        * Besides rejecting any pending interrupts, we also
+        * update XISR and pending_pri to mark IPI as pending.
+        *
+        * PAPR does not describe this state, but if the MFRR is being
+        * made less favored than its earlier value, there might be
+        * a previously-rejected interrupt needing to be resent.
+        * Ideally, we would want to resend only if
+        *      prio(pending_interrupt) < mfrr &&
+        *      prio(pending_interrupt) < cppr
+        * where pending interrupt is the one that was rejected. But
+        * we don't have that state, so we simply trigger a resend
+        * whenever the MFRR is made less favored.
         */
        do {
                old_state = new_state = ACCESS_ONCE(icp->state);
                resend = false;
                if (mfrr < new_state.cppr) {
                        /* Reject a pending interrupt if not an IPI */
-                       if (mfrr <= new_state.pending_pri)
+                       if (mfrr <= new_state.pending_pri) {
                                reject = new_state.xisr;
-                       new_state.pending_pri = mfrr;
-                       new_state.xisr = XICS_IPI;
+                               new_state.pending_pri = mfrr;
+                               new_state.xisr = XICS_IPI;
+                       }
                }
 
-               if (mfrr > old_state.mfrr && mfrr > new_state.cppr) {
+               if (mfrr > old_state.mfrr) {
                        resend = new_state.need_resend;
                        new_state.need_resend = 0;
                }
        }
 
        /* Pass resends to virtual mode */
-       if (resend)
+       if (resend) {
                this_icp->rm_action |= XICS_RM_CHECK_RESEND;
+               this_icp->rm_resend_icp = icp;
+       }
 
        return check_too_hard(xics, this_icp);
 }
 
         * there might be a previously-rejected interrupt needing
         * to be resent.
         *
+        * ICP state: Check_IPI
+        *
         * If the CPPR is less favored, then we might be replacing
-        * an interrupt, and thus need to possibly reject it as in
+        * an interrupt, and thus need to possibly reject it.
         *
-        * ICP state: Check_IPI
+        * ICP State: IPI
+        *
+        * Besides rejecting any pending interrupts, we also
+        * update XISR and pending_pri to mark IPI as pending.
+        *
+        * PAPR does not describe this state, but if the MFRR is being
+        * made less favored than its earlier value, there might be
+        * a previously-rejected interrupt needing to be resent.
+        * Ideally, we would want to resend only if
+        *      prio(pending_interrupt) < mfrr &&
+        *      prio(pending_interrupt) < cppr
+        * where pending interrupt is the one that was rejected. But
+        * we don't have that state, so we simply trigger a resend
+        * whenever the MFRR is made less favored.
         */
        do {
                old_state = new_state = ACCESS_ONCE(icp->state);
                resend = false;
                if (mfrr < new_state.cppr) {
                        /* Reject a pending interrupt if not an IPI */
-                       if (mfrr <= new_state.pending_pri)
+                       if (mfrr <= new_state.pending_pri) {
                                reject = new_state.xisr;
-                       new_state.pending_pri = mfrr;
-                       new_state.xisr = XICS_IPI;
+                               new_state.pending_pri = mfrr;
+                               new_state.xisr = XICS_IPI;
+                       }
                }
 
-               if (mfrr > old_state.mfrr && mfrr > new_state.cppr) {
+               if (mfrr > old_state.mfrr) {
                        resend = new_state.need_resend;
                        new_state.need_resend = 0;
                }
        if (icp->rm_action & XICS_RM_KICK_VCPU)
                kvmppc_fast_vcpu_kick(icp->rm_kick_target);
        if (icp->rm_action & XICS_RM_CHECK_RESEND)
-               icp_check_resend(xics, icp);
+               icp_check_resend(xics, icp->rm_resend_icp);
        if (icp->rm_action & XICS_RM_REJECT)
                icp_deliver_irq(xics, icp, icp->rm_reject);
        if (icp->rm_action & XICS_RM_NOTIFY_EOI)
 
 #define XICS_RM_NOTIFY_EOI     0x8
        u32 rm_action;
        struct kvm_vcpu *rm_kick_target;
+       struct kvmppc_icp *rm_resend_icp;
        u32  rm_reject;
        u32  rm_eoied_irq;