4.4.1-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.4.1-stable review
-------------------------
NOTE:
There are still a lot of pending stable patches in the queue, well over 400 of them to be specific, so some of your favorite/pet patches might not be included in these releases. Please be patient as I dig out from this backlog over the next few weeks. If there are specific patches that you just _must_ have included in a stable release soon, please let me know.
-------------------------
This is the start of the stable review cycle for the 4.4.1 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 Fri Jan 29 18:08:16 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.4.1-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.1-rc1
Lorenzo Pieralisi <[email protected]>
arm64: kernel: enforce pmuserenr_el0 initialization and restore
Will Deacon <[email protected]>
arm64: mm: ensure that the zero page is visible to the page table walker
John Blackwood <[email protected]>
arm64: Clear out any singlestep state on a ptrace detach operation
Ulrich Weigand <[email protected]>
powerpc/module: Handle R_PPC64_ENTRY relocations
Ulrich Weigand <[email protected]>
scripts/recordmcount.pl: support data in text section on powerpc
Boqun Feng <[email protected]>
powerpc: Make {cmp}xchg* and their atomic_ versions fully ordered
Boqun Feng <[email protected]>
powerpc: Make value-returning atomics fully ordered
Michael Neuling <[email protected]>
powerpc/tm: Check for already reclaimed tasks
Sven Eckelmann <[email protected]>
batman-adv: Drop immediate orig_node free function
Sven Eckelmann <[email protected]>
batman-adv: Drop immediate batadv_hard_iface free function
Sven Eckelmann <[email protected]>
batman-adv: Drop immediate neigh_ifinfo free function
Sven Eckelmann <[email protected]>
batman-adv: Drop immediate batadv_neigh_node free function
Sven Eckelmann <[email protected]>
batman-adv: Drop immediate batadv_orig_ifinfo free function
Sven Eckelmann <[email protected]>
batman-adv: Avoid recursive call_rcu for batadv_nc_node
Sven Eckelmann <[email protected]>
batman-adv: Avoid recursive call_rcu for batadv_bla_claim
Ido Schimmel <[email protected]>
team: Replace rcu_read_lock with a mutex in team_vlan_rx_kill_vid
Doron Tsur <[email protected]>
net/mlx5_core: Fix trimming down IRQ number
Nikolay Aleksandrov <[email protected]>
bridge: fix lockdep addr_list_lock false positive splat
Eric Dumazet <[email protected]>
ipv6: update skb->csum when CE mark is propagated
Rabin Vincent <[email protected]>
net: bpf: reject invalid shifts
Eric Dumazet <[email protected]>
phonet: properly unshare skbs in phonet_rcv()
Lars Persson <[email protected]>
dwc_eth_qos: Fix dma address for multi-fragment skbs
Karl Heiss <[email protected]>
bonding: Prevent IPv6 link local address on enslaved devices
Konstantin Khlebnikov <[email protected]>
net: preserve IP control block during GSO segmentation
Michal Kubeček <[email protected]>
udp: disallow UFO for sockets with SO_NO_CHECK option
John Fastabend <[email protected]>
net: pktgen: fix null ptr deref in skb allocation
Jamal Hadi Salim <[email protected]>
sched,cls_flower: set key address type when present
Neal Cardwell <[email protected]>
tcp_yeah: don't set ssthresh below 2
Eric Dumazet <[email protected]>
ipv6: tcp: add rcu locking in tcp_v6_send_synack()
Sasha Levin <[email protected]>
net: sctp: prevent writes to cookie_hmac_alg from accessing invalid memory
Nicolas Dichtel <[email protected]>
vxlan: fix test which detect duplicate vxlan iface
willy tarreau <[email protected]>
unix: properly account for FDs passed over unix sockets
Oliver Neukum <[email protected]>
xhci: refuse loading if nousb is used
Lu Baolu <[email protected]>
usb: core: lpm: fix usb3_hardware_lpm sysfs node
Oliver Freyermuth <[email protected]>
USB: cp210x: add ID for ELV Marble Sound Board 1
Peter Wu <[email protected]>
rtlwifi: fix memory leak for USB device
Vinod Koul <[email protected]>
ASoC: compress: Fix compress device direction check
Charles Keepax <[email protected]>
ASoC: wm5110: Fix PGA clear when disabling DRE
Takashi Iwai <[email protected]>
ALSA: timer: Handle disconnection more safely
Takashi Iwai <[email protected]>
ALSA: hda - Flush the pending probe work at remove
Takashi Iwai <[email protected]>
ALSA: hda - Fix missing module loading with model=generic option
Takashi Iwai <[email protected]>
ALSA: hda - Fix bass pin fixup for ASUS N550JX
Takashi Iwai <[email protected]>
ALSA: control: Avoid kernel warnings from tlv ioctl with numid 0
Takashi Iwai <[email protected]>
ALSA: hrtimer: Fix stall by hrtimer_cancel()
Nicolas Boichat <[email protected]>
ALSA: pcm: Fix snd_pcm_hw_params struct copy in compat mode
Nicolas Boichat <[email protected]>
ALSA: seq: Fix snd_seq_call_port_info_ioctl in compat mode
Takashi Iwai <[email protected]>
ALSA: hda - Add fixup for Dell Latitidue E6540
Takashi Iwai <[email protected]>
ALSA: timer: Fix double unlink of active_list
Takashi Iwai <[email protected]>
ALSA: timer: Fix race among timer ioctls
Hui Wang <[email protected]>
ALSA: hda - fix the headset mic detection problem for a Dell laptop
Takashi Iwai <[email protected]>
ALSA: timer: Harden slave timer list handling
Takashi Iwai <[email protected]>
ALSA: usb-audio: Fix mixer ctl regression of Native Instrument devices
Takashi Iwai <[email protected]>
ALSA: hda - Fix white noise on Dell Latitude E5550
Takashi Iwai <[email protected]>
ALSA: seq: Fix race at timer setup and close
Takashi Iwai <[email protected]>
ALSA: usb-audio: Avoid calling usb_autopm_put_interface() at disconnect
Takashi Iwai <[email protected]>
ALSA: seq: Fix missing NULL check at remove_events ioctl
David Henningsson <[email protected]>
ALSA: hda - Fixup inverted internal mic for Lenovo E50-80
Jurgen Kramer <[email protected]>
ALSA: usb: Add native DSD support for Oppo HA-1
Andy Lutomirski <[email protected]>
x86/mm: Improve switch_mm() barrier comments
Andy Lutomirski <[email protected]>
x86/mm: Add barriers and document switch_mm()-vs-flush synchronization
H.J. Lu <[email protected]>
x86/boot: Double BOOT_HEAP_SIZE to 64KB
Mario Kleiner <[email protected]>
x86/reboot/quirks: Add iMac10,1 to pci_reboot_dmi_table[]
Huaitong Han <[email protected]>
kvm: x86: Fix vmwrite to SECONDARY_VM_EXEC_CONTROL
Paolo Bonzini <[email protected]>
KVM: x86: correctly print #AC in traces
Paolo Bonzini <[email protected]>
KVM: x86: expose MSR_TSC_AUX to userspace
Ouyang Zhaowei (Charles) <[email protected]>
x86/xen: don't reset vcpu_info on a cancelled suspend
Yevgeny Pats <[email protected]>
KEYS: Fix keyring ref leak in join_session_keyring()
-------------
Diffstat:
Documentation/ABI/testing/sysfs-bus-usb | 16 ++- Documentation/usb/power-management.txt | 11 +- Makefile | 4 +- arch/arm64/kernel/perf_event.c | 3 - arch/arm64/kernel/ptrace.c | 6 + arch/arm64/mm/mmu.c | 3 + arch/arm64/mm/proc.S | 2 + arch/powerpc/include/asm/cmpxchg.h | 16 +-- arch/powerpc/include/asm/synch.h | 2 +- arch/powerpc/include/uapi/asm/elf.h | 2 + arch/powerpc/kernel/module_64.c | 27 ++++ arch/powerpc/kernel/process.c | 18 +++ arch/x86/include/asm/boot.h | 2 +- arch/x86/include/asm/mmu_context.h | 34 ++++- arch/x86/kernel/reboot.c | 8 ++ arch/x86/kvm/trace.h | 2 +- arch/x86/kvm/vmx.c | 3 +- arch/x86/kvm/x86.c | 11 +- arch/x86/mm/tlb.c | 29 ++++- arch/x86/xen/suspend.c | 3 +- drivers/infiniband/hw/mlx5/cq.c | 2 +- drivers/net/bonding/bond_main.c | 5 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 6 +- drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 +- drivers/net/ethernet/synopsys/dwc_eth_qos.c | 2 +- drivers/net/team/team.c | 6 +- drivers/net/vxlan.c | 12 +- drivers/net/wireless/realtek/rtlwifi/usb.c | 2 + drivers/usb/core/hub.c | 39 ++++-- drivers/usb/core/sysfs.c | 31 ++++- drivers/usb/host/xhci.c | 4 + drivers/usb/serial/cp210x.c | 1 + include/linux/mlx5/cq.h | 2 +- include/linux/mlx5/driver.h | 5 +- include/linux/sched.h | 1 + include/linux/skbuff.h | 3 +- include/linux/usb.h | 4 + include/net/inet_ecn.h | 19 ++- kernel/bpf/verifier.c | 10 ++ net/batman-adv/bridge_loop_avoidance.c | 10 +- net/batman-adv/hard-interface.h | 12 -- net/batman-adv/network-coding.c | 19 ++- net/batman-adv/originator.c | 149 +++++++++------------- net/batman-adv/originator.h | 1 - net/batman-adv/translation-table.c | 28 ++-- net/bridge/br_device.c | 8 ++ net/core/dev.c | 5 + net/core/filter.c | 5 + net/core/pktgen.c | 4 +- net/ipv4/ip_output.c | 3 +- net/ipv4/tcp_yeah.c | 2 +- net/ipv6/ip6_output.c | 2 +- net/ipv6/tcp_ipv6.c | 2 + net/ipv6/xfrm6_mode_tunnel.c | 2 +- net/openvswitch/datapath.c | 5 +- net/phonet/af_phonet.c | 4 + net/sched/cls_flower.c | 10 +- net/sctp/sysctl.c | 2 +- net/unix/af_unix.c | 24 +++- net/unix/garbage.c | 13 +- net/xfrm/xfrm_output.c | 2 + scripts/recordmcount.pl | 3 +- security/keys/process_keys.c | 1 + sound/core/control.c | 2 + sound/core/hrtimer.c | 3 +- sound/core/pcm_compat.c | 13 +- sound/core/seq/seq_clientmgr.c | 2 +- sound/core/seq/seq_compat.c | 9 +- sound/core/seq/seq_queue.c | 2 + sound/core/timer.c | 100 ++++++++++++--- sound/pci/hda/hda_bind.c | 42 ++++-- sound/pci/hda/hda_intel.c | 10 +- sound/pci/hda/patch_realtek.c | 15 +++ sound/soc/codecs/wm5110.c | 8 +- sound/soc/soc-compress.c | 23 +++- sound/usb/card.c | 2 + sound/usb/mixer_quirks.c | 2 +- sound/usb/quirks.c | 1 + 78 files changed, 628 insertions(+), 281 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/67 KEYS: Fix keyring ref leak in join_session_keyring()
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yevgeny Pats <[email protected]>
commit 23567fd052a9abb6d67fe8e7a9ccdd9800a540f2 upstream.
This fixes CVE-2016-0728.
If a thread is asked to join as a session keyring the keyring that's already set as its session, we leak a keyring reference.
This can be tested with the following program:
#include <stddef.h>
#include <stdio.h>
#include <sys/types.h>
#include <keyutils.h>
int main(int argc, const char *argv[])
{
int i = 0;
key_serial_t serial;
serial = keyctl(KEYCTL_JOIN_SESSION_KEYRING,
"leaked-keyring");
if (serial < 0) {
perror("keyctl");
return -1;
}
if (keyctl(KEYCTL_SETPERM, serial,
KEY_POS_ALL | KEY_USR_ALL) < 0) {
perror("keyctl");
return -1;
}
for (i = 0; i < 100; i++) {
serial = keyctl(KEYCTL_JOIN_SESSION_KEYRING,
"leaked-keyring");
if (serial < 0) {
perror("keyctl");
return -1;
}
}
return 0;
}If, after the program has run, there something like the following line in /proc/keys:
3f3d898f I--Q--- 100 perm 3f3f0000 0 0 keyring leaked-keyring: empty
with a usage count of 100 * the number of times the program has been run, then the kernel is malfunctioning. If leaked-keyring has zero usages or has been garbage collected, then the problem is fixed.
--- security/keys/process_keys.c | 1 + 1 file changed, 1 insertion(+)
security/keys/process_keys.c +1 -0
@@ -794,6 +794,7 @@ long join_session_keyring(const char *na ret =PTR_ERR (keyring); goto error2; }else if (keyring == new->session_keyring) { +key_put (keyring); ret =0 ; goto error2; }
Greg Kroah-Hartman
maintainerPATCH 2/67 x86/xen: dont reset vcpu_info on a cancelled suspend
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Ouyang Zhaowei (Charles)" <[email protected]>
commit 6a1f513776b78c994045287073e55bae44ed9f8c upstream.
On a cancelled suspend the vcpu_info location does not change (it's still in the per-cpu area registered by xen_vcpu_setup()). So do not call xen_hvm_init_shared_info() which would make the kernel think its back in the shared info. With the wrong vcpu_info, events cannot be received and the domain will hang after a cancelled suspend.
--- arch/x86/xen/suspend.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/xen/suspend.c +2 -1
@@ -34,7 +34,8 @@ static void xen_hvm_post_suspend(int sus {#ifdef CONFIG_XEN_PVHVM int cpu; -xen_hvm_init_shared_info (); +if (!suspend_cancelled) +xen_hvm_init_shared_info ();xen_callback_vector ();xen_unplug_emulated_devices ();if (xen_feature (XENFEAT_hvm_safe_pvclock)) {
Greg Kroah-Hartman
maintainerPATCH 3/67 KVM: x86: expose MSR_TSC_AUX to userspace
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
commit 9dbe6cf941a6fe82933aef565e4095fb10f65023 upstream.
If we do not do this, it is not properly saved and restored across migration. Windows notices due to its self-protection mechanisms, and is very upset about it (blue screen of death).
--- arch/x86/kvm/x86.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
arch/x86/kvm/x86.c +6 -5
@@ -951,7 +951,7 @@ static u32 msrs_to_save[] = {MSR_CSTAR ,MSR_KERNEL_GS_BASE ,MSR_SYSCALL_MASK ,MSR_LSTAR , #endifMSR_IA32_TSC ,MSR_IA32_CR_PAT ,MSR_VM_HSAVE_PA , -MSR_IA32_FEATURE_CONTROL ,MSR_IA32_BNDCFGS + MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS, MSR_TSC_AUX, };static unsigned num_msrs_to_save;
@@ -4006,16 +4006,17 @@ static void kvm_init_msr_list(void)/* * Even MSRs that are valid in the host may not be exposed -* to the guests in some cases. We could work around this -* in VMX with the generic MSR save/load machinery, but it -* is not really worthwhile since it will really only -* happen with nested virtualization. +* to the guests in some cases. */ switch (msrs_to_save[i]) {case MSR_IA32_BNDCFGS :if (!kvm_x86_ops->mpx_supported ())continue ;break ; +case MSR_TSC_AUX : +if (!kvm_x86_ops->rdtscp_supported ()) +continue ; +break ;default :break ; }
Greg Kroah-Hartman
maintainerPATCH 4/67 KVM: x86: correctly print #AC in traces
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
commit aba2f06c070f604e388cf77b1dcc7f4cf4577eb0 upstream.
Poor #AC was so unimportant until a few days ago that we were not even tracing its name correctly. But now it's all over the place.
--- arch/x86/kvm/trace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/trace.h +1 -1
@@ -268,7 +268,7 @@ TRACE_EVENT(kvm_inj_virq,#define kvm_trace_sym_exc \ EXS(DE), EXS(DB), EXS(BP), EXS(OF), EXS(BR), EXS(UD), EXS(NM), \ EXS(DF), EXS(TS), EXS(NP), EXS(SS), EXS(GP), EXS(PF), \ - EXS(MF), EXS(MC) + EXS(MF), EXS(AC), EXS(MC)/* * Tracepoint for kvm interrupt injection:
Greg Kroah-Hartman
maintainerPATCH 5/67 kvm: x86: Fix vmwrite to SECONDARY_VM_EXEC_CONTROL
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huaitong Han <[email protected]>
commit 45bdbcfdf241149642fb6c25ab0c209d59c371b7 upstream.
vmx_cpuid_tries to update SECONDARY_VM_EXEC_CONTROL in the VMCS, but it will cause a vmwrite error on older CPUs because the code does not check for the presence of CPU_BASED_ACTIVATE_SECONDARY_CONTROLS.
This will get rid of the following trace on e.g. Core2 6600:
vmwrite error: reg 401e value 10 (err 12)
Call Trace: [<ffffffff8116e2b9>] dump_stack+0x40/0x57 [<ffffffffa020b88d>] vmx_cpuid_update+0x5d/0x150 [kvm_intel] [<ffffffffa01d8fdc>] kvm_vcpu_ioctl_set_cpuid2+0x4c/0x70 [kvm] [<ffffffffa01b8363>] kvm_arch_vcpu_ioctl+0x903/0xfa0 [kvm]
--- arch/x86/kvm/vmx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/kvm/vmx.c +2 -1
@@ -8932,7 +8932,8 @@ static void vmx_cpuid_update(struct kvm_ best->ebx &= ~bit (X86_FEATURE_INVPCID ); } -vmcs_set_secondary_exec_control (secondary_exec_ctl); +if (cpu_has_secondary_exec_ctrls ()) +vmcs_set_secondary_exec_control (secondary_exec_ctl);if (static_cpu_has (X86_FEATURE_PCOMMIT ) && nested) {if (guest_cpuid_has_pcommit (vcpu))
Greg Kroah-Hartman
maintainerPATCH 6/67 x86/reboot/quirks: Add iMac10,1 to pci_reboot_dmi_table[]
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Kleiner <[email protected]>
commit 2f0c0b2d96b1205efb14347009748d786c2d9ba5 upstream.
Without the reboot=pci method, the iMac 10,1 simply hangs after printing "Restarting system" at the point when it should reboot. This fixes it.
--- arch/x86/kernel/reboot.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/x86/kernel/reboot.c +8 -0
@@ -182,6 +182,14 @@ static struct dmi_system_id __initdata r DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1"), }, }, + { /* Handle problems with rebooting on the iMac10,1. */ + .callback = set_pci_reboot, + .ident = "Apple iMac10,1", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "iMac10,1"), + }, + },/* ASRock */ {/* Handle problems with rebooting on ASRock Q1900DC-ITX */
Greg Kroah-Hartman
maintainerPATCH 7/67 x86/boot: Double BOOT_HEAP_SIZE to 64KB
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "H.J. Lu" <[email protected]>
commit 8c31902cffc4d716450be549c66a67a8a3dd479c upstream.
When decompressing kernel image during x86 bootup, malloc memory for ELF program headers may run out of heap space, which leads to system halt. This patch doubles BOOT_HEAP_SIZE to 64KB.
Tested with 32-bit kernel which failed to boot without this patch.
--- arch/x86/include/asm/boot.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/boot.h +1 -1
@@ -27,7 +27,7 @@#define BOOT_HEAP_SIZE 0x400000#else /* !CONFIG_KERNEL_BZIP2 */ -#define BOOT_HEAP_SIZE 0x8000 +#define BOOT_HEAP_SIZE 0x10000#endif /* !CONFIG_KERNEL_BZIP2 */
Greg Kroah-Hartman
maintainerPATCH 8/67 x86/mm: Add barriers and document switch_mm()-vs-flush synchronization
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Lutomirski <[email protected]>
commit 71b3c126e61177eb693423f2e18a1914205b165e upstream.
When switch_mm() activates a new PGD, it also sets a bit that tells other CPUs that the PGD is in use so that TLB flush IPIs will be sent. In order for that to work correctly, the bit needs to be visible prior to loading the PGD and therefore starting to fill the local TLB.
Document all the barriers that make this work correctly and add a couple that were missing.
--- arch/x86/include/asm/mmu_context.h | 33 ++++++++++++++++++++++++++++++++- arch/x86/mm/tlb.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 4 deletions(-)
arch/x86/include/asm/mmu_context.h +32 -1
@@ -116,8 +116,34 @@ static inline void switch_mm(struct mm_s#endif cpumask_set_cpu (cpu,mm_cpumask (next)); -/* Re-load page tables */ +/* +* Re-load page tables. +* +* This logic has an ordering constraint: +* +* CPU 0: Write to a PTE for 'next' +* CPU 0: load bit 1 in mm_cpumask. if nonzero, send IPI. +* CPU 1: set bit 1 in next's mm_cpumask +* CPU 1: load from the PTE that CPU 0 writes (implicit) +* +* We need to prevent an outcome in which CPU 1 observes +* the new PTE value and CPU 0 observes bit 1 clear in +* mm_cpumask. (If that occurs, then the IPI will never +* be sent, and CPU 0's TLB will contain a stale entry.) +* +* The bad outcome can occur if either CPU's load is +* reordered before that CPU's store, so both CPUs much +* execute full barriers to prevent this from happening. +* +* Thus, switch_mm needs a full barrier between the +* store to mm_cpumask and any operation that could load +* from next->pgd. This barrier synchronizes with +* remote TLB flushers. Fortunately, load_cr3 is +* serializing and thus acts as a full barrier. +* +*/ load_cr3 (next->pgd); +trace_tlb_flush (TLB_FLUSH_ON_TASK_SWITCH ,TLB_FLUSH_ALL );/* Stop flush ipis for the previous mm */
@@ -156,10 +182,15 @@ static inline void switch_mm(struct mm_s* schedule, protecting us from simultaneous changes. */ cpumask_set_cpu (cpu,mm_cpumask (next)); +/* * We were in lazy tlb mode and leave_mm disabled * tlb flush IPI delivery. We must reload CR3 * to make sure to use no freed page tables. +* +* As above, this is a barrier that forces +* TLB repopulation to be ordered after the +* store to mm_cpumask. */ load_cr3 (next->pgd);trace_tlb_flush (TLB_FLUSH_ON_TASK_SWITCH ,TLB_FLUSH_ALL );
arch/x86/mm/tlb.c +26 -3
@@ -161,7 +161,10 @@ void flush_tlb_current_task(void)preempt_disable ();count_vm_tlb_event (NR_TLB_LOCAL_FLUSH_ALL ); + +/* This is an implicit full barrier that synchronizes with switch_mm. */ local_flush_tlb (); +trace_tlb_flush (TLB_LOCAL_SHOOTDOWN ,TLB_FLUSH_ALL );if (cpumask_any_but (mm_cpumask (mm),smp_processor_id ()) < nr_cpu_ids)flush_tlb_others (mm_cpumask (mm), mm,0UL ,TLB_FLUSH_ALL );
@@ -188,17 +191,29 @@ void flush_tlb_mm_range(struct mm_structunsigned long base_pages_to_flush =TLB_FLUSH_ALL ;preempt_disable (); -if (current->active_mm != mm) +if (current->active_mm != mm) { +/* Synchronize with switch_mm. */ +smp_mb (); + goto out; + }if (!current->mm) {leave_mm (smp_processor_id ()); + +/* Synchronize with switch_mm. */ +smp_mb (); + goto out; }if ((end !=TLB_FLUSH_ALL ) && !(vmflag &VM_HUGETLB )) base_pages_to_flush = (end - start) >>PAGE_SHIFT ; +/* +* Both branches below are implicit full barriers (MOV to CR or +* INVLPG) that synchronize with switch_mm. +*/ if (base_pages_to_flush > tlb_single_page_flush_ceiling) { base_pages_to_flush =TLB_FLUSH_ALL ;count_vm_tlb_event (NR_TLB_LOCAL_FLUSH_ALL );
@@ -228,10 +243,18 @@ void flush_tlb_page(struct vm_area_strucpreempt_disable ();if (current->active_mm == mm) { -if (current->mm) +if (current->mm) { +/* +* Implicit full barrier (INVLPG) that synchronizes +* with switch_mm. +*/ __flush_tlb_one (start); -else + }else {leave_mm (smp_processor_id ()); + +/* Synchronize with switch_mm. */ +smp_mb (); + } }if (cpumask_any_but (mm_cpumask (mm),smp_processor_id ()) < nr_cpu_ids)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Greg Kroah-Hartman
maintainerPATCH 9/67 x86/mm: Improve switch_mm() barrier comments
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Lutomirski <[email protected]>
commit 4eaffdd5a5fe6ff9f95e1ab4de1ac904d5e0fa8b upstream.
My previous comments were still a bit confusing and there was a typo. Fix it up.
--- arch/x86/include/asm/mmu_context.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
arch/x86/include/asm/mmu_context.h +8 -7
@@ -132,14 +132,16 @@ static inline void switch_mm(struct mm_s* be sent, and CPU 0's TLB will contain a stale entry.) * * The bad outcome can occur if either CPU's load is -* reordered before that CPU's store, so both CPUs much +* reordered before that CPU's store, so both CPUs must * execute full barriers to prevent this from happening. * * Thus, switch_mm needs a full barrier between the * store to mm_cpumask and any operation that could load -* from next->pgd. This barrier synchronizes with -* remote TLB flushers. Fortunately, load_cr3 is -* serializing and thus acts as a full barrier. +* from next->pgd. TLB fills are special and can happen +* due to instruction fetches or for no reason at all, +* and neither LOCK nor MFENCE orders them. +* Fortunately, load_cr3() is serializing and gives the +* ordering guarantee we need. * */ load_cr3 (next->pgd);
@@ -188,9 +190,8 @@ static inline void switch_mm(struct mm_s* tlb flush IPI delivery. We must reload CR3 * to make sure to use no freed page tables. * -* As above, this is a barrier that forces -* TLB repopulation to be ordered after the -* store to mm_cpumask. +* As above, load_cr3() is serializing and orders TLB +* fills with respect to the mm_cpumask write. */ load_cr3 (next->pgd);trace_tlb_flush (TLB_FLUSH_ON_TASK_SWITCH ,TLB_FLUSH_ALL );
Greg Kroah-Hartman
maintainerPATCH 10/67 ALSA: usb: Add native DSD support for Oppo HA-1
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jurgen Kramer <[email protected]>
commit a4eae3a506ea4a7d4474cd74e20b423fa8053d91 upstream.
This patch adds native DSD support for the Oppo HA-1. It uses a XMOS chipset but they use their own vendor ID.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1269,6 +1269,7 @@ u64 snd_usb_interface_dsd_format_quirks(case USB_ID (0x20b1 ,0x3008 ):/* iFi Audio micro/nano iDSD */ case USB_ID (0x20b1 ,0x2008 ):/* Matrix Audio X-Sabre */ case USB_ID (0x20b1 ,0x300a ):/* Matrix Audio Mini-i Pro */ +case USB_ID (0x22d8 ,0x0416 ):/* OPPO HA-1*/ if (fp->altsetting ==2 )return SNDRV_PCM_FMTBIT_DSD_U32_BE ;break ;
Greg Kroah-Hartman
maintainerPATCH 11/67 ALSA: hda - Fixup inverted internal mic for Lenovo E50-80
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Henningsson <[email protected]>
commit 56f27013482c0803d978b667fe85de04ce9357cd upstream.
Inform userspace that one channel of the internal mic has reversed polarity, so it does not attempt to add both channels together and end up with silence.
Alsa-info: http://www.alsa-project.org/db/?f=3088f82a0cf977855f92af9db8ad406c04f71efa
--- sound/pci/hda/patch_realtek.c | 8 ++++++++ 1 file changed, 8 insertions(+)
sound/pci/hda/patch_realtek.c +8 -0
@@ -4666,6 +4666,7 @@ enum {ALC290_FIXUP_SUBWOOFER ,ALC290_FIXUP_SUBWOOFER_HSJACK ,ALC269_FIXUP_THINKPAD_ACPI , +ALC269_FIXUP_DMIC_THINKPAD_ACPI ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE ,ALC255_FIXUP_DELL2_MIC_NO_PRESENCE , ALC255_FIXUP_HEADSET_MODE,
@@ -5103,6 +5104,12 @@ static const struct hda_fixup alc269_fix .type = HDA_FIXUP_FUNC, .v.func = hda_fixup_thinkpad_acpi, }, + [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_inv_dmic, + .chained = true, + .chain_id = ALC269_FIXUP_THINKPAD_ACPI, + }, [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl []) {
@@ -5457,6 +5464,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x2226 ,"ThinkPad X250" ,ALC292_FIXUP_TPT440_DOCK ),SND_PCI_QUIRK (0x17aa ,0x2233 ,"Thinkpad" ,ALC293_FIXUP_LENOVO_SPK_NOISE ),SND_PCI_QUIRK (0x17aa ,0x30bb ,"ThinkCentre AIO" ,ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY ), +SND_PCI_QUIRK (0x17aa ,0x3902 ,"Lenovo E50-80" ,ALC269_FIXUP_DMIC_THINKPAD_ACPI ),SND_PCI_QUIRK (0x17aa ,0x3977 ,"IdeaPad S210" ,ALC283_FIXUP_INT_MIC ),SND_PCI_QUIRK (0x17aa ,0x3978 ,"IdeaPad Y410P" ,ALC269_FIXUP_NO_SHUTUP ), SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Greg Kroah-Hartman
maintainerPATCH 12/67 ALSA: seq: Fix missing NULL check at remove_events ioctl
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 030e2c78d3a91dd0d27fef37e91950dde333eba1 upstream.
snd_seq_ioctl_remove_events() calls snd_seq_fifo_clear() unconditionally even if there is no FIFO assigned, and this leads to an Oops due to NULL dereference. The fix is just to add a proper NULL check.
--- sound/core/seq/seq_clientmgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/core/seq/seq_clientmgr.c +1 -1
@@ -1962,7 +1962,7 @@ static int snd_seq_ioctl_remove_events(s* No restrictions so for a user client we can clear * the whole fifo */ -if (client->type ==USER_CLIENT ) +if (client->type ==USER_CLIENT && client->data.user.fifo)snd_seq_fifo_clear (client->data.user.fifo); }
Greg Kroah-Hartman
maintainerPATCH 13/67 ALSA: usb-audio: Avoid calling usb_autopm_put_interface() at disconnect
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 5c06d68bc2a174a6b82dce9f100f55173b9a5189 upstream.
ALSA PCM may still have a leftover instance after disconnection and it delays its release. The problem is that the PCM close code path of USB-audio driver has a call of snd_usb_autosuspend(). This involves with the call of usb_autopm_put_interface() and it may lead to a kernel Oops due to the NULL object like:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000190 IP: [<ffffffff815ae7ef>] usb_autopm_put_interface+0xf/0x30 PGD 0 Call Trace: [<ffffffff8173bd94>] snd_usb_autosuspend+0x14/0x20 [<ffffffff817461bc>] snd_usb_pcm_close.isra.14+0x5c/0x90 [<ffffffff8174621f>] snd_usb_playback_close+0xf/0x20 [<ffffffff816ef58a>] snd_pcm_release_substream.part.36+0x3a/0x90 [<ffffffff816ef6b3>] snd_pcm_release+0xa3/0xb0 [<ffffffff816debb0>] snd_disconnect_release+0xd0/0xe0 [<ffffffff8114d417>] __fput+0x97/0x1d0 [<ffffffff8114d589>] ____fput+0x9/0x10 [<ffffffff8109e452>] task_work_run+0x72/0x90 [<ffffffff81088510>] do_exit+0x280/0xa80 [<ffffffff8108996a>] do_group_exit+0x3a/0xa0 [<ffffffff8109261f>] get_signal+0x1df/0x540 [<ffffffff81040903>] do_signal+0x23/0x620 [<ffffffff8114c128>] ? do_readv_writev+0x128/0x200 [<ffffffff810012e1>] prepare_exit_to_usermode+0x91/0xd0 [<ffffffff810013ba>] syscall_return_slowpath+0x9a/0x120 [<ffffffff817587cd>] ? __sys_recvmsg+0x5d/0x70 [<ffffffff810d2765>] ? ktime_get_ts64+0x45/0xe0 [<ffffffff8115dea0>] ? SyS_poll+0x60/0xf0 [<ffffffff818d2327>] int_ret_from_sys_call+0x25/0x8f
We have already a check of disconnection in snd_usb_autoresume(), but the check is missing its counterpart. The fix is just to put the same check in snd_usb_autosuspend(), too.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=109431
--- sound/usb/card.c | 2 ++ 1 file changed, 2 insertions(+)
sound/usb/card.c +2 -0
@@ -675,6 +675,8 @@ int snd_usb_autoresume(struct snd_usb_auvoid snd_usb_autosuspend (struct snd_usb_audio *chip) { +if (atomic_read (&chip->shutdown)) +return ;if (atomic_dec_and_test (&chip->active))usb_autopm_put_interface (chip->pm_intf); }
Greg Kroah-Hartman
maintainerPATCH 14/67 ALSA: seq: Fix race at timer setup and close
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 3567eb6af614dac436c4b16a8d426f9faed639b3 upstream.
ALSA sequencer code has an open race between the timer setup ioctl and the close of the client. This was triggered by syzkaller fuzzer, and a use-after-free was caught there as a result.
This patch papers over it by adding a proper queue->timer_mutex lock around the timer-related calls in the relevant code path.
--- sound/core/seq/seq_queue.c | 2 ++ 1 file changed, 2 insertions(+)
sound/core/seq/seq_queue.c +2 -0
@@ -142,8 +142,10 @@ static struct snd_seq_queue *queue_new(istatic void queue_delete (struct snd_seq_queue *q) {/* stop and release the timer */ +mutex_lock (&q->timer_mutex);snd_seq_timer_stop (q->timer);snd_seq_timer_close (q); +mutex_unlock (&q->timer_mutex);/* wait until access free */ snd_use_lock_sync (&q->use_lock);/* release resources... */
Greg Kroah-Hartman
maintainerPATCH 15/67 ALSA: hda - Fix white noise on Dell Latitude E5550
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 98070576c4f77509459c83cd2358617ef0769a38 upstream.
Dell Latitude E5550 (1028:062c) has a white noise problem like other Latitude E models, and it gets fixed by the very same quirk as well.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=110591
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -5339,6 +5339,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1028 ,0x05f6 ,"Dell" ,ALC269_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x0615 ,"Dell Vostro 5470" ,ALC290_FIXUP_SUBWOOFER_HSJACK ),SND_PCI_QUIRK (0x1028 ,0x0616 ,"Dell Vostro 5470" ,ALC290_FIXUP_SUBWOOFER_HSJACK ), +SND_PCI_QUIRK (0x1028 ,0x062c ,"Dell Latitude E5550" ,ALC292_FIXUP_DELL_E7X ),SND_PCI_QUIRK (0x1028 ,0x062e ,"Dell Latitude E7450" ,ALC292_FIXUP_DELL_E7X ),SND_PCI_QUIRK (0x1028 ,0x0638 ,"Dell Inspiron 5439" ,ALC290_FIXUP_MONO_SPEAKERS_HSJACK ), SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Greg Kroah-Hartman
maintainerPATCH 16/67 ALSA: usb-audio: Fix mixer ctl regression of Native Instrument devices
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit c4a359a0049f2e17b012b31e801e96566f6391e5 upstream.
The commit [da6d276957ea: ALSA: usb-audio: Add resume support for Native Instruments controls] brought a regression where the Native Instrument audio devices don't get the correct value at update due to the missing shift at writing. This patch addresses it.
--- sound/usb/mixer_quirks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/mixer_quirks.c +1 -1
@@ -793,7 +793,7 @@ static int snd_nativeinstruments_controlreturn 0 ; kcontrol->private_value &= ~(0xff <<24 ); - kcontrol->private_value |= newval; + kcontrol->private_value |= (unsigned int )newval <<24 ; err =snd_ni_update_cur_val (list);return err <0 ? err :1 ; }
Greg Kroah-Hartman
maintainerPATCH 17/67 ALSA: timer: Harden slave timer list handling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit b5a663aa426f4884c71cd8580adae73f33570f0d upstream.
A slave timer instance might be still accessible in a racy way while operating the master instance as it lacks of locking. Since the master operation is mostly protected with timer->lock, we should cope with it while changing the slave instance, too. Also, some linked lists (active_list and ack_list) of slave instances aren't unlinked immediately at stopping or closing, and this may lead to unexpected accesses.
This patch tries to address these issues. It adds spin lock of timer->lock (either from master or slave, which is equivalent) in a few places. For avoiding a deadlock, we ensure that the global slave_active_lock is always locked at first before each timer lock.
Also, ack and active_list of slave instances are properly unlinked at snd_timer_stop() and snd_timer_close().
Last but not least, remove the superfluous call of _snd_timer_stop() at removing slave links. This is a noop, and calling it may confuse readers wrt locking. Further cleanup will follow in a later patch.
Actually we've got reports of use-after-free by syzkaller fuzzer, and this hopefully fixes these issues.
--- sound/core/timer.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
sound/core/timer.c +14 -4
@@ -215,11 +215,13 @@ static void snd_timer_check_master(struc slave->slave_id == master->slave_id) {list_move_tail (&slave->open_list, &master->slave_list_head);spin_lock_irq (&slave_active_lock); +spin_lock (&master->timer->lock); slave->master = master; slave->timer = master->timer;if (slave->flags &SNDRV_TIMER_IFLG_RUNNING )list_add_tail (&slave->active_list, &master->slave_active_head); +spin_unlock (&master->timer->lock);spin_unlock_irq (&slave_active_lock); } }
@@ -346,15 +348,18 @@ int snd_timer_close(struct snd_timer_ins timer->hw.close) timer->hw.close (timer);/* remove slave links */ +spin_lock_irq (&slave_active_lock); +spin_lock (&timer->lock);list_for_each_entry_safe (slave, tmp, &timeri->slave_list_head, open_list) { -spin_lock_irq (&slave_active_lock); -_snd_timer_stop (slave,1 ,SNDRV_TIMER_EVENT_RESOLUTION );list_move_tail (&slave->open_list, &snd_timer_slave_list); slave->master =NULL ; slave->timer =NULL ; -spin_unlock_irq (&slave_active_lock); +list_del_init (&slave->ack_list); +list_del_init (&slave->active_list); } +spin_unlock (&timer->lock); +spin_unlock_irq (&slave_active_lock);mutex_unlock (®ister_mutex); } out:
@@ -441,9 +446,12 @@ static int snd_timer_start_slave(structspin_lock_irqsave (&slave_active_lock, flags); timeri->flags |=SNDRV_TIMER_IFLG_RUNNING ; -if (timeri->master) +if (timeri->master && timeri->timer) { +spin_lock (&timeri->timer->lock);list_add_tail (&timeri->active_list, &timeri->master->slave_active_head); +spin_unlock (&timeri->timer->lock); + }spin_unlock_irqrestore (&slave_active_lock, flags);return 1 ;/* delayed start */ }
@@ -489,6 +497,8 @@ static int _snd_timer_stop(struct snd_tiif (!keep_flag) {spin_lock_irqsave (&slave_active_lock, flags); timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING ; +list_del_init (&timeri->ack_list); +list_del_init (&timeri->active_list);spin_unlock_irqrestore (&slave_active_lock, flags); } goto __end;
Greg Kroah-Hartman
maintainerPATCH 18/67 ALSA: hda - fix the headset mic detection problem for a Dell laptop
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
commit 0a1f90a982e85f4921bed606a6b41a24f4de2ae1 upstream.
The machine uses codec alc255, and the pin configuration value for pin 0x14 on this machine is 0x90171130 which is not in the pin quirk table yet.
--- sound/pci/hda/patch_realtek.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/pci/hda/patch_realtek.c +4 -0
@@ -5626,6 +5626,10 @@ static const struct snd_hda_pin_quirk al {0x21, 0x02211040}),SND_HDA_PIN_QUIRK (0x10ec0255 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , {0x12, 0x90a60170}, + {0x14, 0x90171130}, + {0x21, 0x02211040}), +SND_HDA_PIN_QUIRK (0x10ec0255 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , + {0x12, 0x90a60170}, {0x14, 0x90170140}, {0x21, 0x02211050}), SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Greg Kroah-Hartman
maintainerPATCH 19/67 ALSA: timer: Fix race among timer ioctls
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit af368027a49a751d6ff4ee9e3f9961f35bb4fede upstream.
ALSA timer ioctls have an open race and this may lead to a use-after-free of timer instance object. A simplistic fix is to make each ioctl exclusive. We have already tread_sem for controlling the tread, and extend this as a global mutex to be applied to each ioctl.
The downside is, of course, the worse concurrency. But these ioctls aren't to be parallel accessible, in anyway, so it should be fine to serialize there.
--- sound/core/timer.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-)
sound/core/timer.c +19 -13
@@ -73,7 +73,7 @@ struct snd_timer_user {struct timespec tstamp;/* trigger tstamp */ wait_queue_head_t qchange_sleep;struct fasync_struct *fasync; -struct mutex tread_sem; +struct mutex ioctl_lock; };/* list of timers */
@@ -1263,7 +1263,7 @@ static int snd_timer_user_open(struct inreturn -ENOMEM ;spin_lock_init (&tu->qlock);init_waitqueue_head (&tu->qchange_sleep); -mutex_init (&tu->tread_sem); +mutex_init (&tu->ioctl_lock); tu->ticks =1 ; tu->queue_size =128 ; tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read),
@@ -1283,8 +1283,10 @@ static int snd_timer_user_release(structif (file->private_data) { tu = file->private_data; file->private_data =NULL ; +mutex_lock (&tu->ioctl_lock);if (tu->timeri)snd_timer_close (tu->timeri); +mutex_unlock (&tu->ioctl_lock);kfree (tu->queue);kfree (tu->tqueue);kfree (tu);
@@ -1522,7 +1524,6 @@ static int snd_timer_user_tselect(structint err =0 ; tu = file->private_data; -mutex_lock (&tu->tread_sem);if (tu->timeri) {snd_timer_close (tu->timeri); tu->timeri =NULL ;
@@ -1566,7 +1567,6 @@ static int snd_timer_user_tselect(struct } __err: -mutex_unlock (&tu->tread_sem);return err; }
@@ -1779,7 +1779,7 @@ enum { SNDRV_TIMER_IOCTL_PAUSE_OLD = _IO('T', 0x23), }; -static long snd_timer_user_ioctl (struct file *file,unsigned int cmd, +static long __snd_timer_user_ioctl (struct file *file,unsigned int cmd,unsigned long arg) {struct snd_timer_user *tu;
@@ -1796,17 +1796,11 @@ static long snd_timer_user_ioctl(struct {int xarg; -mutex_lock (&tu->tread_sem); -if (tu->timeri) {/* too late */ -mutex_unlock (&tu->tread_sem); +if (tu->timeri)/* too late */ return -EBUSY ; - } -if (get_user (xarg, p)) { -mutex_unlock (&tu->tread_sem); +if (get_user (xarg, p))return -EFAULT ; - } tu->tread = xarg ?1 :0 ; -mutex_unlock (&tu->tread_sem);return 0 ; }case SNDRV_TIMER_IOCTL_GINFO :
@@ -1839,6 +1833,18 @@ static long snd_timer_user_ioctl(structreturn -ENOTTY ; } +static long snd_timer_user_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) +{ +struct snd_timer_user *tu = file->private_data; +long ret; + +mutex_lock (&tu->ioctl_lock); + ret =__snd_timer_user_ioctl (file, cmd, arg); +mutex_unlock (&tu->ioctl_lock); +return ret; +} +static int snd_timer_user_fasync (int fd,struct file * file,int on) {struct snd_timer_user *tu;
Greg Kroah-Hartman
maintainerPATCH 20/67 ALSA: timer: Fix double unlink of active_list
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit ee8413b01045c74340aa13ad5bdf905de32be736 upstream.
ALSA timer instance object has a couple of linked lists and they are unlinked unconditionally at snd_timer_stop(). Meanwhile snd_timer_interrupt() unlinks it, but it calls list_del() which leaves the element list itself unchanged. This ends up with unlinking twice, and it was caught by syzkaller fuzzer.
The fix is to use list_del_init() variant properly there, too.
--- sound/core/timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/core/timer.c +1 -1
@@ -704,7 +704,7 @@ void snd_timer_interrupt(struct snd_time }else { ti->flags &= ~SNDRV_TIMER_IFLG_RUNNING ;if (--timer->running) -list_del (&ti->active_list); +list_del_init (&ti->active_list); }if ((timer->hw.flags &SNDRV_TIMER_HW_TASKLET ) || (ti->flags &SNDRV_TIMER_IFLG_FAST ))
Greg Kroah-Hartman
maintainerPATCH 21/67 ALSA: hda - Add fixup for Dell Latitidue E6540
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit cf52103a218744f3fd18111325c28e95aa9cd226 upstream.
Another Dell model, another fixup entry: Latitude E6540 needs the same fixup as other Latitude E series as workaround for noise problems.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=104341
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -5331,6 +5331,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1028 ,0x0470 ,"Dell M101z" ,ALC269_FIXUP_DELL_M101Z ),SND_PCI_QUIRK (0x1028 ,0x054b ,"Dell XPS one 2710" ,ALC275_FIXUP_DELL_XPS ),SND_PCI_QUIRK (0x1028 ,0x05bd ,"Dell Latitude E6440" ,ALC292_FIXUP_DELL_E7X ), +SND_PCI_QUIRK (0x1028 ,0x05be ,"Dell Latitude E6540" ,ALC292_FIXUP_DELL_E7X ),SND_PCI_QUIRK (0x1028 ,0x05ca ,"Dell Latitude E7240" ,ALC292_FIXUP_DELL_E7X ),SND_PCI_QUIRK (0x1028 ,0x05cb ,"Dell Latitude E7440" ,ALC292_FIXUP_DELL_E7X ), SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
Greg Kroah-Hartman
maintainerPATCH 22/67 ALSA: seq: Fix snd_seq_call_port_info_ioctl in compat mode
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Boichat <[email protected]>
commit 9586495dc3011a80602329094e746dbce16cb1f1 upstream.
This reverts one hunk of
commit ef44a1ec6eee ("ALSA: sound/core: use memdup_user()"), which replaced a number of kmalloc followed by memcpy with memdup calls.
In this case, we are copying from a struct snd_seq_port_info32 to a struct snd_seq_port_info, but the latter is 4 bytes longer than the 32-bit version, so we need to separate kmalloc and copy calls.
--- sound/core/seq/seq_compat.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
sound/core/seq/seq_compat.c +5 -4
@@ -49,11 +49,12 @@ static int snd_seq_call_port_info_ioctl(struct snd_seq_port_info *data;mm_segment_t fs; - data =memdup_user (data32,sizeof (*data32)); -if (IS_ERR (data)) -return PTR_ERR (data); + data =kmalloc (sizeof (*data),GFP_KERNEL ); +if (!data) +return -ENOMEM ; -if (get_user (data->flags, &data32->flags) || +if (copy_from_user (data, data32,sizeof (*data32)) || +get_user (data->flags, &data32->flags) ||get_user (data->time_queue, &data32->time_queue)) goto error; data->kernel =NULL ;
Greg Kroah-Hartman
maintainerPATCH 23/67 ALSA: pcm: Fix snd_pcm_hw_params struct copy in compat mode
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Boichat <[email protected]>
commit 43c54b8c7cfe22f868a751ba8a59abf1724160b1 upstream.
This reverts one hunk of
commit ef44a1ec6eee ("ALSA: sound/core: use memdup_user()"), which replaced a number of kmalloc followed by memcpy with memdup calls.
In this case, we are copying from a struct snd_pcm_hw_params32 to a struct snd_pcm_hw_params, but the latter is 4 bytes longer than the 32-bit version, so we need to separate kmalloc and copy calls.
This actually leads to an out-of-bounds memory access later on in sound/soc/soc-pcm.c:soc_pcm_hw_params() (detected using KASan).
--- sound/core/pcm_compat.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
sound/core/pcm_compat.c +9 -4
@@ -255,10 +255,15 @@ static int snd_pcm_ioctl_hw_params_compaif (! (runtime = substream->runtime))return -ENOTTY ; -/* only fifo_size is different, so just copy all */ - data =memdup_user (data32,sizeof (*data32)); -if (IS_ERR (data)) -return PTR_ERR (data); + data =kmalloc (sizeof (*data),GFP_KERNEL ); +if (!data) +return -ENOMEM ; + +/* only fifo_size (RO from userspace) is different, so just copy all */ +if (copy_from_user (data, data32,sizeof (*data32))) { + err = -EFAULT ; + goto error; + }if (refine) err =snd_pcm_hw_refine (substream, data);
Greg Kroah-Hartman
maintainerPATCH 24/67 ALSA: hrtimer: Fix stall by hrtimer_cancel()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 2ba1fe7a06d3624f9a7586d672b55f08f7c670f3 upstream.
hrtimer_cancel() waits for the completion from the callback, thus it must not be called inside the callback itself. This was already a problem in the past with ALSA hrtimer driver, and the early commit [fcfdebe70759: ALSA: hrtimer - Fix lock-up] tried to address it.
However, the previous fix is still insufficient: it may still cause a lockup when the ALSA timer instance reprograms itself in its callback. Then it invokes the start function even in snd_timer_interrupt() that is called in hrtimer callback itself, results in a CPU stall. This is no hypothetical problem but actually triggered by syzkaller fuzzer.
This patch tries to fix the issue again. Now we call hrtimer_try_to_cancel() at both start and stop functions so that it won't fall into a deadlock, yet giving some chance to cancel the queue if the functions have been called outside the callback. The proper hrtimer_cancel() is called in anyway at closing, so this should be enough.
--- sound/core/hrtimer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/core/hrtimer.c +2 -1
@@ -90,7 +90,7 @@ static int snd_hrtimer_start(struct snd_struct snd_hrtimer *stime = t->private_data;atomic_set (&stime->running,0 ); -hrtimer_cancel (&stime->hrt); +hrtimer_try_to_cancel (&stime->hrt);hrtimer_start (&stime->hrt,ns_to_ktime (t->sticks * resolution),HRTIMER_MODE_REL );atomic_set (&stime->running,1 );
@@ -101,6 +101,7 @@ static int snd_hrtimer_stop(struct snd_t {struct snd_hrtimer *stime = t->private_data;atomic_set (&stime->running,0 ); +hrtimer_try_to_cancel (&stime->hrt);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 25/67 ALSA: control: Avoid kernel warnings from tlv ioctl with numid 0
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit c0bcdbdff3ff73a54161fca3cb8b6cdbd0bb8762 upstream.
When a TLV ioctl with numid zero is handled, the driver may spew a kernel warning with a stack trace at each call. The check was intended obviously only for a kernel driver, but not for a user interaction. Let's fix it.
This was spotted by syzkaller fuzzer.
--- sound/core/control.c | 2 ++ 1 file changed, 2 insertions(+)
sound/core/control.c +2 -0
@@ -1405,6 +1405,8 @@ static int snd_ctl_tlv_ioctl(struct snd_return -EFAULT ;if (tlv.length <sizeof (unsigned int ) *2 )return -EINVAL ; +if (!tlv.numid) +return -EINVAL ;down_read (&card->controls_rwsem); kctl =snd_ctl_find_numid (card, tlv.numid);if (kctl ==NULL ) {
Greg Kroah-Hartman
maintainerPATCH 26/67 ALSA: hda - Fix bass pin fixup for ASUS N550JX
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit db8948e653e12b218058bb6696f4a33fa7845f64 upstream.
ASUS N550JX (PCI SSID 1043:13df) requires the same fixup for a bass speaker output pin as other N550 models.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=110001
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -6566,6 +6566,7 @@ static const struct snd_pci_quirk alc662SND_PCI_QUIRK (0x1028 ,0x069f ,"Dell" ,ALC668_FIXUP_DELL_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x103c ,0x1632 ,"HP RP5800" ,ALC662_FIXUP_HP_RP5800 ),SND_PCI_QUIRK (0x1043 ,0x11cd ,"Asus N550" ,ALC662_FIXUP_BASS_1A ), +SND_PCI_QUIRK (0x1043 ,0x13df ,"Asus N550JX" ,ALC662_FIXUP_BASS_1A ),SND_PCI_QUIRK (0x1043 ,0x1477 ,"ASUS N56VZ" ,ALC662_FIXUP_BASS_MODE4_CHMAP ),SND_PCI_QUIRK (0x1043 ,0x15a7 ,"ASUS UX51VZH" ,ALC662_FIXUP_BASS_16 ), SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
Greg Kroah-Hartman
maintainerPATCH 27/67 ALSA: hda - Fix missing module loading with model=generic option
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit bca8e988043e39483afd7872a2641f03ed7201a6 upstream.
When the generic codec driver is specified via model option or such, the hda driver doesn't try to load the generic driver module but still loads the codec-specific driver, and this ends up with the binding failure.
This patch fixes it by moving the generic module request in the common helper code.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=111021
--- sound/pci/hda/hda_bind.c | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-)
sound/pci/hda/hda_bind.c +32 -10
@@ -174,14 +174,40 @@ static inline bool codec_probed(struct hreturn device_attach (hda_codec_dev (codec)) >0 && codec->preset; } -/* try to auto-load and bind the codec module */ -static void codec_bind_module (struct hda_codec *codec) +/* try to auto-load codec module */ +static void request_codec_module (struct hda_codec *codec) {#ifdef MODULE char modalias[32 ]; +const char *mod =NULL ; + +switch (codec->probe_id) { +case HDA_CODEC_ID_GENERIC_HDMI : +#if IS_MODULE (CONFIG_SND_HDA_CODEC_HDMI ) + mod ="snd-hda-codec-hdmi" ; +#endif +break ; +case HDA_CODEC_ID_GENERIC : +#if IS_MODULE (CONFIG_SND_HDA_GENERIC ) + mod ="snd-hda-codec-generic" ; +#endif +break ; +default : +snd_hdac_codec_modalias (&codec->core, modalias,sizeof (modalias)); + mod = modalias; +break ; + } + +if (mod) +request_module (mod); +#endif /* MODULE */ +} -snd_hdac_codec_modalias (&codec->core, modalias,sizeof (modalias)); -request_module (modalias); +/* try to auto-load and bind the codec module */ +static void codec_bind_module (struct hda_codec *codec) +{ +#ifdef MODULE +request_codec_module (codec);if (codec_probed (codec))return ;#endif
@@ -218,17 +244,13 @@ static int codec_bind_generic(struct hdaif (is_likely_hdmi_codec (codec)) { codec->probe_id =HDA_CODEC_ID_GENERIC_HDMI ; -#if IS_MODULE (CONFIG_SND_HDA_CODEC_HDMI ) -request_module ("snd-hda-codec-hdmi" ); -#endif +request_codec_module (codec);if (codec_probed (codec))return 0 ; } codec->probe_id =HDA_CODEC_ID_GENERIC ; -#if IS_MODULE (CONFIG_SND_HDA_GENERIC ) -request_module ("snd-hda-codec-generic" ); -#endif +request_codec_module (codec);if (codec_probed (codec))return 0 ;return -ENODEV ;
Greg Kroah-Hartman
maintainerPATCH 28/67 ALSA: hda - Flush the pending probe work at remove
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 991f86d7ae4e1f8c15806e62f97af519e3cdd860 upstream.
As HD-audio driver does deferred probe internally via workqueue, the driver might go into the mixed state doing both probe and remove when the module gets unloaded during the probe work. This eventually triggers an Oops, unsurprisingly.
For avoiding this race, we just need to flush the pending probe work explicitly before actually starting the resource release.
Bugzilla: https://bugzilla.opensuse.org/show_bug.cgi?id=960710
--- sound/pci/hda/hda_intel.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
sound/pci/hda/hda_intel.c +9 -1
@@ -2126,9 +2126,17 @@ i915_power_fail:static void azx_remove (struct pci_dev *pci) {struct snd_card *card =pci_get_drvdata (pci); +struct azx *chip; +struct hda_intel *hda; + +if (card) { +/* flush the pending probing work */ + chip = card->private_data; + hda = container_of(chip, struct hda_intel, chip); +flush_work (&hda->probe_work); -if (card)snd_card_free (card); + } }static void azx_shutdown (struct pci_dev *pci)
Greg Kroah-Hartman
maintainerPATCH 29/67 ALSA: timer: Handle disconnection more safely
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 230323dac060123c340cf75997971145a42661ee upstream.
Currently ALSA timer device doesn't take the disconnection into account very well; it merely unlinks the timer device at disconnection callback but does nothing else. Because of this, when an application accessing the timer device is disconnected, it may release the resource before actually closed. In most cases, it results in a warning message indicating a leftover timer instance like:
ALSA: timer xxxx is busy?
But basically this is an open race.
This patch tries to address it. The strategy is like other ALSA
devices: namely,
- Manage card's refcount at each open/close
- Wake up the pending tasks at disconnection
- Check the shutdown flag appropriately at each possible call
Note that this patch has one ugly hack to handle the wakeup of pending tasks. It'd be cleaner to introduce a new disconnect op to snd_timer_instance ops. But since it would lead to internal ABI breakage and it eventually increase my own work when backporting to stable kernels, I took a different path to implement locally in timer.c. A cleanup patch will follow at next for 4.5 kernel.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=109431
--- sound/core/timer.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)
sound/core/timer.c +48 -0
@@ -65,6 +65,7 @@ struct snd_timer_user {int qtail;int qused;int queue_size; +bool disconnected;struct snd_timer_read *queue;struct snd_timer_tread *tqueue;spinlock_t qlock;
@@ -290,6 +291,9 @@ int snd_timer_open(struct snd_timer_instmutex_unlock (®ister_mutex);return -ENOMEM ; } +/* take a card refcount for safe disconnection */ +if (timer->card) +get_device (&timer->card->card_dev); timeri->slave_class = tid->dev_sclass; timeri->slave_id = slave_id;if (list_empty (&timer->open_list_head) && timer->hw.open)
@@ -360,6 +364,9 @@ int snd_timer_close(struct snd_timer_ins }spin_unlock (&timer->lock);spin_unlock_irq (&slave_active_lock); +/* release a card refcount for safe disconnection */ +if (timer->card) +put_device (&timer->card->card_dev);mutex_unlock (®ister_mutex); } out:
@@ -475,6 +482,8 @@ int snd_timer_start(struct snd_timer_ins timer = timeri->timer;if (timer ==NULL )return -EINVAL ; +if (timer->card && timer->card->shutdown) +return -ENODEV ;spin_lock_irqsave (&timer->lock, flags); timeri->ticks = timeri->cticks = ticks; timeri->pticks =0 ;
@@ -509,6 +518,10 @@ static int _snd_timer_stop(struct snd_tispin_lock_irqsave (&timer->lock, flags);list_del_init (&timeri->ack_list);list_del_init (&timeri->active_list); +if (timer->card && timer->card->shutdown) { +spin_unlock_irqrestore (&timer->lock, flags); +return 0 ; + }if ((timeri->flags &SNDRV_TIMER_IFLG_RUNNING ) && !(--timer->running)) { timer->hw.stop (timer);
@@ -571,6 +584,8 @@ int snd_timer_continue(struct snd_timer_ timer = timeri->timer;if (! timer)return -EINVAL ; +if (timer->card && timer->card->shutdown) +return -ENODEV ;spin_lock_irqsave (&timer->lock, flags);if (!timeri->cticks) timeri->cticks =1 ;
@@ -634,6 +649,9 @@ static void snd_timer_tasklet(unsigned lunsigned long resolution, ticks;unsigned long flags; +if (timer->card && timer->card->shutdown) +return ; +spin_lock_irqsave (&timer->lock, flags);/* now process all callbacks */ while (!list_empty (&timer->sack_list_head)) {
@@ -674,6 +692,9 @@ void snd_timer_interrupt(struct snd_timeif (timer ==NULL )return ; +if (timer->card && timer->card->shutdown) +return ; +spin_lock_irqsave (&timer->lock, flags);/* remember the current resolution */
@@ -884,11 +905,28 @@ static int snd_timer_dev_register(structreturn 0 ; } +/* just for reference in snd_timer_dev_disconnect() below */ +static void snd_timer_user_ccallback (struct snd_timer_instance *timeri, +int event,struct timespec *tstamp, +unsigned long resolution); +static int snd_timer_dev_disconnect (struct snd_device *device) {struct snd_timer *timer = device->device_data; +struct snd_timer_instance *ti; +mutex_lock (®ister_mutex);list_del_init (&timer->device_list); +/* wake up pending sleepers */ +list_for_each_entry (ti, &timer->open_list_head, open_list) { +/* FIXME: better to have a ti.disconnect() op */ +if (ti->ccallback == snd_timer_user_ccallback) { +struct snd_timer_user *tu = ti->callback_data; + + tu->disconnected = true; +wake_up (&tu->qchange_sleep); + } + }mutex_unlock (®ister_mutex);return 0 ; }
@@ -899,6 +937,8 @@ void snd_timer_notify(struct snd_timer *unsigned long resolution =0 ;struct snd_timer_instance *ti, *ts; +if (timer->card && timer->card->shutdown) +return ;if (! (timer->hw.flags &SNDRV_TIMER_HW_SLAVE ))return ; if (snd_BUG_ON(event < SNDRV_TIMER_EVENT_MSTART ||
@@ -1057,6 +1097,8 @@ static void snd_timer_proc_read(struct smutex_lock (®ister_mutex);list_for_each_entry (timer, &snd_timer_list, device_list) { +if (timer->card && timer->card->shutdown) +continue ;switch (timer->tmr_class) {case SNDRV_TIMER_CLASS_GLOBAL :snd_iprintf (buffer,"G%i: " , timer->tmr_device);
@@ -1882,6 +1924,10 @@ static ssize_t snd_timer_user_read(strucremove_wait_queue (&tu->qchange_sleep, &wait); +if (tu->disconnected) { + err = -ENODEV ; +break ; + }if (signal_pending (current)) { err = -ERESTARTSYS ;break ;
@@ -1931,6 +1977,8 @@ static unsigned int snd_timer_user_poll( mask =0 ;if (tu->qused) mask |=POLLIN |POLLRDNORM ; +if (tu->disconnected) + mask |=POLLERR ;return mask; }
Greg Kroah-Hartman
maintainerPATCH 30/67 ASoC: wm5110: Fix PGA clear when disabling DRE
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Keepax <[email protected]>
commit 24338722cfa23fdf4e08c6189a11f7e3a902d86a upstream.
We don't want to use a bypassed write in wm5110_clear_pga_volume, we might disable the DRE whilst the CODEC is powered down. A normal regmap_write will always go to the hardware (when not on cache_only) even if the written value matches the cache. As using a normal write will still achieve the desired behaviour of bring the cache and hardware in sync, this patch updates the function to use a normal write, which avoids issues when the CODEC is powered down.
--- sound/soc/codecs/wm5110.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
sound/soc/codecs/wm5110.c +3 -5
@@ -360,15 +360,13 @@ static int wm5110_hp_ev(struct snd_soc_dstatic int wm5110_clear_pga_volume (struct arizona *arizona,int output) { -struct reg_sequence clear_pga = { -ARIZONA_OUTPUT_PATH_CONFIG_1L + output *4 ,0x80 - }; +unsigned int reg =ARIZONA_OUTPUT_PATH_CONFIG_1L + output *4 ;int ret; - ret =regmap_multi_reg_write_bypassed (arizona->regmap, &clear_pga,1 ); + ret =regmap_write (arizona->regmap, reg,0x80 );if (ret)dev_err (arizona->dev,"Failed to clear PGA (0x%x): %d\n" , - clear_pga.reg, ret); + reg, ret);return ret; }
Greg Kroah-Hartman
maintainerPATCH 31/67 ASoC: compress: Fix compress device direction check
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vinod Koul <[email protected]>
commit a1068045883ed4a18363a4ebad0c3d55e473b716 upstream.
The detection of direction for compress was only taking into account codec capabilities and not CPU ones. Fix this by checking the CPU side capabilities as well
--- sound/soc/soc-compress.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
sound/soc/soc-compress.c +20 -3
@@ -630,6 +630,7 @@ int snd_soc_new_compress(struct snd_soc_struct snd_pcm *be_pcm;char new_name[64 ];int ret =0 , direction =0 ; +int playback =0 , capture =0 ;if (rtd->num_codecs >1 ) {dev_err (rtd->card->dev,"Multicodec not supported for compressed stream\n" );
@@ -641,11 +642,27 @@ int snd_soc_new_compress(struct snd_soc_ rtd->dai_link->stream_name, codec_dai->name, num);if (codec_dai->driver->playback.channels_min) + playback =1 ; +if (codec_dai->driver->capture.channels_min) + capture =1 ; + + capture = capture && cpu_dai->driver->capture.channels_min; + playback = playback && cpu_dai->driver->playback.channels_min; + +/* +* Compress devices are unidirectional so only one of the directions +* should be set, check for that (xor) +*/ +if (playback + capture !=1 ) { +dev_err (rtd->card->dev,"Invalid direction for compress P %d, C %d\n" , + playback, capture); +return -EINVAL ; + } + +if (playback) direction =SND_COMPRESS_PLAYBACK ; -else if (codec_dai->driver->capture.channels_min) - direction =SND_COMPRESS_CAPTURE ;else -return -EINVAL ; + direction =SND_COMPRESS_CAPTURE ; compr =kzalloc (sizeof (*compr),GFP_KERNEL );if (compr ==NULL ) {
Greg Kroah-Hartman
maintainerPATCH 32/67 rtlwifi: fix memory leak for USB device
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Wu <[email protected]>
commit 17bc55864f81dd730d05f09b1641312a7990d636 upstream.
Free skb for received frames with a wrong checksum. This can happen pretty rapidly, exhausting all memory.
This fixes a memleak (detected with kmemleak). Originally found while using monitor mode, but it also appears during managed mode (once the link is up).
--- drivers/net/wireless/realtek/rtlwifi/usb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/realtek/rtlwifi/usb.c +2 -0
@@ -531,6 +531,8 @@ static void _rtl_usb_rx_process_noagg(stieee80211_rx (hw, skb); elsedev_kfree_skb_any (skb ); + }else { +dev_kfree_skb_any (skb); } }
Greg Kroah-Hartman
maintainerPATCH 33/67 USB: cp210x: add ID for ELV Marble Sound Board 1
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Freyermuth <[email protected]>
commit f7d7f59ab124748156ea551edf789994f05da342 upstream.
Add the USB device ID for ELV Marble Sound Board 1.
--- drivers/usb/serial/cp210x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/cp210x.c +1 -0
@@ -160,6 +160,7 @@ static const struct usb_device_id id_tab { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ + { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */ { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ { USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */
Greg Kroah-Hartman
maintainerPATCH 34/67 usb: core: lpm: fix usb3_hardware_lpm sysfs node
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lu Baolu <[email protected]>
commit bf5ce5bf3cc7136fd7fe5e8999a580bc93a9c8f6 upstream.
Commit 655fe4effe0f ("usbcore: add sysfs support to xHCI usb3 hardware LPM") introduced usb3_hardware_lpm sysfs node. This doesn't show the correct status of USB3 U1 and U2 LPM status.
This patch fixes this by replacing usb3_hardware_lpm with two nodes, usb3_hardware_lpm_u1 (for U1) and usb3_hardware_lpm_u2 (for U2), and recording the U1/U2 LPM status in right places.
This patch should be back-ported to kernels as old as 4.3, that contains Commit 655fe4effe0f ("usbcore: add sysfs support to xHCI usb3 hardware LPM").
--- Documentation/ABI/testing/sysfs-bus-usb | 16 +++++++------ Documentation/usb/power-management.txt | 11 ++++----- drivers/usb/core/hub.c | 39 ++++++++++++++++++++++++-------- drivers/usb/core/sysfs.c | 31 +++++++++++++++++++++---- include/linux/usb.h | 4 +++ 5 files changed, 75 insertions(+), 26 deletions(-)
Documentation/ABI/testing/sysfs-bus-usb +9 -7
@@ -134,19 +134,21 @@ Description: enabled for the device. Developer can write y/Y/1 or n/N/0 to the file to enable/disable the feature. -What: /sys/bus/usb/devices/.../power/usb3_hardware_lpm -Date: June 2015 +What: /sys/bus/usb/devices/.../power/usb3_hardware_lpm_u1 + /sys/bus/usb/devices/.../power/usb3_hardware_lpm_u2 +Date: November 2015 Contact: Kevin Strasser <[email protected]> + Lu Baolu <[email protected]> Description: If CONFIG_PM is set and a USB 3.0 lpm-capable device is plugged in to a xHCI host which supports link PM, it will check if U1 and U2 exit latencies have been set in the BOS descriptor; if - the check is is passed and the host supports USB3 hardware LPM, + the check is passed and the host supports USB3 hardware LPM, USB3 hardware LPM will be enabled for the device and the USB - device directory will contain a file named - power/usb3_hardware_lpm. The file holds a string value (enable - or disable) indicating whether or not USB3 hardware LPM is - enabled for the device. + device directory will contain two files named + power/usb3_hardware_lpm_u1 and power/usb3_hardware_lpm_u2. These + files hold a string value (enable or disable) indicating whether + or not USB3 hardware LPM U1 or U2 is enabled for the device. What: /sys/bus/usb/devices/.../removable Date: February 2012
Documentation/usb/power-management.txt +6 -5
@@ -537,17 +537,18 @@ relevant attribute files are usb2_hardwa can write y/Y/1 or n/N/0 to the file to enable/disable USB2 hardware LPM manually. This is for test purpose mainly. - power/usb3_hardware_lpm + power/usb3_hardware_lpm_u1 + power/usb3_hardware_lpm_u2 When a USB 3.0 lpm-capable device is plugged in to a xHCI host which supports link PM, it will check if U1 and U2 exit latencies have been set in the BOS descriptor; if the check is is passed and the host supports USB3 hardware LPM, USB3 hardware LPM will be - enabled for the device and this file will be created. - The file holds a string value (enable or disable) - indicating whether or not USB3 hardware LPM is - enabled for the device. + enabled for the device and these files will be created. + The files hold a string value (enable or disable) + indicating whether or not USB3 hardware LPM U1 or U2 + is enabled for the device. USB Port Power Control ----------------------
drivers/usb/core/hub.c +30 -9
@@ -3895,17 +3895,30 @@ static void usb_enable_link_state(structreturn ; } -if (usb_set_lpm_timeout (udev, state, timeout)) +if (usb_set_lpm_timeout (udev, state, timeout)) {/* If we can't set the parent hub U1/U2 timeout, * device-initiated LPM won't be allowed either, so let the xHCI * host know that this link state won't be enabled. */ hcd->driver->disable_usb3_lpm_timeout (hcd, udev, state); + }else { +/* Only a configured device will accept the Set Feature +* U1/U2_ENABLE +*/ +if (udev->actconfig) +usb_set_device_initiated_lpm (udev, state, true); -/* Only a configured device will accept the Set Feature U1/U2_ENABLE */ -else if (udev->actconfig) -usb_set_device_initiated_lpm (udev, state, true); - +/* As soon as usb_set_lpm_timeout(timeout) returns 0, the +* hub-initiated LPM is enabled. Thus, LPM is enabled no +* matter the result of usb_set_device_initiated_lpm(). +* The only difference is whether device is able to initiate +* LPM. +*/ +if (state ==USB3_LPM_U1 ) + udev->usb3_lpm_u1_enabled =1 ; +else if (state ==USB3_LPM_U2 ) + udev->usb3_lpm_u2_enabled =1 ; + } }/*
@@ -3945,6 +3958,18 @@ static int usb_disable_link_state(structdev_warn (&udev->dev,"Could not disable xHCI %s timeout, " "bus schedule bandwidth may be impacted.\n" , usb3_lpm_names[state]); + +/* As soon as usb_set_lpm_timeout(0) return 0, hub initiated LPM +* is disabled. Hub will disallows link to enter U1/U2 as well, +* even device is initiating LPM. Hence LPM is disabled if hub LPM +* timeout set to 0, no matter device-initiated LPM is disabled or +* not. +*/ +if (state ==USB3_LPM_U1 ) + udev->usb3_lpm_u1_enabled =0 ; +else if (state ==USB3_LPM_U2 ) + udev->usb3_lpm_u2_enabled =0 ; +return 0 ; }
@@ -3979,8 +4004,6 @@ int usb_disable_lpm(struct usb_device *uif (usb_disable_link_state (hcd, udev,USB3_LPM_U2 )) goto enable_lpm; - udev->usb3_lpm_enabled =0 ; -return 0 ; enable_lpm:
@@ -4038,8 +4061,6 @@ void usb_enable_lpm(struct usb_device *uusb_enable_link_state (hcd, udev,USB3_LPM_U1 );usb_enable_link_state (hcd, udev,USB3_LPM_U2 ); - - udev->usb3_lpm_enabled =1 ; }EXPORT_SYMBOL_GPL (usb_enable_lpm);
drivers/usb/core/sysfs.c +26 -5
@@ -531,7 +531,7 @@ static ssize_t usb2_lpm_besl_store(struc }static DEVICE_ATTR_RW (usb2_lpm_besl); -static ssize_t usb3_hardware_lpm_show (struct device *dev, +static ssize_t usb3_hardware_lpm_u1_show (struct device *dev,struct device_attribute *attr,char *buf) {struct usb_device *udev =to_usb_device (dev);
@@ -539,7 +539,7 @@ static ssize_t usb3_hardware_lpm_show(stusb_lock_device (udev); -if (udev->usb3_lpm_enabled) +if (udev->usb3_lpm_u1_enabled) p ="enabled" ;else p ="disabled" ;
@@ -548,7 +548,26 @@ static ssize_t usb3_hardware_lpm_show(streturn sprintf (buf,"%s\n" , p); } -static DEVICE_ATTR_RO (usb3_hardware_lpm); +static DEVICE_ATTR_RO (usb3_hardware_lpm_u1); + +static ssize_t usb3_hardware_lpm_u2_show (struct device *dev, +struct device_attribute *attr,char *buf) +{ +struct usb_device *udev =to_usb_device (dev); +const char *p; + +usb_lock_device (udev); + +if (udev->usb3_lpm_u2_enabled) + p ="enabled" ; +else + p ="disabled" ; + +usb_unlock_device (udev); + +return sprintf (buf,"%s\n" , p); +} +static DEVICE_ATTR_RO (usb3_hardware_lpm_u2);static struct attribute *usb2_hardware_lpm_attr[] = { &dev_attr_usb2_hardware_lpm.attr,
@@ -562,7 +581,8 @@ static struct attribute_group usb2_hardw };static struct attribute *usb3_hardware_lpm_attr[] = { - &dev_attr_usb3_hardware_lpm.attr, + &dev_attr_usb3_hardware_lpm_u1.attr, + &dev_attr_usb3_hardware_lpm_u2.attr,NULL , };static struct attribute_group usb3_hardware_lpm_attr_group = {
@@ -592,7 +612,8 @@ static int add_power_attributes(struct dif (udev->usb2_hw_lpm_capable ==1 ) rc =sysfs_merge_group (&dev->kobj, &usb2_hardware_lpm_attr_group); -if (udev->lpm_capable ==1 ) +if (udev->speed ==USB_SPEED_SUPER && + udev->lpm_capable ==1 ) rc =sysfs_merge_group (&dev->kobj, &usb3_hardware_lpm_attr_group); }
include/linux/usb.h +4 -0
@@ -511,6 +511,8 @@ struct usb3_lpm_parameters {* @usb2_hw_lpm_enabled: USB2 hardware LPM is enabled * @usb2_hw_lpm_allowed: Userspace allows USB 2.0 LPM to be enabled * @usb3_lpm_enabled: USB3 hardware LPM enabled +* @usb3_lpm_u1_enabled: USB3 hardware U1 LPM enabled +* @usb3_lpm_u2_enabled: USB3 hardware U2 LPM enabled * @string_langid: language ID for strings * @product: iProduct string, if present (static) * @manufacturer: iManufacturer string, if present (static)
@@ -584,6 +586,8 @@ struct usb_device { unsigned usb2_hw_lpm_enabled:1; unsigned usb2_hw_lpm_allowed:1; unsigned usb3_lpm_enabled:1; + unsigned usb3_lpm_u1_enabled:1; + unsigned usb3_lpm_u2_enabled:1;int string_langid;/* static strings from the device */
Greg Kroah-Hartman
maintainerPATCH 35/67 xhci: refuse loading if nousb is used
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit 1eaf35e4dd592c59041bc1ed3248c46326da1f5f upstream.
The module should fail to load.
--- drivers/usb/host/xhci.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/host/xhci.c +4 -0
@@ -5059,6 +5059,10 @@ static int __init xhci_hcd_init(void)BUILD_BUG_ON (sizeof (struct xhci_intr_reg ) !=8 *32 /8 );/* xhci_run_regs has eight fields and embeds 128 xhci_intr_regs */ BUILD_BUG_ON (sizeof (struct xhci_run_regs ) != (8 +8 *128 )*32 /8 ); + +if (usb_disabled ()) +return -ENODEV ; +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 36/67 unix: properly account for FDs passed over unix sockets
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: willy tarreau <[email protected]>
[ Upstream commit 712f4aad406bb1ed67f3f98d04c044191f0ff593 ]
It is possible for a process to allocate and accumulate far more FDs than the process' limit by sending them over a unix socket then closing them to keep the process' fd count low.
This change addresses this problem by keeping track of the number of FDs in flight per user and preventing non-privileged processes from having more FDs in flight than their configured FD limit.
Mitigates: CVE-2013-4312 (Linux 2.0+)
--- include/linux/sched.h | 1 + net/unix/af_unix.c | 24 ++++++++++++++++++++---- net/unix/garbage.c | 13 ++++++++----- 3 files changed, 29 insertions(+), 9 deletions(-)
include/linux/sched.h +1 -0
@@ -830,6 +830,7 @@ struct user_struct {unsigned long mq_bytes;/* How many bytes can be allocated to mqueue? */ #endif unsigned long locked_shm;/* How many pages of mlocked shm ? */ +unsigned long unix_inflight;/* How many files in flight in unix sockets */ #ifdef CONFIG_KEYS struct key *uid_keyring;/* UID specific keyring */
net/unix/af_unix.c +20 -4
@@ -1513,6 +1513,21 @@ static void unix_destruct_scm(struct sk_sock_wfree (skb); } +/* +* The "user->unix_inflight" variable is protected by the garbage +* collection lock, and we just read it locklessly here. If you go +* over the limit, there might be a tiny race in actually noticing +* it across threads. Tough. +*/ +static inline bool too_many_unix_fds (struct task_struct *p) +{ +struct user_struct *user =current_user (); + +if (unlikely (user->unix_inflight >task_rlimit (p,RLIMIT_NOFILE ))) +return !capable (CAP_SYS_RESOURCE ) && !capable (CAP_SYS_ADMIN ); +return false; +} +#define MAX_RECURSION_LEVEL 4static int unix_attach_fds (struct scm_cookie *scm,struct sk_buff *skb)
@@ -1521,6 +1536,9 @@ static int unix_attach_fds(struct scm_counsigned char max_level =0 ;int unix_sock_count =0 ; +if (too_many_unix_fds (current)) +return -ETOOMANYREFS ; +for (i = scm->fp->count -1 ; i >=0 ; i--) {struct sock *sk =unix_get_socket (scm->fp->fp[i]);
@@ -1542,10 +1560,8 @@ static int unix_attach_fds(struct scm_coif (!UNIXCB (skb).fp)return -ENOMEM ; -if (unix_sock_count) { -for (i = scm->fp->count -1 ; i >=0 ; i--) -unix_inflight (scm->fp->fp[i]); - } +for (i = scm->fp->count -1 ; i >=0 ; i--) +unix_inflight (scm->fp->fp[i]);return max_level; }
net/unix/garbage.c +8 -5
@@ -120,11 +120,11 @@ void unix_inflight(struct file *fp) {struct sock *s =unix_get_socket (fp); +spin_lock (&unix_gc_lock); +if (s) {struct unix_sock *u =unix_sk (s); -spin_lock (&unix_gc_lock); -if (atomic_long_inc_return (&u->inflight) ==1 ) {BUG_ON (!list_empty (&u->link));list_add_tail (&u->link, &gc_inflight_list);
@@ -132,25 +132,28 @@ void unix_inflight(struct file *fp)BUG_ON (list_empty (&u->link)); } unix_tot_inflight++; -spin_unlock (&unix_gc_lock); } + fp->f_cred->user->unix_inflight++; +spin_unlock (&unix_gc_lock); }void unix_notinflight (struct file *fp) {struct sock *s =unix_get_socket (fp); +spin_lock (&unix_gc_lock); +if (s) {struct unix_sock *u =unix_sk (s); -spin_lock (&unix_gc_lock);BUG_ON (list_empty (&u->link));if (atomic_long_dec_and_test (&u->inflight))list_del_init (&u->link); unix_tot_inflight--; -spin_unlock (&unix_gc_lock); } + fp->f_cred->user->unix_inflight--; +spin_unlock (&unix_gc_lock); } static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *),
Greg Kroah-Hartman
maintainerPATCH 37/67 vxlan: fix test which detect duplicate vxlan iface
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Dichtel <[email protected]>
[ Upstream commit 07b9b37c227cb8d88d478b4a9c5634fee514ede1 ]
When a vxlan interface is created, the driver checks that there is not another vxlan interface with the same properties. To do this, it checks the existing vxlan udp socket. Since commit 1c51a9159dde, the creation of the vxlan socket is done only when the interface is set up, thus it breaks that test.
Example:
$ ip l a vxlan10 type vxlan id 10 group 239.0.0.10 dev eth0 dstport 0 $ ip l a vxlan11 type vxlan id 10 group 239.0.0.10 dev eth0 dstport 0 $ ip -br l | grep vxlan vxlan10 DOWN f2:55:1c:6a:fb:00 <BROADCAST,MULTICAST> vxlan11 DOWN 7a:cb:b9:38:59:0d <BROADCAST,MULTICAST>
Instead of checking sockets, let's loop over the vxlan iface list.
--- drivers/net/vxlan.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/net/vxlan.c +9 -3
@@ -2751,7 +2751,7 @@ static int vxlan_dev_configure(struct ne struct vxlan_config *conf) {struct vxlan_net *vn =net_generic (src_net, vxlan_net_id); -struct vxlan_dev *vxlan =netdev_priv (dev); +struct vxlan_dev *vxlan =netdev_priv (dev), *tmp;struct vxlan_rdst *dst = &vxlan->default_dst;unsigned short needed_headroom =ETH_HLEN ;int err;
@@ -2817,9 +2817,15 @@ static int vxlan_dev_configure(struct neif (!vxlan->cfg.age_interval) vxlan->cfg.age_interval =FDB_AGE_DEFAULT ; -if (vxlan_find_vni (src_net, conf->vni, use_ipv6 ?AF_INET6 :AF_INET , - vxlan->cfg.dst_port, vxlan->flags)) +list_for_each_entry (tmp, &vn->vxlan_list, next) { +if (tmp->cfg.vni == conf->vni && + (tmp->default_dst.remote_ip.sa.sa_family ==AF_INET6 || + tmp->cfg.saddr.sa.sa_family ==AF_INET6 ) == use_ipv6 && + tmp->cfg.dst_port == vxlan->cfg.dst_port && + (tmp->flags &VXLAN_F_RCV_FLAGS ) == + (vxlan->flags &VXLAN_F_RCV_FLAGS ))return -EEXIST ; + } dev->ethtool_ops = &vxlan_ethtool_ops;
Greg Kroah-Hartman
maintainerPATCH 38/67 net: sctp: prevent writes to cookie_hmac_alg from accessing invalid memory
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sasha Levin <[email protected]>
[ Upstream commit 320f1a4a175e7cd5d3f006f92b4d4d3e2cbb7bb5 ]
proc_dostring() needs an initialized destination string, while the one provided in proc_sctp_do_hmac_alg() contains stack garbage.
Thus, writing to cookie_hmac_alg would strlen() that garbage and end up accessing invalid memory.
--- net/sctp/sysctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sctp/sysctl.c +1 -1
@@ -320,7 +320,7 @@ static int proc_sctp_do_hmac_alg(structstruct ctl_table tbl;bool changed = false;char *none ="none" ; -char tmp[8 ]; +char tmp[8 ] = {0 };int ret;memset (&tbl,0 ,sizeof (struct ctl_table ));
Greg Kroah-Hartman
maintainerPATCH 39/67 ipv6: tcp: add rcu locking in tcp_v6_send_synack()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 3e4006f0b86a5ae5eb0e8215f9a9e1db24506977 ]
When first SYNACK is sent, we already hold rcu_read_lock(), but this is not true if a SYNACK is retransmitted, as a timer (soft) interrupt does not hold rcu_read_lock()
--- net/ipv6/tcp_ipv6.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv6/tcp_ipv6.c +2 -0
@@ -462,8 +462,10 @@ static int tcp_v6_send_synack(const struif (np->repflow && ireq->pktopts) fl6->flowlabel =ip6_flowlabel (ipv6_hdr (ireq->pktopts)); +rcu_read_lock (); err =ip6_xmit (sk, skb, fl6,rcu_dereference (np->opt), np->tclass); +rcu_read_unlock (); err =net_xmit_eval (err); }
Greg Kroah-Hartman
maintainerPATCH 40/67 tcp_yeah: dont set ssthresh below 2
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Neal Cardwell <[email protected]>
[ Upstream commit 83d15e70c4d8909d722c0d64747d8fb42e38a48f ]
For tcp_yeah, use an ssthresh floor of 2, the same floor used by Reno and CUBIC, per RFC 5681 (equation 4).
tcp_yeah_ssthresh() was sometimes returning a 0 or negative ssthresh value if the intended reduction is as big or bigger than the current cwnd. Congestion control modules should never return a zero or negative ssthresh. A zero ssthresh generally results in a zero cwnd, causing the connection to stall. A negative ssthresh value will be interpreted as a u32 and will set a target cwnd for PRR near 4 billion.
Oleksandr Natalenko reported that a system using tcp_yeah with ECN could see a warning about a prior_cwnd of 0 in tcp_cwnd_reduction(). Testing verified that this was due to tcp_yeah_ssthresh() misbehaving in this way.
--- net/ipv4/tcp_yeah.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_yeah.c +1 -1
@@ -219,7 +219,7 @@ static u32 tcp_yeah_ssthresh(struct sock yeah->fast_count =0 ; yeah->reno_count =max (yeah->reno_count>>1 ,2U ); -return tp->snd_cwnd - reduction; +return max_t (int, tp->snd_cwnd - reduction,2 ); }static struct tcp_congestion_ops tcp_yeah__read_mostly = {
Greg Kroah-Hartman
maintainerPATCH 41/67 sched,cls_flower: set key address type when present
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jamal Hadi Salim <[email protected]>
[ Upstream commit 66530bdf85eb1d72a0c399665e09a2c2298501c6 ]
only when user space passes the addresses should we consider their presence
--- net/sched/cls_flower.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
net/sched/cls_flower.c +8 -2
@@ -252,23 +252,28 @@ static int fl_set_key(struct net *net, sfl_set_key_val (tb, key->eth.src,TCA_FLOWER_KEY_ETH_SRC , mask->eth.src,TCA_FLOWER_KEY_ETH_SRC_MASK ,sizeof (key->eth.src)); +fl_set_key_val (tb, &key->basic.n_proto,TCA_FLOWER_KEY_ETH_TYPE , &mask->basic.n_proto,TCA_FLOWER_UNSPEC ,sizeof (key->basic.n_proto)); +if (key->basic.n_proto ==htons (ETH_P_IP ) || key->basic.n_proto ==htons (ETH_P_IPV6 )) {fl_set_key_val (tb, &key->basic.ip_proto,TCA_FLOWER_KEY_IP_PROTO , &mask->basic.ip_proto,TCA_FLOWER_UNSPEC ,sizeof (key->basic.ip_proto)); } -if (key->control.addr_type ==FLOW_DISSECTOR_KEY_IPV4_ADDRS ) { + +if (tb[TCA_FLOWER_KEY_IPV4_SRC ] || tb[TCA_FLOWER_KEY_IPV4_DST ]) { + key->control.addr_type =FLOW_DISSECTOR_KEY_IPV4_ADDRS ;fl_set_key_val (tb, &key->ipv4.src,TCA_FLOWER_KEY_IPV4_SRC , &mask->ipv4.src,TCA_FLOWER_KEY_IPV4_SRC_MASK ,sizeof (key->ipv4.src));fl_set_key_val (tb, &key->ipv4.dst,TCA_FLOWER_KEY_IPV4_DST , &mask->ipv4.dst,TCA_FLOWER_KEY_IPV4_DST_MASK ,sizeof (key->ipv4.dst)); - }else if (key->control.addr_type ==FLOW_DISSECTOR_KEY_IPV6_ADDRS ) { + }else if (tb[TCA_FLOWER_KEY_IPV6_SRC ] || tb[TCA_FLOWER_KEY_IPV6_DST ]) { + key->control.addr_type =FLOW_DISSECTOR_KEY_IPV6_ADDRS ;fl_set_key_val (tb, &key->ipv6.src,TCA_FLOWER_KEY_IPV6_SRC , &mask->ipv6.src,TCA_FLOWER_KEY_IPV6_SRC_MASK ,sizeof (key->ipv6.src));
@@ -276,6 +281,7 @@ static int fl_set_key(struct net *net, s &mask->ipv6.dst,TCA_FLOWER_KEY_IPV6_DST_MASK , sizeof(key->ipv6.dst)); } +if (key->basic.ip_proto ==IPPROTO_TCP ) { fl_set_key_val(tb, &key->tp.src, TCA_FLOWER_KEY_TCP_SRC, &mask->tp.src, TCA_FLOWER_UNSPEC,
Greg Kroah-Hartman
maintainerPATCH 42/67 net: pktgen: fix null ptr deref in skb allocation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Fastabend <[email protected]>
[ Upstream commit 3de03596dfeee48bc803c1d1a6daf60a459929f3 ]
Fix possible null pointer dereference that may occur when calling skb_reserve() on a null skb.
--- net/core/pktgen.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/core/pktgen.c +3 -1
@@ -2787,7 +2787,9 @@ static struct sk_buff *pktgen_alloc_skb( }else { skb =__netdev_alloc_skb (dev, size,GFP_NOWAIT ); } -skb_reserve (skb,LL_RESERVED_SPACE (dev)); + +if (likely (skb)) +skb_reserve (skb,LL_RESERVED_SPACE (dev));return skb; }
Greg Kroah-Hartman
maintainerPATCH 43/67 udp: disallow UFO for sockets with SO_NO_CHECK option
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Michal=20Kube=C4=8Dek?= <[email protected]>
[ Upstream commit 40ba330227ad00b8c0cdf2f425736ff9549cc423 ]
Commit acf8dd0a9d0b ("udp: only allow UFO for packets from SOCK_DGRAM sockets") disallows UFO for packets sent from raw sockets. We need to do the same also for SOCK_DGRAM sockets with SO_NO_CHECK options, even if for a bit different reason: while such socket would override the CHECKSUM_PARTIAL set by ip_ufo_append_data(), gso_size is still set and bad offloading flags warning is triggered in __skb_gso_segment().
In the IPv6 case, SO_NO_CHECK option is ignored but we need to disallow UFO for packets sent by sockets with UDP_NO_CHECK6_TX option.
--- net/ipv4/ip_output.c | 2 +- net/ipv6/ip6_output.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/ip_output.c +1 -1
@@ -921,7 +921,7 @@ static int __ip_append_data(struct sockif (((length > mtu) || (skb &&skb_is_gso (skb))) && (sk->sk_protocol ==IPPROTO_UDP ) && (rt->dst.dev->features &NETIF_F_UFO ) && !rt->dst.header_len && - (sk->sk_type ==SOCK_DGRAM )) { + (sk->sk_type ==SOCK_DGRAM ) && !sk->sk_no_check_tx) { err =ip_ufo_append_data (sk, queue, getfrag, from, length, hh_len, fragheaderlen, transhdrlen, maxfraglen, flags);
net/ipv6/ip6_output.c +1 -1
@@ -1353,7 +1353,7 @@ emsgsize: (skb && skb_is_gso(skb))) && (sk->sk_protocol == IPPROTO_UDP) && (rt->dst.dev->features & NETIF_F_UFO) && - (sk->sk_type == SOCK_DGRAM)) { + (sk->sk_type == SOCK_DGRAM) && !udp_get_no_check6_tx(sk)) { err =ip6_ufo_append_data (sk, queue, getfrag, from, length, hh_len, fragheaderlen, transhdrlen, mtu, flags, fl6);
Greg Kroah-Hartman
maintainerPATCH 44/67 net: preserve IP control block during GSO segmentation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Khlebnikov <[email protected]>
[ Upstream commit 9207f9d45b0ad071baa128e846d7e7ed85016df3 ]
Skb_gso_segment() uses skb control block during segmentation. This patch adds 32-bytes room for previous control block which will be copied into all resulting segments.
This patch fixes kernel crash during fragmenting forwarded packets. Fragmentation requires valid IP CB in skb for clearing ip options. Also patch removes custom save/restore in ovs code, now it's redundant.
--- include/linux/skbuff.h | 3 ++- net/core/dev.c | 5 +++++ net/ipv4/ip_output.c | 1 + net/openvswitch/datapath.c | 5 +---- net/xfrm/xfrm_output.c | 2 ++ 5 files changed, 11 insertions(+), 5 deletions(-)
include/linux/skbuff.h +2 -1
@@ -3446,7 +3446,8 @@ struct skb_gso_cb {int encap_level;__u16 csum_start; }; -#define SKB_GSO_CB (skb) ((struct skb_gso_cb *)(skb)->cb) +#define SKB_SGO_CB_OFFSET 32 +#define SKB_GSO_CB (skb) ((struct skb_gso_cb *)((skb)->cb + SKB_SGO_CB_OFFSET))static inline int skb_tnl_header_len (const struct sk_buff *inner_skb) {
net/core/dev.c +5 -0
@@ -2542,6 +2542,8 @@ static inline bool skb_needs_check(struc* * It may return NULL if the skb requires no segmentation. This is * only possible when GSO is used for verifying header integrity. +* +* Segmentation preserves SKB_SGO_CB_OFFSET bytes of previous skb cb. */ struct sk_buff *__skb_gso_segment (struct sk_buff *skb,netdev_features_t features,bool tx_path)
@@ -2556,6 +2558,9 @@ struct sk_buff *__skb_gso_segment(structreturn ERR_PTR (err); } +BUILD_BUG_ON (SKB_SGO_CB_OFFSET + +sizeof (*SKB_GSO_CB (skb)) >sizeof (skb->cb)); +SKB_GSO_CB (skb)->mac_offset =skb_headroom (skb);SKB_GSO_CB (skb)->encap_level =0 ;
net/ipv4/ip_output.c +1 -0
@@ -240,6 +240,7 @@ static int ip_finish_output_gso(struct n* from host network stack. */ features =netif_skb_features (skb); +BUILD_BUG_ON (sizeof (*IPCB (skb)) >SKB_SGO_CB_OFFSET ); segs =skb_gso_segment (skb, features & ~NETIF_F_GSO_MASK );if (IS_ERR_OR_NULL (segs)) {kfree_skb (skb);
net/openvswitch/datapath.c +1 -4
@@ -336,12 +336,10 @@ static int queue_gso_packets(struct dataunsigned short gso_type =skb_shinfo (skb)->gso_type;struct sw_flow_key later_key;struct sk_buff *segs, *nskb; -struct ovs_skb_cb ovs_cb;int err; - ovs_cb = *OVS_CB (skb); +BUILD_BUG_ON (sizeof (*OVS_CB (skb)) >SKB_SGO_CB_OFFSET ); segs =__skb_gso_segment (skb,NETIF_F_SG , false); - *OVS_CB (skb) = ovs_cb;if (IS_ERR (segs))return PTR_ERR (segs);if (segs ==NULL )
@@ -359,7 +357,6 @@ static int queue_gso_packets(struct data/* Queue all of the segments. */ skb = segs; do { - *OVS_CB(skb) = ovs_cb; if (gso_type & SKB_GSO_UDP && skb != segs) key = &later_key;
net/xfrm/xfrm_output.c +2 -0
@@ -167,6 +167,8 @@ static int xfrm_output_gso(struct net *n {struct sk_buff *segs; +BUILD_BUG_ON (sizeof (*IPCB (skb)) >SKB_SGO_CB_OFFSET ); +BUILD_BUG_ON (sizeof (*IP6CB (skb)) >SKB_SGO_CB_OFFSET ); segs =skb_gso_segment (skb,0 );kfree_skb (skb);if (IS_ERR (segs))
Greg Kroah-Hartman
maintainerPATCH 45/67 bonding: Prevent IPv6 link local address on enslaved devices
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karl Heiss <[email protected]>
[ Upstream commit 03d84a5f83a67e692af00a3d3901e7820e3e84d5 ]
Commit 1f718f0f4f97 ("bonding: populate neighbour's private on enslave") undoes the fix provided by commit c2edacf80e15 ("bonding / ipv6: no addrconf for slaves separately from master") by effectively setting the slave flag after the slave has been opened. If the slave comes up quickly enough, it will go through the IPv6 addrconf before the slave flag has been set and will get a link local IPv6 address.
In order to ensure that addrconf knows to ignore the slave devices on state change, set IFF_SLAVE before dev_open() during bonding enslavement.
--- drivers/net/bonding/bond_main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/bonding/bond_main.c +4 -1
@@ -1207,7 +1207,6 @@ static int bond_master_upper_dev_link(st err =netdev_master_upper_dev_link_private (slave_dev, bond_dev, slave);if (err)return err; - slave_dev->flags |=IFF_SLAVE ;rtmsg_ifinfo (RTM_NEWLINK , slave_dev,IFF_SLAVE ,GFP_KERNEL );return 0 ; }
@@ -1465,6 +1464,9 @@ int bond_enslave(struct net_device *bond } } +/* set slave flag before open to prevent IPv6 addrconf */ + slave_dev->flags |=IFF_SLAVE ; +/* open the slave since the application closed it */ res =dev_open (slave_dev);if (res) {
@@ -1725,6 +1727,7 @@ err_close:dev_close (slave_dev); err_restore_mac: + slave_dev->flags &= ~IFF_SLAVE ;if (!bond->params.fail_over_mac ||BOND_MODE (bond) !=BOND_MODE_ACTIVEBACKUP ) {/* XXX TODO - fom follow mode needs to change master's
Greg Kroah-Hartman
maintainerPATCH 46/67 dwc_eth_qos: Fix dma address for multi-fragment skbs
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars Persson <[email protected]>
[ Upstream commit d461873272169a3fc3a8d155d7b1c92e9d97b419 ]
The offset inside the fragment was not used for the dma address and silent data corruption resulted because TSO makes the checksum match.
--- drivers/net/ethernet/synopsys/dwc_eth_qos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/synopsys/dwc_eth_qos.c +1 -1
@@ -2107,7 +2107,7 @@ static int dwceqos_tx_frags(struct sk_bu dd = &lp->tx_descs[lp->tx_next];/* Set DMA Descriptor fields */ - dd->des0 = dma_handle; + dd->des0 = dma_handle + consumed_size; dd->des1 =0 ; dd->des2 = dma_size;
Greg Kroah-Hartman
maintainerPATCH 47/67 phonet: properly unshare skbs in phonet_rcv()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 7aaed57c5c2890634cfadf725173c7c68ea4cb4f ]
Ivaylo Dimitrov reported a regression caused by commit 7866a621043f ("dev: add per net_device packet type chains").
skb->dev becomes NULL and we crash in __netif_receive_skb_core().
Before above commit, different kind of bugs or corruptions could happen without major crash.
But the root cause is that phonet_rcv() can queue skb without checking if skb is shared or not.
Many thanks to Ivaylo Dimitrov for his help, diagnosis and tests.
--- net/phonet/af_phonet.c | 4 ++++ 1 file changed, 4 insertions(+)
net/phonet/af_phonet.c +4 -0
@@ -377,6 +377,10 @@ static int phonet_rcv(struct sk_buff *skstruct sockaddr_pn sa;u16 len; + skb =skb_share_check (skb,GFP_ATOMIC ); +if (!skb) +return NET_RX_DROP ; +/* check we have at least a full Phonet header */ if (!pskb_pull (skb,sizeof (struct phonethdr ))) goto out;
Greg Kroah-Hartman
maintainerPATCH 48/67 net: bpf: reject invalid shifts
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rabin Vincent <[email protected]>
[ Upstream commit 229394e8e62a4191d592842cf67e80c62a492937 ]
On ARM64, a BUG() is triggered in the eBPF JIT if a filter with a constant shift that can't be encoded in the immediate field of the UBFM/SBFM instructions is passed to the JIT. Since these shifts amounts, which are negative or >= regsize, are invalid, reject them in the eBPF verifier and the classic BPF filter checker, for all architectures.
--- kernel/bpf/verifier.c | 10 ++++++++++ net/core/filter.c | 5 +++++ 2 files changed, 15 insertions(+)
kernel/bpf/verifier.c +10 -0
@@ -1121,6 +1121,16 @@ static int check_alu_op(struct verifier_return -EINVAL ; } +if ((opcode ==BPF_LSH || opcode ==BPF_RSH || + opcode ==BPF_ARSH ) &&BPF_SRC (insn->code) ==BPF_K ) { +int size =BPF_CLASS (insn->code) ==BPF_ALU64 ?64 :32 ; + +if (insn->imm <0 || insn->imm >= size) { +verbose ("invalid shift %d\n" , insn->imm); +return -EINVAL ; + } + } +/* pattern match 'bpf_add Rx, imm' instruction */ if (opcode == BPF_ADD && BPF_CLASS(insn->code) == BPF_ALU64 && regs[insn->dst_reg].type == FRAME_PTR &&
net/core/filter.c +5 -0
@@ -777,6 +777,11 @@ static int bpf_check_classic(const strucif (ftest->k ==0 )return -EINVAL ;break ; +case BPF_ALU |BPF_LSH |BPF_K : +case BPF_ALU |BPF_RSH |BPF_K : +if (ftest->k >=32 ) +return -EINVAL ; +break ;case BPF_LD |BPF_MEM :case BPF_LDX |BPF_MEM :case BPF_ST :
Greg Kroah-Hartman
maintainerPATCH 49/67 ipv6: update skb->csum when CE mark is propagated
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 34ae6a1aa0540f0f781dd265366036355fdc8930 ]
When a tunnel decapsulates the outer header, it has to comply with RFC 6080 and eventually propagate CE mark into inner header.
It turns out IP6_ECN_set_ce() does not correctly update skb->csum for CHECKSUM_COMPLETE packets, triggering infamous "hw csum failure" messages and stack traces.
--- include/net/inet_ecn.h | 19 ++++++++++++++++--- net/ipv6/xfrm6_mode_tunnel.c | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-)
include/net/inet_ecn.h +16 -3
@@ -111,11 +111,24 @@ static inline void ipv4_copy_dscp(unsignstruct ipv6hdr ; -static inline int IP6_ECN_set_ce (struct ipv6hdr *iph) +/* Note: +* IP_ECN_set_ce() has to tweak IPV4 checksum when setting CE, +* meaning both changes have no effect on skb->csum if/when CHECKSUM_COMPLETE +* In IPv6 case, no checksum compensates the change in IPv6 header, +* so we have to update skb->csum. +*/ +static inline int IP6_ECN_set_ce (struct sk_buff *skb,struct ipv6hdr *iph) { +__be32 from, to; +if (INET_ECN_is_not_ect (ipv6_get_dsfield (iph)))return 0 ; - *(__be32 *)iph |=htonl (INET_ECN_CE <<20 ); + + from = *(__be32 *)iph; + to = from |htonl (INET_ECN_CE <<20 ); + *(__be32 *)iph = to; +if (skb->ip_summed ==CHECKSUM_COMPLETE ) + skb->csum =csum_add (csum_sub (skb->csum, from), to);return 1 ; }
@@ -142,7 +155,7 @@ static inline int INET_ECN_set_ce(structcase cpu_to_be16 (ETH_P_IPV6 ):if (skb_network_header (skb) +sizeof (struct ipv6hdr ) <=skb_tail_pointer (skb)) -return IP6_ECN_set_ce (ipv6_hdr (skb)); +return IP6_ECN_set_ce (skb,ipv6_hdr (skb));break ; }
net/ipv6/xfrm6_mode_tunnel.c +1 -1
@@ -23,7 +23,7 @@ static inline void ipip6_ecn_decapsulatestruct ipv6hdr *inner_iph =ipipv6_hdr (skb);if (INET_ECN_is_ce (XFRM_MODE_SKB_CB (skb)->tos)) -IP6_ECN_set_ce (inner_iph); +IP6_ECN_set_ce (skb, inner_iph); }/* Add encapsulation header.
Greg Kroah-Hartman
maintainerPATCH 50/67 bridge: fix lockdep addr_list_lock false positive splat
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikolay Aleksandrov <[email protected]>
[ Upstream commit c6894dec8ea9ae05747124dce98b3b5c2e69b168 ]
After promisc mode management was introduced a bridge device could do dev_set_promiscuity from its ndo_change_rx_flags() callback which in turn can be called after the bridge's addr_list_lock has been taken (e.g. by dev_uc_add). This causes a false positive lockdep splat because the port interfaces' addr_list_lock is taken when br_manage_promisc() runs after the bridge's addr list lock was already taken.
To remove the false positive introduce a custom bridge addr_list_lock class and set it on bridge init.
A simple way to reproduce this is with the following:
$ brctl addbr br0
$ ip l add l br0 br0.100 type vlan id 100
$ ip l set br0 up
$ ip l set br0.100 up
$ echo 1 > /sys/class/net/br0/bridge/vlan_filtering
$ brctl addif br0 eth0
Splat:
[ 43.684325] =============================================
[ 43.684485] [ INFO: possible recursive locking detected ]
[ 43.684636] 4.4.0-rc8+ #54 Not tainted
[ 43.684755] ---------------------------------------------
[ 43.684906] brctl/1187 is trying to acquire lock:
[ 43.685047] (_xmit_ETHER){+.....}, at: [<ffffffff8150169e>] dev_set_rx_mode+0x1e/0x40
[ 43.685460] but task is already holding lock:
[ 43.685618] (_xmit_ETHER){+.....}, at: [<ffffffff815072a7>] dev_uc_add+0x27/0x80
[ 43.686015] other info that might help us debug this:
[ 43.686316] Possible unsafe locking scenario:[ 43.686743] CPU0 [ 43.686967] ---- [ 43.687197] lock(_xmit_ETHER); [ 43.687544] lock(_xmit_ETHER); [ 43.687886] *** DEADLOCK ***
[ 43.688438] May be due to missing lock nesting notation
[ 43.688882] 2 locks held by brctl/1187:
[ 43.689134] #0: (rtnl_mutex){+.+.+.}, at: [<ffffffff81510317>] rtnl_lock+0x17/0x20
[ 43.689852] #1: (_xmit_ETHER){+.....}, at: [<ffffffff815072a7>] dev_uc_add+0x27/0x80
[ 43.690575] stack backtrace:
[ 43.690970] CPU: 0 PID: 1187 Comm: brctl Not tainted 4.4.0-rc8+ #54
[ 43.691270] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.8.1-20150318_183358- 04/01/2014
[ 43.691770] ffffffff826a25c0 ffff8800369fb8e0 ffffffff81360ceb ffffffff826a25c0
[ 43.692425] ffff8800369fb9b8 ffffffff810d0466 ffff8800369fb968 ffffffff81537139
[ 43.693071] ffff88003a08c880 0000000000000000 00000000ffffffff 0000000002080020
[ 43.693709] Call Trace:
[ 43.693931] [<ffffffff81360ceb>] dump_stack+0x4b/0x70
[ 43.694199] [<ffffffff810d0466>] __lock_acquire+0x1e46/0x1e90
[ 43.694483] [<ffffffff81537139>] ? netlink_broadcast_filtered+0x139/0x3e0
[ 43.694789] [<ffffffff8153b5da>] ? nlmsg_notify+0x5a/0xc0
[ 43.695064] [<ffffffff810d10f5>] lock_acquire+0xe5/0x1f0
[ 43.695340] [<ffffffff8150169e>] ? dev_set_rx_mode+0x1e/0x40
[ 43.695623] [<ffffffff815edea5>] _raw_spin_lock_bh+0x45/0x80
[ 43.695901] [<ffffffff8150169e>] ? dev_set_rx_mode+0x1e/0x40
[ 43.696180] [<ffffffff8150169e>] dev_set_rx_mode+0x1e/0x40
[ 43.696460] [<ffffffff8150189c>] dev_set_promiscuity+0x3c/0x50
[ 43.696750] [<ffffffffa0586845>] br_port_set_promisc+0x25/0x50 [bridge]
[ 43.697052] [<ffffffffa05869aa>] br_manage_promisc+0x8a/0xe0 [bridge]
[ 43.697348] [<ffffffffa05826ee>] br_dev_change_rx_flags+0x1e/0x20 [bridge]
[ 43.697655] [<ffffffff81501532>] __dev_set_promiscuity+0x132/0x1f0
[ 43.697943] [<ffffffff81501672>] __dev_set_rx_mode+0x82/0x90
[ 43.698223] [<ffffffff815072de>] dev_uc_add+0x5e/0x80
[ 43.698498] [<ffffffffa05b3c62>] vlan_device_event+0x542/0x650 [8021q]
[ 43.698798] [<ffffffff8109886d>] notifier_call_chain+0x5d/0x80
[ 43.699083] [<ffffffff810988b6>] raw_notifier_call_chain+0x16/0x20
[ 43.699374] [<ffffffff814f456e>] call_netdevice_notifiers_info+0x6e/0x80
[ 43.699678] [<ffffffff814f4596>] call_netdevice_notifiers+0x16/0x20
[ 43.699973] [<ffffffffa05872be>] br_add_if+0x47e/0x4c0 [bridge]
[ 43.700259] [<ffffffffa058801e>] add_del_if+0x6e/0x80 [bridge]
[ 43.700548] [<ffffffffa0588b5f>] br_dev_ioctl+0xaf/0xc0 [bridge]
[ 43.700836] [<ffffffff8151a7ac>] dev_ifsioc+0x30c/0x3c0
[ 43.701106] [<ffffffff8151aac9>] dev_ioctl+0xf9/0x6f0
[ 43.701379] [<ffffffff81254345>] ? mntput_no_expire+0x5/0x450
[ 43.701665] [<ffffffff812543ee>] ? mntput_no_expire+0xae/0x450
[ 43.701947] [<ffffffff814d7b02>] sock_do_ioctl+0x42/0x50
[ 43.702219] [<ffffffff814d8175>] sock_ioctl+0x1e5/0x290
[ 43.702500] [<ffffffff81242d0b>] do_vfs_ioctl+0x2cb/0x5c0
[ 43.702771] [<ffffffff81243079>] SyS_ioctl+0x79/0x90
[ 43.703033] [<ffffffff815eebb6>] entry_SYSCALL_64_fastpath+0x16/0x7a--- net/bridge/br_device.c | 8 ++++++++ 1 file changed, 8 insertions(+)
net/bridge/br_device.c +8 -0
@@ -28,6 +28,8 @@const struct nf_br_ops __rcu *nf_br_ops__read_mostly ;EXPORT_SYMBOL_GPL (nf_br_ops); +static struct lock_class_key bridge_netdev_addr_lock_key; +/* net device transmit always called with BH disabled */ netdev_tx_t br_dev_xmit (struct sk_buff *skb,struct net_device *dev) {
@@ -87,6 +89,11 @@ out:return NETDEV_TX_OK ; } +static void br_set_lockdep_class (struct net_device *dev) +{ +lockdep_set_class (&dev->addr_list_lock, &bridge_netdev_addr_lock_key); +} +static int br_dev_init (struct net_device *dev) {struct net_bridge *br =netdev_priv (dev);
@@ -99,6 +106,7 @@ static int br_dev_init(struct net_device err =br_vlan_init (br);if (err)free_percpu (br->stats); +br_set_lockdep_class (dev);return err; }
Greg Kroah-Hartman
maintainerPATCH 51/67 net/mlx5_core: Fix trimming down IRQ number
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Doron Tsur <[email protected]>
[ Upstream commit 0b6e26ce89391327d955a756a7823272238eb867 ]
With several ConnectX-4 cards installed on a server, one may receive irqn > 255 from the kernel API, which we mistakenly trim to 8bit.
This causes EQ creation failure with the following stack trace:
[<ffffffff812a11f4>] dump_stack+0x48/0x64 [<ffffffff810ace21>] __setup_irq+0x3a1/0x4f0 [<ffffffff810ad7e0>] request_threaded_irq+0x120/0x180 [<ffffffffa0923660>] ? mlx5_eq_int+0x450/0x450 [mlx5_core] [<ffffffffa0922f64>] mlx5_create_map_eq+0x1e4/0x2b0 [mlx5_core] [<ffffffffa091de01>] alloc_comp_eqs+0xb1/0x180 [mlx5_core] [<ffffffffa091ea99>] mlx5_dev_init+0x5e9/0x6e0 [mlx5_core] [<ffffffffa091ec29>] init_one+0x99/0x1c0 [mlx5_core] [<ffffffff812e2afc>] local_pci_probe+0x4c/0xa0
Fixing it by changing of the irqn type from u8 to unsigned int to support values > 255
--- drivers/infiniband/hw/mlx5/cq.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 6 +++--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 ++- include/linux/mlx5/cq.h | 2 +- include/linux/mlx5/driver.h | 5 +++-- 5 files changed, 10 insertions(+), 8 deletions(-)
drivers/infiniband/hw/mlx5/cq.c +1 -1
@@ -756,7 +756,7 @@ struct ib_cq *mlx5_ib_create_cq(struct iint uninitialized_var (index );int uninitialized_var (inlen );int cqe_size; -int irqn; +unsigned int irqn;int eqn;int err;
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +3 -3
@@ -746,7 +746,7 @@ static int mlx5e_create_cq(struct mlx5e_struct mlx5_core_dev *mdev = priv->mdev;struct mlx5_core_cq *mcq = &cq->mcq;int eqn_not_used; -int irqn; +unsigned int irqn;int err;u32 i;
@@ -800,7 +800,7 @@ static int mlx5e_enable_cq(struct mlx5e_void *in;void *cqc;int inlen; -int irqn_not_used; +unsigned int irqn_not_used;int eqn;int err;
@@ -1504,7 +1504,7 @@ static int mlx5e_create_drop_cq(struct mstruct mlx5_core_dev *mdev = priv->mdev;struct mlx5_core_cq *mcq = &cq->mcq;int eqn_not_used; -int irqn; +unsigned int irqn;int err; err = mlx5_cqwq_create(mdev, ¶m->wq, param->cqc, &cq->wq,
drivers/net/ethernet/mellanox/mlx5/core/main.c +2 -1
@@ -568,7 +568,8 @@ static void mlx5_irq_clear_affinity_hintmlx5_irq_clear_affinity_hint (mdev, i); } -int mlx5_vector2eqn (struct mlx5_core_dev *dev,int vector,int *eqn,int *irqn) +int mlx5_vector2eqn (struct mlx5_core_dev *dev,int vector,int *eqn, +unsigned int *irqn) {struct mlx5_eq_table *table = &dev->priv.eq_table;struct mlx5_eq *eq, *n;
include/linux/mlx5/cq.h +1 -1
@@ -45,7 +45,7 @@ struct mlx5_core_cq {atomic_t refcount;struct completion free;unsigned vector; -int irqn; +unsigned int irqn;void (*comp) (struct mlx5_core_cq *);void (*event) (struct mlx5_core_cq *,enum mlx5_event );struct mlx5_uar *uar;
include/linux/mlx5/driver.h +3 -2
@@ -303,7 +303,7 @@ struct mlx5_eq {u32 cons_index;struct mlx5_buf buf;int size; -u8 irqn; +unsigned int irqn;u8 eqn;int nent;u64 mask;
@@ -762,7 +762,8 @@ int mlx5_create_map_eq(struct mlx5_core_int mlx5_destroy_unmap_eq (struct mlx5_core_dev *dev,struct mlx5_eq *eq);int mlx5_start_eqs (struct mlx5_core_dev *dev);int mlx5_stop_eqs (struct mlx5_core_dev *dev); -int mlx5_vector2eqn (struct mlx5_core_dev *dev,int vector,int *eqn,int *irqn); +int mlx5_vector2eqn (struct mlx5_core_dev *dev,int vector,int *eqn, +unsigned int *irqn);int mlx5_core_attach_mcg (struct mlx5_core_dev *dev,union ib_gid *mgid,u32 qpn);int mlx5_core_detach_mcg (struct mlx5_core_dev *dev,union ib_gid *mgid,u32 qpn);
Greg Kroah-Hartman
maintainerPATCH 52/67 team: Replace rcu_read_lock with a mutex in team_vlan_rx_kill_vid
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 60a6531bfe49555581ccd65f66a350cc5693fcde ]
We can't be within an RCU read-side critical section when deleting VLANs, as underlying drivers might sleep during the hardware operation. Therefore, replace the RCU critical section with a mutex. This is consistent with team_vlan_rx_add_vid.
--- drivers/net/team/team.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/team/team.c +3 -3
@@ -1845,10 +1845,10 @@ static int team_vlan_rx_kill_vid(structstruct team *team =netdev_priv (dev);struct team_port *port; -rcu_read_lock (); -list_for_each_entry_rcu (port, &team->port_list, list) +mutex_lock (&team->lock); +list_for_each_entry (port, &team->port_list, list)vlan_vid_del (port->dev, proto, vid); -rcu_read_unlock (); +mutex_unlock (&team->lock);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 53/67 batman-adv: Avoid recursive call_rcu for batadv_bla_claim
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit 63b399272294e7a939cde41792dca38c549f0484 ]
The batadv_claim_free_ref function uses call_rcu to delay the free of the batadv_bla_claim object until no (already started) rcu_read_lock is enabled anymore. This makes sure that no context is still trying to access the object which should be removed. But batadv_bla_claim also contains a reference to backbone_gw which must be removed.
The reference drop of backbone_gw was done in the call_rcu function batadv_claim_free_rcu but should actually be done in the batadv_claim_release function to avoid nested call_rcus. This is important because rcu_barrier (e.g. batadv_softif_free or batadv_exit) will not detect the inner call_rcu as relevant for its execution. Otherwise this barrier will most likely be inserted in the queue before the callback of the first call_rcu was executed. The caller of rcu_barrier will therefore continue to run before the inner call_rcu callback finished.
--- net/batman-adv/bridge_loop_avoidance.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
net/batman-adv/bridge_loop_avoidance.c +3 -7
@@ -127,21 +127,17 @@ batadv_backbone_gw_free_ref(struct batad }/* finally deinitialize the claim */ -static void batadv_claim_free_rcu (struct rcu_head *rcu) +static void batadv_claim_release (struct batadv_bla_claim *claim) { -struct batadv_bla_claim *claim; - - claim = container_of(rcu, struct batadv_bla_claim, rcu); -batadv_backbone_gw_free_ref (claim->backbone_gw); -kfree (claim); +kfree_rcu (claim, rcu); }/* free a claim, call claim_free_rcu if its the last reference */ static void batadv_claim_free_ref (struct batadv_bla_claim *claim) {if (atomic_dec_and_test (&claim->refcount)) -call_rcu (&claim->rcu, batadv_claim_free_rcu); +batadv_claim_release (claim); }/**
Greg Kroah-Hartman
maintainerPATCH 54/67 batman-adv: Avoid recursive call_rcu for batadv_nc_node
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit 44e8e7e91d6c7c7ab19688750f7257292640d1a0 ]
The batadv_nc_node_free_ref function uses call_rcu to delay the free of the batadv_nc_node object until no (already started) rcu_read_lock is enabled anymore. This makes sure that no context is still trying to access the object which should be removed. But batadv_nc_node also contains a reference to orig_node which must be removed.
The reference drop of orig_node was done in the call_rcu function batadv_nc_node_free_rcu but should actually be done in the batadv_nc_node_release function to avoid nested call_rcus. This is important because rcu_barrier (e.g. batadv_softif_free or batadv_exit) will not detect the inner call_rcu as relevant for its execution. Otherwise this barrier will most likely be inserted in the queue before the callback of the first call_rcu was executed. The caller of rcu_barrier will therefore continue to run before the inner call_rcu callback finished.
--- net/batman-adv/network-coding.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
net/batman-adv/network-coding.c +8 -11
@@ -203,28 +203,25 @@ void batadv_nc_init_orig(struct batadv_o }/** -* batadv_nc_node_free_rcu - rcu callback to free an nc node and remove -* its refcount on the orig_node -* @rcu: rcu pointer of the nc node +* batadv_nc_node_release - release nc_node from lists and queue for free after +* rcu grace period +* @nc_node: the nc node to free */ -static void batadv_nc_node_free_rcu (struct rcu_head *rcu) +static void batadv_nc_node_release (struct batadv_nc_node *nc_node) { -struct batadv_nc_node *nc_node; - - nc_node = container_of(rcu, struct batadv_nc_node, rcu);batadv_orig_node_free_ref (nc_node->orig_node); -kfree (nc_node); +kfree_rcu (nc_node, rcu); }/** -* batadv_nc_node_free_ref - decrements the nc node refcounter and possibly -* frees it +* batadv_nc_node_free_ref - decrement the nc node refcounter and possibly +* release it * @nc_node: the nc node to free */ static void batadv_nc_node_free_ref (struct batadv_nc_node *nc_node) {if (atomic_dec_and_test (&nc_node->refcount)) -call_rcu (&nc_node->rcu, batadv_nc_node_free_rcu); +batadv_nc_node_release (nc_node); }/**
Greg Kroah-Hartman
maintainerPATCH 55/67 batman-adv: Drop immediate batadv_orig_ifinfo free function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit deed96605f5695cb945e0b3d79429581857a2b9d ]
It is not allowed to free the memory of an object which is part of a list which is protected by rcu-read-side-critical sections without making sure that no other context is accessing the object anymore. This usually happens by removing the references to this object and then waiting until the rcu grace period is over and no one (allowedly) accesses it anymore.
But the _now functions ignore this completely. They free the object directly even when a different context still tries to access it. This has to be avoided and thus these functions must be removed and all functions have to use batadv_orig_ifinfo_free_ref.
--- net/batman-adv/originator.c | 59 +++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 28 deletions(-)
net/batman-adv/originator.c +31 -28
@@ -553,76 +553,79 @@ static void batadv_orig_ifinfo_free_rcu( }/** -* batadv_orig_ifinfo_free_ref - decrement the refcounter and possibly free -* the orig_ifinfo (without rcu callback) +* batadv_orig_ifinfo_free_ref - decrement the refcounter and possibly release +* the orig_ifinfo * @orig_ifinfo: the orig_ifinfo object to release */ -static void -batadv_orig_ifinfo_free_ref_now (struct batadv_orig_ifinfo *orig_ifinfo) +void batadv_orig_ifinfo_free_ref (struct batadv_orig_ifinfo *orig_ifinfo) {if (atomic_dec_and_test (&orig_ifinfo->refcount)) -batadv_orig_ifinfo_free_rcu (&orig_ifinfo->rcu); +call_rcu (&orig_ifinfo->rcu, batadv_orig_ifinfo_free_rcu); }/** -* batadv_orig_ifinfo_free_ref - decrement the refcounter and possibly free -* the orig_ifinfo -* @orig_ifinfo: the orig_ifinfo object to release +* batadv_orig_node_free_rcu - free the orig_node +* @rcu: rcu pointer of the orig_node */ -void batadv_orig_ifinfo_free_ref (struct batadv_orig_ifinfo *orig_ifinfo) +static void batadv_orig_node_free_rcu (struct rcu_head *rcu) { -if (atomic_dec_and_test (&orig_ifinfo->refcount)) -call_rcu (&orig_ifinfo->rcu, batadv_orig_ifinfo_free_rcu); +struct batadv_orig_node *orig_node; + + orig_node = container_of(rcu, struct batadv_orig_node, rcu); + +batadv_mcast_purge_orig (orig_node); + +batadv_frag_purge_orig (orig_node,NULL ); + +if (orig_node->bat_priv->bat_algo_ops->bat_orig_free) + orig_node->bat_priv->bat_algo_ops->bat_orig_free (orig_node); + +kfree (orig_node->tt_buff); +kfree (orig_node); } -static void batadv_orig_node_free_rcu (struct rcu_head *rcu) +/** +* batadv_orig_node_release - release orig_node from lists and queue for +* free after rcu grace period +* @orig_node: the orig node to free +*/ +static void batadv_orig_node_release (struct batadv_orig_node *orig_node) {struct hlist_node *node_tmp;struct batadv_neigh_node *neigh_node; -struct batadv_orig_node *orig_node;struct batadv_orig_ifinfo *orig_ifinfo; - orig_node = container_of(rcu, struct batadv_orig_node, rcu); -spin_lock_bh (&orig_node->neigh_list_lock);/* for all neighbors towards this originator ... */ hlist_for_each_entry_safe (neigh_node, node_tmp, &orig_node->neigh_list, list) {hlist_del_rcu (&neigh_node->list); -batadv_neigh_node_free_ref_now (neigh_node); +batadv_neigh_node_free_ref (neigh_node); }hlist_for_each_entry_safe (orig_ifinfo, node_tmp, &orig_node->ifinfo_list, list) {hlist_del_rcu (&orig_ifinfo->list); -batadv_orig_ifinfo_free_ref_now (orig_ifinfo); +batadv_orig_ifinfo_free_ref (orig_ifinfo); }spin_unlock_bh (&orig_node->neigh_list_lock); -batadv_mcast_purge_orig (orig_node); -/* Free nc_nodes */ batadv_nc_purge_orig (orig_node->bat_priv, orig_node,NULL ); -batadv_frag_purge_orig (orig_node,NULL ); - -if (orig_node->bat_priv->bat_algo_ops->bat_orig_free) - orig_node->bat_priv->bat_algo_ops->bat_orig_free (orig_node); - -kfree (orig_node->tt_buff); -kfree (orig_node); +call_rcu (&orig_node->rcu, batadv_orig_node_free_rcu); }/** * batadv_orig_node_free_ref - decrement the orig node refcounter and possibly -* schedule an rcu callback for freeing it +* release it * @orig_node: the orig node to free */ void batadv_orig_node_free_ref (struct batadv_orig_node *orig_node) {if (atomic_dec_and_test (&orig_node->refcount)) -call_rcu (&orig_node->rcu, batadv_orig_node_free_rcu); +batadv_orig_node_release (orig_node); }/**
Greg Kroah-Hartman
maintainerPATCH 56/67 batman-adv: Drop immediate batadv_neigh_node free function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit 2baa753c276f27f8e844637561ad597867aa6fb6 ]
It is not allowed to free the memory of an object which is part of a list which is protected by rcu-read-side-critical sections without making sure that no other context is accessing the object anymore. This usually happens by removing the references to this object and then waiting until the rcu grace period is over and no one (allowedly) accesses it anymore.
But the _now functions ignore this completely. They free the object directly even when a different context still tries to access it. This has to be avoided and thus these functions must be removed and all functions have to use batadv_neigh_node_free_ref.
--- net/batman-adv/originator.c | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-)
net/batman-adv/originator.c +10 -23
@@ -229,20 +229,8 @@ static void batadv_neigh_node_free_rcu(s }/** -* batadv_neigh_node_free_ref_now - decrement the neighbors refcounter -* and possibly free it (without rcu callback) -* @neigh_node: neigh neighbor to free -*/ -static void -batadv_neigh_node_free_ref_now (struct batadv_neigh_node *neigh_node) -{ -if (atomic_dec_and_test (&neigh_node->refcount)) -batadv_neigh_node_free_rcu (&neigh_node->rcu); -} - -/** * batadv_neigh_node_free_ref - decrement the neighbors refcounter -* and possibly free it +* and possibly release it * @neigh_node: neigh neighbor to free */ void batadv_neigh_node_free_ref (struct batadv_neigh_node *neigh_node)
@@ -532,24 +520,23 @@ out: }/** -* batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object -* @rcu: rcu pointer of the orig_ifinfo object +* batadv_orig_ifinfo_release - release orig_ifinfo from lists and queue for +* free after rcu grace period +* @orig_ifinfo: the orig_ifinfo object to release */ -static void batadv_orig_ifinfo_free_rcu (struct rcu_head *rcu) +static void batadv_orig_ifinfo_release (struct batadv_orig_ifinfo *orig_ifinfo) { -struct batadv_orig_ifinfo *orig_ifinfo;struct batadv_neigh_node *router; - orig_ifinfo = container_of(rcu, struct batadv_orig_ifinfo, rcu); -if (orig_ifinfo->if_outgoing !=BATADV_IF_DEFAULT ) -batadv_hardif_free_ref_now (orig_ifinfo->if_outgoing); +batadv_hardif_free_ref (orig_ifinfo->if_outgoing);/* this is the last reference to this object */ router =rcu_dereference_protected (orig_ifinfo->router, true);if (router) -batadv_neigh_node_free_ref_now (router); -kfree (orig_ifinfo); +batadv_neigh_node_free_ref (router); + +kfree_rcu (orig_ifinfo, rcu); }/**
@@ -560,7 +547,7 @@ static void batadv_orig_ifinfo_free_rcu(void batadv_orig_ifinfo_free_ref (struct batadv_orig_ifinfo *orig_ifinfo) {if (atomic_dec_and_test (&orig_ifinfo->refcount)) -call_rcu (&orig_ifinfo->rcu, batadv_orig_ifinfo_free_rcu); +batadv_orig_ifinfo_release (orig_ifinfo); }/**
Greg Kroah-Hartman
maintainerPATCH 57/67 batman-adv: Drop immediate neigh_ifinfo free function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit ae3e1e36e3cb6c686a7a2725af20ca86aa46d62a ]
It is not allowed to free the memory of an object which is part of a list which is protected by rcu-read-side-critical sections without making sure that no other context is accessing the object anymore. This usually happens by removing the references to this object and then waiting until the rcu grace period is over and no one (allowedly) accesses it anymore.
But the _now functions ignore this completely. They free the object directly even when a different context still tries to access it. This has to be avoided and thus these functions must be removed and all functions have to use batadv_neigh_ifinfo_free_ref.
--- net/batman-adv/originator.c | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-)
net/batman-adv/originator.c +10 -24
@@ -163,42 +163,28 @@ err: }/** -* batadv_neigh_ifinfo_free_rcu - free the neigh_ifinfo object -* @rcu: rcu pointer of the neigh_ifinfo object -*/ -static void batadv_neigh_ifinfo_free_rcu (struct rcu_head *rcu) -{ -struct batadv_neigh_ifinfo *neigh_ifinfo; - - neigh_ifinfo = container_of(rcu, struct batadv_neigh_ifinfo, rcu); - -if (neigh_ifinfo->if_outgoing !=BATADV_IF_DEFAULT ) -batadv_hardif_free_ref_now (neigh_ifinfo->if_outgoing); - -kfree (neigh_ifinfo); -} - -/** -* batadv_neigh_ifinfo_free_now - decrement the refcounter and possibly free -* the neigh_ifinfo (without rcu callback) +* batadv_neigh_ifinfo_release - release neigh_ifinfo from lists and queue for +* free after rcu grace period * @neigh_ifinfo: the neigh_ifinfo object to release */ static void -batadv_neigh_ifinfo_free_ref_now (struct batadv_neigh_ifinfo *neigh_ifinfo) +batadv_neigh_ifinfo_release (struct batadv_neigh_ifinfo *neigh_ifinfo) { -if (atomic_dec_and_test (&neigh_ifinfo->refcount)) -batadv_neigh_ifinfo_free_rcu (&neigh_ifinfo->rcu); +if (neigh_ifinfo->if_outgoing !=BATADV_IF_DEFAULT ) +batadv_hardif_free_ref (neigh_ifinfo->if_outgoing); + +kfree_rcu (neigh_ifinfo, rcu); }/** -* batadv_neigh_ifinfo_free_ref - decrement the refcounter and possibly free +* batadv_neigh_ifinfo_free_ref - decrement the refcounter and possibly release * the neigh_ifinfo * @neigh_ifinfo: the neigh_ifinfo object to release */ void batadv_neigh_ifinfo_free_ref (struct batadv_neigh_ifinfo *neigh_ifinfo) {if (atomic_dec_and_test (&neigh_ifinfo->refcount)) -call_rcu (&neigh_ifinfo->rcu, batadv_neigh_ifinfo_free_rcu); +batadv_neigh_ifinfo_release (neigh_ifinfo); }/**
@@ -217,7 +203,7 @@ static void batadv_neigh_node_free_rcu(shlist_for_each_entry_safe (neigh_ifinfo, node_tmp, &neigh_node->ifinfo_list, list) { -batadv_neigh_ifinfo_free_ref_now (neigh_ifinfo); +batadv_neigh_ifinfo_free_ref (neigh_ifinfo); }if (bao->bat_neigh_free)
Greg Kroah-Hartman
maintainerPATCH 58/67 batman-adv: Drop immediate batadv_hard_iface free function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit b4d922cfc9c08318eeb77d53b7633740e6b0efb0 ]
It is not allowed to free the memory of an object which is part of a list which is protected by rcu-read-side-critical sections without making sure that no other context is accessing the object anymore. This usually happens by removing the references to this object and then waiting until the rcu grace period is over and no one (allowedly) accesses it anymore.
But the _now functions ignore this completely. They free the object directly even when a different context still tries to access it. This has to be avoided and thus these functions must be removed and all functions have to use batadv_hardif_free_ref.
--- net/batman-adv/hard-interface.h | 12 ------------ net/batman-adv/originator.c | 14 +++++++------- 2 files changed, 7 insertions(+), 19 deletions(-)
net/batman-adv/hard-interface.h +0 -12
@@ -75,18 +75,6 @@ batadv_hardif_free_ref(struct batadv_harcall_rcu (&hard_iface->rcu, batadv_hardif_free_rcu); } -/** -* batadv_hardif_free_ref_now - decrement the hard interface refcounter and -* possibly free it (without rcu callback) -* @hard_iface: the hard interface to free -*/ -static inline void -batadv_hardif_free_ref_now (struct batadv_hard_iface *hard_iface) -{ -if (atomic_dec_and_test (&hard_iface->refcount)) -batadv_hardif_free_rcu (&hard_iface->rcu); -} -static inline struct batadv_hard_iface *batadv_primary_if_get_selected (struct batadv_priv *bat_priv) {
net/batman-adv/originator.c +7 -7
@@ -189,16 +189,16 @@ void batadv_neigh_ifinfo_free_ref(struct/** * batadv_neigh_node_free_rcu - free the neigh_node -* @rcu: rcu pointer of the neigh_node +* batadv_neigh_node_release - release neigh_node from lists and queue for +* free after rcu grace period +* @neigh_node: neigh neighbor to free */ -static void batadv_neigh_node_free_rcu (struct rcu_head *rcu) +static void batadv_neigh_node_release (struct batadv_neigh_node *neigh_node) {struct hlist_node *node_tmp; -struct batadv_neigh_node *neigh_node;struct batadv_neigh_ifinfo *neigh_ifinfo;struct batadv_algo_ops *bao; - neigh_node = container_of(rcu, struct batadv_neigh_node, rcu); bao = neigh_node->orig_node->bat_priv->bat_algo_ops; hlist_for_each_entry_safe(neigh_ifinfo, node_tmp,
@@ -209,9 +209,9 @@ static void batadv_neigh_node_free_rcu(sif (bao->bat_neigh_free) bao->bat_neigh_free (neigh_node); -batadv_hardif_free_ref_now (neigh_node->if_incoming); +batadv_hardif_free_ref (neigh_node->if_incoming); -kfree (neigh_node); +kfree_rcu (neigh_node, rcu); }/**
@@ -222,7 +222,7 @@ static void batadv_neigh_node_free_rcu(svoid batadv_neigh_node_free_ref (struct batadv_neigh_node *neigh_node) {if (atomic_dec_and_test (&neigh_node->refcount)) -call_rcu (&neigh_node->rcu, batadv_neigh_node_free_rcu); +batadv_neigh_node_release (neigh_node); }/**
Greg Kroah-Hartman
maintainerPATCH 59/67 batman-adv: Drop immediate orig_node free function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
[ Upstream commit 42eff6a617e23b691f8e4467f4687ed7245a92db ]
It is not allowed to free the memory of an object which is part of a list which is protected by rcu-read-side-critical sections without making sure that no other context is accessing the object anymore. This usually happens by removing the references to this object and then waiting until the rcu grace period is over and no one (allowedly) accesses it anymore.
But the _now functions ignore this completely. They free the object directly even when a different context still tries to access it. This has to be avoided and thus these functions must be removed and all functions have to use batadv_orig_node_free_ref.
--- net/batman-adv/originator.c | 11 ----------- net/batman-adv/originator.h | 1 - net/batman-adv/translation-table.c | 28 +++++++++++++--------------- 3 files changed, 13 insertions(+), 27 deletions(-)
net/batman-adv/originator.c +0 -11
@@ -601,17 +601,6 @@ void batadv_orig_node_free_ref(struct babatadv_orig_node_release (orig_node); } -/** -* batadv_orig_node_free_ref_now - decrement the orig node refcounter and -* possibly free it (without rcu callback) -* @orig_node: the orig node to free -*/ -void batadv_orig_node_free_ref_now (struct batadv_orig_node *orig_node) -{ -if (atomic_dec_and_test (&orig_node->refcount)) -batadv_orig_node_free_rcu (&orig_node->rcu); -} -void batadv_originator_free (struct batadv_priv *bat_priv) {struct batadv_hashtable *hash = bat_priv->orig_hash;
net/batman-adv/originator.h +0 -1
@@ -38,7 +38,6 @@ int batadv_originator_init(struct batadvvoid batadv_originator_free (struct batadv_priv *bat_priv);void batadv_purge_orig_ref (struct batadv_priv *bat_priv);void batadv_orig_node_free_ref (struct batadv_orig_node *orig_node); -void batadv_orig_node_free_ref_now (struct batadv_orig_node *orig_node);struct batadv_orig_node *batadv_orig_node_new (struct batadv_priv *bat_priv,const u8 *addr); struct batadv_neigh_node *
net/batman-adv/translation-table.c +13 -15
@@ -240,20 +240,6 @@ int batadv_tt_global_hash_count(struct breturn count; } -static void batadv_tt_orig_list_entry_free_rcu (struct rcu_head *rcu) -{ -struct batadv_tt_orig_list_entry *orig_entry; - - orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu); - -/* We are in an rcu callback here, therefore we cannot use -* batadv_orig_node_free_ref() and its call_rcu(): -* An rcu_barrier() wouldn't wait for that to finish -*/ -batadv_orig_node_free_ref_now (orig_entry->orig_node); -kfree (orig_entry); -} -/** * batadv_tt_local_size_mod - change the size by v of the local table identified * by vid
@@ -349,13 +335,25 @@ static void batadv_tt_global_size_dec(stbatadv_tt_global_size_mod (orig_node, vid,-1 ); } +/** +* batadv_tt_orig_list_entry_release - release tt orig entry from lists and +* queue for free after rcu grace period +* @orig_entry: tt orig entry to be free'd +*/ +static void +batadv_tt_orig_list_entry_release (struct batadv_tt_orig_list_entry *orig_entry) +{ +batadv_orig_node_free_ref (orig_entry->orig_node); +kfree_rcu (orig_entry, rcu); +} +static void batadv_tt_orig_list_entry_free_ref (struct batadv_tt_orig_list_entry *orig_entry) {if (!atomic_dec_and_test (&orig_entry->refcount))return ; -call_rcu (&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu); +batadv_tt_orig_list_entry_release (orig_entry); }/**
Greg Kroah-Hartman
maintainerPATCH 60/67 powerpc/tm: Check for already reclaimed tasks
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Neuling <[email protected]>
commit 7f821fc9c77a9b01fe7b1d6e72717b33d8d64142 upstream.
Currently we can hit a scenario where we'll tm_reclaim() twice. This results in a TM bad thing exception because the second reclaim occurs when not in suspend mode.
The scenario in which this can happen is the following. We attempt to deliver a signal to userspace. To do this we need obtain the stack pointer to write the signal context. To get this stack pointer we must tm_reclaim() in case we need to use the checkpointed stack pointer (see get_tm_stackpointer()). Normally we'd then return directly to userspace to deliver the signal without going through __switch_to().
Unfortunatley, if at this point we get an error (such as a bad userspace stack pointer), we need to exit the process. The exit will result in a __switch_to(). __switch_to() will attempt to save the process state which results in another tm_reclaim(). This tm_reclaim() now causes a TM Bad Thing exception as this state has already been saved and the processor is no longer in TM suspend mode. Whee!
This patch checks the state of the MSR to ensure we are TM suspended before we attempt the tm_reclaim(). If we've already saved the state away, we should no longer be in TM suspend mode. This has the additional advantage of checking for a potential TM Bad Thing exception.
Found using syscall fuzzer.
--- arch/powerpc/kernel/process.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
arch/powerpc/kernel/process.c +18 -0
@@ -569,6 +569,24 @@ static void tm_reclaim_thread(struct thrif (!MSR_TM_SUSPENDED (mfmsr ()))return ; +/* +* Use the current MSR TM suspended bit to track if we have +* checkpointed state outstanding. +* On signal delivery, we'd normally reclaim the checkpointed +* state to obtain stack pointer (see:get_tm_stackpointer()). +* This will then directly return to userspace without going +* through __switch_to(). However, if the stack frame is bad, +* we need to exit this thread which calls __switch_to() which +* will again attempt to reclaim the already saved tm state. +* Hence we need to check that we've not already reclaimed +* this state. +* We do this using the current MSR, rather tracking it in +* some specific thread_struct bit, as it has the additional +* benifit of checking for a potential TM bad thing exception. +*/ +if (!MSR_TM_SUSPENDED (mfmsr ())) +return ; +tm_reclaim (thr, thr->regs->msr, cause);/* Having done the reclaim, we now have the checkpointed
Re: [PATCH 4.4 60/67] powerpc/tm: Check for already reclaimed tasks
Quoted 58 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Neuling <[email protected]>
commit
7f821fc9c77a9b01fe7b1d6e72717b33d8d64142upstream.Currently we can hit a scenario where we'll
tm_reclaim()twice. This results in a TM bad thing exception because the second reclaim occurs when not in suspend mode.The scenario in which this can happen is the following. We attempt to deliver a signal to userspace. To do this we need obtain the stack pointer to write the signal context. To get this stack pointer we must
tm_reclaim()in case we need to use the checkpointed stack pointer (seeget_tm_stackpointer()). Normally we'd then return directly to userspace to deliver the signal without going through__switch_to().Unfortunatley, if at this point we get an error (such as a bad userspace stack pointer), we need to exit the process. The exit will result in a
__switch_to().__switch_to()will attempt to save the process state which results in anothertm_reclaim(). Thistm_reclaim()now causes a TM Bad Thing exception as this state has already been saved and the processor is no longer in TM suspend mode. Whee!This patch checks the state of the MSR to ensure we are TM suspended before we attempt the
tm_reclaim(). If we've already saved the state away, we should no longer be in TM suspend mode. This has the additional advantage of checking for a potential TM Bad Thing exception.Found using syscall fuzzer.
Fixes fb09692e71f1 ("powerpc: Add reclaim and recheckpoint functions for context switching transactional memory processes")Signed-off-by Michael Neuling <[email protected]>Signed-off-by Michael Ellerman <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- arch/powerpc/kernel/process.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)arch/powerpc/kernel/process.c +7
-0@@ -569,6 +569,24 @@ static void tm_reclaim_thread(struct thrif (!MSR_TM_SUSPENDED (mfmsr ()))return ; +/* +* Use the current MSR TM suspended bit to track if we have +* checkpointed state outstanding. +* On signal delivery, we'd normally reclaim the checkpointed +* state to obtain stack pointer (see:get_tm_stackpointer()). +* This will then directly return to userspace without going +* through __switch_to(). However, if the stack frame is bad,
arch/powerpc/kernel/process.c static void tm_reclaim_thread(struct thr · line 588
Quoted 10 lines
arch/powerpc/kernel/process.c +10
-0+* we need to exit this thread which calls __switch_to() which +* will again attempt to reclaim the already saved tm state. +* Hence we need to check that we've not already reclaimed +* this state. +* We do this using the current MSR, rather tracking it in +* some specific thread_struct bit, as it has the additional +* benifit of checking for a potential TM bad thing exception. +*/ +if (!MSR_TM_SUSPENDED (mfmsr ())) +return ;
This one should have not been applied to 4.4. The patch is in mainline since 4.4-rc6. Hence the check is duplicated as can be seen above.
It is harmless though, it seems?
thanks,
Signature · 2 lines
js suse labs
Re: [PATCH 4.4 60/67] powerpc/tm: Check for already reclaimed tasks
Quoted 68 lines · Jiri Slaby
Quoted 67 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Neuling <[email protected]>
commit
7f821fc9c77a9b01fe7b1d6e72717b33d8d64142upstream.Currently we can hit a scenario where we'll
tm_reclaim()twice. This results in a TM bad thing exception because the second reclaim occurs when not in suspend mode.The scenario in which this can happen is the following. We attempt to deliver a signal to userspace. To do this we need obtain the stack pointer to write the signal context. To get this stack pointer we must
tm_reclaim()in case we need to use the checkpointed stack pointer (see get_tm_stackpointer()). Normally we'd then return directly to userspace to deliver the signal
without going through__switch_to().Unfortunatley, if at this point we get an error (such as a bad userspace stack pointer), we need to exit the process. The exit will result in a __switch_to(). __switch_to() will attempt to save the process state which results in another tm_reclaim(). This
tm_reclaim()now causes a TM Bad Thing exception as this state has already been saved and the processor is no longer in TM suspend mode. Whee!This patch checks the state of the MSR to ensure we are TM suspended before we attempt the tm_reclaim(). If we've already saved the state away, we should no longer be in TM suspend mode. This has the additional advantage of checking for a potential TM Bad Thing exception.
Found using syscall fuzzer.
Fixes fb09692e71f1 ("powerpc: Add reclaim and recheckpoint functionsfor context switching transactional memory processes")
Signed-off-by Michael Neuling <[email protected]>Signed-off-by Michael Ellerman <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>---
arch/powerpc/kernel/process.c | 18 ++++++++++++++++++1 file changed, 18 insertions(+)arch/powerpc/kernel/process.c +0
-0@@ -569,6 +569,24 @@ static void tm_reclaim_thread(struct thr if (!MSR_TM_SUSPENDED(mfmsr())) return;arch/powerpc/kernel/process.c +12
-0+/* +* Use the current MSR TM suspended bit to track if we have +* checkpointed state outstanding. +* On signal delivery, we'd normally reclaim the checkpointed +* state to obtain stack pointer (see:get_tm_stackpointer()). +* This will then directly return to userspace without going +* through __switch_to(). However, if the stack frame is bad, +* we need to exit this thread which calls __switch_to() which +* will again attempt to reclaim the already saved tm state. +* Hence we need to check that we've not already reclaimed +* this state. +* We do this using the current MSR, rather tracking it in
Quoted 8 lines
arch/powerpc/kernel/process.c static void tm_reclaim_thread(struct thr · line 588
Quoted 5 lines
arch/powerpc/kernel/process.c +5
-0+* some specific thread_struct bit, as it has the additional +* benifit of checking for a potential TM bad thing exception. +*/ +if (!MSR_TM_SUSPENDED (mfmsr ())) +return ;
This one should have not been applied to 4.4. The patch is in mainline since 4.4-rc6. Hence the check is duplicated as can be seen above.
Greg, surely your scripts could check for that?
Quoted 1 line
It is harmless though, it seems?
Yes, that should be harmless, other than a small performance penalty.
Mikey
Greg Kroah-Hartman
maintainerRe: [PATCH 4.4 60/67] powerpc/tm: Check for already reclaimed tasks
Quoted 78 lines · Michael Neuling
Quoted 68 lines · Jiri Slaby
Quoted 67 lines · Greg Kroah-Hartman
4.4-stable review patch.��If anyone has any objections, please let me know.
------------------
From: Michael Neuling <[email protected]>
commit
7f821fc9c77a9b01fe7b1d6e72717b33d8d64142upstream.Currently we can hit a scenario where we'll
tm_reclaim()twice.��This results in a TM bad thing exception because the second reclaim occurs when not in suspend mode.The scenario in which this can happen is the following.��We attempt to deliver a signal to userspace.��To do this we need obtain the stack pointer to write the signal context.��To get this stack pointer we must
tm_reclaim()in case we need to use the checkpointed stack pointer (see get_tm_stackpointer()).��Normally we'd then return directly to userspace to deliver the signal
without going through__switch_to().Unfortunatley, if at this point we get an error (such as a bad userspace stack pointer), we need to exit the process.��The exit will result in a __switch_to().��__switch_to() will attempt to save the process state which results in another tm_reclaim().��This
tm_reclaim()now causes a TM Bad Thing exception as this state has already been saved and the processor is no longer in TM suspend mode. Whee!This patch checks the state of the MSR to ensure we are TM suspended before we attempt the tm_reclaim().��If we've already saved the state away, we should no longer be in TM suspend mode.��This has the additional advantage of checking for a potential TM Bad Thing exception.
Found using syscall fuzzer.
Fixes fb09692e71f1 ("powerpc: Add reclaim and recheckpoint functionsfor context switching transactional memory processes")
Signed-off-by Michael Neuling <[email protected]>Signed-off-by Michael Ellerman <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>---
�arch/powerpc/kernel/process.c |���18 ++++++++++++++++++ �1 file changed, 18 insertions(+)arch/powerpc/kernel/process.c +0
-0@@ -569,6 +569,24 @@ static void tm_reclaim_thread(struct thr � if (!MSR_TM_SUSPENDED(mfmsr())) � return;�
arch/powerpc/kernel/process.c +12
-0+/* +�* Use the current MSR TM suspended bit to track if we have +�* checkpointed state outstanding. +�* On signal delivery, we'd normally reclaim the checkpointed +�* state to obtain stack pointer (see:get_tm_stackpointer()). +�* This will then directly return to userspace without going +�* through __switch_to(). However, if the stack frame is bad, +�* we need to exit this thread which calls __switch_to() which +�* will again attempt to reclaim the already saved tm state. +�* Hence we need to check that we've not already reclaimed +�* this state. +�* We do this using the current MSR, rather tracking it in Quoted 8 lines
arch/powerpc/kernel/process.c
Quoted 5 lines
arch/powerpc/kernel/process.c +5
-0+�* some specific thread_struct bit, as it has the additional +�* benifit of checking for a potential TM bad thing exception. +�*/ +if (!MSR_TM_SUSPENDED (mfmsr ())) +return ;�
This one should have not been applied to 4.4. The patch is in mainline since 4.4-rc6. Hence the check is duplicated as can be seen above.
Quoted 1 line
Greg, surely your scripts could check for that?
My "scripts" are usually me looking at them manually, I messed up here, sorry. I'll revert it in the next round of stable kernel releases after this one.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 61/67 powerpc: Make value-returning atomics fully ordered
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boqun Feng <[email protected]>
commit 49e9cf3f0c04bf76ffa59242254110309554861d upstream.
According to memory-barriers.txt:
Quoted 4 lines
Any atomic operation that modifies some state in memory and returns information about the state (old or new) implies an SMP-conditional general memory barrier (
smp_mb()) on each side of the actual operation ...
Which mean these operations should be fully ordered. However on PPC, PPC_ATOMIC_ENTRY_BARRIER is the barrier before the actual operation, which is currently "lwsync" if SMP=y. The leading "lwsync" can not guarantee fully ordered atomics, according to Paul Mckenney:
https://lkml.org/lkml/2015/10/14/970
To fix this, we define PPC_ATOMIC_ENTRY_BARRIER as "sync" to guarantee the fully-ordered semantics.
This also makes futex atomics fully ordered, which can avoid possible memory ordering problems if userspace code relies on futex system call for fully ordered semantics.
--- arch/powerpc/include/asm/synch.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/include/asm/synch.h +1 -1
@@ -44,7 +44,7 @@ static inline void isync(void)MAKE_LWSYNC_SECTION_ENTRY (97 , __lwsync_fixup);#define PPC_ACQUIRE_BARRIER "\n" stringify_in_c(__PPC_ACQUIRE_BARRIER)#define PPC_RELEASE_BARRIER stringify_in_c(LWSYNC) "\n" -#define PPC_ATOMIC_ENTRY_BARRIER "\n" stringify_in_c(LWSYNC) "\n" +#define PPC_ATOMIC_ENTRY_BARRIER "\n" stringify_in_c(sync) "\n"#define PPC_ATOMIC_EXIT_BARRIER "\n" stringify_in_c(sync) "\n"#else #define PPC_ACQUIRE_BARRIER
Greg Kroah-Hartman
maintainerPATCH 62/67 powerpc: Make {cmp}xchg* and their atomic_ versions fully ordered
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boqun Feng <[email protected]>
commit 81d7a3294de7e9828310bbf986a67246b13fa01e upstream.
According to memory-barriers.txt, xchg*, cmpxchg* and their atomic_ versions all need to be fully ordered, however they are now just RELEASE+ACQUIRE, which are not fully ordered.
So also replace PPC_RELEASE_BARRIER and PPC_ACQUIRE_BARRIER with PPC_ATOMIC_ENTRY_BARRIER and PPC_ATOMIC_EXIT_BARRIER in __{cmp,}xchg_{u32,u64} respectively to guarantee fully ordered semantics of atomic{,64}_{cmp,}xchg() and {cmp,}xchg(), as a complement of commit b97021f85517 ("powerpc: Fix atomic_xxx_return barrier semantics")
This patch depends on patch "powerpc: Make value-returning atomics fully ordered" for PPC_ATOMIC_ENTRY_BARRIER definition.
--- arch/powerpc/include/asm/cmpxchg.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
arch/powerpc/include/asm/cmpxchg.h +8 -8
@@ -18,12 +18,12 @@ __xchg_u32(volatile void *p, unsigned lounsigned long prev; __asm__ __volatile__( -PPC_RELEASE_BARRIER +PPC_ATOMIC_ENTRY_BARRIER "1: lwarx %0,0,%2 \n" PPC405_ERR77(0,%2)" stwcx. %3,0,%2 \n\ bne- 1b" -PPC_ACQUIRE_BARRIER +PPC_ATOMIC_EXIT_BARRIER : "=&r" (prev), "+m" (*(volatile unsigned int *)p) : "r" (p), "r" (val) : "cc", "memory");
@@ -61,12 +61,12 @@ __xchg_u64(volatile void *p, unsigned lounsigned long prev; __asm__ __volatile__( -PPC_RELEASE_BARRIER +PPC_ATOMIC_ENTRY_BARRIER "1: ldarx %0,0,%2 \n" PPC405_ERR77(0,%2)" stdcx. %3,0,%2 \n\ bne- 1b" -PPC_ACQUIRE_BARRIER +PPC_ATOMIC_EXIT_BARRIER : "=&r" (prev), "+m" (*(volatile unsigned long *)p) : "r" (p), "r" (val) : "cc", "memory");
@@ -151,14 +151,14 @@ __cmpxchg_u32(volatile unsigned int *p,unsigned int prev; __asm__ __volatile__ ( -PPC_RELEASE_BARRIER +PPC_ATOMIC_ENTRY_BARRIER "1: lwarx %0,0,%2 # __cmpxchg_u32\n\ cmpw 0,%0,%3\n\ bne- 2f\n" PPC405_ERR77(0,%2)" stwcx. %4,0,%2\n\ bne- 1b" -PPC_ACQUIRE_BARRIER +PPC_ATOMIC_EXIT_BARRIER "\n\ 2:" : "=&r" (prev), "+m" (*p)
@@ -197,13 +197,13 @@ __cmpxchg_u64(volatile unsigned long *p,unsigned long prev; __asm__ __volatile__ ( -PPC_RELEASE_BARRIER +PPC_ATOMIC_ENTRY_BARRIER "1: ldarx %0,0,%2 # __cmpxchg_u64\n\ cmpd 0,%0,%3\n\ bne- 2f\n\ stdcx. %4,0,%2\n\ bne- 1b" -PPC_ACQUIRE_BARRIER +PPC_ATOMIC_EXIT_BARRIER "\n\ 2:" : "=&r" (prev), "+m" (*p)
Greg Kroah-Hartman
maintainerPATCH 63/67 scripts/recordmcount.pl: support data in text section on powerpc
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ulrich Weigand <[email protected]>
commit 2e50c4bef77511b42cc226865d6bc568fa7f8769 upstream.
If a text section starts out with a data blob before the first function start label, disassembly parsing doing in recordmcount.pl gets confused on powerpc, leading to creation of corrupted module objects.
This was not a problem so far since the compiler would never create such text sections. However, this has changed with a recent change in GCC 6 to support distances of > 2GB between a function and its assoicated TOC in the ELFv2 ABI, exposing this problem.
There is already code in recordmcount.pl to handle such data blobs on the sparc64 platform. This patch uses the same method to handle those on powerpc as well.
--- scripts/recordmcount.pl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
scripts/recordmcount.pl +2 -1
@@ -263,7 +263,8 @@ if ($arch eq "x86_64") { } elsif ($arch eq "powerpc") { $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)"; - $function_regex = "^([0-9a-fA-F]+)\\s+<(\\.?.*?)>:"; + # See comment in the sparc64 section for why we use '\w'. + $function_regex = "^([0-9a-fA-F]+)\\s+<(\\.?\\w*?)>:"; $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s\\.?_mcount\$"; if ($bits == 64) {
Greg Kroah-Hartman
maintainerPATCH 64/67 powerpc/module: Handle R_PPC64_ENTRY relocations
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ulrich Weigand <[email protected]>
commit a61674bdfc7c2bf909c4010699607b62b69b7bec upstream.
GCC 6 will include changes to generated code with -mcmodel=large, which is used to build kernel modules on powerpc64le. This was necessary because the large model is supposed to allow arbitrary sizes and locations of the code and data sections, but the ELFv2 global entry point prolog still made the unconditional assumption that the TOC associated with any particular function can be found within 2 GB of the function entry point:
func:
addis r2,r12,(.TOC.-func)@ha addi r2,r2,(.TOC.-func)@l .localentry func, .-func
To remove this assumption, GCC will now generate instead this global entry point prolog sequence when using -mcmodel=large:
.quad .TOC.-func
func:
.reloc ., R_PPC64_ENTRY ld r2, -8(r12) add r2, r2, r12 .localentry func, .-func
The new .reloc triggers an optimization in the linker that will replace this new prolog with the original code (see above) if the linker determines that the distance between .TOC. and func is in range after all.
Since this new relocation is now present in module object files, the kernel module loader is required to handle them too. This patch adds support for the new relocation and implements the same optimization done by the GNU linker.
--- arch/powerpc/include/uapi/asm/elf.h | 2 ++ arch/powerpc/kernel/module_64.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+)
arch/powerpc/include/uapi/asm/elf.h +2 -0
@@ -295,6 +295,8 @@ do { \#define R_PPC64_TLSLD 108#define R_PPC64_TOCSAVE 109 +#define R_PPC64_ENTRY 118 +#define R_PPC64_REL16 249#define R_PPC64_REL16_LO 250#define R_PPC64_REL16_HI 251
arch/powerpc/kernel/module_64.c +27 -0
@@ -635,6 +635,33 @@ int apply_relocate_add(Elf64_Shdr *sechd*/ break ; +case R_PPC64_ENTRY : +/* +* Optimize ELFv2 large code model entry point if +* the TOC is within 2GB range of current location. +*/ + value =my_r2 (sechdrs, me) - (unsigned long )location; +if (value +0x80008000 >0xffffffff ) +break ; +/* +* Check for the large code model prolog sequence: +* ld r2, ...(r12) +* add r2, r2, r12 +*/ +if ((((uint32_t *)location)[0 ] & ~0xfffc ) + !=0xe84c0000 ) +break ; +if (((uint32_t *)location)[1 ] !=0x7c426214 ) +break ; +/* +* If found, replace it with: +* addis r2, r12, (.TOC.-func)@ha +* addi r2, r12, (.TOC.-func)@l +*/ + ((uint32_t *)location)[0 ] =0x3c4c0000 +PPC_HA (value); + ((uint32_t *)location)[1 ] =0x38420000 +PPC_LO (value); +break ; +case R_PPC64_REL16_HA :/* Subtract location pointer */ value -= (unsigned long )location;
Greg Kroah-Hartman
maintainerPATCH 65/67 arm64: Clear out any singlestep state on a ptrace detach operation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Blackwood <[email protected]>
commit 5db4fd8c52810bd9740c1240ebf89223b171aa70 upstream.
Make sure to clear out any ptrace singlestep state when a ptrace(2) PTRACE_DETACH call is made on arm64 systems.
Otherwise, the previously ptraced task will die off with a SIGTRAP signal if the debugger just previously singlestepped the ptraced task.
--- arch/arm64/kernel/ptrace.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm64/kernel/ptrace.c +6 -0
@@ -58,6 +58,12 @@*/ void ptrace_disable (struct task_struct *child) { +/* +* This would be better off in core code, but PTRACE_DETACH has +* grown its fair share of arch-specific worts and changing it +* is likely to cause regressions on obscure architectures. +*/ +user_disable_single_step (child); }#ifdef CONFIG_HAVE_HW_BREAKPOINT
Greg Kroah-Hartman
maintainerPATCH 66/67 arm64: mm: ensure that the zero page is visible to the page table walker
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
commit 32d6397805d00573ce1fa55f408ce2bca15b0ad3 upstream.
In paging_init, we allocate the zero page, memset it to zero and then point TTBR0 to it in order to avoid speculative fetches through the identity mapping.
In order to guarantee that the freshly zeroed page is indeed visible to the page table walker, we need to execute a dsb instruction prior to writing the TTBR.
--- arch/arm64/mm/mmu.c | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/mm/mmu.c +3 -0
@@ -456,6 +456,9 @@ void __init paging_init(void) empty_zero_page =virt_to_page (zero_page); +/* Ensure the zero page is visible to the page table walker */ +dsb (ishst); +/* * TTBR0 is only used for the identity mapping at this stage. Make it * point to zero page to avoid speculatively fetching new entries.
Greg Kroah-Hartman
maintainerPATCH 67/67 arm64: kernel: enforce pmuserenr_el0 initialization and restore
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Pieralisi <[email protected]>
commit 60792ad349f3c6dc5735aafefe5dc9121c79e320 upstream.
The pmuserenr_el0 register value is architecturally UNKNOWN on reset. Current kernel code resets that register value iff the core pmu device is correctly probed in the kernel. On platforms with missing DT pmu nodes (or disabled perf events in the kernel), the pmu is not probed, therefore the pmuserenr_el0 register is not reset in the kernel, which means that its value retains the reset value that is architecturally UNKNOWN (system may run with eg pmuserenr_el0 == 0x1, which means that PMU counters access is available at EL0, which must be disallowed).
This patch adds code that resets pmuserenr_el0 on cold boot and restores it on core resume from shutdown, so that the pmuserenr_el0 setup is always enforced in the kernel.
--- arch/arm64/kernel/perf_event.c | 3 --- arch/arm64/mm/proc.S | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-)
arch/arm64/kernel/perf_event.c +0 -3
@@ -574,9 +574,6 @@ static void armv8pmu_reset(void *info)/* Initialize & Reset PMNC: C and P bits. */ armv8pmu_pmcr_write (ARMV8_PMCR_P |ARMV8_PMCR_C ); - -/* Disable access from userspace. */ - asmvolatile ("msr pmuserenr_el0, %0" ::"r" (0 )); }static int armv8_pmuv3_map_event (struct perf_event *event)
arch/arm64/mm/proc.S +2 -0
@@ -117,6 +117,7 @@ ENTRY(cpu_do_resume) */ ubfx x11, x11, #1, #1 msr oslar_el1, x11 + msr pmuserenr_el0, xzr // Disable PMU access from EL0 mov x0, x12 dsb nsh // Make sure local tlb invalidation completed isb
@@ -155,6 +156,7 @@ ENTRY(__cpu_setup) msr cpacr_el1, x0 // Enable FP/ASIMD mov x0, #1 << 12 // Reset mdscr_el1 and disable msr mdscr_el1, x0 // access to the DCC from EL0 + msr pmuserenr_el0, xzr // Disable PMU access from EL0 /* * Memory region attributes for LPAE: *
Quoted 18 lines · Greg Kroah-Hartman
-------------------------
NOTE:
There are still a lot of pending stable patches in the queue, well over 400 of them to be specific, so some of your favorite/pet patches might not be included in these releases. Please be patient as I dig out from this backlog over the next few weeks. If there are specific patches that you just _must_ have included in a stable release soon, please let me know.
-------------------------This is the start of the stable review cycle for the 4.4.1 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 Fri Jan 29 18:08:16 UTC 2016. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.1-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions,
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America (Silicon Valley) [email protected] | (970) 217-8978
Quoted 10 lines · Greg Kroah-Hartman
-------------------------
NOTE:
There are still a lot of pending stable patches in the queue, well over 400 of them to be specific, so some of your favorite/pet patches might not be included in these releases. Please be patient as I dig out from this backlog over the next few weeks. If there are specific patches that you just _must_ have included in a stable release soon, please let me know.
-------------------------
Quoted 8 lines
This is the start of the stable review cycle for the 4.4.1 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 Fri Jan 29 18:08:16 UTC 2016. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0
Qemu test results:
total: 96 pass: 94 fail: 2
Failed tests:
arm64:smp:defconfig
arm64:nosmp:defconfig
arm64 qemu test failures are the same as in v4.1.y, v4.3.y, and mainline.
Details are available at http://kerneltests.org/builders.
Guenter
Quoted 22 lines · Guenter Roeck
Quoted 10 lines · Greg Kroah-Hartman
-------------------------
NOTE:
There are still a lot of pending stable patches in the queue, well over 400 of them to be specific, so some of your favorite/pet patches might not be included in these releases. Please be patient as I dig out from this backlog over the next few weeks. If there are specific patches that you just _must_ have included in a stable release soon, please let me know.
-------------------------Quoted 8 lines
This is the start of the stable review cycle for the 4.4.1 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 Fri Jan 29 18:08:16 UTC 2016. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0
Quoted 8 lines
Qemu test results:
total: 96 pass: 94 fail: 2Failed tests:
arm64:smp:defconfig
arm64:nosmp:defconfigarm64 qemu test failures are the same as in v4.1.y, v4.3.y, and mainline.
Fix is now upstream, in case you want to apply it to v4.1 / v4.3 / v4.4. Commit f436b2ac90a0 ("arm64: kernel: fix architected PMU registers unconditional access").
Guenter
Quoted 29 lines · Guenter Roeck
Quoted 28 lines · Guenter Roeck
Quoted 10 lines · Greg Kroah-Hartman
-------------------------
NOTE:
There are still a lot of pending stable patches in the queue, well over 400 of them to be specific, so some of your favorite/pet patches might not be included in these releases. Please be patient as I dig out from this backlog over the next few weeks. If there are specific patches that you just _must_ have included in a stable release soon, please let me know.
-------------------------Quoted 8 lines
This is the start of the stable review cycle for the 4.4.1 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 Fri Jan 29 18:08:16 UTC 2016. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0Qemu test results:
total: 96 pass: 94 fail: 2Failed tests:
arm64:smp:defconfig
arm64:nosmp:defconfig
Quoted 6 lines
Quoted 2 lines
arm64 qemu test failures are the same as in v4.1.y, v4.3.y, and mainline.
Fix is now upstream, in case you want to apply it to v4.1 / v4.3 / v4.4. Commit
f436b2ac90a0("arm64: kernel: fix architected PMU registers unconditional access").
I've applied it to 4.3 and 4.4, but it doesn't apply to 4.1 at all :(
thanks,
greg k-h
Quoted 30 lines · Greg Kroah-Hartman
Quoted 29 lines · Guenter Roeck
Quoted 28 lines · Guenter Roeck
Quoted 10 lines · Greg Kroah-Hartman
-------------------------
NOTE:
There are still a lot of pending stable patches in the queue, well over 400 of them to be specific, so some of your favorite/pet patches might not be included in these releases. Please be patient as I dig out from this backlog over the next few weeks. If there are specific patches that you just _must_ have included in a stable release soon, please let me know.
-------------------------Quoted 8 lines
This is the start of the stable review cycle for the 4.4.1 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 Fri Jan 29 18:08:16 UTC 2016. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0Qemu test results:
total: 96 pass: 94 fail: 2Failed tests:
arm64:smp:defconfig
arm64:nosmp:defconfig
Quoted 9 lines
Quoted 6 lines
Quoted 2 lines
arm64 qemu test failures are the same as in v4.1.y, v4.3.y, and mainline.
Fix is now upstream, in case you want to apply it to v4.1 / v4.3 / v4.4. Commit
f436b2ac90a0("arm64: kernel: fix architected PMU registers unconditional access").I've applied it to 4.3 and 4.4, but it doesn't apply to 4.1 at all :(
Turns out f436b2ac90a0 wasn't needed in 4.1 after all since you did not apply 60792ad349f3 ("arm64: kernel: enforce pmuserenr_el0 initialization and restore"). All (my) final builds and qemu tests for 4.1.17, 4.3.5, and 4.4.1 are good.
Thanks,
Guenter