From: Greg Kroah-Hartman Date: Tue, 8 Jan 2013 21:08:47 +0000 (-0800) Subject: 3.0-stable patches X-Git-Tag: v3.0.58~22 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5e66c6eff02b07b71cbf1a018295a37e4898dcf1;p=thirdparty%2Fkernel%2Fstable-queue.git 3.0-stable patches 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 --- 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 index 00000000000..527d087d5ee --- /dev/null +++ b/queue-3.0/cgroup-remove-incorrect-dget-dput-pair-in-cgroup_create_dir.patch @@ -0,0 +1,69 @@ +From 175431635ec09b1d1bba04979b006b99e8305a83 Mon Sep 17 00:00:00 2001 +From: Tejun Heo +Date: Mon, 19 Nov 2012 08:13:35 -0800 +Subject: cgroup: remove incorrect dget/dput() pair in cgroup_create_dir() + +From: Tejun Heo + +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:[] [] 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: + [] done_path_create+0x19/0x50 + [] sys_mkdirat+0x59/0x80 + [] sys_mkdir+0x19/0x20 + [] 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 [] dput+0x1dc/0x1e0 + RSP + ---[ end trace 1277bcfd9561ddb0 ]--- + +Fix it by dropping the unnecessary dget/dput() pair. + +Signed-off-by: Tejun Heo +Acked-by: Li Zefan +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..41afb17d517 --- /dev/null +++ b/queue-3.0/genirq-always-force-thread-affinity.patch @@ -0,0 +1,83 @@ +From 04aa530ec04f61875b99c12721162e2964e3318c Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sat, 3 Nov 2012 11:52:09 +0100 +Subject: genirq: Always force thread affinity + +From: Thomas Gleixner + +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 +Link: http://lkml.kernel.org/r/alpine.LFD.2.02.1209041738200.2754@ionos +Signed-off-by: Thomas Gleixner +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..cf568286bad --- /dev/null +++ b/queue-3.0/input-walkera0701-fix-crash-on-startup.patch @@ -0,0 +1,58 @@ +From a455e2985f57e2a71566bb8850094af38b2c932d Mon Sep 17 00:00:00 2001 +From: Peter Popovec +Date: Fri, 14 Dec 2012 22:57:25 -0800 +Subject: Input: walkera0701 - fix crash on startup + +From: Peter Popovec + +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 +Signed-off-by: Peter Popovec +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + 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); diff --git a/queue-3.0/series b/queue-3.0/series index 986925c44a6..3996802778c 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -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 index 00000000000..98f11dab6a4 --- /dev/null +++ b/queue-3.0/xhci-add-lynx-point-lp-to-list-of-intel-switchable-hosts.patch @@ -0,0 +1,57 @@ +From bb1e5dd7113d2fd178d3af9aca8f480ae0468edf Mon Sep 17 00:00:00 2001 +From: Russell Webb +Date: Fri, 9 Nov 2012 13:58:49 -0800 +Subject: xhci: Add Lynx Point LP to list of Intel switchable hosts + +From: Russell Webb + +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 +Signed-off-by: Sarah Sharp +Signed-off-by: Greg Kroah-Hartman + +--- + 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)