]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.0-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 Jan 2013 21:08:47 +0000 (13:08 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 Jan 2013 21:08:47 +0000 (13:08 -0800)
added patches:
cgroup-remove-incorrect-dget-dput-pair-in-cgroup_create_dir.patch
genirq-always-force-thread-affinity.patch
input-walkera0701-fix-crash-on-startup.patch
xhci-add-lynx-point-lp-to-list-of-intel-switchable-hosts.patch

queue-3.0/cgroup-remove-incorrect-dget-dput-pair-in-cgroup_create_dir.patch [new file with mode: 0644]
queue-3.0/genirq-always-force-thread-affinity.patch [new file with mode: 0644]
queue-3.0/input-walkera0701-fix-crash-on-startup.patch [new file with mode: 0644]
queue-3.0/series
queue-3.0/xhci-add-lynx-point-lp-to-list-of-intel-switchable-hosts.patch [new file with mode: 0644]

diff --git a/queue-3.0/cgroup-remove-incorrect-dget-dput-pair-in-cgroup_create_dir.patch b/queue-3.0/cgroup-remove-incorrect-dget-dput-pair-in-cgroup_create_dir.patch
new file mode 100644 (file)
index 0000000..527d087
--- /dev/null
@@ -0,0 +1,69 @@
+From 175431635ec09b1d1bba04979b006b99e8305a83 Mon Sep 17 00:00:00 2001
+From: Tejun Heo <tj@kernel.org>
+Date: Mon, 19 Nov 2012 08:13:35 -0800
+Subject: cgroup: remove incorrect dget/dput() pair in cgroup_create_dir()
+
+From: Tejun Heo <tj@kernel.org>
+
+commit 175431635ec09b1d1bba04979b006b99e8305a83 upstream.
+
+cgroup_create_dir() does weird dancing with dentry refcnt.  On
+success, it gets and then puts it achieving nothing.  On failure, it
+puts but there isn't no matching get anywhere leading to the following
+oops if cgroup_create_file() fails for whatever reason.
+
+  ------------[ cut here ]------------
+  kernel BUG at /work/os/work/fs/dcache.c:552!
+  invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
+  Modules linked in:
+  CPU 2
+  Pid: 697, comm: mkdir Not tainted 3.7.0-rc4-work+ #3 Bochs Bochs
+  RIP: 0010:[<ffffffff811d9c0c>]  [<ffffffff811d9c0c>] dput+0x1dc/0x1e0
+  RSP: 0018:ffff88001a3ebef8  EFLAGS: 00010246
+  RAX: 0000000000000000 RBX: ffff88000e5b1ef8 RCX: 0000000000000403
+  RDX: 0000000000000303 RSI: 2000000000000000 RDI: ffff88000e5b1f58
+  RBP: ffff88001a3ebf18 R08: ffffffff82c76960 R09: 0000000000000001
+  R10: ffff880015022080 R11: ffd9bed70f48a041 R12: 00000000ffffffea
+  R13: 0000000000000001 R14: ffff88000e5b1f58 R15: 00007fff57656d60
+  FS:  00007ff05fcb3800(0000) GS:ffff88001fd00000(0000) knlGS:0000000000000000
+  CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+  CR2: 00000000004046f0 CR3: 000000001315f000 CR4: 00000000000006e0
+  DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
+  DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
+  Process mkdir (pid: 697, threadinfo ffff88001a3ea000, task ffff880015022080)
+  Stack:
+   ffff88001a3ebf48 00000000ffffffea 0000000000000001 0000000000000000
+   ffff88001a3ebf38 ffffffff811cc889 0000000000000001 ffff88000e5b1ef8
+   ffff88001a3ebf68 ffffffff811d1fc9 ffff8800198d7f18 ffff880019106ef8
+  Call Trace:
+   [<ffffffff811cc889>] done_path_create+0x19/0x50
+   [<ffffffff811d1fc9>] sys_mkdirat+0x59/0x80
+   [<ffffffff811d2009>] sys_mkdir+0x19/0x20
+   [<ffffffff81be1e02>] system_call_fastpath+0x16/0x1b
+  Code: 00 48 8d 90 18 01 00 00 48 89 93 c0 00 00 00 4c 89 a0 18 01 00 00 48 8b 83 a0 00 00 00 83 80 28 01 00 00 01 e8 e6 6f a0 00 eb 92 <0f> 0b 66 90 0f 1f 44 00 00 55 48 89 e5 41 57 41 56 49 89 fe 41
+  RIP  [<ffffffff811d9c0c>] dput+0x1dc/0x1e0
+   RSP <ffff88001a3ebef8>
+  ---[ end trace 1277bcfd9561ddb0 ]---
+
+Fix it by dropping the unnecessary dget/dput() pair.
+
+Signed-off-by: Tejun Heo <tj@kernel.org>
+Acked-by: Li Zefan <lizefan@huawei.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/cgroup.c |    2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/kernel/cgroup.c
++++ b/kernel/cgroup.c
+@@ -2630,9 +2630,7 @@ static int cgroup_create_dir(struct cgro
+               dentry->d_fsdata = cgrp;
+               inc_nlink(parent->d_inode);
+               rcu_assign_pointer(cgrp->dentry, dentry);
+-              dget(dentry);
+       }
+-      dput(dentry);
+       return error;
+ }
diff --git a/queue-3.0/genirq-always-force-thread-affinity.patch b/queue-3.0/genirq-always-force-thread-affinity.patch
new file mode 100644 (file)
index 0000000..41afb17
--- /dev/null
@@ -0,0 +1,83 @@
+From 04aa530ec04f61875b99c12721162e2964e3318c Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Sat, 3 Nov 2012 11:52:09 +0100
+Subject: genirq: Always force thread affinity
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit 04aa530ec04f61875b99c12721162e2964e3318c upstream.
+
+Sankara reported that the genirq core code fails to adjust the
+affinity of an interrupt thread in several cases:
+
+ 1) On request/setup_irq() the call to setup_affinity() happens before
+    the new action is registered, so the new thread is not notified.
+
+ 2) For secondary shared interrupts nothing notifies the new thread to
+    change its affinity.
+
+ 3) Interrupts which have the IRQ_NO_BALANCE flag set are not moving
+    the thread either.
+
+Fix this by setting the thread affinity flag right on thread creation
+time. This ensures that under all circumstances the thread moves to
+the right place. Requires a check in irq_thread_check_affinity for an
+existing affinity mask (CONFIG_CPU_MASK_OFFSTACK=y)
+
+Reported-and-tested-by: Sankara Muthukrishnan <sankara.m@gmail.com>
+Link: http://lkml.kernel.org/r/alpine.LFD.2.02.1209041738200.2754@ionos
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/irq/manage.c |   23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+--- a/kernel/irq/manage.c
++++ b/kernel/irq/manage.c
+@@ -698,6 +698,7 @@ static void
+ irq_thread_check_affinity(struct irq_desc *desc, struct irqaction *action)
+ {
+       cpumask_var_t mask;
++      bool valid = true;
+       if (!test_and_clear_bit(IRQTF_AFFINITY, &action->thread_flags))
+               return;
+@@ -712,10 +713,18 @@ irq_thread_check_affinity(struct irq_des
+       }
+       raw_spin_lock_irq(&desc->lock);
+-      cpumask_copy(mask, desc->irq_data.affinity);
++      /*
++       * This code is triggered unconditionally. Check the affinity
++       * mask pointer. For CPU_MASK_OFFSTACK=n this is optimized out.
++       */
++      if (desc->irq_data.affinity)
++              cpumask_copy(mask, desc->irq_data.affinity);
++      else
++              valid = false;
+       raw_spin_unlock_irq(&desc->lock);
+-      set_cpus_allowed_ptr(current, mask);
++      if (valid)
++              set_cpus_allowed_ptr(current, mask);
+       free_cpumask_var(mask);
+ }
+ #else
+@@ -925,6 +934,16 @@ __setup_irq(unsigned int irq, struct irq
+                */
+               get_task_struct(t);
+               new->thread = t;
++              /*
++               * Tell the thread to set its affinity. This is
++               * important for shared interrupt handlers as we do
++               * not invoke setup_affinity() for the secondary
++               * handlers as everything is already set up. Even for
++               * interrupts marked with IRQF_NO_BALANCE this is
++               * correct as we want the thread to move to the cpu(s)
++               * on which the requesting code placed the interrupt.
++               */
++              set_bit(IRQTF_AFFINITY, &new->thread_flags);
+       }
+       if (!alloc_cpumask_var(&mask, GFP_KERNEL)) {
diff --git a/queue-3.0/input-walkera0701-fix-crash-on-startup.patch b/queue-3.0/input-walkera0701-fix-crash-on-startup.patch
new file mode 100644 (file)
index 0000000..cf56828
--- /dev/null
@@ -0,0 +1,58 @@
+From a455e2985f57e2a71566bb8850094af38b2c932d Mon Sep 17 00:00:00 2001
+From: Peter Popovec <popovec@oko.fei.tuke.sk>
+Date: Fri, 14 Dec 2012 22:57:25 -0800
+Subject: Input: walkera0701 - fix crash on startup
+
+From: Peter Popovec <popovec@oko.fei.tuke.sk>
+
+commit a455e2985f57e2a71566bb8850094af38b2c932d upstream.
+
+The driver's timer must be set up before enabling IRQ handler, otherwise
+bad things may happen.
+
+Reported-and-tested-by: Fengguang Wu <fengguang.wu@intel.com>
+Signed-off-by: Peter Popovec <popovec@fei.tuke.sk>
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/input/joystick/walkera0701.c |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+--- a/drivers/input/joystick/walkera0701.c
++++ b/drivers/input/joystick/walkera0701.c
+@@ -196,6 +196,7 @@ static void walkera0701_close(struct inp
+       struct walkera_dev *w = input_get_drvdata(dev);
+       parport_disable_irq(w->parport);
++      hrtimer_cancel(&w->timer);
+ }
+ static int walkera0701_connect(struct walkera_dev *w, int parport)
+@@ -224,6 +225,9 @@ static int walkera0701_connect(struct wa
+       if (parport_claim(w->pardevice))
+               goto init_err1;
++      hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
++      w->timer.function = timer_handler;
++
+       w->input_dev = input_allocate_device();
+       if (!w->input_dev)
+               goto init_err2;
+@@ -254,8 +258,6 @@ static int walkera0701_connect(struct wa
+       if (err)
+               goto init_err3;
+-      hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+-      w->timer.function = timer_handler;
+       return 0;
+  init_err3:
+@@ -271,7 +273,6 @@ static int walkera0701_connect(struct wa
+ static void walkera0701_disconnect(struct walkera_dev *w)
+ {
+-      hrtimer_cancel(&w->timer);
+       input_unregister_device(w->input_dev);
+       parport_release(w->pardevice);
+       parport_unregister_device(w->pardevice);
index 986925c44a6a5a560f05053601670425b6a8b809..3996802778cac15c82d3b6479be521cba6f5c84a 100644 (file)
@@ -22,3 +22,7 @@ nfs-avoid-null-dereference-in-nfs_destroy_server.patch
 nfs-fix-calls-to-drop_nlink.patch
 nfsd4-fix-oops-on-unusual-readlike-compound.patch
 nfs-fix-null-checking-in-nfs_get_option_str.patch
+input-walkera0701-fix-crash-on-startup.patch
+genirq-always-force-thread-affinity.patch
+xhci-add-lynx-point-lp-to-list-of-intel-switchable-hosts.patch
+cgroup-remove-incorrect-dget-dput-pair-in-cgroup_create_dir.patch
diff --git a/queue-3.0/xhci-add-lynx-point-lp-to-list-of-intel-switchable-hosts.patch b/queue-3.0/xhci-add-lynx-point-lp-to-list-of-intel-switchable-hosts.patch
new file mode 100644 (file)
index 0000000..98f11da
--- /dev/null
@@ -0,0 +1,57 @@
+From bb1e5dd7113d2fd178d3af9aca8f480ae0468edf Mon Sep 17 00:00:00 2001
+From: Russell Webb <russell.webb@linux.intel.com>
+Date: Fri, 9 Nov 2012 13:58:49 -0800
+Subject: xhci: Add Lynx Point LP to list of Intel switchable hosts
+
+From: Russell Webb <russell.webb@linux.intel.com>
+
+commit bb1e5dd7113d2fd178d3af9aca8f480ae0468edf upstream.
+
+Like Lynx Point, Lynx Point LP is also switchable.  See
+1c12443ab8eba71a658fae4572147e56d1f84f66 for more details.
+
+This patch should be backported to stable kernels as old as 3.0,
+that contain commit 69e848c2090aebba5698a1620604c7dccb448684
+"Intel xhci: Support EHCI/xHCI port switching."
+
+Signed-off-by: Russell Webb <russell.webb@linux.intel.com>
+Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/host/ehci-pci.c   |    3 ++-
+ drivers/usb/host/pci-quirks.c |    4 +++-
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/host/ehci-pci.c
++++ b/drivers/usb/host/ehci-pci.c
+@@ -359,7 +359,8 @@ static bool usb_is_intel_switchable_ehci
+               pdev->vendor == PCI_VENDOR_ID_INTEL &&
+               (pdev->device == 0x1E26 ||
+                pdev->device == 0x8C2D ||
+-               pdev->device == 0x8C26);
++               pdev->device == 0x8C26 ||
++               pdev->device == 0x9C26);
+ }
+ static void ehci_enable_xhci_companion(void)
+--- a/drivers/usb/host/pci-quirks.c
++++ b/drivers/usb/host/pci-quirks.c
+@@ -721,6 +721,7 @@ static int handshake(void __iomem *ptr,
+ }
+ #define PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI   0x8C31
++#define PCI_DEVICE_ID_INTEL_LYNX_POINT_LP_XHCI        0x9C31
+ bool usb_is_intel_ppt_switchable_xhci(struct pci_dev *pdev)
+ {
+@@ -734,7 +735,8 @@ bool usb_is_intel_lpt_switchable_xhci(st
+ {
+       return pdev->class == PCI_CLASS_SERIAL_USB_XHCI &&
+               pdev->vendor == PCI_VENDOR_ID_INTEL &&
+-              pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI;
++              (pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI ||
++               pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_LP_XHCI);
+ }
+ bool usb_is_intel_switchable_xhci(struct pci_dev *pdev)