|
@@ -484,9 +484,19 @@ static void eoi_pirq(struct irq_data *data)
|
|
struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) };
|
|
struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) };
|
|
int rc = 0;
|
|
int rc = 0;
|
|
|
|
|
|
- irq_move_irq(data);
|
|
|
|
|
|
+ if (!VALID_EVTCHN(evtchn))
|
|
|
|
+ return;
|
|
|
|
|
|
- if (VALID_EVTCHN(evtchn))
|
|
|
|
|
|
+ if (unlikely(irqd_is_setaffinity_pending(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)) {
|
|
if (pirq_needs_eoi(data->irq)) {
|
|
@@ -1357,9 +1367,19 @@ static void ack_dynirq(struct irq_data *data)
|
|
{
|
|
{
|
|
int evtchn = evtchn_from_irq(data->irq);
|
|
int evtchn = evtchn_from_irq(data->irq);
|
|
|
|
|
|
- irq_move_irq(data);
|
|
|
|
|
|
+ if (!VALID_EVTCHN(evtchn))
|
|
|
|
+ return;
|
|
|
|
|
|
- if (VALID_EVTCHN(evtchn))
|
|
|
|
|
|
+ if (unlikely(irqd_is_setaffinity_pending(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);
|
|
}
|
|
}
|
|
|
|
|