]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Jun 2013 04:47:29 +0000 (21:47 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Jun 2013 04:47:29 +0000 (21:47 -0700)
added patches:
xen-events-handle-virq_timer-before-any-other-hardirq-in-event-loop.patch

queue-3.4/series
queue-3.4/xen-events-handle-virq_timer-before-any-other-hardirq-in-event-loop.patch [new file with mode: 0644]

index 5c4e0bb3f41bc474c9c8be8adeaa8e0f67ec728d..9375c4d1e21f947a36d868c980b5bc38efb64ed0 100644 (file)
@@ -34,3 +34,4 @@ usb-io_ti-fix-null-dereference-in-chase_port.patch
 ata_piix-add-pci-ids-for-intel-baytail.patch
 libata-make-ata_exec_internal_sg-honor-dmadir.patch
 m68k-mac-fix-unexpected-interrupt-with-config_early_printk.patch
+xen-events-handle-virq_timer-before-any-other-hardirq-in-event-loop.patch
diff --git a/queue-3.4/xen-events-handle-virq_timer-before-any-other-hardirq-in-event-loop.patch b/queue-3.4/xen-events-handle-virq_timer-before-any-other-hardirq-in-event-loop.patch
new file mode 100644 (file)
index 0000000..3c97b84
--- /dev/null
@@ -0,0 +1,82 @@
+From bee980d9e9642e96351fa3ca9077b853ecf62f57 Mon Sep 17 00:00:00 2001
+From: Keir Fraser <keir.fraser@citrix.com>
+Date: Thu, 28 Mar 2013 10:03:36 -0400
+Subject: xen/events: Handle VIRQ_TIMER before any other hardirq in event loop.
+
+From: Keir Fraser <keir.fraser@citrix.com>
+
+commit bee980d9e9642e96351fa3ca9077b853ecf62f57 upstream.
+
+This avoids any other hardirq handler seeing a very stale jiffies
+value immediately after wakeup from a long idle period. The one
+observable symptom of this was a USB keyboard, with software keyboard
+repeat, which would always repeat a key immediately that it was
+pressed. This is due to the key press waking the guest, the key
+handler immediately runs, sees an old jiffies value, and then that
+jiffies value significantly updated, before the key is unpressed.
+
+Reviewed-by: David Vrabel <david.vrabel@citrix.com>
+Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
+Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/xen/events.c |   19 +++++++++++++++----
+ 1 file changed, 15 insertions(+), 4 deletions(-)
+
+--- a/drivers/xen/events.c
++++ b/drivers/xen/events.c
+@@ -1258,7 +1258,7 @@ static void __xen_evtchn_do_upcall(void)
+ {
+       int start_word_idx, start_bit_idx;
+       int word_idx, bit_idx;
+-      int i;
++      int i, irq;
+       int cpu = get_cpu();
+       struct shared_info *s = HYPERVISOR_shared_info;
+       struct vcpu_info *vcpu_info = __this_cpu_read(xen_vcpu);
+@@ -1266,6 +1266,8 @@ static void __xen_evtchn_do_upcall(void)
+       do {
+               unsigned long pending_words;
++              unsigned long pending_bits;
++              struct irq_desc *desc;
+               vcpu_info->evtchn_upcall_pending = 0;
+@@ -1276,6 +1278,17 @@ static void __xen_evtchn_do_upcall(void)
+               /* Clear master flag /before/ clearing selector flag. */
+               wmb();
+ #endif
++              if ((irq = per_cpu(virq_to_irq, cpu)[VIRQ_TIMER]) != -1) {
++                      int evtchn = evtchn_from_irq(irq);
++                      word_idx = evtchn / BITS_PER_LONG;
++                      pending_bits = evtchn % BITS_PER_LONG;
++                      if (active_evtchns(cpu, s, word_idx) & (1ULL << pending_bits)) {
++                              desc = irq_to_desc(irq);
++                              if (desc)
++                                      generic_handle_irq_desc(irq, desc);
++                      }
++              }
++
+               pending_words = xchg(&vcpu_info->evtchn_pending_sel, 0);
+               start_word_idx = __this_cpu_read(current_word_idx);
+@@ -1284,7 +1297,6 @@ static void __xen_evtchn_do_upcall(void)
+               word_idx = start_word_idx;
+               for (i = 0; pending_words != 0; i++) {
+-                      unsigned long pending_bits;
+                       unsigned long words;
+                       words = MASK_LSBS(pending_words, word_idx);
+@@ -1313,8 +1325,7 @@ static void __xen_evtchn_do_upcall(void)
+                       do {
+                               unsigned long bits;
+-                              int port, irq;
+-                              struct irq_desc *desc;
++                              int port;
+                               bits = MASK_LSBS(pending_bits, bit_idx);