diff options
| -rw-r--r-- | drivers/xen/events.c | 21 | 
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 72f91bff29c7..13365ba35218 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c @@ -112,6 +112,7 @@ static inline unsigned long *cpu_evtchn_mask(int cpu)  #define VALID_EVTCHN(chn)	((chn) != 0)  static struct irq_chip xen_dynamic_chip; +static struct irq_chip xen_percpu_chip;  /* Constructor for packed IRQ information. */  static struct irq_info mk_unbound_info(void) @@ -377,7 +378,7 @@ int bind_evtchn_to_irq(unsigned int evtchn)  		irq = find_unbound_irq();  		set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, -					      handle_level_irq, "event"); +					      handle_edge_irq, "event");  		evtchn_to_irq[evtchn] = irq;  		irq_info[irq] = mk_evtchn_info(evtchn); @@ -403,8 +404,8 @@ static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu)  		if (irq < 0)  			goto out; -		set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, -					      handle_level_irq, "ipi"); +		set_irq_chip_and_handler_name(irq, &xen_percpu_chip, +					      handle_percpu_irq, "ipi");  		bind_ipi.vcpu = cpu;  		if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, @@ -444,8 +445,8 @@ static int bind_virq_to_irq(unsigned int virq, unsigned int cpu)  		irq = find_unbound_irq(); -		set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, -					      handle_level_irq, "virq"); +		set_irq_chip_and_handler_name(irq, &xen_percpu_chip, +					      handle_percpu_irq, "virq");  		evtchn_to_irq[evtchn] = irq;  		irq_info[irq] = mk_virq_info(evtchn, virq); @@ -964,6 +965,16 @@ static struct irq_chip xen_dynamic_chip __read_mostly = {  	.retrigger	= retrigger_dynirq,  }; +static struct irq_chip xen_percpu_chip __read_mostly = { +	.name		= "xen-percpu", + +	.disable	= disable_dynirq, +	.mask		= disable_dynirq, +	.unmask		= enable_dynirq, + +	.ack		= ack_dynirq, +}; +  int xen_set_callback_via(uint64_t via)  {  	struct xen_hvm_param a;  | 
