From: Greg Kroah-Hartman Date: Tue, 17 Jul 2012 21:21:46 +0000 (-0700) Subject: 3.4-stable patches X-Git-Tag: v3.0.38~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6d3f3f10ae5d3f47dc7dcbafb3d4a20866ca1093;p=thirdparty%2Fkernel%2Fstable-queue.git 3.4-stable patches added patches: acpica-fix-possible-fault-in-return-package-object-repair-code.patch arm-samsung-fix-race-in-s3c_adc_start-for-adc.patch block-fix-infinite-loop-in-__getblk_slow.patch bonding-debugfs-and-network-namespaces-are-incompatible.patch bonding-manage-proc-net-bonding-entries-from-the-netdev-events.patch cfg80211-check-iface-combinations-only-when-iface-is-running.patch clk-check-parent-for-null-in-clk_change_rate.patch cpufreq-acpi-fix-not-loading-acpi-cpufreq-driver-regression.patch e1000e-correct-link-check-logic-for-82571-serdes.patch fifo-do-not-restart-open-if-it-already-found-a-partner.patch hid-add-support-for-2012-macbook-pro-retina.patch input-bcm5974-add-support-for-2012-macbook-pro-retina.patch input-xpad-add-andamiro-pump-it-up-pad.patch input-xpad-add-signature-for-razer-onza-tournament-edition.patch input-xpad-handle-all-variations-of-mad-catz-beat-pad.patch intel_ips-blacklist-hp-probook-laptops.patch iwlegacy-always-monitor-for-stuck-queues.patch iwlegacy-don-t-mess-up-the-scd-when-removing-a-key.patch mac80211-destroy-assoc_data-correctly-if-assoc-fails.patch md-raid1-fix-use-after-free-bug-in-raid1-data-check-code.patch media-dvb-core-release-semaphore-on-error-path-dvb_register_device.patch mtd-nandsim-don-t-open-code-a-do_div-helper.patch rpmsg-fix-dependency-on-initialization-order.patch rt2x00usb-fix-indexes-ordering-on-rx-queue-kick.patch sched-nohz-rewrite-and-fix-load-avg-computation-again.patch stmmac-fix-for-nfs-hang-on-multiple-reboot.patch --- diff --git a/queue-3.4/acpica-fix-possible-fault-in-return-package-object-repair-code.patch b/queue-3.4/acpica-fix-possible-fault-in-return-package-object-repair-code.patch new file mode 100644 index 00000000000..7f940b6a58c --- /dev/null +++ b/queue-3.4/acpica-fix-possible-fault-in-return-package-object-repair-code.patch @@ -0,0 +1,41 @@ +From 46befd6b38d802dfc5998e7d7938854578b45d9d Mon Sep 17 00:00:00 2001 +From: Bob Moore +Date: Wed, 4 Jul 2012 10:02:32 +0800 +Subject: ACPICA: Fix possible fault in return package object repair code + +From: Bob Moore + +commit 46befd6b38d802dfc5998e7d7938854578b45d9d upstream. + +Fixes a problem that can occur when a lone package object is +wrapped with an outer package object in order to conform to +the ACPI specification. Can affect these predefined names: +_ALR,_MLS,_PSS,_TRT,_TSS,_PRT,_HPX,_DLM,_CSD,_PSD,_TSD + +https://bugzilla.kernel.org/show_bug.cgi?id=44171 + +This problem was introduced in 3.4-rc1 by commit +6a99b1c94d053b3420eaa4a4bc8b2883dd90a2f9 +(ACPICA: Object repair code: Support to add Package wrappers) + +Reported-by: Vlastimil Babka +Signed-off-by: Bob Moore +Signed-off-by: Lin Ming +Signed-off-by: Len Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/acpi/acpica/nspredef.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/acpi/acpica/nspredef.c ++++ b/drivers/acpi/acpica/nspredef.c +@@ -638,7 +638,7 @@ acpi_ns_check_package(struct acpi_predef + /* Create the new outer package and populate it */ + + status = +- acpi_ns_wrap_with_package(data, *elements, ++ acpi_ns_wrap_with_package(data, return_object, + return_object_ptr); + if (ACPI_FAILURE(status)) { + return (status); diff --git a/queue-3.4/arm-samsung-fix-race-in-s3c_adc_start-for-adc.patch b/queue-3.4/arm-samsung-fix-race-in-s3c_adc_start-for-adc.patch new file mode 100644 index 00000000000..0f32a9c6fa5 --- /dev/null +++ b/queue-3.4/arm-samsung-fix-race-in-s3c_adc_start-for-adc.patch @@ -0,0 +1,40 @@ +From 8265981bb439f3ecc5356fb877a6c2a6636ac88a Mon Sep 17 00:00:00 2001 +From: Todd Poynor +Date: Fri, 13 Jul 2012 15:30:48 +0900 +Subject: ARM: SAMSUNG: fix race in s3c_adc_start for ADC + +From: Todd Poynor + +commit 8265981bb439f3ecc5356fb877a6c2a6636ac88a upstream. + +Checking for adc->ts_pend already claimed should be done with the +lock held. + +Signed-off-by: Todd Poynor +Acked-by: Ben Dooks +Signed-off-by: Kukjin Kim +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/plat-samsung/adc.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/arch/arm/plat-samsung/adc.c ++++ b/arch/arm/plat-samsung/adc.c +@@ -157,11 +157,13 @@ int s3c_adc_start(struct s3c_adc_client + return -EINVAL; + } + +- if (client->is_ts && adc->ts_pend) +- return -EAGAIN; +- + spin_lock_irqsave(&adc->lock, flags); + ++ if (client->is_ts && adc->ts_pend) { ++ spin_unlock_irqrestore(&adc->lock, flags); ++ return -EAGAIN; ++ } ++ + client->channel = channel; + client->nr_samples = nr_samples; + diff --git a/queue-3.4/block-fix-infinite-loop-in-__getblk_slow.patch b/queue-3.4/block-fix-infinite-loop-in-__getblk_slow.patch new file mode 100644 index 00000000000..6d3ebd13d98 --- /dev/null +++ b/queue-3.4/block-fix-infinite-loop-in-__getblk_slow.patch @@ -0,0 +1,112 @@ +From 91f68c89d8f35fe98ea04159b9a3b42d0149478f Mon Sep 17 00:00:00 2001 +From: Jeff Moyer +Date: Thu, 12 Jul 2012 09:43:14 -0400 +Subject: block: fix infinite loop in __getblk_slow + +From: Jeff Moyer + +commit 91f68c89d8f35fe98ea04159b9a3b42d0149478f upstream. + +Commit 080399aaaf35 ("block: don't mark buffers beyond end of disk as +mapped") exposed a bug in __getblk_slow that causes mount to hang as it +loops infinitely waiting for a buffer that lies beyond the end of the +disk to become uptodate. + +The problem was initially reported by Torsten Hilbrich here: + + https://lkml.org/lkml/2012/6/18/54 + +and also reported independently here: + + http://www.sysresccd.org/forums/viewtopic.php?f=13&t=4511 + +and then Richard W.M. Jones and Marcos Mello noted a few separate +bugzillas also associated with the same issue. This patch has been +confirmed to fix: + + https://bugzilla.redhat.com/show_bug.cgi?id=835019 + +The main problem is here, in __getblk_slow: + + for (;;) { + struct buffer_head * bh; + int ret; + + bh = __find_get_block(bdev, block, size); + if (bh) + return bh; + + ret = grow_buffers(bdev, block, size); + if (ret < 0) + return NULL; + if (ret == 0) + free_more_memory(); + } + +__find_get_block does not find the block, since it will not be marked as +mapped, and so grow_buffers is called to fill in the buffers for the +associated page. I believe the for (;;) loop is there primarily to +retry in the case of memory pressure keeping grow_buffers from +succeeding. However, we also continue to loop for other cases, like the +block lying beond the end of the disk. So, the fix I came up with is to +only loop when grow_buffers fails due to memory allocation issues +(return value of 0). + +The attached patch was tested by myself, Torsten, and Rich, and was +found to resolve the problem in call cases. + +Signed-off-by: Jeff Moyer +Reported-and-Tested-by: Torsten Hilbrich +Tested-by: Richard W.M. Jones +Reviewed-by: Josh Boyer +[ Jens is on vacation, taking this directly - Linus ] +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + fs/buffer.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +--- a/fs/buffer.c ++++ b/fs/buffer.c +@@ -1036,6 +1036,9 @@ grow_buffers(struct block_device *bdev, + static struct buffer_head * + __getblk_slow(struct block_device *bdev, sector_t block, int size) + { ++ int ret; ++ struct buffer_head *bh; ++ + /* Size must be multiple of hard sectorsize */ + if (unlikely(size & (bdev_logical_block_size(bdev)-1) || + (size < 512 || size > PAGE_SIZE))) { +@@ -1048,20 +1051,21 @@ __getblk_slow(struct block_device *bdev, + return NULL; + } + +- for (;;) { +- struct buffer_head * bh; +- int ret; ++retry: ++ bh = __find_get_block(bdev, block, size); ++ if (bh) ++ return bh; + ++ ret = grow_buffers(bdev, block, size); ++ if (ret == 0) { ++ free_more_memory(); ++ goto retry; ++ } else if (ret > 0) { + bh = __find_get_block(bdev, block, size); + if (bh) + return bh; +- +- ret = grow_buffers(bdev, block, size); +- if (ret < 0) +- return NULL; +- if (ret == 0) +- free_more_memory(); + } ++ return NULL; + } + + /* diff --git a/queue-3.4/bonding-debugfs-and-network-namespaces-are-incompatible.patch b/queue-3.4/bonding-debugfs-and-network-namespaces-are-incompatible.patch new file mode 100644 index 00000000000..58d8543d72e --- /dev/null +++ b/queue-3.4/bonding-debugfs-and-network-namespaces-are-incompatible.patch @@ -0,0 +1,36 @@ +From 96ca7ffe748bf91f851e6aa4479aa11c8b1122ba Mon Sep 17 00:00:00 2001 +From: "Eric W. Biederman" +Date: Mon, 9 Jul 2012 10:52:43 +0000 +Subject: bonding: debugfs and network namespaces are incompatible + +From: "Eric W. Biederman" + +commit 96ca7ffe748bf91f851e6aa4479aa11c8b1122ba upstream. + +The bonding debugfs support has been broken in the presence of network +namespaces since it has been added. The debugfs support does not handle +multiple bonding devices with the same name in different network +namespaces. + +I haven't had any bug reports, and I'm not interested in getting any. +Disable the debugfs support when network namespaces are enabled. + +Signed-off-by: "Eric W. Biederman" +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/bonding/bond_debugfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/bonding/bond_debugfs.c ++++ b/drivers/net/bonding/bond_debugfs.c +@@ -6,7 +6,7 @@ + #include "bonding.h" + #include "bond_alb.h" + +-#ifdef CONFIG_DEBUG_FS ++#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_NET_NS) + + #include + #include diff --git a/queue-3.4/bonding-manage-proc-net-bonding-entries-from-the-netdev-events.patch b/queue-3.4/bonding-manage-proc-net-bonding-entries-from-the-netdev-events.patch new file mode 100644 index 00000000000..ae984329921 --- /dev/null +++ b/queue-3.4/bonding-manage-proc-net-bonding-entries-from-the-netdev-events.patch @@ -0,0 +1,58 @@ +From a64d49c3dd504b685f9742a2f3dcb11fb8e4345f Mon Sep 17 00:00:00 2001 +From: "Eric W. Biederman" +Date: Mon, 9 Jul 2012 10:51:45 +0000 +Subject: bonding: Manage /proc/net/bonding/ entries from the netdev events + +From: "Eric W. Biederman" + +commit a64d49c3dd504b685f9742a2f3dcb11fb8e4345f upstream. + +It was recently reported that moving a bonding device between network +namespaces causes warnings from /proc. It turns out after the move we +were trying to add and to remove the /proc/net/bonding entries from the +wrong network namespace. + +Move the bonding /proc registration code into the NETDEV_REGISTER and +NETDEV_UNREGISTER events where the proc registration and unregistration +will always happen at the right time. + +Signed-off-by: "Eric W. Biederman" +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/bonding/bond_main.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +--- a/drivers/net/bonding/bond_main.c ++++ b/drivers/net/bonding/bond_main.c +@@ -3218,6 +3218,12 @@ static int bond_master_netdev_event(unsi + switch (event) { + case NETDEV_CHANGENAME: + return bond_event_changename(event_bond); ++ case NETDEV_UNREGISTER: ++ bond_remove_proc_entry(event_bond); ++ break; ++ case NETDEV_REGISTER: ++ bond_create_proc_entry(event_bond); ++ break; + default: + break; + } +@@ -4402,8 +4408,6 @@ static void bond_uninit(struct net_devic + + bond_work_cancel_all(bond); + +- bond_remove_proc_entry(bond); +- + bond_debug_unregister(bond); + + __hw_addr_flush(&bond->mc_list); +@@ -4805,7 +4809,6 @@ static int bond_init(struct net_device * + + bond_set_lockdep_class(bond_dev); + +- bond_create_proc_entry(bond); + list_add_tail(&bond->bond_list, &bn->dev_list); + + bond_prepare_sysfs_group(bond); diff --git a/queue-3.4/cfg80211-check-iface-combinations-only-when-iface-is-running.patch b/queue-3.4/cfg80211-check-iface-combinations-only-when-iface-is-running.patch new file mode 100644 index 00000000000..2800216f3e7 --- /dev/null +++ b/queue-3.4/cfg80211-check-iface-combinations-only-when-iface-is-running.patch @@ -0,0 +1,38 @@ +From f8cdddb8d61d16a156229f0910f7ecfc7a82c003 Mon Sep 17 00:00:00 2001 +From: Michal Kazior +Date: Fri, 8 Jun 2012 10:55:44 +0200 +Subject: cfg80211: check iface combinations only when iface is running + +From: Michal Kazior + +commit f8cdddb8d61d16a156229f0910f7ecfc7a82c003 upstream. + +Don't validate interface combinations on a stopped +interface. Otherwise we might end up being able to +create a new interface with a certain type, but +won't be able to change an existing interface +into that type. + +This also skips some other functions when +interface is stopped and changing interface type. + +Signed-off-by: Michal Kazior +Signed-off-by: Johannes Berg +[Fixes regression introduced by cherry pick of 463454b5dbd8] +Signed-off-by: Paul Gortmaker + +--- + net/wireless/util.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/wireless/util.c ++++ b/net/wireless/util.c +@@ -805,7 +805,7 @@ int cfg80211_change_iface(struct cfg8021 + ntype == NL80211_IFTYPE_P2P_CLIENT)) + return -EBUSY; + +- if (ntype != otype) { ++ if (ntype != otype && netif_running(dev)) { + err = cfg80211_can_change_interface(rdev, dev->ieee80211_ptr, + ntype); + if (err) diff --git a/queue-3.4/clk-check-parent-for-null-in-clk_change_rate.patch b/queue-3.4/clk-check-parent-for-null-in-clk_change_rate.patch new file mode 100644 index 00000000000..81f5cdeea4a --- /dev/null +++ b/queue-3.4/clk-check-parent-for-null-in-clk_change_rate.patch @@ -0,0 +1,51 @@ +From bf47b4fd8f9f81cd5ce40e1945c6334d088226d1 Mon Sep 17 00:00:00 2001 +From: Pawel Moll +Date: Fri, 8 Jun 2012 14:04:06 +0100 +Subject: clk: Check parent for NULL in clk_change_rate + +From: Pawel Moll + +commit bf47b4fd8f9f81cd5ce40e1945c6334d088226d1 upstream. + +clk_change_rate() is accessing parent's rate without checking +if the parent exists at all. In case of root clocks this will +cause NULL pointer dereference. + +This patch follows what clk_calc_new_rates() does in such +situation. + +Signed-off-by: Pawel Moll +Signed-off-by: Mike Turquette +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/clk/clk.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +--- a/drivers/clk/clk.c ++++ b/drivers/clk/clk.c +@@ -834,18 +834,21 @@ static void clk_change_rate(struct clk * + { + struct clk *child; + unsigned long old_rate; ++ unsigned long best_parent_rate = 0; + struct hlist_node *tmp; + + old_rate = clk->rate; + ++ if (clk->parent) ++ best_parent_rate = clk->parent->rate; ++ + if (clk->ops->set_rate) + clk->ops->set_rate(clk->hw, clk->new_rate); + + if (clk->ops->recalc_rate) +- clk->rate = clk->ops->recalc_rate(clk->hw, +- clk->parent->rate); ++ clk->rate = clk->ops->recalc_rate(clk->hw, best_parent_rate); + else +- clk->rate = clk->parent->rate; ++ clk->rate = best_parent_rate; + + if (clk->notifier_count && old_rate != clk->rate) + __clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate); diff --git a/queue-3.4/cpufreq-acpi-fix-not-loading-acpi-cpufreq-driver-regression.patch b/queue-3.4/cpufreq-acpi-fix-not-loading-acpi-cpufreq-driver-regression.patch new file mode 100644 index 00000000000..f8b17ea1010 --- /dev/null +++ b/queue-3.4/cpufreq-acpi-fix-not-loading-acpi-cpufreq-driver-regression.patch @@ -0,0 +1,50 @@ +From c4686c71a9183f76e3ef59098da5c098748672f6 Mon Sep 17 00:00:00 2001 +From: Thomas Renninger +Date: Thu, 12 Jul 2012 12:24:33 +0200 +Subject: cpufreq / ACPI: Fix not loading acpi-cpufreq driver regression + +From: Thomas Renninger + +commit c4686c71a9183f76e3ef59098da5c098748672f6 upstream. + +Commit d640113fe80e45ebd4a5b420b introduced a regression on SMP +systems where the processor core with ACPI id zero is disabled +(typically should be the case because of hyperthreading). +The regression got spread through stable kernels. +On 3.0.X it got introduced via 3.0.18. + +Such platforms may be rare, but do exist. +Look out for a disabled processor with acpi_id 0 in dmesg: +ACPI: LAPIC (acpi_id[0x00] lapic_id[0x10] disabled) + +This problem has been observed on a: +HP Proliant BL280c G6 blade + +This patch restricts the introduced workaround to platforms +with nr_cpu_ids <= 1. + +Signed-off-by: Thomas Renninger +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/acpi/processor_core.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/acpi/processor_core.c ++++ b/drivers/acpi/processor_core.c +@@ -189,10 +189,12 @@ int acpi_get_cpuid(acpi_handle handle, i + * Processor (CPU3, 0x03, 0x00000410, 0x06) {} + * } + * +- * Ignores apic_id and always return 0 for CPU0's handle. ++ * Ignores apic_id and always returns 0 for the processor ++ * handle with acpi id 0 if nr_cpu_ids is 1. ++ * This should be the case if SMP tables are not found. + * Return -1 for other CPU's handle. + */ +- if (acpi_id == 0) ++ if (nr_cpu_ids <= 1 && acpi_id == 0) + return acpi_id; + else + return apic_id; diff --git a/queue-3.4/e1000e-correct-link-check-logic-for-82571-serdes.patch b/queue-3.4/e1000e-correct-link-check-logic-for-82571-serdes.patch new file mode 100644 index 00000000000..258592e881b --- /dev/null +++ b/queue-3.4/e1000e-correct-link-check-logic-for-82571-serdes.patch @@ -0,0 +1,37 @@ +From d0efa8f23a644f7cb7d1f8e78dd9a223efa412a3 Mon Sep 17 00:00:00 2001 +From: Tushar Dave +Date: Thu, 12 Jul 2012 08:56:56 +0000 +Subject: e1000e: Correct link check logic for 82571 serdes + +From: Tushar Dave + +commit d0efa8f23a644f7cb7d1f8e78dd9a223efa412a3 upstream. + +SYNCH bit and IV bit of RXCW register are sticky. Before examining these bits, +RXCW should be read twice to filter out one-time false events and have correct +values for these bits. Incorrect values of these bits in link check logic can +cause weird link stability issues if auto-negotiation fails. + +Reported-by: Dean Nelson +Signed-off-by: Tushar Dave +Reviewed-by: Bruce Allan +Tested-by: Jeff Pieper +Signed-off-by: Jeff Kirsher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/ethernet/intel/e1000e/82571.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/ethernet/intel/e1000e/82571.c ++++ b/drivers/net/ethernet/intel/e1000e/82571.c +@@ -1553,6 +1553,9 @@ static s32 e1000_check_for_serdes_link_8 + ctrl = er32(CTRL); + status = er32(STATUS); + rxcw = er32(RXCW); ++ /* SYNCH bit and IV bit are sticky */ ++ udelay(10); ++ rxcw = er32(RXCW); + + if ((rxcw & E1000_RXCW_SYNCH) && !(rxcw & E1000_RXCW_IV)) { + diff --git a/queue-3.4/fifo-do-not-restart-open-if-it-already-found-a-partner.patch b/queue-3.4/fifo-do-not-restart-open-if-it-already-found-a-partner.patch new file mode 100644 index 00000000000..2152491d957 --- /dev/null +++ b/queue-3.4/fifo-do-not-restart-open-if-it-already-found-a-partner.patch @@ -0,0 +1,109 @@ +From 05d290d66be6ef77a0b962ebecf01911bd984a78 Mon Sep 17 00:00:00 2001 +From: Anders Kaseorg +Date: Sun, 15 Jul 2012 17:14:25 -0400 +Subject: fifo: Do not restart open() if it already found a partner + +From: Anders Kaseorg + +commit 05d290d66be6ef77a0b962ebecf01911bd984a78 upstream. + +If a parent and child process open the two ends of a fifo, and the +child immediately exits, the parent may receive a SIGCHLD before its +open() returns. In that case, we need to make sure that open() will +return successfully after the SIGCHLD handler returns, instead of +throwing EINTR or being restarted. Otherwise, the restarted open() +would incorrectly wait for a second partner on the other end. + +The following test demonstrates the EINTR that was wrongly thrown from +the parent’s open(). Change .sa_flags = 0 to .sa_flags = SA_RESTART +to see a deadlock instead, in which the restarted open() waits for a +second reader that will never come. (On my systems, this happens +pretty reliably within about 5 to 500 iterations. Others report that +it manages to loop ~forever sometimes; YMMV.) + + #include + #include + #include + #include + #include + #include + #include + #include + + #define CHECK(x) do if ((x) == -1) {perror(#x); abort();} while(0) + + void handler(int signum) {} + + int main() + { + struct sigaction act = {.sa_handler = handler, .sa_flags = 0}; + CHECK(sigaction(SIGCHLD, &act, NULL)); + CHECK(mknod("fifo", S_IFIFO | S_IRWXU, 0)); + for (;;) { + int fd; + pid_t pid; + putc('.', stderr); + CHECK(pid = fork()); + if (pid == 0) { + CHECK(fd = open("fifo", O_RDONLY)); + _exit(0); + } + CHECK(fd = open("fifo", O_WRONLY)); + CHECK(close(fd)); + CHECK(waitpid(pid, NULL, 0)); + } + } + +This is what I suspect was causing the Git test suite to fail in +t9010-svn-fe.sh: + + http://bugs.debian.org/678852 + +Signed-off-by: Anders Kaseorg +Reviewed-by: Jonathan Nieder +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + fs/fifo.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +--- a/fs/fifo.c ++++ b/fs/fifo.c +@@ -14,7 +14,7 @@ + #include + #include + +-static void wait_for_partner(struct inode* inode, unsigned int *cnt) ++static int wait_for_partner(struct inode* inode, unsigned int *cnt) + { + int cur = *cnt; + +@@ -23,6 +23,7 @@ static void wait_for_partner(struct inod + if (signal_pending(current)) + break; + } ++ return cur == *cnt ? -ERESTARTSYS : 0; + } + + static void wake_up_partner(struct inode* inode) +@@ -67,8 +68,7 @@ static int fifo_open(struct inode *inode + * seen a writer */ + filp->f_version = pipe->w_counter; + } else { +- wait_for_partner(inode, &pipe->w_counter); +- if(signal_pending(current)) ++ if (wait_for_partner(inode, &pipe->w_counter)) + goto err_rd; + } + } +@@ -90,8 +90,7 @@ static int fifo_open(struct inode *inode + wake_up_partner(inode); + + if (!pipe->readers) { +- wait_for_partner(inode, &pipe->r_counter); +- if (signal_pending(current)) ++ if (wait_for_partner(inode, &pipe->r_counter)) + goto err_wr; + } + break; diff --git a/queue-3.4/hid-add-support-for-2012-macbook-pro-retina.patch b/queue-3.4/hid-add-support-for-2012-macbook-pro-retina.patch new file mode 100644 index 00000000000..d7355e388de --- /dev/null +++ b/queue-3.4/hid-add-support-for-2012-macbook-pro-retina.patch @@ -0,0 +1,79 @@ +From b2e6ad7dfe26aac5bf136962d0b11d180b820d44 Mon Sep 17 00:00:00 2001 +From: Ryan Bourgeois +Date: Tue, 10 Jul 2012 09:43:33 -0700 +Subject: HID: add support for 2012 MacBook Pro Retina + +From: Ryan Bourgeois + +commit b2e6ad7dfe26aac5bf136962d0b11d180b820d44 upstream. + +Add support for the 15'' MacBook Pro Retina. The keyboard is +the same as recent models. + +The patch needs to be synchronized with the bcm5974 patch for +the trackpad - as usual. + +Patch originally written by clipcarl (forums.opensuse.org). + +[rydberg@euromail.se: Amended mouse ignore lines] +Signed-off-by: Ryan Bourgeois +Signed-off-by: Henrik Rydberg +Acked-by: Jiri Kosina +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/hid/hid-apple.c | 6 ++++++ + drivers/hid/hid-core.c | 6 ++++++ + drivers/hid/hid-ids.h | 3 +++ + 3 files changed, 15 insertions(+) + +--- a/drivers/hid/hid-apple.c ++++ b/drivers/hid/hid-apple.c +@@ -514,6 +514,12 @@ static const struct hid_device_id apple_ + .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), + .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), ++ .driver_data = APPLE_HAS_FN }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), ++ .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), ++ .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -1379,6 +1379,9 @@ static const struct hid_device_id hid_ha + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, +@@ -2009,6 +2012,9 @@ static const struct hid_device_id hid_mo + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, + { } +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -125,6 +125,9 @@ + #define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c + #define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d + #define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e ++#define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 ++#define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 ++#define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 + #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239 + #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a + #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b diff --git a/queue-3.4/input-bcm5974-add-support-for-2012-macbook-pro-retina.patch b/queue-3.4/input-bcm5974-add-support-for-2012-macbook-pro-retina.patch new file mode 100644 index 00000000000..fcd4c034539 --- /dev/null +++ b/queue-3.4/input-bcm5974-add-support-for-2012-macbook-pro-retina.patch @@ -0,0 +1,64 @@ +From 3dde22a98e94eb18527f0ff0068fb2fb945e58d4 Mon Sep 17 00:00:00 2001 +From: Henrik Rydberg +Date: Tue, 10 Jul 2012 09:43:57 -0700 +Subject: Input: bcm5974 - Add support for 2012 MacBook Pro Retina + +From: Henrik Rydberg + +commit 3dde22a98e94eb18527f0ff0068fb2fb945e58d4 upstream. + +Add support for the 15'' MacBook Pro Retina model (MacBookPro10,1). + +Patch originally written by clipcarl (forums.opensuse.org). + +Signed-off-by: Henrik Rydberg +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/input/mouse/bcm5974.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +--- a/drivers/input/mouse/bcm5974.c ++++ b/drivers/input/mouse/bcm5974.c +@@ -79,6 +79,10 @@ + #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252 + #define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253 + #define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254 ++/* MacbookPro10,1 (unibody, June 2012) */ ++#define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 ++#define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 ++#define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 + + #define BCM5974_DEVICE(prod) { \ + .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ +@@ -128,6 +132,10 @@ static const struct usb_device_id bcm597 + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), ++ /* MacbookPro10,1 */ ++ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), ++ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), ++ BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), + /* Terminating entry */ + {} + }; +@@ -354,6 +362,18 @@ static const struct bcm5974_config bcm59 + { DIM_X, DIM_X / SN_COORD, -4620, 5140 }, + { DIM_Y, DIM_Y / SN_COORD, -150, 6600 } + }, ++ { ++ USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI, ++ USB_DEVICE_ID_APPLE_WELLSPRING7_ISO, ++ USB_DEVICE_ID_APPLE_WELLSPRING7_JIS, ++ HAS_INTEGRATED_BUTTON, ++ 0x84, sizeof(struct bt_data), ++ 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, ++ { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 }, ++ { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 }, ++ { DIM_X, DIM_X / SN_COORD, -4750, 5280 }, ++ { DIM_Y, DIM_Y / SN_COORD, -150, 6730 } ++ }, + {} + }; + diff --git a/queue-3.4/input-xpad-add-andamiro-pump-it-up-pad.patch b/queue-3.4/input-xpad-add-andamiro-pump-it-up-pad.patch new file mode 100644 index 00000000000..36cf4af74c2 --- /dev/null +++ b/queue-3.4/input-xpad-add-andamiro-pump-it-up-pad.patch @@ -0,0 +1,31 @@ +From e76b8ee25e034ab601b525abb95cea14aa167ed3 Mon Sep 17 00:00:00 2001 +From: Yuri Khan +Date: Wed, 11 Jul 2012 22:12:31 -0700 +Subject: Input: xpad - add Andamiro Pump It Up pad + +From: Yuri Khan + +commit e76b8ee25e034ab601b525abb95cea14aa167ed3 upstream. + +I couldn't find the vendor ID in any of the online databases, but this +mat has a Pump It Up logo on the top side of the controller compartment, +and a disclaimer stating that Andamiro will not be liable on the bottom. + +Signed-off-by: Yuri Khan +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/input/joystick/xpad.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/input/joystick/xpad.c ++++ b/drivers/input/joystick/xpad.c +@@ -142,6 +142,7 @@ static const struct xpad_device { + { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX }, + { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, + { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, ++ { 0x0d2f, 0x0002, "Andamiro Pump It Up pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, + { 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX }, + { 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX }, + { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX }, diff --git a/queue-3.4/input-xpad-add-signature-for-razer-onza-tournament-edition.patch b/queue-3.4/input-xpad-add-signature-for-razer-onza-tournament-edition.patch new file mode 100644 index 00000000000..212afe93643 --- /dev/null +++ b/queue-3.4/input-xpad-add-signature-for-razer-onza-tournament-edition.patch @@ -0,0 +1,37 @@ +From cc71a7e899cc6b2ff41e1be48756782ed004d802 Mon Sep 17 00:00:00 2001 +From: Ilia Katsnelson +Date: Wed, 11 Jul 2012 00:54:20 -0700 +Subject: Input: xpad - add signature for Razer Onza Tournament Edition + +From: Ilia Katsnelson + +commit cc71a7e899cc6b2ff41e1be48756782ed004d802 upstream. + +Signed-off-by: Ilia Katsnelson +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/input/joystick/xpad.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/input/joystick/xpad.c ++++ b/drivers/input/joystick/xpad.c +@@ -164,6 +164,7 @@ static const struct xpad_device { + { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, ++ { 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, + { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } + }; +@@ -244,7 +245,8 @@ static struct usb_device_id xpad_table [ + XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ + XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */ + XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ +- XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ ++ XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ ++ XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */ + { } + }; + diff --git a/queue-3.4/input-xpad-handle-all-variations-of-mad-catz-beat-pad.patch b/queue-3.4/input-xpad-handle-all-variations-of-mad-catz-beat-pad.patch new file mode 100644 index 00000000000..adb6afa8800 --- /dev/null +++ b/queue-3.4/input-xpad-handle-all-variations-of-mad-catz-beat-pad.patch @@ -0,0 +1,54 @@ +From 3ffb62cb9ac2430c2504c6ff9727d0f2476ef0bd Mon Sep 17 00:00:00 2001 +From: Yuri Khan +Date: Wed, 11 Jul 2012 00:49:18 -0700 +Subject: Input: xpad - handle all variations of Mad Catz Beat Pad + +From: Yuri Khan + +commit 3ffb62cb9ac2430c2504c6ff9727d0f2476ef0bd upstream. + +The device should be handled by xpad driver instead of generic HID driver. + +Signed-off-by: Yuri Khan +Acked-by: Jiri Kosina +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/hid/hid-core.c | 1 + + drivers/hid/hid-ids.h | 3 +++ + drivers/input/joystick/xpad.c | 1 + + 3 files changed, 5 insertions(+) + +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -1914,6 +1914,7 @@ static const struct hid_device_id hid_ig + { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) }, + { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) }, + { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_BEATPAD) }, + { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) }, + { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) }, + { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -509,6 +509,9 @@ + #define USB_DEVICE_ID_CRYSTALTOUCH 0x0006 + #define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007 + ++#define USB_VENDOR_ID_MADCATZ 0x0738 ++#define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540 ++ + #define USB_VENDOR_ID_MCC 0x09db + #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 + #define USB_DEVICE_ID_MCC_PMD1208LS 0x007a +--- a/drivers/input/joystick/xpad.c ++++ b/drivers/input/joystick/xpad.c +@@ -238,6 +238,7 @@ static struct usb_device_id xpad_table [ + XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ + XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ + XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ ++ { USB_DEVICE(0x0738, 0x4540) }, /* Mad Catz Beat Pad */ + XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ + XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */ + XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ diff --git a/queue-3.4/intel_ips-blacklist-hp-probook-laptops.patch b/queue-3.4/intel_ips-blacklist-hp-probook-laptops.patch new file mode 100644 index 00000000000..8f2b58d7479 --- /dev/null +++ b/queue-3.4/intel_ips-blacklist-hp-probook-laptops.patch @@ -0,0 +1,68 @@ +From 88ca518b0bb4161e5f20f8a1d9cc477cae294e54 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 25 Jun 2012 15:07:17 +0200 +Subject: intel_ips: blacklist HP ProBook laptops + +From: Takashi Iwai + +commit 88ca518b0bb4161e5f20f8a1d9cc477cae294e54 upstream. + +intel_ips driver spews the warning message + "ME failed to update for more than 1s, likely hung" +at each second endlessly on HP ProBook laptops with IronLake. + +As this has never worked, better to blacklist the driver for now. + +Signed-off-by: Takashi Iwai +Signed-off-by: Matthew Garrett +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/platform/x86/intel_ips.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +--- a/drivers/platform/x86/intel_ips.c ++++ b/drivers/platform/x86/intel_ips.c +@@ -72,6 +72,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1485,6 +1486,24 @@ static DEFINE_PCI_DEVICE_TABLE(ips_id_ta + + MODULE_DEVICE_TABLE(pci, ips_id_table); + ++static int ips_blacklist_callback(const struct dmi_system_id *id) ++{ ++ pr_info("Blacklisted intel_ips for %s\n", id->ident); ++ return 1; ++} ++ ++static const struct dmi_system_id ips_blacklist[] = { ++ { ++ .callback = ips_blacklist_callback, ++ .ident = "HP ProBook", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook"), ++ }, ++ }, ++ { } /* terminating entry */ ++}; ++ + static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id) + { + u64 platform_info; +@@ -1494,6 +1513,9 @@ static int ips_probe(struct pci_dev *dev + u16 htshi, trc, trc_required_mask; + u8 tse; + ++ if (dmi_check_system(ips_blacklist)) ++ return -ENODEV; ++ + ips = kzalloc(sizeof(struct ips_driver), GFP_KERNEL); + if (!ips) + return -ENOMEM; diff --git a/queue-3.4/iwlegacy-always-monitor-for-stuck-queues.patch b/queue-3.4/iwlegacy-always-monitor-for-stuck-queues.patch new file mode 100644 index 00000000000..73e23e9f23b --- /dev/null +++ b/queue-3.4/iwlegacy-always-monitor-for-stuck-queues.patch @@ -0,0 +1,62 @@ +From c2ca7d92ed4bbd779516beb6eb226e19f7f7ab0f Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 4 Jul 2012 13:20:20 +0200 +Subject: iwlegacy: always monitor for stuck queues + +From: Stanislaw Gruszka + +commit c2ca7d92ed4bbd779516beb6eb226e19f7f7ab0f upstream. + +This is iwlegacy version of: + +commit 342bbf3fee2fa9a18147e74b2e3c4229a4564912 +Author: Johannes Berg +Date: Sun Mar 4 08:50:46 2012 -0800 + + iwlwifi: always monitor for stuck queues + + If we only monitor while associated, the following + can happen: + - we're associated, and the queue stuck check + runs, setting the queue "touch" time to X + - we disassociate, stopping the monitoring, + which leaves the time set to X + - almost 2s later, we associate, and enqueue + a frame + - before the frame is transmitted, we monitor + for stuck queues, and find the time set to + X, although it is now later than X + 2000ms, + so we decide that the queue is stuck and + erroneously restart the device + +Signed-off-by: Stanislaw Gruszka +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/iwlegacy/common.c | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +--- a/drivers/net/wireless/iwlegacy/common.c ++++ b/drivers/net/wireless/iwlegacy/common.c +@@ -4767,14 +4767,12 @@ il_bg_watchdog(unsigned long data) + return; + + /* monitor and check for other stuck queues */ +- if (il_is_any_associated(il)) { +- for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) { +- /* skip as we already checked the command queue */ +- if (cnt == il->cmd_queue) +- continue; +- if (il_check_stuck_queue(il, cnt)) +- return; +- } ++ for (cnt = 0; cnt < il->hw_params.max_txq_num; cnt++) { ++ /* skip as we already checked the command queue */ ++ if (cnt == il->cmd_queue) ++ continue; ++ if (il_check_stuck_queue(il, cnt)) ++ return; + } + + mod_timer(&il->watchdog, diff --git a/queue-3.4/iwlegacy-don-t-mess-up-the-scd-when-removing-a-key.patch b/queue-3.4/iwlegacy-don-t-mess-up-the-scd-when-removing-a-key.patch new file mode 100644 index 00000000000..4dd71d590e8 --- /dev/null +++ b/queue-3.4/iwlegacy-don-t-mess-up-the-scd-when-removing-a-key.patch @@ -0,0 +1,48 @@ +From b48d96652626b315229b1b82c6270eead6a77a6d Mon Sep 17 00:00:00 2001 +From: Emmanuel Grumbach +Date: Wed, 4 Jul 2012 13:59:08 +0200 +Subject: iwlegacy: don't mess up the SCD when removing a key + +From: Emmanuel Grumbach + +commit b48d96652626b315229b1b82c6270eead6a77a6d upstream. + +When we remove a key, we put a key index which was supposed +to tell the fw that we are actually removing the key. But +instead the fw took that index as a valid index and messed +up the SRAM of the device. + +This memory corruption on the device mangled the data of +the SCD. The impact on the user is that SCD queue 2 got +stuck after having removed keys. + +Reported-by: Paul Bolle +Signed-off-by: Emmanuel Grumbach +Signed-off-by: Stanislaw Gruszka +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/iwlegacy/4965-mac.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/iwlegacy/4965-mac.c ++++ b/drivers/net/wireless/iwlegacy/4965-mac.c +@@ -3405,7 +3405,7 @@ il4965_remove_dynamic_key(struct il_priv + return 0; + } + +- if (il->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) { ++ if (il->stations[sta_id].sta.key.key_flags & STA_KEY_FLG_INVALID) { + IL_WARN("Removing wrong key %d 0x%x\n", keyconf->keyidx, + key_flags); + spin_unlock_irqrestore(&il->sta_lock, flags); +@@ -3420,7 +3420,7 @@ il4965_remove_dynamic_key(struct il_priv + memset(&il->stations[sta_id].sta.key, 0, sizeof(struct il4965_keyinfo)); + il->stations[sta_id].sta.key.key_flags = + STA_KEY_FLG_NO_ENC | STA_KEY_FLG_INVALID; +- il->stations[sta_id].sta.key.key_offset = WEP_INVALID_OFFSET; ++ il->stations[sta_id].sta.key.key_offset = keyconf->hw_key_idx; + il->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; + il->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; + diff --git a/queue-3.4/mac80211-destroy-assoc_data-correctly-if-assoc-fails.patch b/queue-3.4/mac80211-destroy-assoc_data-correctly-if-assoc-fails.patch new file mode 100644 index 00000000000..08b7502d16f --- /dev/null +++ b/queue-3.4/mac80211-destroy-assoc_data-correctly-if-assoc-fails.patch @@ -0,0 +1,48 @@ +From 10a9109f2705fdc3caa94d768b2559587a9a050c Mon Sep 17 00:00:00 2001 +From: Eliad Peller +Date: Mon, 2 Jul 2012 14:42:03 +0300 +Subject: mac80211: destroy assoc_data correctly if assoc fails + +From: Eliad Peller + +commit 10a9109f2705fdc3caa94d768b2559587a9a050c upstream. + +If association failed due to internal error (e.g. no +supported rates IE), we call ieee80211_destroy_assoc_data() +with assoc=true, while we actually reject the association. + +This results in the BSSID not being zeroed out. + +After passing assoc=false, we no longer have to call +sta_info_destroy_addr() explicitly. While on it, move +the "associated" message after the assoc_success check. + +Signed-off-by: Eliad Peller +Reviewed-by: Johannes Berg +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + net/mac80211/mlme.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +--- a/net/mac80211/mlme.c ++++ b/net/mac80211/mlme.c +@@ -2183,15 +2183,13 @@ ieee80211_rx_mgmt_assoc_resp(struct ieee + sdata->name, mgmt->sa, status_code); + ieee80211_destroy_assoc_data(sdata, false); + } else { +- printk(KERN_DEBUG "%s: associated\n", sdata->name); +- + if (!ieee80211_assoc_success(sdata, *bss, mgmt, len)) { + /* oops -- internal error -- send timeout for now */ +- ieee80211_destroy_assoc_data(sdata, true); +- sta_info_destroy_addr(sdata, mgmt->bssid); ++ ieee80211_destroy_assoc_data(sdata, false); + cfg80211_put_bss(*bss); + return RX_MGMT_CFG80211_ASSOC_TIMEOUT; + } ++ printk(KERN_DEBUG "%s: associated\n", sdata->name); + + /* + * destroy assoc_data afterwards, as otherwise an idle diff --git a/queue-3.4/md-raid1-fix-use-after-free-bug-in-raid1-data-check-code.patch b/queue-3.4/md-raid1-fix-use-after-free-bug-in-raid1-data-check-code.patch new file mode 100644 index 00000000000..969074b9f80 --- /dev/null +++ b/queue-3.4/md-raid1-fix-use-after-free-bug-in-raid1-data-check-code.patch @@ -0,0 +1,53 @@ +From 2d4f4f3384d4ef4f7c571448e803a1ce721113d5 Mon Sep 17 00:00:00 2001 +From: NeilBrown +Date: Mon, 9 Jul 2012 11:34:13 +1000 +Subject: md/raid1: fix use-after-free bug in RAID1 data-check code. + +From: NeilBrown + +commit 2d4f4f3384d4ef4f7c571448e803a1ce721113d5 upstream. + +This bug has been present ever since data-check was introduce +in 2.6.16. However it would only fire if a data-check were +done on a degraded array, which was only possible if the array +has 3 or more devices. This is certainly possible, but is quite +uncommon. + +Since hot-replace was added in 3.3 it can happen more often as +the same condition can arise if not all possible replacements are +present. + +The problem is that as soon as we submit the last read request, the +'r1_bio' structure could be freed at any time, so we really should +stop looking at it. If the last device is being read from we will +stop looking at it. However if the last device is not due to be read +from, we will still check the bio pointer in the r1_bio, but the +r1_bio might already be free. + +So use the read_targets counter to make sure we stop looking for bios +to submit as soon as we have submitted them all. + +This fix is suitable for any -stable kernel since 2.6.16. + +Reported-by: Arnold Schulz +Signed-off-by: NeilBrown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/raid1.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/md/raid1.c ++++ b/drivers/md/raid1.c +@@ -2486,9 +2486,10 @@ static sector_t sync_request(struct mdde + */ + if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { + atomic_set(&r1_bio->remaining, read_targets); +- for (i = 0; i < conf->raid_disks * 2; i++) { ++ for (i = 0; i < conf->raid_disks * 2 && read_targets; i++) { + bio = r1_bio->bios[i]; + if (bio->bi_end_io == end_sync_read) { ++ read_targets--; + md_sync_acct(bio->bi_bdev, nr_sectors); + generic_make_request(bio); + } diff --git a/queue-3.4/media-dvb-core-release-semaphore-on-error-path-dvb_register_device.patch b/queue-3.4/media-dvb-core-release-semaphore-on-error-path-dvb_register_device.patch new file mode 100644 index 00000000000..c1e2f5691e3 --- /dev/null +++ b/queue-3.4/media-dvb-core-release-semaphore-on-error-path-dvb_register_device.patch @@ -0,0 +1,30 @@ +From 82163edcdfa4eb3d74516cc8e9f38dd3d039b67d Mon Sep 17 00:00:00 2001 +From: Santosh Nayak +Date: Sat, 23 Jun 2012 07:59:54 -0300 +Subject: media: dvb-core: Release semaphore on error path dvb_register_device() + +From: Santosh Nayak + +commit 82163edcdfa4eb3d74516cc8e9f38dd3d039b67d upstream. + +There is a missing "up_write()" here. Semaphore should be released +before returning error value. + +Signed-off-by: Santosh Nayak +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/dvb/dvb-core/dvbdev.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/media/dvb/dvb-core/dvbdev.c ++++ b/drivers/media/dvb/dvb-core/dvbdev.c +@@ -243,6 +243,7 @@ int dvb_register_device(struct dvb_adapt + if (minor == MAX_DVB_MINORS) { + kfree(dvbdevfops); + kfree(dvbdev); ++ up_write(&minor_rwsem); + mutex_unlock(&dvbdev_register_lock); + return -EINVAL; + } diff --git a/queue-3.4/mtd-nandsim-don-t-open-code-a-do_div-helper.patch b/queue-3.4/mtd-nandsim-don-t-open-code-a-do_div-helper.patch new file mode 100644 index 00000000000..1b1edb42050 --- /dev/null +++ b/queue-3.4/mtd-nandsim-don-t-open-code-a-do_div-helper.patch @@ -0,0 +1,92 @@ +From 596fd46268634082314b3af1ded4612e1b7f3f03 Mon Sep 17 00:00:00 2001 +From: Herton Ronaldo Krzesinski +Date: Wed, 16 May 2012 16:21:52 -0300 +Subject: mtd: nandsim: don't open code a do_div helper + +From: Herton Ronaldo Krzesinski + +commit 596fd46268634082314b3af1ded4612e1b7f3f03 upstream. + +We don't need to open code the divide function, just use div_u64 that +already exists and do the same job. While this is a straightforward +clean up, there is more to that, the real motivation for this. + +While building on a cross compiling environment in armel, using gcc +4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5), I was getting the following build +error: + +ERROR: "__aeabi_uldivmod" [drivers/mtd/nand/nandsim.ko] undefined! + +After investigating with objdump and hand built assembly version +generated with the compiler, I narrowed __aeabi_uldivmod as being +generated from the divide function. When nandsim.c is built with +-fno-inline-functions-called-once, that happens when +CONFIG_DEBUG_SECTION_MISMATCH is enabled, the do_div optimization in +arch/arm/include/asm/div64.h doesn't work as expected with the open +coded divide function: even if the do_div we are using doesn't have a +constant divisor, the compiler still includes the else parts of the +optimized do_div macro, and translates the divisions there to use +__aeabi_uldivmod, instead of only calling __do_div_asm -> __do_div64 and +optimizing/removing everything else out. + +So to reproduce, gcc 4.6 plus CONFIG_DEBUG_SECTION_MISMATCH=y and +CONFIG_MTD_NAND_NANDSIM=m should do it, building on armel. + +After this change, the compiler does the intended thing even with +-fno-inline-functions-called-once, and optimizes out as expected the +constant handling in the optimized do_div on arm. As this also avoids a +build issue, I'm marking for Stable, as I think is applicable for this +case. + +Signed-off-by: Herton Ronaldo Krzesinski +Acked-by: Nicolas Pitre +Signed-off-by: Artem Bityutskiy +Signed-off-by: David Woodhouse +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mtd/nand/nandsim.c | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +--- a/drivers/mtd/nand/nandsim.c ++++ b/drivers/mtd/nand/nandsim.c +@@ -28,7 +28,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +@@ -547,12 +547,6 @@ static char *get_partition_name(int i) + return kstrdup(buf, GFP_KERNEL); + } + +-static uint64_t divide(uint64_t n, uint32_t d) +-{ +- do_div(n, d); +- return n; +-} +- + /* + * Initialize the nandsim structure. + * +@@ -581,7 +575,7 @@ static int init_nandsim(struct mtd_info + ns->geom.oobsz = mtd->oobsize; + ns->geom.secsz = mtd->erasesize; + ns->geom.pgszoob = ns->geom.pgsz + ns->geom.oobsz; +- ns->geom.pgnum = divide(ns->geom.totsz, ns->geom.pgsz); ++ ns->geom.pgnum = div_u64(ns->geom.totsz, ns->geom.pgsz); + ns->geom.totszoob = ns->geom.totsz + (uint64_t)ns->geom.pgnum * ns->geom.oobsz; + ns->geom.secshift = ffs(ns->geom.secsz) - 1; + ns->geom.pgshift = chip->page_shift; +@@ -924,7 +918,7 @@ static int setup_wear_reporting(struct m + + if (!rptwear) + return 0; +- wear_eb_count = divide(mtd->size, mtd->erasesize); ++ wear_eb_count = div_u64(mtd->size, mtd->erasesize); + mem = wear_eb_count * sizeof(unsigned long); + if (mem / sizeof(unsigned long) != wear_eb_count) { + NS_ERR("Too many erase blocks for wear reporting\n"); diff --git a/queue-3.4/rpmsg-fix-dependency-on-initialization-order.patch b/queue-3.4/rpmsg-fix-dependency-on-initialization-order.patch new file mode 100644 index 00000000000..6b61fbc2af8 --- /dev/null +++ b/queue-3.4/rpmsg-fix-dependency-on-initialization-order.patch @@ -0,0 +1,37 @@ +From 9634252617441991b01dacaf4040866feecaf36f Mon Sep 17 00:00:00 2001 +From: Federico Fuga +Date: Mon, 16 Jul 2012 10:36:51 +0300 +Subject: rpmsg: fix dependency on initialization order + +From: Federico Fuga + +commit 9634252617441991b01dacaf4040866feecaf36f upstream. + +When rpmsg drivers are built into the kernel, they must not initialize +before the rpmsg bus does, otherwise they'd trigger a BUG() in +drivers/base/driver.c line 169 (driver_register()). + +To fix that, and to stop depending on arbitrary linkage ordering of +those built-in rpmsg drivers, we make the rpmsg bus initialize at +subsys_initcall. + +Signed-off-by: Federico Fuga +[ohad: rewrite the commit log] +Signed-off-by: Ohad Ben-Cohen +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/rpmsg/virtio_rpmsg_bus.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/rpmsg/virtio_rpmsg_bus.c ++++ b/drivers/rpmsg/virtio_rpmsg_bus.c +@@ -1085,7 +1085,7 @@ static int __init rpmsg_init(void) + + return ret; + } +-module_init(rpmsg_init); ++subsys_initcall(rpmsg_init); + + static void __exit rpmsg_fini(void) + { diff --git a/queue-3.4/rt2x00usb-fix-indexes-ordering-on-rx-queue-kick.patch b/queue-3.4/rt2x00usb-fix-indexes-ordering-on-rx-queue-kick.patch new file mode 100644 index 00000000000..bc248854233 --- /dev/null +++ b/queue-3.4/rt2x00usb-fix-indexes-ordering-on-rx-queue-kick.patch @@ -0,0 +1,49 @@ +From efd821182cec8c92babef6e00a95066d3252fda4 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 4 Jul 2012 13:10:02 +0200 +Subject: rt2x00usb: fix indexes ordering on RX queue kick + +From: Stanislaw Gruszka + +commit efd821182cec8c92babef6e00a95066d3252fda4 upstream. + +On rt2x00_dmastart() we increase index specified by Q_INDEX and on +rt2x00_dmadone() we increase index specified by Q_INDEX_DONE. So entries +between Q_INDEX_DONE and Q_INDEX are those we currently process in the +hardware. Entries between Q_INDEX and Q_INDEX_DONE are those we can +submit to the hardware. + +According to that fix rt2x00usb_kick_queue(), as we need to submit RX +entries that are not processed by the hardware. It worked before only +for empty queue, otherwise was broken. + +Note that for TX queues indexes ordering are ok. We need to kick entries +that have filled skb, but was not submitted to the hardware, i.e. +started from Q_INDEX_DONE and have ENTRY_DATA_PENDING bit set. + +From practical standpoint this fixes RX queue stall, usually reproducible +in AP mode, like for example reported here: +https://bugzilla.redhat.com/show_bug.cgi?id=828824 + +Reported-and-tested-by: Franco Miceli +Reported-and-tested-by: Tom Horsley +Signed-off-by: Stanislaw Gruszka +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/rt2x00/rt2x00usb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/rt2x00/rt2x00usb.c ++++ b/drivers/net/wireless/rt2x00/rt2x00usb.c +@@ -436,8 +436,8 @@ void rt2x00usb_kick_queue(struct data_qu + case QID_RX: + if (!rt2x00queue_full(queue)) + rt2x00queue_for_each_entry(queue, +- Q_INDEX_DONE, + Q_INDEX, ++ Q_INDEX_DONE, + NULL, + rt2x00usb_kick_rx_entry); + break; diff --git a/queue-3.4/sched-nohz-rewrite-and-fix-load-avg-computation-again.patch b/queue-3.4/sched-nohz-rewrite-and-fix-load-avg-computation-again.patch new file mode 100644 index 00000000000..a7d764a9f40 --- /dev/null +++ b/queue-3.4/sched-nohz-rewrite-and-fix-load-avg-computation-again.patch @@ -0,0 +1,456 @@ +From 5167e8d5417bf5c322a703d2927daec727ea40dd Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Fri, 22 Jun 2012 15:52:09 +0200 +Subject: sched/nohz: Rewrite and fix load-avg computation -- again + +From: Peter Zijlstra + +commit 5167e8d5417bf5c322a703d2927daec727ea40dd upstream. + +Thanks to Charles Wang for spotting the defects in the current code: + + - If we go idle during the sample window -- after sampling, we get a + negative bias because we can negate our own sample. + + - If we wake up during the sample window we get a positive bias + because we push the sample to a known active period. + +So rewrite the entire nohz load-avg muck once again, now adding +copious documentation to the code. + +Reported-and-tested-by: Doug Smythies +Reported-and-tested-by: Charles Wang +Signed-off-by: Peter Zijlstra +Cc: Linus Torvalds +Cc: Andrew Morton +Link: http://lkml.kernel.org/r/1340373782.18025.74.camel@twins +[ minor edits ] +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + include/linux/sched.h | 8 + + kernel/sched/core.c | 275 ++++++++++++++++++++++++++++++++++------------- + kernel/sched/idle_task.c | 1 + kernel/sched/sched.h | 2 + kernel/time/tick-sched.c | 2 + 5 files changed, 213 insertions(+), 75 deletions(-) + +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1933,6 +1933,14 @@ static inline int set_cpus_allowed_ptr(s + } + #endif + ++#ifdef CONFIG_NO_HZ ++void calc_load_enter_idle(void); ++void calc_load_exit_idle(void); ++#else ++static inline void calc_load_enter_idle(void) { } ++static inline void calc_load_exit_idle(void) { } ++#endif /* CONFIG_NO_HZ */ ++ + #ifndef CONFIG_CPUMASK_OFFSTACK + static inline int set_cpus_allowed(struct task_struct *p, cpumask_t new_mask) + { +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -2162,11 +2162,73 @@ unsigned long this_cpu_load(void) + } + + ++/* ++ * Global load-average calculations ++ * ++ * We take a distributed and async approach to calculating the global load-avg ++ * in order to minimize overhead. ++ * ++ * The global load average is an exponentially decaying average of nr_running + ++ * nr_uninterruptible. ++ * ++ * Once every LOAD_FREQ: ++ * ++ * nr_active = 0; ++ * for_each_possible_cpu(cpu) ++ * nr_active += cpu_of(cpu)->nr_running + cpu_of(cpu)->nr_uninterruptible; ++ * ++ * avenrun[n] = avenrun[0] * exp_n + nr_active * (1 - exp_n) ++ * ++ * Due to a number of reasons the above turns in the mess below: ++ * ++ * - for_each_possible_cpu() is prohibitively expensive on machines with ++ * serious number of cpus, therefore we need to take a distributed approach ++ * to calculating nr_active. ++ * ++ * \Sum_i x_i(t) = \Sum_i x_i(t) - x_i(t_0) | x_i(t_0) := 0 ++ * = \Sum_i { \Sum_j=1 x_i(t_j) - x_i(t_j-1) } ++ * ++ * So assuming nr_active := 0 when we start out -- true per definition, we ++ * can simply take per-cpu deltas and fold those into a global accumulate ++ * to obtain the same result. See calc_load_fold_active(). ++ * ++ * Furthermore, in order to avoid synchronizing all per-cpu delta folding ++ * across the machine, we assume 10 ticks is sufficient time for every ++ * cpu to have completed this task. ++ * ++ * This places an upper-bound on the IRQ-off latency of the machine. Then ++ * again, being late doesn't loose the delta, just wrecks the sample. ++ * ++ * - cpu_rq()->nr_uninterruptible isn't accurately tracked per-cpu because ++ * this would add another cross-cpu cacheline miss and atomic operation ++ * to the wakeup path. Instead we increment on whatever cpu the task ran ++ * when it went into uninterruptible state and decrement on whatever cpu ++ * did the wakeup. This means that only the sum of nr_uninterruptible over ++ * all cpus yields the correct result. ++ * ++ * This covers the NO_HZ=n code, for extra head-aches, see the comment below. ++ */ ++ + /* Variables and functions for calc_load */ + static atomic_long_t calc_load_tasks; + static unsigned long calc_load_update; + unsigned long avenrun[3]; +-EXPORT_SYMBOL(avenrun); ++EXPORT_SYMBOL(avenrun); /* should be removed */ ++ ++/** ++ * get_avenrun - get the load average array ++ * @loads: pointer to dest load array ++ * @offset: offset to add ++ * @shift: shift count to shift the result left ++ * ++ * These values are estimates at best, so no need for locking. ++ */ ++void get_avenrun(unsigned long *loads, unsigned long offset, int shift) ++{ ++ loads[0] = (avenrun[0] + offset) << shift; ++ loads[1] = (avenrun[1] + offset) << shift; ++ loads[2] = (avenrun[2] + offset) << shift; ++} + + static long calc_load_fold_active(struct rq *this_rq) + { +@@ -2183,6 +2245,9 @@ static long calc_load_fold_active(struct + return delta; + } + ++/* ++ * a1 = a0 * e + a * (1 - e) ++ */ + static unsigned long + calc_load(unsigned long load, unsigned long exp, unsigned long active) + { +@@ -2194,30 +2259,118 @@ calc_load(unsigned long load, unsigned l + + #ifdef CONFIG_NO_HZ + /* +- * For NO_HZ we delay the active fold to the next LOAD_FREQ update. ++ * Handle NO_HZ for the global load-average. ++ * ++ * Since the above described distributed algorithm to compute the global ++ * load-average relies on per-cpu sampling from the tick, it is affected by ++ * NO_HZ. ++ * ++ * The basic idea is to fold the nr_active delta into a global idle-delta upon ++ * entering NO_HZ state such that we can include this as an 'extra' cpu delta ++ * when we read the global state. ++ * ++ * Obviously reality has to ruin such a delightfully simple scheme: ++ * ++ * - When we go NO_HZ idle during the window, we can negate our sample ++ * contribution, causing under-accounting. ++ * ++ * We avoid this by keeping two idle-delta counters and flipping them ++ * when the window starts, thus separating old and new NO_HZ load. ++ * ++ * The only trick is the slight shift in index flip for read vs write. ++ * ++ * 0s 5s 10s 15s ++ * +10 +10 +10 +10 ++ * |-|-----------|-|-----------|-|-----------|-| ++ * r:0 0 1 1 0 0 1 1 0 ++ * w:0 1 1 0 0 1 1 0 0 ++ * ++ * This ensures we'll fold the old idle contribution in this window while ++ * accumlating the new one. ++ * ++ * - When we wake up from NO_HZ idle during the window, we push up our ++ * contribution, since we effectively move our sample point to a known ++ * busy state. ++ * ++ * This is solved by pushing the window forward, and thus skipping the ++ * sample, for this cpu (effectively using the idle-delta for this cpu which ++ * was in effect at the time the window opened). This also solves the issue ++ * of having to deal with a cpu having been in NOHZ idle for multiple ++ * LOAD_FREQ intervals. + * + * When making the ILB scale, we should try to pull this in as well. + */ +-static atomic_long_t calc_load_tasks_idle; ++static atomic_long_t calc_load_idle[2]; ++static int calc_load_idx; ++ ++static inline int calc_load_write_idx(void) ++{ ++ int idx = calc_load_idx; + +-void calc_load_account_idle(struct rq *this_rq) ++ /* ++ * See calc_global_nohz(), if we observe the new index, we also ++ * need to observe the new update time. ++ */ ++ smp_rmb(); ++ ++ /* ++ * If the folding window started, make sure we start writing in the ++ * next idle-delta. ++ */ ++ if (!time_before(jiffies, calc_load_update)) ++ idx++; ++ ++ return idx & 1; ++} ++ ++static inline int calc_load_read_idx(void) + { ++ return calc_load_idx & 1; ++} ++ ++void calc_load_enter_idle(void) ++{ ++ struct rq *this_rq = this_rq(); + long delta; + ++ /* ++ * We're going into NOHZ mode, if there's any pending delta, fold it ++ * into the pending idle delta. ++ */ + delta = calc_load_fold_active(this_rq); +- if (delta) +- atomic_long_add(delta, &calc_load_tasks_idle); ++ if (delta) { ++ int idx = calc_load_write_idx(); ++ atomic_long_add(delta, &calc_load_idle[idx]); ++ } + } + +-static long calc_load_fold_idle(void) ++void calc_load_exit_idle(void) + { +- long delta = 0; ++ struct rq *this_rq = this_rq(); ++ ++ /* ++ * If we're still before the sample window, we're done. ++ */ ++ if (time_before(jiffies, this_rq->calc_load_update)) ++ return; + + /* +- * Its got a race, we don't care... ++ * We woke inside or after the sample window, this means we're already ++ * accounted through the nohz accounting, so skip the entire deal and ++ * sync up for the next window. + */ +- if (atomic_long_read(&calc_load_tasks_idle)) +- delta = atomic_long_xchg(&calc_load_tasks_idle, 0); ++ this_rq->calc_load_update = calc_load_update; ++ if (time_before(jiffies, this_rq->calc_load_update + 10)) ++ this_rq->calc_load_update += LOAD_FREQ; ++} ++ ++static long calc_load_fold_idle(void) ++{ ++ int idx = calc_load_read_idx(); ++ long delta = 0; ++ ++ if (atomic_long_read(&calc_load_idle[idx])) ++ delta = atomic_long_xchg(&calc_load_idle[idx], 0); + + return delta; + } +@@ -2303,66 +2456,39 @@ static void calc_global_nohz(void) + { + long delta, active, n; + +- /* +- * If we crossed a calc_load_update boundary, make sure to fold +- * any pending idle changes, the respective CPUs might have +- * missed the tick driven calc_load_account_active() update +- * due to NO_HZ. +- */ +- delta = calc_load_fold_idle(); +- if (delta) +- atomic_long_add(delta, &calc_load_tasks); ++ if (!time_before(jiffies, calc_load_update + 10)) { ++ /* ++ * Catch-up, fold however many we are behind still ++ */ ++ delta = jiffies - calc_load_update - 10; ++ n = 1 + (delta / LOAD_FREQ); ++ ++ active = atomic_long_read(&calc_load_tasks); ++ active = active > 0 ? active * FIXED_1 : 0; ++ ++ avenrun[0] = calc_load_n(avenrun[0], EXP_1, active, n); ++ avenrun[1] = calc_load_n(avenrun[1], EXP_5, active, n); ++ avenrun[2] = calc_load_n(avenrun[2], EXP_15, active, n); + +- /* +- * It could be the one fold was all it took, we done! +- */ +- if (time_before(jiffies, calc_load_update + 10)) +- return; ++ calc_load_update += n * LOAD_FREQ; ++ } + + /* +- * Catch-up, fold however many we are behind still ++ * Flip the idle index... ++ * ++ * Make sure we first write the new time then flip the index, so that ++ * calc_load_write_idx() will see the new time when it reads the new ++ * index, this avoids a double flip messing things up. + */ +- delta = jiffies - calc_load_update - 10; +- n = 1 + (delta / LOAD_FREQ); +- +- active = atomic_long_read(&calc_load_tasks); +- active = active > 0 ? active * FIXED_1 : 0; +- +- avenrun[0] = calc_load_n(avenrun[0], EXP_1, active, n); +- avenrun[1] = calc_load_n(avenrun[1], EXP_5, active, n); +- avenrun[2] = calc_load_n(avenrun[2], EXP_15, active, n); +- +- calc_load_update += n * LOAD_FREQ; +-} +-#else +-void calc_load_account_idle(struct rq *this_rq) +-{ ++ smp_wmb(); ++ calc_load_idx++; + } ++#else /* !CONFIG_NO_HZ */ + +-static inline long calc_load_fold_idle(void) +-{ +- return 0; +-} +- +-static void calc_global_nohz(void) +-{ +-} +-#endif ++static inline long calc_load_fold_idle(void) { return 0; } ++static inline void calc_global_nohz(void) { } + +-/** +- * get_avenrun - get the load average array +- * @loads: pointer to dest load array +- * @offset: offset to add +- * @shift: shift count to shift the result left +- * +- * These values are estimates at best, so no need for locking. +- */ +-void get_avenrun(unsigned long *loads, unsigned long offset, int shift) +-{ +- loads[0] = (avenrun[0] + offset) << shift; +- loads[1] = (avenrun[1] + offset) << shift; +- loads[2] = (avenrun[2] + offset) << shift; +-} ++#endif /* CONFIG_NO_HZ */ + + /* + * calc_load - update the avenrun load estimates 10 ticks after the +@@ -2370,11 +2496,18 @@ void get_avenrun(unsigned long *loads, u + */ + void calc_global_load(unsigned long ticks) + { +- long active; ++ long active, delta; + + if (time_before(jiffies, calc_load_update + 10)) + return; + ++ /* ++ * Fold the 'old' idle-delta to include all NO_HZ cpus. ++ */ ++ delta = calc_load_fold_idle(); ++ if (delta) ++ atomic_long_add(delta, &calc_load_tasks); ++ + active = atomic_long_read(&calc_load_tasks); + active = active > 0 ? active * FIXED_1 : 0; + +@@ -2385,12 +2518,7 @@ void calc_global_load(unsigned long tick + calc_load_update += LOAD_FREQ; + + /* +- * Account one period with whatever state we found before +- * folding in the nohz state and ageing the entire idle period. +- * +- * This avoids loosing a sample when we go idle between +- * calc_load_account_active() (10 ticks ago) and now and thus +- * under-accounting. ++ * In case we idled for multiple LOAD_FREQ intervals, catch up in bulk. + */ + calc_global_nohz(); + } +@@ -2407,7 +2535,6 @@ static void calc_load_account_active(str + return; + + delta = calc_load_fold_active(this_rq); +- delta += calc_load_fold_idle(); + if (delta) + atomic_long_add(delta, &calc_load_tasks); + +@@ -2415,6 +2542,10 @@ static void calc_load_account_active(str + } + + /* ++ * End of global load-average stuff ++ */ ++ ++/* + * The exact cpuload at various idx values, calculated at every tick would be + * load = (2^idx - 1) / 2^idx * load + 1 / 2^idx * cur_load + * +--- a/kernel/sched/idle_task.c ++++ b/kernel/sched/idle_task.c +@@ -25,7 +25,6 @@ static void check_preempt_curr_idle(stru + static struct task_struct *pick_next_task_idle(struct rq *rq) + { + schedstat_inc(rq, sched_goidle); +- calc_load_account_idle(rq); + return rq->idle; + } + +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -940,8 +940,6 @@ static inline u64 sched_avg_period(void) + return (u64)sysctl_sched_time_avg * NSEC_PER_MSEC / 2; + } + +-void calc_load_account_idle(struct rq *this_rq); +- + #ifdef CONFIG_SCHED_HRTICK + + /* +--- a/kernel/time/tick-sched.c ++++ b/kernel/time/tick-sched.c +@@ -401,6 +401,7 @@ static void tick_nohz_stop_sched_tick(st + */ + if (!ts->tick_stopped) { + select_nohz_load_balancer(1); ++ calc_load_enter_idle(); + + ts->idle_tick = hrtimer_get_expires(&ts->sched_timer); + ts->tick_stopped = 1; +@@ -591,6 +592,7 @@ void tick_nohz_idle_exit(void) + account_idle_ticks(ticks); + #endif + ++ calc_load_exit_idle(); + touch_softlockup_watchdog(); + /* + * Cancel the scheduled timer and restore the tick diff --git a/queue-3.4/series b/queue-3.4/series index ef73d03020c..e9468866d5b 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -1,3 +1,29 @@ remove-easily-user-triggerable-bug-from-generic_setlease.patch media-cx231xx-don-t-dma-to-random-addresses.patch hwmon-it87-preserve-configuration-register-bits-on-init.patch +block-fix-infinite-loop-in-__getblk_slow.patch +media-dvb-core-release-semaphore-on-error-path-dvb_register_device.patch +mtd-nandsim-don-t-open-code-a-do_div-helper.patch +md-raid1-fix-use-after-free-bug-in-raid1-data-check-code.patch +arm-samsung-fix-race-in-s3c_adc_start-for-adc.patch +acpica-fix-possible-fault-in-return-package-object-repair-code.patch +cpufreq-acpi-fix-not-loading-acpi-cpufreq-driver-regression.patch +sched-nohz-rewrite-and-fix-load-avg-computation-again.patch +intel_ips-blacklist-hp-probook-laptops.patch +fifo-do-not-restart-open-if-it-already-found-a-partner.patch +rt2x00usb-fix-indexes-ordering-on-rx-queue-kick.patch +e1000e-correct-link-check-logic-for-82571-serdes.patch +iwlegacy-always-monitor-for-stuck-queues.patch +iwlegacy-don-t-mess-up-the-scd-when-removing-a-key.patch +rpmsg-fix-dependency-on-initialization-order.patch +mac80211-destroy-assoc_data-correctly-if-assoc-fails.patch +stmmac-fix-for-nfs-hang-on-multiple-reboot.patch +bonding-debugfs-and-network-namespaces-are-incompatible.patch +bonding-manage-proc-net-bonding-entries-from-the-netdev-events.patch +input-bcm5974-add-support-for-2012-macbook-pro-retina.patch +input-xpad-handle-all-variations-of-mad-catz-beat-pad.patch +input-xpad-add-signature-for-razer-onza-tournament-edition.patch +input-xpad-add-andamiro-pump-it-up-pad.patch +hid-add-support-for-2012-macbook-pro-retina.patch +clk-check-parent-for-null-in-clk_change_rate.patch +cfg80211-check-iface-combinations-only-when-iface-is-running.patch diff --git a/queue-3.4/stmmac-fix-for-nfs-hang-on-multiple-reboot.patch b/queue-3.4/stmmac-fix-for-nfs-hang-on-multiple-reboot.patch new file mode 100644 index 00000000000..ae6194fdcd1 --- /dev/null +++ b/queue-3.4/stmmac-fix-for-nfs-hang-on-multiple-reboot.patch @@ -0,0 +1,54 @@ +From 8e83989106562326bfd6aaf92174fe138efd026b Mon Sep 17 00:00:00 2001 +From: Deepak Sikri +Date: Sun, 8 Jul 2012 21:14:45 +0000 +Subject: stmmac: Fix for nfs hang on multiple reboot + +From: Deepak Sikri + +commit 8e83989106562326bfd6aaf92174fe138efd026b upstream. + +It was observed that during multiple reboots nfs hangs. The status of +receive descriptors shows that all the descriptors were in control of +CPU, and none were assigned to DMA. +Also the DMA status register confirmed that the Rx buffer is +unavailable. + +This patch adds the fix for the same by adding the memory barriers to +ascertain that the all instructions before enabling the Rx or Tx DMA are +completed which involves the proper setting of the ownership bit in DMA +descriptors. + +Signed-off-by: Deepak Sikri +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -1158,6 +1158,7 @@ static netdev_tx_t stmmac_xmit(struct sk + priv->hw->desc->prepare_tx_desc(desc, 0, len, csum_insertion); + wmb(); + priv->hw->desc->set_tx_owner(desc); ++ wmb(); + } + + /* Interrupt on completition only for the latest segment */ +@@ -1173,6 +1174,7 @@ static netdev_tx_t stmmac_xmit(struct sk + + /* To avoid raise condition */ + priv->hw->desc->set_tx_owner(first); ++ wmb(); + + priv->cur_tx++; + +@@ -1236,6 +1238,7 @@ static inline void stmmac_rx_refill(stru + } + wmb(); + priv->hw->desc->set_rx_owner(p + entry); ++ wmb(); + } + } +