diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c index 5f9b8104dbcf..57a29c94fefc 100644 --- a/drivers/xen/events/events_base.c +++ b/drivers/xen/events/events_base.c @@ -498,12 +498,6 @@ static void eoi_pirq(struct irq_data *data) } } -static void mask_ack_pirq(struct irq_data *data) -{ - disable_dynirq(data); - eoi_pirq(data); -} - static unsigned int __startup_pirq(unsigned int irq) { struct evtchn_bind_pirq bind_pirq; @@ -684,13 +678,9 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi, } pirq_query_unmask(irq); - /* We try to use the handler with the appropriate semantic for the - * type of interrupt: if the interrupt is an edge triggered - * interrupt we use handle_edge_irq. - * - * On the other hand if the interrupt is level triggered we use - * handle_fasteoi_irq like the native code does for this kind of - * interrupts. + /* We use handle_fasteoi_irq for PIRQs because we want to keep + * the evtchn masked while handling and clearing the event. + * Unmasking the evtchn should only happen after clearing it. * * Depending on the Xen version, pirq_needs_eoi might return true * not only for level triggered interrupts but for edge triggered @@ -699,12 +689,8 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi, * hasn't received an eoi yet. Therefore using the fasteoi handler * is the right choice either way. */ - if (shareable) - irq_set_chip_and_handler_name(irq, &xen_pirq_chip, - handle_fasteoi_irq, name); - else - irq_set_chip_and_handler_name(irq, &xen_pirq_chip, - handle_edge_irq, name); + irq_set_chip_and_handler_name(irq, &xen_pirq_chip, + handle_fasteoi_irq, name); out: mutex_unlock(&irq_mapping_update_lock); @@ -739,7 +725,7 @@ int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, goto out; for (i = 0; i < nvec; i++) { - irq_set_chip_and_handler_name(irq + i, &xen_pirq_chip, handle_edge_irq, name); + irq_set_chip_and_handler_name(irq + i, &xen_pirq_chip, handle_fasteoi_irq, name); ret = xen_irq_info_pirq_setup(irq + i, 0, pirq + i, 0, domid, i == 0 ? 0 : PIRQ_MSI_GROUP); @@ -1596,9 +1582,7 @@ static struct irq_chip xen_pirq_chip __read_mostly = { .irq_mask = disable_dynirq, .irq_unmask = enable_dynirq, - .irq_ack = eoi_pirq, .irq_eoi = eoi_pirq, - .irq_mask_ack = mask_ack_pirq, .irq_set_affinity = set_affinity_irq, -- 2.17.1