Merge branch 'upstream/core' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen

* 'upstream/core' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen:
xen: handle events as edge-triggered
xen: use percpu interrupts for IPIs and VIRQs

+16 -5
+16 -5
drivers/xen/events.c
··· 112 112 #define VALID_EVTCHN(chn) ((chn) != 0) 113 113 114 114 static struct irq_chip xen_dynamic_chip; 115 + static struct irq_chip xen_percpu_chip; 115 116 116 117 /* Constructor for packed IRQ information. */ 117 118 static struct irq_info mk_unbound_info(void) ··· 378 377 irq = find_unbound_irq(); 379 378 380 379 set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, 381 - handle_level_irq, "event"); 380 + handle_edge_irq, "event"); 382 381 383 382 evtchn_to_irq[evtchn] = irq; 384 383 irq_info[irq] = mk_evtchn_info(evtchn); ··· 404 403 if (irq < 0) 405 404 goto out; 406 405 407 - set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, 408 - handle_level_irq, "ipi"); 406 + set_irq_chip_and_handler_name(irq, &xen_percpu_chip, 407 + handle_percpu_irq, "ipi"); 409 408 410 409 bind_ipi.vcpu = cpu; 411 410 if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, ··· 445 444 446 445 irq = find_unbound_irq(); 447 446 448 - set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, 449 - handle_level_irq, "virq"); 447 + set_irq_chip_and_handler_name(irq, &xen_percpu_chip, 448 + handle_percpu_irq, "virq"); 450 449 451 450 evtchn_to_irq[evtchn] = irq; 452 451 irq_info[irq] = mk_virq_info(evtchn, virq); ··· 963 962 .ack = ack_dynirq, 964 963 .set_affinity = set_affinity_irq, 965 964 .retrigger = retrigger_dynirq, 965 + }; 966 + 967 + static struct irq_chip xen_percpu_chip __read_mostly = { 968 + .name = "xen-percpu", 969 + 970 + .disable = disable_dynirq, 971 + .mask = disable_dynirq, 972 + .unmask = enable_dynirq, 973 + 974 + .ack = ack_dynirq, 966 975 }; 967 976 968 977 int xen_set_callback_via(uint64_t via)