Reviewed-by: Wei Liu <wl@xen.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
---
- 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;
-@@ -1248,6 +1277,8 @@ static void __xen_evtchn_do_upcall(void)
- __this_cpu_write(xed_nesting_count, 0);
+@@ -1249,6 +1278,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();
+ }
---
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
-@@ -5457,6 +5457,14 @@
- improve timer resolution at the expense of processing
- more timer interrupts.
+@@ -5462,6 +5462,14 @@
+ as generic guest with no PV drivers. Currently support
+ XEN HVM, KVM, HYPER_V and VMWARE guest.
+ xen.event_eoi_delay= [XEN]
+ How long to delay EOI handling in case of event
+ After which time (jiffies) the event handling loop
+ should start to delay EOI handling. Default is 2.
+
- nopv= [X86,XEN,KVM,HYPER_V,VMWARE]
- Disables the PV optimizations forcing the guest to run
- as generic guest with no PV drivers. Currently support
+ xirc2ps_cs= [NET,PCMCIA]
+ Format:
+ <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
--- a/drivers/xen/events/events_2l.c
+++ b/drivers/xen/events/events_2l.c
@@ -161,7 +161,7 @@ static inline xen_ulong_t active_evtchns
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());
-@@ -1383,6 +1554,12 @@ static void __xen_evtchn_do_upcall(void)
+@@ -1383,6 +1554,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();
}
-@@ -1830,9 +2007,6 @@ void xen_callback_vector(void)
+
+@@ -1829,9 +2007,6 @@ void xen_callback_vector(void)
void xen_callback_vector(void) {}
#endif
static bool fifo_events = true;
module_param(fifo_events, bool, 0);
-@@ -1840,6 +2014,8 @@ static int xen_evtchn_cpu_prepare(unsign
+@@ -1839,6 +2014,8 @@ static int xen_evtchn_cpu_prepare(unsign
{
int ret = 0;
if (evtchn_ops->percpu_init)
ret = evtchn_ops->percpu_init(cpu);
-@@ -1866,6 +2042,8 @@ void __init xen_init_IRQ(void)
+@@ -1865,6 +2042,8 @@ void __init xen_init_IRQ(void)
if (ret < 0)
xen_evtchn_2l_init();