Linux 4.19.209
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.19.209 kernel.
All users of the 4.19 kernel series must upgrade.
The updated 4.19.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.19.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/alpha/include/asm/io.h | 6 - arch/arm/include/asm/ftrace.h | 3 arch/arm/include/asm/insn.h | 8 - arch/arm/include/asm/module.h | 10 ++ arch/arm/kernel/ftrace.c | 50 ++++++++-- arch/arm/kernel/insn.c | 19 ++- arch/arm/kernel/module-plts.c | 49 +++++++--- arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 11 +- arch/arm64/kernel/process.c | 2 arch/m68k/include/asm/raw_io.h | 20 ++-- arch/parisc/include/asm/page.h | 2 arch/sparc/kernel/mdesc.c | 3 arch/x86/include/asm/kvmclock.h | 14 ++ arch/x86/kernel/kvmclock.c | 13 -- arch/x86/xen/enlighten_pv.c | 15 +-- block/bfq-iosched.c | 16 --- drivers/cpufreq/cpufreq_governor_attr_set.c | 2 drivers/crypto/ccp/ccp-ops.c | 14 +- drivers/edac/synopsys_edac.c | 2 drivers/fpga/machxo2-spi.c | 6 + drivers/gpio/gpio-uniphier.c | 4 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 drivers/hid/hid-betopff.c | 13 ++ drivers/hid/usbhid/hid-core.c | 13 ++ drivers/hwmon/mlxreg-fan.c | 12 +- drivers/hwmon/tmp421.c | 35 ++----- drivers/ipack/devices/ipoctal.c | 63 +++++++++---- drivers/irqchip/Kconfig | 1 drivers/irqchip/irq-gic-v3-its.c | 2 drivers/mcb/mcb-core.c | 12 +- drivers/md/md.c | 5 - drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 - drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 2 drivers/net/ethernet/cadence/macb_pci.c | 2 drivers/net/ethernet/i825xx/82596.c | 2 drivers/net/ethernet/intel/e100.c | 22 +++- drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 3 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 drivers/net/hamradio/6pack.c | 4 drivers/net/usb/hso.c | 45 +++++---- drivers/nvme/host/multipath.c | 7 + drivers/pci/controller/pci-aardvark.c | 62 +++++++++++- drivers/scsi/csiostor/csio_init.c | 1 drivers/scsi/scsi_transport_iscsi.c | 8 - drivers/spi/spi-tegra20-slink.c | 4 drivers/staging/erofs/include/trace/events/erofs.h | 6 - drivers/staging/greybus/uart.c | 62 ++++++------ drivers/thermal/thermal_core.c | 7 - drivers/tty/serial/mvebu-uart.c | 2 drivers/tty/synclink_gt.c | 101 ++++----------------- drivers/tty/vt/vt.c | 21 +++- drivers/usb/class/cdc-acm.c | 7 + drivers/usb/class/cdc-acm.h | 2 drivers/usb/dwc2/gadget.c | 4 drivers/usb/gadget/udc/r8a66597-udc.c | 2 drivers/usb/musb/tusb6010.c | 1 drivers/usb/serial/cp210x.c | 1 drivers/usb/serial/mos7840.c | 2 drivers/usb/serial/option.c | 11 ++ drivers/usb/storage/unusual_devs.h | 9 + drivers/usb/storage/unusual_uas.h | 2 drivers/xen/balloon.c | 62 +++++++++--- fs/binfmt_elf.c | 2 fs/cifs/connect.c | 5 - fs/ext4/dir.c | 6 - fs/ocfs2/dlmglue.c | 3 fs/qnx4/dir.c | 69 ++++++++++---- include/linux/compiler.h | 2 include/linux/cred.h | 14 +- include/net/sock.h | 2 kernel/sched/cpufreq_schedutil.c | 16 ++- kernel/trace/blktrace.c | 8 + net/core/sock.c | 32 +++++- net/ipv4/tcp_input.c | 16 ++- net/ipv4/tcp_output.c | 9 - net/ipv4/tcp_timer.c | 63 ++++++------- net/ipv4/udp.c | 10 +- net/ipv6/udp.c | 2 net/mac80211/tx.c | 12 ++ net/mac80211/wpa.c | 6 + net/netfilter/ipset/ip_set_hash_gen.h | 4 net/netfilter/ipvs/ip_vs_conn.c | 4 net/sctp/input.c | 2 net/smc/smc_clc.c | 3 net/unix/af_unix.c | 34 +++++-- 87 files changed, 782 insertions(+), 449 deletions(-)
Alex Sverdlin (4):
ARM: 9077/1: PLT: Move struct plt_entries definition to header
ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link()
ARM: 9079/1: ftrace: Add MODULE_PLTS support
ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE
Andrea Claudi (1):
ipvs: check that ip_vs_conn_tab_bits is between 8 and 20
Anirudh Rayabharam (1):
HID: usbhid: free raw_report buffers in usbhid_stop
Anton Eidelman (1):
nvme-multipath: fix ANA state updates when a namespace is not present
Aya Levin (1):
net/mlx4_en: Don't allow aRFS for encapsulated packets
Baokun Li (1):
scsi: iscsi: Adjust iface sysfs attr detection
Carlo Lobrano (1):
USB: serial: option: add Telit LN920 compositions
Charlene Liu (1):
drm/amd/display: Pass PCI deviceid into DC
Chen Jingwen (1):
elf: don't use MAP_FIXED_NOREPLACE for elf interpreter mappings
Chih-Kang Chang (1):
mac80211: Fix ieee80211_amsdu_aggregate frag_tail bug
Christoph Hellwig (1):
md: fix a lock order reversal in md_alloc
Dan Carpenter (5):
usb: gadget: r8a66597: fix a loop in set_feature()
usb: musb: tusb6010: uninitialized data in tusb_fifo_write_unaligned()
mcb: fix error handling in mcb_alloc_bus()
thermal/core: Potential buffer overflow in thermal_build_list_of_policies()
crypto: ccp - fix resource leaks in ccp_run_aes_gcm_cmd()
Dan Li (1):
arm64: Mark __stack_chk_guard as __ro_after_init
Dongliang Mu (2):
usb: hso: fix error handling code of hso_create_net_device
usb: hso: remove the bailout parameter
Eric Dumazet (4):
tcp: address problems caused by EDT misshaps
tcp: adjust rto_base in retransmits_timed_out()
af_unix: fix races in sk_peer_pid and sk_peer_cred accesses
net: udp: annotate data race around udp_sk(sk)->corkflag
Evan Wang (1):
PCI: aardvark: Fix checking for PIO status
F.A.Sulaiman (1):
HID: betop: fix slab-out-of-bounds Write in betop_probe
Gao Xiang (1):
erofs: fix up erofs_lookup tracepoint
Greg Kroah-Hartman (1):
Linux 4.19.209
Guenter Roeck (6):
m68k: Double cast io functions to unsigned long
compiler.h: Introduce absolute_pointer macro
net: i825xx: Use absolute_pointer for memcpy from fixed memory location
alpha: Declare virt_to_phys and virt_to_bus parameter as pointer to volatile
net: 6pack: Fix tx timeout and slot time
hwmon: (tmp421) Replace S_<PERMS> with octal values
Helge Deller (1):
parisc: Use absolute_pointer() to define PAGE0
Igor Matheus Andrade Torrente (1):
tty: Fix out-of-bound vmalloc access in imageblit
Jacob Keller (2):
e100: fix length calculation in e100_get_regs_len
e100: fix buffer overrun in e100_get_regs
James Morse (1):
cpufreq: schedutil: Destroy mutex before kobject_put() frees the memory
Jan Beulich (1):
xen/x86: fix PV trap handling on secondary processors
Jens Axboe (1):
Revert "block, bfq: honor already-setup queue merges"
Jesper Nilsson (1):
net: stmmac: allow CSR clock of 300MHz
Jiapeng Chong (1):
fpga: machxo2-spi: Fix missing error code in machxo2_write_complete()
Jiri Slaby (1):
tty: synclink_gt, drop unneeded forward declarations
Johan Hovold (8):
USB: cdc-acm: fix minor-number release
staging: greybus: uart: fix tty use after free
net: hso: fix muxed tty registration
ipack: ipoctal: fix stack information leak
ipack: ipoctal: fix tty registration race
ipack: ipoctal: fix tty-registration error handling
ipack: ipoctal: fix missing allocation-failure check
ipack: ipoctal: fix module reference leak
Johannes Berg (1):
mac80211: fix use-after-free in CCMP/GCMP RX
Jozsef Kadlecsik (1):
netfilter: ipset: Fix oversized kvmalloc() calls
Juergen Gross (2):
xen/balloon: use a kernel thread instead a workqueue xen/balloon: fix balloon kthread freezing
Julian Sikorski (1):
Re-enable UAS for LaCie Rugged USB3-FW with fk quirk
Kaige Fu (1):
irqchip/gic-v3-its: Fix potential VPE leak on error
Karsten Graul (1):
net/smc: add missing error check in smc_clc_prfx_set()
Kevin Hao (1):
cpufreq: schedutil: Use kobject release() method to free sugov_tunables
Krzysztof Kozlowski (2):
USB: serial: mos7840: remove duplicated 0xac24 device ID
USB: serial: option: remove duplicate USB device ID
Kunihiko Hayashi (1):
gpio: uniphier: Fix void functions to remove return value
Linus Torvalds (4):
sparc: avoid stringop-overread errors
qnx4: avoid stringop-overread errors
spi: Fix tegra20 build with CONFIG_PM=n
qnx4: work around gcc false positive warning bug
Lorenzo Bianconi (1):
mac80211: limit injected vht mcs/nss in ieee80211_parse_tx_radiotap
Michael Chan (1):
bnxt_en: Fix TX timeout when TX ring size is set to the smallest
Minas Harutyunyan (1):
usb: dwc2: gadget: Fix ISOC transfer complete handling for DDMA
NeilBrown (1):
cred: allow get_cred() and put_cred() to be given NULL.
Oliver Neukum (1):
hso: fix bailout in error case of probe
Ondrej Zary (1):
usb-storage: Add quirk for ScanLogic SL11R-IDE older than 2.6c
Pali Rohár (2):
serial: mvebu-uart: fix driver's tx_empty callback
arm64: dts: marvell: armada-37xx: Extend PCIe MEM space
Paul Fertser (2):
hwmon: (tmp421) report /PVLD condition as fault
hwmon: (tmp421) fix rounding for negative values
Rahul Lakkireddy (1):
scsi: csiostor: Add module softdep on cxgb4
Randy Dunlap (2):
tty: synclink_gt: rename a conflicting function name irqchip/goldfish-pic: Select GENERIC_IRQ_CHIP to fix build
Sai Krishna Potthuri (1):
EDAC/synopsys: Fix wrong value type assignment for edac_mode
Slark Xiao (1):
USB: serial: option: add device id for Foxconn T99W265
Steve French (1):
cifs: fix incorrect check for null pointer in header_assemble
Tom Rix (1):
fpga: machxo2-spi: Return an error on failure
Tong Zhang (1):
net: macb: fix use after free on rmmod
Uwe Brandt (1):
USB: serial: cp210x: add ID for GW Instek GDM-834x Digital Multimeter
Vadim Pasternak (1):
hwmon: (mlxreg-fan) Return non-zero value when fan current state is enforced from sysfs
Wengang Wang (1):
ocfs2: drop acl cache for directories too
Xin Long (1):
sctp: break out if skb_header_pointer returns NULL in sctp_rcv_ootb
Yuchung Cheng (2):
tcp: always set retrans_stamp on recovery
tcp: create a helper to model exponential backoff
Zelin Deng (1):
x86/kvmclock: Move this_cpu_pvti into kvmclock.h
Zhihao Cheng (1):
blktrace: Fix uaf in blk_trace access after removing by sysfs
yangerkun (1):
ext4: fix potential infinite loop in ext4_dx_readdir()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 208 +SUBLEVEL = 209 EXTRAVERSION = NAME = "People's Front"
arch/alpha/include/asm/io.h +3 -3
@@ -61,7 +61,7 @@ extern inline void set_hae(unsigned long new_hae)* Change virtual addresses to physical addresses and vv. */ #ifdef USE_48_BIT_KSEG -static inline unsigned long virt_to_phys (void *address) +static inline unsigned long virt_to_phys (volatile void *address) {return (unsigned long )address -IDENT_ADDR ; }
@@ -71,7 +71,7 @@ static inline void * phys_to_virt(unsigned long address) return (void *) (address + IDENT_ADDR); }#else -static inline unsigned long virt_to_phys (void *address) +static inline unsigned long virt_to_phys (volatile void *address) {unsigned long phys = (unsigned long )address;
@@ -112,7 +112,7 @@ static inline dma_addr_t __deprecated isa_page_to_bus(struct page *page)extern unsigned long __direct_map_base;extern unsigned long __direct_map_size; -static inline unsigned long __deprecated virt_to_bus (void *address) +static inline unsigned long __deprecated virt_to_bus (volatile void *address) {unsigned long phys =virt_to_phys (address);unsigned long bus = phys + __direct_map_base;
arch/arm/include/asm/ftrace.h +3 -0
@@ -19,6 +19,9 @@ struct dyn_arch_ftrace {#ifdef CONFIG_OLD_MCOUNT bool old_mcount;#endif +#ifdef CONFIG_ARM_MODULE_PLTS +struct module *mod; +#endif };static inline unsigned long ftrace_call_adjust (unsigned long addr)
arch/arm/include/asm/insn.h +4 -4
@@ -13,18 +13,18 @@ arm_gen_nop(void) }unsigned long -__arm_gen_branch (unsigned long pc,unsigned long addr,bool link); +__arm_gen_branch (unsigned long pc,unsigned long addr,bool link,bool warn);static inline unsigned long arm_gen_branch (unsigned long pc,unsigned long addr) { -return __arm_gen_branch (pc, addr, false); +return __arm_gen_branch (pc, addr, false, true); }static inline unsigned long -arm_gen_branch_link (unsigned long pc,unsigned long addr) +arm_gen_branch_link (unsigned long pc,unsigned long addr,bool warn) { -return __arm_gen_branch (pc, addr, true); +return __arm_gen_branch (pc, addr, true, warn); }#endif
arch/arm/include/asm/module.h +10 -0
@@ -19,8 +19,18 @@ enum { };#endif +#define PLT_ENT_STRIDE L1_CACHE_BYTES +#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32)) +#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT) + +struct plt_entries { +u32 ldr[PLT_ENT_COUNT ]; +u32 lit[PLT_ENT_COUNT ]; +}; +struct mod_plt_sec {struct elf32_shdr *plt; +struct plt_entries *plt_ent;int plt_count; };
arch/arm/kernel/ftrace.c +40 -10
108 lines not on this page · raw message
arch/arm/kernel/insn.c +10 -9
@@ -3,8 +3,9 @@#include <linux/kernel.h> #include <asm/opcodes.h> -static unsigned long -__arm_gen_branch_thumb2 (unsigned long pc,unsigned long addr,bool link) +static unsigned long __arm_gen_branch_thumb2 (unsigned long pc, +unsigned long addr,bool link, +bool warn) {unsigned long s, j1, j2, i1, i2, imm10, imm11;unsigned long first, second;
@@ -12,7 +13,7 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link) offset = (long )addr - (long )(pc +4 );if (offset <-16777216 || offset >16777214 ) { -WARN_ON_ONCE (1 ); +WARN_ON_ONCE (warn);return 0 ; }
@@ -33,8 +34,8 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)return __opcode_thumb32_compose (first, second); } -static unsigned long -__arm_gen_branch_arm (unsigned long pc,unsigned long addr,bool link) +static unsigned long __arm_gen_branch_arm (unsigned long pc,unsigned long addr, +bool link,bool warn) {unsigned long opcode =0xea000000 ;long offset;
@@ -44,7 +45,7 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link) offset = (long )addr - (long )(pc +8 );if (unlikely (offset <-33554432 || offset >33554428 )) { -WARN_ON_ONCE (1 ); +WARN_ON_ONCE (warn);return 0 ; }
@@ -54,10 +55,10 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link) }unsigned long -__arm_gen_branch (unsigned long pc,unsigned long addr,bool link) +__arm_gen_branch (unsigned long pc,unsigned long addr,bool link,bool warn) {if (IS_ENABLED (CONFIG_THUMB2_KERNEL )) -return __arm_gen_branch_thumb2 (pc, addr, link); +return __arm_gen_branch_thumb2 (pc, addr, link, warn);else -return __arm_gen_branch_arm (pc, addr, link); +return __arm_gen_branch_arm (pc, addr, link, warn); }
arch/arm/kernel/module-plts.c +38 -11
97 lines not on this page · raw message
arch/arm64/boot/dts/marvell/armada-37xx.dtsi +9 -2
@@ -376,8 +376,15 @@ #interrupt-cells = <1>; msi-parent = <&pcie0>; msi-controller; - ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x1000000 /* Port 0 MEM */ - 0x81000000 0 0xe9000000 0 0xe9000000 0 0x10000>; /* Port 0 IO*/ + /* + * The 128 MiB address range [0xe8000000-0xf0000000] is + * dedicated for PCIe and can be assigned to 8 windows + * with size a power of two. Use one 64 KiB window for + * IO at the end and the remaining seven windows + * (totaling 127 MiB) for MEM. + */ + ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x07f00000 /* Port 0 MEM */ + 0x81000000 0 0xefff0000 0 0xefff0000 0 0x00010000>; /* Port 0 IO */ interrupt-map-mask = <0 0 0 7>; interrupt-map = <0 0 0 1 &pcie_intc 0>, <0 0 0 2 &pcie_intc 1>,
arch/arm64/kernel/process.c +1 -1
@@ -61,7 +61,7 @@#ifdef CONFIG_STACKPROTECTOR #include <linux/stackprotector.h> -unsigned long __stack_chk_guard__read_mostly ; +unsigned long __stack_chk_guard__ro_after_init ;EXPORT_SYMBOL (__stack_chk_guard);#endif
arch/m68k/include/asm/raw_io.h +10 -10
@@ -17,21 +17,21 @@* two accesses to memory, which may be undesirable for some devices. */ #define in_8 (addr) \ - ({ u8 __v = (*(__force volatile u8 *) (addr)); __v; }) + ({ u8 __v = (*(__force volatile u8 *) (unsigned long)(addr)); __v; })#define in_be16 (addr) \ - ({ u16 __v = (*(__force volatile u16 *) (addr)); __v; }) + ({ u16 __v = (*(__force volatile u16 *) (unsigned long)(addr)); __v; })#define in_be32 (addr) \ - ({ u32 __v = (*(__force volatile u32 *) (addr)); __v; }) + ({ u32 __v = (*(__force volatile u32 *) (unsigned long)(addr)); __v; })#define in_le16 (addr) \ - ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (addr)); __v; }) + ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (unsigned long)(addr)); __v; })#define in_le32 (addr) \ - ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (addr)); __v; }) + ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (unsigned long)(addr)); __v; }) -#define out_8 (addr,b) (void)((*(__force volatile u8 *) (addr)) = (b)) -#define out_be16 (addr,w) (void)((*(__force volatile u16 *) (addr)) = (w)) -#define out_be32 (addr,l) (void)((*(__force volatile u32 *) (addr)) = (l)) -#define out_le16 (addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w)) -#define out_le32 (addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l)) +#define out_8 (addr,b) (void)((*(__force volatile u8 *) (unsigned long)(addr)) = (b)) +#define out_be16 (addr,w) (void)((*(__force volatile u16 *) (unsigned long)(addr)) = (w)) +#define out_be32 (addr,l) (void)((*(__force volatile u32 *) (unsigned long)(addr)) = (l)) +#define out_le16 (addr,w) (void)((*(__force volatile __le16 *) (unsigned long)(addr)) = cpu_to_le16(w)) +#define out_le32 (addr,l) (void)((*(__force volatile __le32 *) (unsigned long)(addr)) = cpu_to_le32(l))#define raw_inb in_8#define raw_inw in_be16
arch/parisc/include/asm/page.h +1 -1
@@ -179,7 +179,7 @@ extern int npmem_ranges;#include <asm-generic/getorder.h> #include <asm/pdc.h> -#define PAGE0 ((struct zeropage *)__PAGE_OFFSET) +#define PAGE0 ((struct zeropage *)absolute_pointer(__PAGE_OFFSET))/* DEFINITION OF THE ZERO-PAGE (PAG0) */ /* based on work by Jason Eckhardt ([email protected]) */
arch/sparc/kernel/mdesc.c +2 -1
@@ -40,6 +40,7 @@ struct mdesc_hdr {u32 node_sz;/* node block size */ u32 name_sz;/* name block size */ u32 data_sz;/* data block size */ +char data[]; } __attribute__((aligned(16)));struct mdesc_elem {
@@ -613,7 +614,7 @@ EXPORT_SYMBOL(mdesc_get_node_info);static struct mdesc_elem *node_block (struct mdesc_hdr *mdesc) { -return (struct mdesc_elem *) (mdesc +1 ); +return (struct mdesc_elem *) mdesc->data; }static void *name_block (struct mdesc_hdr *mdesc)
arch/x86/include/asm/kvmclock.h +14 -0
@@ -2,6 +2,20 @@#ifndef _ASM_X86_KVM_CLOCK_H#define _ASM_X86_KVM_CLOCK_H +#include <linux/percpu.h> +extern struct clocksource kvm_clock; +DECLARE_PER_CPU(struct pvclock_vsyscall_time_info *, hv_clock_per_cpu); + +static inline struct pvclock_vcpu_time_info *this_cpu_pvti (void ) +{ +return &this_cpu_read (hv_clock_per_cpu)->pvti; +} + +static inline struct pvclock_vsyscall_time_info *this_cpu_hvclock (void ) +{ +return this_cpu_read (hv_clock_per_cpu); +} +#endif /* _ASM_X86_KVM_CLOCK_H */
arch/x86/kernel/kvmclock.c +2 -11
@@ -64,18 +64,9 @@ early_param("no-kvmclock-vsyscall", parse_no_kvmclock_vsyscall);static struct pvclock_vsyscall_time_info hv_clock_boot[HVC_BOOT_ARRAY_SIZE] __bss_decrypted __aligned(PAGE_SIZE); static struct pvclock_wall_clock wall_clock __bss_decrypted; -static DEFINE_PER_CPU(struct pvclock_vsyscall_time_info *, hv_clock_per_cpu);static struct pvclock_vsyscall_time_info *hvclock_mem; - -static inline struct pvclock_vcpu_time_info *this_cpu_pvti (void ) -{ -return &this_cpu_read (hv_clock_per_cpu)->pvti; -} - -static inline struct pvclock_vsyscall_time_info *this_cpu_hvclock (void ) -{ -return this_cpu_read (hv_clock_per_cpu); -} +DEFINE_PER_CPU(struct pvclock_vsyscall_time_info *, hv_clock_per_cpu); +EXPORT_PER_CPU_SYMBOL_GPL (hv_clock_per_cpu);/* * The wallclock is the time of day when we booted. Since then, some time may
arch/x86/xen/enlighten_pv.c +9 -6
@@ -720,8 +720,8 @@ static void xen_write_idt_entry(gate_desc *dt, int entrynum, const gate_desc *g)preempt_enable (); } -static void xen_convert_trap_info (const struct desc_ptr *desc, -struct trap_info *traps) +static unsigned xen_convert_trap_info (const struct desc_ptr *desc, +struct trap_info *traps,bool full) {unsigned in, out, count;
@@ -731,17 +731,18 @@ static void xen_convert_trap_info(const struct desc_ptr *desc,for (in = out =0 ; in < count; in++) {gate_desc *entry = (gate_desc *)(desc->address) + in; -if (cvt_gate_to_trap (in, entry, &traps[out])) +if (cvt_gate_to_trap (in, entry, &traps[out]) || full) out++; } - traps[out].address =0 ; + +return out; }void xen_copy_trap_info (struct trap_info *traps) {const struct desc_ptr *desc =this_cpu_ptr (&idt_desc); -xen_convert_trap_info (desc, traps); +xen_convert_trap_info (desc, traps, true); }/* Load a new IDT into Xen. In principle this can be per-CPU, so we
@@ -751,6 +752,7 @@ static void xen_load_idt(const struct desc_ptr *desc) {static DEFINE_SPINLOCK (lock);static struct trap_info traps[257 ]; +unsigned out;trace_xen_cpu_load_idt (desc);
@@ -758,7 +760,8 @@ static void xen_load_idt(const struct desc_ptr *desc)memcpy (this_cpu_ptr (&idt_desc), desc,sizeof (idt_desc)); -xen_convert_trap_info (desc, traps); + out =xen_convert_trap_info (desc, traps, false); +memset (&traps[out],0 ,sizeof (traps[0 ]));xen_mc_flush ();if (HYPERVISOR_set_trap_table (traps))
block/bfq-iosched.c +3 -13
@@ -2137,15 +2137,6 @@ bfq_setup_merge(struct bfq_queue *bfqq, struct bfq_queue *new_bfqq)* are likely to increase the throughput. */ bfqq->new_bfqq = new_bfqq; -/* -* The above assignment schedules the following redirections: -* each time some I/O for bfqq arrives, the process that -* generated that I/O is disassociated from bfqq and -* associated with new_bfqq. Here we increases new_bfqq->ref -* in advance, adding the number of processes that are -* expected to be associated with new_bfqq as they happen to -* issue I/O. -*/ new_bfqq->ref += process_refs;return new_bfqq; }
@@ -2205,10 +2196,6 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq, {struct bfq_queue *in_service_bfqq, *new_bfqq; -/* if a merge has already been setup, then proceed with that first */ -if (bfqq->new_bfqq) -return bfqq->new_bfqq; -/* * Prevent bfqq from being merged if it has been created too * long ago. The idea is that true cooperating processes, and
@@ -2223,6 +2210,9 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,if (bfq_too_late_for_merging (bfqq))return NULL ; +if (bfqq->new_bfqq) +return bfqq->new_bfqq; +if (!io_struct ||unlikely (bfqq == &bfqd->oom_bfqq))return NULL ;
drivers/cpufreq/cpufreq_governor_attr_set.c +1 -1
@@ -77,8 +77,8 @@ unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *lif (count)return count; -kobject_put (&attr_set->kobj);mutex_destroy (&attr_set->update_lock); +kobject_put (&attr_set->kobj);return 0 ; }EXPORT_SYMBOL_GPL (gov_attr_set_put);
drivers/crypto/ccp/ccp-ops.c +8 -6
@@ -783,7 +783,7 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) in_place ?DMA_BIDIRECTIONAL : DMA_TO_DEVICE);if (ret) - goto e_ctx; + goto e_aad;if (in_place) { dst = src;
@@ -868,7 +868,7 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) op.u.aes.size =0 ; ret = cmd_q->ccp->vdata->perform->aes (&op);if (ret) - goto e_dst; + goto e_final_wa;if (aes->action ==CCP_AES_ACTION_ENCRYPT ) {/* Put the ciphered tag after the ciphertext. */
@@ -878,17 +878,19 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) ret =ccp_init_dm_workarea (&tag, cmd_q, authsize,DMA_BIDIRECTIONAL );if (ret) - goto e_tag; + goto e_final_wa; ret =ccp_set_dm_area (&tag,0 , p_tag,0 , authsize); -if (ret) - goto e_tag; +if (ret) { +ccp_dm_free (&tag); + goto e_final_wa; + } ret =crypto_memneq (tag.address, final_wa.address, authsize) ? -EBADMSG :0 ;ccp_dm_free (&tag); } -e_tag: +e_final_wa:ccp_dm_free (&final_wa); e_dst:
drivers/edac/synopsys_edac.c +1 -1
@@ -371,7 +371,7 @@ static int synps_edac_init_csrows(struct mem_ctl_info *mci)for (j =0 ; j < csi->nr_channels; j++) { dimm = csi->channels[j]->dimm; - dimm->edac_mode =EDAC_FLAG_SECDED ; + dimm->edac_mode =EDAC_SECDED ; dimm->mtype =synps_edac_get_mtype (priv->baseaddr); dimm->nr_pages = (size >>PAGE_SHIFT ) / csi->nr_channels; dimm->grain =SYNPS_EDAC_ERR_GRAIN ;
drivers/fpga/machxo2-spi.c +5 -1
@@ -223,8 +223,10 @@ static int machxo2_write_init(struct fpga_manager *mgr, goto fail;get_status (spi, &status); -if (test_bit (FAIL , &status)) +if (test_bit (FAIL , &status)) { + ret = -EINVAL ; goto fail; + }dump_status_reg (&status);spi_message_init (&msg);
@@ -310,6 +312,7 @@ static int machxo2_write_complete(struct fpga_manager *mgr,dump_status_reg (&status);if (!test_bit (DONE , &status)) {machxo2_cleanup (mgr); + ret = -EINVAL ; goto fail; }
@@ -331,6 +334,7 @@ static int machxo2_write_complete(struct fpga_manager *mgr,break ;if (++refreshloop ==MACHXO2_MAX_REFRESH_LOOP ) {machxo2_cleanup (mgr); + ret = -EINVAL ; goto fail; } }while (1 );
drivers/gpio/gpio-uniphier.c +2 -2
@@ -197,7 +197,7 @@ static void uniphier_gpio_irq_mask(struct irq_data *data)uniphier_gpio_reg_update (priv,UNIPHIER_GPIO_IRQ_EN , mask,0 ); -return irq_chip_mask_parent (data); +irq_chip_mask_parent (data); }static void uniphier_gpio_irq_unmask (struct irq_data *data)
@@ -207,7 +207,7 @@ static void uniphier_gpio_irq_unmask(struct irq_data *data)uniphier_gpio_reg_update (priv,UNIPHIER_GPIO_IRQ_EN , mask, mask); -return irq_chip_unmask_parent (data); +irq_chip_unmask_parent (data); }static int uniphier_gpio_irq_set_type (struct irq_data *data,unsigned int type)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +1 -0
@@ -412,6 +412,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev) init_data.asic_id.pci_revision_id = adev->rev_id; init_data.asic_id.hw_internal_rev = adev->external_rev_id; + init_data.asic_id.chip_id = adev->pdev->device; init_data.asic_id.vram_width = adev->gmc.vram_width;/* TODO: initialize init_data.asic_id.vram_type here!!!! */
drivers/hid/hid-betopff.c +10 -3
@@ -59,15 +59,22 @@ static int betopff_init(struct hid_device *hid) {struct betopff_device *betopff;struct hid_report *report; -struct hid_input *hidinput = - list_first_entry(&hid->inputs, struct hid_input, list); +struct hid_input *hidinput;struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT ].report_list; -struct input_dev *dev = hidinput->input; +struct input_dev *dev;int field_count =0 ;int error;int i, j; +if (list_empty (&hid->inputs)) { +hid_err (hid,"no inputs found\n" ); +return -ENODEV ; + } + + hidinput = list_first_entry(&hid->inputs, struct hid_input, list); + dev = hidinput->input; +if (list_empty (report_list)) {hid_err (hid,"no output reports found\n" );return -ENODEV ;
drivers/hid/usbhid/hid-core.c +12 -1
@@ -506,7 +506,7 @@ static void hid_ctrl(struct urb *urb)if (unplug) { usbhid->ctrltail = usbhid->ctrlhead; - }else { + }else if (usbhid->ctrlhead != usbhid->ctrltail) { usbhid->ctrltail = (usbhid->ctrltail +1 ) & (HID_CONTROL_FIFO_SIZE -1 ); if (usbhid->ctrlhead != usbhid->ctrltail &&
@@ -1224,9 +1224,20 @@ static void usbhid_stop(struct hid_device *hid)mutex_lock (&usbhid->mutex);clear_bit (HID_STARTED , &usbhid->iofl); +spin_lock_irq (&usbhid->lock);/* Sync with error and led handlers */ set_bit (HID_DISCONNECTED , &usbhid->iofl); +while (usbhid->ctrltail != usbhid->ctrlhead) { +if (usbhid->ctrl[usbhid->ctrltail].dir ==USB_DIR_OUT ) { +kfree (usbhid->ctrl[usbhid->ctrltail].raw_report); + usbhid->ctrl[usbhid->ctrltail].raw_report =NULL ; + } + + usbhid->ctrltail = (usbhid->ctrltail +1 ) & + (HID_CONTROL_FIFO_SIZE -1 ); + }spin_unlock_irq (&usbhid->lock); +usb_kill_urb (usbhid->urbin);usb_kill_urb (usbhid->urbout);usb_kill_urb (usbhid->urbctrl);
drivers/hwmon/mlxreg-fan.c +9 -3
@@ -307,8 +307,8 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev, {struct mlxreg_fan *fan = cdev->devdata;unsigned long cur_state; +int i, config =0 ;u32 regval; -int i;int err;/*
@@ -321,6 +321,12 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev,* overwritten. */ if (state >=MLXREG_FAN_SPEED_MIN && state <=MLXREG_FAN_SPEED_MAX ) { +/* +* This is configuration change, which is only supported through sysfs. +* For configuration non-zero value is to be returned to avoid thermal +* statistics update. +*/ + config =1 ; state -=MLXREG_FAN_MAX_STATE ;for (i =0 ; i < state; i++) fan->cooling_levels[i] = state;
@@ -335,7 +341,7 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev, cur_state =MLXREG_FAN_PWM_DUTY2STATE (regval);if (state < cur_state) -return 0 ; +return config; state = cur_state; }
@@ -351,7 +357,7 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev,dev_err (fan->dev,"Failed to write PWM duty\n" );return err; } -return 0 ; +return config; }static const struct thermal_cooling_device_ops mlxreg_fan_cooling_ops = {
drivers/hwmon/tmp421.c +12 -23
@@ -109,23 +109,17 @@ struct tmp421_data {s16 temp[4 ]; }; -static int temp_from_s16 (s16 reg) +static int temp_from_raw (u16 reg,bool extended) {/* Mask out status bits */ int temp = reg & ~0xf ; -return (temp *1000 +128 ) /256 ; -} - -static int temp_from_u16 (u16 reg) -{ -/* Mask out status bits */ -int temp = reg & ~0xf ; - -/* Add offset for extended temperature range. */ - temp -=64 *256 ; +if (extended) + temp = temp -64 *256 ; +else + temp = (s16 )temp; -return (temp *1000 +128 ) /256 ; +return DIV_ROUND_CLOSEST (temp *1000 ,256 ); }static struct tmp421_data *tmp421_update_device (struct device *dev)
@@ -162,17 +156,15 @@ static int tmp421_read(struct device *dev, enum hwmon_sensor_types type,switch (attr) {case hwmon_temp_input: -if (tmp421->config &TMP421_CONFIG_RANGE ) - *val =temp_from_u16 (tmp421->temp[channel]); -else - *val =temp_from_s16 (tmp421->temp[channel]); + *val =temp_from_raw (tmp421->temp[channel], + tmp421->config &TMP421_CONFIG_RANGE );return 0 ;case hwmon_temp_fault:/* -* The OPEN bit signals a fault. This is bit 0 of the temperature -* register (low byte). +* Any of OPEN or /PVLD bits indicate a hardware mulfunction +* and the conversion result may be incorrect */ - *val = tmp421->temp[channel] &0x01 ; + *val = !!(tmp421->temp[channel] &0x03 );return 0 ;default :return -EOPNOTSUPP ;
@@ -185,11 +177,8 @@ static umode_t tmp421_is_visible(const void *data, enum hwmon_sensor_types type, {switch (attr) {case hwmon_temp_fault: -if (channel ==0 ) -return 0 ; -return S_IRUGO ;case hwmon_temp_input: -return S_IRUGO ; +return 0444 ;default :return 0 ; }
drivers/ipack/devices/ipoctal.c +47 -16
142 lines not on this page · raw message
drivers/irqchip/Kconfig +1 -0
@@ -357,6 +357,7 @@ config MESON_IRQ_GPIO config GOLDFISH_PIC bool "Goldfish programmable interrupt controller" depends on MIPS && (GOLDFISH || COMPILE_TEST) + select GENERIC_IRQ_CHIP select IRQ_DOMAIN help Say yes here to enable Goldfish interrupt controller driver used
drivers/irqchip/irq-gic-v3-its.c +1 -1
@@ -2996,7 +2996,7 @@ static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virqif (err) {if (i >0 ) -its_vpe_irq_domain_free (domain, virq, i -1 ); +its_vpe_irq_domain_free (domain, virq, i);its_lpi_free (bitmap, base, nr_ids);its_free_prop_table (vprop_page);
drivers/mcb/mcb-core.c +6 -6
@@ -280,8 +280,8 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier) bus_nr =ida_simple_get (&mcb_ida,0 ,0 ,GFP_KERNEL );if (bus_nr <0 ) { - rc = bus_nr; - goto err_free; +kfree (bus); +return ERR_PTR (bus_nr); } bus->bus_nr = bus_nr;
@@ -296,12 +296,12 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)dev_set_name (&bus->dev,"mcb:%d" , bus_nr); rc =device_add (&bus->dev);if (rc) - goto err_free; + goto err_put;return bus; -err_free: -put_device (carrier); -kfree (bus); + +err_put: +put_device (&bus->dev);return ERR_PTR (rc); }EXPORT_SYMBOL_GPL (mcb_alloc_bus);
drivers/md/md.c +0 -5
@@ -5401,10 +5401,6 @@ static int md_alloc(dev_t dev, char *name)*/ disk->flags |=GENHD_FL_EXT_DEVT ; mddev->gendisk = disk; -/* As soon as we call add_disk(), another thread could get -* through to md_open, so make sure it doesn't get too far -*/ -mutex_lock (&mddev->open_mutex);add_disk (disk); error =kobject_add (&mddev->kobj, &disk_to_dev (disk)->kobj,"%s" ,"md" );
@@ -5419,7 +5415,6 @@ static int md_alloc(dev_t dev, char *name)if (mddev->kobj.sd &&sysfs_create_group (&mddev->kobj, &md_bitmap_group))pr_debug ("pointless warning\n" ); -mutex_unlock (&mddev->open_mutex); abort:mutex_unlock (&disks_mutex);if (!error && mddev->kobj.sd) {
drivers/net/ethernet/broadcom/bnxt/bnxt.c +4 -4
@@ -294,7 +294,7 @@ static bool bnxt_txr_netif_try_stop_queue(struct bnxt *bp,* netif_tx_queue_stopped(). */ smp_mb (); -if (bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh) { +if (bnxt_tx_avail (bp, txr) >= bp->tx_wake_thresh) {netif_tx_wake_queue (txq);return false; }
@@ -625,7 +625,7 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts)smp_mb ();if (unlikely (netif_tx_queue_stopped (txq)) && -bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh && +bnxt_tx_avail (bp, txr) >= bp->tx_wake_thresh &&READ_ONCE (txr->dev_state) !=BNXT_DEV_STATE_CLOSING )netif_tx_wake_queue (txq); }
@@ -1909,7 +1909,7 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)if (TX_CMP_TYPE (txcmp) ==CMP_TYPE_TX_L2_CMP ) { tx_pkts++;/* return full budget so NAPI will complete. */ -if (unlikely (tx_pkts > bp->tx_wake_thresh)) { +if (unlikely (tx_pkts >= bp->tx_wake_thresh)) { rx_pkts = budget; raw_cons =NEXT_RAW_CMP (raw_cons);break ;
@@ -2712,7 +2712,7 @@ static int bnxt_init_tx_rings(struct bnxt *bp)u16 i; bp->tx_wake_thresh =max_t (int, bp->tx_ring_size /2 , -MAX_SKB_FRAGS +1 ); +BNXT_MIN_TX_DESC_CNT );for (i =0 ; i < bp->tx_nr_rings; i++) {struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
drivers/net/ethernet/broadcom/bnxt/bnxt.h +5 -0
@@ -484,6 +484,11 @@ struct rx_tpa_end_cmp_ext {#define BNXT_MAX_RX_JUM_DESC_CNT (RX_DESC_CNT * MAX_RX_AGG_PAGES - 1)#define BNXT_MAX_TX_DESC_CNT (TX_DESC_CNT * MAX_TX_PAGES - 1) +/* Minimum TX BDs for a TX packet with MAX_SKB_FRAGS + 1. We need one extra +* BD because the first TX BD is always a long BD. +*/ +#define BNXT_MIN_TX_DESC_CNT (MAX_SKB_FRAGS + 2) +#define RX_RING (x) (((x) & ~(RX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))#define RX_IDX (x) ((x) & (RX_DESC_CNT - 1))
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +1 -1
@@ -446,7 +446,7 @@ static int bnxt_set_ringparam(struct net_device *dev,if ((ering->rx_pending >BNXT_MAX_RX_DESC_CNT ) || (ering->tx_pending >BNXT_MAX_TX_DESC_CNT ) || - (ering->tx_pending <=MAX_SKB_FRAGS )) + (ering->tx_pending <BNXT_MIN_TX_DESC_CNT ))return -EINVAL ;if (netif_running (dev))
drivers/net/ethernet/cadence/macb_pci.c +1 -1
@@ -123,9 +123,9 @@ static void macb_remove(struct pci_dev *pdev)struct platform_device *plat_dev =pci_get_drvdata (pdev);struct macb_platform_data *plat_data =dev_get_platdata (&plat_dev->dev); -platform_device_unregister (plat_dev);clk_unregister (plat_data->pclk);clk_unregister (plat_data->hclk); +platform_device_unregister (plat_dev); }static const struct pci_device_id dev_id_table[] = {
drivers/net/ethernet/i825xx/82596.c +1 -1
@@ -1155,7 +1155,7 @@ struct net_device * __init i82596_probe(int unit) err = -ENODEV ; goto out; } -memcpy (eth_addr, (void *)0xfffc1f2c ,ETH_ALEN );/* YUCK! Get addr from NOVRAM */ +memcpy (eth_addr,absolute_pointer (0xfffc1f2c ),ETH_ALEN );/* YUCK! Get addr from NOVRAM */ dev->base_addr =MVME_I596_BASE ; dev->irq = (unsigned ) MVME16x_IRQ_I596; goto found;
drivers/net/ethernet/intel/e100.c +15 -7
@@ -2433,11 +2433,15 @@ static void e100_get_drvinfo(struct net_device *netdev, sizeof(info->bus_info)); } -#define E100_PHY_REGS 0x1C +#define E100_PHY_REGS 0x1Dstatic int e100_get_regs_len (struct net_device *netdev) {struct nic *nic =netdev_priv (netdev); -return 1 +E100_PHY_REGS +sizeof (nic->mem->dump_buf); + +/* We know the number of registers, and the size of the dump buffer. +* Calculate the total size in bytes. +*/ +return (1 +E100_PHY_REGS ) *sizeof (u32) +sizeof (nic->mem->dump_buf); } static void e100_get_regs(struct net_device *netdev,
@@ -2451,14 +2455,18 @@ static void e100_get_regs(struct net_device *netdev, buff[0 ] =ioread8 (&nic->csr->scb.cmd_hi) <<24 |ioread8 (&nic->csr->scb.cmd_lo) <<16 |ioread16 (&nic->csr->scb.status); -for (i =E100_PHY_REGS ; i >=0 ; i--) - buff[1 +E100_PHY_REGS - i] = -mdio_read (netdev, nic->mii.phy_id, i); +for (i =0 ; i <E100_PHY_REGS ; i++) +/* Note that we read the registers in reverse order. This +* ordering is the ABI apparently used by ethtool and other +* applications. +*/ + buff[1 + i] =mdio_read (netdev, nic->mii.phy_id, +E100_PHY_REGS -1 - i);memset (nic->mem->dump_buf,0 ,sizeof (nic->mem->dump_buf));e100_exec_cb (nic,NULL , e100_dump);msleep (10 ); -memcpy (&buff[2 +E100_PHY_REGS ], nic->mem->dump_buf, -sizeof (nic->mem->dump_buf)); +memcpy (&buff[1 +E100_PHY_REGS ], nic->mem->dump_buf, +sizeof (nic->mem->dump_buf)); }static void e100_get_wol (struct net_device *netdev,struct ethtool_wolinfo *wol)
drivers/net/ethernet/mellanox/mlx4/en_netdev.c +3 -0
@@ -372,6 +372,9 @@ mlx4_en_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,int nhoff =skb_network_offset (skb);int ret =0 ; +if (skb->encapsulation) +return -EPROTONOSUPPORT ; +if (skb->protocol !=htons (ETH_P_IP ))return -EPROTONOSUPPORT ;
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -1
@@ -227,7 +227,7 @@ static void stmmac_clk_csr_set(struct stmmac_priv *priv) priv->clk_csr =STMMAC_CSR_100_150M ; else if ((clk_rate >= CSR_F_150M) && (clk_rate < CSR_F_250M)) priv->clk_csr = STMMAC_CSR_150_250M; - else if ((clk_rate >= CSR_F_250M) && (clk_rate < CSR_F_300M)) + else if ((clk_rate >= CSR_F_250M) && (clk_rate <= CSR_F_300M)) priv->clk_csr = STMMAC_CSR_250_300M; }
drivers/net/hamradio/6pack.c +2 -2
@@ -68,9 +68,9 @@#define SIXP_DAMA_OFF 0/* default level 2 parameters */ -#define SIXP_TXDELAY (HZ/4)/* in 1 s */ +#define SIXP_TXDELAY 25/* 250 ms */ #define SIXP_PERSIST 50/* in 256ths */ -#define SIXP_SLOTTIME (HZ/10)/* in 1 s */ +#define SIXP_SLOTTIME 10/* 100 ms */ #define SIXP_INIT_RESYNC_TIMEOUT (3*HZ/2)/* in 1 s */ #define SIXP_RESYNC_TIMEOUT 5*HZ/* in 1 s */
drivers/net/usb/hso.c +28 -17
106 lines not on this page · raw message
drivers/nvme/host/multipath.c +5 -2
@@ -398,14 +398,17 @@ static int nvme_update_ana_state(struct nvme_ctrl *ctrl,down_read (&ctrl->namespaces_rwsem);list_for_each_entry (ns, &ctrl->namespaces, list) { -unsigned nsid =le32_to_cpu (desc->nsids[n]); - +unsigned nsid; +again: + nsid =le32_to_cpu (desc->nsids[n]);if (ns->head->ns_id < nsid)continue ;if (ns->head->ns_id == nsid)nvme_update_ns_ana_state (desc, ns);if (++n == nr_nsids)break ; +if (ns->head->ns_id > nsid) + goto again; }up_read (&ctrl->namespaces_rwsem);return 0 ;
drivers/pci/controller/pci-aardvark.c +54 -8
110 lines not on this page · raw message
drivers/scsi/csiostor/csio_init.c +1 -0
@@ -1263,3 +1263,4 @@ MODULE_DEVICE_TABLE(pci, csio_pci_tbl);MODULE_VERSION (CSIO_DRV_VERSION );MODULE_FIRMWARE (FW_FNAME_T5 );MODULE_FIRMWARE (FW_FNAME_T6 ); +MODULE_SOFTDEP ("pre: cxgb4" );
drivers/scsi/scsi_transport_iscsi.c +4 -4
@@ -429,9 +429,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,struct iscsi_transport *t = iface->transport;int param =-1 ; -if (attr == &dev_attr_iface_enabled.attr) - param =ISCSI_NET_PARAM_IFACE_ENABLE ; -else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr) +if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr) param =ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO ;else if (attr == &dev_attr_iface_header_digest.attr) param =ISCSI_IFACE_PARAM_HDRDGST_EN ;
@@ -471,7 +469,9 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,if (param !=-1 )return t->attr_is_visible (ISCSI_IFACE_PARAM , param); -if (attr == &dev_attr_iface_vlan_id.attr) +if (attr == &dev_attr_iface_enabled.attr) + param =ISCSI_NET_PARAM_IFACE_ENABLE ; +else if (attr == &dev_attr_iface_vlan_id.attr) param =ISCSI_NET_PARAM_VLAN_ID ;else if (attr == &dev_attr_iface_vlan_priority.attr) param =ISCSI_NET_PARAM_VLAN_PRIORITY ;
drivers/spi/spi-tegra20-slink.c +2 -2
@@ -1210,7 +1210,7 @@ static int tegra_slink_resume(struct device *dev) }#endif -static int tegra_slink_runtime_suspend (struct device *dev) +static int __maybe_unused tegra_slink_runtime_suspend (struct device *dev) {struct spi_master *master =dev_get_drvdata (dev);struct tegra_slink_data *tspi =spi_master_get_devdata (master);
@@ -1222,7 +1222,7 @@ static int tegra_slink_runtime_suspend(struct device *dev)return 0 ; } -static int tegra_slink_runtime_resume (struct device *dev) +static int __maybe_unused tegra_slink_runtime_resume (struct device *dev) {struct spi_master *master =dev_get_drvdata (dev);struct tegra_slink_data *tspi =spi_master_get_devdata (master);
drivers/staging/erofs/include/trace/events/erofs.h +3 -3
@@ -32,20 +32,20 @@ TRACE_EVENT(erofs_lookup,TP_STRUCT__entry (__field (dev_t ,dev )__field (erofs_nid_t, nid ) - __field(const char *, name ) + __string(name, dentry->d_name.name ) __field(unsigned int, flags ) ),TP_fast_assign ( __entry->dev = dir->i_sb->s_dev; __entry->nid =EROFS_V (dir)->nid; - __entry->name = dentry->d_name.name; +__assign_str (name, dentry->d_name.name); __entry->flags = flags; ),TP_printk ("dev = (%d,%d), pnid = %llu, name:%s, flags:%x" ,show_dev_nid (__entry), - __entry->name, +__get_str (name), __entry->flags) );
drivers/staging/greybus/uart.c +32 -30
135 lines not on this page · raw message
drivers/thermal/thermal_core.c +3 -4
@@ -228,15 +228,14 @@ int thermal_build_list_of_policies(char *buf) {struct thermal_governor *pos;ssize_t count =0 ; -ssize_t size =PAGE_SIZE ;mutex_lock (&thermal_governor_lock);list_for_each_entry (pos, &thermal_governor_list, governor_list) { - size =PAGE_SIZE - count; - count +=scnprintf (buf + count, size,"%s " , pos->name); + count +=scnprintf (buf + count,PAGE_SIZE - count,"%s " , + pos->name); } - count +=scnprintf (buf + count, size,"\n" ); + count +=scnprintf (buf + count,PAGE_SIZE - count,"\n" );mutex_unlock (&thermal_governor_lock);
drivers/tty/serial/mvebu-uart.c +1 -1
@@ -163,7 +163,7 @@ static unsigned int mvebu_uart_tx_empty(struct uart_port *port) st =readl (port->membase +UART_STAT );spin_unlock_irqrestore (&port->lock, flags); -return (st &STAT_TX_FIFO_EMP ) ?TIOCSER_TEMT :0 ; +return (st &STAT_TX_EMP ) ?TIOCSER_TEMT :0 ; }static unsigned int mvebu_uart_get_mctrl (struct uart_port *port)
drivers/tty/synclink_gt.c +23 -78
277 lines not on this page · raw message
drivers/tty/vt/vt.c +19 -2
@@ -1218,8 +1218,25 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc, new_row_size = new_cols <<1 ; new_screen_size = new_row_size * new_rows; -if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) -return 0 ; +if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) { +/* +* This function is being called here to cover the case +* where the userspace calls the FBIOPUT_VSCREENINFO twice, +* passing the same fb_var_screeninfo containing the fields +* yres/xres equal to a number non-multiple of vc_font.height +* and yres_virtual/xres_virtual equal to number lesser than the +* vc_font.height and yres/xres. +* In the second call, the struct fb_var_screeninfo isn't +* being modified by the underlying driver because of the +* if above, and this causes the fbcon_display->vrows to become +* negative and it eventually leads to out-of-bound +* access by the imageblit function. +* To give the correct values to the struct and to not have +* to deal with possible errors from the code below, we call +* the resize_screen here as well. +*/ +return resize_screen (vc, new_cols, new_rows, user); + }if (new_screen_size >KMALLOC_MAX_SIZE || !new_screen_size)return -EINVAL ;
drivers/usb/class/cdc-acm.c +5 -2
@@ -734,7 +734,8 @@ static void acm_port_destruct(struct tty_port *port) { struct acm *acm = container_of(port, struct acm, port); -acm_release_minor (acm); +if (acm->minor !=ACM_MINOR_INVALID ) +acm_release_minor (acm);usb_put_intf (acm->control);kfree (acm->country_codes);kfree (acm);
@@ -1396,8 +1397,10 @@ static int acm_probe(struct usb_interface *intf,usb_get_intf (acm->control);/* undone in destruct() */ minor =acm_alloc_minor (acm); -if (minor <0 ) +if (minor <0 ) { + acm->minor =ACM_MINOR_INVALID ; goto alloc_fail1; + } acm->minor = minor; acm->dev = usb_dev;
drivers/usb/class/cdc-acm.h +2 -0
@@ -22,6 +22,8 @@#define ACM_TTY_MAJOR 166#define ACM_TTY_MINORS 256 +#define ACM_MINOR_INVALID ACM_TTY_MINORS +/* * Requests. */
drivers/usb/dwc2/gadget.c +1 -3
@@ -2919,9 +2919,7 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,/* In DDMA handle isochronous requests separately */ if (using_desc_dma (hsotg) && hs_ep->isochronous) { -/* XferCompl set along with BNA */ -if (!(ints &DXEPINT_BNAINTR )) -dwc2_gadget_complete_isoc_request_ddma (hs_ep); +dwc2_gadget_complete_isoc_request_ddma (hs_ep); }else if (dir_in) {/* * We get OutDone from the FIFO, so we only
drivers/usb/gadget/udc/r8a66597-udc.c +1 -1
@@ -1250,7 +1250,7 @@ static void set_feature(struct r8a66597 *r8a66597, struct usb_ctrlrequest *ctrl)do { tmp =r8a66597_read (r8a66597,INTSTS0 ) &CTSQ ;udelay (1 ); - }while (tmp !=CS_IDST || timeout-- >0 ); + }while (tmp !=CS_IDST && timeout-- >0 );if (tmp ==CS_IDST ) r8a66597_bset(r8a66597,
drivers/usb/musb/tusb6010.c +1 -0
@@ -190,6 +190,7 @@ tusb_fifo_write_unaligned(void __iomem *fifo, const u8 *buf, u16 len) }if (len >0 ) {/* Write the rest 1 - 3 bytes to FIFO */ + val =0 ;memcpy (&val, buf, len);musb_writel (fifo,0 , val); }
drivers/usb/serial/cp210x.c +1 -0
@@ -234,6 +234,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */ { USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */ { USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */ + { USB_DEVICE(0x2184, 0x0030) }, /* GW Instek GDM-834x Digital Multimeter */ { USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */ { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */
drivers/usb/serial/mos7840.c +0 -2
@@ -113,7 +113,6 @@#define BANDB_DEVICE_ID_USOPTL4_2P 0xBC02#define BANDB_DEVICE_ID_USOPTL4_4 0xAC44#define BANDB_DEVICE_ID_USOPTL4_4P 0xBC03 -#define BANDB_DEVICE_ID_USOPTL2_4 0xAC24/* This driver also supports * ATEN UC2324 device using Moschip MCS7840
@@ -194,7 +193,6 @@ static const struct usb_device_id id_table[] = { {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P)}, - {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)}, {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)}, {USB_DEVICE(USB_VENDOR_ID_MOXA, MOXA_DEVICE_ID_2210)},
drivers/usb/serial/option.c +10 -1
@@ -1205,6 +1205,14 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */ .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff), /* Telit LN920 (rmnet) */ + .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff), /* Telit LN920 (MBIM) */ + .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1062, 0xff), /* Telit LN920 (RNDIS) */ + .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff), /* Telit LN920 (ECM) */ + .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
@@ -1650,7 +1658,6 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff), .driver_info = RSVD(1) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff),
@@ -2068,6 +2075,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, { USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, + { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */ + .driver_info = RSVD(3) }, { USB_DEVICE(0x1508, 0x1001), /* Fibocom NL668 (IOT version) */ .driver_info = RSVD(4) | RSVD(5) | RSVD(6) }, { USB_DEVICE(0x2cb7, 0x0104), /* Fibocom NL678 series */
drivers/usb/storage/unusual_devs.h +8 -1
@@ -416,9 +416,16 @@ UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210, USB_SC_UFI, USB_PR_DEVICE, NULL, US_FL_FIX_INQUIRY | US_FL_SINGLE_LUN),/* -* Reported by Ondrej Zary <[email protected]> +* Reported by Ondrej Zary <[email protected]> * The device reports one sector more and breaks when that sector is accessed +* Firmwares older than 2.6c (the latest one and the only that claims Linux +* support) have also broken tag handling */ +UNUSUAL_DEV (0x04ce ,0x0002 ,0x0000 ,0x026b , +"ScanLogic" , +"SL11R-IDE" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , +US_FL_FIX_CAPACITY |US_FL_BULK_IGNORE_TAG ), UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c, "ScanLogic", "SL11R-IDE",
drivers/usb/storage/unusual_uas.h +1 -1
@@ -50,7 +50,7 @@ UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999,"LaCie" ,"Rugged USB3-FW" ,USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , - US_FL_IGNORE_UAS), + US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME),/* * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI
drivers/xen/balloon.c +45 -17
137 lines not on this page · raw message
fs/binfmt_elf.c +1 -1
@@ -580,7 +580,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, elf_prot |=PROT_EXEC ; vaddr = eppnt->p_vaddr;if (interp_elf_ex->e_type ==ET_EXEC || load_addr_set) - elf_type |=MAP_FIXED_NOREPLACE ; + elf_type |=MAP_FIXED ;else if (no_base && interp_elf_ex->e_type ==ET_DYN ) load_addr = -vaddr;
fs/cifs/connect.c +3 -2
@@ -3374,9 +3374,10 @@ cifs_match_super(struct super_block *sb, void *data)spin_lock (&cifs_tcp_ses_lock); cifs_sb =CIFS_SB (sb); tlink =cifs_get_tlink (cifs_sb_master_tlink (cifs_sb)); -if (IS_ERR (tlink)) { +if (tlink ==NULL ) { +/* can not match superblock if tlink were ever null */ spin_unlock (&cifs_tcp_ses_lock); -return rc; +return 0 ; } tcon =tlink_tcon (tlink); ses = tcon->ses;
fs/ext4/dir.c +3 -3
@@ -535,7 +535,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)struct dir_private_info *info = file->private_data;struct inode *inode =file_inode (file);struct fname *fname; -int ret; +int ret =0 ;if (!info) { info =ext4_htree_create_dir_info (file, ctx->pos);
@@ -583,7 +583,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx) info->curr_minor_hash, &info->next_hash);if (ret <0 ) -return ret; + goto finished;if (ret ==0 ) { ctx->pos =ext4_get_htree_eof (file);break ;
@@ -614,7 +614,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx) } finished: info->last_pos = ctx->pos; -return 0 ; +return ret <0 ? ret :0 ; }static int ext4_dir_open (struct inode * inode,struct file * filp)
fs/ocfs2/dlmglue.c +2 -1
@@ -3907,7 +3907,7 @@ static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres, oi =OCFS2_I (inode); oi->ip_dir_lock_gen++;mlog (0 ,"generation: %u\n" , oi->ip_dir_lock_gen); - goto out; + goto out_forget; }if (!S_ISREG (inode->i_mode))
@@ -3938,6 +3938,7 @@ static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,filemap_fdatawait (mapping); } +out_forget:forget_all_cached_acls (inode); out:
fs/qnx4/dir.c +52 -17
92 lines not on this page · raw message
include/linux/compiler.h +2 -0
@@ -228,6 +228,8 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, (typeof(ptr)) (__ptr + (off)); })#endif +#define absolute_pointer (val) RELOC_HIDE((void *)(val), 0) +#ifndef OPTIMIZER_HIDE_VAR /* Make the optimizer believe the variable can be manipulated arbitrarily. */ #define OPTIMIZER_HIDE_VAR (var) \
include/linux/cred.h +9 -5
@@ -240,7 +240,7 @@ static inline struct cred *get_new_cred(struct cred *cred)* @cred: The credentials to reference * * Get a reference on the specified set of credentials. The caller must -* release the reference. +* release the reference. If %NULL is passed, it is returned with no action. * * This is used to deal with a committed set of credentials. Although the * pointer is const, this will temporarily discard the const and increment the
@@ -251,6 +251,8 @@ static inline struct cred *get_new_cred(struct cred *cred)static inline const struct cred *get_cred (const struct cred *cred) {struct cred *nonconst_cred = (struct cred *) cred; +if (!cred) +return cred;validate_creds (cred); nonconst_cred->non_rcu =0 ;return get_new_cred (nonconst_cred);
@@ -261,7 +263,7 @@ static inline const struct cred *get_cred(const struct cred *cred)* @cred: The credentials to release * * Release a reference to a set of credentials, deleting them when the last ref -* is released. +* is released. If %NULL is passed, nothing is done. * * This takes a const pointer to a set of credentials because the credentials * on task_struct are attached by const pointers to prevent accidental
@@ -271,9 +273,11 @@ static inline void put_cred(const struct cred *_cred) {struct cred *cred = (struct cred *) _cred; -validate_creds (cred); -if (atomic_dec_and_test (&(cred)->usage)) -__put_cred (cred); +if (cred) { +validate_creds (cred); +if (atomic_dec_and_test (&(cred)->usage)) +__put_cred (cred); + } }/**
include/net/sock.h +2 -0
@@ -471,8 +471,10 @@ struct sock {u32 sk_ack_backlog;u32 sk_max_ack_backlog;kuid_t sk_uid; +spinlock_t sk_peer_lock;struct pid *sk_peer_pid;const struct cred *sk_peer_cred; +long sk_rcvtimeo;ktime_t sk_stamp;#if BITS_PER_LONG ==32
kernel/sched/cpufreq_schedutil.c +11 -5
@@ -591,9 +591,17 @@ static struct attribute *sugov_attributes[] = {NULL }; +static void sugov_tunables_free (struct kobject *kobj) +{ + struct gov_attr_set *attr_set = container_of(kobj, struct gov_attr_set, kobj); + +kfree (to_sugov_tunables (attr_set)); +} +static struct kobj_type sugov_tunables_ktype = { .default_attrs = sugov_attributes, .sysfs_ops = &governor_sysfs_ops, + .release = &sugov_tunables_free, };/********************** cpufreq governor interface *********************/
@@ -693,12 +701,10 @@ static struct sugov_tunables *sugov_tunables_alloc(struct sugov_policy *sg_policreturn tunables; } -static void sugov_tunables_free (struct sugov_tunables *tunables) +static void sugov_clear_global_tunables (void ) {if (!have_governor_per_policy ()) global_tunables =NULL ; - -kfree (tunables); }static int sugov_init (struct cpufreq_policy *policy)
@@ -761,7 +767,7 @@ static int sugov_init(struct cpufreq_policy *policy) fail:kobject_put (&tunables->attr_set.kobj); policy->governor_data =NULL ; -sugov_tunables_free (tunables); +sugov_clear_global_tunables (); stop_kthread:sugov_kthread_stop (sg_policy);
@@ -788,7 +794,7 @@ static void sugov_exit(struct cpufreq_policy *policy) count =gov_attr_set_put (&tunables->attr_set, &sg_policy->tunables_hook); policy->governor_data =NULL ;if (!count) -sugov_tunables_free (tunables); +sugov_clear_global_tunables ();mutex_unlock (&global_tunables_lock);
kernel/trace/blktrace.c +8 -0
@@ -1661,6 +1661,14 @@ static int blk_trace_remove_queue(struct request_queue *q)if (bt ==NULL )return -EINVAL ; +if (bt->trace_state == Blktrace_running) { + bt->trace_state = Blktrace_stopped; +spin_lock_irq (&running_trace_lock); +list_del_init (&bt->running_list); +spin_unlock_irq (&running_trace_lock); +relay_flush (bt->rchan); + } +put_probe_ref ();synchronize_rcu ();blk_trace_free (bt);
net/core/sock.c +26 -6
@@ -1057,6 +1057,16 @@ int sock_setsockopt(struct socket *sock, int level, int optname, }EXPORT_SYMBOL (sock_setsockopt); +static const struct cred *sk_get_peer_cred (struct sock *sk) +{ +const struct cred *cred; + +spin_lock (&sk->sk_peer_lock); + cred =get_cred (sk->sk_peer_cred); +spin_unlock (&sk->sk_peer_lock); + +return cred; +}static void cred_to_ucred (struct pid *pid,const struct cred *cred,struct ucred *ucred)
@@ -1231,7 +1241,11 @@ int sock_getsockopt(struct socket *sock, int level, int optname,struct ucred peercred;if (len >sizeof (peercred)) len =sizeof (peercred); + +spin_lock (&sk->sk_peer_lock);cred_to_ucred (sk->sk_peer_pid, sk->sk_peer_cred, &peercred); +spin_unlock (&sk->sk_peer_lock); +if (copy_to_user (optval, &peercred, len))return -EFAULT ; goto lenout;
@@ -1239,20 +1253,23 @@ int sock_getsockopt(struct socket *sock, int level, int optname,case SO_PEERGROUPS : { +const struct cred *cred;int ret, n; -if (!sk->sk_peer_cred) + cred =sk_get_peer_cred (sk); +if (!cred)return -ENODATA ; - n = sk->sk_peer_cred->group_info->ngroups; + n = cred->group_info->ngroups;if (len < n *sizeof (gid_t)) { len = n *sizeof (gid_t); +put_cred (cred);return put_user (len, optlen) ? -EFAULT : -ERANGE ; } len = n *sizeof (gid_t); - ret =groups_to_user ((gid_t __user *)optval, - sk->sk_peer_cred->group_info); + ret =groups_to_user ((gid_t __user *)optval, cred->group_info); +put_cred (cred);if (ret)return ret; goto lenout;
@@ -1576,9 +1593,10 @@ static void __sk_destruct(struct rcu_head *head) sk->sk_frag.page =NULL ; } -if (sk->sk_peer_cred) -put_cred (sk->sk_peer_cred); +/* We do not need to acquire sk->sk_peer_lock, we are the last user. */ +put_cred (sk->sk_peer_cred);put_pid (sk->sk_peer_pid); +if (likely (sk->sk_net_refcnt))put_net (sock_net (sk));sk_prot_free (sk->sk_prot_creator, sk);
@@ -2826,6 +2844,8 @@ void sock_init_data(struct socket *sock, struct sock *sk) sk->sk_peer_pid =NULL ; sk->sk_peer_cred =NULL ; +spin_lock_init (&sk->sk_peer_lock); + sk->sk_write_pending =0 ; sk->sk_rcvlowat =1 ; sk->sk_rcvtimeo =MAX_SCHEDULE_TIMEOUT ;
net/ipv4/tcp_input.c +10 -6
@@ -581,10 +581,12 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock *sk,u32 delta =tcp_time_stamp (tp) - tp->rx_opt.rcv_tsecr;u32 delta_us; -if (!delta) - delta =1 ; - delta_us = delta * (USEC_PER_SEC /TCP_TS_HZ ); -tcp_rcv_rtt_update (tp, delta_us,0 ); +if (likely (delta <INT_MAX / (USEC_PER_SEC /TCP_TS_HZ ))) { +if (!delta) + delta =1 ; + delta_us = delta * (USEC_PER_SEC /TCP_TS_HZ ); +tcp_rcv_rtt_update (tp, delta_us,0 ); + } } }
@@ -2931,9 +2933,11 @@ static bool tcp_ack_update_rtt(struct sock *sk, const int flag,if (seq_rtt_us <0 && tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr && flag &FLAG_ACKED ) {u32 delta =tcp_time_stamp (tp) - tp->rx_opt.rcv_tsecr; -u32 delta_us = delta * (USEC_PER_SEC /TCP_TS_HZ ); - seq_rtt_us = ca_rtt_us = delta_us; +if (likely (delta <INT_MAX / (USEC_PER_SEC /TCP_TS_HZ ))) { + seq_rtt_us = delta * (USEC_PER_SEC /TCP_TS_HZ ); + ca_rtt_us = seq_rtt_us; + } } rs->rtt_us = ca_rtt_us;/* RTT of last (S)ACKed packet (or -1) */ if (seq_rtt_us <0 )
net/ipv4/tcp_output.c +4 -5
@@ -2958,13 +2958,12 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)#endif TCP_SKB_CB (skb)->sacked |=TCPCB_RETRANS ; tp->retrans_out +=tcp_skb_pcount (skb); - -/* Save stamp of the first retransmit. */ -if (!tp->retrans_stamp) - tp->retrans_stamp =tcp_skb_timestamp (skb); - } +/* Save stamp of the first (attempted) retransmit. */ +if (!tp->retrans_stamp) + tp->retrans_stamp =tcp_skb_timestamp (skb); +if (tp->undo_retrans <0 ) tp->undo_retrans =0 ; tp->undo_retrans +=tcp_skb_pcount (skb);
net/ipv4/tcp_timer.c +29 -34
96 lines not on this page · raw message
net/ipv4/udp.c +5 -5
@@ -935,7 +935,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)__be16 dport;u8 tos;int err, is_udplite =IS_UDPLITE (sk); -int corkreq = up->corkflag || msg->msg_flags&MSG_MORE ; +int corkreq =READ_ONCE (up->corkflag) || msg->msg_flags&MSG_MORE ;int (*getfrag)(void *,char *,int ,int ,int ,struct sk_buff *);struct sk_buff *skb;struct ip_options_data opt_copy;
@@ -1243,7 +1243,7 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset, } up->len += size; -if (!(up->corkflag || (flags&MSG_MORE ))) +if (!(READ_ONCE (up->corkflag) || (flags&MSG_MORE ))) ret =udp_push_pending_frames (sk);if (!ret) ret = size;
@@ -2468,9 +2468,9 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,switch (optname) {case UDP_CORK :if (val !=0 ) { - up->corkflag =1 ; +WRITE_ONCE (up->corkflag,1 ); }else { - up->corkflag =0 ; +WRITE_ONCE (up->corkflag,0 );lock_sock (sk);push_pending_frames (sk);release_sock (sk);
@@ -2583,7 +2583,7 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,switch (optname) {case UDP_CORK : - val = up->corkflag; + val =READ_ONCE (up->corkflag);break ;case UDP_ENCAP :
net/ipv6/udp.c +1 -1
@@ -1169,7 +1169,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)int addr_len = msg->msg_namelen;bool connected = false;int ulen = len; -int corkreq = up->corkflag || msg->msg_flags&MSG_MORE ; +int corkreq =READ_ONCE (up->corkflag) || msg->msg_flags&MSG_MORE ;int err;int is_udplite =IS_UDPLITE (sk);int (*getfrag)(void *,char *,int ,int ,int ,struct sk_buff *);
net/mac80211/tx.c +12 -0
@@ -2126,7 +2126,11 @@ static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local, } vht_mcs = iterator.this_arg[4 ] >>4 ; +if (vht_mcs >11 ) + vht_mcs =0 ; vht_nss = iterator.this_arg[4 ] &0xF ; +if (!vht_nss || vht_nss >8 ) + vht_nss =1 ;break ;/*
@@ -3264,6 +3268,14 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,if (!ieee80211_amsdu_prepare_head (sdata, fast_tx, head)) goto out; +/* If n == 2, the "while (*frag_tail)" loop above didn't execute +* and frag_tail should be &skb_shinfo(head)->frag_list. +* However, ieee80211_amsdu_prepare_head() can reallocate it. +* Reload frag_tail to have it pointing to the correct place. +*/ +if (n ==2 ) + frag_tail = &skb_shinfo (head)->frag_list; +/* * Pad out the previous subframe to a multiple of 4 by adding the * padding to the next one, that's being added. Note that head->len
net/mac80211/wpa.c +6 -0
@@ -523,6 +523,9 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,return RX_DROP_UNUSABLE ; } +/* reload hdr - skb might have been reallocated */ + hdr = (void *)rx->skb->data; + data_len = skb->len - hdrlen -IEEE80211_CCMP_HDR_LEN - mic_len;if (!rx->sta || data_len <0 )return RX_DROP_UNUSABLE ;
@@ -752,6 +755,9 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)return RX_DROP_UNUSABLE ; } +/* reload hdr - skb might have been reallocated */ + hdr = (void *)rx->skb->data; + data_len = skb->len - hdrlen -IEEE80211_GCMP_HDR_LEN - mic_len;if (!rx->sta || data_len <0 )return RX_DROP_UNUSABLE ;
net/netfilter/ipset/ip_set_hash_gen.h +2 -2
@@ -104,11 +104,11 @@ htable_size(u8 hbits) {size_t hsize; -/* We must fit both into u32 in jhash and size_t */ +/* We must fit both into u32 in jhash and INT_MAX in kvmalloc_node() */ if (hbits >31 )return 0 ; hsize =jhash_size (hbits); -if ((((size_t )-1 ) -sizeof (struct htable )) /sizeof (struct hbucket *) +if ((INT_MAX -sizeof (struct htable )) /sizeof (struct hbucket *) < hsize)return 0 ;
net/netfilter/ipvs/ip_vs_conn.c +4 -0
@@ -1399,6 +1399,10 @@ int __init ip_vs_conn_init(void)int idx;/* Compute size and mask */ +if (ip_vs_conn_tab_bits <8 || ip_vs_conn_tab_bits >20 ) { +pr_info ("conn_tab_bits not in [8, 20]. Using default value\n" ); + ip_vs_conn_tab_bits =CONFIG_IP_VS_TAB_BITS ; + } ip_vs_conn_tab_size =1 << ip_vs_conn_tab_bits; ip_vs_conn_tab_mask = ip_vs_conn_tab_size -1 ;
net/sctp/input.c +1 -1
@@ -687,7 +687,7 @@ static int sctp_rcv_ootb(struct sk_buff *skb) ch =skb_header_pointer (skb, offset,sizeof (*ch), &_ch);/* Break out if chunk length is less then minimal. */ -if (ntohs (ch->length) <sizeof (_ch)) +if (!ch ||ntohs (ch->length) <sizeof (_ch))break ; ch_end = offset +SCTP_PAD4 (ntohs (ch->length));
net/smc/smc_clc.c +2 -1
@@ -162,7 +162,8 @@ static int smc_clc_prfx_set(struct socket *clcsock, goto out_rel; }/* get address to which the internal TCP socket is bound */ -kernel_getsockname (clcsock, (struct sockaddr *)&addrs); +if (kernel_getsockname (clcsock, (struct sockaddr *)&addrs) <0 ) + goto out_rel;/* analyze IP specific data of net_device belonging to TCP socket */ addr6 = (struct sockaddr_in6 *)&addrs;rcu_read_lock ();
net/unix/af_unix.c +28 -6
@@ -600,20 +600,42 @@ static void unix_release_sock(struct sock *sk, int embrion)static void init_peercred (struct sock *sk) { -put_pid (sk->sk_peer_pid); -if (sk->sk_peer_cred) -put_cred (sk->sk_peer_cred); +const struct cred *old_cred; +struct pid *old_pid; + +spin_lock (&sk->sk_peer_lock); + old_pid = sk->sk_peer_pid; + old_cred = sk->sk_peer_cred; sk->sk_peer_pid =get_pid (task_tgid (current)); sk->sk_peer_cred =get_current_cred (); +spin_unlock (&sk->sk_peer_lock); + +put_pid (old_pid); +put_cred (old_cred); }static void copy_peercred (struct sock *sk,struct sock *peersk) { -put_pid (sk->sk_peer_pid); -if (sk->sk_peer_cred) -put_cred (sk->sk_peer_cred); +const struct cred *old_cred; +struct pid *old_pid; + +if (sk < peersk) { +spin_lock (&sk->sk_peer_lock); +spin_lock_nested (&peersk->sk_peer_lock,SINGLE_DEPTH_NESTING ); + }else { +spin_lock (&peersk->sk_peer_lock); +spin_lock_nested (&sk->sk_peer_lock,SINGLE_DEPTH_NESTING ); + } + old_pid = sk->sk_peer_pid; + old_cred = sk->sk_peer_cred; sk->sk_peer_pid =get_pid (peersk->sk_peer_pid); sk->sk_peer_cred =get_cred (peersk->sk_peer_cred); + +spin_unlock (&sk->sk_peer_lock); +spin_unlock (&peersk->sk_peer_lock); + +put_pid (old_pid); +put_cred (old_cred); }static int unix_listen (struct socket *sock,int backlog)