diff options
| -rw-r--r-- | drivers/xen/events.c | 27 | ||||
| -rw-r--r-- | include/xen/events.h | 1 |
2 files changed, 28 insertions, 0 deletions
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 4f0f22b020ea..f64e9798129c 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -557,6 +557,33 @@ out: | |||
| 557 | put_cpu(); | 557 | put_cpu(); |
| 558 | } | 558 | } |
| 559 | 559 | ||
| 560 | /* Rebind a new event channel to an existing irq. */ | ||
| 561 | void rebind_evtchn_irq(int evtchn, int irq) | ||
| 562 | { | ||
| 563 | /* Make sure the irq is masked, since the new event channel | ||
| 564 | will also be masked. */ | ||
| 565 | disable_irq(irq); | ||
| 566 | |||
| 567 | spin_lock(&irq_mapping_update_lock); | ||
| 568 | |||
| 569 | /* After resume the irq<->evtchn mappings are all cleared out */ | ||
| 570 | BUG_ON(evtchn_to_irq[evtchn] != -1); | ||
| 571 | /* Expect irq to have been bound before, | ||
| 572 | so the bindcount should be non-0 */ | ||
| 573 | BUG_ON(irq_bindcount[irq] == 0); | ||
| 574 | |||
| 575 | evtchn_to_irq[evtchn] = irq; | ||
| 576 | irq_info[irq] = mk_irq_info(IRQT_EVTCHN, 0, evtchn); | ||
| 577 | |||
| 578 | spin_unlock(&irq_mapping_update_lock); | ||
| 579 | |||
| 580 | /* new event channels are always bound to cpu 0 */ | ||
| 581 | irq_set_affinity(irq, cpumask_of_cpu(0)); | ||
| 582 | |||
| 583 | /* Unmask the event channel. */ | ||
| 584 | enable_irq(irq); | ||
| 585 | } | ||
| 586 | |||
| 560 | /* Rebind an evtchn so that it gets delivered to a specific cpu */ | 587 | /* Rebind an evtchn so that it gets delivered to a specific cpu */ |
| 561 | static void rebind_irq_to_cpu(unsigned irq, unsigned tcpu) | 588 | static void rebind_irq_to_cpu(unsigned irq, unsigned tcpu) |
| 562 | { | 589 | { |
diff --git a/include/xen/events.h b/include/xen/events.h index acd8e062c85f..a82ec0c45c38 100644 --- a/include/xen/events.h +++ b/include/xen/events.h | |||
| @@ -32,6 +32,7 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id); | |||
| 32 | 32 | ||
| 33 | void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector); | 33 | void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector); |
| 34 | int resend_irq_on_evtchn(unsigned int irq); | 34 | int resend_irq_on_evtchn(unsigned int irq); |
| 35 | void rebind_evtchn_irq(int evtchn, int irq); | ||
| 35 | 36 | ||
| 36 | static inline void notify_remote_via_evtchn(int port) | 37 | static inline void notify_remote_via_evtchn(int port) |
| 37 | { | 38 | { |
