]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 3 Oct 2014 19:28:11 +0000 (12:28 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 3 Oct 2014 19:28:11 +0000 (12:28 -0700)
added patches:
brcmfmac-handle-if-event-for-p2p_device-interface.patch
sched-fix-unreleased-llc_shared_mask-bit-during-cpu-hotplug.patch

queue-3.14/brcmfmac-handle-if-event-for-p2p_device-interface.patch [new file with mode: 0644]
queue-3.14/sched-fix-unreleased-llc_shared_mask-bit-during-cpu-hotplug.patch [new file with mode: 0644]
queue-3.14/series

diff --git a/queue-3.14/brcmfmac-handle-if-event-for-p2p_device-interface.patch b/queue-3.14/brcmfmac-handle-if-event-for-p2p_device-interface.patch
new file mode 100644 (file)
index 0000000..c84551d
--- /dev/null
@@ -0,0 +1,80 @@
+From 87c4790330810fe5caf0172d9320cf24ef19cebe Mon Sep 17 00:00:00 2001
+From: Arend van Spriel <arend@broadcom.com>
+Date: Fri, 12 Sep 2014 16:19:30 +0200
+Subject: brcmfmac: handle IF event for P2P_DEVICE interface
+
+From: Arend van Spriel <arend@broadcom.com>
+
+commit 87c4790330810fe5caf0172d9320cf24ef19cebe upstream.
+
+The firmware notifies about interface changes through the IF event
+which has a NO_IF flag that means host can ignore the event. This
+behaviour was introduced in the driver by:
+
+  commit 2ee8382fc6c763c76396a6aaff77a27089eed3aa
+  Author: Arend van Spriel <arend@broadcom.com>
+  Date:   Sat Aug 10 12:27:24 2013 +0200
+
+      brcmfmac: ignore IF event if firmware indicates it
+
+It turns out that the IF event for the P2P_DEVICE also has this
+flag set, but the event should not be ignored in this scenario.
+The mentioned commit caused a regression in 3.12 kernel in creation
+of the P2P_DEVICE interface.
+
+Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
+Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
+Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/brcm80211/brcmfmac/fweh.c |   12 +++++++++---
+ drivers/net/wireless/brcm80211/brcmfmac/fweh.h |    2 ++
+ 2 files changed, 11 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
++++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
+@@ -185,7 +185,13 @@ static void brcmf_fweh_handle_if_event(s
+                 ifevent->action, ifevent->ifidx, ifevent->bssidx,
+                 ifevent->flags, ifevent->role);
+-      if (ifevent->flags & BRCMF_E_IF_FLAG_NOIF) {
++      /* The P2P Device interface event must not be ignored
++       * contrary to what firmware tells us. The only way to
++       * distinguish the P2P Device is by looking at the ifidx
++       * and bssidx received.
++       */
++      if (!(ifevent->ifidx == 0 && ifevent->bssidx == 1) &&
++          (ifevent->flags & BRCMF_E_IF_FLAG_NOIF)) {
+               brcmf_dbg(EVENT, "event can be ignored\n");
+               return;
+       }
+@@ -210,12 +216,12 @@ static void brcmf_fweh_handle_if_event(s
+                               return;
+       }
+-      if (ifevent->action == BRCMF_E_IF_CHANGE)
++      if (ifp && ifevent->action == BRCMF_E_IF_CHANGE)
+               brcmf_fws_reset_interface(ifp);
+       err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data);
+-      if (ifevent->action == BRCMF_E_IF_DEL) {
++      if (ifp && ifevent->action == BRCMF_E_IF_DEL) {
+               brcmf_fws_del_interface(ifp);
+               brcmf_del_if(drvr, ifevent->bssidx);
+       }
+--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
++++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
+@@ -167,6 +167,8 @@ enum brcmf_fweh_event_code {
+ #define BRCMF_E_IF_ROLE_STA                   0
+ #define BRCMF_E_IF_ROLE_AP                    1
+ #define BRCMF_E_IF_ROLE_WDS                   2
++#define BRCMF_E_IF_ROLE_P2P_GO                        3
++#define BRCMF_E_IF_ROLE_P2P_CLIENT            4
+ /**
+  * definitions for event packet validation.
diff --git a/queue-3.14/sched-fix-unreleased-llc_shared_mask-bit-during-cpu-hotplug.patch b/queue-3.14/sched-fix-unreleased-llc_shared_mask-bit-during-cpu-hotplug.patch
new file mode 100644 (file)
index 0000000..12d8c4e
--- /dev/null
@@ -0,0 +1,120 @@
+From 03bd4e1f7265548832a76e7919a81f3137c44fd1 Mon Sep 17 00:00:00 2001
+From: Wanpeng Li <wanpeng.li@linux.intel.com>
+Date: Wed, 24 Sep 2014 16:38:05 +0800
+Subject: sched: Fix unreleased llc_shared_mask bit during CPU hotplug
+
+From: Wanpeng Li <wanpeng.li@linux.intel.com>
+
+commit 03bd4e1f7265548832a76e7919a81f3137c44fd1 upstream.
+
+The following bug can be triggered by hot adding and removing a large number of
+xen domain0's vcpus repeatedly:
+
+       BUG: unable to handle kernel NULL pointer dereference at 0000000000000004 IP: [..] find_busiest_group
+       PGD 5a9d5067 PUD 13067 PMD 0
+       Oops: 0000 [#3] SMP
+       [...]
+       Call Trace:
+       load_balance
+       ? _raw_spin_unlock_irqrestore
+       idle_balance
+       __schedule
+       schedule
+       schedule_timeout
+       ? lock_timer_base
+       schedule_timeout_uninterruptible
+       msleep
+       lock_device_hotplug_sysfs
+       online_store
+       dev_attr_store
+       sysfs_write_file
+       vfs_write
+       SyS_write
+       system_call_fastpath
+
+Last level cache shared mask is built during CPU up and the
+build_sched_domain() routine takes advantage of it to setup
+the sched domain CPU topology.
+
+However, llc_shared_mask is not released during CPU disable,
+which leads to an invalid sched domainCPU topology.
+
+This patch fix it by releasing the llc_shared_mask correctly
+during CPU disable.
+
+Yasuaki also reported that this can happen on real hardware:
+
+  https://lkml.org/lkml/2014/7/22/1018
+
+His case is here:
+
+       ==
+       Here is an example on my system.
+       My system has 4 sockets and each socket has 15 cores and HT is
+       enabled. In this case, each core of sockes is numbered as
+       follows:
+
+                | CPU#
+       Socket#0 | 0-14 , 60-74
+       Socket#1 | 15-29, 75-89
+       Socket#2 | 30-44, 90-104
+       Socket#3 | 45-59, 105-119
+
+       Then llc_shared_mask of CPU#30 has 0x3fff80000001fffc0000000.
+
+       It means that last level cache of Socket#2 is shared with
+       CPU#30-44 and 90-104.
+
+       When hot-removing socket#2 and #3, each core of sockets is
+       numbered as follows:
+
+                | CPU#
+       Socket#0 | 0-14 , 60-74
+       Socket#1 | 15-29, 75-89
+
+       But llc_shared_mask is not cleared. So llc_shared_mask of CPU#30
+       remains having 0x3fff80000001fffc0000000.
+
+       After that, when hot-adding socket#2 and #3, each core of
+       sockets is numbered as follows:
+
+                | CPU#
+       Socket#0 | 0-14 , 60-74
+       Socket#1 | 15-29, 75-89
+       Socket#2 | 30-59
+       Socket#3 | 90-119
+
+       Then llc_shared_mask of CPU#30 becomes
+       0x3fff8000fffffffc0000000. It means that last level cache of
+       Socket#2 is shared with CPU#30-59 and 90-104. So the mask has
+       the wrong value.
+
+Signed-off-by: Wanpeng Li <wanpeng.li@linux.intel.com>
+Tested-by: Linn Crosetto <linn@hp.com>
+Reviewed-by: Borislav Petkov <bp@suse.de>
+Reviewed-by: Toshi Kani <toshi.kani@hp.com>
+Reviewed-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
+Cc: David Rientjes <rientjes@google.com>
+Cc: Prarit Bhargava <prarit@redhat.com>
+Cc: Steven Rostedt <srostedt@redhat.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Link: http://lkml.kernel.org/r/1411547885-48165-1-git-send-email-wanpeng.li@linux.intel.com
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/kernel/smpboot.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/arch/x86/kernel/smpboot.c
++++ b/arch/x86/kernel/smpboot.c
+@@ -1287,6 +1287,9 @@ static void remove_siblinginfo(int cpu)
+       for_each_cpu(sibling, cpu_sibling_mask(cpu))
+               cpumask_clear_cpu(cpu, cpu_sibling_mask(sibling));
++      for_each_cpu(sibling, cpu_llc_shared_mask(cpu))
++              cpumask_clear_cpu(cpu, cpu_llc_shared_mask(sibling));
++      cpumask_clear(cpu_llc_shared_mask(cpu));
+       cpumask_clear(cpu_sibling_mask(cpu));
+       cpumask_clear(cpu_core_mask(cpu));
+       c->phys_proc_id = 0;
index 5d3fdfe8f146084cb42e8e51e07a04929522110a..1c6bb7ee210a2b172148e762513aa5517fcedca5 100644 (file)
@@ -186,3 +186,5 @@ nilfs2-fix-data-loss-with-mmap.patch
 ocfs2-dlm-do-not-get-resource-spinlock-if-lockres-is-new.patch
 mm-slab-initialize-object-alignment-on-cache-creation.patch
 mm-softdirty-keep-bit-when-zapping-file-pte.patch
+sched-fix-unreleased-llc_shared_mask-bit-during-cpu-hotplug.patch
+brcmfmac-handle-if-event-for-p2p_device-interface.patch