4.8.11-stable review
Greg Kroah-Hartman
maintainercover 4.8.11-stable review
This is the start of the stable review cycle for the 4.8.11 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Nov 26 14:54:42 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.8.11-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.8.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.8.11-rc1
Phil Reid <[email protected]>
gpio: pca953x: Fix corruption of other gpios in set_multiple.
Phil Reid <[email protected]>
gpio: pca953x: Move memcpy into mutex lock for set multiple
Anders K. Pedersen <[email protected]>
netfilter: nft_dynset: fix element timeout for HZ != 1000
Mark Bloch <[email protected]>
IB/cm: Mark stale CM id's whenever the mad agent was unregistered
Tariq Toukan <[email protected]>
IB/uverbs: Fix leak of XRC target QPs
Dennis Dalessandro <[email protected]>
IB/hfi1: Remove incorrect IS_ERR check
Mark Bloch <[email protected]>
IB/core: Avoid unsigned int overflow in sg_alloc_table
Eli Cohen <[email protected]>
IB/mlx5: Fix NULL pointer dereference on debug print
Eli Cohen <[email protected]>
IB/mlx5: Fix fatal error dispatching
Majd Dibbiny <[email protected]>
IB/mlx5: Fix memory leak in query device
Daniel Jurgens <[email protected]>
IB/mlx5: Use cache line size to select CQE stride
Maor Gottlieb <[email protected]>
IB/mlx5: Validate requested RQT size
Matan Barak <[email protected]>
IB/mlx4: Fix create CQ error flow
Daniel Jurgens <[email protected]>
IB/mlx4: Check gid_index return value
Yonatan Cohen <[email protected]>
IB/rxe: Clear queue buffer when modifying QP to reset
Yonatan Cohen <[email protected]>
IB/rxe: Fix handling of erroneous WR
Yonatan Cohen <[email protected]>
IB/rxe: Fix kernel panic in UDP tunnel with GRO and RX checksum
Yonatan Cohen <[email protected]>
IB/rxe: Update qp state for user query
Namhyung Kim <[email protected]>
perf hists: Fix column length on --hierarchy
Brian Norris <[email protected]>
PM / sleep: don't suspend parent when async child suspend_{noirq, late} fails
Johan Hovold <[email protected]>
PM / sleep: fix device reference leak in test_suspend
Johan Hovold <[email protected]>
uwb: fix device reference leaks
Scott Mayhew <[email protected]>
sunrpc: svc_age_temp_xprts_now should not call setsockopt non-tcp transports
Johan Hovold <[email protected]>
mfd: core: Fix device reference leak in mfd_clone_cell
Sara Sharon <[email protected]>
iwlwifi: mvm: wake the wait queue when the RX sync counter is zero
Luca Coelho <[email protected]>
iwlwifi: mvm: fix d3_test with unified D0/D3 images
Luca Coelho <[email protected]>
iwlwifi: mvm: fix netdetect starting/stopping for unified images
Johannes Berg <[email protected]>
iwlwifi: pcie: mark command queue lock with separate lockdep class
Luca Coelho <[email protected]>
iwlwifi: pcie: fix SPLC structure parsing
Lokesh Vutla <[email protected]>
rtc: omap: Fix selecting external osc
Emil Lundmark <[email protected]>
clk: imx: fix integer overflow in AV PLL round rate
Wei Yongjun <[email protected]>
clk: mmp: mmp2: fix return value check in mmp2_clk_init()
Wei Yongjun <[email protected]>
clk: mmp: pxa168: fix return value check in pxa168_clk_init()
Wei Yongjun <[email protected]>
clk: mmp: pxa910: fix return value check in pxa910_clk_init()
Michael S. Tsirkin <[email protected]>
virtio-net: drop legacy features in virtio 1 mode
Ville Syrjälä <[email protected]>
drm/i915: Assume non-DP++ port if dvo_port is HDMI and there's no AUX ch specified in the VBT
Ville Syrjälä <[email protected]>
drm/i915: Refresh that status of MST capable connectors in ->detect()
Mario Kleiner <[email protected]>
drm/amdgpu: Attach exclusive fence to prime exported bo's. (v5)
Benjamin Herrenschmidt <[email protected]>
powerpc/64: Fix setting of AIL in hypervisor mode
Sven Ebenfeld <[email protected]>
crypto: caam - do not register AES-XTS mode on LP units
Fabio Estevam <[email protected]>
ARM: dts: imx53-qsb: Fix regulator constraints
Theodore Ts'o <[email protected]>
ext4: sanity check the block and cluster size at mount time
Borislav Petkov <[email protected]>
kbuild: Steal gcc's pie from the very beginning
Sebastian Andrzej Siewior <[email protected]>
x86/kexec: add -fno-PIE
Sebastian Andrzej Siewior <[email protected]>
scripts/has-stack-protector: add -fno-PIE
Sebastian Andrzej Siewior <[email protected]>
kbuild: add -fno-PIE
Linus Torvalds <[email protected]>
Disable the __builtin_return_address() warning globally after all
Alex Hemme <[email protected]>
i2c: i2c-mux-pca954x: fix deselect enabling for device-tree
Linus Walleij <[email protected]>
i2c: mux: fix up dependencies
Takashi Iwai <[email protected]>
ALSA: hda - Fix mic regression by ASRock mobo fixup
Hui Wang <[email protected]>
ALSA: hda - add a new condition to check if it is thinkpad
Takashi Iwai <[email protected]>
ALSA: usb-audio: Fix use-after-free of usb_device at disconnect
Linus Walleij <[email protected]>
gpio: do not double-check direction on sleeping chips
Oliver Hartkopp <[email protected]>
can: bcm: fix warning in bcm_connect/proc_register
Linus Walleij <[email protected]>
mfd: stmpe: Fix RESET regression on STMPE2401
Azhar Shaikh <[email protected]>
mfd: intel-lpss: Do not put device in reset state on suspend
Ira Weiny <[email protected]>
IB/hfi1: Fix rnr_timer addition
Dennis Dalessandro <[email protected]>
IB/rdmavt: rdmavt can handle non aligned page maps
Miklos Szeredi <[email protected]>
fuse: fix fuse_write_end() if zero bytes were copied
Thomas Gleixner <[email protected]>
genirq: Use irq type from irqdata instead of irqdesc
Steven Rostedt (Red Hat) <[email protected]>
ftrace: Add more checks for FTRACE_FL_DISABLED in processing ip records
Alexei Starovoitov <[email protected]>
ftrace: Ignore FTRACE_FL_DISABLED while walking dyn_ftrace records
Wei Huang <[email protected]>
KVM: arm64: Fix the issues when guest PMCCFILTR is configured
Wei Huang <[email protected]>
arm64: KVM: pmu: Fix AArch32 cycle counter access
Ignacio Alvarado <[email protected]>
KVM: Disable irq while unregistering user notifier
Paolo Bonzini <[email protected]>
KVM: x86: fix missed SRCU usage in kvm_lapic_set_vapic_addr
Yazen Ghannam <[email protected]>
x86/cpu/AMD: Fix cpu_llc_id for AMD Fam17h systems
-------------
Diffstat:
Makefile | 10 +- arch/arm/boot/dts/imx53-qsb.dts | 14 +-- arch/arm64/include/asm/perf_event.h | 10 +- arch/arm64/kernel/perf_event.c | 10 +- arch/arm64/kvm/sys_regs.c | 10 +- arch/powerpc/kernel/setup_64.c | 20 ++-- arch/x86/kernel/cpu/amd.c | 6 +- arch/x86/kvm/x86.c | 16 ++- arch/x86/purgatory/Makefile | 1 + drivers/base/power/main.c | 8 +- drivers/clk/imx/clk-pllv3.c | 8 +- drivers/clk/mmp/clk-of-mmp2.c | 2 +- drivers/clk/mmp/clk-of-pxa168.c | 2 +- drivers/clk/mmp/clk-of-pxa910.c | 4 +- drivers/crypto/caam/caamalg.c | 9 ++ drivers/gpio/gpio-pca953x.c | 3 +- drivers/gpio/gpiolib.c | 7 +- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 20 +++- drivers/gpu/drm/i915/intel_bios.c | 30 ++++-- drivers/gpu/drm/i915/intel_dp.c | 10 -- drivers/gpu/drm/i915/intel_vbt_defs.h | 3 +- drivers/i2c/Kconfig | 1 - drivers/i2c/muxes/Kconfig | 1 + drivers/i2c/muxes/i2c-mux-pca954x.c | 4 +- drivers/infiniband/core/cm.c | 126 +++++++++++++++++++--- drivers/infiniband/core/umem.c | 2 +- drivers/infiniband/core/uverbs_main.c | 7 +- drivers/infiniband/hw/hfi1/rc.c | 2 +- drivers/infiniband/hw/hfi1/user_sdma.c | 2 +- drivers/infiniband/hw/mlx4/ah.c | 5 +- drivers/infiniband/hw/mlx4/cq.c | 5 +- drivers/infiniband/hw/mlx5/cq.c | 3 +- drivers/infiniband/hw/mlx5/main.c | 11 +- drivers/infiniband/hw/mlx5/qp.c | 12 ++- drivers/infiniband/sw/rdmavt/dma.c | 3 - drivers/infiniband/sw/rxe/rxe_net.c | 8 +- drivers/infiniband/sw/rxe/rxe_qp.c | 2 + drivers/infiniband/sw/rxe/rxe_queue.c | 9 ++ drivers/infiniband/sw/rxe/rxe_queue.h | 2 + drivers/infiniband/sw/rxe/rxe_req.c | 21 ++-- drivers/mfd/intel-lpss.c | 3 - drivers/mfd/mfd-core.c | 2 + drivers/mfd/stmpe.c | 2 + drivers/net/virtio_net.c | 30 ++++-- drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 44 ++++++-- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 3 +- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 1 + drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 1 + drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 3 +- drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 33 ++++-- drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 79 ++++++++------ drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 8 ++ drivers/rtc/rtc-omap.c | 6 +- drivers/uwb/lc-rc.c | 16 ++- drivers/uwb/pal.c | 2 + fs/ext4/ext4.h | 1 + fs/ext4/super.c | 17 ++- fs/fuse/file.c | 6 ++ include/linux/sunrpc/svc_xprt.h | 1 + kernel/irq/manage.c | 4 +- kernel/power/suspend_test.c | 4 +- kernel/trace/Makefile | 4 - kernel/trace/ftrace.c | 24 ++++- mm/Makefile | 3 - net/can/bcm.c | 32 ++++-- net/netfilter/nft_dynset.c | 6 +- net/sunrpc/svc_xprt.c | 11 +- net/sunrpc/svcsock.c | 21 ++++ net/sunrpc/xprtrdma/svc_rdma_transport.c | 6 ++ scripts/gcc-x86_64-has-stack-protector.sh | 2 +- sound/pci/hda/patch_realtek.c | 2 - sound/pci/hda/thinkpad_helper.c | 3 +- sound/usb/card.c | 3 +- tools/perf/util/hist.c | 12 +-- virt/kvm/arm/pmu.c | 8 +- 77 files changed, 596 insertions(+), 239 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/67 x86/cpu/AMD: Fix cpu_llc_id for AMD Fam17h systems
4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yazen Ghannam <[email protected]>
commit b0b6e86846093c5f8820386bc01515f857dd8faa upstream.
cpu_llc_id (Last Level Cache ID) derivation on AMD Fam17h has an underflow bug when extracting the socket_id value. It starts from 0 so subtracting 1 from it will result in an invalid value. This breaks scheduling topology later on since the cpu_llc_id will be incorrect.
For example, the the cpu_llc_id of the *other* CPU in the loops in set_cpu_sibling_map() underflows and we're generating the funniest thread_siblings masks and then when I run 8 threads of nbench, they get spread around the LLC domains in a very strange pattern which doesn't give you the normal scheduling spread one would expect for performance.
Other things like EDAC use cpu_llc_id so they will be b0rked too.
So, the APIC ID is preset in APICx020 for bits 3 and above: they contain the core complex, node and socket IDs.
The LLC is at the core complex level so we can find a unique cpu_llc_id by right shifting the APICID by 3 because then the least significant bit will be the Core Complex ID.
--- arch/x86/kernel/cpu/amd.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
arch/x86/kernel/cpu/amd.c +1 -5
@@ -347,7 +347,6 @@ static void amd_detect_cmp(struct cpuinf#ifdef CONFIG_SMP unsigned bits;int cpu =smp_processor_id (); -unsigned int socket_id, core_complex_id; bits = c->x86_coreid_bits;/* Low order bits define the core id (index of core in socket) */
@@ -365,10 +364,7 @@ static void amd_detect_cmp(struct cpuinfif (c->x86 !=0x17 || !cpuid_edx (0x80000006 ))return ; - socket_id = (c->apicid >> bits) -1 ; - core_complex_id = (c->apicid & ((1 << bits) -1 )) >>3 ; - -per_cpu (cpu_llc_id, cpu) = (socket_id <<3 ) | core_complex_id; +per_cpu (cpu_llc_id, cpu) = c->apicid >>3 ;#endif }
Greg Kroah-Hartman
maintainerPATCH 4/67 arm64: KVM: pmu: Fix AArch32 cycle counter access
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Huang <[email protected]>
commit 9e3f7a29694049edd728e2400ab57ad7553e5aa9 upstream.
We're missing the handling code for the cycle counter accessed from a 32bit guest, leading to unexpected results.
--- arch/arm64/kvm/sys_regs.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/arm64/kvm/sys_regs.c +8 -2
@@ -602,8 +602,14 @@ static bool access_pmu_evcntr(struct kvm idx =ARMV8_PMU_CYCLE_IDX ; }else { -BUG (); +return false; } + }else if (r->CRn ==0 && r->CRm ==9 ) { +/* PMCCNTR */ +if (pmu_access_event_counter_el0_disabled (vcpu)) +return false; + + idx =ARMV8_PMU_CYCLE_IDX ; }else if (r->CRn ==14 && (r->CRm &12 ) ==8 ) {/* PMEVCNTRn_EL0 */ if (pmu_access_event_counter_el0_disabled (vcpu))
@@ -611,7 +617,7 @@ static bool access_pmu_evcntr(struct kvm idx = ((r->CRm &3 ) <<3 ) | (r->Op2 &7 ); }else { -BUG (); +return false; }if (!pmu_counter_idx_valid (vcpu, idx))
Greg Kroah-Hartman
maintainerPATCH 5/67 KVM: arm64: Fix the issues when guest PMCCFILTR is configured
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Huang <[email protected]>
commit b112c84a6ff035271d41d548c10215f18443d6a6 upstream.
KVM calls kvm_pmu_set_counter_event_type() when PMCCFILTR is configured. But this function can't deals with PMCCFILTR correctly because the evtCount bits of PMCCFILTR, which is reserved 0, conflits with the SW_INCR event type of other PMXEVTYPER<n> registers. To fix it, when eventsel == 0, this function shouldn't return immediately; instead it needs to check further if select_idx is ARMV8_PMU_CYCLE_IDX.
Another issue is that KVM shouldn't copy the eventsel bits of PMCCFILTER blindly to attr.config. Instead it ought to convert the request to the "cpu cycle" event type (i.e. 0x11).
To support this patch and to prevent duplicated definitions, a limited set of ARMv8 perf event types were relocated from perf_event.c to asm/perf_event.h.
--- arch/arm64/include/asm/perf_event.h | 10 +++++++++- arch/arm64/kernel/perf_event.c | 10 +--------- virt/kvm/arm/pmu.c | 8 +++++--- 3 files changed, 15 insertions(+), 13 deletions(-)
arch/arm64/include/asm/perf_event.h +9 -1
@@ -46,7 +46,15 @@#define ARMV8_PMU_EVTYPE_MASK 0xc800ffff/* Mask for writable bits */ #define ARMV8_PMU_EVTYPE_EVENT 0xffff/* Mask for EVENT bits */ -#define ARMV8_PMU_EVTYPE_EVENT_SW_INCR 0/* Software increment event */ +/* +* PMUv3 event types: required events +*/ +#define ARMV8_PMUV3_PERFCTR_SW_INCR 0x00 +#define ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL 0x03 +#define ARMV8_PMUV3_PERFCTR_L1D_CACHE 0x04 +#define ARMV8_PMUV3_PERFCTR_BR_MIS_PRED 0x10 +#define ARMV8_PMUV3_PERFCTR_CPU_CYCLES 0x11 +#define ARMV8_PMUV3_PERFCTR_BR_PRED 0x12/* * Event filters for PMUv3
arch/arm64/kernel/perf_event.c +1 -9
@@ -30,17 +30,9 @@/* * ARMv8 PMUv3 Performance Events handling code. -* Common event types. +* Common event types (some are defined in asm/perf_event.h). */ -/* Required events. */ -#define ARMV8_PMUV3_PERFCTR_SW_INCR 0x00 -#define ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL 0x03 -#define ARMV8_PMUV3_PERFCTR_L1D_CACHE 0x04 -#define ARMV8_PMUV3_PERFCTR_BR_MIS_PRED 0x10 -#define ARMV8_PMUV3_PERFCTR_CPU_CYCLES 0x11 -#define ARMV8_PMUV3_PERFCTR_BR_PRED 0x12 -/* At least one of the following is required. */ #define ARMV8_PMUV3_PERFCTR_INST_RETIRED 0x08#define ARMV8_PMUV3_PERFCTR_INST_SPEC 0x1B
virt/kvm/arm/pmu.c +5 -3
@@ -305,7 +305,7 @@ void kvm_pmu_software_increment(struct kcontinue ; type =vcpu_sys_reg (vcpu,PMEVTYPER0_EL0 + i) &ARMV8_PMU_EVTYPE_EVENT ; -if ((type ==ARMV8_PMU_EVTYPE_EVENT_SW_INCR ) +if ((type ==ARMV8_PMUV3_PERFCTR_SW_INCR ) && (enable &BIT (i))) { reg =vcpu_sys_reg (vcpu,PMEVCNTR0_EL0 + i) +1 ; reg =lower_32_bits (reg);
@@ -379,7 +379,8 @@ void kvm_pmu_set_counter_event_type(stru eventsel = data &ARMV8_PMU_EVTYPE_EVENT ;/* Software increment event does't need to be backed by a perf event */ -if (eventsel ==ARMV8_PMU_EVTYPE_EVENT_SW_INCR ) +if (eventsel ==ARMV8_PMUV3_PERFCTR_SW_INCR && + select_idx !=ARMV8_PMU_CYCLE_IDX )return ;memset (&attr,0 ,sizeof (struct perf_event_attr ));
@@ -391,7 +392,8 @@ void kvm_pmu_set_counter_event_type(stru attr.exclude_kernel = data &ARMV8_PMU_EXCLUDE_EL1 ?1 :0 ; attr.exclude_hv =1 ;/* Don't count EL2 events */ attr.exclude_host =1 ;/* Don't count host events */ - attr.config = eventsel; + attr.config = (select_idx ==ARMV8_PMU_CYCLE_IDX ) ? +ARMV8_PMUV3_PERFCTR_CPU_CYCLES : eventsel; counter =kvm_pmu_get_counter_value (vcpu, select_idx);/* The initial sample period (overflow count) of an event. */
Greg Kroah-Hartman
maintainerPATCH 6/67 ftrace: Ignore FTRACE_FL_DISABLED while walking dyn_ftrace records
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
commit 977c1f9c8c022d0173181766b34a0db3705265a4 upstream.
ftrace_shutdown() checks for sanity of ftrace records
and if dyn_ftrace->flags is not zero, it will warn.
It can happen that 'flags' are set to FTRACE_FL_DISABLED at this point, since some module was loaded, but before ftrace_module_enable() cleared the flags for this module.
In other words the module.c is doing:ftrace_module_init(mod); // calls ftrace_update_code() that sets flags=FTRACE_FL_DISABLED ... // here ftrace_shutdown() is called that warns, since
err = prepare_coming_module(mod); // didn't have a chance to clear FTRACE_FL_DISABLED
Fix it by ignoring disabled records.
It's similar to what __ftrace_hash_rec_update() is already doing.
--- kernel/trace/ftrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/ftrace.c +1 -1
@@ -2757,7 +2757,7 @@ static int ftrace_shutdown(struct ftracestruct dyn_ftrace *rec;do_for_each_ftrace_rec (pg, rec) { -if (FTRACE_WARN_ON_ONCE (rec->flags)) +if (FTRACE_WARN_ON_ONCE (rec->flags & ~FTRACE_FL_DISABLED ))pr_warn (" %pS flags:%lx\n" , (void *)rec->ip, rec->flags); }while_for_each_ftrace_rec ();
Greg Kroah-Hartman
maintainerPATCH 7/67 ftrace: Add more checks for FTRACE_FL_DISABLED in processing ip records
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Red Hat) <[email protected]>
commit 546fece4eae871f033925ccf0ff2b740725ae915 upstream.
When a module is first loaded and its function ip records are added to the ftrace list of functions to modify, they are set to DISABLED, as their text is still in a read only state. When the module is fully loaded, and can be updated, the flag is cleared, and if their's any functions that should be tracing them, it is updated at that moment.
But there's several locations that do record accounting and should ignore records that are marked as disabled, or they can cause issues.
Alexei already fixed one location, but others need to be addressed.
--- kernel/trace/ftrace.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
kernel/trace/ftrace.c +22 -0
@@ -1856,6 +1856,10 @@ static int __ftrace_hash_update_ipmodify/* Update rec->flags */ do_for_each_ftrace_rec (pg, rec) { + +if (rec->flags &FTRACE_FL_DISABLED ) +continue ; +/* We need to update only differences of filter_hash */ in_old = !!ftrace_lookup_ip (old_hash, rec->ip); in_new = !!ftrace_lookup_ip (new_hash, rec->ip);
@@ -1878,6 +1882,10 @@ rollback:/* Roll back what we did above */ do_for_each_ftrace_rec (pg, rec) { + +if (rec->flags &FTRACE_FL_DISABLED ) +continue ; +if (rec == end) goto err_out;
@@ -2391,6 +2399,10 @@ void __weak ftrace_replace_code(int enabreturn ;do_for_each_ftrace_rec (pg, rec) { + +if (rec->flags &FTRACE_FL_DISABLED ) +continue ; + failed =__ftrace_replace_code (rec, enable);if (failed) {ftrace_bug (failed, rec);
@@ -3592,6 +3604,10 @@ match_records(struct ftrace_hash *hash, goto out_unlock;do_for_each_ftrace_rec (pg, rec) { + +if (rec->flags &FTRACE_FL_DISABLED ) +continue ; +if (ftrace_match_record (rec, &func_g, mod_match, exclude_mod)) { ret =enter_record (hash, rec, clear_filter);if (ret <0 ) {
@@ -3787,6 +3803,9 @@ register_ftrace_function_probe(char *glodo_for_each_ftrace_rec (pg, rec) { +if (rec->flags &FTRACE_FL_DISABLED ) +continue ; +if (!ftrace_match_record (rec, &func_g,NULL ,0 ))continue ;
@@ -4679,6 +4698,9 @@ ftrace_set_func(unsigned long *array, indo_for_each_ftrace_rec (pg, rec) { +if (rec->flags &FTRACE_FL_DISABLED ) +continue ; +if (ftrace_match_record (rec, &func_g,NULL ,0 )) {/* if it is in the array */ exists = false;
Greg Kroah-Hartman
maintainerPATCH 8/67 genirq: Use irq type from irqdata instead of irqdesc
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 7ee7e87dfb158e79019ea1d5ea1b0e6f2bc93ee4 upstream.
The type flags in the irq descriptor are there for historical reasons and only updated via irq_modify_status() or irq_set_type(). Both functions also update the type flags in irqdata. __setup_irq() is the only left over user of the type flags in the irq descriptor.
If __setup_irq() is called with empty irq type flags, then the type flags are retrieved from irqdata. If an interrupt is shared, then the type flags are compared with the type flags stored in the irq descriptor.
On x86 the ioapic does not have a irq_set_type() callback because the type is defined in the BIOS tables and cannot be changed. The type is stored in irqdata at setup time without updating the type data in the irq descriptor. As a result the comparison described above fails.
There is no point in updating the irq descriptor flags because the only relevant storage is irqdata. Use the type flags from irqdata for both retrieval and comparison in __setup_irq() instead.
Aside of that the print out in case of non matching type flags has the old and new type flags arguments flipped. Fix that as well.
For correctness sake the flags stored in the irq descriptor should be removed, but this is beyond the scope of this bugfix and will be done in a later patch.
--- kernel/irq/manage.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/irq/manage.c +2 -2
@@ -1341,12 +1341,12 @@ __setup_irq(unsigned int irq, struct irq }else if (new->flags &IRQF_TRIGGER_MASK ) {unsigned int nmsk = new->flags &IRQF_TRIGGER_MASK ; -unsigned int omsk =irq_settings_get_trigger_mask (desc); +unsigned int omsk =irqd_get_trigger_type (&desc->irq_data);if (nmsk != omsk)/* hope the handler works with current trigger mode */ pr_warn ("irq %d uses trigger mode %u; requested %u\n" , - irq, nmsk, omsk); + irq, omsk, nmsk); } *old_ptr = new;
Greg Kroah-Hartman
maintainerPATCH 9/67 fuse: fix fuse_write_end() if zero bytes were copied
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
commit 59c3b76cc61d1d676f965c192cc7969aa5cb2744 upstream.
If pos is at the beginning of a page and copied is zero then page is not zeroed but is marked uptodate.
Fix by skipping everything except unlock/put of page if zero bytes were copied.
--- fs/fuse/file.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/fuse/file.c +6 -0
@@ -1985,6 +1985,10 @@ static int fuse_write_end(struct file *f {struct inode *inode = page->mapping->host; +/* Haven't copied anything? Skip zeroing, size extending, dirtying. */ +if (!copied) + goto unlock; +if (!PageUptodate (page)) {/* Zero any unwritten bytes at the end of the page */ size_t endoff = (pos + copied) & ~PAGE_MASK ;
@@ -1995,6 +1999,8 @@ static int fuse_write_end(struct file *ffuse_write_update_size (inode, pos + copied);set_page_dirty (page); + +unlock:unlock_page (page);put_page (page);
Greg Kroah-Hartman
maintainerPATCH 10/67 IB/rdmavt: rdmavt can handle non aligned page maps
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dennis Dalessandro <[email protected]>
commit e1fafdcbe0e3e769c6a83317dd845bc99b4fe61d upstream.
The initial code for rdmavt carried with it a restriction that was a vestige from the qib driver, that to dma map a page it had to be less than a page size. This is not the case on modern hardware, both qib and hfi1 will be just fine with unaligned map requests.
This fixes a 4.8 regression where by an IPoIB transfer of > PAGE_SIZE will hang because the dma map page call always fails. This was introduced after commit 5faba5469522 ("IB/ipoib: Report SG feature regardless of HW UD CSUM capability") added the capability to use SG by default. Rather than override this, the HW supports it, so allow SG.
--- drivers/infiniband/sw/rdmavt/dma.c | 3 --- 1 file changed, 3 deletions(-)
drivers/infiniband/sw/rdmavt/dma.c +0 -3
@@ -90,9 +90,6 @@ static u64 rvt_dma_map_page(struct ib_deif (WARN_ON (!valid_dma_direction (direction)))return BAD_DMA_ADDRESS ; -if (offset + size >PAGE_SIZE ) -return BAD_DMA_ADDRESS ; - addr = (u64 )page_address (page);if (addr) addr += offset;
Greg Kroah-Hartman
maintainerPATCH 11/67 IB/hfi1: Fix rnr_timer addition
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ira Weiny <[email protected]>
commit 458ed666fe14a54dfb6690a1a7f541782d1342c9 upstream.
The new s_rnr_timeout was not properly being set and the code was incorrectly setting a different timer.
Found by code inspection.
--- drivers/infiniband/hw/hfi1/rc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/hfi1/rc.c +1 -1
@@ -87,7 +87,7 @@ void hfi1_add_rnr_timer(struct rvt_qp *qstruct hfi1_qp_priv *priv = qp->priv; qp->s_flags |=RVT_S_WAIT_RNR ; - qp->s_timer.expires = jiffies +usecs_to_jiffies (to); + priv->s_rnr_timer.expires = jiffies +usecs_to_jiffies (to);add_timer (&priv->s_rnr_timer); }
Greg Kroah-Hartman
maintainerPATCH 12/67 mfd: intel-lpss: Do not put device in reset state on suspend
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Azhar Shaikh <[email protected]>
commit 274e43edcda6f709aa67e436b3123e45a6270923 upstream.
Commit 41a3da2b8e163 ("mfd: intel-lpss: Save register context on suspend") saved the register context while going to suspend and also put the device in reset state.
Due to the resetting of device, system cannot enter S3/S0ix states when no_console_suspend flag is enabled. The system and serial console both hang. The resetting of device is not needed while going to suspend. Hence remove this code.
--- drivers/mfd/intel-lpss.c | 3 --- 1 file changed, 3 deletions(-)
drivers/mfd/intel-lpss.c +0 -3
@@ -502,9 +502,6 @@ int intel_lpss_suspend(struct device *defor (i =0 ; i <LPSS_PRIV_REG_COUNT ; i++) lpss->priv_ctx[i] =readl (lpss->priv + i *4 ); -/* Put the device into reset state */ -writel (0 , lpss->priv +LPSS_PRIV_RESETS ); -return 0 ; }EXPORT_SYMBOL_GPL (intel_lpss_suspend);
RE: [PATCH 4.8 12/67] mfd: intel-lpss: Do not put device in reset state on suspend
Hi Greg,
Please pick this patch. No concerns.
Regards,
Azhar Shaikh
-----Original Message-----
From: Greg Kroah-Hartman [mailto:[email protected]]
Sent: Thursday, November 24, 2016 7:27 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Shaikh, Azhar <[email protected]>; Mika Westerberg <[email protected]>; Andy Shevchenko <[email protected]>; Lee Jones <[email protected]>
Subject: [PATCH 4.8 12/67] mfd: intel-lpss: Do not put device in reset state on suspend
4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Azhar Shaikh <[email protected]>
commit 274e43edcda6f709aa67e436b3123e45a6270923 upstream.
Commit 41a3da2b8e163 ("mfd: intel-lpss: Save register context on
suspend") saved the register context while going to suspend and also put the device in reset state.
Due to the resetting of device, system cannot enter S3/S0ix states when no_console_suspend flag is enabled. The system and serial console both hang. The resetting of device is not needed while going to suspend. Hence remove this code.
--- drivers/mfd/intel-lpss.c | 3 --- 1 file changed, 3 deletions(-)
drivers/mfd/intel-lpss.c +0 -3
@@ -502,9 +502,6 @@ int intel_lpss_suspend(struct device *defor (i =0 ; i <LPSS_PRIV_REG_COUNT ; i++) lpss->priv_ctx[i] =readl (lpss->priv + i *4 ); -/* Put the device into reset state */ -writel (0 , lpss->priv +LPSS_PRIV_RESETS ); -return 0 ; }EXPORT_SYMBOL_GPL (intel_lpss_suspend);
Greg Kroah-Hartman
maintainerPATCH 13/67 mfd: stmpe: Fix RESET regression on STMPE2401
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
commit f40584200bc4af7aa4399635b9ac213c62a13ae7 upstream.
Since commit c4dd1ba355aae2bc3d1213da6c66c53e3c31e028 ("mfd: stmpe: Add reset support for all STMPE variant") we're resetting the STMPE expanders before use.
This caused a regression on the STMP2401 on the Nomadik NHK8815:
stmpe-i2c 0-0043: stmpe2401 detected, chip id: 0x101 nmk-i2c 101f8000.i2c0: write to slave 0x43 timed out nmk-i2c 101f8000.i2c0: no ack received after address transmission stmpe-i2c 0-0044: stmpe2401 detected, chip id: 0x101 nmk-i2c 101f8000.i2c0: write to slave 0x44 timed out nmk-i2c 101f8000.i2c0: no ack received after address transmission
It turns out that we start to poll for the reset bit to go low again too quickly: the STMPE2401 is not yet online and ready to be asked for the status of the RESET bit.
By introducing a 10ms delay before starting to hammer the register for information, we get back to normal:
stmpe-i2c 0-0043: stmpe2401 detected, chip id: 0x101 stmpe-i2c 0-0044: stmpe2401 detected, chip id: 0x101
--- drivers/mfd/stmpe.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/mfd/stmpe.c +2 -0
@@ -761,6 +761,8 @@ static int stmpe1801_reset(struct stmpeif (ret <0 )return ret; +msleep (10 ); + timeout = jiffies +msecs_to_jiffies (100 );while (time_before (jiffies, timeout)) { ret =__stmpe_reg_read (stmpe,STMPE1801_REG_SYS_CTRL );
Greg Kroah-Hartman
maintainerPATCH 14/67 can: bcm: fix warning in bcm_connect/proc_register
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Hartkopp <[email protected]>
commit deb507f91f1adbf64317ad24ac46c56eeccfb754 upstream.
Andrey Konovalov reported an issue with proc_register in bcm.c. As suggested by Cong Wang this patch adds a lock_sock() protection and a check for unsuccessful proc_create_data() in bcm_connect().
Reference: http://marc.info/?l=linux-netdev&m=147732648731237
--- net/can/bcm.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-)
net/can/bcm.c +23 -9
@@ -1549,24 +1549,31 @@ static int bcm_connect(struct socket *sostruct sockaddr_can *addr = (struct sockaddr_can *)uaddr;struct sock *sk = sock->sk;struct bcm_sock *bo =bcm_sk (sk); +int ret =0 ;if (len <sizeof (*addr))return -EINVAL ; -if (bo->bound) -return -EISCONN ; +lock_sock (sk); + +if (bo->bound) { + ret = -EISCONN ; + goto fail; + }/* bind a device to this socket */ if (addr->can_ifindex) {struct net_device *dev; dev =dev_get_by_index (&init_net, addr->can_ifindex); -if (!dev) -return -ENODEV ; - +if (!dev) { + ret = -ENODEV ; + goto fail; + }if (dev->type !=ARPHRD_CAN ) {dev_put (dev); -return -ENODEV ; + ret = -ENODEV ; + goto fail; } bo->ifindex = dev->ifindex;
@@ -1577,17 +1584,24 @@ static int bcm_connect(struct socket *so bo->ifindex =0 ; } - bo->bound =1 ; -if (proc_dir) {/* unique socket address as filename */ sprintf (bo->procname,"%lu" ,sock_i_ino (sk)); bo->bcm_proc_read =proc_create_data (bo->procname,0644 , proc_dir, &bcm_proc_fops, sk); +if (!bo->bcm_proc_read) { + ret = -ENOMEM ; + goto fail; + } } -return 0 ; + bo->bound =1 ; + +fail: +release_sock (sk); + +return ret; } static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
Greg Kroah-Hartman
maintainerPATCH 15/67 gpio: do not double-check direction on sleeping chips
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
commit 60f8339eb388df8a46f8eb4282ff0e15f08f218c upstream.
When locking a GPIO line as IRQ, we go to lengths to double-check that the line is really set as input before marking it as used for IRQ. This is not good on GPIO chips that can sleep, because this function is called in IRQ-safe context. Just skip this if it can't be checked quickly.
Currently this happens on sleeping expanders such as STMPE or TC3589x:
BUG: scheduling while atomic: swapper/1/0x00000002 Modules linked in: CPU: 0 PID: 1 Comm: swapper Not tainted 4.9.0-rc1+ #38 Hardware name: Nomadik STn8815 [<c000f2e0>] (unwind_backtrace) from [<c000d244>] (show_stack+0x10/0x14) [<c000d244>] (show_stack) from [<c0037b78>] (__schedule_bug+0x54/0x80) [<c0037b78>] (__schedule_bug) from [<c042df14>] (__schedule+0x3a0/0x460) [<c042df14>] (__schedule) from [<c042e028>] (schedule+0x54/0xb8)
(...)
This patch fixes that problem and relies on the direction read from the chip when it was added.
--- drivers/gpio/gpiolib.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/gpio/gpiolib.c +5 -2
@@ -2667,8 +2667,11 @@ int gpiochip_lock_as_irq(struct gpio_chiif (IS_ERR (desc))return PTR_ERR (desc); -/* Flush direction if something changed behind our back */ -if (chip->get_direction) { +/* +* If it's fast: flush the direction setting if something changed +* behind our back +*/ +if (!chip->can_sleep && chip->get_direction) {int dir = chip->get_direction (chip, offset);if (dir)
Greg Kroah-Hartman
maintainerPATCH 16/67 ALSA: usb-audio: Fix use-after-free of usb_device at disconnect
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 6ff1a25318ebf688ef9593fe09cd449f6fb4ad31 upstream.
The usb-audio driver implements the deferred device disconnection for the device in use. In this mode, the disconnection callback returns immediately while the actual ALSA card object removal happens later when all files get closed. As Shuah reported, this code flow, however, leads to a use-after-free, detected by KASAN:
BUG: KASAN: use-after-free in snd_usb_audio_free+0x134/0x160 [snd_usb_audio] at addr ffff8801c863ce10 Write of size 8 by task pulseaudio/2244 Call Trace: [<ffffffff81b31473>] dump_stack+0x67/0x94 [<ffffffff81564ef1>] kasan_object_err+0x21/0x70 [<ffffffff8156518a>] kasan_report_error+0x1fa/0x4e0 [<ffffffff81564ad7>] ? kasan_slab_free+0x87/0xb0 [<ffffffff81565733>] __asan_report_store8_noabort+0x43/0x50 [<ffffffffa0fc0f54>] ? snd_usb_audio_free+0x134/0x160 [snd_usb_audio] [<ffffffffa0fc0f54>] snd_usb_audio_free+0x134/0x160 [snd_usb_audio] [<ffffffffa0fc0fb1>] snd_usb_audio_dev_free+0x31/0x40 [snd_usb_audio] [<ffffffff8243c78a>] __snd_device_free+0x12a/0x210 [<ffffffff8243d1f5>] snd_device_free_all+0x85/0xd0 [<ffffffff8242cae4>] release_card_device+0x34/0x130 [<ffffffff81ef1846>] device_release+0x76/0x1e0 [<ffffffff81b37ad7>] kobject_release+0x107/0x370 ..... Object at ffff8801c863cc80, in cache kmalloc-2048 size: 2048 Allocated: [<ffffffff810804eb>] save_stack_trace+0x2b/0x50 [<ffffffff81564296>] save_stack+0x46/0xd0 [<ffffffff8156450d>] kasan_kmalloc+0xad/0xe0 [<ffffffff81560d1a>] kmem_cache_alloc_trace+0xfa/0x240 [<ffffffff8214ea47>] usb_alloc_dev+0x57/0xc90 [<ffffffff8216349d>] hub_event+0xf1d/0x35f0 .... Freed: [<ffffffff810804eb>] save_stack_trace+0x2b/0x50 [<ffffffff81564296>] save_stack+0x46/0xd0 [<ffffffff81564ac1>] kasan_slab_free+0x71/0xb0 [<ffffffff81560929>] kfree+0xd9/0x280 [<ffffffff8214de6e>] usb_release_dev+0xde/0x110 [<ffffffff81ef1846>] device_release+0x76/0x1e0 ....
It's the code trying to clear drvdata of the assigned usb_device where the usb_device itself was already released in usb_release_dev() after the disconnect callback.
This patch fixes it by checking whether the code path is via the disconnect callback, i.e. chip->shutdown flag is set.
--- sound/usb/card.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/usb/card.c +2 -1
@@ -315,7 +315,8 @@ static int snd_usb_audio_free(struct sndsnd_usb_endpoint_free (ep);mutex_destroy (&chip->mutex); -dev_set_drvdata (&chip->dev->dev,NULL ); +if (!atomic_read (&chip->shutdown)) +dev_set_drvdata (&chip->dev->dev,NULL );kfree (chip);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 17/67 ALSA: hda - add a new condition to check if it is thinkpad
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
commit 2ecb704a1290edb5e3d53a75529192e7ed2a1a28 upstream.
Latest Thinkpad laptops use the HKEY_HID LEN0268 instead of the LEN0068, as a result neither audio mute led nor mic mute led can work any more.
After adding the new HKEY_HID into the is_thinkpad(), both of them works well as before.
--- sound/pci/hda/thinkpad_helper.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/pci/hda/thinkpad_helper.c +2 -1
@@ -13,7 +13,8 @@ static void (*old_vmaster_hook)(void *,static bool is_thinkpad (struct hda_codec *codec) {return (codec->core.subsystem_id >>16 ==0x17aa ) && - (acpi_dev_found ("LEN0068" ) ||acpi_dev_found ("IBM0068" )); + (acpi_dev_found ("LEN0068" ) ||acpi_dev_found ("LEN0268" ) || +acpi_dev_found ("IBM0068" )); }static void update_tpacpi_mute_led (void *private_data,int enabled)
Greg Kroah-Hartman
maintainerPATCH 18/67 ALSA: hda - Fix mic regression by ASRock mobo fixup
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 9a2541910dc7eaaa6859eea8a0ffda673059a623 upstream.
The commit [1a3f099101b8: ALSA: hda - Fix surround output pins for ASRock B150M mobo] introduced a fixup of pin configs for ASRock mobos to fix the surround outputs. However, this overrides the pin configs of the mic pins as if they are outputs-only, effectively disabling the mic inputs. Of course, it's a regression wrt mic functionality.
Actually the pins 0x18 and 0x1a don't need to be changed; we just need to disable the bogus pins 0x14 and 0x15. Then the auto-parser will pick up mic pins as switchable and assign the surround outputs there.
This patch removes the incorrect pin overrides of NID 0x18 and 0x1a from the ASRock fixup.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=187431
--- sound/pci/hda/patch_realtek.c | 2 -- 1 file changed, 2 deletions(-)
sound/pci/hda/patch_realtek.c +0 -2
@@ -6905,8 +6905,6 @@ static const struct hda_fixup alc662_fix .v.pins = (const struct hda_pintbl[]) { {0x15 ,0x40f000f0 },/* disabled */ {0x16 ,0x40f000f0 },/* disabled */ - {0x18 ,0x01014011 },/* LO */ - {0x1a ,0x01014012 },/* LO */ { } } },
Greg Kroah-Hartman
maintainerPATCH 19/67 i2c: mux: fix up dependencies
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
commit 93d710a65ef02fb7fd48ae207e78f460bd7a6089 upstream.
We get the following build error from UM Linux after adding an entry to drivers/iio/gyro/Kconfig that issues "select I2C_MUX":
ERROR: "devm_ioremap_resource"
[drivers/i2c/muxes/i2c-mux-reg.ko] undefined!
ERROR: "of_address_to_resource"
[drivers/i2c/muxes/i2c-mux-reg.ko] undefined!
It appears that the I2C mux core code depends on HAS_IOMEM for historical reasons, while CONFIG_I2C_MUX_REG does *not* have a direct dependency on HAS_IOMEM.
This creates a situation where a allyesconfig or allmodconfig for UM Linux will select I2C_MUX, and will implicitly enable I2C_MUX_REG as well, and the compilation will fail for the register driver.
Fix this up by making I2C_MUX_REG depend on HAS_IOMEM and removing the dependency from I2C_MUX.
--- drivers/i2c/Kconfig | 1 - drivers/i2c/muxes/Kconfig | 1 + 2 files changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/Kconfig +0 -1
@@ -59,7 +59,6 @@ config I2C_CHARDEV config I2C_MUX tristate "I2C bus multiplexing support" - depends on HAS_IOMEM help Say Y here if you want the I2C core to support the ability to handle multiplexed I2C bus topologies, by presenting each
drivers/i2c/muxes/Kconfig +1 -0
@@ -63,6 +63,7 @@ config I2C_MUX_PINCTRL config I2C_MUX_REG tristate "Register-based I2C multiplexer" + depends on HAS_IOMEM help If you say yes to this option, support will be included for a register based I2C multiplexer. This driver provides access to
Greg Kroah-Hartman
maintainerPATCH 20/67 i2c: i2c-mux-pca954x: fix deselect enabling for device-tree
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Hemme <[email protected]>
commit ad092de60f865c1ad94221bd06d381ecea446cc8 upstream.
Deselect functionality can be ignored for device-trees with "i2c-mux-idle-disconnect" entries if no platform_data is available. By enabling the deselect functionality outside the platform_data block the logic works as it did in previous kernels.
--- drivers/i2c/muxes/i2c-mux-pca954x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/i2c/muxes/i2c-mux-pca954x.c +2 -2
@@ -247,9 +247,9 @@ static int pca954x_probe(struct i2c_clie/* discard unconfigured channels */ break ; idle_disconnect_pd = pdata->modes[num].deselect_on_exit; - data->deselect |= (idle_disconnect_pd - || idle_disconnect_dt) << num; } + data->deselect |= (idle_disconnect_pd || + idle_disconnect_dt) << num; ret =i2c_mux_add_adapter (muxc, force, num, class);
Greg Kroah-Hartman
maintainerPATCH 21/67 Disable the __builtin_return_address() warning globally after all
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Torvalds <[email protected]>
commit ef6000b4c6706cbb1787836442b5a74542b1809f upstream.
This affectively reverts commit 377ccbb48373 ("Makefile: Mute warning for __builtin_return_address(>0) for tracing only") because it turns out that it really isn't tracing only - it's all over the tree.
We already also had the warning disabled separately for mm/usercopy.c (which this commit also removes), and it turns out that we will also want to disable it for get_lock_parent_ip(), that is used for at least TRACE_IRQFLAGS. Which (when enabled) ends up being all over the tree.
Steven Rostedt had a patch that tried to limit it to just the config options that actually triggered this, but quite frankly, the extra complexity and abstraction just isn't worth it. We have never actually had a case where the warning is actually useful, so let's just disable it globally and not worry about it.
--- Makefile | 1 + kernel/trace/Makefile | 4 ---- mm/Makefile | 3 --- 3 files changed, 1 insertion(+), 7 deletions(-)
Makefile +1 -0
@@ -621,6 +621,7 @@ include arch/$(SRCARCH)/Makefile KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,) KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,) +KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE KBUILD_CFLAGS += -Os
kernel/trace/Makefile +0 -4
@@ -1,8 +1,4 @@ -# We are fully aware of the dangers of __builtin_return_address() -FRAME_CFLAGS := $(call cc-disable-warning,frame-address) -KBUILD_CFLAGS += $(FRAME_CFLAGS) - # Do not instrument the tracer itself: ifdef CONFIG_FUNCTION_TRACER
mm/Makefile +0 -3
@@ -21,9 +21,6 @@ KCOV_INSTRUMENT_memcontrol.o := n KCOV_INSTRUMENT_mmzone.o := n KCOV_INSTRUMENT_vmstat.o := n -# Since __builtin_frame_address does work as used, disable the warning. -CFLAGS_usercopy.o += $(call cc-disable-warning, frame-address) - mmu-y := nommu.o mmu-$(CONFIG_MMU) := gup.o highmem.o memory.o mincore.o \ mlock.o mmap.o mprotect.o mremap.o msync.o rmap.o \
Greg Kroah-Hartman
maintainerPATCH 23/67 scripts/has-stack-protector: add -fno-PIE
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
commit 82031ea29e454b574bc6f49a33683a693ca5d907 upstream.
Adding -no-PIE to the fstack protector check. -no-PIE was introduced before -fstack-protector so there is no need for a runtime check.
Without it the build stops:
|Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong available but compiler is broken
due to -mcmodel=kernel + -fPIE if -fPIE is enabled by default.
Tagging it stable so it is possible to compile recent stable kernels as well.
--- scripts/gcc-x86_64-has-stack-protector.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/gcc-x86_64-has-stack-protector.sh +1 -1
@@ -1,6 +1,6 @@ #!/bin/sh -echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs" if [ "$?" -eq "0" ] ; then echo y else
Greg Kroah-Hartman
maintainerPATCH 24/67 x86/kexec: add -fno-PIE
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
commit 90944e40ba1838de4b2a9290cf273f9d76bd3bdd upstream.
If the gcc is configured to do -fPIE by default then the build aborts later with:
| Unsupported relocation type: unknown type rel type name (29)
Tagging it stable so it is possible to compile recent stable kernels as well.
--- arch/x86/purgatory/Makefile | 1 + 1 file changed, 1 insertion(+)
arch/x86/purgatory/Makefile +1 -0
@@ -16,6 +16,7 @@ KCOV_INSTRUMENT := n KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -MD -Os -mcmodel=large KBUILD_CFLAGS += -m$(BITS) +KBUILD_CFLAGS += $(call cc-option,-fno-PIE) $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE $(call if_changed,ld)
Greg Kroah-Hartman
maintainerPATCH 25/67 kbuild: Steal gccs pie from the very beginning
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Borislav Petkov <[email protected]>
commit c6a385539175ebc603da53aafb7753d39089f32e upstream.
So Sebastian turned off the PIE for kernel builds but that was too late
- Kbuild.include already uses KBUILD_CFLAGS and trying to disable gcc options with, say cc-disable-warning, fails:
gcc -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs
...
-Wno-sign-compare -fno-asynchronous-unwind-tables -Wframe-address -c -x c /dev/null -o .31392.tmp /dev/null:1:0: error: code model kernel does not support PIC mode
because that returns an error and we can't disable the warning. For example in this case:
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
which leads to gcc issuing all those warnings again.
So let's turn off PIE/PIC at the earliest possible moment, when we declare KBUILD_CFLAGS so that cc-disable-warning picks it up too.
Also, we need the $(call cc-option ...) because -fno-PIE is supported since gcc v3.4 and our lowest supported gcc version is 3.2 right now.
--- Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
Makefile +3 -4
@@ -399,11 +399,12 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstric -fno-strict-aliasing -fno-common \ -Werror-implicit-function-declaration \ -Wno-format-security \ - -std=gnu89 + -std=gnu89 $(call cc-option,-fno-PIE) + KBUILD_AFLAGS_KERNEL := KBUILD_CFLAGS_KERNEL := -KBUILD_AFLAGS := -D__ASSEMBLY__ +KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE) KBUILD_AFLAGS_MODULE := -DMODULE KBUILD_CFLAGS_MODULE := -DMODULE KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
@@ -622,8 +623,6 @@ include arch/$(SRCARCH)/Makefile KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,) KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,) KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) -KBUILD_CFLAGS += $(call cc-option,-fno-PIE) -KBUILD_AFLAGS += $(call cc-option,-fno-PIE) ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE KBUILD_CFLAGS += -Os
Greg Kroah-Hartman
maintainerPATCH 26/67 ext4: sanity check the block and cluster size at mount time
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
commit 8cdf3372fe8368f56315e66bea9f35053c418093 upstream.
If the block size or cluster size is insane, reject the mount. This is important for security reasons (although we shouldn't be just depending on this check).
Ref: http://www.securityfocus.com/archive/1/539661
Ref: https://bugzilla.redhat.com/show_bug.cgi?id=1332506
--- fs/ext4/ext4.h | 1 + fs/ext4/super.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-)
fs/ext4/ext4.h +1 -0
@@ -235,6 +235,7 @@ struct ext4_io_submit {#define EXT4_MAX_BLOCK_SIZE 65536#define EXT4_MIN_BLOCK_LOG_SIZE 10#define EXT4_MAX_BLOCK_LOG_SIZE 16 +#define EXT4_MAX_CLUSTER_LOG_SIZE 30#ifdef __KERNEL__# define EXT4_BLOCK_SIZE (s) ((s)->s_blocksize)#else
fs/ext4/super.c +16 -1
@@ -3518,7 +3518,15 @@ static int ext4_fill_super(struct super_if (blocksize <EXT4_MIN_BLOCK_SIZE || blocksize >EXT4_MAX_BLOCK_SIZE ) {ext4_msg (sb,KERN_ERR , -"Unsupported filesystem blocksize %d" , blocksize); +"Unsupported filesystem blocksize %d (%d log_block_size)" , + blocksize,le32_to_cpu (es->s_log_block_size)); + goto failed_mount; + } +if (le32_to_cpu (es->s_log_block_size) > + (EXT4_MAX_BLOCK_LOG_SIZE -EXT4_MIN_BLOCK_LOG_SIZE )) { +ext4_msg (sb,KERN_ERR , +"Invalid log block size: %u" , +le32_to_cpu (es->s_log_block_size)); goto failed_mount; }
@@ -3650,6 +3658,13 @@ static int ext4_fill_super(struct super_ "block size (%d)", clustersize, blocksize); goto failed_mount; } +if (le32_to_cpu (es->s_log_cluster_size) > + (EXT4_MAX_CLUSTER_LOG_SIZE -EXT4_MIN_BLOCK_LOG_SIZE )) { +ext4_msg (sb,KERN_ERR , +"Invalid log cluster size: %u" , +le32_to_cpu (es->s_log_cluster_size)); + goto failed_mount; + } sbi->s_cluster_bits =le32_to_cpu (es->s_log_cluster_size) -le32_to_cpu (es->s_log_block_size); sbi->s_clusters_per_group =
Greg Kroah-Hartman
maintainerPATCH 27/67 ARM: dts: imx53-qsb: Fix regulator constraints
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabio Estevam <[email protected]>
commit e3c9d9d6ebfeeeee29c6240e1b5978d40d31d21f upstream.
Since commit fa93fd4ecc9c ("regulator: core: Ensure we are at least in bounds for our constraints") the imx53-qsb board populated with a Dialog DA9053 PMIC fails to boot:
LDO3: Bringing 3300000uV into 1800000-1800000uV
The LDO3 voltage constraints passed in the device tree do not match the valid range according to the datasheet, so fix this accordingly to allow the board booting again.
While at it, fix the other voltage constraints as well.
--- arch/arm/boot/dts/imx53-qsb.dts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
arch/arm/boot/dts/imx53-qsb.dts +7 -7
@@ -64,8 +64,8 @@ }; ldo3_reg: ldo3 { - regulator-min-microvolt = <600000>; - regulator-max-microvolt = <1800000>; + regulator-min-microvolt = <1725000>; + regulator-max-microvolt = <3300000>; regulator-always-on; };
@@ -76,8 +76,8 @@ }; ldo5_reg: ldo5 { - regulator-min-microvolt = <1725000>; - regulator-max-microvolt = <3300000>; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <3600000>; regulator-always-on; };
@@ -100,14 +100,14 @@ }; ldo9_reg: ldo9 { - regulator-min-microvolt = <1200000>; + regulator-min-microvolt = <1250000>; regulator-max-microvolt = <3600000>; regulator-always-on; }; ldo10_reg: ldo10 { - regulator-min-microvolt = <1250000>; - regulator-max-microvolt = <3650000>; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <3600000>; regulator-always-on; }; };
Greg Kroah-Hartman
maintainerPATCH 29/67 powerpc/64: Fix setting of AIL in hypervisor mode
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Herrenschmidt <[email protected]>
commit c0a36013639b06760f7c2c21a8387eac855432e1 upstream.
Commit d3cbff1b5 "powerpc: Put exception configuration in a common place" broke the setting of the AIL bit (which enables taking exceptions with the MMU still on) on all processors, moving it incorrectly to a function called only on the boot CPU. This was correct for the guest case but not when running in hypervisor mode.
This fixes it by partially reverting that commit, putting the setting back in cpu_ready_for_interrupts()
--- arch/powerpc/kernel/setup_64.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
arch/powerpc/kernel/setup_64.c +14 -6
@@ -226,17 +226,25 @@ static void __init configure_exceptions(if (firmware_has_feature (FW_FEATURE_OPAL ))opal_configure_cores (); -/* Enable AIL if supported, and we are in hypervisor mode */ -if (early_cpu_has_feature (CPU_FTR_HVMODE ) && -early_cpu_has_feature (CPU_FTR_ARCH_207S )) { -unsigned long lpcr =mfspr (SPRN_LPCR ); -mtspr (SPRN_LPCR , lpcr |LPCR_AIL_3 ); - } +/* AIL on native is done in cpu_ready_for_interrupts() */ } }static void cpu_ready_for_interrupts (void ) { +/* +* Enable AIL if supported, and we are in hypervisor mode. This +* is called once for every processor. +* +* If we are not in hypervisor mode the job is done once for +* the whole partition in configure_exceptions(). +*/ +if (early_cpu_has_feature (CPU_FTR_HVMODE ) && +early_cpu_has_feature (CPU_FTR_ARCH_207S )) { +unsigned long lpcr =mfspr (SPRN_LPCR ); +mtspr (SPRN_LPCR , lpcr |LPCR_AIL_3 ); + } +/* Set IR and DR in PACA MSR */ get_paca ()->kernel_msr =MSR_KERNEL ; }
Greg Kroah-Hartman
maintainerPATCH 33/67 virtio-net: drop legacy features in virtio 1 mode
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael S. Tsirkin <[email protected]>
commit f3358507c11999c91abf54744658bccd49b5879c upstream.
Virtio 1.0 spec says VIRTIO_F_ANY_LAYOUT and VIRTIO_NET_F_GSO are legacy-only feature bits. Do not negotiate them in virtio 1 mode. Note this is a spec violation so we need to backport it to stable/downstream kernels.
--- drivers/net/virtio_net.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)
drivers/net/virtio_net.c +20 -10
@@ -2010,23 +2010,33 @@ static struct virtio_device_id id_table[ { 0 }, }; +#define VIRTNET_FEATURES \ + VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, \ + VIRTIO_NET_F_MAC, \ + VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, \ + VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, \ + VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, \ + VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, \ + VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \ + VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, \ + VIRTIO_NET_F_CTRL_MAC_ADDR, \ + VIRTIO_NET_F_MTU +static unsigned int features[] = { -VIRTIO_NET_F_CSUM ,VIRTIO_NET_F_GUEST_CSUM , -VIRTIO_NET_F_GSO ,VIRTIO_NET_F_MAC , -VIRTIO_NET_F_HOST_TSO4 ,VIRTIO_NET_F_HOST_UFO ,VIRTIO_NET_F_HOST_TSO6 , -VIRTIO_NET_F_HOST_ECN ,VIRTIO_NET_F_GUEST_TSO4 ,VIRTIO_NET_F_GUEST_TSO6 , -VIRTIO_NET_F_GUEST_ECN ,VIRTIO_NET_F_GUEST_UFO , -VIRTIO_NET_F_MRG_RXBUF ,VIRTIO_NET_F_STATUS ,VIRTIO_NET_F_CTRL_VQ , -VIRTIO_NET_F_CTRL_RX ,VIRTIO_NET_F_CTRL_VLAN , -VIRTIO_NET_F_GUEST_ANNOUNCE ,VIRTIO_NET_F_MQ , -VIRTIO_NET_F_CTRL_MAC_ADDR , +VIRTNET_FEATURES , +}; + +static unsigned int features_legacy[] = { +VIRTNET_FEATURES , +VIRTIO_NET_F_GSO ,VIRTIO_F_ANY_LAYOUT , -VIRTIO_NET_F_MTU , };static struct virtio_driver virtio_net_driver = { .feature_table = features, .feature_table_size =ARRAY_SIZE (features), + .feature_table_legacy = features_legacy, + .feature_table_size_legacy =ARRAY_SIZE (features_legacy), .driver.name =KBUILD_MODNAME , .driver.owner =THIS_MODULE , .id_table = id_table,
Greg Kroah-Hartman
maintainerPATCH 34/67 clk: mmp: pxa910: fix return value check in pxa910_clk_init()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit 10f2bfb092e3b49000526c02cfe8b2abbbdbb752 upstream.
Fix the retrn value check which testing the wrong variable in pxa910_clk_init().
--- drivers/clk/mmp/clk-of-pxa910.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/mmp/clk-of-pxa910.c +2 -2
@@ -282,7 +282,7 @@ static void __init pxa910_clk_init(struc } pxa_unit->apmu_base =of_iomap (np,1 ); -if (!pxa_unit->mpmu_base) { +if (!pxa_unit->apmu_base) {pr_err ("failed to map apmu registers\n" );return ; }
@@ -294,7 +294,7 @@ static void __init pxa910_clk_init(struc } pxa_unit->apbcp_base =of_iomap (np,3 ); -if (!pxa_unit->mpmu_base) { +if (!pxa_unit->apbcp_base) {pr_err ("failed to map apbcp registers\n" );return ; }
Greg Kroah-Hartman
maintainerPATCH 35/67 clk: mmp: pxa168: fix return value check in pxa168_clk_init()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit deab07261d54b4db7b627d38e0efac97f176c6d6 upstream.
Fix the retrn value check which testing the wrong variable in pxa168_clk_init().
--- drivers/clk/mmp/clk-of-pxa168.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/mmp/clk-of-pxa168.c +1 -1
@@ -262,7 +262,7 @@ static void __init pxa168_clk_init(struc } pxa_unit->apmu_base =of_iomap (np,1 ); -if (!pxa_unit->mpmu_base) { +if (!pxa_unit->apmu_base) {pr_err ("failed to map apmu registers\n" );return ; }
Greg Kroah-Hartman
maintainerPATCH 36/67 clk: mmp: mmp2: fix return value check in mmp2_clk_init()
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit a29e52a6e66f4c0c895e7083e4bad2e7957f1fb5 upstream.
Fix the retrn value check which testing the wrong variable in mmp2_clk_init().
--- drivers/clk/mmp/clk-of-mmp2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/mmp/clk-of-mmp2.c +1 -1
@@ -313,7 +313,7 @@ static void __init mmp2_clk_init(struct } pxa_unit->apmu_base =of_iomap (np,1 ); -if (!pxa_unit->mpmu_base) { +if (!pxa_unit->apmu_base) {pr_err ("failed to map apmu registers\n" );return ; }
Greg Kroah-Hartman
maintainerPATCH 37/67 clk: imx: fix integer overflow in AV PLL round rate
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emil Lundmark <[email protected]>
commit 5c2f117a22e46a4afee6ddee29b653a7a2a6b41f upstream.
Since 'parent_rate * mfn' may overflow 32 bits, the result should be stored using 64 bits.
The problem was discovered when trying to set the rate of the audio PLL (pll4_post_div) on an i.MX6Q. The desired rate was 196.608 MHz, but the actual rate returned was 192.000570 MHz. The round rate function should have been able to return 196.608 MHz, i.e., the desired rate.
--- drivers/clk/imx/clk-pllv3.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/clk/imx/clk-pllv3.c +6 -2
@@ -223,7 +223,7 @@ static unsigned long clk_pllv3_av_recalc temp64 *= mfn;do_div (temp64, mfd); -return (parent_rate * div) + (u32 )temp64; +return parent_rate * div + (unsigned long )temp64; } static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate,
@@ -247,7 +247,11 @@ static long clk_pllv3_av_round_rate(strudo_div (temp64, parent_rate); mfn = temp64; -return parent_rate * div + parent_rate * mfn / mfd; + temp64 = (u64 )parent_rate; + temp64 *= mfn; +do_div (temp64, mfd); + +return parent_rate * div + (unsigned long )temp64; } static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
Greg Kroah-Hartman
maintainerPATCH 38/67 rtc: omap: Fix selecting external osc
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lokesh Vutla <[email protected]>
commit 3984903a2e3906d3def220e688040ce93368200a upstream.
RTC can be clocked from an external 32KHz oscillator, or from the Peripheral PLL. The RTC has an internal oscillator buffer to support direct operation with a crystal.
----------------------------------------
| Device --------- |
| | | |
| | RTCSS | |
| --------- | | |
OSC |<------| RTC | | | |
|------>| OSC |--- | | |
| -------- | | | |
| ----|clk | |
| -------- | | | |
| | PRCM |--- | | |
| -------- -------- |
----------------------------------------The RTC functional clock is sourced by default from the clock derived from the Peripheral PLL. In order to select source as external osc clk the following changes needs to be done:
- Enable the RTC OSC (RTC_OSC_REG[4]OSC32K_GZ = 0)
- Enable the clock mux(RTC_OSC_REG[6]K32CLK_EN = 1)
- Select the external clock source (RTC_OSC_REG[3]32KCLK_SEL = 1)
--- drivers/rtc/rtc-omap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/rtc/rtc-omap.c +4 -2
@@ -109,6 +109,7 @@/* OMAP_RTC_OSC_REG bit fields: */ #define OMAP_RTC_OSC_32KCLK_EN BIT(6)#define OMAP_RTC_OSC_SEL_32KCLK_SRC BIT(3) +#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE BIT(4)/* OMAP_RTC_IRQWAKEEN bit fields: */ #define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)
@@ -646,8 +647,9 @@ static int omap_rtc_probe(struct platfor*/ if (rtc->has_ext_clk) { reg =rtc_read (rtc,OMAP_RTC_OSC_REG ); -rtc_write (rtc,OMAP_RTC_OSC_REG , - reg |OMAP_RTC_OSC_SEL_32KCLK_SRC ); + reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE ; + reg |=OMAP_RTC_OSC_32KCLK_EN |OMAP_RTC_OSC_SEL_32KCLK_SRC ; +rtc_writel (rtc,OMAP_RTC_OSC_REG , reg); } rtc->type->lock (rtc);
Greg Kroah-Hartman
maintainerPATCH 39/67 iwlwifi: pcie: fix SPLC structure parsing
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luca Coelho <[email protected]>
commit e0d9727c111a5917a1184c71c1a8e6f78c7fc41d upstream.
The SPLC data parsing is too restrictive and was not trying find the correct element for WiFi. This causes problems with some BIOSes where the SPLC method exists, but doesn't have a WiFi entry on the first element of the list. The domain type values are also incorrect according to the specification.
Fix this by complying with the actual specification.
Additionally, replace all occurrences of SPLX to SPLC, since SPLX is only a structure internal to the ACPI tables, and may not even exist.
--- drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 77 +++++++++++++++----------- 1 file changed, 47 insertions(+), 30 deletions(-)
drivers/net/wireless/intel/iwlwifi/pcie/drv.c +47 -30
@@ -526,48 +526,64 @@ static const struct pci_device_id iwl_hwMODULE_DEVICE_TABLE (pci, iwl_hw_card_ids);#ifdef CONFIG_ACPI -#define SPL_METHOD "SPLC" -#define SPL_DOMAINTYPE_MODULE BIT(0) -#define SPL_DOMAINTYPE_WIFI BIT(1) -#define SPL_DOMAINTYPE_WIGIG BIT(2) -#define SPL_DOMAINTYPE_RFEM BIT(3) +#define ACPI_SPLC_METHOD "SPLC" +#define ACPI_SPLC_DOMAIN_WIFI (0x07) -static u64 splx_get_pwr_limit (struct iwl_trans *trans,union acpi_object *splx) +static u64 splc_get_pwr_limit (struct iwl_trans *trans,union acpi_object *splc) { -union acpi_object *limits, *domain_type, *power_limit; +union acpi_object *data_pkg, *dflt_pwr_limit; +int i; -if (splx->type !=ACPI_TYPE_PACKAGE || - splx->package.count !=2 || - splx->package.elements[0 ].type !=ACPI_TYPE_INTEGER || - splx->package.elements[0 ].integer.value !=0 ) { -IWL_ERR (trans,"Unsupported splx structure\n" ); +/* We need at least two elements, one for the revision and one +* for the data itself. Also check that the revision is +* supported (currently only revision 0). +*/ +if (splc->type !=ACPI_TYPE_PACKAGE || + splc->package.count <2 || + splc->package.elements[0 ].type !=ACPI_TYPE_INTEGER || + splc->package.elements[0 ].integer.value !=0 ) { +IWL_DEBUG_INFO (trans, +"Unsupported structure returned by the SPLC method. Ignoring.\n" );return 0 ; } - limits = &splx->package.elements[1 ]; -if (limits->type !=ACPI_TYPE_PACKAGE || - limits->package.count <2 || - limits->package.elements[0 ].type !=ACPI_TYPE_INTEGER || - limits->package.elements[1 ].type !=ACPI_TYPE_INTEGER ) { -IWL_ERR (trans,"Invalid limits element\n" ); -return 0 ; +/* loop through all the packages to find the one for WiFi */ +for (i =1 ; i < splc->package.count; i++) { +union acpi_object *domain; + + data_pkg = &splc->package.elements[i]; + +/* Skip anything that is not a package with the right +* amount of elements (i.e. at least 2 integers). +*/ +if (data_pkg->type !=ACPI_TYPE_PACKAGE || + data_pkg->package.count <2 || + data_pkg->package.elements[0 ].type !=ACPI_TYPE_INTEGER || + data_pkg->package.elements[1 ].type !=ACPI_TYPE_INTEGER ) +continue ; + + domain = &data_pkg->package.elements[0 ]; +if (domain->integer.value ==ACPI_SPLC_DOMAIN_WIFI ) +break ; + + data_pkg =NULL ; } - domain_type = &limits->package.elements[0 ]; - power_limit = &limits->package.elements[1 ]; -if (!(domain_type->integer.value &SPL_DOMAINTYPE_WIFI )) { -IWL_DEBUG_INFO (trans,"WiFi power is not limited\n" ); +if (!data_pkg) { +IWL_DEBUG_INFO (trans, +"No element for the WiFi domain returned by the SPLC method.\n" );return 0 ; } -return power_limit->integer.value; + dflt_pwr_limit = &data_pkg->package.elements[1 ]; +return dflt_pwr_limit->integer.value; }static void set_dflt_pwr_limit (struct iwl_trans *trans,struct pci_dev *pdev) {acpi_handle pxsx_handle;acpi_handle handle; -struct acpi_buffer splx = {ACPI_ALLOCATE_BUFFER ,NULL }; +struct acpi_buffer splc = {ACPI_ALLOCATE_BUFFER ,NULL };acpi_status status; pxsx_handle =ACPI_HANDLE (&pdev->dev);
@@ -578,23 +594,24 @@ static void set_dflt_pwr_limit(struct iw }/* Get the method's handle */ - status =acpi_get_handle (pxsx_handle, (acpi_string )SPL_METHOD , &handle); + status =acpi_get_handle (pxsx_handle, (acpi_string )ACPI_SPLC_METHOD , + &handle);if (ACPI_FAILURE (status)) { -IWL_DEBUG_INFO (trans,"SPL method not found\n" ); +IWL_DEBUG_INFO (trans,"SPLC method not found\n" );return ; }/* Call SPLC with no arguments */ - status =acpi_evaluate_object (handle,NULL ,NULL , &splx); + status =acpi_evaluate_object (handle,NULL ,NULL , &splc);if (ACPI_FAILURE (status)) {IWL_ERR (trans,"SPLC invocation failed (0x%x)\n" , status);return ; } - trans->dflt_pwr_limit =splx_get_pwr_limit (trans, splx.pointer); + trans->dflt_pwr_limit =splc_get_pwr_limit (trans, splc.pointer);IWL_DEBUG_INFO (trans,"Default power limit set to %lld\n" , trans->dflt_pwr_limit); -kfree (splx.pointer); +kfree (splc.pointer); }#else /* CONFIG_ACPI */
Greg Kroah-Hartman
maintainerPATCH 40/67 iwlwifi: pcie: mark command queue lock with separate lockdep class
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit faead41cc7213ccef5a58c1bf518ac24816fe8a6 upstream.
Emmanuel reports that when CMD_WANT_ASYNC_CALLBACK is used by mvm, the callback will be called with the command queue lock held, and mvm will try to stop all (other) TX queues, which acquires their locks - this caused a false lockdep recursive locking report.
Suppress this report by marking the command queue lock with a new, separate, lock class so lockdep can tell the difference between the two types of queues.
--- drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/wireless/intel/iwlwifi/pcie/tx.c +8 -0
@@ -522,6 +522,7 @@ error:static int iwl_pcie_txq_init (struct iwl_trans *trans,struct iwl_txq *txq,int slots_num,u32 txq_id) { +struct iwl_trans_pcie *trans_pcie =IWL_TRANS_GET_PCIE_TRANS (trans);int ret; txq->need_update = false;
@@ -536,6 +537,13 @@ static int iwl_pcie_txq_init(struct iwl_return ret;spin_lock_init (&txq->lock); + +if (txq_id == trans_pcie->cmd_queue) { +static struct lock_class_key iwl_pcie_cmd_queue_lock_class; + +lockdep_set_class (&txq->lock, &iwl_pcie_cmd_queue_lock_class); + } +__skb_queue_head_init (&txq->overflow_q);/*
Greg Kroah-Hartman
maintainerPATCH 41/67 iwlwifi: mvm: fix netdetect starting/stopping for unified images
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luca Coelho <[email protected]>
commit 5a143db8c4a28dab6423cb6197e9f1389da375f2 upstream.
With unified images, we need to make sure the net-detect scan is stopped after resuming, since we don't restart the FW. Also, we need to make sure we check if there are enough scan slots available to run it, as we do with other scans.
--- drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 19 ++++++++++++++ drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 33 +++++++++++++++++++++----- 2 files changed, 46 insertions(+), 6 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/d3.c +19 -0
@@ -1087,6 +1087,15 @@ iwl_mvm_netdetect_config(struct iwl_mvm ret =iwl_mvm_switch_to_d3 (mvm);if (ret)return ret; + }else { +/* In theory, we wouldn't have to stop a running sched +* scan in order to start another one (for +* net-detect). But in practice this doesn't seem to +* work properly, so stop any running sched_scan now. +*/ + ret =iwl_mvm_scan_stop (mvm,IWL_MVM_SCAN_SCHED , true); +if (ret) +return ret; }/* rfkill release can be either for wowlan or netdetect */
@@ -2088,6 +2097,16 @@ static int __iwl_mvm_resume(struct iwl_miwl_mvm_update_changed_regdom (mvm);if (mvm->net_detect) { +/* If this is a non-unified image, we restart the FW, +* so no need to stop the netdetect scan. If that +* fails, continue and try to get the wake-up reasons, +* but trigger a HW restart by keeping a failure code +* in ret. +*/ +if (unified_image) + ret =iwl_mvm_scan_stop (mvm,IWL_MVM_SCAN_NETDETECT , + false); +iwl_mvm_query_netdetect_reasons (mvm, vif);/* has unlocked the mutex, so skip that */ goto out;
drivers/net/wireless/intel/iwlwifi/mvm/scan.c +27 -6
@@ -1185,6 +1185,9 @@ static int iwl_mvm_num_scans(struct iwl_static int iwl_mvm_check_running_scans (struct iwl_mvm *mvm,int type) { +bool unified_image =fw_has_capa (&mvm->fw->ucode_capa, +IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG ); +/* This looks a bit arbitrary, but the idea is that if we run * out of possible simultaneous scans and the userspace is * trying to run a scan type that is already running, we
@@ -1211,12 +1214,30 @@ static int iwl_mvm_check_running_scans(sreturn -EBUSY ;return iwl_mvm_scan_stop (mvm,IWL_MVM_SCAN_REGULAR , true);case IWL_MVM_SCAN_NETDETECT : -/* No need to stop anything for net-detect since the -* firmware is restarted anyway. This way, any sched -* scans that were running will be restarted when we -* resume. -*/ -return 0 ; +/* For non-unified images, there's no need to stop +* anything for net-detect since the firmware is +* restarted anyway. This way, any sched scans that +* were running will be restarted when we resume. +*/ +if (!unified_image) +return 0 ; + +/* If this is a unified image and we ran out of scans, +* we need to stop something. Prefer stopping regular +* scans, because the results are useless at this +* point, and we should be able to keep running +* another scheduled scan while suspended. +*/ +if (mvm->scan_status &IWL_MVM_SCAN_REGULAR_MASK ) +return iwl_mvm_scan_stop (mvm,IWL_MVM_SCAN_REGULAR , + true); +if (mvm->scan_status &IWL_MVM_SCAN_SCHED_MASK ) +return iwl_mvm_scan_stop (mvm,IWL_MVM_SCAN_SCHED , + true); + +/* fall through, something is wrong if no scan was +* running but we ran out of scans. +*/ default :WARN_ON (1 );break ;
Greg Kroah-Hartman
maintainerPATCH 42/67 iwlwifi: mvm: fix d3_test with unified D0/D3 images
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luca Coelho <[email protected]>
commit 85cd69b8f1f7e289fe931a82889e673fd0f04842 upstream.
When a unified D0/D3 image is used, we don't restart the FW in the D0->D3->D0 transitions. Therefore, the d3_test functionality should not call ieee8021_restart_hw() when the resuming either.
--- drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/d3.c +15 -10
@@ -2290,7 +2290,8 @@ static void iwl_mvm_d3_test_disconn_workstatic int iwl_mvm_d3_test_release (struct inode *inode,struct file *file) {struct iwl_mvm *mvm = inode->i_private; -int remaining_time =10 ; +bool unified_image =fw_has_capa (&mvm->fw->ucode_capa, +IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG ); mvm->d3_test_active = false;
@@ -2301,17 +2302,21 @@ static int iwl_mvm_d3_test_release(struc mvm->trans->system_pm_mode =IWL_PLAT_PM_MODE_DISABLED ;iwl_abort_notification_waits (&mvm->notif_wait); -ieee80211_restart_hw (mvm->hw); +if (!unified_image) { +int remaining_time =10 ; -/* wait for restart and disconnect all interfaces */ -while (test_bit (IWL_MVM_STATUS_IN_HW_RESTART , &mvm->status) && - remaining_time >0 ) { - remaining_time--; -msleep (1000 ); - } +ieee80211_restart_hw (mvm->hw); + +/* wait for restart and disconnect all interfaces */ +while (test_bit (IWL_MVM_STATUS_IN_HW_RESTART , &mvm->status) && + remaining_time >0 ) { + remaining_time--; +msleep (1000 ); + } -if (remaining_time ==0 ) -IWL_ERR (mvm,"Timed out waiting for HW restart to finish!\n" ); +if (remaining_time ==0 ) +IWL_ERR (mvm,"Timed out waiting for HW restart!\n" ); + } ieee80211_iterate_active_interfaces_atomic( mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
Greg Kroah-Hartman
maintainerPATCH 43/67 iwlwifi: mvm: wake the wait queue when the RX sync counter is zero
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sara Sharon <[email protected]>
commit 3a732c65de427fdae67a243fd331356034b5a1e8 upstream.
When we sync the RX queues the driver waits to receive echo notification on all the RX queues.
The wait queue is set with timeout until all queues have received the notification.
However, iwl_mvm_rx_queue_notif() never woke up the wait queue, with the result of the counter value being checked only when the timeout expired.
This may cause a latency of up to 1 second.
--- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 3 +-- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 1 + drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 1 + drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +1 -2
@@ -4097,7 +4097,6 @@ void iwl_mvm_sync_rx_queues_internal(str struct iwl_mvm_internal_rxq_notif *notif, u32 size) { -DECLARE_WAIT_QUEUE_HEAD_ONSTACK (notif_waitq );u32 qmask =BIT (mvm->trans->num_rx_queues) -1 ;int ret;
@@ -4119,7 +4118,7 @@ void iwl_mvm_sync_rx_queues_internal(str }if (notif->sync) - ret =wait_event_timeout (notif_waitq, + ret =wait_event_timeout (mvm->rx_sync_waitq,atomic_read (&mvm->queue_sync_counter) ==0 ,HZ );WARN_ON_ONCE (!ret);
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +1 -0
@@ -932,6 +932,7 @@ struct iwl_mvm {/* sync d0i3_tx queue and IWL_MVM_STATUS_IN_D0I3 status flag */ spinlock_t d0i3_tx_lock;wait_queue_head_t d0i3_exit_waitq; +wait_queue_head_t rx_sync_waitq;/* BT-Coex */ struct iwl_bt_coex_profile_notif last_bt_notif;
drivers/net/wireless/intel/iwlwifi/mvm/ops.c +1 -0
@@ -618,6 +618,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *spin_lock_init (&mvm->refs_lock);skb_queue_head_init (&mvm->d0i3_tx);init_waitqueue_head (&mvm->d0i3_exit_waitq); +init_waitqueue_head (&mvm->rx_sync_waitq);atomic_set (&mvm->queue_sync_counter,0 );
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +2 -1
@@ -545,7 +545,8 @@ void iwl_mvm_rx_queue_notif(struct iwl_m "Received expired RX queue sync message\n");return ; } -atomic_dec (&mvm->queue_sync_counter); +if (!atomic_dec_return (&mvm->queue_sync_counter)) +wake_up (&mvm->rx_sync_waitq); }switch (internal_notif->type) {
Greg Kroah-Hartman
maintainerPATCH 44/67 mfd: core: Fix device reference leak in mfd_clone_cell
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 722f191080de641f023feaa7d5648caf377844f5 upstream.
Make sure to drop the reference taken by bus_find_device_by_name() before returning from mfd_clone_cell().
--- drivers/mfd/mfd-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/mfd/mfd-core.c +2 -0
@@ -399,6 +399,8 @@ int mfd_clone_cell(const char *cell, con clones[i]); } +put_device (dev); +return 0 ; }EXPORT_SYMBOL (mfd_clone_cell);
Greg Kroah-Hartman
maintainerPATCH 45/67 sunrpc: svc_age_temp_xprts_now should not call setsockopt non-tcp transports
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Scott Mayhew <[email protected]>
commit ea08e39230e898844d9de5b60cdbb30067cebfe7 upstream.
This fixes the following panic that can occur with NFSoRDMA.
general protection fault: 0000 [#1] SMP Modules linked in: rpcrdma ib_isert iscsi_target_mod ib_iser libiscsi
scsi_transport_iscsi ib_srpt target_core_mod ib_srp scsi_transport_srp scsi_tgt ib_ipoib rdma_ucm ib_ucm ib_uverbs ib_umad rdma_cm ib_cm iw_cm mlx5_ib ib_core intel_powerclamp coretemp kvm_intel kvm sg ioatdma ipmi_devintf ipmi_ssif dcdbas iTCO_wdt iTCO_vendor_support pcspkr irqbypass sb_edac shpchp dca crc32_pclmul ghash_clmulni_intel edac_core lpc_ich aesni_intel lrw gf128mul glue_helper ablk_helper mei_me mei ipmi_si cryptd wmi ipmi_msghandler acpi_pad acpi_power_meter nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c sd_mod crc_t10dif crct10dif_generic mgag200 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt ahci fb_sys_fops ttm libahci mlx5_core tg3 crct10dif_pclmul drm crct10dif_common
ptp i2c_core libata crc32c_intel pps_core fjes dm_mirror dm_region_hash dm_log dm_mod
CPU: 1 PID: 120 Comm: kworker/1:1 Not tainted 3.10.0-514.el7.x86_64 #1 Hardware name: Dell Inc. PowerEdge R320/0KM5PX, BIOS 2.4.2 01/29/2015 Workqueue: events check_lifetime task: ffff88031f506dd0 ti: ffff88031f584000 task.ti: ffff88031f584000 RIP: 0010:[<ffffffff8168d847>] [<ffffffff8168d847>] _raw_spin_lock_bh+0x17/0x50 RSP: 0018:ffff88031f587ba8 EFLAGS: 00010206 RAX: 0000000000020000 RBX: 20041fac02080072 RCX: ffff88031f587fd8 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 20041fac02080072 RBP: ffff88031f587bb0 R08: 0000000000000008 R09: ffffffff8155be77 R10: ffff880322a59b00 R11: ffffea000bf39f00 R12: 20041fac02080072 R13: 000000000000000d R14: ffff8800c4fbd800 R15: 0000000000000001 FS: 0000000000000000(0000) GS:ffff880322a40000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f3c52d4547e CR3: 00000000019ba000 CR4: 00000000001407e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Stack: 20041fac02080002 ffff88031f587bd0 ffffffff81557830 20041fac02080002 ffff88031f587c78 ffff88031f587c40 ffffffff8155ae08 000000010157df32 0000000800000001 ffff88031f587c20 ffffffff81096acb ffffffff81aa37d0 Call Trace: [<ffffffff81557830>] lock_sock_nested+0x20/0x50 [<ffffffff8155ae08>] sock_setsockopt+0x78/0x940 [<ffffffff81096acb>] ? lock_timer_base.isra.33+0x2b/0x50 [<ffffffff8155397d>] kernel_setsockopt+0x4d/0x50 [<ffffffffa0386284>] svc_age_temp_xprts_now+0x174/0x1e0 [sunrpc] [<ffffffffa03b681d>] nfsd_inetaddr_event+0x9d/0xd0 [nfsd] [<ffffffff81691ebc>] notifier_call_chain+0x4c/0x70 [<ffffffff810b687d>] __blocking_notifier_call_chain+0x4d/0x70 [<ffffffff810b68b6>] blocking_notifier_call_chain+0x16/0x20 [<ffffffff815e8538>] __inet_del_ifa+0x168/0x2d0 [<ffffffff815e8cef>] check_lifetime+0x25f/0x270 [<ffffffff810a7f3b>] process_one_work+0x17b/0x470 [<ffffffff810a8d76>] worker_thread+0x126/0x410 [<ffffffff810a8c50>] ? rescuer_thread+0x460/0x460 [<ffffffff810b052f>] kthread+0xcf/0xe0 [<ffffffff810b0460>] ? kthread_create_on_node+0x140/0x140 [<ffffffff81696418>] ret_from_fork+0x58/0x90 [<ffffffff810b0460>] ? kthread_create_on_node+0x140/0x140 Code: ca 75 f1 5d c3 0f 1f 80 00 00 00 00 eb d9 66 0f 1f 44 00 00 0f 1f
44 00 00 55 48 89 e5 53 48 89 fb e8 7e 04 a0 ff b8 00 00 02 00 <f0> 0f c1 03 89 c2 c1 ea 10 66 39 c2 75 03 5b 5d c3 83 e2 fe 0f RIP [<ffffffff8168d847>] _raw_spin_lock_bh+0x17/0x50
RSP <ffff88031f587ba8>
--- include/linux/sunrpc/svc_xprt.h | 1 + net/sunrpc/svc_xprt.c | 11 +---------- net/sunrpc/svcsock.c | 21 +++++++++++++++++++++ net/sunrpc/xprtrdma/svc_rdma_transport.c | 6 ++++++ 4 files changed, 29 insertions(+), 10 deletions(-)
include/linux/sunrpc/svc_xprt.h +1 -0
@@ -25,6 +25,7 @@ struct svc_xprt_ops {void (*xpo_detach)(struct svc_xprt *);void (*xpo_free)(struct svc_xprt *);int (*xpo_secure_port)(struct svc_rqst *); +void (*xpo_kill_temp_xprt)(struct svc_xprt *); };struct svc_xprt_class {
net/sunrpc/svc_xprt.c +1 -10
@@ -1002,14 +1002,8 @@ static void svc_age_temp_xprts(unsignedvoid svc_age_temp_xprts_now (struct svc_serv *serv,struct sockaddr *server_addr) {struct svc_xprt *xprt; -struct svc_sock *svsk; -struct socket *sock;struct list_head *le, *next;LIST_HEAD (to_be_closed); -struct linger no_linger = { - .l_onoff =1 , - .l_linger =0 , - };spin_lock_bh (&serv->sv_lock);list_for_each_safe (le, next, &serv->sv_tempsocks) {
@@ -1027,10 +1021,7 @@ void svc_age_temp_xprts_now(struct svc_slist_del_init (le); xprt = list_entry(le, struct svc_xprt, xpt_list);dprintk ("svc_age_temp_xprts_now: closing %p\n" , xprt); - svsk = container_of(xprt, struct svc_sock, sk_xprt); - sock = svsk->sk_sock; -kernel_setsockopt (sock,SOL_SOCKET ,SO_LINGER , - (char *)&no_linger,sizeof (no_linger)); + xprt->xpt_ops->xpo_kill_temp_xprt (xprt);svc_close_xprt (xprt); } }
net/sunrpc/svcsock.c +21 -0
@@ -438,6 +438,21 @@ static int svc_tcp_has_wspace(struct svcreturn !test_bit (SOCK_NOSPACE , &svsk->sk_sock->flags); } +static void svc_tcp_kill_temp_xprt (struct svc_xprt *xprt) +{ +struct svc_sock *svsk; +struct socket *sock; +struct linger no_linger = { + .l_onoff =1 , + .l_linger =0 , + }; + + svsk = container_of(xprt, struct svc_sock, sk_xprt); + sock = svsk->sk_sock; +kernel_setsockopt (sock,SOL_SOCKET ,SO_LINGER , + (char *)&no_linger,sizeof (no_linger)); +} +/* * See net/ipv6/ip_sockglue.c : ip_cmsg_recv_pktinfo */
@@ -648,6 +663,10 @@ static struct svc_xprt *svc_udp_accept(sreturn NULL ; } +static void svc_udp_kill_temp_xprt (struct svc_xprt *xprt) +{ +} + static struct svc_xprt *svc_udp_create(struct svc_serv *serv, struct net *net, struct sockaddr *sa, int salen,
@@ -667,6 +686,7 @@ static struct svc_xprt_ops svc_udp_ops = .xpo_has_wspace = svc_udp_has_wspace, .xpo_accept = svc_udp_accept, .xpo_secure_port = svc_sock_secure_port, + .xpo_kill_temp_xprt = svc_udp_kill_temp_xprt, };static struct svc_xprt_class svc_udp_class = {
@@ -1242,6 +1262,7 @@ static struct svc_xprt_ops svc_tcp_ops = .xpo_has_wspace = svc_tcp_has_wspace, .xpo_accept = svc_tcp_accept, .xpo_secure_port = svc_sock_secure_port, + .xpo_kill_temp_xprt = svc_tcp_kill_temp_xprt, };static struct svc_xprt_class svc_tcp_class = {
net/sunrpc/xprtrdma/svc_rdma_transport.c +6 -0
@@ -67,6 +67,7 @@ static void svc_rdma_detach(struct svc_xstatic void svc_rdma_free (struct svc_xprt *xprt);static int svc_rdma_has_wspace (struct svc_xprt *xprt);static int svc_rdma_secure_port (struct svc_rqst *); +static void svc_rdma_kill_temp_xprt (struct svc_xprt *);static struct svc_xprt_ops svc_rdma_ops = { .xpo_create = svc_rdma_create,
@@ -79,6 +80,7 @@ static struct svc_xprt_ops svc_rdma_ops .xpo_has_wspace = svc_rdma_has_wspace, .xpo_accept = svc_rdma_accept, .xpo_secure_port = svc_rdma_secure_port, + .xpo_kill_temp_xprt = svc_rdma_kill_temp_xprt, };struct svc_xprt_class svc_rdma_class = {
@@ -1285,6 +1287,10 @@ static int svc_rdma_secure_port(struct sreturn 1 ; } +static void svc_rdma_kill_temp_xprt (struct svc_xprt *xprt) +{ +} +int svc_rdma_send (struct svcxprt_rdma *xprt,struct ib_send_wr *wr) {struct ib_send_wr *bad_wr, *n_wr;
Greg Kroah-Hartman
maintainerPATCH 46/67 uwb: fix device reference leaks
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit d6124b409ca33c100170ffde51cd8dff761454a1 upstream.
This subsystem consistently fails to drop the device reference taken by class_find_device().
Note that some of these lookup functions already take a reference to the returned data, while others claim no reference is needed (or does not seem need one).
--- drivers/uwb/lc-rc.c | 16 +++++++++++++--- drivers/uwb/pal.c | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-)
drivers/uwb/lc-rc.c +13 -3
@@ -56,8 +56,11 @@ static struct uwb_rc *uwb_rc_find_by_indstruct uwb_rc *rc =NULL ; dev =class_find_device (&uwb_rc_class,NULL , &index, uwb_rc_index_match); -if (dev) +if (dev) { rc =dev_get_drvdata (dev); +put_device (dev); + } +return rc; }
@@ -467,7 +470,9 @@ struct uwb_rc *__uwb_rc_try_get(struct uif (dev) { rc =dev_get_drvdata (dev);__uwb_rc_get (rc); +put_device (dev); } +return rc; }EXPORT_SYMBOL_GPL (__uwb_rc_try_get);
@@ -520,8 +525,11 @@ struct uwb_rc *uwb_rc_get_by_grandpa(con dev =class_find_device (&uwb_rc_class,NULL , grandpa_dev, find_rc_grandpa); -if (dev) +if (dev) { rc =dev_get_drvdata (dev); +put_device (dev); + } +return rc; }EXPORT_SYMBOL_GPL (uwb_rc_get_by_grandpa);
@@ -553,8 +561,10 @@ struct uwb_rc *uwb_rc_get_by_dev(const sstruct uwb_rc *rc =NULL ; dev =class_find_device (&uwb_rc_class,NULL , addr, find_rc_dev); -if (dev) +if (dev) { rc =dev_get_drvdata (dev); +put_device (dev); + }return rc; }
drivers/uwb/pal.c +2 -0
@@ -97,6 +97,8 @@ static bool uwb_rc_class_device_exists(s dev =class_find_device (&uwb_rc_class,NULL , target_rc, find_rc); +put_device (dev); +return (dev !=NULL ); }
Greg Kroah-Hartman
maintainerPATCH 47/67 PM / sleep: fix device reference leak in test_suspend
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit ceb75787bc75d0a7b88519ab8a68067ac690f55a upstream.
Make sure to drop the reference taken by class_find_device() after opening the RTC device.
--- kernel/power/suspend_test.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/power/suspend_test.c +3 -1
@@ -203,8 +203,10 @@ static int __init test_suspend(void)/* RTCs have initialized by now too ... can we use one? */ dev =class_find_device (rtc_class,NULL ,NULL , has_wakealarm); -if (dev) +if (dev) { rtc =rtc_class_open (dev_name (dev)); +put_device (dev); + }if (!rtc) {printk (warn_no_rtc);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 48/67 PM / sleep: dont suspend parent when async child suspend_{noirq, late} fails
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
commit 6f75c3fd56daf547d684127a7f83c283c3c160d1 upstream.
Consider two devices, A and B, where B is a child of A, and B utilizes asynchronous suspend (it does not matter whether A is sync or async). If B fails to suspend_noirq() or suspend_late(), or is interrupted by a wakeup (pm_wakeup_pending()), then it aborts and sets the async_error variable. However, device A does not (immediately) check the async_error variable; it may continue to run its own suspend_noirq()/suspend_late() callback. This is bad.
We can resolve this problem by doing our error and wakeup checking (particularly, for the async_error flag) after waiting for children to suspend, instead of before. This also helps align the logic for the noirq and late suspend cases with the logic in __device_suspend().
It's easy to observe this erroneous behavior by, for example, forcing a device to sleep a bit in its suspend_noirq() (to ensure the parent is waiting for the child to complete), then return an error, and watch the parent suspend_noirq() still get called. (Or similarly, fake a wakeup event at the right (or is it wrong?) time.)
--- drivers/base/power/main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/base/power/main.c +4 -4
@@ -1027,6 +1027,8 @@ static int __device_suspend_noirq(structTRACE_DEVICE (dev);TRACE_SUSPEND (0 ); +dpm_wait_for_children (dev, async); +if (async_error) goto Complete;
@@ -1038,8 +1040,6 @@ static int __device_suspend_noirq(structif (dev->power.syscore || dev->power.direct_complete) goto Complete; -dpm_wait_for_children (dev, async); -if (dev->pm_domain) { info ="noirq power domain " ; callback =pm_noirq_op (&dev->pm_domain->ops, state);
@@ -1174,6 +1174,8 @@ static int __device_suspend_late(struct__pm_runtime_disable (dev, false); +dpm_wait_for_children (dev, async); +if (async_error) goto Complete;
@@ -1185,8 +1187,6 @@ static int __device_suspend_late(structif (dev->power.syscore || dev->power.direct_complete) goto Complete; -dpm_wait_for_children (dev, async); -if (dev->pm_domain) { info ="late power domain " ; callback =pm_late_early_op (&dev->pm_domain->ops, state);
Greg Kroah-Hartman
maintainerPATCH 49/67 perf hists: Fix column length on --hierarchy
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
commit c72ab446cac1d6c9551fd26c4cfef1b2fc5041fd upstream.
Markus reported that there's a weird behavior on perf top --hierarchy regarding the column length.
Looking at the code, I found a dubious code which affects the symptoms. When --hierarchy option is used, the last column length might be inaccurate since it skips to update the length on leaf entries.
I cannot remember why it did and looks like a leftover from previous version during the development.
Anyway, updating the column length often is not harmful. So let's move the code out.
--- tools/perf/util/hist.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/perf/util/hist.c +6 -6
@@ -1596,18 +1596,18 @@ static void hists__hierarchy_output_resoif (prog)ui_progress__update (prog,1 ); + hists->nr_entries++; +if (!he->filtered) { + hists->nr_non_filtered_entries++; +hists__calc_col_len (hists, he); + } +if (!he->leaf) {hists__hierarchy_output_resort (hists, prog, &he->hroot_in, &he->hroot_out, min_callchain_hits, use_callchain); - hists->nr_entries++; -if (!he->filtered) { - hists->nr_non_filtered_entries++; -hists__calc_col_len (hists, he); - } -continue ; }
Greg Kroah-Hartman
maintainerPATCH 50/67 IB/rxe: Update qp state for user query
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonatan Cohen <[email protected]>
commit 6d931308f55faaef3f30bd0346c47f99528b229d upstream.
The method rxe_qp_error() transitions QP to error state and make sure the QP is drained. It did not though update the QP state for user's query.
This patch fixes this.
--- drivers/infiniband/sw/rxe/rxe_qp.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/sw/rxe/rxe_qp.c +1 -0
@@ -573,6 +573,7 @@ void rxe_qp_error(struct rxe_qp *qp) { qp->req.state =QP_STATE_ERROR ; qp->resp.state =QP_STATE_ERROR ; + qp->attr.qp_state =IB_QPS_ERR ;/* drain work and packet queues */ rxe_run_task (&qp->resp.task,1 );
Greg Kroah-Hartman
maintainerPATCH 51/67 IB/rxe: Fix kernel panic in UDP tunnel with GRO and RX checksum
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonatan Cohen <[email protected]>
commit 1454ca3a97e147bb91e98b087446c39cf6692a48 upstream.
Missing initialization of udp_tunnel_sock_cfg causes to following kernel panic, while kernel tries to execute gro_receive().
While being there, we converted udp_port_cfg to use the same initialization scheme as udp_tunnel_sock_cfg.
------------[ cut here ]------------ kernel tried to execute NX-protected page - exploit attempt? (uid: 0) BUG: unable to handle kernel paging request at ffffffffa0588c50 IP: [<ffffffffa0588c50>] __this_module+0x50/0xffffffffffff8400 [ib_rxe] PGD 1c09067 PUD 1c0a063 PMD bb394067 PTE 80000000ad5e8163 Oops: 0011 [#1] SMP Modules linked in: ib_rxe ip6_udp_tunnel udp_tunnel CPU: 5 PID: 0 Comm: swapper/5 Not tainted 4.7.0-rc3+ #2 Hardware name: Red Hat KVM, BIOS Bochs 01/01/2011 task: ffff880235e4e680 ti: ffff880235e68000 task.ti: ffff880235e68000 RIP: 0010:[<ffffffffa0588c50>] [<ffffffffa0588c50>] __this_module+0x50/0xffffffffffff8400 [ib_rxe] RSP: 0018:ffff880237343c80 EFLAGS: 00010282 RAX: 00000000dffe482d RBX: ffff8800ae330900 RCX: 000000002001b712 RDX: ffff8800ae330900 RSI: ffff8800ae102578 RDI: ffff880235589c00 RBP: ffff880237343cb0 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: ffff8800ae33e262 R13: ffff880235589c00 R14: 0000000000000014 R15: ffff8800ae102578 FS: 0000000000000000(0000) GS:ffff880237340000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffffffffa0588c50 CR3: 0000000001c06000 CR4: 00000000000006e0 Stack: ffffffff8160860e ffff8800ae330900 ffff8800ae102578 0000000000000014 000000000000004e ffff8800ae102578 ffff880237343ce0 ffffffff816088fb 0000000000000000 ffff8800ae330900 0000000000000000 00000000ffad0000 Call Trace: <IRQ> [<ffffffff8160860e>] ? udp_gro_receive+0xde/0x130 [<ffffffff816088fb>] udp4_gro_receive+0x10b/0x2d0 [<ffffffff81611373>] inet_gro_receive+0x1d3/0x270 [<ffffffff81594e29>] dev_gro_receive+0x269/0x3b0 [<ffffffff81595188>] napi_gro_receive+0x38/0x120 [<ffffffffa011caee>] mlx5e_handle_rx_cqe+0x27e/0x340 [mlx5_core] [<ffffffffa011d076>] mlx5e_poll_rx_cq+0x66/0x6d0 [mlx5_core] [<ffffffffa011d7ae>] mlx5e_napi_poll+0x8e/0x400 [mlx5_core] [<ffffffff815949a0>] net_rx_action+0x160/0x380 [<ffffffff816a9197>] __do_softirq+0xd7/0x2c5 [<ffffffff81085c35>] irq_exit+0xf5/0x100 [<ffffffff816a8f16>] do_IRQ+0x56/0xd0 [<ffffffff816a6dcc>] common_interrupt+0x8c/0x8c <EOI> [<ffffffff81061f96>] ? native_safe_halt+0x6/0x10 [<ffffffff81037ade>] default_idle+0x1e/0xd0 [<ffffffff8103828f>] arch_cpu_idle+0xf/0x20 [<ffffffff810c37dc>] default_idle_call+0x3c/0x50 [<ffffffff810c3b13>] cpu_startup_entry+0x323/0x3c0 [<ffffffff81050d8c>] start_secondary+0x15c/0x1a0 RIP [<ffffffffa0588c50>] __this_module+0x50/0xffffffffffff8400 [ib_rxe] RSP <ffff880237343c80> CR2: ffffffffa0588c50 ---[ end trace 489ee31fa7614ac5 ]--- Kernel panic - not syncing: Fatal exception in interrupt Kernel Offset: disabled ---[ end Kernel panic - not syncing: Fatal exception in interrupt ------------[ cut here ]------------
--- drivers/infiniband/sw/rxe/rxe_net.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/infiniband/sw/rxe/rxe_net.c +2 -6
@@ -243,10 +243,8 @@ static struct socket *rxe_setup_udp_tunn {int err;struct socket *sock; -struct udp_port_cfg udp_cfg; -struct udp_tunnel_sock_cfg tnl_cfg; - -memset (&udp_cfg,0 ,sizeof (udp_cfg)); +struct udp_port_cfg udp_cfg = {0 }; +struct udp_tunnel_sock_cfg tnl_cfg = {0 };if (ipv6) { udp_cfg.family =AF_INET6 ;
@@ -264,10 +262,8 @@ static struct socket *rxe_setup_udp_tunnreturn ERR_PTR (err); } - tnl_cfg.sk_user_data =NULL ; tnl_cfg.encap_type =1 ; tnl_cfg.encap_rcv = rxe_udp_encap_recv; - tnl_cfg.encap_destroy =NULL ;/* Setup UDP tunnel */ setup_udp_tunnel_sock (net, sock, &tnl_cfg);
Greg Kroah-Hartman
maintainerPATCH 52/67 IB/rxe: Fix handling of erroneous WR
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonatan Cohen <[email protected]>
commit 002e062e13db10973adb8302f231e48b477c7ccf upstream.
To correctly handle a erroneous WR this fix does the following
1. Make sure the bad WQE causes a user completion event.
2. Call rxe_completer to handle the erred WQE.
Before the fix, when rxe_requester found a bad WQE, it changed its status to IB_WC_LOC_PROT_ERR and exit with 0 for non RC QPs.
If this was the 1st WQE then there would be no ACK to invoke the completer and this bad WQE would be stuck in the QP's send-q.
On top of that the requester exiting with 0 caused rxe_do_task to endlessly invoke rxe_requester, resulting in a soft-lockup attached below.
In case the WQE was not the 1st and rxe_completer did get a chance to handle the bad WQE, it did not cause a complete event since the WQE's IB_SEND_SIGNALED flag was not set.
Setting WQE status to IB_SEND_SIGNALED is subject to IBA spec version 1.2.1, section 10.7.3.1 Signaled Completions.
NMI watchdog: BUG: soft lockup - CPU#7 stuck for 22s! [<ffffffffa0590145>] ? rxe_pool_get_index+0x35/0xb0 [rdma_rxe]
[<ffffffffa05952ec>] lookup_mem+0x3c/0xc0 [rdma_rxe] [<ffffffffa0595534>] copy_data+0x1c4/0x230 [rdma_rxe] [<ffffffffa058c180>] rxe_requester+0x9d0/0x1100 [rdma_rxe] [<ffffffff8158e98a>] ? kfree_skbmem+0x5a/0x60 [<ffffffffa05962c9>] rxe_do_task+0x89/0xf0 [rdma_rxe] [<ffffffffa05963e2>] rxe_run_task+0x12/0x30 [rdma_rxe] [<ffffffffa059110a>] rxe_post_send+0x41a/0x550 [rdma_rxe] [<ffffffff811ef922>] ? __kmalloc+0x182/0x200 [<ffffffff816ba512>] ? down_read+0x12/0x40 [<ffffffffa054bd32>] ib_uverbs_post_send+0x532/0x540 [ib_uverbs] [<ffffffff815f8722>] ? tcp_sendmsg+0x402/0xb80 [<ffffffffa05453dc>] ib_uverbs_write+0x18c/0x3f0 [ib_uverbs] [<ffffffff81623c2e>] ? inet_recvmsg+0x7e/0xb0 [<ffffffff8158764d>] ? sock_recvmsg+0x3d/0x50 [<ffffffff81215b87>] __vfs_write+0x37/0x140 [<ffffffff81216892>] vfs_write+0xb2/0x1b0 [<ffffffff81217ce5>] SyS_write+0x55/0xc0 [<ffffffff816bc672>] entry_SYSCALL_64_fastpath+0x1a/0xa
--- drivers/infiniband/sw/rxe/rxe_req.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
drivers/infiniband/sw/rxe/rxe_req.c +13 -8
@@ -695,7 +695,8 @@ next_wqe: qp->req.wqe_index); wqe->state = wqe_state_done; wqe->status =IB_WC_SUCCESS ; - goto complete; +__rxe_do_task (&qp->comp.task); +return 0 ; } payload = mtu; }
@@ -744,13 +745,17 @@ err: wqe->status =IB_WC_LOC_PROT_ERR ; wqe->state = wqe_state_error; -complete: -if (qp_type (qp) !=IB_QPT_RC ) { -while (rxe_completer (qp) ==0 ) - ; - } - -return 0 ; +/* +* IBA Spec. Section 10.7.3.1 SIGNALED COMPLETIONS +* ---------8<---------8<------------- +* ...Note that if a completion error occurs, a Work Completion +* will always be generated, even if the signaling +* indicator requests an Unsignaled Completion. +* ---------8<---------8<------------- +*/ + wqe->wr.send_flags |=IB_SEND_SIGNALED ; +__rxe_do_task (&qp->comp.task); +return -EAGAIN ; exit:return -EAGAIN ;
Greg Kroah-Hartman
maintainerPATCH 53/67 IB/rxe: Clear queue buffer when modifying QP to reset
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonatan Cohen <[email protected]>
commit aa75b07b478a774b1432e2df1be5cd8ae834de0f upstream.
RXE resets the send-q only once in rxe_qp_init_req() when QP is created, but when the QP is reused after QP reset, the send-q holds previous garbage data.
This garbage data wrongly fails CQEs that otherwise should have completed successfully.
--- drivers/infiniband/sw/rxe/rxe_qp.c | 1 + drivers/infiniband/sw/rxe/rxe_queue.c | 9 +++++++++ drivers/infiniband/sw/rxe/rxe_queue.h | 2 ++ 3 files changed, 12 insertions(+)
drivers/infiniband/sw/rxe/rxe_qp.c +1 -0
@@ -522,6 +522,7 @@ static void rxe_qp_reset(struct rxe_qp *if (qp->sq.queue) {__rxe_do_task (&qp->comp.task);__rxe_do_task (&qp->req.task); +rxe_queue_reset (qp->sq.queue); }/* cleanup attributes */
drivers/infiniband/sw/rxe/rxe_queue.c +9 -0
@@ -84,6 +84,15 @@ err1:return -EINVAL ; } +inline void rxe_queue_reset (struct rxe_queue *q) +{ +/* queue is comprised from header and the memory +* of the actual queue. See "struct rxe_queue_buf" in rxe_queue.h +* reset only the queue itself and not the management header +*/ +memset (q->buf->data,0 , q->buf_size -sizeof (struct rxe_queue_buf )); +} +struct rxe_queue *rxe_queue_init (struct rxe_dev *rxe,int *num_elem,unsigned int elem_size)
drivers/infiniband/sw/rxe/rxe_queue.h +2 -0
@@ -84,6 +84,8 @@ int do_mmap_info(struct rxe_dev *rxe,size_t buf_size, struct rxe_mmap_info **ip_p); +void rxe_queue_reset (struct rxe_queue *q); +struct rxe_queue *rxe_queue_init (struct rxe_dev *rxe,int *num_elem,unsigned int elem_size);
Greg Kroah-Hartman
maintainerPATCH 54/67 IB/mlx4: Check gid_index return value
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Jurgens <[email protected]>
commit 37995116fecfce2b61ee3da6e73b3e394c6818f9 upstream.
Check the returned GID index value and return an error if it is invalid.
--- drivers/infiniband/hw/mlx4/ah.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/infiniband/hw/mlx4/ah.c +4 -1
@@ -102,7 +102,10 @@ static struct ib_ah *create_iboe_ah(struif (vlan_tag <0x1000 ) vlan_tag |= (ah_attr->sl &7 ) <<13 ; ah->av.eth.port_pd =cpu_to_be32 (to_mpd (pd)->pdn | (ah_attr->port_num <<24 )); - ah->av.eth.gid_index =mlx4_ib_gid_index_to_real_index (ibdev, ah_attr->port_num, ah_attr->grh.sgid_index); + ret =mlx4_ib_gid_index_to_real_index (ibdev, ah_attr->port_num, ah_attr->grh.sgid_index); +if (ret <0 ) +return ERR_PTR (ret); + ah->av.eth.gid_index = ret; ah->av.eth.vlan =cpu_to_be16 (vlan_tag); ah->av.eth.hop_limit = ah_attr->grh.hop_limit;if (ah_attr->static_rate) {
Greg Kroah-Hartman
maintainerPATCH 55/67 IB/mlx4: Fix create CQ error flow
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matan Barak <[email protected]>
commit 593ff73bcfdc79f79a8a0df55504f75ad3e5d1a9 upstream.
Currently, if ib_copy_to_udata fails, the CQ won't be deleted from the radix tree and the HW (HW2SW).
--- drivers/infiniband/hw/mlx4/cq.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/infiniband/hw/mlx4/cq.c +4 -1
@@ -253,11 +253,14 @@ struct ib_cq *mlx4_ib_create_cq(struct iif (context)if (ib_copy_to_udata (udata, &cq->mcq.cqn,sizeof (__u32))) { err = -EFAULT ; - goto err_dbmap; + goto err_cq_free; }return &cq->ibcq; +err_cq_free: +mlx4_cq_free (dev->dev, &cq->mcq); + err_dbmap:if (context)mlx4_ib_db_unmap_user (to_mucontext (context), &cq->db);
Greg Kroah-Hartman
maintainerPATCH 56/67 IB/mlx5: Validate requested RQT size
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maor Gottlieb <[email protected]>
commit efd7f40082a0dfd112eb87ff2124467a5739216f upstream.
Validate that the requested size of RQT is supported by firmware.
--- drivers/infiniband/hw/mlx5/qp.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/infiniband/hw/mlx5/qp.c +8 -0
@@ -4702,6 +4702,14 @@ struct ib_rwq_ind_table *mlx5_ib_create_ udata->inlen))return ERR_PTR (-EOPNOTSUPP ); +if (init_attr->log_ind_tbl_size > +MLX5_CAP_GEN (dev->mdev, log_max_rqt_size)) { +mlx5_ib_dbg (dev,"log_ind_tbl_size = %d is bigger than supported = %d\n" , + init_attr->log_ind_tbl_size, +MLX5_CAP_GEN (dev->mdev, log_max_rqt_size)); +return ERR_PTR (-EINVAL ); + } + min_resp_len = offsetof(typeof (resp ), reserved) +sizeof (resp.reserved);if (udata->outlen && udata->outlen < min_resp_len)return ERR_PTR (-EINVAL );
Greg Kroah-Hartman
maintainerPATCH 57/67 IB/mlx5: Use cache line size to select CQE stride
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Jurgens <[email protected]>
commit 16b0e0695a73b68d8ca40288c8f9614ef208917b upstream.
When creating kernel CQs use 128B CQE stride if the cache line size is 128B, 64B otherwise. This prevents multiple CQEs from residing in a 128B cache line, which can cause retries when there are concurrent read and writes in one cache line.
Tested with IPoIB on PPC64, saw ~5% throughput
improvement.
--- drivers/infiniband/hw/mlx5/cq.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/cq.c +1 -2
@@ -917,8 +917,7 @@ struct ib_cq *mlx5_ib_create_cq(struct iif (err) goto err_create; }else { -/* for now choose 64 bytes till we have a proper interface */ - cqe_size =64 ; + cqe_size =cache_line_size () ==128 ?128 :64 ; err =create_cq_kernel (dev, cq, entries, cqe_size, &cqb, &index, &inlen);if (err)
Greg Kroah-Hartman
maintainerPATCH 58/67 IB/mlx5: Fix memory leak in query device
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Majd Dibbiny <[email protected]>
commit 90be7c8ab72853ff9fc407f01518a898df1f3045 upstream.
We need to free dev->port when we fail to enable RoCE or initialize node data.
--- drivers/infiniband/hw/mlx5/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/main.c +2 -2
@@ -2835,7 +2835,7 @@ static void *mlx5_ib_add(struct mlx5_cor } err =init_node_data (dev);if (err) - goto err_dealloc; + goto err_free_port;mutex_init (&dev->flow_db.lock);mutex_init (&dev->cap_mask_mutex);
@@ -2845,7 +2845,7 @@ static void *mlx5_ib_add(struct mlx5_corif (ll ==IB_LINK_LAYER_ETHERNET ) { err =mlx5_enable_roce (dev);if (err) - goto err_dealloc; + goto err_free_port; } err =create_dev_resources (&dev->devr);
Greg Kroah-Hartman
maintainerPATCH 59/67 IB/mlx5: Fix fatal error dispatching
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eli Cohen <[email protected]>
commit dbaaff2a2caa03d472b5cc53a3fbfd415c97dc26 upstream.
When an internal error condition is detected, make sure to set the device inactive after dispatching the event so ULPs can get a notification of this event.
--- drivers/infiniband/hw/mlx5/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/main.c +5 -2
@@ -2100,14 +2100,14 @@ static void mlx5_ib_event(struct mlx5_co {struct mlx5_ib_dev *ibdev = (struct mlx5_ib_dev *)context;struct ib_event ibev; - +bool fatal = false;u8 port =0 ;switch (event) {case MLX5_DEV_EVENT_SYS_ERROR : - ibdev->ib_active = false; ibev.event =IB_EVENT_DEVICE_FATAL ;mlx5_ib_handle_internal_error (ibdev); + fatal = true;break ;case MLX5_DEV_EVENT_PORT_UP :
@@ -2154,6 +2154,9 @@ static void mlx5_ib_event(struct mlx5_coif (ibdev->ib_active)ib_dispatch_event (&ibev); + +if (fatal) + ibdev->ib_active = false; }static void get_ext_port_caps (struct mlx5_ib_dev *dev)
Greg Kroah-Hartman
maintainerPATCH 60/67 IB/mlx5: Fix NULL pointer dereference on debug print
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eli Cohen <[email protected]>
commit a1ab8402d15d2305d2315d96ec3294bfdf16587e upstream.
For XRC QP CQs may not exist. Check before attempting dereference.
--- drivers/infiniband/hw/mlx5/qp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/qp.c +2 -2
@@ -2037,8 +2037,8 @@ struct ib_qp *mlx5_ib_create_qp(struct imlx5_ib_dbg (dev,"ib qpnum 0x%x, mlx qpn 0x%x, rcqn 0x%x, scqn 0x%x\n" , qp->ibqp.qp_num, qp->trans_qp.base.mqp.qpn, -to_mcq (init_attr->recv_cq)->mcq.cqn, -to_mcq (init_attr->send_cq)->mcq.cqn); + init_attr->recv_cq ?to_mcq (init_attr->recv_cq)->mcq.cqn :-1 , + init_attr->send_cq ?to_mcq (init_attr->send_cq)->mcq.cqn :-1 ); qp->trans_qp.xrcdn = xrcdn;
Greg Kroah-Hartman
maintainerPATCH 61/67 IB/core: Avoid unsigned int overflow in sg_alloc_table
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Bloch <[email protected]>
commit 3c7ba5760ab8eedec01159b267bb9bfcffe522ac upstream.
sg_alloc_table gets unsigned int as parameter while the driver returns it as size_t. Check npages isn't greater than maximum unsigned int.
--- drivers/infiniband/core/umem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/core/umem.c +1 -1
@@ -174,7 +174,7 @@ struct ib_umem *ib_umem_get(struct ib_uc cur_base = addr &PAGE_MASK ; -if (npages ==0 ) { +if (npages ==0 || npages >UINT_MAX ) { ret = -EINVAL ; goto out; }
Greg Kroah-Hartman
maintainerPATCH 62/67 IB/hfi1: Remove incorrect IS_ERR check
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dennis Dalessandro <[email protected]>
commit 2b16056f845207967a32497f41cf92b57849f934 upstream.
Remove IS_ERR check from caching code as the function being called does not actually return error pointers.
--- drivers/infiniband/hw/hfi1/user_sdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/hfi1/user_sdma.c +1 -1
@@ -1152,7 +1152,7 @@ static int pin_vector_pages(struct user_ rb_node =hfi1_mmu_rb_extract (pq->handler, (unsigned long )iovec->iov.iov_base, iovec->iov.iov_len); -if (rb_node && !IS_ERR (rb_node)) +if (rb_node) node = container_of(rb_node, struct sdma_mmu_node, rb);else rb_node =NULL ;
Greg Kroah-Hartman
maintainerPATCH 63/67 IB/uverbs: Fix leak of XRC target QPs
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tariq Toukan <[email protected]>
commit 5b810a242c28e1d8d64d718cebe75b79d86a0b2d upstream.
The real QP is destroyed in case of the ref count reaches zero, but for XRC target QPs this call was missed and caused to QP leaks.
Let's call to destroy for all flows.
--- drivers/infiniband/core/uverbs_main.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/infiniband/core/uverbs_main.c +2 -5
@@ -262,12 +262,9 @@ static int ib_uverbs_cleanup_ucontext(st container_of(uobj, struct ib_uqp_object, uevent.uobject);idr_remove_uobj (&ib_uverbs_qp_idr, uobj); -if (qp != qp->real_qp) { -ib_close_qp (qp); - }else { +if (qp == qp->real_qp)ib_uverbs_detach_umcast (qp, uqp); -ib_destroy_qp (qp); - } +ib_destroy_qp (qp);ib_uverbs_release_uevent (file, &uqp->uevent);kfree (uqp); }
Greg Kroah-Hartman
maintainerPATCH 64/67 IB/cm: Mark stale CM ids whenever the mad agent was unregistered
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Bloch <[email protected]>
commit 9db0ff53cb9b43ed75bacd42a89c1a0ab048b2b0 upstream.
When there is a CM id object that has port assigned to it, it means that the cm-id asked for the specific port that it should go by it, but if that port was removed (hot-unplug event) the cm-id was not updated. In order to fix that the port keeps a list of all the cm-id's that are planning to go by it, whenever the port is removed it marks all of them as invalid.
This commit fixes a kernel panic which happens when running traffic between guests and we force reboot a guest mid traffic, it triggers a kernel panic:
Call Trace: [<ffffffff815271fa>] ? panic+0xa7/0x16f [<ffffffff8152b534>] ? oops_end+0xe4/0x100 [<ffffffff8104a00b>] ? no_context+0xfb/0x260 [<ffffffff81084db2>] ? del_timer_sync+0x22/0x30 [<ffffffff8104a295>] ? __bad_area_nosemaphore+0x125/0x1e0 [<ffffffff81084240>] ? process_timeout+0x0/0x10 [<ffffffff8104a363>] ? bad_area_nosemaphore+0x13/0x20 [<ffffffff8104aabf>] ? __do_page_fault+0x31f/0x480 [<ffffffff81065df0>] ? default_wake_function+0x0/0x20 [<ffffffffa0752675>] ? free_msg+0x55/0x70 [mlx5_core] [<ffffffffa0753434>] ? cmd_exec+0x124/0x840 [mlx5_core] [<ffffffff8105a924>] ? find_busiest_group+0x244/0x9f0 [<ffffffff8152d45e>] ? do_page_fault+0x3e/0xa0 [<ffffffff8152a815>] ? page_fault+0x25/0x30 [<ffffffffa024da25>] ? cm_alloc_msg+0x35/0xc0 [ib_cm] [<ffffffffa024e821>] ? ib_send_cm_dreq+0xb1/0x1e0 [ib_cm] [<ffffffffa024f836>] ? cm_destroy_id+0x176/0x320 [ib_cm] [<ffffffffa024fb00>] ? ib_destroy_cm_id+0x10/0x20 [ib_cm] [<ffffffffa034f527>] ? ipoib_cm_free_rx_reap_list+0xa7/0x110 [ib_ipoib] [<ffffffffa034f590>] ? ipoib_cm_rx_reap+0x0/0x20 [ib_ipoib] [<ffffffffa034f5a5>] ? ipoib_cm_rx_reap+0x15/0x20 [ib_ipoib] [<ffffffff81094d20>] ? worker_thread+0x170/0x2a0 [<ffffffff8109b2a0>] ? autoremove_wake_function+0x0/0x40 [<ffffffff81094bb0>] ? worker_thread+0x0/0x2a0 [<ffffffff8109aef6>] ? kthread+0x96/0xa0 [<ffffffff8100c20a>] ? child_rip+0xa/0x20 [<ffffffff8109ae60>] ? kthread+0x0/0xa0 [<ffffffff8100c200>] ? child_rip+0x0/0x20
--- drivers/infiniband/core/cm.c | 126 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 110 insertions(+), 16 deletions(-)
drivers/infiniband/core/cm.c +110 -16
@@ -80,6 +80,8 @@ static struct ib_cm {__be32 random_id_operand;struct list_head timewait_list;struct workqueue_struct *wq; +/* Sync on cm change port state */ +spinlock_t state_lock; } cm;/* Counter indexes ordered by attribute ID */
@@ -161,6 +163,8 @@ struct cm_port {struct ib_mad_agent *mad_agent;struct kobject port_obj;u8 port_num; +struct list_head cm_priv_prim_list; +struct list_head cm_priv_altr_list;struct cm_counter_group counter_group[CM_COUNTER_GROUPS ]; };
@@ -241,6 +245,12 @@ struct cm_id_private {u8 service_timeout;u8 target_ack_delay; +struct list_head prim_list; +struct list_head altr_list; +/* Indicates that the send port mad is registered and av is set */ +int prim_send_port_not_ready; +int altr_send_port_not_ready; +struct list_head work_list;atomic_t work_count; };
@@ -259,20 +269,47 @@ static int cm_alloc_msg(struct cm_id_pristruct ib_mad_agent *mad_agent;struct ib_mad_send_buf *m;struct ib_ah *ah; +struct cm_av *av; +unsigned long flags, flags2; +int ret =0 ; +/* don't let the port to be released till the agent is down */ +spin_lock_irqsave (&cm.state_lock, flags2); +spin_lock_irqsave (&cm.lock, flags); +if (!cm_id_priv->prim_send_port_not_ready) + av = &cm_id_priv->av; +else if (!cm_id_priv->altr_send_port_not_ready && + (cm_id_priv->alt_av.port)) + av = &cm_id_priv->alt_av; +else { +pr_info ("%s: not valid CM id\n" , __func__); + ret = -ENODEV ; +spin_unlock_irqrestore (&cm.lock, flags); + goto out; + } +spin_unlock_irqrestore (&cm.lock, flags); +/* Make sure the port haven't released the mad yet */ mad_agent = cm_id_priv->av.port->mad_agent; - ah =ib_create_ah (mad_agent->qp->pd, &cm_id_priv->av.ah_attr); -if (IS_ERR (ah)) -return PTR_ERR (ah); +if (!mad_agent) { +pr_info ("%s: not a valid MAD agent\n" , __func__); + ret = -ENODEV ; + goto out; + } + ah =ib_create_ah (mad_agent->qp->pd, &av->ah_attr); +if (IS_ERR (ah)) { + ret =PTR_ERR (ah); + goto out; + } m =ib_create_send_mad (mad_agent, cm_id_priv->id.remote_cm_qpn, - cm_id_priv->av.pkey_index, + av->pkey_index,0 ,IB_MGMT_MAD_HDR ,IB_MGMT_MAD_DATA ,GFP_ATOMIC ,IB_MGMT_BASE_VERSION );if (IS_ERR (m)) {ib_destroy_ah (ah); -return PTR_ERR (m); + ret =PTR_ERR (m); + goto out; }/* Timeout set by caller if response is expected. */
@@ -282,7 +319,10 @@ static int cm_alloc_msg(struct cm_id_priatomic_inc (&cm_id_priv->refcount); m->context[0 ] = cm_id_priv; *msg = m; -return 0 ; + +out: +spin_unlock_irqrestore (&cm.state_lock, flags2); +return ret; } static int cm_alloc_response_msg(struct cm_port *port,
@@ -352,7 +392,8 @@ static void cm_init_av_for_response(stru grh, &av->ah_attr); } -static int cm_init_av_by_path (struct ib_sa_path_rec *path,struct cm_av *av) +static int cm_init_av_by_path (struct ib_sa_path_rec *path,struct cm_av *av, +struct cm_id_private *cm_id_priv) {struct cm_device *cm_dev;struct cm_port *port =NULL ;
@@ -387,7 +428,17 @@ static int cm_init_av_by_path(struct ib_ &av->ah_attr); av->timeout = path->packet_life_time +1 ; -return 0 ; +spin_lock_irqsave (&cm.lock, flags); +if (&cm_id_priv->av == av) +list_add_tail (&cm_id_priv->prim_list, &port->cm_priv_prim_list); +else if (&cm_id_priv->alt_av == av) +list_add_tail (&cm_id_priv->altr_list, &port->cm_priv_altr_list); +else + ret = -EINVAL ; + +spin_unlock_irqrestore (&cm.lock, flags); + +return ret; }static int cm_alloc_id (struct cm_id_private *cm_id_priv)
@@ -677,6 +728,8 @@ struct ib_cm_id *ib_create_cm_id(structspin_lock_init (&cm_id_priv->lock);init_completion (&cm_id_priv->comp);INIT_LIST_HEAD (&cm_id_priv->work_list); +INIT_LIST_HEAD (&cm_id_priv->prim_list); +INIT_LIST_HEAD (&cm_id_priv->altr_list);atomic_set (&cm_id_priv->work_count,-1 );atomic_set (&cm_id_priv->refcount,1 );return &cm_id_priv->id;
@@ -892,6 +945,15 @@ retest:break ; } +spin_lock_irq (&cm.lock); +if (!list_empty (&cm_id_priv->altr_list) && + (!cm_id_priv->altr_send_port_not_ready)) +list_del (&cm_id_priv->altr_list); +if (!list_empty (&cm_id_priv->prim_list) && + (!cm_id_priv->prim_send_port_not_ready)) +list_del (&cm_id_priv->prim_list); +spin_unlock_irq (&cm.lock); +cm_free_id (cm_id->local_id);cm_deref_id (cm_id_priv);wait_for_completion (&cm_id_priv->comp);
@@ -1192,12 +1254,13 @@ int ib_send_cm_req(struct ib_cm_id *cm_i goto out; } - ret =cm_init_av_by_path (param->primary_path, &cm_id_priv->av); + ret =cm_init_av_by_path (param->primary_path, &cm_id_priv->av, + cm_id_priv);if (ret) goto error1;if (param->alternate_path) { ret =cm_init_av_by_path (param->alternate_path, - &cm_id_priv->alt_av); + &cm_id_priv->alt_av, cm_id_priv);if (ret) goto error1; }
@@ -1653,7 +1716,8 @@ static int cm_req_handler(struct cm_workdev_put (gid_attr.ndev); } work->path[0 ].gid_type = gid_attr.gid_type; - ret =cm_init_av_by_path (&work->path[0 ], &cm_id_priv->av); + ret =cm_init_av_by_path (&work->path[0 ], &cm_id_priv->av, + cm_id_priv); }if (ret) { int err = ib_get_cached_gid(work->port->cm_dev->ib_device,
@@ -1672,7 +1736,8 @@ static int cm_req_handler(struct cm_work goto rejected; }if (req_msg->alt_local_lid) { - ret =cm_init_av_by_path (&work->path[1 ], &cm_id_priv->alt_av); + ret =cm_init_av_by_path (&work->path[1 ], &cm_id_priv->alt_av, + cm_id_priv);if (ret) { ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_ALT_GID, &work->path[0].sgid,
@@ -2727,7 +2792,8 @@ int ib_send_cm_lap(struct ib_cm_id *cm_i goto out; } - ret =cm_init_av_by_path (alternate_path, &cm_id_priv->alt_av); + ret =cm_init_av_by_path (alternate_path, &cm_id_priv->alt_av, + cm_id_priv);if (ret) goto out; cm_id_priv->alt_av.timeout =
@@ -2839,7 +2905,8 @@ static int cm_lap_handler(struct cm_workcm_init_av_for_response (work->port, work->mad_recv_wc->wc, work->mad_recv_wc->recv_buf.grh, &cm_id_priv->av); -cm_init_av_by_path (param->alternate_path, &cm_id_priv->alt_av); +cm_init_av_by_path (param->alternate_path, &cm_id_priv->alt_av, + cm_id_priv); ret =atomic_inc_and_test (&cm_id_priv->work_count);if (!ret)list_add_tail (&work->list, &cm_id_priv->work_list);
@@ -3031,7 +3098,7 @@ int ib_send_cm_sidr_req(struct ib_cm_idreturn -EINVAL ; cm_id_priv = container_of(cm_id, struct cm_id_private, id); - ret =cm_init_av_by_path (param->path, &cm_id_priv->av); + ret =cm_init_av_by_path (param->path, &cm_id_priv->av, cm_id_priv);if (ret) goto out;
@@ -3468,7 +3535,9 @@ out:static int cm_migrate (struct ib_cm_id *cm_id) {struct cm_id_private *cm_id_priv; +struct cm_av tmp_av;unsigned long flags; +int tmp_send_port_not_ready;int ret =0 ; cm_id_priv = container_of(cm_id, struct cm_id_private, id);
@@ -3477,7 +3546,14 @@ static int cm_migrate(struct ib_cm_id *c (cm_id->lap_state == IB_CM_LAP_UNINIT || cm_id->lap_state == IB_CM_LAP_IDLE)) { cm_id->lap_state =IB_CM_LAP_IDLE ; +/* Swap address vector */ + tmp_av = cm_id_priv->av; cm_id_priv->av = cm_id_priv->alt_av; + cm_id_priv->alt_av = tmp_av; +/* Swap port send ready state */ + tmp_send_port_not_ready = cm_id_priv->prim_send_port_not_ready; + cm_id_priv->prim_send_port_not_ready = cm_id_priv->altr_send_port_not_ready; + cm_id_priv->altr_send_port_not_ready = tmp_send_port_not_ready; } else ret = -EINVAL ;spin_unlock_irqrestore (&cm_id_priv->lock, flags);
@@ -3888,6 +3964,9 @@ static void cm_add_one(struct ib_device port->cm_dev = cm_dev; port->port_num = i; +INIT_LIST_HEAD (&port->cm_priv_prim_list); +INIT_LIST_HEAD (&port->cm_priv_altr_list); + ret =cm_create_port_fs (port);if (ret) goto error1;
@@ -3945,6 +4024,8 @@ static void cm_remove_one(struct ib_devi {struct cm_device *cm_dev = client_data;struct cm_port *port; +struct cm_id_private *cm_id_priv; +struct ib_mad_agent *cur_mad_agent;struct ib_port_modify port_modify = { .clr_port_cap_mask =IB_PORT_CM_SUP };
@@ -3968,15 +4049,27 @@ static void cm_remove_one(struct ib_devi port = cm_dev->port[i-1 ];ib_modify_port (ib_device, port->port_num,0 , &port_modify); +/* Mark all the cm_id's as not valid */ +spin_lock_irq (&cm.lock); +list_for_each_entry (cm_id_priv, &port->cm_priv_altr_list, altr_list) + cm_id_priv->altr_send_port_not_ready =1 ; +list_for_each_entry (cm_id_priv, &port->cm_priv_prim_list, prim_list) + cm_id_priv->prim_send_port_not_ready =1 ; +spin_unlock_irq (&cm.lock);/* * We flush the queue here after the going_down set, this * verify that no new works will be queued in the recv handler, * after that we can call the unregister_mad_agent */ flush_workqueue (cm.wq); -ib_unregister_mad_agent (port->mad_agent); +spin_lock_irq (&cm.state_lock); + cur_mad_agent = port->mad_agent; + port->mad_agent =NULL ; +spin_unlock_irq (&cm.state_lock); +ib_unregister_mad_agent (cur_mad_agent);cm_remove_port_fs (port); } +device_unregister (cm_dev->device);kfree (cm_dev); }
@@ -3989,6 +4082,7 @@ static int __init ib_cm_init(void)INIT_LIST_HEAD (&cm.device_list);rwlock_init (&cm.device_lock);spin_lock_init (&cm.lock); +spin_lock_init (&cm.state_lock); cm.listen_service_table =RB_ROOT ; cm.listen_service_id =be64_to_cpu (IB_CM_ASSIGN_SERVICE_ID ); cm.remote_id_table =RB_ROOT ;
Greg Kroah-Hartman
maintainerPATCH 65/67 netfilter: nft_dynset: fix element timeout for HZ != 1000
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anders K. Pedersen <[email protected]>
commit a8b1e36d0d1d6f51490e7adce35367ed6adb10e7 upstream.
With HZ=100 element timeout in dynamic sets (i.e. flow tables) is 10 times higher than configured.
Add proper conversion to/from jiffies, when interacting with userspace.
I tested this on Linux 4.8.1, and it applies cleanly to current nf and nf-next trees.
--- net/netfilter/nft_dynset.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/netfilter/nft_dynset.c +4 -2
@@ -143,7 +143,8 @@ static int nft_dynset_init(const structif (tb[NFTA_DYNSET_TIMEOUT ] !=NULL ) {if (!(set->flags &NFT_SET_TIMEOUT ))return -EINVAL ; - timeout =be64_to_cpu (nla_get_be64 (tb[NFTA_DYNSET_TIMEOUT ])); + timeout =msecs_to_jiffies (be64_to_cpu (nla_get_be64 ( + tb[NFTA_DYNSET_TIMEOUT ]))); } priv->sreg_key =nft_parse_register (tb[NFTA_DYNSET_SREG_KEY ]);
@@ -230,7 +231,8 @@ static int nft_dynset_dump(struct sk_buf goto nla_put_failure;if (nla_put_string (skb,NFTA_DYNSET_SET_NAME , priv->set->name)) goto nla_put_failure; -if (nla_put_be64 (skb,NFTA_DYNSET_TIMEOUT ,cpu_to_be64 (priv->timeout), +if (nla_put_be64 (skb,NFTA_DYNSET_TIMEOUT , +cpu_to_be64 (jiffies_to_msecs (priv->timeout)),NFTA_DYNSET_PAD )) goto nla_put_failure;if (priv->expr &&nft_expr_dump (skb,NFTA_DYNSET_EXPR , priv->expr))
Greg Kroah-Hartman
maintainerPATCH 66/67 gpio: pca953x: Move memcpy into mutex lock for set multiple
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Reid <[email protected]>
commit 386377b5473043c09b2de40bfe5abfb0fc87e1b4 upstream.
Need to ensure that reg_output is not updated while setting multiple bits. This makes the mutex locking behaviour for the set_multiple call consistent with that of the set_value call.
--- drivers/gpio/gpio-pca953x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpio/gpio-pca953x.c +1 -1
@@ -372,8 +372,8 @@ static void pca953x_gpio_set_multiple(stbreak ; } -memcpy (reg_val, chip->reg_output,NBANK (chip));mutex_lock (&chip->i2c_lock); +memcpy (reg_val, chip->reg_output,NBANK (chip));for (bank=0 ; bank<NBANK (chip); bank++) {unsigned bankmask = mask[bank /sizeof (*mask)] >> ((bank %sizeof (*mask)) *8 );
Greg Kroah-Hartman
maintainerPATCH 67/67 gpio: pca953x: Fix corruption of other gpios in set_multiple.
In reply to Greg Kroah-Hartman4.8-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Reid <[email protected]>
commit 53f8d322234649b4d6f1515b20c127a577efd164 upstream.
gpiod_set_array_value_complex does not clear the bits field. Therefore when the drivers set_multiple funciton is called bits outside the mask are undefined and can be either set or not. So bank_val needs to be masked with bank_mask before or with the reg_val cache.
--- drivers/gpio/gpio-pca953x.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpio/gpio-pca953x.c +1 -0
@@ -380,6 +380,7 @@ static void pca953x_gpio_set_multiple(stif (bankmask) {unsigned bankval = bits[bank /sizeof (*bits)] >> ((bank %sizeof (*bits)) *8 ); + bankval &= bankmask; reg_val[bank] = (reg_val[bank] & ~bankmask) | bankval; } }
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.8.11 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Nov 26 14:54:42 UTC 2016. Anything received after that time might be too late.
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 114 pass: 114 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.8.11 release. There are 67 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Nov 26 14:54:42 UTC 2016. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 114 pass: 114 fail: 0Details are available at http://kerneltests.org/builders.
Great! Thanks for testing both of these and letting me know.
greg k-h
A message that is not in the archive (sent off-list or not yet received): [email protected]
Greg Kroah-Hartman
maintainerQuoted 33 lines · kernelci.org bot
stable-rc boot: 207 boots: 8 failed, 196 passed with 3 offline (v4.8.10-68-g5b1cb43a9ac7)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/kernel/v4.8.10-68-g5b1cb43a9ac7/
Full Build Summary: https://kernelci.org/build/stable-rc/kernel/v4.8.10-68-g5b1cb43a9ac7/Tree: stable-rc
Branch: local/linux-4.8.y
Git Describe: v4.8.10-68-g5b1cb43a9ac7
Git Commit:5b1cb43a9ac7f608fdfc590c139aa66ead8d19ed
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 57 unique boards, 18 SoC families, 30 builds out of 207Boot Failures Detected: https://kernelci.org/boot/?v4.8.10-68-g5b1cb43a9ac7&fail
arm:
multi_v7_defconfig+CONFIG_SMP=n:
exynos5250-snow: 1 failed labmulti_v7_defconfig+CONFIG_PROVE_LOCKING=y:
at91-sama5d4_xplained: 1 failed lab
exynos_defconfig:
exynos5250-arndale: 1 failed labx86:
defconfig+CONFIG_OF_UNITTEST=y:
x86-kvm: 1 failed labdefconfig+CONFIG_KASAN=y:
x86-kvm: 1 failed lab
Quoted 8 lines
defconfig+CONFIG_LKDTM=y:
x86-kvm: 1 failed labdefconfig+kvm_guest:
x86-kvm: 1 failed lab
x86_64_defconfig:
x86-kvm: 1 failed lab
That's not good, is this a code problem, or a "lab" problem?
The logs look like nothing is working for these, so is this a -rc problem?
thanks,
greg k-h
A message that is not in the archive (sent off-list or not yet received): [email protected]
Hello,
Quoted 22 lines · Kevin Hilman
[ + Exynos maintainers ]
Sorry for the lag, I realize that this stable release is already made, but following-up here anyways, and including Exynos maintainers so they are aware of the (possible) regressions in stable/linux-4.8.y.
Quoted 14 lines · kernelci.org bot
stable-rc boot: 207 boots: 8 failed, 196 passed with 3 offline (v4.8.10-68-g5b1cb43a9ac7)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/kernel/v4.8.10-68-g5b1cb43a9ac7/
Full Build Summary: https://kernelci.org/build/stable-rc/kernel/v4.8.10-68-g5b1cb43a9ac7/Tree: stable-rc
Branch: local/linux-4.8.y
Git Describe: v4.8.10-68-g5b1cb43a9ac7
Git Commit:5b1cb43a9ac7f608fdfc590c139aa66ead8d19ed
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 57 unique boards, 18 SoC families, 30 builds out of 207Boot Failures Detected: https://kernelci.org/boot/?v4.8.10-68-g5b1cb43a9ac7&fail
Quoted 9 lines
Quoted 4 lines
arm:
multi_v7_defconfig+CONFIG_SMP=n:
exynos5250-snow: 1 failed labThis one is not new, it's has been failing for awhile in v4.8. The details show a bit more of the history:
https://kernelci.org/boot/id/58379c6e59b514a607f03beb/
There's already a fix for this issue queued in the media tree:
https://git.linuxtv.org/media_tree.git/commit/?id=3467c9a7e7f9
The commit has a Fixes tag so it should be backported to stable once it lands to mainline. I've just pinged to Mauro about it.
Quoted 11 lines
Quoted 2 lines
multi_v7_defconfig+CONFIG_PROVE_LOCKING=y:
at91-sama5d4_xplained: 1 failed labThis one is not a regression, it's a board with a small amount of memory that needs to be blacklisted for the large
CONFIG_PROVE_LOCKING=ykernels.Quoted 2 lines
exynos_defconfig:
exynos5250-arndale: 1 failed labThis one looks like an actual regression, as it was passing in v4.8.10:
This seems to be the issue Viresh reported and fixed with this patch:
https://lkml.org/lkml/2016/10/27/216
Quoted 2 lines
Yes, but IIUC the issue was just not triggered there because the devm_regulator_bulk_get() succeed and so the resource cleanup never happened.
IOW, the bug is also present on older stable kernels but it seems to work just because the driver probe hasn't been deferred AFAICT.
Best regards,
Signature · 3 lines
Javier Martinez Canillas Open Source Group Samsung Research America