Linux 5.4.275
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.275 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.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/arc/boot/dts/hsdk.dts | 1 arch/arm64/boot/dts/mediatek/mt2712-evb.dts | 78 ++++- arch/arm64/boot/dts/mediatek/mt2712e.dtsi | 68 ++++ arch/arm64/boot/dts/mediatek/mt7622.dtsi | 7 arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi | 29 + arch/x86/include/asm/apic.h | 3 arch/x86/kernel/cpu/cpuid-deps.c | 6 crypto/algapi.c | 1 drivers/android/binder.c | 4 drivers/bluetooth/btusb.c | 2 drivers/clk/clk.c | 154 +++++++--- drivers/dma/idma64.c | 4 drivers/dma/owl-dma.c | 4 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 1 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 70 ++-- drivers/gpu/drm/drm_client_modeset.c | 3 drivers/gpu/drm/nouveau/nouveau_bios.c | 13 drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowof.c | 7 drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c | 7 drivers/hid/i2c-hid/i2c-hid-core.c | 8 drivers/i2c/i2c-core-base.c | 12 drivers/infiniband/hw/mlx5/mad.c | 3 drivers/infiniband/sw/rxe/rxe.c | 2 drivers/irqchip/irq-gic-v3-its.c | 9 drivers/md/dm-core.h | 2 drivers/md/dm-ioctl.c | 3 drivers/md/dm-table.c | 9 drivers/mtd/nand/raw/diskonchip.c | 4 drivers/net/ethernet/amazon/ena/ena_com.c | 2 drivers/net/ethernet/broadcom/b44.c | 14 drivers/net/ethernet/intel/i40e/i40e_main.c | 2 drivers/net/ethernet/intel/iavf/iavf_main.c | 30 + drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 12 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 3 drivers/net/ethernet/mellanox/mlxsw/core.c | 2 drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 54 ++- drivers/net/geneve.c | 4 drivers/net/gtp.c | 3 drivers/net/tun.c | 18 - drivers/net/usb/ax88179_178a.c | 11 drivers/net/vxlan.c | 4 drivers/nfc/trf7970a.c | 42 +- drivers/staging/comedi/drivers/vmk80xx.c | 35 -- drivers/staging/speakup/main.c | 2 drivers/tty/serial/mxs-auart.c | 8 drivers/tty/serial/pmac_zilog.c | 14 drivers/usb/class/cdc-wdm.c | 6 drivers/usb/core/port.c | 4 drivers/usb/dwc2/hcd_ddma.c | 4 drivers/usb/serial/option.c | 40 ++ drivers/vhost/vhost.c | 12 fs/btrfs/backref.c | 12 fs/btrfs/delayed-inode.c | 3 fs/btrfs/qgroup.c | 2 fs/nilfs2/dir.c | 2 fs/sysfs/file.c | 2 include/linux/etherdevice.h | 25 + include/linux/serial_core.h | 79 +++++ include/linux/trace_events.h | 2 include/linux/u64_stats_sync.h | 6 include/net/addrconf.h | 4 include/net/af_unix.h | 5 include/net/ip_tunnels.h | 33 ++ kernel/bounds.c | 2 kernel/kprobes.c | 18 - kernel/trace/trace_event_perf.c | 3 kernel/trace/trace_events_trigger.c | 6 lib/stackdepot.c | 4 net/batman-adv/translation-table.c | 2 net/bluetooth/hci_request.c | 4 net/bluetooth/l2cap_sock.c | 7 net/bluetooth/sco.c | 7 net/ethernet/eth.c | 12 net/ipv4/inet_timewait_sock.c | 32 +- net/ipv4/route.c | 4 net/ipv4/udp.c | 5 net/ipv6/addrconf.c | 7 net/ipv6/ip6_fib.c | 7 net/ipv6/udp.c | 5 net/netfilter/ipvs/ip_vs_proto_sctp.c | 6 net/netfilter/nf_tables_api.c | 8 net/openvswitch/conntrack.c | 9 net/unix/af_unix.c | 4 net/unix/garbage.c | 35 +- net/unix/scm.c | 8 tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc | 6 tools/testing/selftests/timers/posix_timers.c | 2 virt/kvm/async_pf.c | 19 - 89 files changed, 902 insertions(+), 337 deletions(-)
Adam Dunlap (1):
x86/apic: Force native_apic_mem_read() to use the MOV instruction
Alan Stern (1):
fs: sysfs: Fix reference leak in sysfs_break_active_protection()
Alexey Brodkin (1):
ARC: [plat-hsdk]: Remove misplaced interrupt-cells property
Andrey Ryabinin (1):
stackdepot: respect __GFP_NOLOCKDEP allocation flag
Andy Shevchenko (1):
idma64: Don't try to serve interrupts when device is powered off
Arnd Bergmann (5):
nouveau: fix function cast warning
ipv6: fib: hide unused 'pn' variable ipv4/route: avoid unused-but-set-variable warning
mtd: diskonchip: work around ubsan link failure
dmaengine: owl: fix register access functions
Biao Huang (1):
arm64: dts: mt2712: add ethernet device node
Boris Burkov (2):
btrfs: qgroup: correctly model root qgroup rsv in convert
btrfs: record delayed inode root in transaction
Carlos Llamas (1):
binder: check offset alignment in binder_get_object()
Chia-I Wu (1):
amdgpu: validate offset_in_bo of drm_amdgpu_gem_va
Chuanhong Guo (1):
USB: serial: option: add support for Fibocom FM650/FG650
Claudiu Beznea (1):
clk: remove extra empty line
Coia Prant (1):
USB: serial: option: add Lonsung U8300/U9300 product
Cosmin Ratiu (1):
net/mlx5: Properly link new fs rules into the tree
Daniele Palmas (1):
USB: serial: option: add Telit FN920C04 rmnet compositions
Dave Airlie (1):
nouveau: fix instmem race condition around ptr stores
David Arinzon (1):
net: ena: Fix potential sign extension issue
David Bauer (1):
vxlan: drop packets from invalid src-address
Dmitry Antipov (1):
Bluetooth: Fix memory leak in hci_req_sync_complete()
Emil Kronborg (1):
serial: mxs-auart: add spinlock around changing cts state
Eric Biggers (1):
x86/cpufeatures: Fix dependencies for GFNI, VAES, and VPCLMULQDQ
Eric Dumazet (3):
geneve: fix header validation in geneve[6]_xmit_skb
net: usb: ax88179_178a: stop lying about skb->truesize
tcp: Fix NEW_SYN_RECV handling in inet_twsk_purge()
Finn Thain (1):
serial/pmac_zilog: Remove flawed mitigation for rx irq flood
Gavin Shan (1):
vhost: Add smp_rmb() in vhost_vq_avail_empty()
Greg Kroah-Hartman (3):
Revert "usb: cdc-wdm: close race between read and workqueue" Revert "crypto: api - Disallow identical driver names" Linux 5.4.275
Guanrui Huang (1):
irqchip/gic-v3-its: Prevent double free on error
Hyunwoo Kim (2):
net: gtp: Fix Use-After-Free in gtp_dellink
net: openvswitch: Fix Use-After-Free in ovs_ct_exit
Ido Schimmel (9):
mlxsw: core: Unregister EMAD trap using FORWARD action
mlxsw: spectrum_acl_tcam: Fix race during rehash delayed work
mlxsw: spectrum_acl_tcam: Fix possible use-after-free during activity update
mlxsw: spectrum_acl_tcam: Fix possible use-after-free during rehash
mlxsw: spectrum_acl_tcam: Rate limit error message
mlxsw: spectrum_acl_tcam: Fix memory leak during rehash
mlxsw: spectrum_acl_tcam: Fix warning during rehash
mlxsw: spectrum_acl_tcam: Fix incorrect list API usage
mlxsw: spectrum_acl_tcam: Fix memory leak when canceling rehash work
Ilya Maximets (1):
net: openvswitch: fix unwanted error log on timeout policy probing
Iskander Amara (2):
arm64: dts: rockchip: fix alphabetical ordering RK3399 puma
arm64: dts: rockchip: enable internal pull-up for Q7_THRM# on RK3399 Puma
Ismael Luceno (1):
ipvs: Fix checksumming on GSO of SCTP packets
Jeongjun Park (1):
nilfs2: fix OOB in nilfs_set_de_type
Jerry Meng (1):
USB: serial: option: support Quectel EM060K sub-models
Jiri Benc (1):
ipv6: fix race condition between ipv6_get_ifaddr and ipv6_del_addr
Johannes Thumshirn (1):
btrfs: fix information leak in btrfs_ioctl_logical_to_ino()
John Stultz (1):
selftests: timers: Fix abs() warning in posix_timers test
Kai-Heng Feng (1):
usb: Disable USB3 LPM at shutdown
Konrad Dybcio (1):
clk: Print an info line before disabling unused clocks
Kuniyuki Iwashima (3):
af_unix: Do not use atomic ops for unix_sk(sk)->inflight.
af_unix: Suppress false-positive lockdep splat for spin_lock() in __unix_gc().
tcp: Clean up kernel listener's reqsk in inet_twsk_purge()
Lei Chen (1):
tun: limit printing rate when illegal packet received by tun dev
Matthew Wilcox (Oracle) (1):
bounds: Use the right number of bits for power-of-two CONFIG_NR_CPUS
Michael Guralnik (1):
RDMA/mlx5: Fix port number for counter query in multi-port configuration
Michal Luczaj (1):
af_unix: Fix garbage collector racing against connect()
Mikhail Kobuk (1):
drm: nv04: Fix out of bounds access
Mikulas Patocka (1):
dm: limit the number of targets and parameter size area
Minas Harutyunyan (1):
usb: dwc2: host: Fix dereference issue in DDMA completion flow.
Mukul Joshi (1):
drm/amdgpu: Fix leak when GPU memory allocation fails
Nam Cao (1):
HID: i2c-hid: remove I2C_HID_READ_PENDING flag to prevent lock-up
Nathan Chancellor (1):
Bluetooth: Fix type of len in {l2cap,sco}_sock_getsockopt_old()
Nikita Zhandarovich (1):
comedi: vmk80xx: fix incomplete endpoint checking
Paul Geurts (1):
NFC: trf7970a: disable all regulators on removal
Peter Münster (1):
net: b44: set pause params only when interface is up
Petr Tesarik (1):
u64_stats: fix u64_stats_init() for lockdep when used repeatedly in one file
Quentin Schulz (1):
arm64: dts: rockchip: enable internal pull-up on PCIE_WAKE# for RK3399 Puma
Rafał Miłecki (4):
arm64: dts: mediatek: mt7622: fix IR nodename
arm64: dts: mediatek: mt7622: fix ethernet controller "compatible"
arm64: dts: mediatek: mt7622: drop "reset-names" from thermal block
arm64: dts: mediatek: mt2712: fix validation errors
Rahul Rameshbabu (1):
ethernet: Add helper for assigning packet type when dest address does not match device address
Rajneesh Bhardwaj (1):
drm/amdgpu: restrict bo mapping within gpu address limits
Randy Dunlap (1):
serial: core: fix kernel-doc for uart_port_unlock_irqrestore()
Robin H. Johnson (2):
tracing: Show size of requested perf buffer
tracing: Increase PERF_MAX_TRACE_SIZE to handle Sentinel1 and docker together
Samuel Thibault (1):
speakup: Avoid crash on very long word
Shifeng Li (1):
net/mlx5e: Fix a race in command alloc flow
Siddh Raman Pant (1):
Revert "tracing/trigger: Fix to return error if failed to alloc snapshot"
Sindhu Devale (1):
i40e: Do not use WQ_MEM_RECLAIM flag for workqueue
Stephen Boyd (4):
clk: Remove prepare_lock hold assertion in __clk_release()
clk: Mark 'all_lists' as const
clk: Initialize struct clk_core kref earlier
clk: Get runtime PM before walking tree during disable_unused
Sudheer Mogilappagari (1):
iavf: Fix TC config comparison with existing adapter TC config
Sven Eckelmann (1):
batman-adv: Avoid infinite loop trying to resize local TT
Thomas Gleixner (1):
serial: core: Provide port lock wrappers
Vanillan Wang (1):
USB: serial: option: add Rolling RW101-GL and RW135-GL support
Ville Syrjälä (1):
drm/client: Fully protect modes[] with dev->mode_config.mutex
Vitaly Kuznetsov (1):
KVM: async_pf: Cleanup kvm_setup_async_pf()
WangYuli (1):
Bluetooth: btusb: Add Realtek RTL8852BE support ID 0x0bda:0x4853
Wolfram Sang (1):
i2c: smbus: fix NULL function pointer dereference
Yanjun.Zhu (1):
RDMA/rxe: Fix the problem "mutex_destroy missing"
Yick Xie (1):
udp: preserve the connected status if only UDP cmsg
Yuanhe Shu (1):
selftests/ftrace: Limit length in subsystem-enable tests
Zheng Yejian (1):
kprobes: Fix possible use-after-free issue on kprobe registration
Ziyang Xuan (1):
netfilter: nf_tables: Fix potential data-race in __nft_expr_type_get()
bolan wang (1):
USB: serial: option: add Fibocom FM135-GL variants
xinhui pan (1):
drm/amdgpu: validate the parameters of bo mapping operations more clearly
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 274 +SUBLEVEL = 275 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/arc/boot/dts/hsdk.dts +0 -1
@@ -205,7 +205,6 @@ }; gmac: ethernet@8000 { - #interrupt-cells = <1>; compatible = "snps,dwmac"; reg = <0x8000 0x2000>; interrupts = <10>;
arch/arm64/boot/dts/mediatek/mt2712-evb.dts +76 -2
91 lines not on this page · raw message
arch/arm64/boot/dts/mediatek/mt2712e.dtsi +67 -1
83 lines not on this page · raw message
arch/arm64/boot/dts/mediatek/mt7622.dtsi +2 -5
@@ -244,7 +244,7 @@ clock-names = "hif_sel"; }; - cir: cir@10009000 { + cir: ir-receiver@10009000 { compatible = "mediatek,mt7622-cir"; reg = <0 0x10009000 0 0x1000>; interrupts = <GIC_SPI 175 IRQ_TYPE_LEVEL_LOW>;
@@ -507,7 +507,6 @@ <&pericfg CLK_PERI_AUXADC_PD>; clock-names = "therm", "auxadc"; resets = <&pericfg MT7622_PERI_THERM_SW_RST>; - reset-names = "therm"; mediatek,auxadc = <&auxadc>; mediatek,apmixedsys = <&apmixedsys>; nvmem-cells = <&thermal_calibration>;
@@ -901,9 +900,7 @@ }; eth: ethernet@1b100000 { - compatible = "mediatek,mt7622-eth", - "mediatek,mt2701-eth", - "syscon"; + compatible = "mediatek,mt7622-eth"; reg = <0 0x1b100000 0 0x20000>; interrupts = <GIC_SPI 223 IRQ_TYPE_LEVEL_LOW>, <GIC_SPI 224 IRQ_TYPE_LEVEL_LOW>,
arch/arm64/boot/dts/rockchip/rk3399-puma.dtsi +22 -7
@@ -425,16 +425,22 @@ gpio1830-supply = <&vcc_1v8>; }; -&pmu_io_domains { - status = "okay"; - pmu1830-supply = <&vcc_1v8>; -}; - -&pwm2 { - status = "okay"; +&pcie_clkreqn_cpm { + rockchip,pins = + <2 RK_PD2 RK_FUNC_GPIO &pcfg_pull_up>; }; &pinctrl { + pinctrl-names = "default"; + pinctrl-0 = <&q7_thermal_pin>; + + gpios { + q7_thermal_pin: q7-thermal-pin { + rockchip,pins = + <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + i2c8 { i2c8_xfer_a: i2c8-xfer { rockchip,pins =
@@ -465,6 +471,15 @@ }; }; +&pmu_io_domains { + status = "okay"; + pmu1830-supply = <&vcc_1v8>; +}; + +&pwm2 { + status = "okay"; +}; + &sdhci { /* * Signal integrity isn't great at 200MHz but 100MHz has proven stable
arch/x86/include/asm/apic.h +2 -1
@@ -12,6 +12,7 @@#include <asm/mpspec.h> #include <asm/msr.h> #include <asm/hardirq.h> +#include <asm/io.h> #define ARCH_APICTIMER_STOPS_ON_C3 1
@@ -111,7 +112,7 @@ static inline void native_apic_mem_write(u32 reg, u32 v)static inline u32 native_apic_mem_read (u32 reg) { -return *((volatile u32 *)(APIC_BASE + reg)); +return readl ((void __iomem *)(APIC_BASE + reg)); }extern void native_apic_wait_icr_idle (void );
arch/x86/kernel/cpu/cpuid-deps.c +3 -3
@@ -44,7 +44,10 @@ static const struct cpuid_dep cpuid_deps[] = { { X86_FEATURE_F16C, X86_FEATURE_XMM2, }, { X86_FEATURE_AES, X86_FEATURE_XMM2 }, { X86_FEATURE_SHA_NI, X86_FEATURE_XMM2 }, + { X86_FEATURE_GFNI, X86_FEATURE_XMM2 }, { X86_FEATURE_FMA, X86_FEATURE_AVX }, + { X86_FEATURE_VAES, X86_FEATURE_AVX }, + { X86_FEATURE_VPCLMULQDQ, X86_FEATURE_AVX }, { X86_FEATURE_AVX2, X86_FEATURE_AVX, }, { X86_FEATURE_AVX512F, X86_FEATURE_AVX, }, { X86_FEATURE_AVX512IFMA, X86_FEATURE_AVX512F },
@@ -56,9 +59,6 @@ static const struct cpuid_dep cpuid_deps[] = { { X86_FEATURE_AVX512VL, X86_FEATURE_AVX512F }, { X86_FEATURE_AVX512VBMI, X86_FEATURE_AVX512F }, { X86_FEATURE_AVX512_VBMI2, X86_FEATURE_AVX512VL }, - { X86_FEATURE_GFNI, X86_FEATURE_AVX512VL }, - { X86_FEATURE_VAES, X86_FEATURE_AVX512VL }, - { X86_FEATURE_VPCLMULQDQ, X86_FEATURE_AVX512VL }, { X86_FEATURE_AVX512_VNNI, X86_FEATURE_AVX512VL }, { X86_FEATURE_AVX512_BITALG, X86_FEATURE_AVX512VL }, { X86_FEATURE_AVX512_4VNNIW, X86_FEATURE_AVX512F },
crypto/algapi.c +0 -1
@@ -217,7 +217,6 @@ static struct crypto_larval *__crypto_register_alg(struct crypto_alg *alg) }if (!strcmp (q->cra_driver_name, alg->cra_name) || - !strcmp (q->cra_driver_name, alg->cra_driver_name) || !strcmp (q->cra_name, alg->cra_driver_name)) goto err; }
drivers/android/binder.c +3 -1
@@ -2047,8 +2047,10 @@ static size_t binder_get_object(struct binder_proc *proc,size_t object_size =0 ; read_size =min_t (size_t,sizeof (*object), buffer->data_size - offset); -if (offset > buffer->data_size || read_size <sizeof (*hdr)) +if (offset > buffer->data_size || read_size <sizeof (*hdr) || + !IS_ALIGNED (offset,sizeof (u32)))return 0 ; +if (u) {if (copy_from_user (object, u + offset, read_size))return 0 ;
drivers/bluetooth/btusb.c +2 -0
@@ -360,6 +360,8 @@ static const struct usb_device_id blacklist_table[] = {/* Realtek 8852BE Bluetooth devices */ { USB_DEVICE(0x0cb8, 0xc559), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0bda, 0x4853), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0bda, 0x887b), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0bda, 0xb85b), .driver_info = BTUSB_REALTEK |
drivers/clk/clk.c +122 -32
260 lines not on this page · raw message
drivers/dma/idma64.c +4 -0
@@ -167,6 +167,10 @@ static irqreturn_t idma64_irq(int irq, void *dev)u32 status_err;unsigned short i; +/* Since IRQ may be shared, check if DMA controller is powered on */ +if (status ==GENMASK (31 ,0 )) +return IRQ_NONE ; +dev_vdbg (idma64->dma.dev,"%s: status=%#x\n" , __func__, status);/* Check if we have any interrupt from the DMA controller */
drivers/dma/owl-dma.c +2 -2
@@ -238,7 +238,7 @@ static void pchan_update(struct owl_dma_pchan *pchan, u32 reg,else regval &= ~val; -writel (val, pchan->base + reg); +writel (regval, pchan->base + reg); }static void pchan_writel (struct owl_dma_pchan *pchan,u32 reg,u32 data)
@@ -262,7 +262,7 @@ static void dma_update(struct owl_dma *od, u32 reg, u32 val, bool state)else regval &= ~val; -writel (val, od->base + reg); +writel (regval, od->base + reg); }static void dma_writel (struct owl_dma *od,u32 reg,u32 data)
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +1 -0
@@ -1204,6 +1204,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( err_bo_create:unreserve_mem_limit (adev, size, alloc_domain, !!sg); err_reserve_limit: +amdgpu_sync_free (&(*mem)->sync);mutex_destroy (&(*mem)->lock);kfree (*mem); err:
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +46 -24
105 lines not on this page · raw message
drivers/gpu/drm/drm_client_modeset.c +2 -1
@@ -700,6 +700,7 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width,unsigned int total_modes_count =0 ;struct drm_client_offset *offsets;unsigned int connector_count =0 ; +/* points to modes protected by mode_config.mutex */ struct drm_display_mode **modes;struct drm_crtc **crtcs;int i, ret =0 ;
@@ -768,7 +769,6 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width,drm_client_pick_crtcs (client, connectors, connector_count, crtcs, modes,0 , width, height); } -mutex_unlock (&dev->mode_config.mutex);drm_client_modeset_release (client);
@@ -798,6 +798,7 @@ int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, modeset->y = offset->y; } } +mutex_unlock (&dev->mode_config.mutex);mutex_unlock (&client->modeset_mutex); out:
drivers/gpu/drm/nouveau/nouveau_bios.c +7 -6
@@ -23,6 +23,7 @@*/ #include "nouveau_drv.h" +#include "nouveau_bios.h" #include "nouveau_reg.h" #include "dispnv04/hw.h" #include "nouveau_encoder.h"
@@ -1672,7 +1673,7 @@ apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf)*/ if (nv_match_device (dev,0x0201 ,0x1462 ,0x8851 )) {if (*conn ==0xf2005014 && *conf ==0xffffffff ) { -fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS ,1 ,1 ,1 ); +fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS ,1 ,1 ,DCB_OUTPUT_B );return false; } }
@@ -1758,26 +1759,26 @@ fabricate_dcb_encoder_table(struct drm_device *dev, struct nvbios *bios)#ifdef __powerpc__/* Apple iMac G4 NV17 */ if (of_machine_is_compatible ("PowerMac4,5" )) { -fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS ,0 , all_heads,1 ); -fabricate_dcb_output (dcb,DCB_OUTPUT_ANALOG ,1 , all_heads,2 ); +fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS ,0 , all_heads,DCB_OUTPUT_B ); +fabricate_dcb_output (dcb,DCB_OUTPUT_ANALOG ,1 , all_heads,DCB_OUTPUT_C );return ; }#endif /* Make up some sane defaults */ fabricate_dcb_output (dcb,DCB_OUTPUT_ANALOG , - bios->legacy.i2c_indices.crt,1 ,1 ); + bios->legacy.i2c_indices.crt,1 ,DCB_OUTPUT_B );if (nv04_tv_identify (dev, bios->legacy.i2c_indices.tv) >=0 )fabricate_dcb_output (dcb,DCB_OUTPUT_TV , bios->legacy.i2c_indices.tv, - all_heads,0 ); + all_heads,DCB_OUTPUT_A );else if (bios->tmds.output0_script_ptr || bios->tmds.output1_script_ptr)fabricate_dcb_output (dcb,DCB_OUTPUT_TMDS , bios->legacy.i2c_indices.panel, - all_heads,1 ); + all_heads,DCB_OUTPUT_B ); } static int
drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowof.c +6 -1
@@ -66,11 +66,16 @@ of_init(struct nvkm_bios *bios, const char *name)return ERR_PTR (-EINVAL ); } +static void of_fini (void *p) +{ +kfree (p); +} +const struct nvbios_source nvbios_of = { .name ="OpenFirmware" , .init = of_init, - .fini = (void (*)(void *))kfree, + .fini = of_fini, .read = of_read, .size = of_size, .rw = false,
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c +6 -1
@@ -221,8 +221,11 @@ nv50_instobj_acquire(struct nvkm_memory *memory)void __iomem *map =NULL ;/* Already mapped? */ -if (refcount_inc_not_zero (&iobj->maps)) +if (refcount_inc_not_zero (&iobj->maps)) { +/* read barrier match the wmb on refcount set */ +smp_rmb ();return iobj->map; + }/* Take the lock, and re-check that another thread hasn't * already mapped the object in the meantime.
@@ -249,6 +252,8 @@ nv50_instobj_acquire(struct nvkm_memory *memory) iobj->base.memory.ptrs = &nv50_instobj_fast; else iobj->base.memory.ptrs = &nv50_instobj_slow; +/* barrier to ensure the ptrs are written before refcount is set */ +smp_wmb ();refcount_set (&iobj->maps,1 ); }
drivers/hid/i2c-hid/i2c-hid-core.c +0 -8
@@ -56,7 +56,6 @@/* flags */ #define I2C_HID_STARTED 0#define I2C_HID_RESET_PENDING 1 -#define I2C_HID_READ_PENDING 2#define I2C_HID_PWR_ON 0x00#define I2C_HID_PWR_SLEEP 0x01
@@ -258,7 +257,6 @@ static int __i2c_hid_command(struct i2c_client *client, msg[1 ].len = data_len; msg[1 ].buf = buf_recv; msg_num =2 ; -set_bit (I2C_HID_READ_PENDING , &ihid->flags); }if (wait)
@@ -266,9 +264,6 @@ static int __i2c_hid_command(struct i2c_client *client, ret =i2c_transfer (client->adapter, msg, msg_num); -if (data_len >0 ) -clear_bit (I2C_HID_READ_PENDING , &ihid->flags); -if (ret != msg_num)return ret <0 ? ret : -EIO ;
@@ -540,9 +535,6 @@ static irqreturn_t i2c_hid_irq(int irq, void *dev_id) {struct i2c_hid *ihid = dev_id; -if (test_bit (I2C_HID_READ_PENDING , &ihid->flags)) -return IRQ_HANDLED ; -i2c_hid_get_input (ihid);return IRQ_HANDLED ;
drivers/i2c/i2c-core-base.c +6 -6
@@ -1965,13 +1965,18 @@ static int i2c_check_for_quirks(struct i2c_adapter *adap, struct i2c_msg *msgs,* Returns negative errno, else the number of messages executed. * * Adapter lock must be held when calling this function. No debug logging -* takes place. adap->algo->master_xfer existence isn't checked. +* takes place. */ int __i2c_transfer (struct i2c_adapter *adap,struct i2c_msg *msgs,int num) {unsigned long orig_jiffies;int ret, try; +if (!adap->algo->master_xfer) { +dev_dbg (&adap->dev,"I2C level transfers not supported\n" ); +return -EOPNOTSUPP ; + } +if (WARN_ON (!msgs || num <1 ))return -EINVAL ;
@@ -2038,11 +2043,6 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) {int ret; -if (!adap->algo->master_xfer) { -dev_dbg (&adap->dev,"I2C level transfers not supported\n" ); -return -EOPNOTSUPP ; - } -/* REVISIT the fault reporting model here is weak: * * - When we get an error after receiving N bytes from a slave,
drivers/infiniband/hw/mlx5/mad.c +2 -1
@@ -219,7 +219,8 @@ static int process_pma_cmd(struct mlx5_ib_dev *dev, u8 port_num, mdev = dev->mdev; mdev_port_num =1 ; } -if (MLX5_CAP_GEN (dev->mdev, num_ports) ==1 ) { +if (MLX5_CAP_GEN (dev->mdev, num_ports) ==1 && + !mlx5_core_mp_enabled (mdev)) {/* set local port to one for Function-Per-Port HCA. */ mdev = dev->mdev; mdev_port_num =1 ;
drivers/infiniband/sw/rxe/rxe.c +2 -0
@@ -72,6 +72,8 @@ void rxe_dealloc(struct ib_device *ib_dev)if (rxe->tfm)crypto_free_shash (rxe->tfm); + +mutex_destroy (&rxe->usdev_lock); }/* initialize rxe device parameters */
drivers/irqchip/irq-gic-v3-its.c +2 -7
@@ -3121,13 +3121,8 @@ static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virqset_bit (i, bitmap); } -if (err) { -if (i >0 ) -its_vpe_irq_domain_free (domain, virq, i); - -its_lpi_free (bitmap, base, nr_ids); -its_free_prop_table (vprop_page); - } +if (err) +its_vpe_irq_domain_free (domain, virq, i);return err; }
drivers/md/dm-core.h +2 -0
@@ -18,6 +18,8 @@#include "dm.h" #define DM_RESERVED_MAX_IOS 1024 +#define DM_MAX_TARGETS 1048576 +#define DM_MAX_TARGET_PARAMS 1024struct dm_kobject_holder {struct kobject kobj;
drivers/md/dm-ioctl.c +2 -1
@@ -1760,7 +1760,8 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kernif (copy_from_user (param_kernel, user, minimum_data_size))return -EFAULT ; -if (param_kernel->data_size < minimum_data_size) +if (unlikely (param_kernel->data_size < minimum_data_size) || +unlikely (param_kernel->data_size >DM_MAX_TARGETS *DM_MAX_TARGET_PARAMS ))return -EINVAL ; secure_data = param_kernel->flags &DM_SECURE_DATA_FLAG ;
drivers/md/dm-table.c +7 -2
@@ -184,7 +184,12 @@ static int alloc_targets(struct dm_table *t, unsigned int num)int dm_table_create (struct dm_table **result,fmode_t mode,unsigned num_targets,struct mapped_device *md) { -struct dm_table *t =kzalloc (sizeof (*t),GFP_KERNEL ); +struct dm_table *t; + +if (num_targets >DM_MAX_TARGETS ) +return -EOVERFLOW ; + + t =kzalloc (sizeof (*t),GFP_KERNEL );if (!t)return -ENOMEM ;
@@ -199,7 +204,7 @@ int dm_table_create(struct dm_table **result, fmode_t mode,if (!num_targets) {kfree (t); -return -ENOMEM ; +return -EOVERFLOW ; }if (alloc_targets (t, num_targets)) {
drivers/mtd/nand/raw/diskonchip.c +2 -2
@@ -53,7 +53,7 @@ static unsigned long doc_locations[] __initdata = { 0xe8000, 0xea000, 0xec000, 0xee000, #endif #endif - 0xffffffff }; +}; static struct mtd_info *doclist = NULL;
@@ -1666,7 +1666,7 @@ static int __init init_nanddoc(void)if (ret <0 )return ret; }else { -for (i =0 ; (doc_locations[i] !=0xffffffff ); i++) { +for (i =0 ; i <ARRAY_SIZE (doc_locations); i++) {doc_probe (doc_locations[i]); } }
drivers/net/ethernet/amazon/ena/ena_com.c +1 -1
@@ -374,7 +374,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev,ENA_COM_BOUNCE_BUFFER_CNTRL_CNT ; io_sq->bounce_buf_ctrl.next_to_use =0 ; - size = io_sq->bounce_buf_ctrl.buffer_size * + size = (size_t )io_sq->bounce_buf_ctrl.buffer_size * io_sq->bounce_buf_ctrl.buffers_num; dev_node =dev_to_node (ena_dev->dmadev);
drivers/net/ethernet/broadcom/b44.c +8 -6
@@ -2033,12 +2033,14 @@ static int b44_set_pauseparam(struct net_device *dev, bp->flags |=B44_FLAG_TX_PAUSE ; else bp->flags &= ~B44_FLAG_TX_PAUSE; -if (bp->flags &B44_FLAG_PAUSE_AUTO ) { -b44_halt (bp); -b44_init_rings (bp); -b44_init_hw (bp,B44_FULL_RESET ); - }else { -__b44_set_flow_ctrl (bp, bp->flags); +if (netif_running (dev)) { +if (bp->flags &B44_FLAG_PAUSE_AUTO ) { +b44_halt (bp); +b44_init_rings (bp); +b44_init_hw (bp,B44_FULL_RESET ); + }else { +__b44_set_flow_ctrl (bp, bp->flags); + } }spin_unlock_irq (&bp->lock);
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -15971,7 +15971,7 @@ static int __init i40e_init_module(void)* since we need to be able to guarantee forward progress even under * memory pressure. */ - i40e_wq =alloc_workqueue ("%s" ,WQ_MEM_RECLAIM ,0 , i40e_driver_name); + i40e_wq =alloc_workqueue ("%s" ,0 ,0 , i40e_driver_name);if (!i40e_wq) {pr_err ("%s: Failed to create workqueue\n" , i40e_driver_name);return -ENOMEM ;
drivers/net/ethernet/intel/iavf/iavf_main.c +29 -1
@@ -2647,6 +2647,34 @@ static void iavf_del_all_cloud_filters(struct iavf_adapter *adapter)spin_unlock_bh (&adapter->cloud_filter_list_lock); } +/** +* iavf_is_tc_config_same - Compare the mqprio TC config with the +* TC config already configured on this adapter. +* @adapter: board private structure +* @mqprio_qopt: TC config received from kernel. +* +* This function compares the TC config received from the kernel +* with the config already configured on the adapter. +* +* Return: True if configuration is same, false otherwise. +**/ +static bool iavf_is_tc_config_same (struct iavf_adapter *adapter, +struct tc_mqprio_qopt *mqprio_qopt) +{ +struct virtchnl_channel_info *ch = &adapter->ch_config.ch_info[0 ]; +int i; + +if (adapter->num_tc != mqprio_qopt->num_tc) +return false; + +for (i =0 ; i < adapter->num_tc; i++) { +if (ch[i].count != mqprio_qopt->count[i] || + ch[i].offset != mqprio_qopt->offset[i]) +return false; + } +return true; +} +/** * __iavf_setup_tc - configure multiple traffic classes * @netdev: network interface device structure
@@ -2703,7 +2731,7 @@ static int __iavf_setup_tc(struct net_device *netdev, void *type_data)if (ret)return ret;/* Return if same TC config is requested */ -if (adapter->num_tc == num_tc) +if (iavf_is_tc_config_same (adapter, &mqprio_qopt->qopt))return 0 ; adapter->num_tc = num_tc;
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +7 -5
@@ -114,15 +114,18 @@ static u8 alloc_token(struct mlx5_cmd *cmd)return token; } -static int cmd_alloc_index (struct mlx5_cmd *cmd) +static int cmd_alloc_index (struct mlx5_cmd *cmd,struct mlx5_cmd_work_ent *ent) {unsigned long flags;int ret;spin_lock_irqsave (&cmd->alloc_lock, flags); ret =find_first_bit (&cmd->bitmask, cmd->max_reg_cmds); -if (ret < cmd->max_reg_cmds) +if (ret < cmd->max_reg_cmds) {clear_bit (ret, &cmd->bitmask); + ent->idx = ret; + cmd->ent_arr[ent->idx] = ent; + }spin_unlock_irqrestore (&cmd->alloc_lock, flags);return ret < cmd->max_reg_cmds ? ret : -ENOMEM ;
@@ -905,7 +908,7 @@ static void cmd_work_handler(struct work_struct *work) sem = ent->page_queue ? &cmd->pages_sem : &cmd->sem;down (sem);if (!ent->page_queue) { - alloc_ret =cmd_alloc_index (cmd); + alloc_ret =cmd_alloc_index (cmd, ent);if (alloc_ret <0 ) {mlx5_core_err (dev,"failed to allocate command entry\n" );if (ent->callback) {
@@ -920,15 +923,14 @@ static void cmd_work_handler(struct work_struct *work)up (sem);return ; } - ent->idx = alloc_ret; }else { ent->idx = cmd->max_reg_cmds;spin_lock_irqsave (&cmd->alloc_lock, flags);clear_bit (ent->idx, &cmd->bitmask); + cmd->ent_arr[ent->idx] = ent;spin_unlock_irqrestore (&cmd->alloc_lock, flags); } - cmd->ent_arr[ent->idx] = ent; lay =get_inst (cmd, ent->idx); ent->lay = lay;memset (lay,0 ,sizeof (*lay));
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +2 -1
@@ -1549,8 +1549,9 @@ static struct mlx5_flow_handle *add_rule_fg(struct mlx5_flow_group *fg, }trace_mlx5_fs_set_fte (fte, false); +/* Link newly added rules into the tree. */ for (i =0 ; i < handle->num_rules; i++) { -if (refcount_read (&handle->rule[i]->node.refcount) ==1 ) { +if (!handle->rule[i]->node.parent) {tree_add_node (&handle->rule[i]->node, &fte->node);trace_mlx5_fs_add_rule (handle->rule[i]); }
drivers/net/ethernet/mellanox/mlxsw/core.c +1 -1
@@ -566,7 +566,7 @@ static void mlxsw_emad_rx_listener_func(struct sk_buff *skb, u8 local_port,static const struct mlxsw_listener mlxsw_emad_rx_listener =MLXSW_RXL (mlxsw_emad_rx_listener_func,ETHEMAD ,TRAP_TO_CPU , false, -EMAD ,DISCARD ); +EMAD ,FORWARD );static int mlxsw_emad_init (struct mlxsw_core *mlxsw_core) {
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +45 -9
156 lines not on this page · raw message
drivers/net/geneve.c +2 -2
@@ -904,7 +904,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,__be16 sport;int err; -if (!pskb_inet_may_pull (skb)) +if (!skb_vlan_inet_prepare (skb))return -EINVAL ; sport =udp_flow_src_port (geneve->net, skb,1 ,USHRT_MAX , true);
@@ -970,7 +970,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,__be16 sport;int err; -if (!pskb_inet_may_pull (skb)) +if (!skb_vlan_inet_prepare (skb))return -EINVAL ; sport =udp_flow_src_port (geneve->net, skb,1 ,USHRT_MAX , true);
drivers/net/gtp.c +2 -1
@@ -706,11 +706,12 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,static void gtp_dellink (struct net_device *dev,struct list_head *head) {struct gtp_dev *gtp =netdev_priv (dev); +struct hlist_node *next;struct pdp_ctx *pctx;int i;for (i =0 ; i < gtp->hash_size; i++) -hlist_for_each_entry_rcu (pctx, >p->tid_hash[i], hlist_tid) +hlist_for_each_entry_safe (pctx, next, >p->tid_hash[i], hlist_tid)pdp_context_delete (pctx);list_del_rcu (>p->list);
drivers/net/tun.c +10 -8
@@ -2208,14 +2208,16 @@ static ssize_t tun_put_user(struct tun_struct *tun, tun_is_little_endian(tun), true, vlan_hlen)) {struct skb_shared_info *sinfo =skb_shinfo (skb); -pr_err ("unexpected GSO type: " -"0x%x, gso_size %d, hdr_len %d\n" , - sinfo->gso_type,tun16_to_cpu (tun, gso.gso_size), -tun16_to_cpu (tun, gso.hdr_len)); -print_hex_dump (KERN_ERR ,"tun: " , -DUMP_PREFIX_NONE , -16 ,1 , skb->head, -min ((int )tun16_to_cpu (tun, gso.hdr_len),64 ), true); + +if (net_ratelimit ()) { +netdev_err (tun->dev,"unexpected GSO type: 0x%x, gso_size %d, hdr_len %d\n" , + sinfo->gso_type,tun16_to_cpu (tun, gso.gso_size), +tun16_to_cpu (tun, gso.hdr_len)); +print_hex_dump (KERN_ERR ,"tun: " , +DUMP_PREFIX_NONE , +16 ,1 , skb->head, +min ((int )tun16_to_cpu (tun, gso.hdr_len),64 ), true); + }WARN_ON_ONCE (1 );return -EINVAL ; }
drivers/net/usb/ax88179_178a.c +3 -8
@@ -1452,21 +1452,16 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)/* Skip IP alignment pseudo header */ skb_pull (skb,2 ); - skb->truesize =SKB_TRUESIZE (pkt_len_plus_padd);ax88179_rx_checksum (skb, pkt_hdr);return 1 ; } - ax_skb =skb_clone (skb,GFP_ATOMIC ); + ax_skb =netdev_alloc_skb_ip_align (dev->net, pkt_len);if (!ax_skb)return 0 ; -skb_trim (ax_skb, pkt_len); +skb_put (ax_skb, pkt_len); +memcpy (ax_skb->data, skb->data +2 , pkt_len); -/* Skip IP alignment pseudo header */ -skb_pull (ax_skb,2 ); - - skb->truesize = pkt_len_plus_padd + -SKB_DATA_ALIGN (sizeof (struct sk_buff ));ax88179_rx_checksum (ax_skb, pkt_hdr);usbnet_skb_return (dev, ax_skb);
drivers/net/vxlan.c +4 -0
@@ -1605,6 +1605,10 @@ static bool vxlan_set_mac(struct vxlan_dev *vxlan,if (ether_addr_equal (eth_hdr (skb)->h_source, vxlan->dev->dev_addr))return false; +/* Ignore packets from invalid src-address */ +if (!is_valid_ether_addr (eth_hdr (skb)->h_source)) +return false; +/* Get address from the outer IP header */ if (vxlan_get_sk_family (vs) ==AF_INET ) { saddr.sin.sin_addr.s_addr =ip_hdr (skb)->saddr;
drivers/nfc/trf7970a.c +23 -19
103 lines not on this page · raw message
drivers/staging/comedi/drivers/vmk80xx.c +12 -23
@@ -642,33 +642,22 @@ static int vmk80xx_find_usb_endpoints(struct comedi_device *dev)struct vmk80xx_private *devpriv = dev->private;struct usb_interface *intf =comedi_to_usb_interface (dev);struct usb_host_interface *iface_desc = intf->cur_altsetting; -struct usb_endpoint_descriptor *ep_desc; -int i; - -if (iface_desc->desc.bNumEndpoints !=2 ) -return -ENODEV ; - -for (i =0 ; i < iface_desc->desc.bNumEndpoints; i++) { - ep_desc = &iface_desc->endpoint[i].desc; - -if (usb_endpoint_is_int_in (ep_desc) || -usb_endpoint_is_bulk_in (ep_desc)) { -if (!devpriv->ep_rx) - devpriv->ep_rx = ep_desc; -continue ; - } +struct usb_endpoint_descriptor *ep_rx_desc, *ep_tx_desc; +int ret; -if (usb_endpoint_is_int_out (ep_desc) || -usb_endpoint_is_bulk_out (ep_desc)) { -if (!devpriv->ep_tx) - devpriv->ep_tx = ep_desc; -continue ; - } - } +if (devpriv->model ==VMK8061_MODEL ) + ret =usb_find_common_endpoints (iface_desc, &ep_rx_desc, + &ep_tx_desc,NULL ,NULL ); +else + ret =usb_find_common_endpoints (iface_desc,NULL ,NULL , + &ep_rx_desc, &ep_tx_desc); -if (!devpriv->ep_rx || !devpriv->ep_tx) +if (ret)return -ENODEV ; + devpriv->ep_rx = ep_rx_desc; + devpriv->ep_tx = ep_tx_desc; +if (!usb_endpoint_maxp (devpriv->ep_rx) || !usb_endpoint_maxp (devpriv->ep_tx))return -EINVAL ;
drivers/staging/speakup/main.c +1 -1
@@ -577,7 +577,7 @@ static u_long get_word(struct vc_data *vc) } attr_ch =get_char (vc, (u_short *)tmp_pos, &spk_attr); buf[cnt++] = attr_ch; -while (tmpx < vc->vc_cols -1 ) { +while (tmpx < vc->vc_cols -1 && cnt <sizeof (buf) -1 ) { tmp_pos +=2 ; tmpx++; ch =get_char (vc, (u_short *)tmp_pos, &temp);
drivers/tty/serial/mxs-auart.c +6 -2
@@ -1126,11 +1126,13 @@ static void mxs_auart_set_ldisc(struct uart_port *port,static irqreturn_t mxs_auart_irq_handle (int irq,void *context) { -u32 istat; +u32 istat, stat;struct mxs_auart_port *s = context;u32 mctrl_temp = s->mctrl_prev; -u32 stat =mxs_read (s,REG_STAT ); +uart_port_lock (&s->port); + + stat =mxs_read (s,REG_STAT ); istat =mxs_read (s,REG_INTR );/* ack irq */
@@ -1166,6 +1168,8 @@ static irqreturn_t mxs_auart_irq_handle(int irq, void *context) istat &= ~AUART_INTR_TXIS ; } +uart_port_unlock (&s->port); +return IRQ_HANDLED ; }
drivers/tty/serial/pmac_zilog.c +0 -14
@@ -220,7 +220,6 @@ static bool pmz_receive_chars(struct uart_pmac_port *uap) {struct tty_port *port;unsigned char ch, r1, drop, flag; -int loops =0 ;/* Sanity check, make sure the old bug is no longer happening */ if (uap->port.state ==NULL ) {
@@ -301,24 +300,11 @@ static bool pmz_receive_chars(struct uart_pmac_port *uap)if (r1 & Rx_OVR)tty_insert_flip_char (port,0 ,TTY_OVERRUN ); next_char: -/* We can get stuck in an infinite loop getting char 0 when the -* line is in a wrong HW state, we break that here. -* When that happens, I disable the receive side of the driver. -* Note that what I've been experiencing is a real irq loop where -* I'm getting flooded regardless of the actual port speed. -* Something strange is going on with the HW -*/ -if ((++loops) >1000 ) - goto flood; ch =read_zsreg (uap,R0 );if (!(ch & Rx_CH_AV))break ; } -return true; - flood: -pmz_interrupt_control (uap,0 ); -pmz_error ("pmz: rx irq flood !\n" );return true; }
drivers/usb/class/cdc-wdm.c +1 -5
@@ -471,7 +471,6 @@ static ssize_t wdm_writestatic int service_outstanding_interrupt (struct wdm_device *desc) {int rv =0 ; -int used;/* submit read urb only if the device is waiting for it */ if (!desc->resp_count || !--desc->resp_count)
@@ -486,10 +485,7 @@ static int service_outstanding_interrupt(struct wdm_device *desc) goto out; } - used =test_and_set_bit (WDM_RESPONDING , &desc->flags); -if (used) - goto out; - +set_bit (WDM_RESPONDING , &desc->flags);spin_unlock_irq (&desc->iuspin); rv =usb_submit_urb (desc->response,GFP_KERNEL );spin_lock_irq (&desc->iuspin);
drivers/usb/core/port.c +3 -1
@@ -295,8 +295,10 @@ static void usb_port_shutdown(struct device *dev) {struct usb_port *port_dev =to_usb_port (dev); -if (port_dev->child) +if (port_dev->child) {usb_disable_usb2_hardware_lpm (port_dev->child); +usb_unlocked_disable_lpm (port_dev->child); + } }static const struct dev_pm_ops usb_port_pm_ops = {
drivers/usb/dwc2/hcd_ddma.c +3 -1
@@ -897,13 +897,15 @@ static int dwc2_cmpl_host_isoc_dma_desc(struct dwc2_hsotg *hsotg,struct dwc2_dma_desc *dma_desc;struct dwc2_hcd_iso_packet_desc *frame_desc;u16 frame_desc_idx; -struct urb *usb_urb = qtd->urb->priv; +struct urb *usb_urb;u16 remain =0 ;int rc =0 ;if (!qtd->urb)return -EINVAL ; + usb_urb = qtd->urb->priv; + dma_sync_single_for_cpu(hsotg->dev, qh->desc_list_dma + (idx * sizeof(struct dwc2_dma_desc)), sizeof(struct dwc2_dma_desc),
drivers/usb/serial/option.c +40 -0
@@ -255,6 +255,10 @@ static void option_instat_callback(struct urb *urb);#define QUECTEL_PRODUCT_EM061K_LMS 0x0124#define QUECTEL_PRODUCT_EC25 0x0125#define QUECTEL_PRODUCT_EM060K_128 0x0128 +#define QUECTEL_PRODUCT_EM060K_129 0x0129 +#define QUECTEL_PRODUCT_EM060K_12a 0x012a +#define QUECTEL_PRODUCT_EM060K_12b 0x012b +#define QUECTEL_PRODUCT_EM060K_12c 0x012c#define QUECTEL_PRODUCT_EG91 0x0191#define QUECTEL_PRODUCT_EG95 0x0195#define QUECTEL_PRODUCT_BG96 0x0296
@@ -1218,6 +1222,18 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0xff, 0x30) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0x00, 0x40) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0xff, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_129, 0xff, 0xff, 0x30) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_129, 0xff, 0x00, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_129, 0xff, 0xff, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12a, 0xff, 0xff, 0x30) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12a, 0xff, 0x00, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12a, 0xff, 0xff, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12b, 0xff, 0xff, 0x30) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12b, 0xff, 0x00, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12b, 0xff, 0xff, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12c, 0xff, 0xff, 0x30) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12c, 0xff, 0x00, 0x40) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12c, 0xff, 0xff, 0x40) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0xff, 0x30) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0x00, 0x40) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0xff, 0x40) },
@@ -1360,6 +1376,12 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(2) | RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1083, 0xff), /* Telit FE990 (ECM) */ .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a0, 0xff), /* Telit FN20C04 (rmnet) */ + .driver_info = RSVD(0) | NCTRL(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a4, 0xff), /* Telit FN20C04 (rmnet) */ + .driver_info = RSVD(0) | NCTRL(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a9, 0xff), /* Telit FN20C04 (rmnet) */ + .driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) }, { 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),
@@ -2052,6 +2074,10 @@ static const struct usb_device_id option_ids[] = { .driver_info = RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(LONGCHEER_VENDOR_ID, 0x9803, 0xff), .driver_info = RSVD(4) }, + { USB_DEVICE(LONGCHEER_VENDOR_ID, 0x9b05), /* Longsung U8300 */ + .driver_info = RSVD(4) | RSVD(5) }, + { USB_DEVICE(LONGCHEER_VENDOR_ID, 0x9b3c), /* Longsung U9300 */ + .driver_info = RSVD(0) | RSVD(4) }, { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, { USB_DEVICE(LONGCHEER_VENDOR_ID, IBALL_3_5G_CONNECT) }, { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) },
@@ -2272,15 +2298,29 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) }, /* Fibocom FM160 (MBIM mode) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0115, 0xff), /* Fibocom FM135 (laptop MBIM) */ + .driver_info = RSVD(5) }, { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a3, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff), /* Fibocom FM101-GL (laptop MBIM) */ .driver_info = RSVD(4) }, + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a04, 0xff) }, /* Fibocom FM650-CN (ECM mode) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a05, 0xff) }, /* Fibocom FM650-CN (NCM mode) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a06, 0xff) }, /* Fibocom FM650-CN (RNDIS mode) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a07, 0xff) }, /* Fibocom FM650-CN (MBIM mode) */ { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) }, /* GosunCn GM500 ECM/NCM */ + { USB_DEVICE(0x33f8, 0x0104), /* Rolling RW101-GL (laptop RMNET) */ + .driver_info = RSVD(4) | RSVD(5) }, + { USB_DEVICE_INTERFACE_CLASS(0x33f8, 0x01a2, 0xff) }, /* Rolling RW101-GL (laptop MBIM) */ + { USB_DEVICE_INTERFACE_CLASS(0x33f8, 0x01a3, 0xff) }, /* Rolling RW101-GL (laptop MBIM) */ + { USB_DEVICE_INTERFACE_CLASS(0x33f8, 0x01a4, 0xff), /* Rolling RW101-GL (laptop MBIM) */ + .driver_info = RSVD(4) }, + { USB_DEVICE_INTERFACE_CLASS(0x33f8, 0x0115, 0xff), /* Rolling RW135-GL (laptop MBIM) */ + .driver_info = RSVD(5) }, { USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) }, { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) }, { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x40) },
drivers/vhost/vhost.c +11 -1
@@ -2519,9 +2519,19 @@ bool vhost_vq_avail_empty(struct vhost_dev *dev, struct vhost_virtqueue *vq) r =vhost_get_avail_idx (vq, &avail_idx);if (unlikely (r))return false; + vq->avail_idx =vhost16_to_cpu (vq, avail_idx); +if (vq->avail_idx != vq->last_avail_idx) { +/* Since we have updated avail_idx, the following +* call to vhost_get_vq_desc() will read available +* ring entries. Make sure that read happens after +* the avail_idx read. +*/ +smp_rmb (); +return false; + } -return vq->avail_idx == vq->last_avail_idx; +return true; }EXPORT_SYMBOL_GPL (vhost_vq_avail_empty);
fs/btrfs/backref.c +3 -9
@@ -2291,20 +2291,14 @@ struct btrfs_data_container *init_data_container(u32 total_bytes)size_t alloc_bytes; alloc_bytes =max_t (size_t, total_bytes,sizeof (*data)); - data =kvmalloc (alloc_bytes,GFP_KERNEL ); + data =kvzalloc (alloc_bytes,GFP_KERNEL );if (!data)return ERR_PTR (-ENOMEM ); -if (total_bytes >=sizeof (*data)) { +if (total_bytes >=sizeof (*data)) data->bytes_left = total_bytes -sizeof (*data); - data->bytes_missing =0 ; - }else { +else data->bytes_missing =sizeof (*data) - total_bytes; - data->bytes_left =0 ; - } - - data->elem_cnt =0 ; - data->elem_missed =0 ;return data; }
fs/btrfs/delayed-inode.c +3 -0
@@ -1137,6 +1137,9 @@ __btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,if (ret)return ret; + ret =btrfs_record_root_in_trans (trans, node->root); +if (ret) +return ret; ret =btrfs_update_delayed_inode (trans, node->root, path, node);return ret; }
fs/btrfs/qgroup.c +2 -0
@@ -4061,6 +4061,8 @@ void btrfs_qgroup_convert_reserved_meta(struct btrfs_root *root, int num_bytes) BTRFS_QGROUP_RSV_META_PREALLOC);trace_qgroup_meta_convert (root, num_bytes);qgroup_convert_meta (fs_info, root->root_key.objectid, num_bytes); +if (!sb_rdonly (fs_info->sb)) +add_root_meta_rsv (root, num_bytes,BTRFS_QGROUP_RSV_META_PERTRANS ); }/*
fs/nilfs2/dir.c +1 -1
@@ -243,7 +243,7 @@ nilfs_filetype_table[NILFS_FT_MAX] = {#define S_SHIFT 12static unsigned char -nilfs_type_by_mode[S_IFMT >>S_SHIFT ] = { +nilfs_type_by_mode[(S_IFMT >>S_SHIFT ) +1 ] = { [S_IFREG >>S_SHIFT ] =NILFS_FT_REG_FILE , [S_IFDIR >>S_SHIFT ] =NILFS_FT_DIR , [S_IFCHR >>S_SHIFT ] =NILFS_FT_CHRDEV ,
fs/sysfs/file.c +2 -0
@@ -429,6 +429,8 @@ struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj, kn =kernfs_find_and_get (kobj->sd, attr->name);if (kn)kernfs_break_active_protection (kn); +else +kobject_put (kobj);return kn; }EXPORT_SYMBOL_GPL (sysfs_break_active_protection);
include/linux/etherdevice.h +25 -0
@@ -531,6 +531,31 @@ static inline unsigned long compare_ether_header(const void *a, const void *b)#endif } +/** +* eth_skb_pkt_type - Assign packet type if destination address does not match +* @skb: Assigned a packet type if address does not match @dev address +* @dev: Network device used to compare packet address against +* +* If the destination MAC address of the packet does not match the network +* device address, assign an appropriate packet type. +*/ +static inline void eth_skb_pkt_type (struct sk_buff *skb, +const struct net_device *dev) +{ +const struct ethhdr *eth =eth_hdr (skb); + +if (unlikely (!ether_addr_equal_64bits (eth->h_dest, dev->dev_addr))) { +if (unlikely (is_multicast_ether_addr_64bits (eth->h_dest))) { +if (ether_addr_equal_64bits (eth->h_dest, dev->broadcast)) + skb->pkt_type =PACKET_BROADCAST ; +else + skb->pkt_type =PACKET_MULTICAST ; + }else { + skb->pkt_type =PACKET_OTHERHOST ; + } + } +} +/** * eth_skb_pad - Pad buffer to mininum number of octets for Ethernet frame * @skb: Buffer to pad
include/linux/serial_core.h +79 -0
85 lines not on this page · raw message
include/linux/trace_events.h +1 -1
@@ -427,7 +427,7 @@ struct trace_event_file { } \ early_initcall(trace_init_perf_perm_##name); -#define PERF_MAX_TRACE_SIZE 2048 +#define PERF_MAX_TRACE_SIZE 8192#define MAX_FILTER_STR_VAL 256/* Should handle KSYM_SYMBOL_LEN */
include/linux/u64_stats_sync.h +5 -1
@@ -70,7 +70,11 @@ struct u64_stats_sync {#if BITS_PER_LONG ==32 && defined(CONFIG_SMP ) -#define u64_stats_init (syncp) seqcount_init(&(syncp)->seq) +#define u64_stats_init (syncp) \ + do { \ + struct u64_stats_sync *__s = (syncp); \ + seqcount_init(&__s->seq); \ + } while (0)#else static inline void u64_stats_init (struct u64_stats_sync *syncp) {
include/net/addrconf.h +4 -0
@@ -431,6 +431,10 @@ static inline void in6_ifa_hold(struct inet6_ifaddr *ifp)refcount_inc (&ifp->refcnt); } +static inline bool in6_ifa_hold_safe (struct inet6_ifaddr *ifp) +{ +return refcount_inc_not_zero (&ifp->refcnt); +}/* * compute link-local solicited-node multicast address
include/net/af_unix.h +4 -1
@@ -52,7 +52,7 @@ struct unix_sock {struct mutex iolock, bindlock;struct sock *peer;struct list_head link; -atomic_long_t inflight; +unsigned long inflight;spinlock_t lock;unsigned long gc_flags;#define UNIX_GC_CANDIDATE 0
@@ -72,6 +72,9 @@ enum unix_socket_lock_class {U_LOCK_NORMAL ,U_LOCK_SECOND ,/* for double locking, see unix_state_double_lock(). */ U_LOCK_DIAG ,/* used while dumping icons, see sk_diag_dump_icons(). */ + U_LOCK_GC_LISTENER, /* used for listening socket while determining gc + * candidates to close a small race window. + */ }; static inline void unix_state_lock_nested(struct sock *sk,
include/net/ip_tunnels.h +33 -0
@@ -329,6 +329,39 @@ static inline bool pskb_inet_may_pull(struct sk_buff *skb)return pskb_network_may_pull (skb, nhlen); } +/* Variant of pskb_inet_may_pull(). +*/ +static inline bool skb_vlan_inet_prepare (struct sk_buff *skb) +{ +int nhlen =0 , maclen =ETH_HLEN ; +__be16 type = skb->protocol; + +/* Essentially this is skb_protocol(skb, true) +* And we get MAC len. +*/ +if (eth_type_vlan (type)) + type =__vlan_get_protocol (skb, type, &maclen); + +switch (type) { +#if IS_ENABLED (CONFIG_IPV6 ) +case htons (ETH_P_IPV6 ): + nhlen =sizeof (struct ipv6hdr ); +break ; +#endif +case htons (ETH_P_IP ): + nhlen =sizeof (struct iphdr ); +break ; + } +/* For ETH_P_IPV6/ETH_P_IP we make sure to pull +* a base network header in skb->head. +*/ +if (!pskb_may_pull (skb, maclen + nhlen)) +return false; + +skb_set_network_header (skb, maclen); +return true; +} +static inline int ip_encap_hlen (struct ip_tunnel_encap *e) {const struct ip_tunnel_encap_ops *ops;
kernel/bounds.c +1 -1
@@ -19,7 +19,7 @@ int main(void)DEFINE (NR_PAGEFLAGS , __NR_PAGEFLAGS);DEFINE (MAX_NR_ZONES , __MAX_NR_ZONES);#ifdef CONFIG_SMP -DEFINE (NR_CPUS_BITS ,bits_per (CONFIG_NR_CPUS )); +DEFINE (NR_CPUS_BITS ,order_base_2 (CONFIG_NR_CPUS ));#endif DEFINE (SPINLOCK_SIZE ,sizeof (spinlock_t));/* End of constants */
kernel/kprobes.c +12 -6
@@ -1593,10 +1593,17 @@ static int check_kprobe_address_safe(struct kprobe *p,jump_label_lock ();preempt_disable (); -/* Ensure it is not in reserved area nor out of text */ -if (!(core_kernel_text ((unsigned long ) p->addr) || -is_module_text_address ((unsigned long ) p->addr)) || -in_gate_area_no_mm ((unsigned long ) p->addr) || +/* Ensure the address is in a text area, and find a module if exists. */ + *probed_mod =NULL ; +if (!core_kernel_text ((unsigned long ) p->addr)) { + *probed_mod =__module_text_address ((unsigned long ) p->addr); +if (!(*probed_mod)) { + ret = -EINVAL ; + goto out; + } + } +/* Ensure it is not in reserved area. */ +if (in_gate_area_no_mm ((unsigned long ) p->addr) ||within_kprobe_blacklist ((unsigned long ) p->addr) ||jump_label_text_reserved (p->addr, p->addr) ||find_bug ((unsigned long )p->addr)) {
@@ -1604,8 +1611,7 @@ static int check_kprobe_address_safe(struct kprobe *p, goto out; } -/* Check if are we probing a module */ - *probed_mod =__module_text_address ((unsigned long ) p->addr); +/* Get module refcount and reject __init functions for loaded modules. */ if (*probed_mod) {/* * We must hold a refcount of the probed module while updating
kernel/trace/trace_event_perf.c +2 -1
@@ -395,7 +395,8 @@ void *perf_trace_buf_alloc(int size, struct pt_regs **regs, int *rctxp)BUILD_BUG_ON (PERF_MAX_TRACE_SIZE %sizeof (unsigned long ));if (WARN_ONCE (size >PERF_MAX_TRACE_SIZE , -"perf buffer not large enough" )) +"perf buffer not large enough, wanted %d, have %d" , + size,PERF_MAX_TRACE_SIZE ))return NULL ; *rctxp = rctx =perf_swevent_get_recursion_context ();
kernel/trace/trace_events_trigger.c +2 -4
@@ -1140,10 +1140,8 @@ register_snapshot_trigger(char *glob, struct event_trigger_ops *ops, struct event_trigger_data *data, struct trace_event_file *file) { - int ret = tracing_alloc_snapshot_instance(file->tr); - -if (ret <0 ) -return ret; + if (tracing_alloc_snapshot_instance(file->tr) != 0) + return 0; return register_trigger(glob, ops, data, file); }
lib/stackdepot.c +2 -2
@@ -259,10 +259,10 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries,/* * Zero out zone modifiers, as we don't have specific zone * requirements. Keep the flags related to allocation in atomic -* contexts and I/O. +* contexts, I/O, nolockdep. */ alloc_flags &= ~GFP_ZONEMASK ; - alloc_flags &= (GFP_ATOMIC |GFP_KERNEL ); + alloc_flags &= (GFP_ATOMIC |GFP_KERNEL | __GFP_NOLOCKDEP); alloc_flags |= __GFP_NOWARN; page =alloc_pages (alloc_flags,STACK_ALLOC_ORDER );if (page)
net/batman-adv/translation-table.c +1 -1
@@ -4190,7 +4190,7 @@ void batadv_tt_local_resize_to_mtu(struct net_device *soft_iface)spin_lock_bh (&bat_priv->tt.commit_lock); -while (true) { +while (timeout) { table_size =batadv_tt_local_table_transmit_size (bat_priv);if (packet_size_max >= table_size)break ;
net/bluetooth/hci_request.c +3 -1
@@ -107,8 +107,10 @@ static void hci_req_sync_complete(struct hci_dev *hdev, u8 result, u16 opcode,if (hdev->req_status ==HCI_REQ_PEND ) { hdev->req_result = result; hdev->req_status =HCI_REQ_DONE ; -if (skb) +if (skb) { +kfree_skb (hdev->req_skb); hdev->req_skb =skb_get (skb); + }wake_up_interruptible (&hdev->req_wait_q); } }
net/bluetooth/l2cap_sock.c +4 -3
@@ -405,7 +405,8 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,struct l2cap_chan *chan =l2cap_pi (sk)->chan;struct l2cap_options opts;struct l2cap_conninfo cinfo; -int len, err =0 ; +int err =0 ; +size_t len;u32 opt;BT_DBG ("sk %p" , sk);
@@ -450,7 +451,7 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, opts.max_tx = chan->max_tx; opts.txwin_size = chan->tx_win; - len = min_t(unsigned int, len, sizeof(opts)); + len =min (len,sizeof (opts));if (copy_to_user (optval, (char *) &opts, len)) err = -EFAULT ;
@@ -500,7 +501,7 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, cinfo.hci_handle = chan->conn->hcon->handle;memcpy (cinfo.dev_class, chan->conn->hcon->dev_class,3 ); - len = min_t(unsigned int, len, sizeof(cinfo)); + len =min (len,sizeof (cinfo));if (copy_to_user (optval, (char *) &cinfo, len)) err = -EFAULT ;
net/bluetooth/sco.c +4 -3
@@ -880,7 +880,8 @@ static int sco_sock_getsockopt_old(struct socket *sock, int optname,struct sock *sk = sock->sk;struct sco_options opts;struct sco_conninfo cinfo; -int len, err =0 ; +int err =0 ; +size_t len;BT_DBG ("sk %p" , sk);
@@ -902,7 +903,7 @@ static int sco_sock_getsockopt_old(struct socket *sock, int optname,BT_DBG ("mtu %d" , opts.mtu); - len = min_t(unsigned int, len, sizeof(opts)); + len =min (len,sizeof (opts));if (copy_to_user (optval, (char *)&opts, len)) err = -EFAULT ;
@@ -920,7 +921,7 @@ static int sco_sock_getsockopt_old(struct socket *sock, int optname, cinfo.hci_handle =sco_pi (sk)->conn->hcon->handle;memcpy (cinfo.dev_class,sco_pi (sk)->conn->hcon->dev_class,3 ); - len = min_t(unsigned int, len, sizeof(cinfo)); + len =min (len,sizeof (cinfo));if (copy_to_user (optval, (char *)&cinfo, len)) err = -EFAULT ;
net/ethernet/eth.c +1 -11
@@ -164,17 +164,7 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) eth = (struct ethhdr *)skb->data;skb_pull_inline (skb,ETH_HLEN ); -if (unlikely (!ether_addr_equal_64bits (eth->h_dest, - dev->dev_addr))) { -if (unlikely (is_multicast_ether_addr_64bits (eth->h_dest))) { -if (ether_addr_equal_64bits (eth->h_dest, dev->broadcast)) - skb->pkt_type =PACKET_BROADCAST ; -else - skb->pkt_type =PACKET_MULTICAST ; - }else { - skb->pkt_type =PACKET_OTHERHOST ; - } - } +eth_skb_pkt_type (skb, dev);/* * Some variants of DSA tagging don't have an ethertype field
net/ipv4/inet_timewait_sock.c +21 -11
@@ -254,12 +254,12 @@ void __inet_twsk_schedule(struct inet_timewait_sock *tw, int timeo, bool rearm) }EXPORT_SYMBOL_GPL (__inet_twsk_schedule); +/* Remove all non full sockets (TIME_WAIT and NEW_SYN_RECV) for dead netns */ void inet_twsk_purge (struct inet_hashinfo *hashinfo,int family) { -struct inet_timewait_sock *tw; -struct sock *sk;struct hlist_nulls_node *node;unsigned int slot; +struct sock *sk;for (slot =0 ; slot <= hashinfo->ehash_mask; slot++) {struct inet_ehash_bucket *head = &hashinfo->ehash[slot];
@@ -268,25 +268,35 @@ void inet_twsk_purge(struct inet_hashinfo *hashinfo, int family)rcu_read_lock (); restart:sk_nulls_for_each_rcu (sk, node, &head->chain) { -if (sk->sk_state !=TCP_TIME_WAIT ) +int state =inet_sk_state_load (sk); + +if ((1 << state) & ~(TCPF_TIME_WAIT | +TCPF_NEW_SYN_RECV ))continue ; - tw =inet_twsk (sk); -if ((tw->tw_family != family) || -refcount_read (&twsk_net (tw)->count)) + +if (sk->sk_family != family || +refcount_read (&sock_net (sk)->count))continue ; -if (unlikely (!refcount_inc_not_zero (&tw->tw_refcnt))) +if (unlikely (!refcount_inc_not_zero (&sk->sk_refcnt)))continue ; -if (unlikely ((tw->tw_family != family) || -refcount_read (&twsk_net (tw)->count))) { -inet_twsk_put (tw); +if (unlikely (sk->sk_family != family || +refcount_read (&sock_net (sk)->count))) { +sock_gen_put (sk); goto restart; }rcu_read_unlock ();local_bh_disable (); -inet_twsk_deschedule_put (tw); +if (state ==TCP_TIME_WAIT ) { +inet_twsk_deschedule_put (inet_twsk (sk)); + }else { +struct request_sock *req =inet_reqsk (sk); + +inet_csk_reqsk_queue_drop_and_put (req->rsk_listener, + req); + }local_bh_enable (); goto restart_rcu; }
net/ipv4/route.c +1 -3
@@ -945,13 +945,11 @@ void ip_rt_send_redirect(struct sk_buff *skb)icmp_send (skb,ICMP_REDIRECT ,ICMP_REDIR_HOST , gw); peer->rate_last = jiffies; ++peer->n_redirects; -#ifdef CONFIG_IP_ROUTE_VERBOSE -if (log_martians && +if (IS_ENABLED (CONFIG_IP_ROUTE_VERBOSE ) && log_martians && peer->n_redirects == ip_rt_redirect_number)net_warn_ratelimited ("host %pI4/if%d ignores redirects for %pI4 to %pI4\n" , &ip_hdr (skb)->saddr,inet_iif (skb), &ip_hdr (skb)->daddr, &gw); -#endif } out_put_peer:inet_putpeer (peer);
net/ipv4/udp.c +3 -2
@@ -1054,16 +1054,17 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)if (msg->msg_controllen) { err =udp_cmsg_send (sk, msg, &ipc.gso_size); -if (err >0 ) +if (err >0 ) { err =ip_cmsg_send (sk, msg, &ipc, sk->sk_family ==AF_INET6 ); + connected =0 ; + }if (unlikely (err <0 )) {kfree (ipc.opt);return err; }if (ipc.opt) free =1 ; - connected =0 ; }if (!ipc.opt) {struct ip_options_rcu *inet_opt;
net/ipv6/addrconf.c +4 -3
@@ -2026,9 +2026,10 @@ struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, const struct in6_addr *addif (ipv6_addr_equal (&ifp->addr, addr)) {if (!dev || ifp->idev->dev == dev || !(ifp->scope&(IFA_LINK |IFA_HOST ) || strict)) { - result = ifp; -in6_ifa_hold (ifp); -break ; +if (in6_ifa_hold_safe (ifp)) { + result = ifp; +break ; + } } } }
net/ipv6/ip6_fib.c +5 -2
@@ -1307,7 +1307,10 @@ int fib6_add(struct fib6_node *root, struct fib6_info *rt, struct nl_info *info, struct netlink_ext_ack *extack) { struct fib6_table *table = rt->fib6_table; -struct fib6_node *fn, *pn =NULL ; +struct fib6_node *fn; +#ifdef CONFIG_IPV6_SUBTREES +struct fib6_node *pn =NULL ; +#endif int err = -ENOMEM ;int allow_create =1 ;int replace_required =0 ;
@@ -1331,9 +1334,9 @@ int fib6_add(struct fib6_node *root, struct fib6_info *rt, goto out; } +#ifdef CONFIG_IPV6_SUBTREES pn = fn; -#ifdef CONFIG_IPV6_SUBTREES if (rt->fib6_src.plen) {struct fib6_node *sn;
net/ipv6/udp.c +3 -2
@@ -1387,9 +1387,11 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ipc6.opt = opt; err =udp_cmsg_send (sk, msg, &ipc6.gso_size); -if (err >0 ) +if (err >0 ) { err =ip6_datagram_send_ctl (sock_net (sk), sk, msg, &fl6, &ipc6); + connected = false; + }if (err <0 ) {fl6_sock_release (flowlabel);return err;
@@ -1401,7 +1403,6 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) }if (!(opt->opt_nflen|opt->opt_flen)) opt =NULL ; - connected = false; }if (!opt) { opt =txopt_get (np);
net/netfilter/ipvs/ip_vs_proto_sctp.c +4 -2
@@ -126,7 +126,8 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,if (sctph->source != cp->vport || payload_csum || skb->ip_summed ==CHECKSUM_PARTIAL ) { sctph->source = cp->vport; -sctp_nat_csum (skb, sctph, sctphoff); +if (!skb_is_gso (skb) || !skb_is_gso_sctp (skb)) +sctp_nat_csum (skb, sctph, sctphoff); }else { skb->ip_summed =CHECKSUM_UNNECESSARY ; }
@@ -174,7 +175,8 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, (skb->ip_summed == CHECKSUM_PARTIAL && !(skb_dst(skb)->dev->features & NETIF_F_SCTP_CRC))) { sctph->dest = cp->dport; -sctp_nat_csum (skb, sctph, sctphoff); +if (!skb_is_gso (skb) || !skb_is_gso_sctp (skb)) +sctp_nat_csum (skb, sctph, sctphoff); } else if (skb->ip_summed != CHECKSUM_PARTIAL) { skb->ip_summed =CHECKSUM_UNNECESSARY ; }
net/netfilter/nf_tables_api.c +6 -2
@@ -2239,7 +2239,7 @@ static const struct nft_expr_type *__nft_expr_type_get(u8 family, {const struct nft_expr_type *type, *candidate =NULL ; -list_for_each_entry (type, &nf_tables_expressions, list) { +list_for_each_entry_rcu (type, &nf_tables_expressions, list) {if (!nla_strcmp (nla, type->name)) {if (!type->family && !candidate) candidate = type;
@@ -2271,9 +2271,13 @@ static const struct nft_expr_type *nft_expr_type_get(struct net *net,if (nla ==NULL )return ERR_PTR (-EINVAL ); +rcu_read_lock (); type =__nft_expr_type_get (family, nla); -if (type !=NULL &&try_module_get (type->owner)) +if (type !=NULL &&try_module_get (type->owner)) { +rcu_read_unlock ();return type; + } +rcu_read_unlock ();lockdep_nfnl_nft_mutex_not_held ();#ifdef CONFIG_MODULES
net/openvswitch/conntrack.c +5 -4
@@ -1687,8 +1687,9 @@ int ovs_ct_copy_action(struct net *net, const struct nlattr *attr,if (ct_info.timeout[0 ]) {if (nf_ct_set_timeout (net, ct_info.ct, family, key->ip.proto, ct_info.timeout)) -pr_info_ratelimited ("Failed to associated timeout " -"policy `%s'\n" , ct_info.timeout); +OVS_NLERR (log, +"Failed to associated timeout policy '%s'" , + ct_info.timeout);else ct_info.nf_ct_timeout =rcu_dereference (nf_ct_timeout_find (ct_info.ct)->timeout);
@@ -1896,9 +1897,9 @@ static void ovs_ct_limit_exit(struct net *net, struct ovs_net *ovs_net)for (i =0 ; i <CT_LIMIT_HASH_BUCKETS ; ++i) {struct hlist_head *head = &info->limits[i];struct ovs_ct_limit *ct_limit; +struct hlist_node *next; -hlist_for_each_entry_rcu (ct_limit, head, hlist_node, -lockdep_ovsl_is_held ()) +hlist_for_each_entry_safe (ct_limit, next, head, hlist_node)kfree_rcu (ct_limit, rcu); }kfree (ovs_net->ct_limit_info->limits);
net/unix/af_unix.c +2 -2
@@ -809,11 +809,11 @@ static struct sock *unix_create1(struct net *net, struct socket *sock, int kern) sk->sk_write_space = unix_write_space; sk->sk_max_ack_backlog = net->unx.sysctl_max_dgram_qlen; sk->sk_destruct = unix_sock_destructor; - u =unix_sk (sk); + u =unix_sk (sk); + u->inflight =0 ; u->path.dentry =NULL ; u->path.mnt =NULL ;spin_lock_init (&u->lock); -atomic_long_set (&u->inflight,0 );INIT_LIST_HEAD (&u->link);mutex_init (&u->iolock);/* single task reading lock */ mutex_init (&u->bindlock);/* single task binding lock */
net/unix/garbage.c +25 -10
@@ -166,17 +166,18 @@ static void scan_children(struct sock *x, void (*func)(struct unix_sock *),static void dec_inflight (struct unix_sock *usk) { -atomic_long_dec (&usk->inflight); + usk->inflight--; }static void inc_inflight (struct unix_sock *usk) { -atomic_long_inc (&usk->inflight); + usk->inflight++; }static void inc_inflight_move_tail (struct unix_sock *u) { -atomic_long_inc (&u->inflight); + u->inflight++; +/* If this still might be part of a cycle, move it to the end * of the list, so that it's checked even if it was already * passed over
@@ -234,20 +235,34 @@ void unix_gc(void)* receive queues. Other, non candidate sockets _can_ be * added to queue, so we must make sure only to touch * candidates. +* +* Embryos, though never candidates themselves, affect which +* candidates are reachable by the garbage collector. Before +* being added to a listener's queue, an embryo may already +* receive data carrying SCM_RIGHTS, potentially making the +* passed socket a candidate that is not yet reachable by the +* collector. It becomes reachable once the embryo is +* enqueued. Therefore, we must ensure that no SCM-laden +* embryo appears in a (candidate) listener's queue between +* consecutive scan_children() calls. */ list_for_each_entry_safe (u, next, &gc_inflight_list, link) { +struct sock *sk = &u->sk;long total_refs; -long inflight_refs; - total_refs =file_count (u->sk.sk_socket->file); - inflight_refs =atomic_long_read (&u->inflight); + total_refs =file_count (sk->sk_socket->file); -BUG_ON (inflight_refs <1 ); -BUG_ON (total_refs < inflight_refs); -if (total_refs == inflight_refs) { +BUG_ON (!u->inflight); +BUG_ON (total_refs < u->inflight); +if (total_refs == u->inflight) {list_move_tail (&u->link, &gc_candidates);__set_bit (UNIX_GC_CANDIDATE , &u->gc_flags);__set_bit (UNIX_GC_MAYBE_CYCLE , &u->gc_flags); + +if (sk->sk_state ==TCP_LISTEN ) { +unix_state_lock_nested (sk,U_LOCK_GC_LISTENER ); +unix_state_unlock (sk); + } } }
@@ -271,7 +286,7 @@ void unix_gc(void)/* Move cursor to after the current position. */ list_move (&cursor, &u->link); -if (atomic_long_read (&u->inflight) >0 ) { +if (u->inflight) {list_move_tail (&u->link, ¬_cycle_list);__clear_bit (UNIX_GC_MAYBE_CYCLE , &u->gc_flags);scan_children (&u->sk, inc_inflight_move_tail,NULL );
net/unix/scm.c +5 -3
@@ -51,12 +51,13 @@ void unix_inflight(struct user_struct *user, struct file *fp)if (s) {struct unix_sock *u =unix_sk (s); -if (atomic_long_inc_return (&u->inflight) ==1 ) { +if (!u->inflight) {BUG_ON (!list_empty (&u->link));list_add_tail (&u->link, &gc_inflight_list); }else {BUG_ON (list_empty (&u->link)); } + u->inflight++;/* Paired with READ_ONCE() in wait_for_unix_gc() */ WRITE_ONCE (unix_tot_inflight, unix_tot_inflight +1 ); }
@@ -73,10 +74,11 @@ void unix_notinflight(struct user_struct *user, struct file *fp)if (s) {struct unix_sock *u =unix_sk (s); -BUG_ON (!atomic_long_read (&u->inflight)); +BUG_ON (!u->inflight);BUG_ON (list_empty (&u->link)); -if (atomic_long_dec_and_test (&u->inflight)) + u->inflight--; +if (!u->inflight)list_del_init (&u->link);/* Paired with READ_ONCE() in wait_for_unix_gc() */ WRITE_ONCE (unix_tot_inflight, unix_tot_inflight -1 );
tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc +3 -3
@@ -22,7 +22,7 @@ echo 'sched:*' > set_event yield -count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` +count=`head -n 100 trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` if [ $count -lt 3 ]; then fail "at least fork, exec and exit events should be recorded" fi
@@ -33,7 +33,7 @@ echo 1 > events/sched/enable yield -count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` +count=`head -n 100 trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` if [ $count -lt 3 ]; then fail "at least fork, exec and exit events should be recorded" fi
@@ -44,7 +44,7 @@ echo 0 > events/sched/enable yield -count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` +count=`head -n 100 trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l` if [ $count -ne 0 ]; then fail "any of scheduler events should not be recorded" fi
tools/testing/selftests/timers/posix_timers.c +1 -1
@@ -66,7 +66,7 @@ static int check_diff(struct timeval start, struct timeval end) diff = end.tv_usec - start.tv_usec; diff += (end.tv_sec - start.tv_sec) *USECS_PER_SEC ; -if (abs (diff -DELAY *USECS_PER_SEC ) >USECS_PER_SEC /2 ) { +if (llabs (diff -DELAY *USECS_PER_SEC ) >USECS_PER_SEC /2 ) {printf ("Diff too high: %lld.." , diff);return -1 ; }
virt/kvm/async_pf.c +6 -13
@@ -195,7 +195,9 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,if (vcpu->async_pf.queued >=ASYNC_PF_PER_VCPU )return 0 ; -/* setup delayed work */ +/* Arch specific code should not do async PF in this case */ +if (unlikely (kvm_is_error_hva (hva))) +return 0 ;/* * do alloc nowait since if we are going to sleep anyway we
@@ -213,24 +215,15 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, work->mm = current->mm;mmget (work->mm); -/* this can't really happen otherwise gfn_to_pfn_async -would succeed */ -if (unlikely (kvm_is_error_hva (work->addr))) - goto retry_sync; -INIT_WORK (&work->work, async_pf_execute); -if (!schedule_work (&work->work)) - goto retry_sync;list_add_tail (&work->queue, &vcpu->async_pf.queue); vcpu->async_pf.queued++;kvm_arch_async_page_not_present (vcpu, work); + +schedule_work (&work->work); +return 1 ; -retry_sync: -kvm_put_kvm (work->vcpu->kvm); -mmput (work->mm); -kmem_cache_free (async_pf_cache, work); -return 0 ; }int kvm_async_pf_wakeup_all (struct kvm_vcpu *vcpu)