From: Greg Kroah-Hartman Date: Fri, 3 Oct 2014 19:28:11 +0000 (-0700) Subject: 3.14-stable patches X-Git-Tag: v3.16.4~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=81ae87003992cb96bab9199edbfe4cadd17dfb50;p=thirdparty%2Fkernel%2Fstable-queue.git 3.14-stable patches added patches: brcmfmac-handle-if-event-for-p2p_device-interface.patch sched-fix-unreleased-llc_shared_mask-bit-during-cpu-hotplug.patch --- 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 index 00000000000..c84551d71f1 --- /dev/null +++ b/queue-3.14/brcmfmac-handle-if-event-for-p2p_device-interface.patch @@ -0,0 +1,80 @@ +From 87c4790330810fe5caf0172d9320cf24ef19cebe Mon Sep 17 00:00:00 2001 +From: Arend van Spriel +Date: Fri, 12 Sep 2014 16:19:30 +0200 +Subject: brcmfmac: handle IF event for P2P_DEVICE interface + +From: Arend van Spriel + +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 + 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 +Reviewed-by: Franky (Zhenhui) Lin +Reviewed-by: Daniel (Deognyoun) Kim +Reviewed-by: Pieter-Paul Giesberts +Signed-off-by: Arend van Spriel +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..12d8c4e9e3d --- /dev/null +++ b/queue-3.14/sched-fix-unreleased-llc_shared_mask-bit-during-cpu-hotplug.patch @@ -0,0 +1,120 @@ +From 03bd4e1f7265548832a76e7919a81f3137c44fd1 Mon Sep 17 00:00:00 2001 +From: Wanpeng Li +Date: Wed, 24 Sep 2014 16:38:05 +0800 +Subject: sched: Fix unreleased llc_shared_mask bit during CPU hotplug + +From: Wanpeng Li + +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 +Tested-by: Linn Crosetto +Reviewed-by: Borislav Petkov +Reviewed-by: Toshi Kani +Reviewed-by: Yasuaki Ishimatsu +Cc: David Rientjes +Cc: Prarit Bhargava +Cc: Steven Rostedt +Cc: Peter Zijlstra +Link: http://lkml.kernel.org/r/1411547885-48165-1-git-send-email-wanpeng.li@linux.intel.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + 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; diff --git a/queue-3.14/series b/queue-3.14/series index 5d3fdfe8f14..1c6bb7ee210 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -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