int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu,
irq_handler_t handler,
unsigned long irqflags, const char *devname, void *dev_id)
-@@ -1642,6 +1744,21 @@ static struct irq_chip xen_dynamic_chip
+@@ -1641,6 +1743,21 @@ static struct irq_chip xen_dynamic_chip
.irq_mask_ack = mask_ack_dynirq,
.irq_set_affinity = set_affinity_irq,
---
- drivers/xen/events/events_base.c | 41 ++++++++++++++++++++++++++++++++++-----
- 1 file changed, 36 insertions(+), 5 deletions(-)
+ drivers/xen/events/events_base.c | 40 ++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 35 insertions(+), 5 deletions(-)
--- a/drivers/xen/events/events_base.c
+++ b/drivers/xen/events/events_base.c
do {
vcpu_info->evtchn_upcall_pending = 0;
-@@ -1247,6 +1276,8 @@ static void __xen_evtchn_do_upcall(void)
- __this_cpu_write(xed_nesting_count, 0);
+@@ -1248,6 +1277,7 @@ static void __xen_evtchn_do_upcall(void)
} while (count != 1 || vcpu_info->evtchn_upcall_pending);
-+ read_unlock(&evtchn_rwlock);
-+
out:
++ read_unlock(&evtchn_rwlock);
put_cpu();
+ }
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Reviewed-by: Wei Liu <wl@xen.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
-
---
Documentation/admin-guide/kernel-parameters.txt | 8 +
drivers/xen/events/events_2l.c | 7
- drivers/xen/events/events_base.c | 188 +++++++++++++++++++++++-
+ drivers/xen/events/events_base.c | 189 +++++++++++++++++++++++-
drivers/xen/events/events_fifo.c | 30 +--
drivers/xen/events/events_internal.h | 14 +
- 5 files changed, 215 insertions(+), 32 deletions(-)
+ 5 files changed, 216 insertions(+), 32 deletions(-)
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
evtchn = info->evtchn;
- if (!VALID_EVTCHN(evtchn))
+ if (!VALID_EVTCHN(evtchn) || !list_empty(&info->eoi_list))
- return;
-
++ return;
++
+ cpu = info->eoi_cpu;
+ if (info->eoi_time && info->irq_epoch == per_cpu(irq_epoch, cpu)) {
+ lateeoi_list_add(info);
-+ return;
+ return;
+ }
-+
+
+ info->eoi_time = 0;
unmask_evtchn(evtchn);
}
BUG_ON(!irqs_disabled());
-@@ -1382,6 +1553,12 @@ static void __xen_evtchn_do_upcall(void)
+@@ -1382,6 +1553,13 @@ static void __xen_evtchn_do_upcall(void)
+ out:
read_unlock(&evtchn_rwlock);
- out:
+ /*
+ * Increment irq_epoch only now to defer EOIs only for
+ * xen_irq_lateeoi() invocations occurring from inside the loop
+ * above.
+ */
+ __this_cpu_inc(irq_epoch);
-
++
put_cpu();
}
-@@ -1829,9 +2006,6 @@ void xen_callback_vector(void)
+
+@@ -1828,9 +2006,6 @@ void xen_callback_vector(void)
void xen_callback_vector(void) {}
#endif
static bool fifo_events = true;
module_param(fifo_events, bool, 0);
-@@ -1839,6 +2013,8 @@ static int xen_evtchn_cpu_prepare(unsign
+@@ -1838,6 +2013,8 @@ static int xen_evtchn_cpu_prepare(unsign
{
int ret = 0;
if (evtchn_ops->percpu_init)
ret = evtchn_ops->percpu_init(cpu);
-@@ -1865,6 +2041,8 @@ void __init xen_init_IRQ(void)
+@@ -1864,6 +2041,8 @@ void __init xen_init_IRQ(void)
if (ret < 0)
xen_evtchn_2l_init();
#ifdef CONFIG_X86
#include <asm/desc.h>
-@@ -1834,6 +1835,26 @@ void xen_callback_vector(void) {}
+@@ -1833,6 +1834,26 @@ void xen_callback_vector(void) {}
static bool fifo_events = true;
module_param(fifo_events, bool, 0);
void __init xen_init_IRQ(void)
{
int ret = -EINVAL;
-@@ -1844,6 +1865,10 @@ void __init xen_init_IRQ(void)
+@@ -1843,6 +1864,10 @@ void __init xen_init_IRQ(void)
if (ret < 0)
xen_evtchn_2l_init();