info->refcnt = -1;
 
        set_info_for_irq(irq, info);
+       /*
+        * Interrupt affinity setting can be immediate. No point
+        * in delaying it until an interrupt is handled.
+        */
+       irq_set_status_flags(irq, IRQ_MOVE_PCNTXT);
 
        INIT_LIST_HEAD(&info->eoi_list);
        list_add_tail(&info->list, &xen_irq_list_head);
        if (!VALID_EVTCHN(evtchn))
                return;
 
-       if (unlikely(irqd_is_setaffinity_pending(data)) &&
-           likely(!irqd_irq_disabled(data))) {
-               int masked = test_and_set_mask(evtchn);
-
-               clear_evtchn(evtchn);
-
-               irq_move_masked_irq(data);
-
-               if (!masked)
-                       unmask_evtchn(evtchn);
-       } else
-               clear_evtchn(evtchn);
+       clear_evtchn(evtchn);
 
        if (pirq_needs_eoi(data->irq)) {
                rc = HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi);
        mutex_unlock(&irq_mapping_update_lock);
 
         bind_evtchn_to_cpu(evtchn, info->cpu);
-       /* This will be deferred until interrupt is processed */
        irq_set_affinity(irq, cpumask_of(info->cpu));
 
        /* Unmask the event channel. */
                            bool force)
 {
        unsigned tcpu = cpumask_first_and(dest, cpu_online_mask);
-       int ret = xen_rebind_evtchn_to_cpu(evtchn_from_irq(data->irq), tcpu);
+       int ret;
 
+       ret = xen_rebind_evtchn_to_cpu(evtchn_from_irq(data->irq), tcpu);
        if (!ret)
                irq_data_update_effective_affinity(data, cpumask_of(tcpu));
 
        if (!VALID_EVTCHN(evtchn))
                return;
 
-       if (unlikely(irqd_is_setaffinity_pending(data)) &&
-           likely(!irqd_irq_disabled(data))) {
-               int masked = test_and_set_mask(evtchn);
-
-               clear_evtchn(evtchn);
-
-               irq_move_masked_irq(data);
-
-               if (!masked)
-                       unmask_evtchn(evtchn);
-       } else
-               clear_evtchn(evtchn);
+       clear_evtchn(evtchn);
 }
 
 static void mask_ack_dynirq(struct irq_data *data)