I'm announcing the release of the 5.4.302 kernel.
This is the LAST 5.4.y release. It is now end-of-life and should not be used by anyone, anymore. As of this point in time, there are 1539 documented unfixed CVEs for this kernel branch, and that number will only increase over time as more CVEs get assigned for kernel bugs.
All users of the 5.4 kernel series must upgrade to a newer branch as this point in time.
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%3Ba=summa...
thanks,
greg k-h
------------
Makefile | 2 arch/arc/include/asm/bitops.h | 2 arch/mips/boot/dts/lantiq/danube.dtsi | 6 arch/mips/lantiq/xway/sysctrl.c | 2 arch/mips/mti-malta/malta-init.c | 20 - arch/powerpc/kernel/eeh_driver.c | 2 arch/sparc/include/asm/elf_64.h | 1 arch/sparc/kernel/module.c | 1 arch/x86/entry/vsyscall/vsyscall_64.c | 17 + arch/x86/kernel/cpu/bugs.c | 5 arch/x86/kernel/cpu/resctrl/monitor.c | 10 drivers/acpi/acpi_video.c | 4 drivers/acpi/acpica/dsmethod.c | 10 drivers/acpi/property.c | 24 + drivers/acpi/video_detect.c | 8 drivers/ata/libata-scsi.c | 8 drivers/base/devcoredump.c | 138 ++++++---- drivers/base/regmap/regmap-slimbus.c | 6 drivers/bluetooth/btusb.c | 13 drivers/bluetooth/hci_bcsp.c | 3 drivers/char/misc.c | 8 drivers/clocksource/timer-vf-pit.c | 22 - drivers/cpufreq/longhaul.c | 3 drivers/dma/dw-edma/dw-edma-core.c | 22 + drivers/dma/mv_xor.c | 4 drivers/dma/sh/shdma-base.c | 25 + drivers/dma/sh/shdmac.c | 17 - drivers/edac/altera_edac.c | 22 + drivers/extcon/extcon-adc-jack.c | 2 drivers/firmware/arm_scmi/scmi_pm_domain.c | 13 drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 8 drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 9 drivers/gpu/drm/etnaviv/etnaviv_buffer.c | 2 drivers/gpu/drm/nouveau/nvkm/core/enum.c | 2 drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 5 drivers/hid/hid-ids.h | 7 drivers/hid/hid-quirks.c | 14 - drivers/hwmon/dell-smm-hwmon.c | 7 drivers/iio/adc/spear_adc.c | 9 drivers/input/keyboard/cros_ec_keyb.c | 6 drivers/input/misc/ati_remote2.c | 2 drivers/input/misc/cm109.c | 2 drivers/input/misc/powermate.c | 2 drivers/input/misc/yealink.c | 2 drivers/input/tablet/acecad.c | 2 drivers/input/tablet/pegasus_notetaker.c | 11 drivers/irqchip/irq-gic-v2m.c | 13 drivers/isdn/hardware/mISDN/hfcsusb.c | 18 - drivers/media/i2c/ir-kbd-i2c.c | 6 drivers/media/pci/ivtv/ivtv-alsa-pcm.c | 2 drivers/media/pci/ivtv/ivtv-driver.h | 3 drivers/media/pci/ivtv/ivtv-fileops.c | 18 - drivers/media/pci/ivtv/ivtv-irq.c | 4 drivers/media/rc/imon.c | 61 ++-- drivers/media/rc/redrat3.c | 2 drivers/media/tuners/xc4000.c | 8 drivers/media/tuners/xc5000.c | 12 drivers/memstick/core/memstick.c | 8 drivers/mfd/madera-core.c | 4 drivers/mfd/stmpe-i2c.c | 1 drivers/mfd/stmpe.c | 3 drivers/mmc/host/renesas_sdhi_core.c | 6 drivers/mmc/host/sdhci-msm.c | 15 + drivers/net/can/usb/gs_usb.c | 23 - drivers/net/dsa/b53/b53_common.c | 57 +++- drivers/net/dsa/b53/b53_regs.h | 4 drivers/net/ethernet/cadence/macb_main.c | 4 drivers/net/ethernet/emulex/benet/be_main.c | 7 drivers/net/ethernet/freescale/fec_main.c | 2 drivers/net/ethernet/intel/fm10k/fm10k_common.c | 5 drivers/net/ethernet/intel/fm10k/fm10k_common.h | 2 drivers/net/ethernet/intel/fm10k/fm10k_pf.c | 2 drivers/net/ethernet/intel/fm10k/fm10k_vf.c | 2 drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 15 - drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c | 6 drivers/net/ethernet/qlogic/qede/qede_main.c | 2 drivers/net/ethernet/renesas/ravb_main.c | 16 + drivers/net/ethernet/renesas/sh_eth.c | 4 drivers/net/ethernet/ti/netcp_core.c | 10 drivers/net/phy/dp83867.c | 6 drivers/net/phy/mdio_bus.c | 5 drivers/net/usb/asix_devices.c | 12 drivers/net/usb/qmi_wwan.c | 6 drivers/net/usb/usbnet.c | 2 drivers/net/wireless/ath/ath10k/wmi.c | 1 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 21 - drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h | 3 drivers/pci/p2pdma.c | 2 drivers/pci/quirks.c | 1 drivers/phy/cadence/cdns-dphy.c | 4 drivers/regulator/fixed.c | 6 drivers/remoteproc/qcom_q6v5.c | 5 drivers/s390/net/ctcm_mpc.c | 1 drivers/scsi/lpfc/lpfc_debugfs.h | 3 drivers/scsi/lpfc/lpfc_scsi.c | 14 - drivers/scsi/pm8001/pm8001_ctl.c | 2 drivers/scsi/sg.c | 10 drivers/soc/imx/gpc.c | 2 drivers/soc/qcom/smem.c | 2 drivers/soc/ti/knav_dma.c | 14 - drivers/spi/spi-loopback-test.c | 12 drivers/spi/spi.c | 10 drivers/target/loopback/tcm_loop.c | 3 drivers/tee/tee_core.c | 2 drivers/tty/serial/8250/8250_dw.c | 128 ++++----- drivers/uio/uio_hv_generic.c | 21 + drivers/usb/gadget/function/f_fs.c | 8 drivers/usb/gadget/function/f_hid.c | 4 drivers/usb/gadget/function/f_ncm.c | 3 drivers/usb/host/xhci-plat.c | 1 drivers/usb/mon/mon_bin.c | 14 - drivers/video/backlight/lp855x_bl.c | 2 drivers/video/fbdev/aty/atyfb_base.c | 8 drivers/video/fbdev/core/bitblit.c | 33 ++ drivers/video/fbdev/pvr2fb.c | 2 drivers/video/fbdev/valkyriefb.c | 2 fs/9p/v9fs.c | 9 fs/btrfs/transaction.c | 2 fs/ceph/locks.c | 5 fs/hpfs/namei.c | 18 - fs/jfs/inode.c | 8 fs/jfs/jfs_txnmgr.c | 9 fs/nfs/nfs4client.c | 1 fs/nfs/nfs4proc.c | 6 fs/nfs/nfs4state.c | 3 fs/open.c | 10 fs/orangefs/xattr.c | 12 fs/proc/generic.c | 12 include/linux/ata.h | 1 include/linux/compiler_types.h | 5 include/linux/filter.h | 2 include/linux/mm.h | 2 include/linux/shdma-base.h | 2 include/linux/usb.h | 16 - include/net/cls_cgroup.h | 2 include/net/nfc/nci_core.h | 2 include/net/pkt_sched.h | 25 + kernel/events/uprobes.c | 7 kernel/gcov/gcc_4_7.c | 4 kernel/trace/trace_events_hist.c | 6 mm/page_alloc.c | 2 net/8021q/vlan.c | 2 net/bluetooth/6lowpan.c | 97 ++++--- net/bluetooth/l2cap_core.c | 1 net/bluetooth/sco.c | 7 net/bridge/br_forward.c | 3 net/core/netpoll.c | 7 net/core/page_pool.c | 6 net/core/sock.c | 15 - net/ipv4/nexthop.c | 6 net/ipv4/route.c | 5 net/ipv6/ah6.c | 50 ++- net/ipv6/raw.c | 2 net/ipv6/udp.c | 2 net/mac80211/rx.c | 10 net/openvswitch/actions.c | 68 ---- net/openvswitch/flow_netlink.c | 64 ---- net/openvswitch/flow_netlink.h | 2 net/rds/rds.h | 2 net/sched/act_ife.c | 12 net/sched/sch_api.c | 10 net/sched/sch_generic.c | 24 - net/sched/sch_hfsc.c | 16 - net/sched/sch_qfq.c | 2 net/sctp/associola.c | 10 net/sctp/chunk.c | 2 net/sctp/diag.c | 7 net/sctp/endpointola.c | 6 net/sctp/input.c | 5 net/sctp/output.c | 2 net/sctp/outqueue.c | 6 net/sctp/sm_make_chunk.c | 7 net/sctp/sm_sideeffect.c | 16 - net/sctp/sm_statefuns.c | 2 net/sctp/socket.c | 12 net/sctp/stream.c | 3 net/sctp/stream_interleave.c | 23 - net/sctp/transport.c | 15 - net/sctp/ulpqueue.c | 15 - net/strparser/strparser.c | 2 net/tipc/core.c | 4 net/tipc/core.h | 8 net/tipc/discover.c | 4 net/tipc/link.c | 5 net/tipc/link.h | 1 net/tipc/net.c | 17 - net/vmw_vsock/af_vsock.c | 40 ++ scripts/kconfig/mconf.c | 3 scripts/kconfig/nconf.c | 3 sound/soc/codecs/cs4271.c | 10 sound/soc/codecs/max98090.c | 6 sound/soc/qcom/qdsp6/q6asm.c | 2 sound/usb/mixer.c | 11 tools/power/cpupower/lib/cpuidle.c | 5 tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c | 26 + tools/testing/selftests/Makefile | 2 tools/testing/selftests/bpf/test_lirc_mode2_user.c | 2 tools/testing/selftests/net/fcnal-test.sh | 4 tools/testing/selftests/net/psock_tpacket.c | 4 200 files changed, 1294 insertions(+), 813 deletions(-)
Abdun Nihaal (1): isdn: mISDN: hfcsusb: fix memory leak in hfcsusb_probe()
Al Viro (2): allow finish_no_open(file, ERR_PTR(-E...)) nfs4_setup_readdir(): insufficient locking for ->d_parent->d_inode dereferencing
Albin Babu Varghese (1): fbdev: Add bounds checking in bit_putcs to fix vmalloc-out-of-bounds
Aleksander Jan Bajkowski (3): mips: lantiq: danube: add missing properties to cpu node mips: lantiq: danube: add missing device_type in pci node mips: lantiq: xway: sysctrl: rename stp clock
Aleksei Nikiforov (1): s390/ctcm: Fix double-kfree
Alexander Stein (2): mfd: stmpe: Remove IRQ domain upon removal mfd: stmpe-i2c: Add missing MODULE_LICENSE
Alexey Klimov (1): regmap: slimbus: fix bus_context pointer in regmap init calls
Amber Lin (1): drm/amdkfd: Tie UNMAP_LATENCY to queue_preemption
Amirreza Zarrabi (1): tee: allow a driver to allocate a tee_device without a pool
Andrey Vatoropin (1): be2net: pass wrb_params in case of OS2BMC
Andy Shevchenko (2): serial: 8250_dw: Use devm_clk_get_optional() to get the input clock serial: 8250_dw: Use devm_add_action_or_reset()
Anthony Iliopoulos (1): NFSv4.1: fix mount hang after CREATE_SESSION failure
Armin Wolf (1): hwmon: (dell-smm) Add support for Dell OptiPlex 7040
Arnd Bergmann (1): mfd: madera: Work around false-positive -Wininitialized warning
Artem Shimko (1): serial: 8250_dw: handle reset control deassert error
Babu Moger (1): x86/resctrl: Fix miscount of bandwidth event when reactivating previously unavailable RMID
Bart Van Assche (1): scsi: sg: Do not sleep in atomic context
Benjamin Berg (1): wifi: mac80211: skip rate verification for not captured PSDUs
Biju Das (1): mmc: host: renesas_sdhi: Fix the actual clock
Brahmajit Das (1): net: intel: fm10k: Fix parameter idx set but not used
Breno Leitao (1): net: netpoll: fix incorrect refcount handling causing incorrect cleanup
Buday Csaba (1): net: mdio: fix resource leak in mdiobus_register_device()
Celeste Liu (1): can: gs_usb: increase max interface to U8_MAX
Charalampos Mitrodimas (1): net: ipv6: fix field-spanning memcpy warning in AH output
Chelsy Ratnawat (1): media: fix uninitialized symbol warnings
Chris Morgan (1): regulator: fixed: use dev_err_probe for register
Christian Bruel (1): irqchip/gic-v2m: Handle Multiple MSI base IRQ Alignment
Christoph Paasch (1): net: When removing nexthops, don't call synchronize_net if it is not necessary
Chuang Wang (1): ipv4: route: Prevent rt_bind_exception() from rebinding stale fnhe
Cryolitia PukNgae (1): ALSA: usb-audio: apply quirk for MOONDROP Quark2
Daniel Lezcano (1): clocksource/drivers/vf-pit: Replace raw_readl/writel to readl/writel
Daniel Palmer (1): fbdev: atyfb: Check if pll_ops->init_pll failed
David Ahern (2): selftests: Disable dad for ipv6 in fcnal-test.sh selftests: Replace sleep with slowwait
David Kaplan (1): x86/bugs: Fix reporting of LFENCE retpoline
Dennis Beier (1): cpufreq/longhaul: handle NULL policy in longhaul_exit
Devendra K Verma (1): dmaengine: dw-edma: Set status for callback_result
Dragos Tatulea (1): page_pool: Clamp pool size to max 16K pages
Emanuele Ghidoli (1): net: phy: dp83867: Disable EEE support as not implemented
Eric Dumazet (5): net: call cond_resched() less often in __release_sock() ipv6: np->rxpmtu race annotation sctp: prevent possible shift-out-of-bounds in sctp_transport_update_rto net_sched: remove need_resched() from qdisc_run() net_sched: limit try_bulk_dequeue_skb() batches
Filipe Manana (1): btrfs: use smp_mb__after_atomic() when forcing COW in create_pending_snapshot()
Florian Fuchs (1): fbdev: pvr2fb: Fix leftover reference to ONCHIP_NR_DMA_CHANNELS
Forest Crossman (1): usb: mon: Increase BUFF_MAX to 64 MiB to support multi-MB URBs
Gal Pressman (2): net/mlx5e: Fix maxrate wraparound in threshold between units net/mlx5e: Fix wraparound in rate limiting for values above 255 Gbps
Geoffrey McRae (1): drm/amdkfd: return -ENOTTY for unsupported IOCTLs
Gokul Sivakumar (1): wifi: brcmfmac: fix crash while sending Action Frames in standalone AP Mode
Greg Kroah-Hartman (1): Linux 5.4.302
Haein Lee (1): ALSA: usb-audio: Fix NULL pointer dereference in snd_usb_mixer_controls_badd
Hamza Mahfooz (1): scsi: target: tcm_loop: Fix segfault in tcm_loop_tpg_address_show()
Hangbin Liu (1): net: vlan: sync VLAN features with lower device
Hans de Goede (2): ACPICA: dispatcher: Use acpi_ds_clear_operands() in acpi_ds_call_control_method() spi: Try to get ACPI GPIO IRQ earlier
Haotian Zhang (2): regulator: fixed: fix GPIO descriptor leak on register failure ASoC: cs4271: Fix regulator leak on probe failure
Harikrishna Shenoy (1): phy: cadence: cdns-dphy: Enable lower resolutions in dphy
Ian Forbes (1): drm/vmwgfx: Validate command header size against SVGA_CMD_MAX_DATASIZE
Ido Schimmel (1): bridge: Redirect to backup port when port is administratively down
Ilya Maximets (1): net: openvswitch: remove never-working support for setting nsh fields
Isaac J. Manjarres (1): mm/page_alloc: fix hash table order logging in alloc_large_system_hash()
Ivan Pravdin (1): Bluetooth: bcsp: receive data only if registered
Jakub Acs (1): mm/ksm: fix flag-dropping behavior in ksm_madvise
Jakub Horký (2): kconfig/mconf: Initialize the default locale at startup kconfig/nconf: Initialize the default locale at startup
Jens Reidel (1): soc: qcom: smem: Fix endian-unaware access of num_entries
Jiayi Li (1): memstick: Add timeout to prevent indefinite waiting
Jiri Olsa (1): uprobe: Do not emulate/sstep original instruction when ip is changed
Jonas Gorski (3): net: dsa: b53: fix resetting speed and pause on forced link net: dsa: b53: fix enabling ip multicast net: dsa: b53: stop reading ARL entries if search is done
Joshua Watt (1): NFS4: Fix state renewals missing after boot
Junjie Cao (1): fbdev: bitblit: bound-check glyph index in bit_putcs*
Juraj Šarinay (1): net: nfc: nci: Increase NCI_DATA_TIMEOUT to 3000 ms
Justin Tee (2): scsi: lpfc: Check return status of lpfc_reset_flush_io_context during TGT_RESET scsi: lpfc: Define size of debugfs entry for xri rebalancing
Kaushlendra Kumar (1): tools/cpupower: Fix incorrect size in cpuidle_state_disable()
Kees Cook (1): arc: Fix __fls() const-foldability via __builtin_clzl()
Kirill A. Shutemov (1): x86/vsyscall: Do not require X86_PF_INSTR to emulate vsyscall
Koakuma (1): sparc/module: Add R_SPARC_UA64 relocation handling
Krishna Kurapati (1): usb: xhci: plat: Facilitate using autosuspend for xhci plat devices
Krzysztof Kozlowski (2): extcon: adc-jack: Fix wakeup source leaks on device unbind extcon: adc-jack: Cleanup wakeup source only if it was enabled
Kuniyuki Iwashima (2): net: Call trace_sock_exceed_buf_limit() for memcg failure with SK_MEM_RECV. tipc: Fix use-after-free in tipc_mon_reinit_self().
Lad Prabhakar (1): net: ravb: Enforce descriptor type ordering
Laurent Pinchart (1): media: pci: ivtv: Don't create fake v4l2_fh
Len Brown (2): tools/power x86_energy_perf_policy: Enhance HWP enable tools/power x86_energy_perf_policy: Prefer driver HWP limits
Lizhi Xu (1): usbnet: Prevents free active kevent
Loic Poulain (1): wifi: ath10k: Fix memory leak on unsupported WMI command
Long Li (1): uio_hv_generic: Set event for all channels on the device
Luiz Augusto von Dentz (1): Bluetooth: SCO: Fix UAF on sco_conn_free
Maarten Lankhorst (1): devcoredump: Fix circular locking dependency with devcd->mutex.
Maciej W. Rozycki (1): MIPS: Malta: Fix !EVA SOC-it PCI MMIO
Marcos Del Sol Vives (1): PCI: Disable MSI on RDC PCI to PCIe bridges
Mario Limonciello (AMD) (1): ACPI: video: force native for Lenovo 82K8
Miaoqian Lin (3): net: usb: asix_devices: Check return value of usbnet_get_endpoints fbdev: valkyriefb: Fix reference count leak in valkyriefb_init pmdomain: imx: Fix reference count leak in imx_gpc_remove
Michal Luczaj (1): vsock: Ignore signal/timeout on connect() if already established
Mike Marshall (1): orangefs: fix xattr related buffer overflow...
Nai-Chen Cheng (1): selftests/Makefile: include $(INSTALL_DEP_TARGETS) in clean target to clean net/lib dependency
Nate Karstens (1): strparser: Fix signed/unsigned mismatch bug
Nathan Chancellor (1): net: qede: Initialize qede_ll_ops with designated initializer
Niklas Cassel (1): ata: libata-scsi: Fix system suspend for a security locked drive
Niklas Schnelle (1): powerpc/eeh: Use result of error_detected() in uevent
Niklas Söderlund (1): net: sh_eth: Disable WoL if system can not suspend
Niravkumar L Rabara (2): EDAC/altera: Handle OCRAM ECC enable after warm reset EDAC/altera: Use INTTEST register for Ethernet and USB SBE injection
Nishanth Menon (1): net: ethernet: ti: netcp: Standardize knav_dma_open_channel to return NULL on error
Olga Kornievskaia (1): NFSv4: handle ERR_GRACE on delegation recalls
Owen Gu (1): usb: gadget: f_fs: Fix epfile null pointer access after ep enable.
Pauli Virtanen (4): Bluetooth: 6lowpan: reset link-local header on ipv6 recv path Bluetooth: 6lowpan: fix BDADDR_LE vs ADDR_LE_DEV address type confusion Bluetooth: 6lowpan: Don't hold spin lock over sleeping functions Bluetooth: L2CAP: export l2cap_chan_hold for modules
Peter Oberparleiter (1): gcov: add support for GCC 15
Peter Zijlstra (1): compiler_types: Move unused static inline functions warning to W=2
Qendrim Maxhuni (1): net: usb: qmi_wwan: initialize MAC header offset in qmimux_rx_fixup
Qianfeng Rong (2): scsi: pm8001: Use int instead of u32 to store error codes media: redrat3: use int type to store negative error codes
Randall P. Embry (2): 9p: fix /sys/fs/9p/caches overwriting itself 9p: sysfs_init: don't hardcode error to ENOMEM
Ranganath V N (1): net: sched: act_ife: initialize struct tc_ife to fix KMSAN kernel-infoleak
Raphael Pinsonneault-Thibeault (1): Bluetooth: btusb: reorder cleanup in btusb_disconnect to avoid UAF
René Rebe (1): ALSA: usb-audio: fix uac2 clock source at terminal parser
Ricardo B. Marlière (1): selftests/bpf: Fix bpf_prog_detach2 usage in test_lirc_mode2
Rodrigo Gobbi (1): iio: adc: spear_adc: mask SPEAR_ADC_STATUS channel and avg sample before setting register
Rosen Penev (1): dmaengine: mv_xor: match alloc_wc and free_wc
Russell King (1): net: dsa/b53: change b53_force_port_config() pause argument
Sakari Ailus (1): ACPI: property: Return present device nodes only on fwnode interface
Saket Dumbre (1): ACPICA: Update dsmethod.c to get rid of unused variable warning
Sarthak Garg (1): mmc: sdhci-msm: Enable tuning for SDR50 mode for SD card
Seungjin Bae (1): Input: pegasus-notetaker - fix potential out-of-bounds access
Seyediman Seyedarab (1): drm/nouveau: replace snprintf() with scnprintf() in nvkm_snprintbf()
Sharique Mohammad (1): ASoC: max98090/91: fixed max98091 ALSA widget powering up/down
Shaurya Rane (1): jfs: fix uninitialized waitqueue in transaction manager
Srinivas Kandagatla (1): ASoC: qdsp6: q6asm: do not sleep while atomic
Stefan Wiehler (2): sctp: Hold RCU read lock while iterating over address list sctp: Prevent TOCTOU out-of-bounds write
Stephan Gerhold (1): remoteproc: qcom: q6v5: Avoid handling handover twice
Sudeep Holla (1): pmdomain: arm: scmi: Fix genpd leak on provider registration failure
Sungho Kim (1): PCI/P2PDMA: Fix incorrect pointer usage in devm_kfree() call
Svyatoslav Ryhel (1): video: backlight: lp855x_bl: Set correct EPROM start for LP8556
Tetsuo Handa (2): media: imon: make send_packet() more robust jfs: Verify inode mode when loading from disk
Thomas Andreatta (1): dmaengine: sh: setup_xref error handling
Thomas Weißschuh (2): spi: loopback-test: Don't use %pK through printk bpf: Don't use %pK through printk
Théo Lebrun (1): net: macb: avoid dealing with endianness in macb_set_hwaddr()
Tomeu Vizoso (1): drm/etnaviv: fix flush sequence logic
Tristan Lobb (1): HID: quirks: avoid Cooler Master MM712 dongle wakeup bug
Tzung-Bi Shih (1): Input: cros_ec_keyb - fix an invalid memory access
Ujwal Kundur (1): rds: Fix endianness annotation for RDS_MPATH_HASH
Viacheslav Dubeyko (1): ceph: add checking of wait_for_completion_killable() return value
Vincent Mailhol (2): usb: deprecate the third argument of usb_maxpacket() Input: remove third argument of usb_maxpacket()
Wake Liu (2): selftests/net: Replace non-standard __WORDSIZE with sizeof(long) * 8 selftests/net: Ensure assert() triggers in psock_tpacket.c
Wei Fang (1): net: fec: correct rx_bytes statistic for the case SHIFT16 is set
Wei Yang (1): fs/proc: fix uaf in proc_readdir_de()
William Wu (1): usb: gadget: f_hid: Fix zero length packet transfer
Xiang Mei (1): net/sched: sch_qfq: Fix null-deref in agg_dequeue
Xin Long (2): sctp: get netns from asoc and ep base tipc: simplify the finalize work queue
Yafang Shao (1): net/cls_cgroup: Fix task_get_classid() during qdisc run
Yikang Yue (1): fs/hpfs: Fix error code for new_inode() failure in mkdir/create/mknod/symlink
Yuhao Jiang (1): ACPI: video: Fix use-after-free in acpi_video_switch_brightness()
Zhang Heng (1): HID: quirks: work around VID/PID conflict for 0x4c4a/0x4155
Zijun Hu (1): char: misc: Does not request module for miscdevice with dynamic minor
Zilin Guan (2): tracing: Fix memory leaks in create_field_var() mlxsw: spectrum: Fix memory leak in mlxsw_sp_flower_stats()
raub camaioni (1): usb: gadget: f_ncm: Fix MAC assignment NCM ethernet
Álvaro Fernández Rojas (1): net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL access on BCM5325
diff --git a/Makefile b/Makefile index 2c591495ed37..b5687c33059c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 301 +SUBLEVEL = 302 EXTRAVERSION = NAME = Kleptomaniac Octopus
diff --git a/arch/arc/include/asm/bitops.h b/arch/arc/include/asm/bitops.h index 50eb3f64a77c..7d6afe5cdb7a 100644 --- a/arch/arc/include/asm/bitops.h +++ b/arch/arc/include/asm/bitops.h @@ -371,6 +371,8 @@ static inline __attribute__ ((const)) int fls(unsigned long x) */ static inline __attribute__ ((const)) int __fls(unsigned long x) { + if (__builtin_constant_p(x)) + return x ? BITS_PER_LONG - 1 - __builtin_clzl(x) : 0; /* FLS insn has exactly same semantics as the API */ return __builtin_arc_fls(x); } diff --git a/arch/mips/boot/dts/lantiq/danube.dtsi b/arch/mips/boot/dts/lantiq/danube.dtsi index 510be63c8bdf..1a5f4faa0831 100644 --- a/arch/mips/boot/dts/lantiq/danube.dtsi +++ b/arch/mips/boot/dts/lantiq/danube.dtsi @@ -5,8 +5,12 @@ compatible = "lantiq,xway", "lantiq,danube";
cpus { + #address-cells = <1>; + #size-cells = <0>; + cpu@0 { compatible = "mips,mips24Kc"; + reg = <0>; }; };
@@ -101,6 +105,8 @@ 0x1000000 0 0x00000000 0xae00000 0 0x200000>; /* io space */ reg = <0x7000000 0x8000 /* config space */ 0xe105400 0x400>; /* pci bridge */ + + device_type = "pci"; }; }; }; diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c index 6c2d9779ac72..e52dfd4bad57 100644 --- a/arch/mips/lantiq/xway/sysctrl.c +++ b/arch/mips/lantiq/xway/sysctrl.c @@ -459,7 +459,7 @@ void __init ltq_soc_init(void) /* add our generic xway clocks */ clkdev_add_pmu("10000000.fpi", NULL, 0, 0, PMU_FPI); clkdev_add_pmu("1e100a00.gptu", NULL, 1, 0, PMU_GPT); - clkdev_add_pmu("1e100bb0.stp", NULL, 1, 0, PMU_STP); + clkdev_add_pmu("1e100bb0.gpio", NULL, 1, 0, PMU_STP); clkdev_add_pmu("1e100c00.serial", NULL, 0, 0, PMU_ASC1); clkdev_add_pmu("1e104100.dma", NULL, 1, 0, PMU_DMA); clkdev_add_pmu("1e100800.spi", NULL, 1, 0, PMU_SPI); diff --git a/arch/mips/mti-malta/malta-init.c b/arch/mips/mti-malta/malta-init.c index ff2c1d809538..72b82700a59d 100644 --- a/arch/mips/mti-malta/malta-init.c +++ b/arch/mips/mti-malta/malta-init.c @@ -242,16 +242,22 @@ void __init prom_init(void) #endif
/* - * Setup the Malta max (2GB) memory for PCI DMA in host bridge - * in transparent addressing mode. + * Set up memory mapping in host bridge for PCI DMA masters, + * in transparent addressing mode. For EVA use the Malta + * maximum of 2 GiB memory in the alias space at 0x80000000 + * as per PHYS_OFFSET. Otherwise use 256 MiB of memory in + * the regular space, avoiding mapping the PCI MMIO window + * for DMA as it seems to confuse the system controller's + * logic, causing PCI MMIO to stop working. */ - mask = PHYS_OFFSET | PCI_BASE_ADDRESS_MEM_PREFETCH; - MSC_WRITE(MSC01_PCI_BAR0, mask); - MSC_WRITE(MSC01_PCI_HEAD4, mask); + mask = PHYS_OFFSET ? PHYS_OFFSET : 0xf0000000; + MSC_WRITE(MSC01_PCI_BAR0, + mask | PCI_BASE_ADDRESS_MEM_PREFETCH); + MSC_WRITE(MSC01_PCI_HEAD4, + PHYS_OFFSET | PCI_BASE_ADDRESS_MEM_PREFETCH);
- mask &= MSC01_PCI_BAR0_SIZE_MSK; MSC_WRITE(MSC01_PCI_P2SCMSKL, mask); - MSC_WRITE(MSC01_PCI_P2SCMAPL, mask); + MSC_WRITE(MSC01_PCI_P2SCMAPL, PHYS_OFFSET);
/* Don't handle target retries indefinitely. */ if ((data & MSC01_PCI_CFG_MAXRTRY_MSK) == diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c index 68decc2bf42b..7ce80ad5e9d3 100644 --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c @@ -351,7 +351,7 @@ static enum pci_ers_result eeh_report_error(struct eeh_dev *edev, rc = driver->err_handler->error_detected(pdev, pci_channel_io_frozen);
edev->in_error = true; - pci_uevent_ers(pdev, PCI_ERS_RESULT_NONE); + pci_uevent_ers(pdev, rc); return rc; }
diff --git a/arch/sparc/include/asm/elf_64.h b/arch/sparc/include/asm/elf_64.h index 7e078bc73ef5..d3dda47d0bc5 100644 --- a/arch/sparc/include/asm/elf_64.h +++ b/arch/sparc/include/asm/elf_64.h @@ -59,6 +59,7 @@ #define R_SPARC_7 43 #define R_SPARC_5 44 #define R_SPARC_6 45 +#define R_SPARC_UA64 54
/* Bits present in AT_HWCAP, primarily for Sparc32. */ #define HWCAP_SPARC_FLUSH 0x00000001 diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index df39580f398d..737f7a5c2835 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c @@ -117,6 +117,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, break; #ifdef CONFIG_SPARC64 case R_SPARC_64: + case R_SPARC_UA64: location[0] = v >> 56; location[1] = v >> 48; location[2] = v >> 40; diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c index 86e5a1c1055f..85e80f0a8b15 100644 --- a/arch/x86/entry/vsyscall/vsyscall_64.c +++ b/arch/x86/entry/vsyscall/vsyscall_64.c @@ -124,7 +124,12 @@ bool emulate_vsyscall(unsigned long error_code, if ((error_code & (X86_PF_WRITE | X86_PF_USER)) != X86_PF_USER) return false;
- if (!(error_code & X86_PF_INSTR)) { + /* + * Assume that faults at regs->ip are because of an + * instruction fetch. Return early and avoid + * emulation for faults during data accesses: + */ + if (address != regs->ip) { /* Failed vsyscall read */ if (vsyscall_mode == EMULATE) return false; @@ -136,13 +141,19 @@ bool emulate_vsyscall(unsigned long error_code, return false; }
+ /* + * X86_PF_INSTR is only set when NX is supported. When + * available, use it to double-check that the emulation code + * is only being used for instruction fetches: + */ + if (cpu_feature_enabled(X86_FEATURE_NX)) + WARN_ON_ONCE(!(error_code & X86_PF_INSTR)); + /* * No point in checking CS -- the only way to get here is a user mode * trap to a high address, which means that we're in 64-bit user code. */
- WARN_ON_ONCE(address != regs->ip); - if (vsyscall_mode == NONE) { warn_bad_vsyscall(KERN_INFO, regs, "vsyscall attempted with vsyscall=none"); diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index 4f803aed2ef0..b10e257799c1 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c @@ -1188,7 +1188,7 @@ spectre_v2_user_select_mitigation(void) static const char * const spectre_v2_strings[] = { [SPECTRE_V2_NONE] = "Vulnerable", [SPECTRE_V2_RETPOLINE] = "Mitigation: Retpolines", - [SPECTRE_V2_LFENCE] = "Mitigation: LFENCE", + [SPECTRE_V2_LFENCE] = "Vulnerable: LFENCE", [SPECTRE_V2_EIBRS] = "Mitigation: Enhanced / Automatic IBRS", [SPECTRE_V2_EIBRS_LFENCE] = "Mitigation: Enhanced / Automatic IBRS + LFENCE", [SPECTRE_V2_EIBRS_RETPOLINE] = "Mitigation: Enhanced / Automatic IBRS + Retpolines", @@ -2280,9 +2280,6 @@ static char *pbrsb_eibrs_state(void)
static ssize_t spectre_v2_show_state(char *buf) { - if (spectre_v2_enabled == SPECTRE_V2_LFENCE) - return sysfs_emit(buf, "Vulnerable: LFENCE\n"); - if (spectre_v2_enabled == SPECTRE_V2_EIBRS && unprivileged_ebpf_enabled()) return sysfs_emit(buf, "Vulnerable: eIBRS with unprivileged eBPF\n");
diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index 008bcb15fe96..85d275573af8 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -225,11 +225,19 @@ static u64 mbm_overflow_count(u64 prev_msr, u64 cur_msr)
static u64 __mon_event_count(u32 rmid, struct rmid_read *rr) { - struct mbm_state *m; + struct mbm_state *m = NULL; u64 chunks, tval;
tval = __rmid_read(rmid, rr->evtid); if (tval & (RMID_VAL_ERROR | RMID_VAL_UNAVAIL)) { + if (tval & RMID_VAL_UNAVAIL) { + if (rr->evtid == QOS_L3_MBM_TOTAL_EVENT_ID) + m = &rr->d->mbm_total[rmid]; + else if (rr->evtid == QOS_L3_MBM_LOCAL_EVENT_ID) + m = &rr->d->mbm_local[rmid]; + if (m) + m->prev_msr = 0; + } return tval; } switch (rr->evtid) { diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c index fd33fdbaffa9..48b1de7e3556 100644 --- a/drivers/acpi/acpi_video.c +++ b/drivers/acpi/acpi_video.c @@ -2024,8 +2024,10 @@ static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video) struct acpi_video_device *dev;
mutex_lock(&video->device_list_lock); - list_for_each_entry(dev, &video->video_device_list, entry) + list_for_each_entry(dev, &video->video_device_list, entry) { acpi_video_dev_remove_notify_handler(dev); + cancel_delayed_work_sync(&dev->switch_brightness_work); + } mutex_unlock(&video->device_list_lock);
acpi_video_bus_stop_devices(video); diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c index 203e9ee47fdb..9f52d301e977 100644 --- a/drivers/acpi/acpica/dsmethod.c +++ b/drivers/acpi/acpica/dsmethod.c @@ -462,7 +462,6 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, struct acpi_walk_state *next_walk_state = NULL; union acpi_operand_object *obj_desc; struct acpi_evaluate_info *info; - u32 i;
ACPI_FUNCTION_TRACE_PTR(ds_call_control_method, this_walk_state);
@@ -546,14 +545,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, * Delete the operands on the previous walkstate operand stack * (they were copied to new objects) */ - for (i = 0; i < obj_desc->method.param_count; i++) { - acpi_ut_remove_reference(this_walk_state->operands[i]); - this_walk_state->operands[i] = NULL; - } - - /* Clear the operand stack */ - - this_walk_state->num_operands = 0; + acpi_ds_clear_operands(this_walk_state);
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "**** Begin nested execution of [%4.4s] **** WalkState=%p\n", diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c index 5906e247b9fa..c25fe9b86e23 100644 --- a/drivers/acpi/property.c +++ b/drivers/acpi/property.c @@ -1114,6 +1114,28 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode, return NULL; }
+/* + * acpi_get_next_present_subnode - Return the next present child node handle + * @fwnode: Firmware node to find the next child node for. + * @child: Handle to one of the device's child nodes or a null handle. + * + * Like acpi_get_next_subnode(), but the device nodes returned by + * acpi_get_next_present_subnode() are guaranteed to be present. + * + * Returns: The fwnode handle of the next present sub-node. + */ +static struct fwnode_handle * +acpi_get_next_present_subnode(const struct fwnode_handle *fwnode, + struct fwnode_handle *child) +{ + do { + child = acpi_get_next_subnode(fwnode, child); + } while (is_acpi_device_node(child) && + !acpi_device_is_present(to_acpi_device_node(child))); + + return child; +} + /** * acpi_node_get_parent - Return parent fwnode of this fwnode * @fwnode: Firmware node whose parent to get @@ -1387,7 +1409,7 @@ acpi_fwnode_device_get_match_data(const struct fwnode_handle *fwnode, .property_read_string_array = \ acpi_fwnode_property_read_string_array, \ .get_parent = acpi_node_get_parent, \ - .get_next_child_node = acpi_get_next_subnode, \ + .get_next_child_node = acpi_get_next_present_subnode, \ .get_named_child_node = acpi_fwnode_get_named_child_node, \ .get_reference_args = acpi_fwnode_get_reference_args, \ .graph_get_next_endpoint = \ diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c index be9c70806b62..640e3fecd62d 100644 --- a/drivers/acpi/video_detect.c +++ b/drivers/acpi/video_detect.c @@ -556,6 +556,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "MS-7721"), }, }, + /* https://gitlab.freedesktop.org/drm/amd/-/issues/4512 */ + { + .callback = video_detect_force_native, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "82K8"), + }, + }, { }, };
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 35c87e7e4ddf..c0a22c74472d 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -1179,6 +1179,14 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc) ata_scsi_set_sense(dev, cmd, NOT_READY, 0x04, 0x21); return; } + + if (ata_id_is_locked(dev->id)) { + /* Security locked */ + /* LOGICAL UNIT ACCESS NOT AUTHORIZED */ + ata_scsi_set_sense(dev, cmd, DATA_PROTECT, 0x74, 0x71); + return; + } + /* Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */ diff --git a/drivers/base/devcoredump.c b/drivers/base/devcoredump.c index e9398bcffab6..7c62b397f134 100644 --- a/drivers/base/devcoredump.c +++ b/drivers/base/devcoredump.c @@ -30,50 +30,46 @@ struct devcd_entry { void *data; size_t datalen; /* - * Here, mutex is required to serialize the calls to del_wk work between - * user/kernel space which happens when devcd is added with device_add() - * and that sends uevent to user space. User space reads the uevents, - * and calls to devcd_data_write() which try to modify the work which is - * not even initialized/queued from devcoredump. + * There are 2 races for which mutex is required. * + * The first race is between device creation and userspace writing to + * schedule immediately destruction. * + * This race is handled by arming the timer before device creation, but + * when device creation fails the timer still exists. * - * cpu0(X) cpu1(Y) + * To solve this, hold the mutex during device_add(), and set + * init_completed on success before releasing the mutex. * - * dev_coredump() uevent sent to user space - * device_add() ======================> user space process Y reads the - * uevents writes to devcd fd - * which results into writes to + * That way the timer will never fire until device_add() is called, + * it will do nothing if init_completed is not set. The timer is also + * cancelled in that case. * - * devcd_data_write() - * mod_delayed_work() - * try_to_grab_pending() - * del_timer() - * debug_assert_init() - * INIT_DELAYED_WORK() - * schedule_delayed_work() - * - * - * Also, mutex alone would not be enough to avoid scheduling of - * del_wk work after it get flush from a call to devcd_free() - * mentioned as below. - * - * disabled_store() - * devcd_free() - * mutex_lock() devcd_data_write() - * flush_delayed_work() - * mutex_unlock() - * mutex_lock() - * mod_delayed_work() - * mutex_unlock() - * So, delete_work flag is required. + * The second race involves multiple parallel invocations of devcd_free(), + * add a deleted flag so only 1 can call the destructor. */ struct mutex mutex; - bool delete_work; + bool init_completed, deleted; struct module *owner; ssize_t (*read)(char *buffer, loff_t offset, size_t count, void *data, size_t datalen); void (*free)(void *data); + /* + * If nothing interferes and device_add() was returns success, + * del_wk will destroy the device after the timer fires. + * + * Multiple userspace processes can interfere in the working of the timer: + * - Writing to the coredump will reschedule the timer to run immediately, + * if still armed. + * + * This is handled by using "if (cancel_delayed_work()) { + * schedule_delayed_work() }", to prevent re-arming after having + * been previously fired. + * - Writing to /sys/class/devcoredump/disabled will destroy the + * coredump synchronously. + * This is handled by using disable_delayed_work_sync(), and then + * checking if deleted flag is set with &devcd->mutex held. + */ struct delayed_work del_wk; struct device *failing_dev; }; @@ -102,14 +98,27 @@ static void devcd_dev_release(struct device *dev) kfree(devcd); }
+static void __devcd_del(struct devcd_entry *devcd) +{ + devcd->deleted = true; + device_del(&devcd->devcd_dev); + put_device(&devcd->devcd_dev); +} + static void devcd_del(struct work_struct *wk) { struct devcd_entry *devcd; + bool init_completed;
devcd = container_of(wk, struct devcd_entry, del_wk.work);
- device_del(&devcd->devcd_dev); - put_device(&devcd->devcd_dev); + /* devcd->mutex serializes against dev_coredumpm_timeout */ + mutex_lock(&devcd->mutex); + init_completed = devcd->init_completed; + mutex_unlock(&devcd->mutex); + + if (init_completed) + __devcd_del(devcd); }
static ssize_t devcd_data_read(struct file *filp, struct kobject *kobj, @@ -129,12 +138,12 @@ static ssize_t devcd_data_write(struct file *filp, struct kobject *kobj, struct device *dev = kobj_to_dev(kobj); struct devcd_entry *devcd = dev_to_devcd(dev);
- mutex_lock(&devcd->mutex); - if (!devcd->delete_work) { - devcd->delete_work = true; - mod_delayed_work(system_wq, &devcd->del_wk, 0); - } - mutex_unlock(&devcd->mutex); + /* + * Although it's tempting to use mod_delayed work here, + * that will cause a reschedule if the timer already fired. + */ + if (cancel_delayed_work(&devcd->del_wk)) + schedule_delayed_work(&devcd->del_wk, 0);
return count; } @@ -162,11 +171,21 @@ static int devcd_free(struct device *dev, void *data) { struct devcd_entry *devcd = dev_to_devcd(dev);
+ /* + * To prevent a race with devcd_data_write(), cancel work and + * complete manually instead. + * + * We cannot rely on the return value of + * cancel_delayed_work_sync() here, because it might be in the + * middle of a cancel_delayed_work + schedule_delayed_work pair. + * + * devcd->mutex here guards against multiple parallel invocations + * of devcd_free(). + */ + cancel_delayed_work_sync(&devcd->del_wk); mutex_lock(&devcd->mutex); - if (!devcd->delete_work) - devcd->delete_work = true; - - flush_delayed_work(&devcd->del_wk); + if (!devcd->deleted) + __devcd_del(devcd); mutex_unlock(&devcd->mutex); return 0; } @@ -190,12 +209,10 @@ static ssize_t disabled_show(struct class *class, struct class_attribute *attr, * put_device() <- last reference * error = fn(dev, data) devcd_dev_release() * devcd_free(dev, data) kfree(devcd) - * mutex_lock(&devcd->mutex); * * - * In the above diagram, It looks like disabled_store() would be racing with parallely - * running devcd_del() and result in memory abort while acquiring devcd->mutex which - * is called after kfree of devcd memory after dropping its last reference with + * In the above diagram, it looks like disabled_store() would be racing with parallelly + * running devcd_del() and result in memory abort after dropping its last reference with * put_device(). However, this will not happens as fn(dev, data) runs * with its own reference to device via klist_node so it is not its last reference. * so, above situation would not occur. @@ -357,7 +374,7 @@ void dev_coredumpm(struct device *dev, struct module *owner, devcd->read = read; devcd->free = free; devcd->failing_dev = get_device(dev); - devcd->delete_work = false; + devcd->deleted = false;
mutex_init(&devcd->mutex); device_initialize(&devcd->devcd_dev); @@ -366,8 +383,14 @@ void dev_coredumpm(struct device *dev, struct module *owner, atomic_inc_return(&devcd_count)); devcd->devcd_dev.class = &devcd_class;
- mutex_lock(&devcd->mutex); dev_set_uevent_suppress(&devcd->devcd_dev, true); + + /* devcd->mutex prevents devcd_del() completing until init finishes */ + mutex_lock(&devcd->mutex); + devcd->init_completed = false; + INIT_DELAYED_WORK(&devcd->del_wk, devcd_del); + schedule_delayed_work(&devcd->del_wk, DEVCD_TIMEOUT); + if (device_add(&devcd->devcd_dev)) goto put_device;
@@ -381,13 +404,20 @@ void dev_coredumpm(struct device *dev, struct module *owner,
dev_set_uevent_suppress(&devcd->devcd_dev, false); kobject_uevent(&devcd->devcd_dev.kobj, KOBJ_ADD); - INIT_DELAYED_WORK(&devcd->del_wk, devcd_del); - schedule_delayed_work(&devcd->del_wk, DEVCD_TIMEOUT); + + /* + * Safe to run devcd_del() now that we are done with devcd_dev. + * Alternatively we could have taken a ref on devcd_dev before + * dropping the lock. + */ + devcd->init_completed = true; mutex_unlock(&devcd->mutex); return; put_device: - put_device(&devcd->devcd_dev); mutex_unlock(&devcd->mutex); + cancel_delayed_work_sync(&devcd->del_wk); + put_device(&devcd->devcd_dev); + put_module: module_put(owner); free: diff --git a/drivers/base/regmap/regmap-slimbus.c b/drivers/base/regmap/regmap-slimbus.c index 0968059f1ef5..851d7bdd6b7e 100644 --- a/drivers/base/regmap/regmap-slimbus.c +++ b/drivers/base/regmap/regmap-slimbus.c @@ -48,8 +48,7 @@ struct regmap *__regmap_init_slimbus(struct slim_device *slimbus, if (IS_ERR(bus)) return ERR_CAST(bus);
- return __regmap_init(&slimbus->dev, bus, &slimbus->dev, config, - lock_key, lock_name); + return __regmap_init(&slimbus->dev, bus, slimbus, config, lock_key, lock_name); } EXPORT_SYMBOL_GPL(__regmap_init_slimbus);
@@ -63,8 +62,7 @@ struct regmap *__devm_regmap_init_slimbus(struct slim_device *slimbus, if (IS_ERR(bus)) return ERR_CAST(bus);
- return __devm_regmap_init(&slimbus->dev, bus, &slimbus, config, - lock_key, lock_name); + return __devm_regmap_init(&slimbus->dev, bus, slimbus, config, lock_key, lock_name); } EXPORT_SYMBOL_GPL(__devm_regmap_init_slimbus);
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 9f71f9135f9e..3d79637a56cc 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -4004,6 +4004,11 @@ static void btusb_disconnect(struct usb_interface *intf)
hci_unregister_dev(hdev);
+ if (data->oob_wake_irq) + device_init_wakeup(&data->udev->dev, false); + if (data->reset_gpio) + gpiod_put(data->reset_gpio); + if (intf == data->intf) { if (data->isoc) usb_driver_release_interface(&btusb_driver, data->isoc); @@ -4014,17 +4019,11 @@ static void btusb_disconnect(struct usb_interface *intf) usb_driver_release_interface(&btusb_driver, data->diag); usb_driver_release_interface(&btusb_driver, data->intf); } else if (intf == data->diag) { - usb_driver_release_interface(&btusb_driver, data->intf); if (data->isoc) usb_driver_release_interface(&btusb_driver, data->isoc); + usb_driver_release_interface(&btusb_driver, data->intf); }
- if (data->oob_wake_irq) - device_init_wakeup(&data->udev->dev, false); - - if (data->reset_gpio) - gpiod_put(data->reset_gpio); - hci_free_dev(hdev); }
diff --git a/drivers/bluetooth/hci_bcsp.c b/drivers/bluetooth/hci_bcsp.c index 8055f63603f4..8ff69111ceed 100644 --- a/drivers/bluetooth/hci_bcsp.c +++ b/drivers/bluetooth/hci_bcsp.c @@ -582,6 +582,9 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count) struct bcsp_struct *bcsp = hu->priv; const unsigned char *ptr;
+ if (!test_bit(HCI_UART_REGISTERED, &hu->flags)) + return -EUNATCH; + BT_DBG("hu %p count %d rx_state %d rx_count %ld", hu, count, bcsp->rx_state, bcsp->rx_count);
diff --git a/drivers/char/misc.c b/drivers/char/misc.c index f6a147427029..cbe86a1f2244 100644 --- a/drivers/char/misc.c +++ b/drivers/char/misc.c @@ -113,7 +113,8 @@ static int misc_open(struct inode *inode, struct file *file) } }
- if (!new_fops) { + /* Only request module for fixed minor code */ + if (!new_fops && minor < MISC_DYNAMIC_MINOR) { mutex_unlock(&misc_mtx); request_module("char-major-%d-%d", MISC_MAJOR, minor); mutex_lock(&misc_mtx); @@ -124,10 +125,11 @@ static int misc_open(struct inode *inode, struct file *file) break; } } - if (!new_fops) - goto fail; }
+ if (!new_fops) + goto fail; + /* * Place the miscdevice in the file's * private_data so it can be used by the diff --git a/drivers/clocksource/timer-vf-pit.c b/drivers/clocksource/timer-vf-pit.c index fef0bb4e0c8c..c37afdfb477f 100644 --- a/drivers/clocksource/timer-vf-pit.c +++ b/drivers/clocksource/timer-vf-pit.c @@ -35,30 +35,30 @@ static unsigned long cycle_per_jiffy;
static inline void pit_timer_enable(void) { - __raw_writel(PITTCTRL_TEN | PITTCTRL_TIE, clkevt_base + PITTCTRL); + writel(PITTCTRL_TEN | PITTCTRL_TIE, clkevt_base + PITTCTRL); }
static inline void pit_timer_disable(void) { - __raw_writel(0, clkevt_base + PITTCTRL); + writel(0, clkevt_base + PITTCTRL); }
static inline void pit_irq_acknowledge(void) { - __raw_writel(PITTFLG_TIF, clkevt_base + PITTFLG); + writel(PITTFLG_TIF, clkevt_base + PITTFLG); }
static u64 notrace pit_read_sched_clock(void) { - return ~__raw_readl(clksrc_base + PITCVAL); + return ~readl(clksrc_base + PITCVAL); }
static int __init pit_clocksource_init(unsigned long rate) { /* set the max load value and start the clock source counter */ - __raw_writel(0, clksrc_base + PITTCTRL); - __raw_writel(~0UL, clksrc_base + PITLDVAL); - __raw_writel(PITTCTRL_TEN, clksrc_base + PITTCTRL); + writel(0, clksrc_base + PITTCTRL); + writel(~0UL, clksrc_base + PITLDVAL); + writel(PITTCTRL_TEN, clksrc_base + PITTCTRL);
sched_clock_register(pit_read_sched_clock, 32, rate); return clocksource_mmio_init(clksrc_base + PITCVAL, "vf-pit", rate, @@ -76,7 +76,7 @@ static int pit_set_next_event(unsigned long delta, * hardware requirement. */ pit_timer_disable(); - __raw_writel(delta - 1, clkevt_base + PITLDVAL); + writel(delta - 1, clkevt_base + PITLDVAL); pit_timer_enable();
return 0; @@ -132,8 +132,8 @@ static struct irqaction pit_timer_irq = {
static int __init pit_clockevent_init(unsigned long rate, int irq) { - __raw_writel(0, clkevt_base + PITTCTRL); - __raw_writel(PITTFLG_TIF, clkevt_base + PITTFLG); + writel(0, clkevt_base + PITTCTRL); + writel(PITTFLG_TIF, clkevt_base + PITTFLG);
BUG_ON(setup_irq(irq, &pit_timer_irq));
@@ -189,7 +189,7 @@ static int __init pit_timer_init(struct device_node *np) cycle_per_jiffy = clk_rate / (HZ);
/* enable the pit module */ - __raw_writel(~PITMCR_MDIS, timer_base + PITMCR); + writel(~PITMCR_MDIS, timer_base + PITMCR);
ret = pit_clocksource_init(clk_rate); if (ret) diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c index 92d92e67ae0a..a9887011f1fa 100644 --- a/drivers/cpufreq/longhaul.c +++ b/drivers/cpufreq/longhaul.c @@ -956,6 +956,9 @@ static void __exit longhaul_exit(void) struct cpufreq_policy *policy = cpufreq_cpu_get(0); int i;
+ if (unlikely(!policy)) + return; + for (i = 0; i < numscales; i++) { if (mults[i] == maxmult) { struct cpufreq_freqs freqs; diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c index 25d65f64cd50..6cbb018c215a 100644 --- a/drivers/dma/dw-edma/dw-edma-core.c +++ b/drivers/dma/dw-edma/dw-edma-core.c @@ -474,6 +474,25 @@ dw_edma_device_prep_dma_cyclic(struct dma_chan *dchan, dma_addr_t paddr, return dw_edma_device_transfer(&xfer); }
+static void dw_hdma_set_callback_result(struct virt_dma_desc *vd, + enum dmaengine_tx_result result) +{ + u32 residue = 0; + struct dw_edma_desc *desc; + struct dmaengine_result *res; + + if (!vd->tx.callback_result) + return; + + desc = vd2dw_edma_desc(vd); + if (desc) + residue = desc->alloc_sz - desc->xfer_sz; + + res = &vd->tx_result; + res->result = result; + res->residue = residue; +} + static void dw_edma_done_interrupt(struct dw_edma_chan *chan) { struct dw_edma_desc *desc; @@ -489,6 +508,8 @@ static void dw_edma_done_interrupt(struct dw_edma_chan *chan) case EDMA_REQ_NONE: desc = vd2dw_edma_desc(vd); if (!desc->chunks_alloc) { + dw_hdma_set_callback_result(vd, + DMA_TRANS_NOERROR); list_del(&vd->node); vchan_cookie_complete(vd); } @@ -527,6 +548,7 @@ static void dw_edma_abort_interrupt(struct dw_edma_chan *chan) spin_lock_irqsave(&chan->vc.lock, flags); vd = vchan_next_desc(&chan->vc); if (vd) { + dw_hdma_set_callback_result(vd, DMA_TRANS_ABORTED); list_del(&vd->node); vchan_cookie_complete(vd); } diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index 827a1a9907b6..0e570303d1da 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c @@ -1013,7 +1013,7 @@ static int mv_xor_channel_remove(struct mv_xor_chan *mv_chan)
dma_async_device_unregister(&mv_chan->dmadev);
- dma_free_coherent(dev, MV_XOR_POOL_SIZE, + dma_free_wc(dev, MV_XOR_POOL_SIZE, mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool); dma_unmap_single(dev, mv_chan->dummy_src_addr, MV_XOR_MIN_BYTE_COUNT, DMA_FROM_DEVICE); @@ -1164,7 +1164,7 @@ mv_xor_channel_add(struct mv_xor_device *xordev, err_free_irq: free_irq(mv_chan->irq, mv_chan); err_free_dma: - dma_free_coherent(&pdev->dev, MV_XOR_POOL_SIZE, + dma_free_wc(&pdev->dev, MV_XOR_POOL_SIZE, mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool); err_unmap_dst: dma_unmap_single(dma_dev->dev, mv_chan->dummy_dst_addr, diff --git a/drivers/dma/sh/shdma-base.c b/drivers/dma/sh/shdma-base.c index c51de498b5b4..2cbc886d2211 100644 --- a/drivers/dma/sh/shdma-base.c +++ b/drivers/dma/sh/shdma-base.c @@ -129,12 +129,25 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx) const struct shdma_ops *ops = sdev->ops; dev_dbg(schan->dev, "Bring up channel %d\n", schan->id); - /* - * TODO: .xfer_setup() might fail on some platforms. - * Make it int then, on error remove chunks from the - * queue again - */ - ops->setup_xfer(schan, schan->slave_id); + + ret = ops->setup_xfer(schan, schan->slave_id); + if (ret < 0) { + dev_err(schan->dev, "setup_xfer failed: %d\n", ret); + + /* Remove chunks from the queue and mark them as idle */ + list_for_each_entry_safe(chunk, c, &schan->ld_queue, node) { + if (chunk->cookie == cookie) { + chunk->mark = DESC_IDLE; + list_move(&chunk->node, &schan->ld_free); + } + } + + schan->pm_state = SHDMA_PM_ESTABLISHED; + ret = pm_runtime_put(schan->dev); + + spin_unlock_irq(&schan->chan_lock); + return ret; + }
if (schan->pm_state == SHDMA_PM_PENDING) shdma_chan_xfer_ld_queue(schan); diff --git a/drivers/dma/sh/shdmac.c b/drivers/dma/sh/shdmac.c index 5aafe548ca5f..2b9774ae7fd3 100644 --- a/drivers/dma/sh/shdmac.c +++ b/drivers/dma/sh/shdmac.c @@ -301,21 +301,30 @@ static bool sh_dmae_channel_busy(struct shdma_chan *schan) return dmae_is_busy(sh_chan); }
-static void sh_dmae_setup_xfer(struct shdma_chan *schan, - int slave_id) +static int sh_dmae_setup_xfer(struct shdma_chan *schan, int slave_id) { struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan, shdma_chan);
+ int ret = 0; if (slave_id >= 0) { const struct sh_dmae_slave_config *cfg = sh_chan->config;
- dmae_set_dmars(sh_chan, cfg->mid_rid); - dmae_set_chcr(sh_chan, cfg->chcr); + ret = dmae_set_dmars(sh_chan, cfg->mid_rid); + if (ret < 0) + goto END; + + ret = dmae_set_chcr(sh_chan, cfg->chcr); + if (ret < 0) + goto END; + } else { dmae_init(sh_chan); } + +END: + return ret; }
/* diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c index 3bd8259aa030..6e2f38a15efe 100644 --- a/drivers/edac/altera_edac.c +++ b/drivers/edac/altera_edac.c @@ -1247,10 +1247,22 @@ altr_check_ocram_deps_init(struct altr_edac_device_dev *device) if (ret) return ret;
- /* Verify OCRAM has been initialized */ + /* + * Verify that OCRAM has been initialized. + * During a warm reset, OCRAM contents are retained, but the control + * and status registers are reset to their default values. Therefore, + * ECC must be explicitly re-enabled in the control register. + * Error condition: if INITCOMPLETEA is clear and ECC_EN is already set. + */ if (!ecc_test_bits(ALTR_A10_ECC_INITCOMPLETEA, - (base + ALTR_A10_ECC_INITSTAT_OFST))) - return -ENODEV; + (base + ALTR_A10_ECC_INITSTAT_OFST))) { + if (!ecc_test_bits(ALTR_A10_ECC_EN, + (base + ALTR_A10_ECC_CTRL_OFST))) + ecc_set_bits(ALTR_A10_ECC_EN, + (base + ALTR_A10_ECC_CTRL_OFST)); + else + return -ENODEV; + }
/* Enable IRQ on Single Bit Error */ writel(ALTR_A10_ECC_SERRINTEN, (base + ALTR_A10_ECC_ERRINTENS_OFST)); @@ -1420,7 +1432,7 @@ static const struct edac_device_prv_data a10_enetecc_data = { .ue_set_mask = ALTR_A10_ECC_TDERRA, .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST, .ecc_irq_handler = altr_edac_a10_ecc_irq, - .inject_fops = &altr_edac_a10_device_inject2_fops, + .inject_fops = &altr_edac_a10_device_inject_fops, };
#endif /* CONFIG_EDAC_ALTERA_ETHERNET */ @@ -1510,7 +1522,7 @@ static const struct edac_device_prv_data a10_usbecc_data = { .ue_set_mask = ALTR_A10_ECC_TDERRA, .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST, .ecc_irq_handler = altr_edac_a10_ecc_irq, - .inject_fops = &altr_edac_a10_device_inject2_fops, + .inject_fops = &altr_edac_a10_device_inject_fops, };
#endif /* CONFIG_EDAC_ALTERA_USB */ diff --git a/drivers/extcon/extcon-adc-jack.c b/drivers/extcon/extcon-adc-jack.c index 0317b614b680..26b083ccc94b 100644 --- a/drivers/extcon/extcon-adc-jack.c +++ b/drivers/extcon/extcon-adc-jack.c @@ -162,6 +162,8 @@ static int adc_jack_remove(struct platform_device *pdev) { struct adc_jack_data *data = platform_get_drvdata(pdev);
+ if (data->wakeup_source) + device_init_wakeup(&pdev->dev, false); free_irq(data->irq, data); cancel_work_sync(&data->handler.work);
diff --git a/drivers/firmware/arm_scmi/scmi_pm_domain.c b/drivers/firmware/arm_scmi/scmi_pm_domain.c index b0c8962b9885..5a9794bbe2c2 100644 --- a/drivers/firmware/arm_scmi/scmi_pm_domain.c +++ b/drivers/firmware/arm_scmi/scmi_pm_domain.c @@ -53,7 +53,7 @@ static int scmi_pd_power_off(struct generic_pm_domain *domain)
static int scmi_pm_domain_probe(struct scmi_device *sdev) { - int num_domains, i; + int num_domains, i, ret; struct device *dev = &sdev->dev; struct device_node *np = dev->of_node; struct scmi_pm_domain *scmi_pd; @@ -106,9 +106,18 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev) scmi_pd_data->domains = domains; scmi_pd_data->num_domains = num_domains;
+ ret = of_genpd_add_provider_onecell(np, scmi_pd_data); + if (ret) + goto err_rm_genpds; + dev_set_drvdata(dev, scmi_pd_data);
- return of_genpd_add_provider_onecell(np, scmi_pd_data); + return 0; +err_rm_genpds: + for (i = num_domains - 1; i >= 0; i--) + pm_genpd_remove(domains[i]); + + return ret; }
static void scmi_pm_domain_remove(struct scmi_device *sdev) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index a845eda14ece..548cd062b9cd 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -1796,8 +1796,10 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) unsigned int usize, asize; int retcode = -EINVAL;
- if (nr >= AMDKFD_CORE_IOCTL_COUNT) + if (nr >= AMDKFD_CORE_IOCTL_COUNT) { + retcode = -ENOTTY; goto err_i1; + }
if ((nr >= AMDKFD_COMMAND_START) && (nr < AMDKFD_COMMAND_END)) { u32 amdkfd_size; @@ -1810,8 +1812,10 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) asize = amdkfd_size;
cmd = ioctl->cmd; - } else + } else { + retcode = -ENOTTY; goto err_i1; + }
dev_dbg(kfd_device, "ioctl cmd 0x%x (#%d), arg 0x%lx\n", cmd, nr, arg);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h index c89326125d71..f6012c378b46 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h @@ -105,7 +105,14 @@
#define KFD_KERNEL_QUEUE_SIZE 2048
-#define KFD_UNMAP_LATENCY_MS (4000) +/* KFD_UNMAP_LATENCY_MS is the timeout CP waiting for SDMA preemption. One XCC + * can be associated to 2 SDMA engines. queue_preemption_timeout_ms is the time + * driver waiting for CP returning the UNMAP_QUEUE fence. Thus the math is + * queue_preemption_timeout_ms = sdma_preemption_time * 2 + cp workload + * The format here makes CP workload 10% of total timeout + */ +#define KFD_UNMAP_LATENCY_MS \ + ((queue_preemption_timeout_ms - queue_preemption_timeout_ms / 10) >> 1)
/* * 512 = 0x200 diff --git a/drivers/gpu/drm/etnaviv/etnaviv_buffer.c b/drivers/gpu/drm/etnaviv/etnaviv_buffer.c index 194af3979679..9991150c8201 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_buffer.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_buffer.c @@ -346,7 +346,7 @@ void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, u32 exec_state, u32 link_target, link_dwords; bool switch_context = gpu->exec_state != exec_state; bool switch_mmu_context = gpu->mmu_context != mmu_context; - unsigned int new_flush_seq = READ_ONCE(gpu->mmu_context->flush_seq); + unsigned int new_flush_seq = READ_ONCE(mmu_context->flush_seq); bool need_flush = switch_mmu_context || gpu->flush_seq != new_flush_seq; bool has_blt = !!(gpu->identity.minor_features5 & chipMinorFeatures5_BLT_ENGINE); diff --git a/drivers/gpu/drm/nouveau/nvkm/core/enum.c b/drivers/gpu/drm/nouveau/nvkm/core/enum.c index b9581feb24cc..a23b40b27b81 100644 --- a/drivers/gpu/drm/nouveau/nvkm/core/enum.c +++ b/drivers/gpu/drm/nouveau/nvkm/core/enum.c @@ -44,7 +44,7 @@ nvkm_snprintbf(char *data, int size, const struct nvkm_bitfield *bf, u32 value) bool space = false; while (size >= 1 && bf->name) { if (value & bf->mask) { - int this = snprintf(data, size, "%s%s", + int this = scnprintf(data, size, "%s%s", space ? " " : "", bf->name); size -= this; data += this; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c index 0d29fe6f6035..d31e9d380967 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c @@ -3216,6 +3216,11 @@ static int vmw_cmd_check(struct vmw_private *dev_priv,
cmd_id = header->id; + if (header->size > SVGA_CMD_MAX_DATASIZE) { + VMW_DEBUG_USER("SVGA3D command: %d is too big.\n", + cmd_id + SVGA_3D_CMD_BASE); + return -E2BIG; + } *size = header->size + sizeof(SVGA3dCmdHeader);
cmd_id -= SVGA_3D_CMD_BASE; diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index d2e355a9744a..ace24ac97b98 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -303,6 +303,9 @@ #define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500 #define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff
+#define USB_VENDOR_ID_COOLER_MASTER 0x2516 +#define USB_DEVICE_ID_COOLER_MASTER_MICE_DONGLE 0x01b7 + #define USB_VENDOR_ID_CORSAIR 0x1b1c #define USB_DEVICE_ID_CORSAIR_K90 0x1b02
@@ -1349,7 +1352,7 @@ #define USB_VENDOR_ID_SIGNOTEC 0x2133 #define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018
-#define USB_VENDOR_ID_SMARTLINKTECHNOLOGY 0x4c4a -#define USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155 0x4155 +#define USB_VENDOR_ID_JIELI_SDK_DEFAULT 0x4c4a +#define USB_DEVICE_ID_JIELI_SDK_4155 0x4155
#endif diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index d1cfd45f2585..e389a66cc9dd 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -57,6 +57,7 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_PEDALS), HID_QUIRK_NOGET }, { HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_THROTTLE), HID_QUIRK_NOGET }, + { HID_USB_DEVICE(USB_VENDOR_ID_COOLER_MASTER, USB_DEVICE_ID_COOLER_MASTER_MICE_DONGLE), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K65RGB), HID_QUIRK_NO_INIT_REPORTS }, { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K65RGB_RAPIDFIRE), HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K70RGB), HID_QUIRK_NO_INIT_REPORTS }, @@ -881,7 +882,6 @@ static const struct hid_device_id hid_ignore_list[] = { #endif { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) }, { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_HP_5MP_CAMERA_5473) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SMARTLINKTECHNOLOGY, USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155) }, { } };
@@ -1030,6 +1030,18 @@ bool hid_ignore(struct hid_device *hdev) strlen(elan_acpi_id[i].id))) return true; break; + case USB_VENDOR_ID_JIELI_SDK_DEFAULT: + /* + * Multiple USB devices with identical IDs (mic & touchscreen). + * The touch screen requires hid core processing, but the + * microphone does not. They can be distinguished by manufacturer + * and serial number. + */ + if (hdev->product == USB_DEVICE_ID_JIELI_SDK_4155 && + strncmp(hdev->name, "SmartlinkTechnology", 19) == 0 && + strncmp(hdev->uniq, "20201111000001", 14) == 0) + return true; + break; }
if (hdev->type == HID_TYPE_USBMOUSE && diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c index 785e7a07bb29..51d0f5e88ebc 100644 --- a/drivers/hwmon/dell-smm-hwmon.c +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -1016,6 +1016,13 @@ static const struct dmi_system_id i8k_dmi_table[] __initconst = { }, .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], }, + { + .ident = "Dell OptiPlex 7040", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "OptiPlex 7040"), + }, + }, { .ident = "Dell Precision", .matches = { diff --git a/drivers/iio/adc/spear_adc.c b/drivers/iio/adc/spear_adc.c index 592b97c464da..f2c4d590de0a 100644 --- a/drivers/iio/adc/spear_adc.c +++ b/drivers/iio/adc/spear_adc.c @@ -12,6 +12,7 @@ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/io.h> +#include <linux/bitfield.h> #include <linux/clk.h> #include <linux/err.h> #include <linux/completion.h> @@ -29,9 +30,9 @@
/* Bit definitions for SPEAR_ADC_STATUS */ #define SPEAR_ADC_STATUS_START_CONVERSION BIT(0) -#define SPEAR_ADC_STATUS_CHANNEL_NUM(x) ((x) << 1) +#define SPEAR_ADC_STATUS_CHANNEL_NUM_MASK GENMASK(3, 1) #define SPEAR_ADC_STATUS_ADC_ENABLE BIT(4) -#define SPEAR_ADC_STATUS_AVG_SAMPLE(x) ((x) << 5) +#define SPEAR_ADC_STATUS_AVG_SAMPLE_MASK GENMASK(8, 5) #define SPEAR_ADC_STATUS_VREF_INTERNAL BIT(9)
#define SPEAR_ADC_DATA_MASK 0x03ff @@ -148,8 +149,8 @@ static int spear_adc_read_raw(struct iio_dev *indio_dev, case IIO_CHAN_INFO_RAW: mutex_lock(&indio_dev->mlock);
- status = SPEAR_ADC_STATUS_CHANNEL_NUM(chan->channel) | - SPEAR_ADC_STATUS_AVG_SAMPLE(st->avg_samples) | + status = FIELD_PREP(SPEAR_ADC_STATUS_CHANNEL_NUM_MASK, chan->channel) | + FIELD_PREP(SPEAR_ADC_STATUS_AVG_SAMPLE_MASK, st->avg_samples) | SPEAR_ADC_STATUS_START_CONVERSION | SPEAR_ADC_STATUS_ADC_ENABLE; if (st->vref_external == 0) diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c index cae262b6ff39..fbf891642ad6 100644 --- a/drivers/input/keyboard/cros_ec_keyb.c +++ b/drivers/input/keyboard/cros_ec_keyb.c @@ -244,6 +244,12 @@ static int cros_ec_keyb_work(struct notifier_block *nb, case EC_MKBP_EVENT_KEY_MATRIX: pm_wakeup_event(ckdev->dev, 0);
+ if (!ckdev->idev) { + dev_warn_once(ckdev->dev, + "Unexpected key matrix event\n"); + return NOTIFY_OK; + } + if (ckdev->ec->event_size != ckdev->cols) { dev_err(ckdev->dev, "Discarded incomplete key matrix event.\n"); diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c index 8a36d78fed63..946bf75aa106 100644 --- a/drivers/input/misc/ati_remote2.c +++ b/drivers/input/misc/ati_remote2.c @@ -639,7 +639,7 @@ static int ati_remote2_urb_init(struct ati_remote2 *ar2) return -ENOMEM;
pipe = usb_rcvintpipe(udev, ar2->ep[i]->bEndpointAddress); - maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + maxp = usb_maxpacket(udev, pipe); maxp = maxp > 4 ? 4 : maxp;
usb_fill_int_urb(ar2->urb[i], udev, pipe, ar2->buf[i], maxp, diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c index c872ba579b03..dba8b09ebda5 100644 --- a/drivers/input/misc/cm109.c +++ b/drivers/input/misc/cm109.c @@ -749,7 +749,7 @@ static int cm109_usb_probe(struct usb_interface *intf,
/* get a handle to the interrupt data pipe */ pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); - ret = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + ret = usb_maxpacket(udev, pipe); if (ret != USB_PKT_LEN) dev_err(&intf->dev, "invalid payload size %d, expected %d\n", ret, USB_PKT_LEN); diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c index 6b1b95d58e6b..db2ba89adaef 100644 --- a/drivers/input/misc/powermate.c +++ b/drivers/input/misc/powermate.c @@ -374,7 +374,7 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
/* get a handle to the interrupt data pipe */ pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); - maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + maxp = usb_maxpacket(udev, pipe);
if (maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX) { printk(KERN_WARNING "powermate: Expected payload of %d--%d bytes, found %d bytes!\n", diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c index 8ab01c7601b1..69420781db30 100644 --- a/drivers/input/misc/yealink.c +++ b/drivers/input/misc/yealink.c @@ -905,7 +905,7 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
/* get a handle to the interrupt data pipe */ pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); - ret = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + ret = usb_maxpacket(udev, pipe); if (ret != USB_PKT_LEN) dev_err(&intf->dev, "invalid payload size %d, expected %zd\n", ret, USB_PKT_LEN); diff --git a/drivers/input/tablet/acecad.c b/drivers/input/tablet/acecad.c index a38d1fe97334..56c7e471ac32 100644 --- a/drivers/input/tablet/acecad.c +++ b/drivers/input/tablet/acecad.c @@ -130,7 +130,7 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_ return -ENODEV;
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); - maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); + maxp = usb_maxpacket(dev, pipe);
acecad = kzalloc(sizeof(struct usb_acecad), GFP_KERNEL); input_dev = input_allocate_device(); diff --git a/drivers/input/tablet/pegasus_notetaker.c b/drivers/input/tablet/pegasus_notetaker.c index 38f087404f7a..64a5ce546229 100644 --- a/drivers/input/tablet/pegasus_notetaker.c +++ b/drivers/input/tablet/pegasus_notetaker.c @@ -63,6 +63,9 @@ #define BUTTON_PRESSED 0xb5 #define COMMAND_VERSION 0xa9
+/* 1 Status + 1 Color + 2 X + 2 Y = 6 bytes */ +#define NOTETAKER_PACKET_SIZE 6 + /* in xy data packet */ #define BATTERY_NO_REPORT 0x40 #define BATTERY_LOW 0x41 @@ -296,7 +299,13 @@ static int pegasus_probe(struct usb_interface *intf, pegasus->intf = intf;
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); - pegasus->data_len = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); + pegasus->data_len = usb_maxpacket(dev, pipe); + if (pegasus->data_len < NOTETAKER_PACKET_SIZE) { + dev_err(&intf->dev, "packet size is too small (%d)\n", + pegasus->data_len); + error = -EINVAL; + goto err_free_mem; + }
pegasus->data = usb_alloc_coherent(dev, pegasus->data_len, GFP_KERNEL, &pegasus->data_dma); diff --git a/drivers/irqchip/irq-gic-v2m.c b/drivers/irqchip/irq-gic-v2m.c index 2468b285c77c..1a209869b7f5 100644 --- a/drivers/irqchip/irq-gic-v2m.c +++ b/drivers/irqchip/irq-gic-v2m.c @@ -178,14 +178,19 @@ static int gicv2m_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, { msi_alloc_info_t *info = args; struct v2m_data *v2m = NULL, *tmp; - int hwirq, offset, i, err = 0; + int hwirq, i, err = 0; + unsigned long offset; + unsigned long align_mask = nr_irqs - 1;
spin_lock(&v2m_lock); list_for_each_entry(tmp, &v2m_nodes, entry) { - offset = bitmap_find_free_region(tmp->bm, tmp->nr_spis, - get_count_order(nr_irqs)); - if (offset >= 0) { + unsigned long align_off = tmp->spi_start - (tmp->spi_start & ~align_mask); + + offset = bitmap_find_next_zero_area_off(tmp->bm, tmp->nr_spis, 0, + nr_irqs, align_mask, align_off); + if (offset < tmp->nr_spis) { v2m = tmp; + bitmap_set(v2m->bm, offset, nr_irqs); break; } } diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/mISDN/hfcsusb.c index 111a597ef23c..217968f010be 100644 --- a/drivers/isdn/hardware/mISDN/hfcsusb.c +++ b/drivers/isdn/hardware/mISDN/hfcsusb.c @@ -1904,13 +1904,13 @@ setup_instance(struct hfcsusb *hw, struct device *parent) mISDN_freebchannel(&hw->bch[1]); mISDN_freebchannel(&hw->bch[0]); mISDN_freedchannel(&hw->dch); - kfree(hw); return err; }
static int hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id) { + int err; struct hfcsusb *hw; struct usb_device *dev = interface_to_usbdev(intf); struct usb_host_interface *iface = intf->cur_altsetting; @@ -2101,20 +2101,28 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id) if (!hw->ctrl_urb) { pr_warn("%s: No memory for control urb\n", driver_info->vend_name); - kfree(hw); - return -ENOMEM; + err = -ENOMEM; + goto err_free_hw; }
pr_info("%s: %s: detected "%s" (%s, if=%d alt=%d)\n", hw->name, __func__, driver_info->vend_name, conf_str[small_match], ifnum, alt_used);
- if (setup_instance(hw, dev->dev.parent)) - return -EIO; + if (setup_instance(hw, dev->dev.parent)) { + err = -EIO; + goto err_free_urb; + }
hw->intf = intf; usb_set_intfdata(hw->intf, hw); return 0; + +err_free_urb: + usb_free_urb(hw->ctrl_urb); +err_free_hw: + kfree(hw); + return err; }
/* function called when an active device is removed */ diff --git a/drivers/media/i2c/ir-kbd-i2c.c b/drivers/media/i2c/ir-kbd-i2c.c index 56674173524f..0c1c54b5a6f5 100644 --- a/drivers/media/i2c/ir-kbd-i2c.c +++ b/drivers/media/i2c/ir-kbd-i2c.c @@ -284,9 +284,9 @@ static int get_key_avermedia_cardbus(struct IR_i2c *ir, enum rc_proto *protocol,
static int ir_key_poll(struct IR_i2c *ir) { - enum rc_proto protocol; - u32 scancode; - u8 toggle; + enum rc_proto protocol = 0; + u32 scancode = 0; + u8 toggle = 0; int rc;
dev_dbg(&ir->rc->dev, "%s\n", __func__); diff --git a/drivers/media/pci/ivtv/ivtv-alsa-pcm.c b/drivers/media/pci/ivtv/ivtv-alsa-pcm.c index 9e6019a159f4..0b6b77aa29dd 100644 --- a/drivers/media/pci/ivtv/ivtv-alsa-pcm.c +++ b/drivers/media/pci/ivtv/ivtv-alsa-pcm.c @@ -150,14 +150,12 @@ static int snd_ivtv_pcm_capture_open(struct snd_pcm_substream *substream)
s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM];
- v4l2_fh_init(&item.fh, &s->vdev); item.itv = itv; item.type = s->type;
/* See if the stream is available */ if (ivtv_claim_stream(&item, item.type)) { /* No, it's already in use */ - v4l2_fh_exit(&item.fh); snd_ivtv_unlock(itvsc); return -EBUSY; } diff --git a/drivers/media/pci/ivtv/ivtv-driver.h b/drivers/media/pci/ivtv/ivtv-driver.h index 90f38552bd36..8a48b4533a02 100644 --- a/drivers/media/pci/ivtv/ivtv-driver.h +++ b/drivers/media/pci/ivtv/ivtv-driver.h @@ -325,6 +325,7 @@ struct ivtv_queue { };
struct ivtv; /* forward reference */ +struct ivtv_open_id;
struct ivtv_stream { /* These first four fields are always set, even if the stream @@ -334,7 +335,7 @@ struct ivtv_stream { const char *name; /* name of the stream */ int type; /* stream type */
- struct v4l2_fh *fh; /* pointer to the streaming filehandle */ + struct ivtv_open_id *id; /* pointer to the streaming ivtv_open_id */ spinlock_t qlock; /* locks access to the queues */ unsigned long s_flags; /* status flags, see above */ int dma; /* can be PCI_DMA_TODEVICE, PCI_DMA_FROMDEVICE or PCI_DMA_NONE */ diff --git a/drivers/media/pci/ivtv/ivtv-fileops.c b/drivers/media/pci/ivtv/ivtv-fileops.c index 4202c3a47d33..7ed0d2d85253 100644 --- a/drivers/media/pci/ivtv/ivtv-fileops.c +++ b/drivers/media/pci/ivtv/ivtv-fileops.c @@ -38,16 +38,16 @@ int ivtv_claim_stream(struct ivtv_open_id *id, int type)
if (test_and_set_bit(IVTV_F_S_CLAIMED, &s->s_flags)) { /* someone already claimed this stream */ - if (s->fh == &id->fh) { + if (s->id == id) { /* yes, this file descriptor did. So that's OK. */ return 0; } - if (s->fh == NULL && (type == IVTV_DEC_STREAM_TYPE_VBI || + if (s->id == NULL && (type == IVTV_DEC_STREAM_TYPE_VBI || type == IVTV_ENC_STREAM_TYPE_VBI)) { /* VBI is handled already internally, now also assign the file descriptor to this stream for external reading of the stream. */ - s->fh = &id->fh; + s->id = id; IVTV_DEBUG_INFO("Start Read VBI\n"); return 0; } @@ -55,7 +55,7 @@ int ivtv_claim_stream(struct ivtv_open_id *id, int type) IVTV_DEBUG_INFO("Stream %d is busy\n", type); return -EBUSY; } - s->fh = &id->fh; + s->id = id; if (type == IVTV_DEC_STREAM_TYPE_VBI) { /* Enable reinsertion interrupt */ ivtv_clear_irq_mask(itv, IVTV_IRQ_DEC_VBI_RE_INSERT); @@ -93,7 +93,7 @@ void ivtv_release_stream(struct ivtv_stream *s) struct ivtv *itv = s->itv; struct ivtv_stream *s_vbi;
- s->fh = NULL; + s->id = NULL; if ((s->type == IVTV_DEC_STREAM_TYPE_VBI || s->type == IVTV_ENC_STREAM_TYPE_VBI) && test_bit(IVTV_F_S_INTERNAL_USE, &s->s_flags)) { /* this stream is still in use internally */ @@ -125,7 +125,7 @@ void ivtv_release_stream(struct ivtv_stream *s) /* was already cleared */ return; } - if (s_vbi->fh) { + if (s_vbi->id) { /* VBI stream still claimed by a file descriptor */ return; } @@ -349,7 +349,7 @@ static ssize_t ivtv_read(struct ivtv_stream *s, char __user *ubuf, size_t tot_co size_t tot_written = 0; int single_frame = 0;
- if (atomic_read(&itv->capturing) == 0 && s->fh == NULL) { + if (atomic_read(&itv->capturing) == 0 && s->id == NULL) { /* shouldn't happen */ IVTV_DEBUG_WARN("Stream %s not initialized before read\n", s->name); return -EIO; @@ -819,7 +819,7 @@ void ivtv_stop_capture(struct ivtv_open_id *id, int gop_end) id->type == IVTV_ENC_STREAM_TYPE_VBI) && test_bit(IVTV_F_S_INTERNAL_USE, &s->s_flags)) { /* Also used internally, don't stop capturing */ - s->fh = NULL; + s->id = NULL; } else { ivtv_stop_v4l2_encode_stream(s, gop_end); @@ -903,7 +903,7 @@ int ivtv_v4l2_close(struct file *filp) v4l2_fh_exit(fh);
/* Easy case first: this stream was never claimed by us */ - if (s->fh != &id->fh) + if (s->id != id) goto close_done;
/* 'Unclaim' this stream */ diff --git a/drivers/media/pci/ivtv/ivtv-irq.c b/drivers/media/pci/ivtv/ivtv-irq.c index e39bf64c5c71..404335e5aff4 100644 --- a/drivers/media/pci/ivtv/ivtv-irq.c +++ b/drivers/media/pci/ivtv/ivtv-irq.c @@ -305,7 +305,7 @@ static void dma_post(struct ivtv_stream *s) ivtv_process_vbi_data(itv, buf, 0, s->type); s->q_dma.bytesused += buf->bytesused; } - if (s->fh == NULL) { + if (s->id == NULL) { ivtv_queue_move(s, &s->q_dma, NULL, &s->q_free, 0); return; } @@ -330,7 +330,7 @@ static void dma_post(struct ivtv_stream *s) set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags); }
- if (s->fh) + if (s->id) wake_up(&s->waitq); }
diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c index 8cab6e1500b7..6e73304a1e7c 100644 --- a/drivers/media/rc/imon.c +++ b/drivers/media/rc/imon.c @@ -652,12 +652,15 @@ static int send_packet(struct imon_context *ictx) smp_rmb(); /* ensure later readers know we're not busy */ pr_err_ratelimited("error submitting urb(%d)\n", retval); } else { - /* Wait for transmission to complete (or abort) */ - retval = wait_for_completion_interruptible( - &ictx->tx.finished); - if (retval) { + /* Wait for transmission to complete (or abort or timeout) */ + retval = wait_for_completion_interruptible_timeout(&ictx->tx.finished, 10 * HZ); + if (retval <= 0) { usb_kill_urb(ictx->tx_urb); pr_err_ratelimited("task interrupted\n"); + if (retval < 0) + ictx->tx.status = retval; + else + ictx->tx.status = -ETIMEDOUT; }
ictx->tx.busy = false; @@ -1759,14 +1762,6 @@ static void usb_rx_callback_intf0(struct urb *urb) if (!ictx) return;
- /* - * if we get a callback before we're done configuring the hardware, we - * can't yet process the data, as there's nowhere to send it, but we - * still need to submit a new rx URB to avoid wedging the hardware - */ - if (!ictx->dev_present_intf0) - goto out; - switch (urb->status) { case -ENOENT: /* usbcore unlink successful! */ return; @@ -1775,16 +1770,29 @@ static void usb_rx_callback_intf0(struct urb *urb) break;
case 0: - imon_incoming_packet(ictx, urb, intfnum); + /* + * if we get a callback before we're done configuring the hardware, we + * can't yet process the data, as there's nowhere to send it, but we + * still need to submit a new rx URB to avoid wedging the hardware + */ + if (ictx->dev_present_intf0) + imon_incoming_packet(ictx, urb, intfnum); break;
+ case -ECONNRESET: + case -EILSEQ: + case -EPROTO: + case -EPIPE: + dev_warn(ictx->dev, "imon %s: status(%d)\n", + __func__, urb->status); + return; + default: dev_warn(ictx->dev, "imon %s: status(%d): ignored\n", __func__, urb->status); break; }
-out: usb_submit_urb(ictx->rx_urb_intf0, GFP_ATOMIC); }
@@ -1800,14 +1808,6 @@ static void usb_rx_callback_intf1(struct urb *urb) if (!ictx) return;
- /* - * if we get a callback before we're done configuring the hardware, we - * can't yet process the data, as there's nowhere to send it, but we - * still need to submit a new rx URB to avoid wedging the hardware - */ - if (!ictx->dev_present_intf1) - goto out; - switch (urb->status) { case -ENOENT: /* usbcore unlink successful! */ return; @@ -1816,16 +1816,29 @@ static void usb_rx_callback_intf1(struct urb *urb) break;
case 0: - imon_incoming_packet(ictx, urb, intfnum); + /* + * if we get a callback before we're done configuring the hardware, we + * can't yet process the data, as there's nowhere to send it, but we + * still need to submit a new rx URB to avoid wedging the hardware + */ + if (ictx->dev_present_intf1) + imon_incoming_packet(ictx, urb, intfnum); break;
+ case -ECONNRESET: + case -EILSEQ: + case -EPROTO: + case -EPIPE: + dev_warn(ictx->dev, "imon %s: status(%d)\n", + __func__, urb->status); + return; + default: dev_warn(ictx->dev, "imon %s: status(%d): ignored\n", __func__, urb->status); break; }
-out: usb_submit_urb(ictx->rx_urb_intf1, GFP_ATOMIC); }
diff --git a/drivers/media/rc/redrat3.c b/drivers/media/rc/redrat3.c index c39227661047..5a9702ccd54e 100644 --- a/drivers/media/rc/redrat3.c +++ b/drivers/media/rc/redrat3.c @@ -423,7 +423,7 @@ static int redrat3_send_cmd(int cmd, struct redrat3_dev *rr3) static int redrat3_enable_detector(struct redrat3_dev *rr3) { struct device *dev = rr3->dev; - u8 ret; + int ret;
ret = redrat3_send_cmd(RR3_RC_DET_ENABLE, rr3); if (ret != 0) diff --git a/drivers/media/tuners/xc4000.c b/drivers/media/tuners/xc4000.c index 849df4d1c573..c8aa193e04e7 100644 --- a/drivers/media/tuners/xc4000.c +++ b/drivers/media/tuners/xc4000.c @@ -1089,12 +1089,12 @@ static int check_firmware(struct dvb_frontend *fe, unsigned int type,
static void xc_debug_dump(struct xc4000_priv *priv) { - u16 adc_envelope; + u16 adc_envelope = 0; u32 freq_error_hz = 0; - u16 lock_status; + u16 lock_status = 0; u32 hsync_freq_hz = 0; - u16 frame_lines; - u16 quality; + u16 frame_lines = 0; + u16 quality = 0; u16 signal = 0; u16 noise = 0; u8 hw_majorversion = 0, hw_minorversion = 0; diff --git a/drivers/media/tuners/xc5000.c b/drivers/media/tuners/xc5000.c index ea4f1ae4d686..b756b05835e0 100644 --- a/drivers/media/tuners/xc5000.c +++ b/drivers/media/tuners/xc5000.c @@ -622,14 +622,14 @@ static int xc5000_fwupload(struct dvb_frontend *fe,
static void xc_debug_dump(struct xc5000_priv *priv) { - u16 adc_envelope; + u16 adc_envelope = 0; u32 freq_error_hz = 0; - u16 lock_status; + u16 lock_status = 0; u32 hsync_freq_hz = 0; - u16 frame_lines; - u16 quality; - u16 snr; - u16 totalgain; + u16 frame_lines = 0; + u16 quality = 0; + u16 snr = 0; + u16 totalgain = 0; u8 hw_majorversion = 0, hw_minorversion = 0; u8 fw_majorversion = 0, fw_minorversion = 0; u16 fw_buildversion = 0; diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c index e24ab362e51a..7b8483f8d6f4 100644 --- a/drivers/memstick/core/memstick.c +++ b/drivers/memstick/core/memstick.c @@ -369,7 +369,9 @@ int memstick_set_rw_addr(struct memstick_dev *card) { card->next_request = h_memstick_set_rw_addr; memstick_new_req(card->host); - wait_for_completion(&card->mrq_complete); + if (!wait_for_completion_timeout(&card->mrq_complete, + msecs_to_jiffies(500))) + card->current_mrq.error = -ETIMEDOUT;
return card->current_mrq.error; } @@ -403,7 +405,9 @@ static struct memstick_dev *memstick_alloc_card(struct memstick_host *host)
card->next_request = h_memstick_read_dev_id; memstick_new_req(host); - wait_for_completion(&card->mrq_complete); + if (!wait_for_completion_timeout(&card->mrq_complete, + msecs_to_jiffies(500))) + card->current_mrq.error = -ETIMEDOUT;
if (card->current_mrq.error) goto err_out; diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c index 29540cbf7593..bfd116f5a58d 100644 --- a/drivers/mfd/madera-core.c +++ b/drivers/mfd/madera-core.c @@ -431,7 +431,7 @@ int madera_dev_init(struct madera *madera) struct device *dev = madera->dev; unsigned int hwid; int (*patch_fn)(struct madera *) = NULL; - const struct mfd_cell *mfd_devs; + const struct mfd_cell *mfd_devs = NULL; int n_devs = 0; int i, ret;
@@ -616,7 +616,7 @@ int madera_dev_init(struct madera *madera) goto err_reset; }
- if (!n_devs) { + if (!n_devs || !mfd_devs) { dev_err(madera->dev, "Device ID 0x%x not a %s\n", hwid, madera->type_name); ret = -ENODEV; diff --git a/drivers/mfd/stmpe-i2c.c b/drivers/mfd/stmpe-i2c.c index cd2f45257dc1..d52bb3ea7fb6 100644 --- a/drivers/mfd/stmpe-i2c.c +++ b/drivers/mfd/stmpe-i2c.c @@ -139,3 +139,4 @@ module_exit(stmpe_exit); MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("STMPE MFD I2C Interface Driver"); MODULE_AUTHOR("Rabin Vincent rabin.vincent@stericsson.com"); +MODULE_LICENSE("GPL"); diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c index 7f758fb60c1f..70ca3fe4e99e 100644 --- a/drivers/mfd/stmpe.c +++ b/drivers/mfd/stmpe.c @@ -1494,6 +1494,9 @@ int stmpe_probe(struct stmpe_client_info *ci, enum stmpe_partnum partnum)
int stmpe_remove(struct stmpe *stmpe) { + if (stmpe->domain) + irq_domain_remove(stmpe->domain); + if (!IS_ERR(stmpe->vio) && regulator_is_enabled(stmpe->vio)) regulator_disable(stmpe->vio); if (!IS_ERR(stmpe->vcc) && regulator_is_enabled(stmpe->vcc)) diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c index 23fd93407ece..0a79b718cf17 100644 --- a/drivers/mmc/host/renesas_sdhi_core.c +++ b/drivers/mmc/host/renesas_sdhi_core.c @@ -185,7 +185,11 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host *host, clk &= ~0xff; }
- sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk & CLK_CTL_DIV_MASK); + clock = clk & CLK_CTL_DIV_MASK; + if (clock != 0xff) + host->mmc->actual_clock /= (1 << (ffs(clock) + 1)); + + sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clock); if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2)) usleep_range(10000, 11000);
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 5e6f6c951fd4..23dda8b2b7f0 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -63,6 +63,7 @@ #define CORE_IO_PAD_PWR_SWITCH_EN (1 << 15) #define CORE_IO_PAD_PWR_SWITCH (1 << 16) #define CORE_HC_SELECT_IN_EN BIT(18) +#define CORE_HC_SELECT_IN_SDR50 (4 << 19) #define CORE_HC_SELECT_IN_HS400 (6 << 19) #define CORE_HC_SELECT_IN_MASK (7 << 19)
@@ -1034,6 +1035,10 @@ static bool sdhci_msm_is_tuning_needed(struct sdhci_host *host) { struct mmc_ios *ios = &host->mmc->ios;
+ if (ios->timing == MMC_TIMING_UHS_SDR50 && + host->flags & SDHCI_SDR50_NEEDS_TUNING) + return true; + /* * Tuning is required for SDR104, HS200 and HS400 cards and * if clock frequency is greater than 100MHz in these modes. @@ -1102,6 +1107,8 @@ static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode) struct mmc_ios ios = host->mmc->ios; struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); + const struct sdhci_msm_offset *msm_offset = msm_host->offset; + u32 config;
if (!sdhci_msm_is_tuning_needed(host)) { msm_host->use_cdr = false; @@ -1118,6 +1125,14 @@ static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode) */ msm_host->tuning_done = 0;
+ if (ios.timing == MMC_TIMING_UHS_SDR50 && + host->flags & SDHCI_SDR50_NEEDS_TUNING) { + config = readl_relaxed(host->ioaddr + msm_offset->core_vendor_spec); + config &= ~CORE_HC_SELECT_IN_MASK; + config |= CORE_HC_SELECT_IN_EN | CORE_HC_SELECT_IN_SDR50; + writel_relaxed(config, host->ioaddr + msm_offset->core_vendor_spec); + } + /* * For HS400 tuning in HS200 timing requires: * - select MCLK/2 in VENDOR_SPEC diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 1a24c1d9dd8f..17ea2be8abee 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -156,10 +156,6 @@ struct gs_host_frame { #define GS_MAX_TX_URBS 10 /* Only launch a max of GS_MAX_RX_URBS usb requests at a time. */ #define GS_MAX_RX_URBS 30 -/* Maximum number of interfaces the driver supports per device. - * Current hardware only supports 2 interfaces. The future may vary. - */ -#define GS_MAX_INTF 2
struct gs_tx_context { struct gs_can *dev; @@ -190,10 +186,11 @@ struct gs_can {
/* usb interface struct */ struct gs_usb { - struct gs_can *canch[GS_MAX_INTF]; struct usb_anchor rx_submitted; struct usb_device *udev; u8 active_channels; + u8 channel_cnt; + struct gs_can *canch[]; };
/* 'allocate' a tx context. @@ -321,7 +318,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb) }
/* device reports out of range channel id */ - if (hf->channel >= GS_MAX_INTF) + if (hf->channel >= usbcan->channel_cnt) goto device_detach;
dev = usbcan->canch[hf->channel]; @@ -409,7 +406,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb) /* USB failure take down all interfaces */ if (rc == -ENODEV) { device_detach: - for (rc = 0; rc < GS_MAX_INTF; rc++) { + for (rc = 0; rc < usbcan->channel_cnt; rc++) { if (usbcan->canch[rc]) netif_device_detach(usbcan->canch[rc]->netdev); } @@ -991,20 +988,22 @@ static int gs_usb_probe(struct usb_interface *intf, icount = dconf->icount + 1; dev_info(&intf->dev, "Configuring for %d interfaces\n", icount);
- if (icount > GS_MAX_INTF) { + if (icount > type_max(typeof(dev->channel_cnt))) { dev_err(&intf->dev, - "Driver cannot handle more that %d CAN interfaces\n", - GS_MAX_INTF); + "Driver cannot handle more that %u CAN interfaces\n", + type_max(typeof(dev->channel_cnt))); kfree(dconf); return -EINVAL; }
- dev = kzalloc(sizeof(*dev), GFP_KERNEL); + dev = kzalloc(struct_size(dev, canch, icount), GFP_KERNEL); if (!dev) { kfree(dconf); return -ENOMEM; }
+ dev->channel_cnt = icount; + init_usb_anchor(&dev->rx_submitted);
usb_set_intfdata(intf, dev); @@ -1045,7 +1044,7 @@ static void gs_usb_disconnect(struct usb_interface *intf) return; }
- for (i = 0; i < GS_MAX_INTF; i++) + for (i = 0; i < dev->channel_cnt; i++) if (dev->canch[i]) gs_destroy_candev(dev->canch[i]);
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index fea28b24a1a0..6a583e220bf8 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -347,11 +347,11 @@ static void b53_set_forwarding(struct b53_device *dev, int enable) * frames should be flooded or not. */ b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt); - mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN; + mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IP_MC; b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt); } else { b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt); - mgmt |= B53_IP_MCAST_25; + mgmt |= B53_IP_MC; b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt); } } @@ -1026,6 +1026,8 @@ static void b53_force_link(struct b53_device *dev, int port, int link) if (port == dev->cpu_port) { off = B53_PORT_OVERRIDE_CTRL; val = PORT_OVERRIDE_EN; + } else if (is5325(dev)) { + return; } else { off = B53_GMII_PORT_OVERRIDE_CTRL(port); val = GMII_PO_EN; @@ -1041,7 +1043,8 @@ static void b53_force_link(struct b53_device *dev, int port, int link) }
static void b53_force_port_config(struct b53_device *dev, int port, - int speed, int duplex, int pause) + int speed, int duplex, + bool tx_pause, bool rx_pause) { u8 reg, val, off;
@@ -1049,6 +1052,8 @@ static void b53_force_port_config(struct b53_device *dev, int port, if (port == dev->cpu_port) { off = B53_PORT_OVERRIDE_CTRL; val = PORT_OVERRIDE_EN; + } else if (is5325(dev)) { + return; } else { off = B53_GMII_PORT_OVERRIDE_CTRL(port); val = GMII_PO_EN; @@ -1061,6 +1066,10 @@ static void b53_force_port_config(struct b53_device *dev, int port, else reg &= ~PORT_OVERRIDE_FULL_DUPLEX;
+ reg &= ~(0x3 << GMII_PO_SPEED_S); + if (is5301x(dev) || is58xx(dev)) + reg &= ~PORT_OVERRIDE_SPEED_2000M; + switch (speed) { case 2000: reg |= PORT_OVERRIDE_SPEED_2000M; @@ -1079,10 +1088,24 @@ static void b53_force_port_config(struct b53_device *dev, int port, return; }
- if (pause & MLO_PAUSE_RX) - reg |= PORT_OVERRIDE_RX_FLOW; - if (pause & MLO_PAUSE_TX) - reg |= PORT_OVERRIDE_TX_FLOW; + if (is5325(dev)) + reg &= ~PORT_OVERRIDE_LP_FLOW_25; + else + reg &= ~(PORT_OVERRIDE_RX_FLOW | PORT_OVERRIDE_TX_FLOW); + + if (rx_pause) { + if (is5325(dev)) + reg |= PORT_OVERRIDE_LP_FLOW_25; + else + reg |= PORT_OVERRIDE_RX_FLOW; + } + + if (tx_pause) { + if (is5325(dev)) + reg |= PORT_OVERRIDE_LP_FLOW_25; + else + reg |= PORT_OVERRIDE_TX_FLOW; + }
b53_write8(dev, B53_CTRL_PAGE, off, reg); } @@ -1093,22 +1116,24 @@ static void b53_adjust_link(struct dsa_switch *ds, int port, struct b53_device *dev = ds->priv; struct ethtool_eee *p = &dev->ports[port].eee; u8 rgmii_ctrl = 0, reg = 0, off; - int pause = 0; + bool tx_pause = false; + bool rx_pause = false;
if (!phy_is_pseudo_fixed_link(phydev)) return;
/* Enable flow control on BCM5301x's CPU port */ if (is5301x(dev) && port == dev->cpu_port) - pause = MLO_PAUSE_TXRX_MASK; + tx_pause = rx_pause = true;
if (phydev->pause) { if (phydev->asym_pause) - pause |= MLO_PAUSE_TX; - pause |= MLO_PAUSE_RX; + tx_pause = true; + rx_pause = true; }
- b53_force_port_config(dev, port, phydev->speed, phydev->duplex, pause); + b53_force_port_config(dev, port, phydev->speed, phydev->duplex, + tx_pause, rx_pause); b53_force_link(dev, port, phydev->link);
if (is531x5(dev) && phy_interface_is_rgmii(phydev)) { @@ -1170,7 +1195,7 @@ static void b53_adjust_link(struct dsa_switch *ds, int port, } else if (is5301x(dev)) { if (port != dev->cpu_port) { b53_force_port_config(dev, dev->cpu_port, 2000, - DUPLEX_FULL, MLO_PAUSE_TXRX_MASK); + DUPLEX_FULL, true, true); b53_force_link(dev, dev->cpu_port, 1); } } @@ -1260,7 +1285,9 @@ void b53_phylink_mac_config(struct dsa_switch *ds, int port,
if (mode == MLO_AN_FIXED) { b53_force_port_config(dev, port, state->speed, - state->duplex, state->pause); + state->duplex, + !!(state->pause & MLO_PAUSE_TX), + !!(state->pause & MLO_PAUSE_RX)); return; }
@@ -1616,7 +1643,7 @@ static int b53_arl_search_wait(struct b53_device *dev) do { b53_read8(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_CTL, ®); if (!(reg & ARL_SRCH_STDN)) - return 0; + return -ENOENT;
if (reg & ARL_SRCH_VLID) return 0; diff --git a/drivers/net/dsa/b53/b53_regs.h b/drivers/net/dsa/b53/b53_regs.h index ea6897c3f6f7..95f70248c194 100644 --- a/drivers/net/dsa/b53/b53_regs.h +++ b/drivers/net/dsa/b53/b53_regs.h @@ -92,6 +92,7 @@ #define PORT_OVERRIDE_SPEED_10M (0 << PORT_OVERRIDE_SPEED_S) #define PORT_OVERRIDE_SPEED_100M (1 << PORT_OVERRIDE_SPEED_S) #define PORT_OVERRIDE_SPEED_1000M (2 << PORT_OVERRIDE_SPEED_S) +#define PORT_OVERRIDE_LP_FLOW_25 BIT(3) /* BCM5325 only */ #define PORT_OVERRIDE_RV_MII_25 BIT(4) /* BCM5325 only */ #define PORT_OVERRIDE_RX_FLOW BIT(4) #define PORT_OVERRIDE_TX_FLOW BIT(5) @@ -103,8 +104,7 @@
/* IP Multicast control (8 bit) */ #define B53_IP_MULTICAST_CTRL 0x21 -#define B53_IP_MCAST_25 BIT(0) -#define B53_IPMC_FWD_EN BIT(1) +#define B53_IP_MC BIT(0) #define B53_UC_FWD_EN BIT(6) #define B53_MC_FWD_EN BIT(7)
diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index a635c9af26c3..873b0acecd1b 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c @@ -277,9 +277,9 @@ static void macb_set_hwaddr(struct macb *bp) u32 bottom; u16 top;
- bottom = cpu_to_le32(*((u32 *)bp->dev->dev_addr)); + bottom = get_unaligned_le32(bp->dev->dev_addr); macb_or_gem_writel(bp, SA1B, bottom); - top = cpu_to_le16(*((u16 *)(bp->dev->dev_addr + 4))); + top = get_unaligned_le16(bp->dev->dev_addr + 4); macb_or_gem_writel(bp, SA1T, top);
/* Clear unused address register sets */ diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index ce235def334f..a142dfea8da9 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -1298,7 +1298,8 @@ static void be_xmit_flush(struct be_adapter *adapter, struct be_tx_obj *txo) (adapter->bmc_filt_mask & BMC_FILT_MULTICAST)
static bool be_send_pkt_to_bmc(struct be_adapter *adapter, - struct sk_buff **skb) + struct sk_buff **skb, + struct be_wrb_params *wrb_params) { struct ethhdr *eh = (struct ethhdr *)(*skb)->data; bool os2bmc = false; @@ -1362,7 +1363,7 @@ static bool be_send_pkt_to_bmc(struct be_adapter *adapter, * to BMC, asic expects the vlan to be inline in the packet. */ if (os2bmc) - *skb = be_insert_vlan_in_pkt(adapter, *skb, NULL); + *skb = be_insert_vlan_in_pkt(adapter, *skb, wrb_params);
return os2bmc; } @@ -1389,7 +1390,7 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev) /* if os2bmc is enabled and if the pkt is destined to bmc, * enqueue the pkt a 2nd time with mgmt bit set. */ - if (be_send_pkt_to_bmc(adapter, &skb)) { + if (be_send_pkt_to_bmc(adapter, &skb, &wrb_params)) { BE_WRB_F_SET(wrb_params.features, OS2BMC, 1); wrb_cnt = be_xmit_enqueue(adapter, txo, skb, &wrb_params); if (unlikely(!wrb_cnt)) diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 7b2ab0cc562c..cd2fd2926f2f 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1530,6 +1530,8 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) ndev->stats.rx_packets++; pkt_len = fec16_to_cpu(bdp->cbd_datlen); ndev->stats.rx_bytes += pkt_len; + if (fep->quirks & FEC_QUIRK_HAS_RACC) + ndev->stats.rx_bytes -= 2;
index = fec_enet_get_bd_index(bdp, &rxq->bd); skb = rxq->rx_skbuff[index]; diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_common.c b/drivers/net/ethernet/intel/fm10k/fm10k_common.c index f51a63fca513..1f919a50c765 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_common.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_common.c @@ -447,17 +447,16 @@ void fm10k_update_hw_stats_q(struct fm10k_hw *hw, struct fm10k_hw_stats_q *q, /** * fm10k_unbind_hw_stats_q - Unbind the queue counters from their queues * @q: pointer to the ring of hardware statistics queue - * @idx: index pointing to the start of the ring iteration * @count: number of queues to iterate over * * Function invalidates the index values for the queues so any updates that * may have happened are ignored and the base for the queue stats is reset. **/ -void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 idx, u32 count) +void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 count) { u32 i;
- for (i = 0; i < count; i++, idx++, q++) { + for (i = 0; i < count; i++, q++) { q->rx_stats_idx = 0; q->tx_stats_idx = 0; } diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_common.h b/drivers/net/ethernet/intel/fm10k/fm10k_common.h index 4c48fb73b3e7..13fca6a91a01 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_common.h +++ b/drivers/net/ethernet/intel/fm10k/fm10k_common.h @@ -43,6 +43,6 @@ u32 fm10k_read_hw_stats_32b(struct fm10k_hw *hw, u32 addr, void fm10k_update_hw_stats_q(struct fm10k_hw *hw, struct fm10k_hw_stats_q *q, u32 idx, u32 count); #define fm10k_unbind_hw_stats_32b(s) ((s)->base_h = 0) -void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 idx, u32 count); +void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 count); s32 fm10k_get_host_state_generic(struct fm10k_hw *hw, bool *host_ready); #endif /* _FM10K_COMMON_H_ */ diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pf.c b/drivers/net/ethernet/intel/fm10k/fm10k_pf.c index be07bfdb0bb4..40c5bdb3ac2c 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_pf.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_pf.c @@ -1509,7 +1509,7 @@ static void fm10k_rebind_hw_stats_pf(struct fm10k_hw *hw, fm10k_unbind_hw_stats_32b(&stats->nodesc_drop);
/* Unbind Queue Statistics */ - fm10k_unbind_hw_stats_q(stats->q, 0, hw->mac.max_queues); + fm10k_unbind_hw_stats_q(stats->q, hw->mac.max_queues);
/* Reinitialize bases for all stats */ fm10k_update_hw_stats_pf(hw, stats); diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_vf.c b/drivers/net/ethernet/intel/fm10k/fm10k_vf.c index dc8ccd378ec9..6a3aebd56e6c 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_vf.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_vf.c @@ -465,7 +465,7 @@ static void fm10k_rebind_hw_stats_vf(struct fm10k_hw *hw, struct fm10k_hw_stats *stats) { /* Unbind Queue Statistics */ - fm10k_unbind_hw_stats_q(stats->q, 0, hw->mac.max_queues); + fm10k_unbind_hw_stats_q(stats->q, hw->mac.max_queues);
/* Reinitialize bases for all stats */ fm10k_update_hw_stats_vf(hw, stats); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c index f1952e14c804..4acab31f53ac 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c @@ -579,26 +579,35 @@ static int mlx5e_dcbnl_ieee_setmaxrate(struct net_device *netdev, struct mlx5_core_dev *mdev = priv->mdev; u8 max_bw_value[IEEE_8021QAZ_MAX_TCS]; u8 max_bw_unit[IEEE_8021QAZ_MAX_TCS]; - __u64 upper_limit_mbps = roundup(255 * MLX5E_100MB, MLX5E_1GB); + __u64 upper_limit_mbps; + __u64 upper_limit_gbps; int i;
memset(max_bw_value, 0, sizeof(max_bw_value)); memset(max_bw_unit, 0, sizeof(max_bw_unit)); + upper_limit_mbps = 255 * MLX5E_100MB; + upper_limit_gbps = 255 * MLX5E_1GB;
for (i = 0; i <= mlx5_max_tc(mdev); i++) { if (!maxrate->tc_maxrate[i]) { max_bw_unit[i] = MLX5_BW_NO_LIMIT; continue; } - if (maxrate->tc_maxrate[i] < upper_limit_mbps) { + if (maxrate->tc_maxrate[i] <= upper_limit_mbps) { max_bw_value[i] = div_u64(maxrate->tc_maxrate[i], MLX5E_100MB); max_bw_value[i] = max_bw_value[i] ? max_bw_value[i] : 1; max_bw_unit[i] = MLX5_100_MBPS_UNIT; - } else { + } else if (max_bw_value[i] <= upper_limit_gbps) { max_bw_value[i] = div_u64(maxrate->tc_maxrate[i], MLX5E_1GB); max_bw_unit[i] = MLX5_GBPS_UNIT; + } else { + netdev_err(netdev, + "tc_%d maxrate %llu Kbps exceeds limit %llu\n", + i, maxrate->tc_maxrate[i], + upper_limit_gbps); + return -EINVAL; } }
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c index 498de6ef6870..4eeebcb50ab6 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c @@ -542,8 +542,10 @@ int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp, return -EINVAL;
rule = mlxsw_sp_acl_rule_lookup(mlxsw_sp, ruleset, f->cookie); - if (!rule) - return -EINVAL; + if (!rule) { + err = -EINVAL; + goto err_rule_get_stats; + }
err = mlxsw_sp_acl_rule_get_stats(mlxsw_sp, rule, &packets, &bytes, &lastuse); diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index 1133f6fe21a0..2baa4eab0c00 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c @@ -216,7 +216,7 @@ static struct pci_driver qede_pci_driver = { };
static struct qed_eth_cb_ops qede_ll_ops = { - { + .common = { #ifdef CONFIG_RFS_ACCEL .arfs_filter_op = qede_arfs_filter_op, #endif diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c index c3b9281885e3..0976916d6db1 100644 --- a/drivers/net/ethernet/renesas/ravb_main.c +++ b/drivers/net/ethernet/renesas/ravb_main.c @@ -1593,13 +1593,25 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev) }
skb_tx_timestamp(skb); - /* Descriptor type must be set after all the above writes */ - dma_wmb(); + if (num_tx_desc > 1) { desc->die_dt = DT_FEND; desc--; + /* When using multi-descriptors, DT_FEND needs to get written + * before DT_FSTART, but the compiler may reorder the memory + * writes in an attempt to optimize the code. + * Use a dma_wmb() barrier to make sure DT_FEND and DT_FSTART + * are written exactly in the order shown in the code. + * This is particularly important for cases where the DMA engine + * is already running when we are running this code. If the DMA + * sees DT_FSTART without the corresponding DT_FEND it will enter + * an error condition. + */ + dma_wmb(); desc->die_dt = DT_FSTART; } else { + /* Descriptor type must be set after all the above writes */ + dma_wmb(); desc->die_dt = DT_FSINGLE; }
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index f808e60b4ee4..113774999d57 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c @@ -2397,6 +2397,7 @@ static int sh_eth_set_ringparam(struct net_device *ndev, return 0; }
+#ifdef CONFIG_PM_SLEEP static void sh_eth_get_wol(struct net_device *ndev, struct ethtool_wolinfo *wol) { struct sh_eth_private *mdp = netdev_priv(ndev); @@ -2423,6 +2424,7 @@ static int sh_eth_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
return 0; } +#endif
static const struct ethtool_ops sh_eth_ethtool_ops = { .get_regs_len = sh_eth_get_regs_len, @@ -2438,8 +2440,10 @@ static const struct ethtool_ops sh_eth_ethtool_ops = { .set_ringparam = sh_eth_set_ringparam, .get_link_ksettings = phy_ethtool_get_link_ksettings, .set_link_ksettings = phy_ethtool_set_link_ksettings, +#ifdef CONFIG_PM_SLEEP .get_wol = sh_eth_get_wol, .set_wol = sh_eth_set_wol, +#endif };
/* network device open function */ diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c index 5dbb4ed1b132..5c850cc3fae4 100644 --- a/drivers/net/ethernet/ti/netcp_core.c +++ b/drivers/net/ethernet/ti/netcp_core.c @@ -1339,10 +1339,10 @@ int netcp_txpipe_open(struct netcp_tx_pipe *tx_pipe)
tx_pipe->dma_channel = knav_dma_open_channel(dev, tx_pipe->dma_chan_name, &config); - if (IS_ERR(tx_pipe->dma_channel)) { + if (!tx_pipe->dma_channel) { dev_err(dev, "failed opening tx chan(%s)\n", tx_pipe->dma_chan_name); - ret = PTR_ERR(tx_pipe->dma_channel); + ret = -EINVAL; goto err; }
@@ -1360,7 +1360,7 @@ int netcp_txpipe_open(struct netcp_tx_pipe *tx_pipe) return 0;
err: - if (!IS_ERR_OR_NULL(tx_pipe->dma_channel)) + if (tx_pipe->dma_channel) knav_dma_close_channel(tx_pipe->dma_channel); tx_pipe->dma_channel = NULL; return ret; @@ -1679,10 +1679,10 @@ static int netcp_setup_navigator_resources(struct net_device *ndev)
netcp->rx_channel = knav_dma_open_channel(netcp->netcp_device->device, netcp->dma_chan_name, &config); - if (IS_ERR(netcp->rx_channel)) { + if (!netcp->rx_channel) { dev_err(netcp->ndev_dev, "failed opening rx chan(%s\n", netcp->dma_chan_name); - ret = PTR_ERR(netcp->rx_channel); + ret = -EINVAL; goto fail; }
diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c index 1375beb3cf83..c8a01672884b 100644 --- a/drivers/net/phy/dp83867.c +++ b/drivers/net/phy/dp83867.c @@ -337,6 +337,12 @@ static int dp83867_config_init(struct phy_device *phydev) return ret; }
+ /* Although the DP83867 reports EEE capability through the + * MDIO_PCS_EEE_ABLE and MDIO_AN_EEE_ADV registers, the feature + * is not actually implemented in hardware. + */ + phydev->eee_broken_modes = MDIO_EEE_100TX | MDIO_EEE_1000T; + if (phy_interface_is_rgmii(phydev)) { val = phy_read(phydev, MII_DP83867_PHYCTRL); if (val < 0) diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 931b9a6c5dc5..bdce184759ef 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -89,8 +89,11 @@ int mdiobus_register_device(struct mdio_device *mdiodev) return err;
err = mdiobus_register_reset(mdiodev); - if (err) + if (err) { + gpiod_put(mdiodev->reset_gpio); + mdiodev->reset_gpio = NULL; return err; + }
/* Assert the reset signal */ mdio_device_reset(mdiodev, 1); diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index ef548beba684..196c48fd5119 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c @@ -230,7 +230,9 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) int i; unsigned long gpio_bits = dev->driver_info->data;
- usbnet_get_endpoints(dev,intf); + ret = usbnet_get_endpoints(dev, intf); + if (ret) + goto out;
/* Toggle the GPIOs in a manufacturer/model specific way */ for (i = 2; i >= 0; i--) { @@ -681,7 +683,9 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) u32 phyid; struct asix_common_private *priv;
- usbnet_get_endpoints(dev, intf); + ret = usbnet_get_endpoints(dev, intf); + if (ret) + return ret;
/* Maybe the boot loader passed the MAC address via device tree */ if (!eth_platform_get_mac_address(&dev->udev->dev, buf)) { @@ -1063,7 +1067,9 @@ static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf) int ret; u8 buf[ETH_ALEN] = {0};
- usbnet_get_endpoints(dev,intf); + ret = usbnet_get_endpoints(dev, intf); + if (ret) + return ret;
/* Get the MAC address */ ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf, 0); diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index acf1321657ec..274b15d2a2cc 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -229,6 +229,12 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) return 0; skbn->dev = net;
+ /* Raw IP packets don't have a MAC header, but other subsystems + * (like xfrm) may still access MAC header offsets, so they must + * be initialized. + */ + skb_reset_mac_header(skbn); + switch (skb->data[offset + qmimux_hdr_sz] & 0xf0) { case 0x40: skbn->protocol = htons(ETH_P_IP); diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 87c0bcfef480..f0dd0d7b51dc 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -1615,6 +1615,8 @@ void usbnet_disconnect (struct usb_interface *intf) net = dev->net; unregister_netdev (net);
+ cancel_work_sync(&dev->kevent); + while ((urb = usb_get_from_anchor(&dev->deferred))) { dev_kfree_skb(urb->context); kfree(urb->sg); diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c index ed6316c41cb7..a445a192b30f 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c @@ -1894,6 +1894,7 @@ int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id) if (cmd_id == WMI_CMD_UNSUPPORTED) { ath10k_warn(ar, "wmi command %d is not supported by firmware\n", cmd_id); + dev_kfree_skb_any(skb); return ret; }
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index f9508d71fc6c..74a329f5c858 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -4963,8 +4963,7 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, brcmf_dbg(TRACE, "Action frame, cookie=%lld, len=%d, freq=%d\n", *cookie, le16_to_cpu(action_frame->len), freq);
- ack = brcmf_p2p_send_action_frame(cfg, cfg_to_ndev(cfg), - af_params); + ack = brcmf_p2p_send_action_frame(vif->ifp, af_params);
cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack, GFP_KERNEL); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c index 1f5deea5a288..1b9011a90f1b 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c @@ -1477,6 +1477,7 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp, /** * brcmf_p2p_tx_action_frame() - send action frame over fil. * + * @ifp: interface to transmit on. * @p2p: p2p info struct for vif. * @af_params: action frame data/info. * @@ -1486,11 +1487,11 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp, * The WLC_E_ACTION_FRAME_COMPLETE event will be received when the action * frame is transmitted. */ -static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p, +static s32 brcmf_p2p_tx_action_frame(struct brcmf_if *ifp, + struct brcmf_p2p_info *p2p, struct brcmf_fil_af_params_le *af_params) { struct brcmf_pub *drvr = p2p->cfg->pub; - struct brcmf_cfg80211_vif *vif; s32 err = 0; s32 timeout = 0;
@@ -1500,8 +1501,7 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p, clear_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status); clear_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
- vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif; - err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe", af_params, + err = brcmf_fil_bsscfg_data_set(ifp, "actframe", af_params, sizeof(*af_params)); if (err) { bphy_err(drvr, " sending action frame has failed\n"); @@ -1643,16 +1643,14 @@ static s32 brcmf_p2p_pub_af_tx(struct brcmf_cfg80211_info *cfg, /** * brcmf_p2p_send_action_frame() - send action frame . * - * @cfg: driver private data for cfg80211 interface. - * @ndev: net device to transmit on. + * @ifp: interface to transmit on. * @af_params: configuration data for action frame. */ -bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg, - struct net_device *ndev, +bool brcmf_p2p_send_action_frame(struct brcmf_if *ifp, struct brcmf_fil_af_params_le *af_params) { + struct brcmf_cfg80211_info *cfg = ifp->drvr->config; struct brcmf_p2p_info *p2p = &cfg->p2p; - struct brcmf_if *ifp = netdev_priv(ndev); struct brcmf_fil_action_frame_le *action_frame; struct brcmf_config_af_params config_af_params; struct afx_hdl *afx_hdl = &p2p->afx_hdl; @@ -1779,7 +1777,7 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg, tx_retry = 0; while (!p2p->block_gon_req_tx && (ack == false) && (tx_retry < P2P_AF_TX_MAX_RETRY)) { - ack = !brcmf_p2p_tx_action_frame(p2p, af_params); + ack = !brcmf_p2p_tx_action_frame(ifp, p2p, af_params); tx_retry++; } if (ack == false) { @@ -2137,7 +2135,6 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,
WARN_ON(p2p_ifp->bsscfgidx != bsscfgidx);
- init_completion(&p2p->send_af_done); INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler); init_completion(&p2p->afx_hdl.act_frm_scan); init_completion(&p2p->wait_next_af); @@ -2390,6 +2387,8 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced) pri_ifp = brcmf_get_ifp(cfg->pub, 0); p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
+ init_completion(&p2p->send_af_done); + if (p2pdev_forced) { err_ptr = brcmf_p2p_create_p2pdev(p2p, NULL, NULL); if (IS_ERR(err_ptr)) { diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h index 64ab9b6a677d..2472b0ccb8a4 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h @@ -165,8 +165,7 @@ int brcmf_p2p_notify_action_frame_rx(struct brcmf_if *ifp, int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp, const struct brcmf_event_msg *e, void *data); -bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg, - struct net_device *ndev, +bool brcmf_p2p_send_action_frame(struct brcmf_if *ifp, struct brcmf_fil_af_params_le *af_params); bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg, struct brcmf_bss_info_le *bi); diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index 0153abdbbc8d..fe50d147e74e 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c @@ -215,7 +215,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, pages_free: devm_memunmap_pages(&pdev->dev, pgmap); pgmap_free: - devm_kfree(&pdev->dev, pgmap); + devm_kfree(&pdev->dev, p2p_pgmap); return error; } EXPORT_SYMBOL_GPL(pci_p2pdma_add_resource); diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 2733ca94434d..e9aed73cfd5f 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -2541,6 +2541,7 @@ static void quirk_disable_msi(struct pci_dev *dev) DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0xa238, quirk_disable_msi); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x5a3f, quirk_disable_msi); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_RDC, 0x1031, quirk_disable_msi);
/* * The APC bridge device in AMD 780 family northbridges has some random diff --git a/drivers/phy/cadence/cdns-dphy.c b/drivers/phy/cadence/cdns-dphy.c index 90c4e9b5aac8..04cee5a00a5b 100644 --- a/drivers/phy/cadence/cdns-dphy.c +++ b/drivers/phy/cadence/cdns-dphy.c @@ -115,7 +115,7 @@ static int cdns_dsi_get_dphy_pll_cfg(struct cdns_dphy *dphy,
dlane_bps = opts->hs_clk_rate;
- if (dlane_bps > 2500000000UL || dlane_bps < 160000000UL) + if (dlane_bps > 2500000000UL || dlane_bps < 80000000UL) return -EINVAL; else if (dlane_bps >= 1250000000) cfg->pll_opdiv = 1; @@ -125,6 +125,8 @@ static int cdns_dsi_get_dphy_pll_cfg(struct cdns_dphy *dphy, cfg->pll_opdiv = 4; else if (dlane_bps >= 160000000) cfg->pll_opdiv = 8; + else if (dlane_bps >= 80000000) + cfg->pll_opdiv = 16;
cfg->pll_fbdiv = DIV_ROUND_UP_ULL(dlane_bps * 2 * cfg->pll_opdiv * cfg->pll_ipdiv, diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c index 2f0bed86467f..2bb4924fc302 100644 --- a/drivers/regulator/fixed.c +++ b/drivers/regulator/fixed.c @@ -244,8 +244,10 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) drvdata->dev = devm_regulator_register(&pdev->dev, &drvdata->desc, &cfg); if (IS_ERR(drvdata->dev)) { - ret = PTR_ERR(drvdata->dev); - dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret); + ret = dev_err_probe(&pdev->dev, PTR_ERR(drvdata->dev), + "Failed to register regulator: %ld\n", + PTR_ERR(drvdata->dev)); + gpiod_put(cfg.ena_gpiod); return ret; }
diff --git a/drivers/remoteproc/qcom_q6v5.c b/drivers/remoteproc/qcom_q6v5.c index 9c9beeb3bcd7..a6ddb58330eb 100644 --- a/drivers/remoteproc/qcom_q6v5.c +++ b/drivers/remoteproc/qcom_q6v5.c @@ -121,6 +121,11 @@ static irqreturn_t q6v5_handover_interrupt(int irq, void *data) { struct qcom_q6v5 *q6v5 = data;
+ if (q6v5->handover_issued) { + dev_err(q6v5->dev, "Handover signaled, but it already happened\n"); + return IRQ_HANDLED; + } + if (q6v5->handover) q6v5->handover(q6v5);
diff --git a/drivers/s390/net/ctcm_mpc.c b/drivers/s390/net/ctcm_mpc.c index d766002bc5be..e76b6e7f80ac 100644 --- a/drivers/s390/net/ctcm_mpc.c +++ b/drivers/s390/net/ctcm_mpc.c @@ -712,7 +712,6 @@ static void mpc_rcvd_sweep_req(struct mpcg_info *mpcginfo)
grp->sweep_req_pend_num--; ctcmpc_send_sweep_resp(ch); - kfree(mpcginfo); return; }
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.h b/drivers/scsi/lpfc/lpfc_debugfs.h index 20f2537af511..6cd5605ad00b 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.h +++ b/drivers/scsi/lpfc/lpfc_debugfs.h @@ -44,6 +44,9 @@ /* hbqinfo output buffer size */ #define LPFC_HBQINFO_SIZE 8192
+/* hdwqinfo output buffer size */ +#define LPFC_HDWQINFO_SIZE 8192 + /* nvmestat output buffer size */ #define LPFC_NVMESTAT_SIZE 8192 #define LPFC_NVMEKTIME_SIZE 8192 diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 1d58895b3943..9201c548aab4 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -5153,7 +5153,7 @@ lpfc_chk_tgt_mapped(struct lpfc_vport *vport, struct scsi_cmnd *cmnd) /** * lpfc_reset_flush_io_context - * @vport: The virtual port (scsi_host) for the flush context - * @tgt_id: If aborting by Target contect - specifies the target id + * @tgt_id: If aborting by Target context - specifies the target id * @lun_id: If aborting by Lun context - specifies the lun id * @context: specifies the context level to flush at. * @@ -5312,8 +5312,14 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd) pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; spin_unlock_irq(shost->host_lock); } - lpfc_reset_flush_io_context(vport, tgt_id, lun_id, - LPFC_CTX_TGT); + status = lpfc_reset_flush_io_context(vport, tgt_id, lun_id, + LPFC_CTX_TGT); + if (status != SUCCESS) { + lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP, + "0726 Target Reset flush status x%x\n", + status); + return status; + } return FAST_IO_FAIL; }
@@ -5457,7 +5463,7 @@ lpfc_host_reset_handler(struct scsi_cmnd *cmnd) int rc, ret = SUCCESS;
lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP, - "3172 SCSI layer issued Host Reset Data:\n"); + "3172 SCSI layer issued Host Reset\n");
lpfc_offline_prep(phba, LPFC_MBX_WAIT); lpfc_offline(phba); diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c index 6b85016b4db3..4aace2c34f06 100644 --- a/drivers/scsi/pm8001/pm8001_ctl.c +++ b/drivers/scsi/pm8001/pm8001_ctl.c @@ -596,7 +596,7 @@ static int pm8001_set_nvmd(struct pm8001_hba_info *pm8001_ha) struct pm8001_ioctl_payload *payload; DECLARE_COMPLETION_ONSTACK(completion); u8 *ioctlbuffer; - u32 ret; + int ret; u32 length = 1024 * 5 + sizeof(*payload) - 1;
if (pm8001_ha->fw_image->size > 4096) { diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 001a3470b3aa..3a07ac8f34f8 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -2214,9 +2214,17 @@ sg_remove_sfp_usercontext(struct work_struct *work) write_lock_irqsave(&sfp->rq_list_lock, iflags); while (!list_empty(&sfp->rq_list)) { srp = list_first_entry(&sfp->rq_list, Sg_request, entry); - sg_finish_rem_req(srp); list_del(&srp->entry); + write_unlock_irqrestore(&sfp->rq_list_lock, iflags); + + sg_finish_rem_req(srp); + /* + * sg_rq_end_io() uses srp->parentfp. Hence, only clear + * srp->parentfp after blk_mq_free_request() has been called. + */ srp->parentfp = NULL; + + write_lock_irqsave(&sfp->rq_list_lock, iflags); } write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
diff --git a/drivers/soc/imx/gpc.c b/drivers/soc/imx/gpc.c index 90a8b2c0676f..8d0d05041be3 100644 --- a/drivers/soc/imx/gpc.c +++ b/drivers/soc/imx/gpc.c @@ -540,6 +540,8 @@ static int imx_gpc_remove(struct platform_device *pdev) return ret; }
+ of_node_put(pgc_node); + return 0; }
diff --git a/drivers/soc/qcom/smem.c b/drivers/soc/qcom/smem.c index 28c19bcb2f20..d2d62d2b378b 100644 --- a/drivers/soc/qcom/smem.c +++ b/drivers/soc/qcom/smem.c @@ -709,7 +709,7 @@ static u32 qcom_smem_get_item_count(struct qcom_smem *smem) if (IS_ERR_OR_NULL(ptable)) return SMEM_ITEM_COUNT;
- info = (struct smem_info *)&ptable->entry[ptable->num_entries]; + info = (struct smem_info *)&ptable->entry[le32_to_cpu(ptable->num_entries)]; if (memcmp(info->magic, SMEM_INFO_MAGIC, sizeof(info->magic))) return SMEM_ITEM_COUNT;
diff --git a/drivers/soc/ti/knav_dma.c b/drivers/soc/ti/knav_dma.c index 981a9014c9c4..f238ce3d32fb 100644 --- a/drivers/soc/ti/knav_dma.c +++ b/drivers/soc/ti/knav_dma.c @@ -420,7 +420,7 @@ static int of_channel_match_helper(struct device_node *np, const char *name, * @name: slave channel name * @config: dma configuration parameters * - * Returns pointer to appropriate DMA channel on success or error. + * Return: Pointer to appropriate DMA channel on success or NULL on error. */ void *knav_dma_open_channel(struct device *dev, const char *name, struct knav_dma_cfg *config) @@ -433,13 +433,13 @@ void *knav_dma_open_channel(struct device *dev, const char *name,
if (!kdev) { pr_err("keystone-navigator-dma driver not registered\n"); - return (void *)-EINVAL; + return NULL; }
chan_num = of_channel_match_helper(dev->of_node, name, &instance); if (chan_num < 0) { dev_err(kdev->dev, "No DMA instance with name %s\n", name); - return (void *)-EINVAL; + return NULL; }
dev_dbg(kdev->dev, "initializing %s channel %d from DMA %s\n", @@ -450,7 +450,7 @@ void *knav_dma_open_channel(struct device *dev, const char *name, if (config->direction != DMA_MEM_TO_DEV && config->direction != DMA_DEV_TO_MEM) { dev_err(kdev->dev, "bad direction\n"); - return (void *)-EINVAL; + return NULL; }
/* Look for correct dma instance */ @@ -462,7 +462,7 @@ void *knav_dma_open_channel(struct device *dev, const char *name, } if (!found) { dev_err(kdev->dev, "No DMA instance with name %s\n", instance); - return (void *)-EINVAL; + return NULL; }
/* Look for correct dma channel from dma instance */ @@ -483,14 +483,14 @@ void *knav_dma_open_channel(struct device *dev, const char *name, if (!found) { dev_err(kdev->dev, "channel %d is not in DMA %s\n", chan_num, instance); - return (void *)-EINVAL; + return NULL; }
if (atomic_read(&chan->ref_count) >= 1) { if (!check_config(chan, config)) { dev_err(kdev->dev, "channel %d config miss-match\n", chan_num); - return (void *)-EINVAL; + return NULL; } }
diff --git a/drivers/spi/spi-loopback-test.c b/drivers/spi/spi-loopback-test.c index 0f571ff13237..3edcb5bf59f7 100644 --- a/drivers/spi/spi-loopback-test.c +++ b/drivers/spi/spi-loopback-test.c @@ -403,7 +403,7 @@ static void spi_test_dump_message(struct spi_device *spi, int i; u8 b;
- dev_info(&spi->dev, " spi_msg@%pK\n", msg); + dev_info(&spi->dev, " spi_msg@%p\n", msg); if (msg->status) dev_info(&spi->dev, " status: %i\n", msg->status); @@ -413,15 +413,15 @@ static void spi_test_dump_message(struct spi_device *spi, msg->actual_length);
list_for_each_entry(xfer, &msg->transfers, transfer_list) { - dev_info(&spi->dev, " spi_transfer@%pK\n", xfer); + dev_info(&spi->dev, " spi_transfer@%p\n", xfer); dev_info(&spi->dev, " len: %i\n", xfer->len); - dev_info(&spi->dev, " tx_buf: %pK\n", xfer->tx_buf); + dev_info(&spi->dev, " tx_buf: %p\n", xfer->tx_buf); if (dump_data && xfer->tx_buf) spi_test_print_hex_dump(" TX: ", xfer->tx_buf, xfer->len);
- dev_info(&spi->dev, " rx_buf: %pK\n", xfer->rx_buf); + dev_info(&spi->dev, " rx_buf: %p\n", xfer->rx_buf); if (dump_data && xfer->rx_buf) spi_test_print_hex_dump(" RX: ", xfer->rx_buf, @@ -514,7 +514,7 @@ static int spi_check_rx_ranges(struct spi_device *spi, /* if still not found then something has modified too much */ /* we could list the "closest" transfer here... */ dev_err(&spi->dev, - "loopback strangeness - rx changed outside of allowed range at: %pK\n", + "loopback strangeness - rx changed outside of allowed range at: %p\n", addr); /* do not return, only set ret, * so that we list all addresses @@ -652,7 +652,7 @@ static int spi_test_translate(struct spi_device *spi, }
dev_err(&spi->dev, - "PointerRange [%pK:%pK[ not in range [%pK:%pK[ or [%pK:%pK[\n", + "PointerRange [%p:%p[ not in range [%p:%p[ or [%p:%p[\n", *ptr, *ptr + len, RX(0), RX(SPI_TEST_MAX_SIZE), TX(0), TX(SPI_TEST_MAX_SIZE)); diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 85be6c368cf2..4f95bd653a64 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -2055,6 +2055,16 @@ static acpi_status acpi_register_spi_device(struct spi_controller *ctlr, acpi_set_modalias(adev, acpi_device_hid(adev), spi->modalias, sizeof(spi->modalias));
+ /* + * This gets re-tried in spi_probe() for -EPROBE_DEFER handling in case + * the GPIO controller does not have a driver yet. This needs to be done + * here too, because this call sets the GPIO direction and/or bias. + * Setting these needs to be done even if there is no driver, in which + * case spi_probe() will never get called. + */ + if (spi->irq < 0) + spi->irq = acpi_dev_gpio_irq_get(adev, 0); + acpi_device_set_enumerated(adev);
adev->power.flags.ignore_parent = true; diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c index 5ae5d94c5b93..9360148e1f4e 100644 --- a/drivers/target/loopback/tcm_loop.c +++ b/drivers/target/loopback/tcm_loop.c @@ -933,6 +933,9 @@ static ssize_t tcm_loop_tpg_address_show(struct config_item *item, struct tcm_loop_tpg, tl_se_tpg); struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
+ if (!tl_hba->sh) + return -ENODEV; + return snprintf(page, PAGE_SIZE, "%d:0:%d\n", tl_hba->sh->host_no, tl_tpg->tl_tpgt); } diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c index 357944bc73b1..28cbe4613ed9 100644 --- a/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c @@ -722,7 +722,7 @@ struct tee_device *tee_device_alloc(const struct tee_desc *teedesc,
if (!teedesc || !teedesc->name || !teedesc->ops || !teedesc->ops->get_version || !teedesc->ops->open || - !teedesc->ops->release || !pool) + !teedesc->ops->release) return ERR_PTR(-EINVAL);
teedev = kzalloc(sizeof(*teedev), GFP_KERNEL); diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index 2d5a039229ac..1521a743cc90 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -283,9 +283,6 @@ static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios, long rate; int ret;
- if (IS_ERR(d->clk)) - goto out; - clk_disable_unprepare(d->clk); rate = clk_round_rate(d->clk, baud * 16); if (rate < 0) @@ -296,8 +293,10 @@ static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios, ret = clk_set_rate(d->clk, rate); clk_prepare_enable(d->clk);
- if (!ret) - p->uartclk = rate; + if (ret) + goto out; + + p->uartclk = rate;
out: p->status &= ~UPSTAT_AUTOCTS; @@ -385,6 +384,16 @@ static void dw8250_quirks(struct uart_port *p, struct dw8250_data *data) } }
+static void dw8250_clk_disable_unprepare(void *data) +{ + clk_disable_unprepare(data); +} + +static void dw8250_reset_control_assert(void *data) +{ + reset_control_assert(data); +} + static int dw8250_probe(struct platform_device *pdev) { struct uart_8250_port uart = {}, *up = &uart; @@ -473,46 +482,54 @@ static int dw8250_probe(struct platform_device *pdev) device_property_read_u32(dev, "clock-frequency", &p->uartclk);
/* If there is separate baudclk, get the rate from it. */ - data->clk = devm_clk_get(dev, "baudclk"); - if (IS_ERR(data->clk) && PTR_ERR(data->clk) != -EPROBE_DEFER) - data->clk = devm_clk_get(dev, NULL); - if (IS_ERR(data->clk) && PTR_ERR(data->clk) == -EPROBE_DEFER) - return -EPROBE_DEFER; - if (!IS_ERR_OR_NULL(data->clk)) { - err = clk_prepare_enable(data->clk); - if (err) - dev_warn(dev, "could not enable optional baudclk: %d\n", - err); - else - p->uartclk = clk_get_rate(data->clk); - } + data->clk = devm_clk_get_optional(dev, "baudclk"); + if (data->clk == NULL) + data->clk = devm_clk_get_optional(dev, NULL); + if (IS_ERR(data->clk)) + return PTR_ERR(data->clk); + + err = clk_prepare_enable(data->clk); + if (err) + dev_warn(dev, "could not enable optional baudclk: %d\n", err); + + err = devm_add_action_or_reset(dev, dw8250_clk_disable_unprepare, data->clk); + if (err) + return err; + + if (data->clk) + p->uartclk = clk_get_rate(data->clk);
/* If no clock rate is defined, fail. */ if (!p->uartclk) { dev_err(dev, "clock rate not defined\n"); - err = -EINVAL; - goto err_clk; + return -EINVAL; }
- data->pclk = devm_clk_get(dev, "apb_pclk"); - if (IS_ERR(data->pclk) && PTR_ERR(data->pclk) == -EPROBE_DEFER) { - err = -EPROBE_DEFER; - goto err_clk; - } - if (!IS_ERR(data->pclk)) { - err = clk_prepare_enable(data->pclk); - if (err) { - dev_err(dev, "could not enable apb_pclk\n"); - goto err_clk; - } + data->pclk = devm_clk_get_optional(dev, "apb_pclk"); + if (IS_ERR(data->pclk)) + return PTR_ERR(data->pclk); + + err = clk_prepare_enable(data->pclk); + if (err) { + dev_err(dev, "could not enable apb_pclk\n"); + return err; }
+ err = devm_add_action_or_reset(dev, dw8250_clk_disable_unprepare, data->pclk); + if (err) + return err; + data->rst = devm_reset_control_get_optional_exclusive(dev, NULL); - if (IS_ERR(data->rst)) { - err = PTR_ERR(data->rst); - goto err_pclk; - } - reset_control_deassert(data->rst); + if (IS_ERR(data->rst)) + return PTR_ERR(data->rst); + + err = reset_control_deassert(data->rst); + if (err) + return dev_err_probe(dev, err, "failed to deassert resets\n"); + + err = devm_add_action_or_reset(dev, dw8250_reset_control_assert, data->rst); + if (err) + return err;
dw8250_quirks(p, data);
@@ -531,10 +548,8 @@ static int dw8250_probe(struct platform_device *pdev) }
data->data.line = serial8250_register_8250_port(up); - if (data->data.line < 0) { - err = data->data.line; - goto err_reset; - } + if (data->data.line < 0) + return data->data.line;
platform_set_drvdata(pdev, data);
@@ -542,19 +557,6 @@ static int dw8250_probe(struct platform_device *pdev) pm_runtime_enable(dev);
return 0; - -err_reset: - reset_control_assert(data->rst); - -err_pclk: - if (!IS_ERR(data->pclk)) - clk_disable_unprepare(data->pclk); - -err_clk: - if (!IS_ERR(data->clk)) - clk_disable_unprepare(data->clk); - - return err; }
static int dw8250_remove(struct platform_device *pdev) @@ -566,14 +568,6 @@ static int dw8250_remove(struct platform_device *pdev)
serial8250_unregister_port(data->data.line);
- reset_control_assert(data->rst); - - if (!IS_ERR(data->pclk)) - clk_disable_unprepare(data->pclk); - - if (!IS_ERR(data->clk)) - clk_disable_unprepare(data->clk); - pm_runtime_disable(dev); pm_runtime_put_noidle(dev);
@@ -605,11 +599,9 @@ static int dw8250_runtime_suspend(struct device *dev) { struct dw8250_data *data = dev_get_drvdata(dev);
- if (!IS_ERR(data->clk)) - clk_disable_unprepare(data->clk); + clk_disable_unprepare(data->clk);
- if (!IS_ERR(data->pclk)) - clk_disable_unprepare(data->pclk); + clk_disable_unprepare(data->pclk);
return 0; } @@ -618,11 +610,9 @@ static int dw8250_runtime_resume(struct device *dev) { struct dw8250_data *data = dev_get_drvdata(dev);
- if (!IS_ERR(data->pclk)) - clk_prepare_enable(data->pclk); + clk_prepare_enable(data->pclk);
- if (!IS_ERR(data->clk)) - clk_prepare_enable(data->clk); + clk_prepare_enable(data->clk);
return 0; } diff --git a/drivers/uio/uio_hv_generic.c b/drivers/uio/uio_hv_generic.c index 10d24f47c564..0d7ebf7b35e1 100644 --- a/drivers/uio/uio_hv_generic.c +++ b/drivers/uio/uio_hv_generic.c @@ -80,9 +80,15 @@ hv_uio_irqcontrol(struct uio_info *info, s32 irq_state) { struct hv_uio_private_data *pdata = info->priv; struct hv_device *dev = pdata->device; + struct vmbus_channel *primary, *sc;
- dev->channel->inbound.ring_buffer->interrupt_mask = !irq_state; - virt_mb(); + primary = dev->channel; + primary->inbound.ring_buffer->interrupt_mask = !irq_state; + + mutex_lock(&vmbus_connection.channel_mutex); + list_for_each_entry(sc, &primary->sc_list, sc_list) + sc->inbound.ring_buffer->interrupt_mask = !irq_state; + mutex_unlock(&vmbus_connection.channel_mutex);
return 0; } @@ -93,11 +99,18 @@ hv_uio_irqcontrol(struct uio_info *info, s32 irq_state) static void hv_uio_channel_cb(void *context) { struct vmbus_channel *chan = context; - struct hv_device *hv_dev = chan->device_obj; - struct hv_uio_private_data *pdata = hv_get_drvdata(hv_dev); + struct hv_device *hv_dev; + struct hv_uio_private_data *pdata;
virt_mb();
+ /* + * The callback may come from a subchannel, in which case look + * for the hv device in the primary channel + */ + hv_dev = chan->primary_channel ? + chan->primary_channel->device_obj : chan->device_obj; + pdata = hv_get_drvdata(hv_dev); uio_event_notify(&pdata->info); }
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 9b5f9d503ff0..e0a35dc19e45 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -2012,7 +2012,12 @@ static int ffs_func_eps_enable(struct ffs_function *func) ep = func->eps; epfile = ffs->epfiles; count = ffs->eps_count; - while(count--) { + if (!epfile) { + ret = -ENOMEM; + goto done; + } + + while (count--) { ep->ep->driver_data = ep;
ret = config_ep_by_speed(func->gadget, &func->function, ep->ep); @@ -2036,6 +2041,7 @@ static int ffs_func_eps_enable(struct ffs_function *func) }
wake_up_interruptible(&ffs->wait); +done: spin_unlock_irqrestore(&func->ffs->eps_lock, flags);
return ret; diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c index 77354626252c..cea9157ea2b4 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c @@ -496,7 +496,7 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer, }
req->status = 0; - req->zero = 0; + req->zero = 1; req->length = count; req->complete = f_hidg_req_complete; req->context = hidg; @@ -767,7 +767,7 @@ static int hidg_setup(struct usb_function *f, return -EOPNOTSUPP;
respond: - req->zero = 0; + req->zero = 1; req->length = length; status = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); if (status < 0) diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c index ca50257b9538..b1e569337382 100644 --- a/drivers/usb/gadget/function/f_ncm.c +++ b/drivers/usb/gadget/function/f_ncm.c @@ -1472,6 +1472,8 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f)
ncm_opts->bound = true;
+ ncm_string_defs[1].s = ncm->ethaddr; + us = usb_gstrings_attach(cdev, ncm_strings, ARRAY_SIZE(ncm_string_defs)); if (IS_ERR(us)) { @@ -1735,7 +1737,6 @@ static struct usb_function *ncm_alloc(struct usb_function_instance *fi) mutex_unlock(&opts->lock); return ERR_PTR(-EINVAL); } - ncm_string_defs[STRING_MAC_IDX].s = ncm->ethaddr;
spin_lock_init(&ncm->lock); ncm_reset_values(ncm); diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 73570b392282..85a39a4b85ce 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -222,6 +222,7 @@ static int xhci_plat_probe(struct platform_device *pdev) }
pm_runtime_set_active(&pdev->dev); + pm_runtime_use_autosuspend(&pdev->dev); pm_runtime_enable(&pdev->dev); pm_runtime_get_noresume(&pdev->dev);
diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c index 35483217b1f6..93998d328d9a 100644 --- a/drivers/usb/mon/mon_bin.c +++ b/drivers/usb/mon/mon_bin.c @@ -68,18 +68,20 @@ * The magic limit was calculated so that it allows the monitoring * application to pick data once in two ticks. This way, another application, * which presumably drives the bus, gets to hog CPU, yet we collect our data. - * If HZ is 100, a 480 mbit/s bus drives 614 KB every jiffy. USB has an - * enormous overhead built into the bus protocol, so we need about 1000 KB. + * + * Originally, for a 480 Mbit/s bus this required a buffer of about 1 MB. For + * modern 20 Gbps buses, this value increases to over 50 MB. The maximum + * buffer size is set to 64 MiB to accommodate this. * * This is still too much for most cases, where we just snoop a few * descriptor fetches for enumeration. So, the default is a "reasonable" - * amount for systems with HZ=250 and incomplete bus saturation. + * amount for typical, low-throughput use cases. * * XXX What about multi-megabyte URBs which take minutes to transfer? */ -#define BUFF_MAX CHUNK_ALIGN(1200*1024) -#define BUFF_DFL CHUNK_ALIGN(300*1024) -#define BUFF_MIN CHUNK_ALIGN(8*1024) +#define BUFF_MAX CHUNK_ALIGN(64*1024*1024) +#define BUFF_DFL CHUNK_ALIGN(300*1024) +#define BUFF_MIN CHUNK_ALIGN(8*1024)
/* * The per-event API header (2 per URB). diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c index e94932c69f54..80a4b12563c6 100644 --- a/drivers/video/backlight/lp855x_bl.c +++ b/drivers/video/backlight/lp855x_bl.c @@ -21,7 +21,7 @@ #define LP855X_DEVICE_CTRL 0x01 #define LP855X_EEPROM_START 0xA0 #define LP855X_EEPROM_END 0xA7 -#define LP8556_EPROM_START 0xA0 +#define LP8556_EPROM_START 0x98 #define LP8556_EPROM_END 0xAF
/* LP8555/7 Registers */ diff --git a/drivers/video/fbdev/aty/atyfb_base.c b/drivers/video/fbdev/aty/atyfb_base.c index bb9ecf12e763..87b7702330b1 100644 --- a/drivers/video/fbdev/aty/atyfb_base.c +++ b/drivers/video/fbdev/aty/atyfb_base.c @@ -2576,8 +2576,12 @@ static int aty_init(struct fb_info *info) pr_cont("\n"); } #endif - if (par->pll_ops->init_pll) - par->pll_ops->init_pll(info, &par->pll); + if (par->pll_ops->init_pll) { + ret = par->pll_ops->init_pll(info, &par->pll); + if (ret) + return ret; + } + if (par->pll_ops->resume_pll) par->pll_ops->resume_pll(info, &par->pll);
diff --git a/drivers/video/fbdev/core/bitblit.c b/drivers/video/fbdev/core/bitblit.c index 5bb2b07cbe1a..75c20f8e58e3 100644 --- a/drivers/video/fbdev/core/bitblit.c +++ b/drivers/video/fbdev/core/bitblit.c @@ -80,12 +80,16 @@ static inline void bit_putcs_aligned(struct vc_data *vc, struct fb_info *info, struct fb_image *image, u8 *buf, u8 *dst) { u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + unsigned int charcnt = vc->vc_font.charcount; u32 idx = vc->vc_font.width >> 3; u8 *src;
while (cnt--) { - src = vc->vc_font.data + (scr_readw(s++)& - charmask)*cellsize; + u16 ch = scr_readw(s++) & charmask; + + if (ch >= charcnt) + ch = 0; + src = vc->vc_font.data + (unsigned int)ch * cellsize;
if (attr) { update_attr(buf, src, attr, vc); @@ -113,14 +117,18 @@ static inline void bit_putcs_unaligned(struct vc_data *vc, u8 *dst) { u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff; + unsigned int charcnt = vc->vc_font.charcount; u32 shift_low = 0, mod = vc->vc_font.width % 8; u32 shift_high = 8; u32 idx = vc->vc_font.width >> 3; u8 *src;
while (cnt--) { - src = vc->vc_font.data + (scr_readw(s++)& - charmask)*cellsize; + u16 ch = scr_readw(s++) & charmask; + + if (ch >= charcnt) + ch = 0; + src = vc->vc_font.data + (unsigned int)ch * cellsize;
if (attr) { update_attr(buf, src, attr, vc); @@ -161,6 +169,11 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info, image.height = vc->vc_font.height; image.depth = 1;
+ if (image.dy >= info->var.yres) + return; + + image.height = min(image.height, info->var.yres - image.dy); + if (attribute) { buf = kmalloc(cellsize, GFP_ATOMIC); if (!buf) @@ -174,6 +187,18 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info, cnt = count;
image.width = vc->vc_font.width * cnt; + + if (image.dx >= info->var.xres) + break; + + if (image.dx + image.width > info->var.xres) { + image.width = info->var.xres - image.dx; + cnt = image.width / vc->vc_font.width; + if (cnt == 0) + break; + image.width = cnt * vc->vc_font.width; + } + pitch = DIV_ROUND_UP(image.width, 8) + scan_align; pitch &= ~scan_align; size = pitch * image.height + buf_align; diff --git a/drivers/video/fbdev/pvr2fb.c b/drivers/video/fbdev/pvr2fb.c index c916e9161443..efdb325461a2 100644 --- a/drivers/video/fbdev/pvr2fb.c +++ b/drivers/video/fbdev/pvr2fb.c @@ -191,7 +191,7 @@ static unsigned long pvr2fb_map;
#ifdef CONFIG_PVR2_DMA static unsigned int shdma = PVR2_CASCADE_CHAN; -static unsigned int pvr2dma = ONCHIP_NR_DMA_CHANNELS; +static unsigned int pvr2dma = CONFIG_NR_ONCHIP_DMA_CHANNELS; #endif
static struct fb_videomode pvr2_modedb[] = { diff --git a/drivers/video/fbdev/valkyriefb.c b/drivers/video/fbdev/valkyriefb.c index e04fde9c1fcd..152b6db0c8f9 100644 --- a/drivers/video/fbdev/valkyriefb.c +++ b/drivers/video/fbdev/valkyriefb.c @@ -336,11 +336,13 @@ int __init valkyriefb_init(void)
if (of_address_to_resource(dp, 0, &r)) { printk(KERN_ERR "can't find address for valkyrie\n"); + of_node_put(dp); return 0; }
frame_buffer_phys = r.start; cmap_regs_phys = r.start + 0x304000; + of_node_put(dp); } #endif /* ppc (!CONFIG_MAC) */
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index 39def020a074..1dd8a735bf7f 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c @@ -558,7 +558,7 @@ static ssize_t caches_show(struct kobject *kobj, spin_lock(&v9fs_sessionlist_lock); list_for_each_entry(v9ses, &v9fs_sessionlist, slist) { if (v9ses->cachetag) { - n = snprintf(buf, limit, "%s\n", v9ses->cachetag); + n = snprintf(buf + count, limit, "%s\n", v9ses->cachetag); if (n < 0) { count = n; break; @@ -594,13 +594,16 @@ static struct attribute_group v9fs_attr_group = {
static int __init v9fs_sysfs_init(void) { + int ret; + v9fs_kobj = kobject_create_and_add("9p", fs_kobj); if (!v9fs_kobj) return -ENOMEM;
- if (sysfs_create_group(v9fs_kobj, &v9fs_attr_group)) { + ret = sysfs_create_group(v9fs_kobj, &v9fs_attr_group); + if (ret) { kobject_put(v9fs_kobj); - return -ENOMEM; + return ret; }
return 0; diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 094b024bbf0c..6618b42defed 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -1546,7 +1546,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, } /* see comments in should_cow_block() */ set_bit(BTRFS_ROOT_FORCE_COW, &root->state); - smp_wmb(); + smp_mb__after_atomic();
btrfs_set_root_node(new_root_item, tmp); /* record when the snapshot was created in key.offset */ diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c index 544e9e85b120..d93515c2fa56 100644 --- a/fs/ceph/locks.c +++ b/fs/ceph/locks.c @@ -206,7 +206,10 @@ static int ceph_lock_wait_for_completion(struct ceph_mds_client *mdsc, if (err && err != -ERESTARTSYS) return err;
- wait_for_completion_killable(&req->r_safe_completion); + err = wait_for_completion_killable(&req->r_safe_completion); + if (err) + return err; + return 0; }
diff --git a/fs/hpfs/namei.c b/fs/hpfs/namei.c index 1aee39160ac5..bc1309ef4cfa 100644 --- a/fs/hpfs/namei.c +++ b/fs/hpfs/namei.c @@ -52,8 +52,10 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) dee.fnode = cpu_to_le32(fno); dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb)); result = new_inode(dir->i_sb); - if (!result) + if (!result) { + err = -ENOMEM; goto bail2; + } hpfs_init_inode(result); result->i_ino = fno; hpfs_i(result)->i_parent_dir = dir->i_ino; @@ -154,9 +156,10 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, b dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
result = new_inode(dir->i_sb); - if (!result) + if (!result) { + err = -ENOMEM; goto bail1; - + } hpfs_init_inode(result); result->i_ino = fno; result->i_mode |= S_IFREG; @@ -241,9 +244,10 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, de dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
result = new_inode(dir->i_sb); - if (!result) + if (!result) { + err = -ENOMEM; goto bail1; - + } hpfs_init_inode(result); result->i_ino = fno; hpfs_i(result)->i_parent_dir = dir->i_ino; @@ -317,8 +321,10 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
result = new_inode(dir->i_sb); - if (!result) + if (!result) { + err = -ENOMEM; goto bail1; + } result->i_ino = fno; hpfs_init_inode(result); hpfs_i(result)->i_parent_dir = dir->i_ino; diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index 6d353fbe67c0..0fb502ed7273 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -59,9 +59,15 @@ struct inode *jfs_iget(struct super_block *sb, unsigned long ino) */ inode->i_link[inode->i_size] = '\0'; } - } else { + } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || + S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { inode->i_op = &jfs_file_inode_operations; init_special_inode(inode, inode->i_mode, inode->i_rdev); + } else { + printk(KERN_DEBUG "JFS: Invalid file type 0%04o for inode %lu.\n", + inode->i_mode, inode->i_ino); + iget_failed(inode); + return ERR_PTR(-EIO); } unlock_new_inode(inode); return inode; diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index 6f6a5b9203d3..97a2eb0f0b75 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c @@ -272,14 +272,15 @@ int txInit(void) if (TxBlock == NULL) return -ENOMEM;
- for (k = 1; k < nTxBlock - 1; k++) { - TxBlock[k].next = k + 1; + for (k = 0; k < nTxBlock; k++) { init_waitqueue_head(&TxBlock[k].gcwait); init_waitqueue_head(&TxBlock[k].waitor); } + + for (k = 1; k < nTxBlock - 1; k++) { + TxBlock[k].next = k + 1; + } TxBlock[k].next = 0; - init_waitqueue_head(&TxBlock[k].gcwait); - init_waitqueue_head(&TxBlock[k].waitor);
TxAnchor.freetid = 1; init_waitqueue_head(&TxAnchor.freewait); diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index eeab44727a76..dcef5785c152 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -221,6 +221,7 @@ struct nfs_client *nfs4_alloc_client(const struct nfs_client_initdata *cl_init) clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; clp->cl_mig_gen = 1; + clp->cl_last_renewal = jiffies; #if IS_ENABLED(CONFIG_NFS_V4_1) init_waitqueue_head(&clp->cl_lock_waitq); #endif diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 44770bb9017d..4e9b63c471af 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -355,7 +355,9 @@ static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dent *p++ = htonl(attrs); /* bitmap */ *p++ = htonl(12); /* attribute buffer length */ *p++ = htonl(NF4DIR); + spin_lock(&dentry->d_lock); p = xdr_encode_hyper(p, NFS_FILEID(d_inode(dentry->d_parent))); + spin_unlock(&dentry->d_lock);
readdir->pgbase = (char *)p - (char *)start; readdir->count -= readdir->pgbase; @@ -7315,10 +7317,10 @@ int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, return err; do { err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW); - if (err != -NFS4ERR_DELAY) + if (err != -NFS4ERR_DELAY && err != -NFS4ERR_GRACE) break; ssleep(1); - } while (err == -NFS4ERR_DELAY); + } while (err == -NFS4ERR_DELAY || err == -NFSERR_GRACE); return nfs4_handle_delegation_recall_error(server, state, stateid, fl, err); }
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index b64a3751c3e4..49defb02cc20 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -2660,6 +2660,9 @@ static void nfs4_state_manager(struct nfs_client *clp) case -ENETUNREACH: nfs_mark_client_ready(clp, -EIO); break; + case -EINVAL: + nfs_mark_client_ready(clp, status); + break; default: ssleep(1); break; diff --git a/fs/open.c b/fs/open.c index f1c2ec6790bb..2da364e94274 100644 --- a/fs/open.c +++ b/fs/open.c @@ -886,18 +886,20 @@ EXPORT_SYMBOL(finish_open); * finish_no_open - finish ->atomic_open() without opening the file * * @file: file pointer - * @dentry: dentry or NULL (as returned from ->lookup()) + * @dentry: dentry, ERR_PTR(-E...) or NULL (as returned from ->lookup()) * - * This can be used to set the result of a successful lookup in ->atomic_open(). + * This can be used to set the result of a lookup in ->atomic_open(). * * NB: unlike finish_open() this function does consume the dentry reference and * the caller need not dput() it. * - * Returns "0" which must be the return value of ->atomic_open() after having - * called this function. + * Returns 0 or -E..., which must be the return value of ->atomic_open() after + * having called this function. */ int finish_no_open(struct file *file, struct dentry *dentry) { + if (IS_ERR(dentry)) + return PTR_ERR(dentry); file->f_path.dentry = dentry; return 0; } diff --git a/fs/orangefs/xattr.c b/fs/orangefs/xattr.c index bdc285aea360..5e355d9d9a81 100644 --- a/fs/orangefs/xattr.c +++ b/fs/orangefs/xattr.c @@ -54,7 +54,9 @@ static inline int convert_to_internal_xattr_flags(int setxattr_flags) static unsigned int xattr_key(const char *key) { unsigned int i = 0; - while (key) + if (!key) + return 0; + while (*key) i += *key++; return i % 16; } @@ -175,8 +177,8 @@ ssize_t orangefs_inode_getxattr(struct inode *inode, const char *name, cx->length = -1; cx->timeout = jiffies + orangefs_getattr_timeout_msecs*HZ/1000; - hash_add(orangefs_inode->xattr_cache, &cx->node, - xattr_key(cx->key)); + hlist_add_head( &cx->node, + &orangefs_inode->xattr_cache[xattr_key(cx->key)]); } } goto out_release_op; @@ -229,8 +231,8 @@ ssize_t orangefs_inode_getxattr(struct inode *inode, const char *name, memcpy(cx->val, buffer, length); cx->length = length; cx->timeout = jiffies + HZ; - hash_add(orangefs_inode->xattr_cache, &cx->node, - xattr_key(cx->key)); + hlist_add_head(&cx->node, + &orangefs_inode->xattr_cache[xattr_key(cx->key)]); } }
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 372b4dad4863..c4a7d96787f3 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -671,6 +671,12 @@ void pde_put(struct proc_dir_entry *pde) } }
+static void pde_erase(struct proc_dir_entry *pde, struct proc_dir_entry *parent) +{ + rb_erase(&pde->subdir_node, &parent->subdir); + RB_CLEAR_NODE(&pde->subdir_node); +} + /* * Remove a /proc entry and free it if it's not currently in use. */ @@ -689,7 +695,7 @@ void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
de = pde_subdir_find(parent, fn, len); if (de) { - rb_erase(&de->subdir_node, &parent->subdir); + pde_erase(de, parent); if (S_ISDIR(de->mode)) { parent->nlink--; } @@ -727,13 +733,13 @@ int remove_proc_subtree(const char *name, struct proc_dir_entry *parent) write_unlock(&proc_subdir_lock); return -ENOENT; } - rb_erase(&root->subdir_node, &parent->subdir); + pde_erase(root, parent);
de = root; while (1) { next = pde_subdir_first(de); if (next) { - rb_erase(&next->subdir_node, &de->subdir); + pde_erase(next, de); de = next; continue; } diff --git a/include/linux/ata.h b/include/linux/ata.h index 6d2d31b03b4d..7e8d690df254 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h @@ -557,6 +557,7 @@ struct ata_bmdma_prd { #define ata_id_has_ncq(id) ((id)[ATA_ID_SATA_CAPABILITY] & (1 << 8)) #define ata_id_queue_depth(id) (((id)[ATA_ID_QUEUE_DEPTH] & 0x1f) + 1) #define ata_id_removable(id) ((id)[ATA_ID_CONFIG] & (1 << 7)) +#define ata_id_is_locked(id) (((id)[ATA_ID_DLF] & 0x7) == 0x7) #define ata_id_has_atapi_AN(id) \ ((((id)[ATA_ID_SATA_CAPABILITY] != 0x0000) && \ ((id)[ATA_ID_SATA_CAPABILITY] != 0xffff)) && \ diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h index b94d08d055ff..a428104c5e77 100644 --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -165,10 +165,9 @@ struct ftrace_likely_data { /* * GCC does not warn about unused static inline functions for -Wunused-function. * Suppress the warning in clang as well by using __maybe_unused, but enable it - * for W=1 build. This will allow clang to find unused functions. Remove the - * __inline_maybe_unused entirely after fixing most of -Wunused-function warnings. + * for W=2 build. This will allow clang to find unused functions. */ -#ifdef KBUILD_EXTRA_WARN1 +#ifdef KBUILD_EXTRA_WARN2 #define __inline_maybe_unused #else #define __inline_maybe_unused __maybe_unused diff --git a/include/linux/filter.h b/include/linux/filter.h index 0bec300b2e51..41ec70a74b2e 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -980,7 +980,7 @@ void bpf_jit_prog_release_other(struct bpf_prog *fp, struct bpf_prog *fp_other); static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen, u32 pass, void *image) { - pr_err("flen=%u proglen=%u pass=%u image=%pK from=%s pid=%d\n", flen, + pr_err("flen=%u proglen=%u pass=%u image=%p from=%s pid=%d\n", flen, proglen, pass, image, current->comm, task_pid_nr(current));
if (image) diff --git a/include/linux/mm.h b/include/linux/mm.h index 57cba6e4fdcd..be8c793233d3 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -293,7 +293,7 @@ extern unsigned int kobjsize(const void *objp); #define VM_MIXEDMAP 0x10000000 /* Can contain "struct page" and pure PFN pages */ #define VM_HUGEPAGE 0x20000000 /* MADV_HUGEPAGE marked this vma */ #define VM_NOHUGEPAGE 0x40000000 /* MADV_NOHUGEPAGE marked this vma */ -#define VM_MERGEABLE 0x80000000 /* KSM may merge identical pages */ +#define VM_MERGEABLE BIT(31) /* KSM may merge identical pages */
#ifdef CONFIG_ARCH_USES_HIGH_VMA_FLAGS #define VM_HIGH_ARCH_BIT_0 32 /* bit only usable on 64-bit architectures */ diff --git a/include/linux/shdma-base.h b/include/linux/shdma-base.h index 6dfd05ef5c2d..03ba4dab2ef7 100644 --- a/include/linux/shdma-base.h +++ b/include/linux/shdma-base.h @@ -96,7 +96,7 @@ struct shdma_ops { int (*desc_setup)(struct shdma_chan *, struct shdma_desc *, dma_addr_t, dma_addr_t, size_t *); int (*set_slave)(struct shdma_chan *, int, dma_addr_t, bool); - void (*setup_xfer)(struct shdma_chan *, int); + int (*setup_xfer)(struct shdma_chan *, int); void (*start_xfer)(struct shdma_chan *, struct shdma_desc *); struct shdma_desc *(*embedded_desc)(void *, int); bool (*chan_irq)(struct shdma_chan *, int); diff --git a/include/linux/usb.h b/include/linux/usb.h index ffc16257899f..b27d80d911cb 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -1964,21 +1964,17 @@ usb_pipe_endpoint(struct usb_device *dev, unsigned int pipe) return eps[usb_pipeendpoint(pipe)]; }
-/*-------------------------------------------------------------------------*/ - -static inline __u16 -usb_maxpacket(struct usb_device *udev, int pipe, int is_out) +static inline u16 usb_maxpacket(struct usb_device *udev, int pipe, + /* int is_out deprecated */ ...) { struct usb_host_endpoint *ep; unsigned epnum = usb_pipeendpoint(pipe);
- if (is_out) { - WARN_ON(usb_pipein(pipe)); + if (usb_pipeout(pipe)) ep = udev->ep_out[epnum]; - } else { - WARN_ON(usb_pipeout(pipe)); + else ep = udev->ep_in[epnum]; - } + if (!ep) return 0;
@@ -1986,8 +1982,6 @@ usb_maxpacket(struct usb_device *udev, int pipe, int is_out) return usb_endpoint_maxp(&ep->desc); }
-/* ----------------------------------------------------------------------- */ - /* translate USB error codes to codes user space understands */ static inline int usb_translate_errors(int error_code) { diff --git a/include/net/cls_cgroup.h b/include/net/cls_cgroup.h index 4295de3e6a4b..7c2ead6cdc53 100644 --- a/include/net/cls_cgroup.h +++ b/include/net/cls_cgroup.h @@ -58,7 +58,7 @@ static inline u32 task_get_classid(const struct sk_buff *skb) * calls by looking at the number of nested bh disable calls because * softirqs always disables bh. */ - if (in_serving_softirq()) { + if (softirq_count()) { struct sock *sk = skb_to_full_sk(skb);
/* If there is an sock_cgroup_classid we'll use that. */ diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h index 004e49f74841..beea7e014b15 100644 --- a/include/net/nfc/nci_core.h +++ b/include/net/nfc/nci_core.h @@ -52,7 +52,7 @@ enum nci_state { #define NCI_RF_DISC_SELECT_TIMEOUT 5000 #define NCI_RF_DEACTIVATE_TIMEOUT 30000 #define NCI_CMD_TIMEOUT 5000 -#define NCI_DATA_TIMEOUT 700 +#define NCI_DATA_TIMEOUT 3000
struct nci_dev;
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index fd99650a2e22..663e8b78bec6 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h @@ -109,7 +109,6 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, struct netlink_ext_ack *extack); void qdisc_put_rtab(struct qdisc_rate_table *tab); void qdisc_put_stab(struct qdisc_size_table *tab); -void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc); bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, struct net_device *dev, struct netdev_queue *txq, spinlock_t *root_lock, bool validate); @@ -176,4 +175,28 @@ struct tc_taprio_qopt_offload *taprio_offload_get(struct tc_taprio_qopt_offload *offload); void taprio_offload_free(struct tc_taprio_qopt_offload *offload);
+static inline void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc) +{ + if (!(qdisc->flags & TCQ_F_WARN_NONWC)) { + pr_warn("%s: %s qdisc %X: is non-work-conserving?\n", + txt, qdisc->ops->id, qdisc->handle >> 16); + qdisc->flags |= TCQ_F_WARN_NONWC; + } +} + +static inline unsigned int qdisc_peek_len(struct Qdisc *sch) +{ + struct sk_buff *skb; + unsigned int len; + + skb = sch->ops->peek(sch); + if (unlikely(skb == NULL)) { + qdisc_warn_nonwc("qdisc_peek_len", sch); + return 0; + } + len = qdisc_pkt_len(skb); + + return len; +} + #endif diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 6285674412f2..2b809bc849dd 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -2248,6 +2248,13 @@ static void handle_swbp(struct pt_regs *regs)
handler_chain(uprobe, regs);
+ /* + * If user decided to take execution elsewhere, it makes little sense + * to execute the original instruction, so let's skip it. + */ + if (instruction_pointer(regs) != bp_vaddr) + goto out; + if (arch_uprobe_skip_sstep(&uprobe->arch, regs)) goto out;
diff --git a/kernel/gcov/gcc_4_7.c b/kernel/gcov/gcc_4_7.c index 88e128c1221b..85c290f710d6 100644 --- a/kernel/gcov/gcc_4_7.c +++ b/kernel/gcov/gcc_4_7.c @@ -19,7 +19,9 @@ #include <linux/vmalloc.h> #include "gcov.h"
-#if (__GNUC__ >= 14) +#if (__GNUC__ >= 15) +#define GCOV_COUNTERS 10 +#elif (__GNUC__ >= 14) #define GCOV_COUNTERS 9 #elif (__GNUC__ >= 10) #define GCOV_COUNTERS 8 diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 1ede6d41ab8d..21d073187444 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -3634,14 +3634,16 @@ static struct field_var *create_field_var(struct hist_trigger_data *hist_data, var = create_var(hist_data, file, field_name, val->size, val->type); if (IS_ERR(var)) { hist_err(tr, HIST_ERR_VAR_CREATE_FIND_FAIL, errpos(field_name)); - kfree(val); + destroy_hist_field(val, 0); ret = PTR_ERR(var); goto err; }
field_var = kzalloc(sizeof(struct field_var), GFP_KERNEL); if (!field_var) { - kfree(val); + destroy_hist_field(val, 0); + kfree_const(var->type); + kfree(var->var.name); kfree(var); ret = -ENOMEM; goto err; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 66e4b78786a9..111f50054fc1 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8275,7 +8275,7 @@ void *__init alloc_large_system_hash(const char *tablename, panic("Failed to allocate %s hash table\n", tablename);
pr_info("%s hash table entries: %ld (order: %d, %lu bytes, %s)\n", - tablename, 1UL << log2qty, ilog2(size) - PAGE_SHIFT, size, + tablename, 1UL << log2qty, get_order(size), size, virt ? "vmalloc" : "linear");
if (_hash_shift) diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 14244445f944..c6d5cf810523 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c @@ -187,6 +187,8 @@ int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack) vlan_group_set_device(grp, vlan->vlan_proto, vlan_id, dev); grp->nr_vlan_devs++;
+ netdev_update_features(dev); + return 0;
out_unregister_netdev: diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c index 12052b766441..c7cdb5c1273a 100644 --- a/net/bluetooth/6lowpan.c +++ b/net/bluetooth/6lowpan.c @@ -52,6 +52,11 @@ static bool enable_6lowpan; static struct l2cap_chan *listen_chan; static DEFINE_MUTEX(set_lock);
+enum { + LOWPAN_PEER_CLOSING, + LOWPAN_PEER_MAXBITS +}; + struct lowpan_peer { struct list_head list; struct rcu_head rcu; @@ -60,6 +65,8 @@ struct lowpan_peer { /* peer addresses in various formats */ unsigned char lladdr[ETH_ALEN]; struct in6_addr peer_addr; + + DECLARE_BITMAP(flags, LOWPAN_PEER_MAXBITS); };
struct lowpan_btle_dev { @@ -317,6 +324,7 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev, local_skb->pkt_type = PACKET_HOST; local_skb->dev = dev;
+ skb_reset_mac_header(local_skb); skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));
if (give_skb_to_upper(local_skb, dev) != NET_RX_SUCCESS) { @@ -985,10 +993,11 @@ static struct l2cap_chan *bt_6lowpan_listen(void) }
static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type, - struct l2cap_conn **conn) + struct l2cap_conn **conn, bool disconnect) { struct hci_conn *hcon; struct hci_dev *hdev; + int le_addr_type; int n;
n = sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu", @@ -999,13 +1008,32 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type, if (n < 7) return -EINVAL;
+ if (disconnect) { + /* The "disconnect" debugfs command has used different address + * type constants than "connect" since 2015. Let's retain that + * for now even though it's obviously buggy... + */ + *addr_type += 1; + } + + switch (*addr_type) { + case BDADDR_LE_PUBLIC: + le_addr_type = ADDR_LE_DEV_PUBLIC; + break; + case BDADDR_LE_RANDOM: + le_addr_type = ADDR_LE_DEV_RANDOM; + break; + default: + return -EINVAL; + } + /* The LE_PUBLIC address type is ignored because of BDADDR_ANY */ hdev = hci_get_route(addr, BDADDR_ANY, BDADDR_LE_PUBLIC); if (!hdev) return -ENOENT;
hci_dev_lock(hdev); - hcon = hci_conn_hash_lookup_le(hdev, addr, *addr_type); + hcon = hci_conn_hash_lookup_le(hdev, addr, le_addr_type); hci_dev_unlock(hdev); hci_dev_put(hdev);
@@ -1022,41 +1050,52 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type, static void disconnect_all_peers(void) { struct lowpan_btle_dev *entry; - struct lowpan_peer *peer, *tmp_peer, *new_peer; - struct list_head peers; - - INIT_LIST_HEAD(&peers); + struct lowpan_peer *peer; + int nchans;
- /* We make a separate list of peers as the close_cb() will - * modify the device peers list so it is better not to mess - * with the same list at the same time. + /* l2cap_chan_close() cannot be called from RCU, and lock ordering + * chan->lock > devices_lock prevents taking write side lock, so copy + * then close. */
rcu_read_lock(); + list_for_each_entry_rcu(entry, &bt_6lowpan_devices, list) + list_for_each_entry_rcu(peer, &entry->peers, list) + clear_bit(LOWPAN_PEER_CLOSING, peer->flags); + rcu_read_unlock();
- list_for_each_entry_rcu(entry, &bt_6lowpan_devices, list) { - list_for_each_entry_rcu(peer, &entry->peers, list) { - new_peer = kmalloc(sizeof(*new_peer), GFP_ATOMIC); - if (!new_peer) - break; + do { + struct l2cap_chan *chans[32]; + int i;
- new_peer->chan = peer->chan; - INIT_LIST_HEAD(&new_peer->list); + nchans = 0;
- list_add(&new_peer->list, &peers); - } - } + spin_lock(&devices_lock);
- rcu_read_unlock(); + list_for_each_entry_rcu(entry, &bt_6lowpan_devices, list) { + list_for_each_entry_rcu(peer, &entry->peers, list) { + if (test_and_set_bit(LOWPAN_PEER_CLOSING, + peer->flags)) + continue;
- spin_lock(&devices_lock); - list_for_each_entry_safe(peer, tmp_peer, &peers, list) { - l2cap_chan_close(peer->chan, ENOENT); + l2cap_chan_hold(peer->chan); + chans[nchans++] = peer->chan;
- list_del_rcu(&peer->list); - kfree_rcu(peer, rcu); - } - spin_unlock(&devices_lock); + if (nchans >= ARRAY_SIZE(chans)) + goto done; + } + } + +done: + spin_unlock(&devices_lock); + + for (i = 0; i < nchans; ++i) { + l2cap_chan_lock(chans[i]); + l2cap_chan_close(chans[i], ENOENT); + l2cap_chan_unlock(chans[i]); + l2cap_chan_put(chans[i]); + } + } while (nchans); }
struct set_enable { @@ -1132,7 +1171,7 @@ static ssize_t lowpan_control_write(struct file *fp, buf[buf_size] = '\0';
if (memcmp(buf, "connect ", 8) == 0) { - ret = get_l2cap_conn(&buf[8], &addr, &addr_type, &conn); + ret = get_l2cap_conn(&buf[8], &addr, &addr_type, &conn, false); if (ret == -EINVAL) return ret;
@@ -1169,7 +1208,7 @@ static ssize_t lowpan_control_write(struct file *fp, }
if (memcmp(buf, "disconnect ", 11) == 0) { - ret = get_l2cap_conn(&buf[11], &addr, &addr_type, &conn); + ret = get_l2cap_conn(&buf[11], &addr, &addr_type, &conn, true); if (ret < 0) return ret;
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 1272ad73e401..4c82770173aa 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -517,6 +517,7 @@ void l2cap_chan_hold(struct l2cap_chan *c)
kref_get(&c->kref); } +EXPORT_SYMBOL_GPL(l2cap_chan_hold);
struct l2cap_chan *l2cap_chan_hold_unless_zero(struct l2cap_chan *c) { diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 4c81883ba25e..dc99b5d985fd 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -399,6 +399,13 @@ static void sco_sock_kill(struct sock *sk)
BT_DBG("sk %p state %d", sk, sk->sk_state);
+ /* Sock is dead, so set conn->sk to NULL to avoid possible UAF */ + if (sco_pi(sk)->conn) { + sco_conn_lock(sco_pi(sk)->conn); + sco_pi(sk)->conn->sk = NULL; + sco_conn_unlock(sco_pi(sk)->conn); + } + /* Kill poor orphan */ bt_sock_unlink(&sco_sk_list, sk); sock_set_flag(sk, SOCK_DEAD); diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index 460d578fae4d..66dcb4734ff2 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c @@ -142,7 +142,8 @@ void br_forward(const struct net_bridge_port *to, goto out;
/* redirect to backup link if the destination port is down */ - if (rcu_access_pointer(to->backup_port) && !netif_carrier_ok(to->dev)) { + if (rcu_access_pointer(to->backup_port) && + (!netif_carrier_ok(to->dev) || !netif_running(to->dev))) { struct net_bridge_port *backup_port;
backup_port = rcu_dereference(to->backup_port); diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 09ae2fc41fa9..f537bc05c8c3 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -858,6 +858,10 @@ void __netpoll_cleanup(struct netpoll *np)
synchronize_srcu(&netpoll_srcu);
+ /* At this point, there is a single npinfo instance per netdevice, and + * its refcnt tracks how many netpoll structures are linked to it. We + * only perform npinfo cleanup when the refcnt decrements to zero. + */ if (refcount_dec_and_test(&npinfo->refcnt)) { const struct net_device_ops *ops;
@@ -867,8 +871,7 @@ void __netpoll_cleanup(struct netpoll *np)
RCU_INIT_POINTER(np->dev->npinfo, NULL); call_rcu(&npinfo->rcu, rcu_cleanup_netpoll_info); - } else - RCU_INIT_POINTER(np->dev->npinfo, NULL); + } } EXPORT_SYMBOL_GPL(__netpoll_cleanup);
diff --git a/net/core/page_pool.c b/net/core/page_pool.c index dbe0489e4603..305e348e1d7b 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -33,11 +33,7 @@ static int page_pool_init(struct page_pool *pool, return -EINVAL;
if (pool->p.pool_size) - ring_qsize = pool->p.pool_size; - - /* Sanity limit mem that can be pinned down */ - if (ring_qsize > 32768) - return -E2BIG; + ring_qsize = min(pool->p.pool_size, 16384);
/* DMA direction is either DMA_FROM_DEVICE or DMA_BIDIRECTIONAL. * DMA_BIDIRECTIONAL is for allowing page used for DMA sending, diff --git a/net/core/sock.c b/net/core/sock.c index 54f9ad391f89..6660032866e7 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2456,23 +2456,27 @@ void __release_sock(struct sock *sk) __acquires(&sk->sk_lock.slock) { struct sk_buff *skb, *next; + int nb = 0;
while ((skb = sk->sk_backlog.head) != NULL) { sk->sk_backlog.head = sk->sk_backlog.tail = NULL;
spin_unlock_bh(&sk->sk_lock.slock);
- do { + while (1) { next = skb->next; prefetch(next); WARN_ON_ONCE(skb_dst_is_noref(skb)); skb_mark_not_on_list(skb); sk_backlog_rcv(sk, skb);
- cond_resched(); - skb = next; - } while (skb != NULL); + if (!skb) + break; + + if (!(++nb & 15)) + cond_resched(); + }
spin_lock_bh(&sk->sk_lock.slock); } @@ -2590,8 +2594,7 @@ int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind) return 1; }
- if (kind == SK_MEM_SEND || (kind == SK_MEM_RECV && charged)) - trace_sock_exceed_buf_limit(sk, prot, allocated, kind); + trace_sock_exceed_buf_limit(sk, prot, allocated, kind);
sk_memory_allocated_sub(sk, amt);
diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c index 388f5773b88d..3a807ae69a12 100644 --- a/net/ipv4/nexthop.c +++ b/net/ipv4/nexthop.c @@ -760,6 +760,12 @@ static void remove_nexthop_from_groups(struct net *net, struct nexthop *nh, { struct nh_grp_entry *nhge, *tmp;
+ /* If there is nothing to do, let's avoid the costly call to + * synchronize_net() + */ + if (list_empty(&nh->grp_list)) + return; + list_for_each_entry_safe(nhge, tmp, &nh->grp_list, nh_list) remove_nh_grp_entry(net, nhge, nlinfo);
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index eb83ce4b845a..a6bb6440b874 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -637,6 +637,11 @@ static void fnhe_remove_oldest(struct fnhe_hash_bucket *hash) oldest_p = fnhe_p; } } + + /* Clear oldest->fnhe_daddr to prevent this fnhe from being + * rebound with new dsts in rt_bind_exception(). + */ + oldest->fnhe_daddr = 0; fnhe_flush_routes(oldest); *oldest_p = oldest->fnhe_next; kfree_rcu(oldest, rcu); diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index 1c5ecd07a43e..240f46c7ce1e 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c @@ -46,6 +46,34 @@ struct ah_skb_cb {
#define AH_SKB_CB(__skb) ((struct ah_skb_cb *)&((__skb)->cb[0]))
+/* Helper to save IPv6 addresses and extension headers to temporary storage */ +static inline void ah6_save_hdrs(struct tmp_ext *iph_ext, + struct ipv6hdr *top_iph, int extlen) +{ + if (!extlen) + return; + +#if IS_ENABLED(CONFIG_IPV6_MIP6) + iph_ext->saddr = top_iph->saddr; +#endif + iph_ext->daddr = top_iph->daddr; + memcpy(&iph_ext->hdrs, top_iph + 1, extlen - sizeof(*iph_ext)); +} + +/* Helper to restore IPv6 addresses and extension headers from temporary storage */ +static inline void ah6_restore_hdrs(struct ipv6hdr *top_iph, + struct tmp_ext *iph_ext, int extlen) +{ + if (!extlen) + return; + +#if IS_ENABLED(CONFIG_IPV6_MIP6) + top_iph->saddr = iph_ext->saddr; +#endif + top_iph->daddr = iph_ext->daddr; + memcpy(top_iph + 1, &iph_ext->hdrs, extlen - sizeof(*iph_ext)); +} + static void *ah_alloc_tmp(struct crypto_ahash *ahash, int nfrags, unsigned int size) { @@ -307,13 +335,7 @@ static void ah6_output_done(struct crypto_async_request *base, int err) memcpy(ah->auth_data, icv, ahp->icv_trunc_len); memcpy(top_iph, iph_base, IPV6HDR_BASELEN);
- if (extlen) { -#if IS_ENABLED(CONFIG_IPV6_MIP6) - memcpy(&top_iph->saddr, iph_ext, extlen); -#else - memcpy(&top_iph->daddr, iph_ext, extlen); -#endif - } + ah6_restore_hdrs(top_iph, iph_ext, extlen);
kfree(AH_SKB_CB(skb)->tmp); xfrm_output_resume(skb, err); @@ -384,12 +406,8 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) */ memcpy(iph_base, top_iph, IPV6HDR_BASELEN);
+ ah6_save_hdrs(iph_ext, top_iph, extlen); if (extlen) { -#if IS_ENABLED(CONFIG_IPV6_MIP6) - memcpy(iph_ext, &top_iph->saddr, extlen); -#else - memcpy(iph_ext, &top_iph->daddr, extlen); -#endif err = ipv6_clear_mutable_options(top_iph, extlen - sizeof(*iph_ext) + sizeof(*top_iph), @@ -440,13 +458,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) memcpy(ah->auth_data, icv, ahp->icv_trunc_len); memcpy(top_iph, iph_base, IPV6HDR_BASELEN);
- if (extlen) { -#if IS_ENABLED(CONFIG_IPV6_MIP6) - memcpy(&top_iph->saddr, iph_ext, extlen); -#else - memcpy(&top_iph->daddr, iph_ext, extlen); -#endif - } + ah6_restore_hdrs(top_iph, iph_ext, extlen);
out_free: kfree(iph_base); diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 731485b18de3..90d828c98b73 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -474,7 +474,7 @@ static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, if (flags & MSG_ERRQUEUE) return ipv6_recv_error(sk, msg, len, addr_len);
- if (np->rxpmtu && np->rxopt.bits.rxpmtu) + if (np->rxopt.bits.rxpmtu && READ_ONCE(np->rxpmtu)) return ipv6_recv_rxpmtu(sk, msg, len, addr_len);
skb = skb_recv_datagram(sk, flags, noblock, &err); diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index db948e3a9bdc..3ed835b30804 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -297,7 +297,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, if (flags & MSG_ERRQUEUE) return ipv6_recv_error(sk, msg, len, addr_len);
- if (np->rxpmtu && np->rxopt.bits.rxpmtu) + if (np->rxopt.bits.rxpmtu && READ_ONCE(np->rxpmtu)) return ipv6_recv_rxpmtu(sk, msg, len, addr_len);
try_again: diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 4c805530edfb..e8e72271fbb8 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -4669,10 +4669,14 @@ void ieee80211_rx_napi(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta, if (WARN_ON(!local->started)) goto drop;
- if (likely(!(status->flag & RX_FLAG_FAILED_PLCP_CRC))) { + if (likely(!(status->flag & RX_FLAG_FAILED_PLCP_CRC) && + !(status->flag & RX_FLAG_NO_PSDU && + status->zero_length_psdu_type == + IEEE80211_RADIOTAP_ZERO_LEN_PSDU_NOT_CAPTURED))) { /* - * Validate the rate, unless a PLCP error means that - * we probably can't have a valid rate here anyway. + * Validate the rate, unless there was a PLCP error which may + * have an invalid rate or the PSDU was not capture and may be + * missing rate information. */
switch (status->encoding) { diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index 5af7fe6312cf..b1a3581ce206 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c @@ -599,69 +599,6 @@ static int set_ipv6(struct sk_buff *skb, struct sw_flow_key *flow_key, return 0; }
-static int set_nsh(struct sk_buff *skb, struct sw_flow_key *flow_key, - const struct nlattr *a) -{ - struct nshhdr *nh; - size_t length; - int err; - u8 flags; - u8 ttl; - int i; - - struct ovs_key_nsh key; - struct ovs_key_nsh mask; - - err = nsh_key_from_nlattr(a, &key, &mask); - if (err) - return err; - - /* Make sure the NSH base header is there */ - if (!pskb_may_pull(skb, skb_network_offset(skb) + NSH_BASE_HDR_LEN)) - return -ENOMEM; - - nh = nsh_hdr(skb); - length = nsh_hdr_len(nh); - - /* Make sure the whole NSH header is there */ - err = skb_ensure_writable(skb, skb_network_offset(skb) + - length); - if (unlikely(err)) - return err; - - nh = nsh_hdr(skb); - skb_postpull_rcsum(skb, nh, length); - flags = nsh_get_flags(nh); - flags = OVS_MASKED(flags, key.base.flags, mask.base.flags); - flow_key->nsh.base.flags = flags; - ttl = nsh_get_ttl(nh); - ttl = OVS_MASKED(ttl, key.base.ttl, mask.base.ttl); - flow_key->nsh.base.ttl = ttl; - nsh_set_flags_and_ttl(nh, flags, ttl); - nh->path_hdr = OVS_MASKED(nh->path_hdr, key.base.path_hdr, - mask.base.path_hdr); - flow_key->nsh.base.path_hdr = nh->path_hdr; - switch (nh->mdtype) { - case NSH_M_TYPE1: - for (i = 0; i < NSH_MD1_CONTEXT_SIZE; i++) { - nh->md1.context[i] = - OVS_MASKED(nh->md1.context[i], key.context[i], - mask.context[i]); - } - memcpy(flow_key->nsh.context, nh->md1.context, - sizeof(nh->md1.context)); - break; - case NSH_M_TYPE2: - memset(flow_key->nsh.context, 0, - sizeof(flow_key->nsh.context)); - break; - default: - return -EINVAL; - } - skb_postpush_rcsum(skb, nh, length); - return 0; -} - /* Must follow skb_ensure_writable() since that can move the skb data. */ static void set_tp_port(struct sk_buff *skb, __be16 *port, __be16 new_port, __sum16 *check) @@ -1122,10 +1059,6 @@ static int execute_masked_set_action(struct sk_buff *skb, get_mask(a, struct ovs_key_ethernet *)); break;
- case OVS_KEY_ATTR_NSH: - err = set_nsh(skb, flow_key, a); - break; - case OVS_KEY_ATTR_IPV4: err = set_ipv4(skb, flow_key, nla_data(a), get_mask(a, struct ovs_key_ipv4 *)); @@ -1162,6 +1095,7 @@ static int execute_masked_set_action(struct sk_buff *skb, case OVS_KEY_ATTR_CT_LABELS: case OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4: case OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6: + case OVS_KEY_ATTR_NSH: err = -EINVAL; break; } diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c index 4ad4c89886ee..a378b06db24f 100644 --- a/net/openvswitch/flow_netlink.c +++ b/net/openvswitch/flow_netlink.c @@ -1277,6 +1277,11 @@ static int metadata_from_nlattrs(struct net *net, struct sw_flow_match *match, return 0; }
+/* + * Constructs NSH header 'nh' from attributes of OVS_ACTION_ATTR_PUSH_NSH, + * where 'nh' points to a memory block of 'size' bytes. It's assumed that + * attributes were previously validated with validate_push_nsh(). + */ int nsh_hdr_from_nlattr(const struct nlattr *attr, struct nshhdr *nh, size_t size) { @@ -1286,8 +1291,6 @@ int nsh_hdr_from_nlattr(const struct nlattr *attr, u8 ttl = 0; int mdlen = 0;
- /* validate_nsh has check this, so we needn't do duplicate check here - */ if (size < NSH_BASE_HDR_LEN) return -ENOBUFS;
@@ -1331,46 +1334,6 @@ int nsh_hdr_from_nlattr(const struct nlattr *attr, return 0; }
-int nsh_key_from_nlattr(const struct nlattr *attr, - struct ovs_key_nsh *nsh, struct ovs_key_nsh *nsh_mask) -{ - struct nlattr *a; - int rem; - - /* validate_nsh has check this, so we needn't do duplicate check here - */ - nla_for_each_nested(a, attr, rem) { - int type = nla_type(a); - - switch (type) { - case OVS_NSH_KEY_ATTR_BASE: { - const struct ovs_nsh_key_base *base = nla_data(a); - const struct ovs_nsh_key_base *base_mask = base + 1; - - nsh->base = *base; - nsh_mask->base = *base_mask; - break; - } - case OVS_NSH_KEY_ATTR_MD1: { - const struct ovs_nsh_key_md1 *md1 = nla_data(a); - const struct ovs_nsh_key_md1 *md1_mask = md1 + 1; - - memcpy(nsh->context, md1->context, sizeof(*md1)); - memcpy(nsh_mask->context, md1_mask->context, - sizeof(*md1_mask)); - break; - } - case OVS_NSH_KEY_ATTR_MD2: - /* Not supported yet */ - return -ENOTSUPP; - default: - return -EINVAL; - } - } - - return 0; -} - static int nsh_key_put_from_nlattr(const struct nlattr *attr, struct sw_flow_match *match, bool is_mask, bool is_push_nsh, bool log) @@ -2704,17 +2667,13 @@ static int validate_and_copy_set_tun(const struct nlattr *attr, return err; }
-static bool validate_nsh(const struct nlattr *attr, bool is_mask, - bool is_push_nsh, bool log) +static bool validate_push_nsh(const struct nlattr *attr, bool log) { struct sw_flow_match match; struct sw_flow_key key; - int ret = 0;
ovs_match_init(&match, &key, true, NULL); - ret = nsh_key_put_from_nlattr(attr, &match, is_mask, - is_push_nsh, log); - return !ret; + return !nsh_key_put_from_nlattr(attr, &match, false, true, log); }
/* Return false if there are any non-masked bits set. @@ -2860,13 +2819,6 @@ static int validate_set(const struct nlattr *a,
break;
- case OVS_KEY_ATTR_NSH: - if (eth_type != htons(ETH_P_NSH)) - return -EINVAL; - if (!validate_nsh(nla_data(a), masked, false, log)) - return -EINVAL; - break; - default: return -EINVAL; } @@ -3219,7 +3171,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, return -EINVAL; } mac_proto = MAC_PROTO_NONE; - if (!validate_nsh(nla_data(a), false, true, true)) + if (!validate_push_nsh(nla_data(a), log)) return -EINVAL; break;
diff --git a/net/openvswitch/flow_netlink.h b/net/openvswitch/flow_netlink.h index fe7f77fc5f18..ff8cdecbe346 100644 --- a/net/openvswitch/flow_netlink.h +++ b/net/openvswitch/flow_netlink.h @@ -65,8 +65,6 @@ int ovs_nla_put_actions(const struct nlattr *attr, void ovs_nla_free_flow_actions(struct sw_flow_actions *); void ovs_nla_free_flow_actions_rcu(struct sw_flow_actions *);
-int nsh_key_from_nlattr(const struct nlattr *attr, struct ovs_key_nsh *nsh, - struct ovs_key_nsh *nsh_mask); int nsh_hdr_from_nlattr(const struct nlattr *attr, struct nshhdr *nh, size_t size);
diff --git a/net/rds/rds.h b/net/rds/rds.h index 2ac5b5e55901..a8ad1e4185eb 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -94,7 +94,7 @@ enum {
/* Max number of multipaths per RDS connection. Must be a power of 2 */ #define RDS_MPATH_WORKERS 8 -#define RDS_MPATH_HASH(rs, n) (jhash_1word((rs)->rs_bound_port, \ +#define RDS_MPATH_HASH(rs, n) (jhash_1word(ntohs((rs)->rs_bound_port), \ (rs)->rs_hash_initval) & ((n) - 1))
#define IS_CANONICAL(laddr, faddr) (htonl(laddr) < htonl(faddr)) diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c index 488d10476e85..8f82842ad8cb 100644 --- a/net/sched/act_ife.c +++ b/net/sched/act_ife.c @@ -642,13 +642,15 @@ static int tcf_ife_dump(struct sk_buff *skb, struct tc_action *a, int bind, unsigned char *b = skb_tail_pointer(skb); struct tcf_ife_info *ife = to_ife(a); struct tcf_ife_params *p; - struct tc_ife opt = { - .index = ife->tcf_index, - .refcnt = refcount_read(&ife->tcf_refcnt) - ref, - .bindcnt = atomic_read(&ife->tcf_bindcnt) - bind, - }; + struct tc_ife opt; struct tcf_t t;
+ memset(&opt, 0, sizeof(opt)); + + opt.index = ife->tcf_index, + opt.refcnt = refcount_read(&ife->tcf_refcnt) - ref, + opt.bindcnt = atomic_read(&ife->tcf_bindcnt) - bind, + spin_lock_bh(&ife->tcf_lock); opt.action = ife->tcf_action; p = rcu_dereference_protected(ife->params, diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 7c91f29f69c1..84914b2308df 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -592,16 +592,6 @@ void __qdisc_calculate_pkt_len(struct sk_buff *skb, qdisc_skb_cb(skb)->pkt_len = pkt_len; }
-void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc) -{ - if (!(qdisc->flags & TCQ_F_WARN_NONWC)) { - pr_warn("%s: %s qdisc %X: is non-work-conserving?\n", - txt, qdisc->ops->id, qdisc->handle >> 16); - qdisc->flags |= TCQ_F_WARN_NONWC; - } -} -EXPORT_SYMBOL(qdisc_warn_nonwc); - static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer) { struct qdisc_watchdog *wd = container_of(timer, struct qdisc_watchdog, diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 4250f3cf30e7..d52001d958cb 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -172,9 +172,10 @@ static inline void dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q) static void try_bulk_dequeue_skb(struct Qdisc *q, struct sk_buff *skb, const struct netdev_queue *txq, - int *packets) + int *packets, int budget) { int bytelimit = qdisc_avail_bulklimit(txq) - skb->len; + int cnt = 0;
while (bytelimit > 0) { struct sk_buff *nskb = q->dequeue(q); @@ -185,8 +186,10 @@ static void try_bulk_dequeue_skb(struct Qdisc *q, bytelimit -= nskb->len; /* covers GSO len */ skb->next = nskb; skb = nskb; - (*packets)++; /* GSO counts as one pkt */ + if (++cnt >= budget) + break; } + (*packets) += cnt; skb_mark_not_on_list(skb); }
@@ -220,7 +223,7 @@ static void try_bulk_dequeue_skb_slow(struct Qdisc *q, * A requeued skb (via q->gso_skb) can also be a SKB list. */ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, - int *packets) + int *packets, int budget) { const struct netdev_queue *txq = q->dev_queue; struct sk_buff *skb = NULL; @@ -287,7 +290,7 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, if (skb) { bulk: if (qdisc_may_bulk(q)) - try_bulk_dequeue_skb(q, skb, txq, packets); + try_bulk_dequeue_skb(q, skb, txq, packets, budget); else try_bulk_dequeue_skb_slow(q, skb, packets); } @@ -379,7 +382,7 @@ bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, * >0 - queue is not empty. * */ -static inline bool qdisc_restart(struct Qdisc *q, int *packets) +static inline bool qdisc_restart(struct Qdisc *q, int *packets, int budget) { spinlock_t *root_lock = NULL; struct netdev_queue *txq; @@ -388,7 +391,7 @@ static inline bool qdisc_restart(struct Qdisc *q, int *packets) bool validate;
/* Dequeue packet */ - skb = dequeue_skb(q, &validate, packets); + skb = dequeue_skb(q, &validate, packets, budget); if (unlikely(!skb)) return false;
@@ -406,14 +409,9 @@ void __qdisc_run(struct Qdisc *q) int quota = READ_ONCE(dev_tx_weight); int packets;
- while (qdisc_restart(q, &packets)) { - /* - * Ordered by possible occurrence: Postpone processing if - * 1. we've exceeded packet quota - * 2. another process needs the CPU; - */ + while (qdisc_restart(q, &packets, quota)) { quota -= packets; - if (quota <= 0 || need_resched()) { + if (quota <= 0) { __netif_schedule(q); break; } diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 5cb789c7c82d..d4d2f2f83241 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c @@ -836,22 +836,6 @@ update_vf(struct hfsc_class *cl, unsigned int len, u64 cur_time) } }
-static unsigned int -qdisc_peek_len(struct Qdisc *sch) -{ - struct sk_buff *skb; - unsigned int len; - - skb = sch->ops->peek(sch); - if (unlikely(skb == NULL)) { - qdisc_warn_nonwc("qdisc_peek_len", sch); - return 0; - } - len = qdisc_pkt_len(skb); - - return len; -} - static void hfsc_adjust_levels(struct hfsc_class *cl) { diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c index 511f344dbb77..1c0ac9372af9 100644 --- a/net/sched/sch_qfq.c +++ b/net/sched/sch_qfq.c @@ -1003,7 +1003,7 @@ static struct sk_buff *agg_dequeue(struct qfq_aggregate *agg,
if (cl->qdisc->q.qlen == 0) /* no more packets, remove from list */ list_del_init(&cl->alist); - else if (cl->deficit < qdisc_pkt_len(cl->qdisc->ops->peek(cl->qdisc))) { + else if (cl->deficit < qdisc_peek_len(cl->qdisc)) { cl->deficit += agg->lmax; list_move_tail(&cl->alist, &agg->active); } diff --git a/net/sctp/associola.c b/net/sctp/associola.c index bc9a62744fec..253ab788cffc 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c @@ -579,7 +579,6 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, const gfp_t gfp, const int peer_state) { - struct net *net = sock_net(asoc->base.sk); struct sctp_transport *peer; struct sctp_sock *sp; unsigned short port; @@ -609,7 +608,7 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, return peer; }
- peer = sctp_transport_new(net, addr, gfp); + peer = sctp_transport_new(asoc->base.net, addr, gfp); if (!peer) return NULL;
@@ -978,7 +977,7 @@ static void sctp_assoc_bh_rcv(struct work_struct *work) struct sctp_association *asoc = container_of(work, struct sctp_association, base.inqueue.immediate); - struct net *net = sock_net(asoc->base.sk); + struct net *net = asoc->base.net; union sctp_subtype subtype; struct sctp_endpoint *ep; struct sctp_chunk *chunk; @@ -1445,7 +1444,8 @@ void sctp_assoc_sync_pmtu(struct sctp_association *asoc) /* Should we send a SACK to update our peer? */ static inline bool sctp_peer_needs_update(struct sctp_association *asoc) { - struct net *net = sock_net(asoc->base.sk); + struct net *net = asoc->base.net; + switch (asoc->state) { case SCTP_STATE_ESTABLISHED: case SCTP_STATE_SHUTDOWN_PENDING: @@ -1582,7 +1582,7 @@ int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc, if (asoc->peer.ipv6_address) flags |= SCTP_ADDR6_PEERSUPP;
- return sctp_bind_addr_copy(sock_net(asoc->base.sk), + return sctp_bind_addr_copy(asoc->base.net, &asoc->base.bind_addr, &asoc->ep->base.bind_addr, scope, gfp, flags); diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c index cc0405c79dfc..064675bc7b54 100644 --- a/net/sctp/chunk.c +++ b/net/sctp/chunk.c @@ -227,7 +227,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, if (msg_len >= first_len) { msg->can_delay = 0; if (msg_len > first_len) - SCTP_INC_STATS(sock_net(asoc->base.sk), + SCTP_INC_STATS(asoc->base.net, SCTP_MIB_FRAGUSRMSGS); } else { /* Which may be the only one... */ diff --git a/net/sctp/diag.c b/net/sctp/diag.c index 2fcfb8cc8bd1..641e52b9099d 100644 --- a/net/sctp/diag.c +++ b/net/sctp/diag.c @@ -73,19 +73,26 @@ static int inet_diag_msg_sctpladdrs_fill(struct sk_buff *skb, struct nlattr *attr; void *info = NULL;
+ rcu_read_lock(); list_for_each_entry_rcu(laddr, address_list, list) addrcnt++; + rcu_read_unlock();
attr = nla_reserve(skb, INET_DIAG_LOCALS, addrlen * addrcnt); if (!attr) return -EMSGSIZE;
info = nla_data(attr); + rcu_read_lock(); list_for_each_entry_rcu(laddr, address_list, list) { memcpy(info, &laddr->a, sizeof(laddr->a)); memset(info + sizeof(laddr->a), 0, addrlen - sizeof(laddr->a)); info += addrlen; + + if (!--addrcnt) + break; } + rcu_read_unlock();
return 0; } diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index 665a22d5c725..208b121d5a78 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c @@ -251,7 +251,7 @@ struct sctp_endpoint *sctp_endpoint_is_match(struct sctp_endpoint *ep, struct sctp_endpoint *retval = NULL;
if ((htons(ep->base.bind_addr.port) == laddr->v4.sin_port) && - net_eq(sock_net(ep->base.sk), net)) { + net_eq(ep->base.net, net)) { if (sctp_bind_addr_match(&ep->base.bind_addr, laddr, sctp_sk(ep->base.sk))) retval = ep; @@ -299,8 +299,8 @@ bool sctp_endpoint_is_peeled_off(struct sctp_endpoint *ep, const union sctp_addr *paddr) { struct sctp_sockaddr_entry *addr; + struct net *net = ep->base.net; struct sctp_bind_addr *bp; - struct net *net = sock_net(ep->base.sk);
bp = &ep->base.bind_addr; /* This function is called with the socket lock held, @@ -391,7 +391,7 @@ static void sctp_endpoint_bh_rcv(struct work_struct *work) if (asoc && sctp_chunk_is_data(chunk)) asoc->peer.last_data_from = chunk->transport; else { - SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_INCTRLCHUNKS); + SCTP_INC_STATS(ep->base.net, SCTP_MIB_INCTRLCHUNKS); if (asoc) asoc->stats.ictrlchunks++; } diff --git a/net/sctp/input.c b/net/sctp/input.c index 9013257cf3df..28e0e110804a 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -935,7 +935,7 @@ int sctp_hash_transport(struct sctp_transport *t) if (t->asoc->temp) return 0;
- arg.net = sock_net(t->asoc->base.sk); + arg.net = t->asoc->base.net; arg.paddr = &t->ipaddr; arg.lport = htons(t->asoc->base.bind_addr.port);
@@ -1002,12 +1002,11 @@ struct sctp_transport *sctp_epaddr_lookup_transport( const struct sctp_endpoint *ep, const union sctp_addr *paddr) { - struct net *net = sock_net(ep->base.sk); struct rhlist_head *tmp, *list; struct sctp_transport *t; struct sctp_hash_cmp_arg arg = { .paddr = paddr, - .net = net, + .net = ep->base.net, .lport = htons(ep->base.bind_addr.port), };
diff --git a/net/sctp/output.c b/net/sctp/output.c index dbda7e7927fd..1441eaf460bb 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -282,7 +282,7 @@ static enum sctp_xmit sctp_packet_bundle_sack(struct sctp_packet *pkt, sctp_chunk_free(sack); goto out; } - SCTP_INC_STATS(sock_net(asoc->base.sk), + SCTP_INC_STATS(asoc->base.net, SCTP_MIB_OUTCTRLCHUNKS); asoc->stats.octrlchunks++; asoc->peer.sack_needed = 0; diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index adceb226ffab..6b0b3bad4daa 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c @@ -280,7 +280,7 @@ void sctp_outq_free(struct sctp_outq *q) /* Put a new chunk in an sctp_outq. */ void sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk, gfp_t gfp) { - struct net *net = sock_net(q->asoc->base.sk); + struct net *net = q->asoc->base.net;
pr_debug("%s: outq:%p, chunk:%p[%s]\n", __func__, q, chunk, chunk && chunk->chunk_hdr ? @@ -534,7 +534,7 @@ void sctp_retransmit_mark(struct sctp_outq *q, void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport, enum sctp_retransmit_reason reason) { - struct net *net = sock_net(q->asoc->base.sk); + struct net *net = q->asoc->base.net;
switch (reason) { case SCTP_RTXR_T3_RTX: @@ -1890,6 +1890,6 @@ void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
if (ftsn_chunk) { list_add_tail(&ftsn_chunk->list, &q->control_chunk_list); - SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_OUTCTRLCHUNKS); + SCTP_INC_STATS(asoc->base.net, SCTP_MIB_OUTCTRLCHUNKS); } } diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 0c112134d9e3..d3cc5a59b0fe 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -2319,7 +2319,6 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk, const union sctp_addr *peer_addr, struct sctp_init_chunk *peer_init, gfp_t gfp) { - struct net *net = sock_net(asoc->base.sk); struct sctp_transport *transport; struct list_head *pos, *temp; union sctp_params param; @@ -2377,8 +2376,8 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk, * also give us an option to silently ignore the packet, which * is what we'll do here. */ - if (!net->sctp.addip_noauth && - (asoc->peer.asconf_capable && !asoc->peer.auth_capable)) { + if (!asoc->base.net->sctp.addip_noauth && + (asoc->peer.asconf_capable && !asoc->peer.auth_capable)) { asoc->peer.addip_disabled_mask |= (SCTP_PARAM_ADD_IP | SCTP_PARAM_DEL_IP | SCTP_PARAM_SET_PRIMARY); @@ -2505,9 +2504,9 @@ static int sctp_process_param(struct sctp_association *asoc, const union sctp_addr *peer_addr, gfp_t gfp) { - struct net *net = sock_net(asoc->base.sk); struct sctp_endpoint *ep = asoc->ep; union sctp_addr_param *addr_param; + struct net *net = asoc->base.net; struct sctp_transport *t; enum sctp_scope scope; union sctp_addr addr; diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index c964e7ca6f7e..3ecd246feb76 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -520,8 +520,6 @@ static void sctp_do_8_2_transport_strike(struct sctp_cmd_seq *commands, struct sctp_transport *transport, int is_hb) { - struct net *net = sock_net(asoc->base.sk); - /* The check for association's overall error counter exceeding the * threshold is done in the state function. */ @@ -548,10 +546,10 @@ static void sctp_do_8_2_transport_strike(struct sctp_cmd_seq *commands, * is SCTP_ACTIVE, then mark this transport as Partially Failed, * see SCTP Quick Failover Draft, section 5.1 */ - if (net->sctp.pf_enable && - (transport->state == SCTP_ACTIVE) && - (transport->error_count < transport->pathmaxrxt) && - (transport->error_count > transport->pf_retrans)) { + if (asoc->base.net->sctp.pf_enable && + transport->state == SCTP_ACTIVE && + transport->error_count < transport->pathmaxrxt && + transport->error_count > transport->pf_retrans) {
sctp_assoc_control_transport(asoc, transport, SCTP_TRANSPORT_PF, @@ -797,10 +795,8 @@ static int sctp_cmd_process_sack(struct sctp_cmd_seq *cmds, int err = 0;
if (sctp_outq_sack(&asoc->outqueue, chunk)) { - struct net *net = sock_net(asoc->base.sk); - /* There are no more TSNs awaiting SACK. */ - err = sctp_do_sm(net, SCTP_EVENT_T_OTHER, + err = sctp_do_sm(asoc->base.net, SCTP_EVENT_T_OTHER, SCTP_ST_OTHER(SCTP_EVENT_NO_PENDING_TSN), asoc->state, asoc->ep, asoc, NULL, GFP_ATOMIC); @@ -833,7 +829,7 @@ static void sctp_cmd_assoc_update(struct sctp_cmd_seq *cmds, struct sctp_association *asoc, struct sctp_association *new) { - struct net *net = sock_net(asoc->base.sk); + struct net *net = asoc->base.net; struct sctp_chunk *abort;
if (!sctp_assoc_update(asoc, new)) diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 876c18f70df8..7808dd812a72 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c @@ -1342,7 +1342,7 @@ static int sctp_sf_check_restart_addrs(const struct sctp_association *new_asoc, struct sctp_chunk *init, struct sctp_cmd_seq *commands) { - struct net *net = sock_net(new_asoc->base.sk); + struct net *net = new_asoc->base.net; struct sctp_transport *new_addr; int ret = 1;
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 1ac05147dc30..722f8a940c2d 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -466,8 +466,7 @@ static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) static int sctp_send_asconf(struct sctp_association *asoc, struct sctp_chunk *chunk) { - struct net *net = sock_net(asoc->base.sk); - int retval = 0; + int retval = 0;
/* If there is an outstanding ASCONF chunk, queue it for later * transmission. @@ -479,7 +478,7 @@ static int sctp_send_asconf(struct sctp_association *asoc,
/* Hold the chunk until an ASCONF_ACK is received. */ sctp_chunk_hold(chunk); - retval = sctp_primitive_ASCONF(net, asoc, chunk); + retval = sctp_primitive_ASCONF(asoc->base.net, asoc, chunk); if (retval) sctp_chunk_free(chunk); else @@ -2462,9 +2461,8 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, int error;
if (params->spp_flags & SPP_HB_DEMAND && trans) { - struct net *net = sock_net(trans->asoc->base.sk); - - error = sctp_primitive_REQUESTHEARTBEAT(net, trans->asoc, trans); + error = sctp_primitive_REQUESTHEARTBEAT(trans->asoc->base.net, + trans->asoc, trans); if (error) return error; } @@ -5334,7 +5332,7 @@ struct sctp_transport *sctp_transport_get_next(struct net *net, if (!sctp_transport_hold(t)) continue;
- if (net_eq(sock_net(t->asoc->base.sk), net) && + if (net_eq(t->asoc->base.net, net) && t->asoc->peer.primary_path == t) break;
diff --git a/net/sctp/stream.c b/net/sctp/stream.c index 08cd06078fab..0527728aee98 100644 --- a/net/sctp/stream.c +++ b/net/sctp/stream.c @@ -229,10 +229,9 @@ void sctp_stream_update(struct sctp_stream *stream, struct sctp_stream *new) static int sctp_send_reconf(struct sctp_association *asoc, struct sctp_chunk *chunk) { - struct net *net = sock_net(asoc->base.sk); int retval = 0;
- retval = sctp_primitive_RECONF(net, asoc, chunk); + retval = sctp_primitive_RECONF(asoc->base.net, asoc, chunk); if (retval) sctp_chunk_free(chunk);
diff --git a/net/sctp/stream_interleave.c b/net/sctp/stream_interleave.c index c982f99099de..e3aad75cb11d 100644 --- a/net/sctp/stream_interleave.c +++ b/net/sctp/stream_interleave.c @@ -241,9 +241,8 @@ static struct sctp_ulpevent *sctp_intl_retrieve_partial( if (!first_frag) return NULL;
- retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), - &ulpq->reasm, first_frag, - last_frag); + retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm, + first_frag, last_frag); if (retval) { sin->fsn = next_fsn; if (is_last) { @@ -326,7 +325,7 @@ static struct sctp_ulpevent *sctp_intl_retrieve_reassembled(
pd_point = sctp_sk(asoc->base.sk)->pd_point; if (pd_point && pd_point <= pd_len) { - retval = sctp_make_reassembled_event(sock_net(asoc->base.sk), + retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm, pd_first, pd_last); if (retval) { @@ -337,8 +336,7 @@ static struct sctp_ulpevent *sctp_intl_retrieve_reassembled( goto out;
found: - retval = sctp_make_reassembled_event(sock_net(asoc->base.sk), - &ulpq->reasm, + retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm, first_frag, pos); if (retval) retval->msg_flags |= MSG_EOR; @@ -630,7 +628,7 @@ static struct sctp_ulpevent *sctp_intl_retrieve_partial_uo( if (!first_frag) return NULL;
- retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), + retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm_uo, first_frag, last_frag); if (retval) { @@ -716,7 +714,7 @@ static struct sctp_ulpevent *sctp_intl_retrieve_reassembled_uo(
pd_point = sctp_sk(asoc->base.sk)->pd_point; if (pd_point && pd_point <= pd_len) { - retval = sctp_make_reassembled_event(sock_net(asoc->base.sk), + retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm_uo, pd_first, pd_last); if (retval) { @@ -727,8 +725,7 @@ static struct sctp_ulpevent *sctp_intl_retrieve_reassembled_uo( goto out;
found: - retval = sctp_make_reassembled_event(sock_net(asoc->base.sk), - &ulpq->reasm_uo, + retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm_uo, first_frag, pos); if (retval) retval->msg_flags |= MSG_EOR; @@ -814,7 +811,7 @@ static struct sctp_ulpevent *sctp_intl_retrieve_first_uo(struct sctp_ulpq *ulpq) return NULL;
out: - retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), + retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm_uo, first_frag, last_frag); if (retval) { @@ -921,7 +918,7 @@ static struct sctp_ulpevent *sctp_intl_retrieve_first(struct sctp_ulpq *ulpq) return NULL;
out: - retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), + retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm, first_frag, last_frag); if (retval) { @@ -1159,7 +1156,7 @@ static void sctp_generate_iftsn(struct sctp_outq *q, __u32 ctsn)
if (ftsn_chunk) { list_add_tail(&ftsn_chunk->list, &q->control_chunk_list); - SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_OUTCTRLCHUNKS); + SCTP_INC_STATS(asoc->base.net, SCTP_MIB_OUTCTRLCHUNKS); } }
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index 80251c8d2225..992104107978 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c @@ -336,7 +336,8 @@ void sctp_transport_update_rto(struct sctp_transport *tp, __u32 rtt) pr_debug("%s: rto_pending not set on transport %p!\n", __func__, tp);
if (tp->rttvar || tp->srtt) { - struct net *net = sock_net(tp->asoc->base.sk); + struct net *net = tp->asoc->base.net; + unsigned int rto_beta, rto_alpha; /* 6.3.1 C3) When a new RTT measurement R' is made, set * RTTVAR <- (1 - RTO.Beta) * RTTVAR + RTO.Beta * |SRTT - R'| * SRTT <- (1 - RTO.Alpha) * SRTT + RTO.Alpha * R' @@ -348,10 +349,14 @@ void sctp_transport_update_rto(struct sctp_transport *tp, __u32 rtt) * For example, assuming the default value of RTO.Alpha of * 1/8, rto_alpha would be expressed as 3. */ - tp->rttvar = tp->rttvar - (tp->rttvar >> net->sctp.rto_beta) - + (((__u32)abs((__s64)tp->srtt - (__s64)rtt)) >> net->sctp.rto_beta); - tp->srtt = tp->srtt - (tp->srtt >> net->sctp.rto_alpha) - + (rtt >> net->sctp.rto_alpha); + rto_beta = READ_ONCE(net->sctp.rto_beta); + if (rto_beta < 32) + tp->rttvar = tp->rttvar - (tp->rttvar >> rto_beta) + + (((__u32)abs((__s64)tp->srtt - (__s64)rtt)) >> rto_beta); + rto_alpha = READ_ONCE(net->sctp.rto_alpha); + if (rto_alpha < 32) + tp->srtt = tp->srtt - (tp->srtt >> rto_alpha) + + (rtt >> rto_alpha); } else { /* 6.3.1 C2) When the first RTT measurement R is made, set * SRTT <- R, RTTVAR <- R/2. diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index b6536b7f14c0..1c6c640607c5 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c @@ -486,10 +486,9 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ul cevent = sctp_skb2event(pd_first); pd_point = sctp_sk(asoc->base.sk)->pd_point; if (pd_point && pd_point <= pd_len) { - retval = sctp_make_reassembled_event(sock_net(asoc->base.sk), + retval = sctp_make_reassembled_event(asoc->base.net, &ulpq->reasm, - pd_first, - pd_last); + pd_first, pd_last); if (retval) sctp_ulpq_set_pd(ulpq); } @@ -497,7 +496,7 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ul done: return retval; found: - retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), + retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm, first_frag, pos); if (retval) retval->msg_flags |= MSG_EOR; @@ -563,8 +562,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq *ulpq) * further. */ done: - retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), - &ulpq->reasm, first_frag, last_frag); + retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm, + first_frag, last_frag); if (retval && is_last) retval->msg_flags |= MSG_EOR;
@@ -664,8 +663,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *ulpq) * further. */ done: - retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk), - &ulpq->reasm, first_frag, last_frag); + retval = sctp_make_reassembled_event(ulpq->asoc->base.net, &ulpq->reasm, + first_frag, last_frag); return retval; }
diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c index cd9954c4ad80..8f0c91561518 100644 --- a/net/strparser/strparser.c +++ b/net/strparser/strparser.c @@ -238,7 +238,7 @@ static int __strp_recv(read_descriptor_t *desc, struct sk_buff *orig_skb, strp_parser_err(strp, -EMSGSIZE, desc); break; } else if (len <= (ssize_t)head->len - - skb->len - stm->strp.offset) { + (ssize_t)skb->len - stm->strp.offset) { /* Length must be into new skb (and also * greater than zero) */ diff --git a/net/tipc/core.c b/net/tipc/core.c index 58ee5ee70781..cce4cde3f5f1 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c @@ -59,7 +59,7 @@ static int __net_init tipc_init_net(struct net *net) tn->trial_addr = 0; tn->addr_trial_end = 0; tn->capabilities = TIPC_NODE_CAPABILITIES; - INIT_WORK(&tn->final_work.work, tipc_net_finalize_work); + INIT_WORK(&tn->work, tipc_net_finalize_work); memset(tn->node_id, 0, sizeof(tn->node_id)); memset(tn->node_id_string, 0, sizeof(tn->node_id_string)); tn->mon_threshold = TIPC_DEF_MON_THRESHOLD; @@ -101,7 +101,7 @@ static void __net_exit tipc_exit_net(struct net *net)
tipc_detach_loopback(net); /* Make sure the tipc_net_finalize_work() finished */ - cancel_work_sync(&tn->final_work.work); + cancel_work_sync(&tn->work); tipc_net_stop(net);
tipc_bcast_stop(net); diff --git a/net/tipc/core.h b/net/tipc/core.h index 59f97ef12e60..32c5945c8933 100644 --- a/net/tipc/core.h +++ b/net/tipc/core.h @@ -87,12 +87,6 @@ extern unsigned int tipc_net_id __read_mostly; extern int sysctl_tipc_rmem[3] __read_mostly; extern int sysctl_tipc_named_timeout __read_mostly;
-struct tipc_net_work { - struct work_struct work; - struct net *net; - u32 addr; -}; - struct tipc_net { u8 node_id[NODE_ID_LEN]; u32 node_addr; @@ -143,7 +137,7 @@ struct tipc_net { struct packet_type loopback_pt;
/* Work item for net finalize */ - struct tipc_net_work final_work; + struct work_struct work; /* The numbers of work queues in schedule */ atomic_t wq_count; }; diff --git a/net/tipc/discover.c b/net/tipc/discover.c index 9c64567f8a74..a6aa9ecc4a0b 100644 --- a/net/tipc/discover.c +++ b/net/tipc/discover.c @@ -167,7 +167,7 @@ static bool tipc_disc_addr_trial_msg(struct tipc_discoverer *d,
/* Apply trial address if we just left trial period */ if (!trial && !self) { - tipc_sched_net_finalize(net, tn->trial_addr); + schedule_work(&tn->work); msg_set_prevnode(buf_msg(d->skb), tn->trial_addr); msg_set_type(buf_msg(d->skb), DSC_REQ_MSG); } @@ -310,7 +310,7 @@ static void tipc_disc_timeout(struct timer_list *t) if (!time_before(jiffies, tn->addr_trial_end) && !tipc_own_addr(net)) { mod_timer(&d->timer, jiffies + TIPC_DISC_INIT); spin_unlock_bh(&d->lock); - tipc_sched_net_finalize(net, tn->trial_addr); + schedule_work(&tn->work); return; }
diff --git a/net/tipc/link.c b/net/tipc/link.c index 2052649fb537..bf7e6fd85548 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c @@ -332,6 +332,11 @@ char tipc_link_plane(struct tipc_link *l) return l->net_plane; }
+struct net *tipc_link_net(struct tipc_link *l) +{ + return l->net; +} + void tipc_link_update_caps(struct tipc_link *l, u16 capabilities) { l->peer_caps = capabilities; diff --git a/net/tipc/link.h b/net/tipc/link.h index adcad65e761c..5ac43acce958 100644 --- a/net/tipc/link.h +++ b/net/tipc/link.h @@ -151,4 +151,5 @@ int tipc_link_bc_sync_rcv(struct tipc_link *l, struct tipc_msg *hdr, int tipc_link_bc_nack_rcv(struct tipc_link *l, struct sk_buff *skb, struct sk_buff_head *xmitq); bool tipc_link_too_silent(struct tipc_link *l); +struct net *tipc_link_net(struct tipc_link *l); #endif diff --git a/net/tipc/net.c b/net/tipc/net.c index 2498ce8b83c1..81c0b123875a 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c @@ -41,6 +41,7 @@ #include "socket.h" #include "node.h" #include "bcast.h" +#include "link.h" #include "netlink.h" #include "monitor.h"
@@ -138,19 +139,11 @@ static void tipc_net_finalize(struct net *net, u32 addr)
void tipc_net_finalize_work(struct work_struct *work) { - struct tipc_net_work *fwork; + struct tipc_net *tn = container_of(work, struct tipc_net, work);
- fwork = container_of(work, struct tipc_net_work, work); - tipc_net_finalize(fwork->net, fwork->addr); -} - -void tipc_sched_net_finalize(struct net *net, u32 addr) -{ - struct tipc_net *tn = tipc_net(net); - - tn->final_work.net = net; - tn->final_work.addr = addr; - schedule_work(&tn->final_work.work); + rtnl_lock(); + tipc_net_finalize(tipc_link_net(tn->bcl), tn->trial_addr); + rtnl_unlock(); }
void tipc_net_stop(struct net *net) diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 831ca8da8481..2202a8ba2dfd 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -1235,18 +1235,40 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, timeout = schedule_timeout(timeout); lock_sock(sk);
- if (signal_pending(current)) { - err = sock_intr_errno(timeout); - sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE; - sock->state = SS_UNCONNECTED; - vsock_transport_cancel_pkt(vsk); - vsock_remove_connected(vsk); - goto out_wait; - } else if ((sk->sk_state != TCP_ESTABLISHED) && (timeout == 0)) { - err = -ETIMEDOUT; + /* Connection established. Whatever happens to socket once we + * release it, that's not connect()'s concern. No need to go + * into signal and timeout handling. Call it a day. + * + * Note that allowing to "reset" an already established socket + * here is racy and insecure. + */ + if (sk->sk_state == TCP_ESTABLISHED) + break; + + /* If connection was _not_ established and a signal/timeout came + * to be, we want the socket's state reset. User space may want + * to retry. + * + * sk_state != TCP_ESTABLISHED implies that socket is not on + * vsock_connected_table. We keep the binding and the transport + * assigned. + */ + if (signal_pending(current) || timeout == 0) { + err = timeout == 0 ? -ETIMEDOUT : sock_intr_errno(timeout); + + /* Listener might have already responded with + * VIRTIO_VSOCK_OP_RESPONSE. Its handling expects our + * sk_state == TCP_SYN_SENT, which hereby we break. + * In such case VIRTIO_VSOCK_OP_RST will follow. + */ sk->sk_state = TCP_CLOSE; sock->state = SS_UNCONNECTED; + + /* Try to cancel VIRTIO_VSOCK_OP_REQUEST skb sent out by + * transport->connect(). + */ vsock_transport_cancel_pkt(vsk); + goto out_wait; }
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 49c26ea9dd98..fe57b4071e91 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -12,6 +12,7 @@ #include <errno.h> #include <fcntl.h> #include <limits.h> +#include <locale.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> @@ -1007,6 +1008,8 @@ int main(int ac, char **av)
signal(SIGINT, sig_handler);
+ setlocale(LC_ALL, ""); + if (ac > 1 && strcmp(av[1], "-s") == 0) { silent = 1; /* Silence conf_read() until the real callback is set up */ diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c index af56d27693d0..7c126569e6cb 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c @@ -7,6 +7,7 @@ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif +#include <locale.h> #include <string.h> #include <stdlib.h>
@@ -1478,6 +1479,8 @@ int main(int ac, char **av) int lines, columns; char *mode;
+ setlocale(LC_ALL, ""); + if (ac > 1 && strcmp(av[1], "-s") == 0) { /* Silence conf_read() until the real callback is set up */ conf_set_message_callback(NULL); diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c index 04b86a51e055..1df484ff34a0 100644 --- a/sound/soc/codecs/cs4271.c +++ b/sound/soc/codecs/cs4271.c @@ -594,17 +594,17 @@ static int cs4271_component_probe(struct snd_soc_component *component)
ret = regcache_sync(cs4271->regmap); if (ret < 0) - return ret; + goto err_disable_regulator;
ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, CS4271_MODE2_PDN | CS4271_MODE2_CPEN, CS4271_MODE2_PDN | CS4271_MODE2_CPEN); if (ret < 0) - return ret; + goto err_disable_regulator; ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, CS4271_MODE2_PDN, 0); if (ret < 0) - return ret; + goto err_disable_regulator; /* Power-up sequence requires 85 uS */ udelay(85);
@@ -614,6 +614,10 @@ static int cs4271_component_probe(struct snd_soc_component *component) CS4271_MODE2_MUTECAEQUB);
return 0; + +err_disable_regulator: + regulator_bulk_disable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies); + return ret; }
static void cs4271_component_remove(struct snd_soc_component *component) diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c index ce9f99dd3e87..7955ba75255f 100644 --- a/sound/soc/codecs/max98090.c +++ b/sound/soc/codecs/max98090.c @@ -1231,9 +1231,11 @@ static const struct snd_soc_dapm_widget max98091_dapm_widgets[] = { SND_SOC_DAPM_INPUT("DMIC4"),
SND_SOC_DAPM_SUPPLY("DMIC3_ENA", M98090_REG_DIGITAL_MIC_ENABLE, - M98090_DIGMIC3_SHIFT, 0, NULL, 0), + M98090_DIGMIC3_SHIFT, 0, max98090_shdn_event, + SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_SUPPLY("DMIC4_ENA", M98090_REG_DIGITAL_MIC_ENABLE, - M98090_DIGMIC4_SHIFT, 0, NULL, 0), + M98090_DIGMIC4_SHIFT, 0, max98090_shdn_event, + SND_SOC_DAPM_POST_PMU), };
static const struct snd_soc_dapm_route max98090_dapm_routes[] = { diff --git a/sound/soc/qcom/qdsp6/q6asm.c b/sound/soc/qcom/qdsp6/q6asm.c index 835ac98a789c..c80f488e5719 100644 --- a/sound/soc/qcom/qdsp6/q6asm.c +++ b/sound/soc/qcom/qdsp6/q6asm.c @@ -299,9 +299,9 @@ static void q6asm_audio_client_free_buf(struct audio_client *ac,
spin_lock_irqsave(&ac->lock, flags); port->num_periods = 0; + spin_unlock_irqrestore(&ac->lock, flags); kfree(port->buf); port->buf = NULL; - spin_unlock_irqrestore(&ac->lock, flags); }
/** diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 1374a4e093b3..d6dfa2b40067 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -914,7 +914,7 @@ static int parse_term_uac2_clock_source(struct mixer_build *state, { struct uac_clock_source_descriptor *d = p1;
- term->type = UAC3_CLOCK_SOURCE << 16; /* virtual type */ + term->type = UAC2_CLOCK_SOURCE << 16; /* virtual type */ term->id = id; term->name = d->iClockSource; return 0; @@ -1181,6 +1181,13 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, cval->res = 1; } break; + case USB_ID(0x3302, 0x12db): /* MOONDROP Quark2 */ + if (!strcmp(kctl->id.name, "PCM Playback Volume")) { + usb_audio_info(chip, + "set volume quirk for MOONDROP Quark2\n"); + cval->min = -14208; /* Mute under it */ + } + break; } }
@@ -2960,6 +2967,8 @@ static int snd_usb_mixer_controls_badd(struct usb_mixer_interface *mixer, int i;
assoc = usb_ifnum_to_if(dev, ctrlif)->intf_assoc; + if (!assoc) + return -EINVAL;
/* Detect BADD capture/playback channels from AS EP descriptors */ for (i = 0; i < assoc->bInterfaceCount; i++) { diff --git a/tools/power/cpupower/lib/cpuidle.c b/tools/power/cpupower/lib/cpuidle.c index 479c5971aa6d..c15d0de12357 100644 --- a/tools/power/cpupower/lib/cpuidle.c +++ b/tools/power/cpupower/lib/cpuidle.c @@ -231,6 +231,7 @@ int cpuidle_state_disable(unsigned int cpu, { char value[SYSFS_PATH_MAX]; int bytes_written; + int len;
if (cpuidle_state_count(cpu) <= idlestate) return -1; @@ -239,10 +240,10 @@ int cpuidle_state_disable(unsigned int cpu, idlestate_value_files[IDLESTATE_DISABLE])) return -2;
- snprintf(value, SYSFS_PATH_MAX, "%u", disable); + len = snprintf(value, SYSFS_PATH_MAX, "%u", disable);
bytes_written = cpuidle_state_write_file(cpu, idlestate, "disable", - value, sizeof(disable)); + value, len); if (bytes_written) return 0; return -3; diff --git a/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c b/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c index 165eb4da8a64..c878e2e1cabe 100644 --- a/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c +++ b/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c @@ -62,6 +62,7 @@ unsigned char turbo_update_value; unsigned char update_hwp_epp; unsigned char update_hwp_min; unsigned char update_hwp_max; +unsigned char hwp_limits_done_via_sysfs; unsigned char update_hwp_desired; unsigned char update_hwp_window; unsigned char update_hwp_use_pkg; @@ -809,8 +810,10 @@ int ratio_2_sysfs_khz(int ratio) } /* * If HWP is enabled and cpufreq sysfs attribtes are present, - * then update sysfs, so that it will not become - * stale when we write to MSRs. + * then update via sysfs. The intel_pstate driver may modify (clip) + * this request, say, when HWP_CAP is outside of PLATFORM_INFO limits, + * and the driver-chosen value takes precidence. + * * (intel_pstate's max_perf_pct and min_perf_pct will follow cpufreq, * so we don't have to touch that.) */ @@ -865,6 +868,8 @@ int update_sysfs(int cpu) if (update_hwp_max) update_cpufreq_scaling_freq(1, cpu, req_update.hwp_max);
+ hwp_limits_done_via_sysfs = 1; + return 0; }
@@ -943,10 +948,10 @@ int update_hwp_request(int cpu) if (debug) print_hwp_request(cpu, &req, "old: ");
- if (update_hwp_min) + if (update_hwp_min && !hwp_limits_done_via_sysfs) req.hwp_min = req_update.hwp_min;
- if (update_hwp_max) + if (update_hwp_max && !hwp_limits_done_via_sysfs) req.hwp_max = req_update.hwp_max;
if (update_hwp_desired) @@ -1024,13 +1029,18 @@ int update_hwp_request_pkg(int pkg)
int enable_hwp_on_cpu(int cpu) { - unsigned long long msr; + unsigned long long old_msr, new_msr; + + get_msr(cpu, MSR_PM_ENABLE, &old_msr); + + if (old_msr & 1) + return 0; /* already enabled */
- get_msr(cpu, MSR_PM_ENABLE, &msr); - put_msr(cpu, MSR_PM_ENABLE, 1); + new_msr = old_msr | 1; + put_msr(cpu, MSR_PM_ENABLE, new_msr);
if (verbose) - printf("cpu%d: MSR_PM_ENABLE old: %d new: %d\n", cpu, (unsigned int) msr, 1); + printf("cpu%d: MSR_PM_ENABLE old: %llX new: %llX\n", cpu, old_msr, new_msr);
return 0; } diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 40ee6f57af78..9514f6dbe46b 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -237,7 +237,7 @@ else endif
clean: - @for TARGET in $(TARGETS); do \ + @for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \ BUILD_TARGET=$$BUILD/$$TARGET; \ $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\ done; diff --git a/tools/testing/selftests/bpf/test_lirc_mode2_user.c b/tools/testing/selftests/bpf/test_lirc_mode2_user.c index fb5fd6841ef3..d63878bc2d5f 100644 --- a/tools/testing/selftests/bpf/test_lirc_mode2_user.c +++ b/tools/testing/selftests/bpf/test_lirc_mode2_user.c @@ -73,7 +73,7 @@ int main(int argc, char **argv)
/* Let's try detach it before it was ever attached */ ret = bpf_prog_detach2(progfd, lircfd, BPF_LIRC_MODE2); - if (ret != -1 || errno != ENOENT) { + if (ret != -ENOENT) { printf("bpf_prog_detach2 not attached should fail: %m\n"); return 1; } diff --git a/tools/testing/selftests/net/fcnal-test.sh b/tools/testing/selftests/net/fcnal-test.sh index d2ac09b35dcf..354c766e7c24 100755 --- a/tools/testing/selftests/net/fcnal-test.sh +++ b/tools/testing/selftests/net/fcnal-test.sh @@ -164,7 +164,7 @@ show_hint() kill_procs() { killall nettest ping ping6 >/dev/null 2>&1 - sleep 1 + slowwait 2 sh -c 'test -z "$(pgrep '"'^(nettest|ping|ping6)$'"')"' }
do_run_cmd() @@ -376,6 +376,8 @@ create_ns() ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1 ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1 + ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0 + ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.accept_dad=0 }
# create veth pair to connect namespaces and apply addresses. diff --git a/tools/testing/selftests/net/psock_tpacket.c b/tools/testing/selftests/net/psock_tpacket.c index 404a2ce759ab..ca0d9a5a9e08 100644 --- a/tools/testing/selftests/net/psock_tpacket.c +++ b/tools/testing/selftests/net/psock_tpacket.c @@ -22,6 +22,7 @@ * - TPACKET_V3: RX_RING */
+#undef NDEBUG #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -33,7 +34,6 @@ #include <ctype.h> #include <fcntl.h> #include <unistd.h> -#include <bits/wordsize.h> #include <net/ethernet.h> #include <netinet/ip.h> #include <arpa/inet.h> @@ -785,7 +785,7 @@ static int test_kernel_bit_width(void)
static int test_user_bit_width(void) { - return __WORDSIZE; + return sizeof(long) * 8; }
static const char *tpacket_str[] = {
On Wed, Dec 03, 2025 at 01:12:32PM +0100, Greg Kroah-Hartman wrote:
I'm announcing the release of the 5.4.302 kernel.
This is the LAST 5.4.y release. It is now end-of-life and should not be used by anyone, anymore. As of this point in time, there are 1539 documented unfixed CVEs for this kernel branch, and that number will only increase over time as more CVEs get assigned for kernel bugs.
And here's that list, if anyone is curious:
5.4.302 is vulnerable to CVE-2020-36776 5.4.302 is vulnerable to CVE-2020-36784 5.4.302 is vulnerable to CVE-2020-36788 5.4.302 is vulnerable to CVE-2021-46925 5.4.302 is vulnerable to CVE-2021-46926 5.4.302 is vulnerable to CVE-2021-46928 5.4.302 is vulnerable to CVE-2021-46941 5.4.302 is vulnerable to CVE-2021-46987 5.4.302 is vulnerable to CVE-2021-47001 5.4.302 is vulnerable to CVE-2021-47004 5.4.302 is vulnerable to CVE-2021-47005 5.4.302 is vulnerable to CVE-2021-47024 5.4.302 is vulnerable to CVE-2021-47049 5.4.302 is vulnerable to CVE-2021-47061 5.4.302 is vulnerable to CVE-2021-47063 5.4.302 is vulnerable to CVE-2021-47070 5.4.302 is vulnerable to CVE-2021-47074 5.4.302 is vulnerable to CVE-2021-47076 5.4.302 is vulnerable to CVE-2021-47077 5.4.302 is vulnerable to CVE-2021-47101 5.4.302 is vulnerable to CVE-2021-47113 5.4.302 is vulnerable to CVE-2021-47116 5.4.302 is vulnerable to CVE-2021-47119 5.4.302 is vulnerable to CVE-2021-47131 5.4.302 is vulnerable to CVE-2021-47143 5.4.302 is vulnerable to CVE-2021-47158 5.4.302 is vulnerable to CVE-2021-47182 5.4.302 is vulnerable to CVE-2021-47183 5.4.302 is vulnerable to CVE-2021-47188 5.4.302 is vulnerable to CVE-2021-47191 5.4.302 is vulnerable to CVE-2021-47193 5.4.302 is vulnerable to CVE-2021-47198 5.4.302 is vulnerable to CVE-2021-47205 5.4.302 is vulnerable to CVE-2021-47211 5.4.302 is vulnerable to CVE-2021-47212 5.4.302 is vulnerable to CVE-2021-47219 5.4.302 is vulnerable to CVE-2021-47226 5.4.302 is vulnerable to CVE-2021-47234 5.4.302 is vulnerable to CVE-2021-47247 5.4.302 is vulnerable to CVE-2021-47253 5.4.302 is vulnerable to CVE-2021-47265 5.4.302 is vulnerable to CVE-2021-47275 5.4.302 is vulnerable to CVE-2021-47281 5.4.302 is vulnerable to CVE-2021-47283 5.4.302 is vulnerable to CVE-2021-47331 5.4.302 is vulnerable to CVE-2021-47335 5.4.302 is vulnerable to CVE-2021-47339 5.4.302 is vulnerable to CVE-2021-47359 5.4.302 is vulnerable to CVE-2021-47362 5.4.302 is vulnerable to CVE-2021-47366 5.4.302 is vulnerable to CVE-2021-47378 5.4.302 is vulnerable to CVE-2021-47381 5.4.302 is vulnerable to CVE-2021-47391 5.4.302 is vulnerable to CVE-2021-47399 5.4.302 is vulnerable to CVE-2021-47407 5.4.302 is vulnerable to CVE-2021-47408 5.4.302 is vulnerable to CVE-2021-47410 5.4.302 is vulnerable to CVE-2021-47412 5.4.302 is vulnerable to CVE-2021-47414 5.4.302 is vulnerable to CVE-2021-47428 5.4.302 is vulnerable to CVE-2021-47432 5.4.302 is vulnerable to CVE-2021-47433 5.4.302 is vulnerable to CVE-2021-47438 5.4.302 is vulnerable to CVE-2021-47452 5.4.302 is vulnerable to CVE-2021-47455 5.4.302 is vulnerable to CVE-2021-47473 5.4.302 is vulnerable to CVE-2021-47479 5.4.302 is vulnerable to CVE-2021-47490 5.4.302 is vulnerable to CVE-2021-47491 5.4.302 is vulnerable to CVE-2021-47492 5.4.302 is vulnerable to CVE-2021-47493 5.4.302 is vulnerable to CVE-2021-47498 5.4.302 is vulnerable to CVE-2021-47501 5.4.302 is vulnerable to CVE-2021-47504 5.4.302 is vulnerable to CVE-2021-47508 5.4.302 is vulnerable to CVE-2021-47523 5.4.302 is vulnerable to CVE-2021-47544 5.4.302 is vulnerable to CVE-2021-47552 5.4.302 is vulnerable to CVE-2021-47559 5.4.302 is vulnerable to CVE-2021-47560 5.4.302 is vulnerable to CVE-2021-47577 5.4.302 is vulnerable to CVE-2021-47578 5.4.302 is vulnerable to CVE-2021-47580 5.4.302 is vulnerable to CVE-2021-47582 5.4.302 is vulnerable to CVE-2021-47599 5.4.302 is vulnerable to CVE-2021-47610 5.4.302 is vulnerable to CVE-2021-47618 5.4.302 is vulnerable to CVE-2021-47622 5.4.302 is vulnerable to CVE-2021-47623 5.4.302 is vulnerable to CVE-2021-47632 5.4.302 is vulnerable to CVE-2021-47635 5.4.302 is vulnerable to CVE-2021-47648 5.4.302 is vulnerable to CVE-2021-47653 5.4.302 is vulnerable to CVE-2022-48628 5.4.302 is vulnerable to CVE-2022-48633 5.4.302 is vulnerable to CVE-2022-48642 5.4.302 is vulnerable to CVE-2022-48664 5.4.302 is vulnerable to CVE-2022-48673 5.4.302 is vulnerable to CVE-2022-48674 5.4.302 is vulnerable to CVE-2022-48706 5.4.302 is vulnerable to CVE-2022-48712 5.4.302 is vulnerable to CVE-2022-48721 5.4.302 is vulnerable to CVE-2022-48733 5.4.302 is vulnerable to CVE-2022-48740 5.4.302 is vulnerable to CVE-2022-48744 5.4.302 is vulnerable to CVE-2022-48751 5.4.302 is vulnerable to CVE-2022-48755 5.4.302 is vulnerable to CVE-2022-48761 5.4.302 is vulnerable to CVE-2022-48763 5.4.302 is vulnerable to CVE-2022-48765 5.4.302 is vulnerable to CVE-2022-48769 5.4.302 is vulnerable to CVE-2022-48791 5.4.302 is vulnerable to CVE-2022-48792 5.4.302 is vulnerable to CVE-2022-48796 5.4.302 is vulnerable to CVE-2022-48802 5.4.302 is vulnerable to CVE-2022-48811 5.4.302 is vulnerable to CVE-2022-48825 5.4.302 is vulnerable to CVE-2022-48826 5.4.302 is vulnerable to CVE-2022-48827 5.4.302 is vulnerable to CVE-2022-48833 5.4.302 is vulnerable to CVE-2022-48844 5.4.302 is vulnerable to CVE-2022-48852 5.4.302 is vulnerable to CVE-2022-48863 5.4.302 is vulnerable to CVE-2022-48865 5.4.302 is vulnerable to CVE-2022-48875 5.4.302 is vulnerable to CVE-2022-48887 5.4.302 is vulnerable to CVE-2022-48893 5.4.302 is vulnerable to CVE-2022-48901 5.4.302 is vulnerable to CVE-2022-48902 5.4.302 is vulnerable to CVE-2022-48909 5.4.302 is vulnerable to CVE-2022-48920 5.4.302 is vulnerable to CVE-2022-48943 5.4.302 is vulnerable to CVE-2022-48950 5.4.302 is vulnerable to CVE-2022-48952 5.4.302 is vulnerable to CVE-2022-48953 5.4.302 is vulnerable to CVE-2022-48961 5.4.302 is vulnerable to CVE-2022-48975 5.4.302 is vulnerable to CVE-2022-48979 5.4.302 is vulnerable to CVE-2022-49000 5.4.302 is vulnerable to CVE-2022-49026 5.4.302 is vulnerable to CVE-2022-49027 5.4.302 is vulnerable to CVE-2022-49028 5.4.302 is vulnerable to CVE-2022-49046 5.4.302 is vulnerable to CVE-2022-49054 5.4.302 is vulnerable to CVE-2022-49065 5.4.302 is vulnerable to CVE-2022-49069 5.4.302 is vulnerable to CVE-2022-49072 5.4.302 is vulnerable to CVE-2022-49097 5.4.302 is vulnerable to CVE-2022-49102 5.4.302 is vulnerable to CVE-2022-49103 5.4.302 is vulnerable to CVE-2022-49104 5.4.302 is vulnerable to CVE-2022-49106 5.4.302 is vulnerable to CVE-2022-49107 5.4.302 is vulnerable to CVE-2022-49109 5.4.302 is vulnerable to CVE-2022-49110 5.4.302 is vulnerable to CVE-2022-49112 5.4.302 is vulnerable to CVE-2022-49118 5.4.302 is vulnerable to CVE-2022-49119 5.4.302 is vulnerable to CVE-2022-49120 5.4.302 is vulnerable to CVE-2022-49121 5.4.302 is vulnerable to CVE-2022-49124 5.4.302 is vulnerable to CVE-2022-49129 5.4.302 is vulnerable to CVE-2022-49134 5.4.302 is vulnerable to CVE-2022-49135 5.4.302 is vulnerable to CVE-2022-49138 5.4.302 is vulnerable to CVE-2022-49142 5.4.302 is vulnerable to CVE-2022-49149 5.4.302 is vulnerable to CVE-2022-49154 5.4.302 is vulnerable to CVE-2022-49156 5.4.302 is vulnerable to CVE-2022-49157 5.4.302 is vulnerable to CVE-2022-49158 5.4.302 is vulnerable to CVE-2022-49161 5.4.302 is vulnerable to CVE-2022-49164 5.4.302 is vulnerable to CVE-2022-49168 5.4.302 is vulnerable to CVE-2022-49169 5.4.302 is vulnerable to CVE-2022-49170 5.4.302 is vulnerable to CVE-2022-49172 5.4.302 is vulnerable to CVE-2022-49174 5.4.302 is vulnerable to CVE-2022-49178 5.4.302 is vulnerable to CVE-2022-49182 5.4.302 is vulnerable to CVE-2022-49188 5.4.302 is vulnerable to CVE-2022-49190 5.4.302 is vulnerable to CVE-2022-49194 5.4.302 is vulnerable to CVE-2022-49196 5.4.302 is vulnerable to CVE-2022-49201 5.4.302 is vulnerable to CVE-2022-49215 5.4.302 is vulnerable to CVE-2022-49219 5.4.302 is vulnerable to CVE-2022-49226 5.4.302 is vulnerable to CVE-2022-49234 5.4.302 is vulnerable to CVE-2022-49241 5.4.302 is vulnerable to CVE-2022-49246 5.4.302 is vulnerable to CVE-2022-49258 5.4.302 is vulnerable to CVE-2022-49267 5.4.302 is vulnerable to CVE-2022-49281 5.4.302 is vulnerable to CVE-2022-49285 5.4.302 is vulnerable to CVE-2022-49289 5.4.302 is vulnerable to CVE-2022-49294 5.4.302 is vulnerable to CVE-2022-49296 5.4.302 is vulnerable to CVE-2022-49303 5.4.302 is vulnerable to CVE-2022-49309 5.4.302 is vulnerable to CVE-2022-49311 5.4.302 is vulnerable to CVE-2022-49312 5.4.302 is vulnerable to CVE-2022-49317 5.4.302 is vulnerable to CVE-2022-49319 5.4.302 is vulnerable to CVE-2022-49323 5.4.302 is vulnerable to CVE-2022-49325 5.4.302 is vulnerable to CVE-2022-49327 5.4.302 is vulnerable to CVE-2022-49328 5.4.302 is vulnerable to CVE-2022-49342 5.4.302 is vulnerable to CVE-2022-49360 5.4.302 is vulnerable to CVE-2022-49361 5.4.302 is vulnerable to CVE-2022-49376 5.4.302 is vulnerable to CVE-2022-49390 5.4.302 is vulnerable to CVE-2022-49398 5.4.302 is vulnerable to CVE-2022-49420 5.4.302 is vulnerable to CVE-2022-49428 5.4.302 is vulnerable to CVE-2022-49430 5.4.302 is vulnerable to CVE-2022-49437 5.4.302 is vulnerable to CVE-2022-49440 5.4.302 is vulnerable to CVE-2022-49443 5.4.302 is vulnerable to CVE-2022-49444 5.4.302 is vulnerable to CVE-2022-49445 5.4.302 is vulnerable to CVE-2022-49449 5.4.302 is vulnerable to CVE-2022-49453 5.4.302 is vulnerable to CVE-2022-49465 5.4.302 is vulnerable to CVE-2022-49468 5.4.302 is vulnerable to CVE-2022-49470 5.4.302 is vulnerable to CVE-2022-49496 5.4.302 is vulnerable to CVE-2022-49497 5.4.302 is vulnerable to CVE-2022-49502 5.4.302 is vulnerable to CVE-2022-49504 5.4.302 is vulnerable to CVE-2022-49512 5.4.302 is vulnerable to CVE-2022-49513 5.4.302 is vulnerable to CVE-2022-49519 5.4.302 is vulnerable to CVE-2022-49521 5.4.302 is vulnerable to CVE-2022-49528 5.4.302 is vulnerable to CVE-2022-49531 5.4.302 is vulnerable to CVE-2022-49534 5.4.302 is vulnerable to CVE-2022-49535 5.4.302 is vulnerable to CVE-2022-49536 5.4.302 is vulnerable to CVE-2022-49540 5.4.302 is vulnerable to CVE-2022-49541 5.4.302 is vulnerable to CVE-2022-49542 5.4.302 is vulnerable to CVE-2022-49545 5.4.302 is vulnerable to CVE-2022-49546 5.4.302 is vulnerable to CVE-2022-49555 5.4.302 is vulnerable to CVE-2022-49562 5.4.302 is vulnerable to CVE-2022-49563 5.4.302 is vulnerable to CVE-2022-49564 5.4.302 is vulnerable to CVE-2022-49566 5.4.302 is vulnerable to CVE-2022-49578 5.4.302 is vulnerable to CVE-2022-49579 5.4.302 is vulnerable to CVE-2022-49585 5.4.302 is vulnerable to CVE-2022-49599 5.4.302 is vulnerable to CVE-2022-49603 5.4.302 is vulnerable to CVE-2022-49610 5.4.302 is vulnerable to CVE-2022-49618 5.4.302 is vulnerable to CVE-2022-49622 5.4.302 is vulnerable to CVE-2022-49623 5.4.302 is vulnerable to CVE-2022-49630 5.4.302 is vulnerable to CVE-2022-49632 5.4.302 is vulnerable to CVE-2022-49635 5.4.302 is vulnerable to CVE-2022-49640 5.4.302 is vulnerable to CVE-2022-49641 5.4.302 is vulnerable to CVE-2022-49650 5.4.302 is vulnerable to CVE-2022-49651 5.4.302 is vulnerable to CVE-2022-49658 5.4.302 is vulnerable to CVE-2022-49664 5.4.302 is vulnerable to CVE-2022-49666 5.4.302 is vulnerable to CVE-2022-49696 5.4.302 is vulnerable to CVE-2022-49698 5.4.302 is vulnerable to CVE-2022-49711 5.4.302 is vulnerable to CVE-2022-49720 5.4.302 is vulnerable to CVE-2022-49723 5.4.302 is vulnerable to CVE-2022-49728 5.4.302 is vulnerable to CVE-2022-49730 5.4.302 is vulnerable to CVE-2022-49742 5.4.302 is vulnerable to CVE-2022-49743 5.4.302 is vulnerable to CVE-2022-49749 5.4.302 is vulnerable to CVE-2022-49758 5.4.302 is vulnerable to CVE-2022-49761 5.4.302 is vulnerable to CVE-2022-49764 5.4.302 is vulnerable to CVE-2022-49765 5.4.302 is vulnerable to CVE-2022-49766 5.4.302 is vulnerable to CVE-2022-49799 5.4.302 is vulnerable to CVE-2022-49812 5.4.302 is vulnerable to CVE-2022-49813 5.4.302 is vulnerable to CVE-2022-49822 5.4.302 is vulnerable to CVE-2022-49823 5.4.302 is vulnerable to CVE-2022-49824 5.4.302 is vulnerable to CVE-2022-49825 5.4.302 is vulnerable to CVE-2022-49828 5.4.302 is vulnerable to CVE-2022-49829 5.4.302 is vulnerable to CVE-2022-49831 5.4.302 is vulnerable to CVE-2022-49837 5.4.302 is vulnerable to CVE-2022-49838 5.4.302 is vulnerable to CVE-2022-49839 5.4.302 is vulnerable to CVE-2022-49851 5.4.302 is vulnerable to CVE-2022-49873 5.4.302 is vulnerable to CVE-2022-49885 5.4.302 is vulnerable to CVE-2022-49892 5.4.302 is vulnerable to CVE-2022-49898 5.4.302 is vulnerable to CVE-2022-49899 5.4.302 is vulnerable to CVE-2022-49900 5.4.302 is vulnerable to CVE-2022-49901 5.4.302 is vulnerable to CVE-2022-49923 5.4.302 is vulnerable to CVE-2022-49924 5.4.302 is vulnerable to CVE-2022-49932 5.4.302 is vulnerable to CVE-2022-49935 5.4.302 is vulnerable to CVE-2022-49937 5.4.302 is vulnerable to CVE-2022-49938 5.4.302 is vulnerable to CVE-2022-49967 5.4.302 is vulnerable to CVE-2022-49979 5.4.302 is vulnerable to CVE-2022-49980 5.4.302 is vulnerable to CVE-2022-49989 5.4.302 is vulnerable to CVE-2022-49997 5.4.302 is vulnerable to CVE-2022-49998 5.4.302 is vulnerable to CVE-2022-50009 5.4.302 is vulnerable to CVE-2022-50011 5.4.302 is vulnerable to CVE-2022-50015 5.4.302 is vulnerable to CVE-2022-50016 5.4.302 is vulnerable to CVE-2022-50021 5.4.302 is vulnerable to CVE-2022-50023 5.4.302 is vulnerable to CVE-2022-50024 5.4.302 is vulnerable to CVE-2022-50036 5.4.302 is vulnerable to CVE-2022-50053 5.4.302 is vulnerable to CVE-2022-50060 5.4.302 is vulnerable to CVE-2022-50065 5.4.302 is vulnerable to CVE-2022-50066 5.4.302 is vulnerable to CVE-2022-50073 5.4.302 is vulnerable to CVE-2022-50082 5.4.302 is vulnerable to CVE-2022-50086 5.4.302 is vulnerable to CVE-2022-50098 5.4.302 is vulnerable to CVE-2022-50103 5.4.302 is vulnerable to CVE-2022-50114 5.4.302 is vulnerable to CVE-2022-50116 5.4.302 is vulnerable to CVE-2022-50120 5.4.302 is vulnerable to CVE-2022-50129 5.4.302 is vulnerable to CVE-2022-50132 5.4.302 is vulnerable to CVE-2022-50138 5.4.302 is vulnerable to CVE-2022-50144 5.4.302 is vulnerable to CVE-2022-50146 5.4.302 is vulnerable to CVE-2022-50151 5.4.302 is vulnerable to CVE-2022-50159 5.4.302 is vulnerable to CVE-2022-50163 5.4.302 is vulnerable to CVE-2022-50166 5.4.302 is vulnerable to CVE-2022-50167 5.4.302 is vulnerable to CVE-2022-50172 5.4.302 is vulnerable to CVE-2022-50174 5.4.302 is vulnerable to CVE-2022-50175 5.4.302 is vulnerable to CVE-2022-50181 5.4.302 is vulnerable to CVE-2022-50204 5.4.302 is vulnerable to CVE-2022-50224 5.4.302 is vulnerable to CVE-2022-50226 5.4.302 is vulnerable to CVE-2022-50233 5.4.302 is vulnerable to CVE-2022-50236 5.4.302 is vulnerable to CVE-2022-50241 5.4.302 is vulnerable to CVE-2022-50256 5.4.302 is vulnerable to CVE-2022-50260 5.4.302 is vulnerable to CVE-2022-50266 5.4.302 is vulnerable to CVE-2022-50267 5.4.302 is vulnerable to CVE-2022-50293 5.4.302 is vulnerable to CVE-2022-50300 5.4.302 is vulnerable to CVE-2022-50303 5.4.302 is vulnerable to CVE-2022-50304 5.4.302 is vulnerable to CVE-2022-50306 5.4.302 is vulnerable to CVE-2022-50316 5.4.302 is vulnerable to CVE-2022-50320 5.4.302 is vulnerable to CVE-2022-50328 5.4.302 is vulnerable to CVE-2022-50335 5.4.302 is vulnerable to CVE-2022-50340 5.4.302 is vulnerable to CVE-2022-50350 5.4.302 is vulnerable to CVE-2022-50356 5.4.302 is vulnerable to CVE-2022-50364 5.4.302 is vulnerable to CVE-2022-50369 5.4.302 is vulnerable to CVE-2022-50373 5.4.302 is vulnerable to CVE-2022-50374 5.4.302 is vulnerable to CVE-2022-50378 5.4.302 is vulnerable to CVE-2022-50385 5.4.302 is vulnerable to CVE-2022-50388 5.4.302 is vulnerable to CVE-2022-50392 5.4.302 is vulnerable to CVE-2022-50393 5.4.302 is vulnerable to CVE-2022-50400 5.4.302 is vulnerable to CVE-2022-50406 5.4.302 is vulnerable to CVE-2022-50407 5.4.302 is vulnerable to CVE-2022-50410 5.4.302 is vulnerable to CVE-2022-50412 5.4.302 is vulnerable to CVE-2022-50417 5.4.302 is vulnerable to CVE-2022-50443 5.4.302 is vulnerable to CVE-2022-50445 5.4.302 is vulnerable to CVE-2022-50453 5.4.302 is vulnerable to CVE-2022-50467 5.4.302 is vulnerable to CVE-2022-50469 5.4.302 is vulnerable to CVE-2022-50471 5.4.302 is vulnerable to CVE-2022-50472 5.4.302 is vulnerable to CVE-2022-50488 5.4.302 is vulnerable to CVE-2022-50492 5.4.302 is vulnerable to CVE-2022-50493 5.4.302 is vulnerable to CVE-2022-50500 5.4.302 is vulnerable to CVE-2022-50512 5.4.302 is vulnerable to CVE-2022-50516 5.4.302 is vulnerable to CVE-2022-50518 5.4.302 is vulnerable to CVE-2022-50527 5.4.302 is vulnerable to CVE-2022-50539 5.4.302 is vulnerable to CVE-2022-50550 5.4.302 is vulnerable to CVE-2022-50552 5.4.302 is vulnerable to CVE-2022-50554 5.4.302 is vulnerable to CVE-2022-50556 5.4.302 is vulnerable to CVE-2022-50560 5.4.302 is vulnerable to CVE-2022-50562 5.4.302 is vulnerable to CVE-2022-50571 5.4.302 is vulnerable to CVE-2022-50580 5.4.302 is vulnerable to CVE-2022-50582 5.4.302 is vulnerable to CVE-2023-52458 5.4.302 is vulnerable to CVE-2023-52474 5.4.302 is vulnerable to CVE-2023-52476 5.4.302 is vulnerable to CVE-2023-52481 5.4.302 is vulnerable to CVE-2023-52482 5.4.302 is vulnerable to CVE-2023-52484 5.4.302 is vulnerable to CVE-2023-52485 5.4.302 is vulnerable to CVE-2023-52488 5.4.302 is vulnerable to CVE-2023-52489 5.4.302 is vulnerable to CVE-2023-52491 5.4.302 is vulnerable to CVE-2023-52498 5.4.302 is vulnerable to CVE-2023-52500 5.4.302 is vulnerable to CVE-2023-52511 5.4.302 is vulnerable to CVE-2023-52515 5.4.302 is vulnerable to CVE-2023-52516 5.4.302 is vulnerable to CVE-2023-52517 5.4.302 is vulnerable to CVE-2023-52531 5.4.302 is vulnerable to CVE-2023-52561 5.4.302 is vulnerable to CVE-2023-52586 5.4.302 is vulnerable to CVE-2023-52588 5.4.302 is vulnerable to CVE-2023-52590 5.4.302 is vulnerable to CVE-2023-52591 5.4.302 is vulnerable to CVE-2023-52596 5.4.302 is vulnerable to CVE-2023-52610 5.4.302 is vulnerable to CVE-2023-52614 5.4.302 is vulnerable to CVE-2023-52621 5.4.302 is vulnerable to CVE-2023-52624 5.4.302 is vulnerable to CVE-2023-52625 5.4.302 is vulnerable to CVE-2023-52629 5.4.302 is vulnerable to CVE-2023-52633 5.4.302 is vulnerable to CVE-2023-52635 5.4.302 is vulnerable to CVE-2023-52638 5.4.302 is vulnerable to CVE-2023-52639 5.4.302 is vulnerable to CVE-2023-52642 5.4.302 is vulnerable to CVE-2023-52652 5.4.302 is vulnerable to CVE-2023-52653 5.4.302 is vulnerable to CVE-2023-52664 5.4.302 is vulnerable to CVE-2023-52669 5.4.302 is vulnerable to CVE-2023-52671 5.4.302 is vulnerable to CVE-2023-52674 5.4.302 is vulnerable to CVE-2023-52680 5.4.302 is vulnerable to CVE-2023-52700 5.4.302 is vulnerable to CVE-2023-52732 5.4.302 is vulnerable to CVE-2023-52736 5.4.302 is vulnerable to CVE-2023-52737 5.4.302 is vulnerable to CVE-2023-52741 5.4.302 is vulnerable to CVE-2023-52750 5.4.302 is vulnerable to CVE-2023-52751 5.4.302 is vulnerable to CVE-2023-52752 5.4.302 is vulnerable to CVE-2023-52754 5.4.302 is vulnerable to CVE-2023-52757 5.4.302 is vulnerable to CVE-2023-52761 5.4.302 is vulnerable to CVE-2023-52762 5.4.302 is vulnerable to CVE-2023-52763 5.4.302 is vulnerable to CVE-2023-52766 5.4.302 is vulnerable to CVE-2023-52781 5.4.302 is vulnerable to CVE-2023-52808 5.4.302 is vulnerable to CVE-2023-52811 5.4.302 is vulnerable to CVE-2023-52812 5.4.302 is vulnerable to CVE-2023-52814 5.4.302 is vulnerable to CVE-2023-52815 5.4.302 is vulnerable to CVE-2023-52821 5.4.302 is vulnerable to CVE-2023-52826 5.4.302 is vulnerable to CVE-2023-52828 5.4.302 is vulnerable to CVE-2023-52831 5.4.302 is vulnerable to CVE-2023-52833 5.4.302 is vulnerable to CVE-2023-52834 5.4.302 is vulnerable to CVE-2023-52854 5.4.302 is vulnerable to CVE-2023-52878 5.4.302 is vulnerable to CVE-2023-52886 5.4.302 is vulnerable to CVE-2023-52888 5.4.302 is vulnerable to CVE-2023-52903 5.4.302 is vulnerable to CVE-2023-52916 5.4.302 is vulnerable to CVE-2023-52920 5.4.302 is vulnerable to CVE-2023-52925 5.4.302 is vulnerable to CVE-2023-52926 5.4.302 is vulnerable to CVE-2023-52939 5.4.302 is vulnerable to CVE-2023-52975 5.4.302 is vulnerable to CVE-2023-53008 5.4.302 is vulnerable to CVE-2023-53010 5.4.302 is vulnerable to CVE-2023-53020 5.4.302 is vulnerable to CVE-2023-53038 5.4.302 is vulnerable to CVE-2023-53039 5.4.302 is vulnerable to CVE-2023-53042 5.4.302 is vulnerable to CVE-2023-53054 5.4.302 is vulnerable to CVE-2023-53068 5.4.302 is vulnerable to CVE-2023-53074 5.4.302 is vulnerable to CVE-2023-53079 5.4.302 is vulnerable to CVE-2023-53080 5.4.302 is vulnerable to CVE-2023-53091 5.4.302 is vulnerable to CVE-2023-53093 5.4.302 is vulnerable to CVE-2023-53094 5.4.302 is vulnerable to CVE-2023-53097 5.4.302 is vulnerable to CVE-2023-53098 5.4.302 is vulnerable to CVE-2023-53103 5.4.302 is vulnerable to CVE-2023-53105 5.4.302 is vulnerable to CVE-2023-53111 5.4.302 is vulnerable to CVE-2023-53131 5.4.302 is vulnerable to CVE-2023-53133 5.4.302 is vulnerable to CVE-2023-53149 5.4.302 is vulnerable to CVE-2023-53152 5.4.302 is vulnerable to CVE-2023-53171 5.4.302 is vulnerable to CVE-2023-53173 5.4.302 is vulnerable to CVE-2023-53178 5.4.302 is vulnerable to CVE-2023-53183 5.4.302 is vulnerable to CVE-2023-53197 5.4.302 is vulnerable to CVE-2023-53200 5.4.302 is vulnerable to CVE-2023-53201 5.4.302 is vulnerable to CVE-2023-53209 5.4.302 is vulnerable to CVE-2023-53217 5.4.302 is vulnerable to CVE-2023-53218 5.4.302 is vulnerable to CVE-2023-53225 5.4.302 is vulnerable to CVE-2023-53230 5.4.302 is vulnerable to CVE-2023-53231 5.4.302 is vulnerable to CVE-2023-53241 5.4.302 is vulnerable to CVE-2023-53244 5.4.302 is vulnerable to CVE-2023-53247 5.4.302 is vulnerable to CVE-2023-53248 5.4.302 is vulnerable to CVE-2023-53249 5.4.302 is vulnerable to CVE-2023-53250 5.4.302 is vulnerable to CVE-2023-53254 5.4.302 is vulnerable to CVE-2023-53257 5.4.302 is vulnerable to CVE-2023-53261 5.4.302 is vulnerable to CVE-2023-53270 5.4.302 is vulnerable to CVE-2023-53279 5.4.302 is vulnerable to CVE-2023-53282 5.4.302 is vulnerable to CVE-2023-53286 5.4.302 is vulnerable to CVE-2023-53287 5.4.302 is vulnerable to CVE-2023-53292 5.4.302 is vulnerable to CVE-2023-53326 5.4.302 is vulnerable to CVE-2023-53332 5.4.302 is vulnerable to CVE-2023-53334 5.4.302 is vulnerable to CVE-2023-53335 5.4.302 is vulnerable to CVE-2023-53347 5.4.302 is vulnerable to CVE-2023-53348 5.4.302 is vulnerable to CVE-2023-53353 5.4.302 is vulnerable to CVE-2023-53355 5.4.302 is vulnerable to CVE-2023-53359 5.4.302 is vulnerable to CVE-2023-53367 5.4.302 is vulnerable to CVE-2023-53370 5.4.302 is vulnerable to CVE-2023-53383 5.4.302 is vulnerable to CVE-2023-53387 5.4.302 is vulnerable to CVE-2023-53390 5.4.302 is vulnerable to CVE-2023-53391 5.4.302 is vulnerable to CVE-2023-53393 5.4.302 is vulnerable to CVE-2023-53402 5.4.302 is vulnerable to CVE-2023-53403 5.4.302 is vulnerable to CVE-2023-53404 5.4.302 is vulnerable to CVE-2023-53405 5.4.302 is vulnerable to CVE-2023-53406 5.4.302 is vulnerable to CVE-2023-53407 5.4.302 is vulnerable to CVE-2023-53408 5.4.302 is vulnerable to CVE-2023-53409 5.4.302 is vulnerable to CVE-2023-53410 5.4.302 is vulnerable to CVE-2023-53411 5.4.302 is vulnerable to CVE-2023-53412 5.4.302 is vulnerable to CVE-2023-53413 5.4.302 is vulnerable to CVE-2023-53414 5.4.302 is vulnerable to CVE-2023-53415 5.4.302 is vulnerable to CVE-2023-53416 5.4.302 is vulnerable to CVE-2023-53417 5.4.302 is vulnerable to CVE-2023-53418 5.4.302 is vulnerable to CVE-2023-53419 5.4.302 is vulnerable to CVE-2023-53429 5.4.302 is vulnerable to CVE-2023-53432 5.4.302 is vulnerable to CVE-2023-53438 5.4.302 is vulnerable to CVE-2023-53441 5.4.302 is vulnerable to CVE-2023-53447 5.4.302 is vulnerable to CVE-2023-53458 5.4.302 is vulnerable to CVE-2023-53460 5.4.302 is vulnerable to CVE-2023-53461 5.4.302 is vulnerable to CVE-2023-53469 5.4.302 is vulnerable to CVE-2023-53470 5.4.302 is vulnerable to CVE-2023-53473 5.4.302 is vulnerable to CVE-2023-53476 5.4.302 is vulnerable to CVE-2023-53482 5.4.302 is vulnerable to CVE-2023-53483 5.4.302 is vulnerable to CVE-2023-53491 5.4.302 is vulnerable to CVE-2023-53494 5.4.302 is vulnerable to CVE-2023-53499 5.4.302 is vulnerable to CVE-2023-53503 5.4.302 is vulnerable to CVE-2023-53509 5.4.302 is vulnerable to CVE-2023-53510 5.4.302 is vulnerable to CVE-2023-53512 5.4.302 is vulnerable to CVE-2023-53513 5.4.302 is vulnerable to CVE-2023-53517 5.4.302 is vulnerable to CVE-2023-53520 5.4.302 is vulnerable to CVE-2023-53529 5.4.302 is vulnerable to CVE-2023-53530 5.4.302 is vulnerable to CVE-2023-53538 5.4.302 is vulnerable to CVE-2023-53539 5.4.302 is vulnerable to CVE-2023-53540 5.4.302 is vulnerable to CVE-2023-53544 5.4.302 is vulnerable to CVE-2023-53545 5.4.302 is vulnerable to CVE-2023-53562 5.4.302 is vulnerable to CVE-2023-53574 5.4.302 is vulnerable to CVE-2023-53576 5.4.302 is vulnerable to CVE-2023-53577 5.4.302 is vulnerable to CVE-2023-53579 5.4.302 is vulnerable to CVE-2023-53581 5.4.302 is vulnerable to CVE-2023-53584 5.4.302 is vulnerable to CVE-2023-53586 5.4.302 is vulnerable to CVE-2023-53588 5.4.302 is vulnerable to CVE-2023-53594 5.4.302 is vulnerable to CVE-2023-53596 5.4.302 is vulnerable to CVE-2023-53605 5.4.302 is vulnerable to CVE-2023-53606 5.4.302 is vulnerable to CVE-2023-53607 5.4.302 is vulnerable to CVE-2023-53618 5.4.302 is vulnerable to CVE-2023-53620 5.4.302 is vulnerable to CVE-2023-53624 5.4.302 is vulnerable to CVE-2023-53625 5.4.302 is vulnerable to CVE-2023-53627 5.4.302 is vulnerable to CVE-2023-53635 5.4.302 is vulnerable to CVE-2023-53647 5.4.302 is vulnerable to CVE-2023-53651 5.4.302 is vulnerable to CVE-2023-53661 5.4.302 is vulnerable to CVE-2023-53671 5.4.302 is vulnerable to CVE-2023-53680 5.4.302 is vulnerable to CVE-2023-53682 5.4.302 is vulnerable to CVE-2023-53684 5.4.302 is vulnerable to CVE-2023-53685 5.4.302 is vulnerable to CVE-2023-53696 5.4.302 is vulnerable to CVE-2023-53699 5.4.302 is vulnerable to CVE-2023-53707 5.4.302 is vulnerable to CVE-2023-53708 5.4.302 is vulnerable to CVE-2023-53712 5.4.302 is vulnerable to CVE-2023-53714 5.4.302 is vulnerable to CVE-2023-53718 5.4.302 is vulnerable to CVE-2023-53733 5.4.302 is vulnerable to CVE-2024-26583 5.4.302 is vulnerable to CVE-2024-26584 5.4.302 is vulnerable to CVE-2024-26585 5.4.302 is vulnerable to CVE-2024-26586 5.4.302 is vulnerable to CVE-2024-26589 5.4.302 is vulnerable to CVE-2024-26595 5.4.302 is vulnerable to CVE-2024-26607 5.4.302 is vulnerable to CVE-2024-26614 5.4.302 is vulnerable to CVE-2024-26622 5.4.302 is vulnerable to CVE-2024-26629 5.4.302 is vulnerable to CVE-2024-26640 5.4.302 is vulnerable to CVE-2024-26641 5.4.302 is vulnerable to CVE-2024-26656 5.4.302 is vulnerable to CVE-2024-26659 5.4.302 is vulnerable to CVE-2024-26668 5.4.302 is vulnerable to CVE-2024-26669 5.4.302 is vulnerable to CVE-2024-26672 5.4.302 is vulnerable to CVE-2024-26677 5.4.302 is vulnerable to CVE-2024-26686 5.4.302 is vulnerable to CVE-2024-26689 5.4.302 is vulnerable to CVE-2024-26691 5.4.302 is vulnerable to CVE-2024-26700 5.4.302 is vulnerable to CVE-2024-26706 5.4.302 is vulnerable to CVE-2024-26712 5.4.302 is vulnerable to CVE-2024-26715 5.4.302 is vulnerable to CVE-2024-26719 5.4.302 is vulnerable to CVE-2024-26726 5.4.302 is vulnerable to CVE-2024-26733 5.4.302 is vulnerable to CVE-2024-26739 5.4.302 is vulnerable to CVE-2024-26740 5.4.302 is vulnerable to CVE-2024-26743 5.4.302 is vulnerable to CVE-2024-26747 5.4.302 is vulnerable to CVE-2024-26756 5.4.302 is vulnerable to CVE-2024-26757 5.4.302 is vulnerable to CVE-2024-26758 5.4.302 is vulnerable to CVE-2024-26759 5.4.302 is vulnerable to CVE-2024-26769 5.4.302 is vulnerable to CVE-2024-26771 5.4.302 is vulnerable to CVE-2024-26775 5.4.302 is vulnerable to CVE-2024-26787 5.4.302 is vulnerable to CVE-2024-26795 5.4.302 is vulnerable to CVE-2024-26807 5.4.302 is vulnerable to CVE-2024-26828 5.4.302 is vulnerable to CVE-2024-26830 5.4.302 is vulnerable to CVE-2024-26842 5.4.302 is vulnerable to CVE-2024-26844 5.4.302 is vulnerable to CVE-2024-26846 5.4.302 is vulnerable to CVE-2024-26865 5.4.302 is vulnerable to CVE-2024-26866 5.4.302 is vulnerable to CVE-2024-26869 5.4.302 is vulnerable to CVE-2024-26872 5.4.302 is vulnerable to CVE-2024-26876 5.4.302 is vulnerable to CVE-2024-26891 5.4.302 is vulnerable to CVE-2024-26900 5.4.302 is vulnerable to CVE-2024-26906 5.4.302 is vulnerable to CVE-2024-26907 5.4.302 is vulnerable to CVE-2024-26913 5.4.302 is vulnerable to CVE-2024-26914 5.4.302 is vulnerable to CVE-2024-26915 5.4.302 is vulnerable to CVE-2024-26920 5.4.302 is vulnerable to CVE-2024-26928 5.4.302 is vulnerable to CVE-2024-26930 5.4.302 is vulnerable to CVE-2024-26938 5.4.302 is vulnerable to CVE-2024-26947 5.4.302 is vulnerable to CVE-2024-26948 5.4.302 is vulnerable to CVE-2024-26960 5.4.302 is vulnerable to CVE-2024-26961 5.4.302 is vulnerable to CVE-2024-26962 5.4.302 is vulnerable to CVE-2024-26988 5.4.302 is vulnerable to CVE-2024-26996 5.4.302 is vulnerable to CVE-2024-27002 5.4.302 is vulnerable to CVE-2024-27010 5.4.302 is vulnerable to CVE-2024-27011 5.4.302 is vulnerable to CVE-2024-27012 5.4.302 is vulnerable to CVE-2024-27014 5.4.302 is vulnerable to CVE-2024-27019 5.4.302 is vulnerable to CVE-2024-27032 5.4.302 is vulnerable to CVE-2024-27037 5.4.302 is vulnerable to CVE-2024-27051 5.4.302 is vulnerable to CVE-2024-27054 5.4.302 is vulnerable to CVE-2024-27056 5.4.302 is vulnerable to CVE-2024-27062 5.4.302 is vulnerable to CVE-2024-27072 5.4.302 is vulnerable to CVE-2024-27402 5.4.302 is vulnerable to CVE-2024-27403 5.4.302 is vulnerable to CVE-2024-27408 5.4.302 is vulnerable to CVE-2024-27415 5.4.302 is vulnerable to CVE-2024-35247 5.4.302 is vulnerable to CVE-2024-35784 5.4.302 is vulnerable to CVE-2024-35790 5.4.302 is vulnerable to CVE-2024-35791 5.4.302 is vulnerable to CVE-2024-35794 5.4.302 is vulnerable to CVE-2024-35799 5.4.302 is vulnerable to CVE-2024-35803 5.4.302 is vulnerable to CVE-2024-35808 5.4.302 is vulnerable to CVE-2024-35826 5.4.302 is vulnerable to CVE-2024-35837 5.4.302 is vulnerable to CVE-2024-35839 5.4.302 is vulnerable to CVE-2024-35843 5.4.302 is vulnerable to CVE-2024-35848 5.4.302 is vulnerable to CVE-2024-35861 5.4.302 is vulnerable to CVE-2024-35862 5.4.302 is vulnerable to CVE-2024-35863 5.4.302 is vulnerable to CVE-2024-35864 5.4.302 is vulnerable to CVE-2024-35865 5.4.302 is vulnerable to CVE-2024-35866 5.4.302 is vulnerable to CVE-2024-35867 5.4.302 is vulnerable to CVE-2024-35868 5.4.302 is vulnerable to CVE-2024-35869 5.4.302 is vulnerable to CVE-2024-35870 5.4.302 is vulnerable to CVE-2024-35871 5.4.302 is vulnerable to CVE-2024-35875 5.4.302 is vulnerable to CVE-2024-35878 5.4.302 is vulnerable to CVE-2024-35887 5.4.302 is vulnerable to CVE-2024-35896 5.4.302 is vulnerable to CVE-2024-35904 5.4.302 is vulnerable to CVE-2024-35929 5.4.302 is vulnerable to CVE-2024-35931 5.4.302 is vulnerable to CVE-2024-35932 5.4.302 is vulnerable to CVE-2024-35934 5.4.302 is vulnerable to CVE-2024-35939 5.4.302 is vulnerable to CVE-2024-35940 5.4.302 is vulnerable to CVE-2024-35943 5.4.302 is vulnerable to CVE-2024-35945 5.4.302 is vulnerable to CVE-2024-35949 5.4.302 is vulnerable to CVE-2024-35951 5.4.302 is vulnerable to CVE-2024-35965 5.4.302 is vulnerable to CVE-2024-35966 5.4.302 is vulnerable to CVE-2024-35967 5.4.302 is vulnerable to CVE-2024-35995 5.4.302 is vulnerable to CVE-2024-35998 5.4.302 is vulnerable to CVE-2024-35999 5.4.302 is vulnerable to CVE-2024-36009 5.4.302 is vulnerable to CVE-2024-36013 5.4.302 is vulnerable to CVE-2024-36023 5.4.302 is vulnerable to CVE-2024-36024 5.4.302 is vulnerable to CVE-2024-36029 5.4.302 is vulnerable to CVE-2024-36244 5.4.302 is vulnerable to CVE-2024-36479 5.4.302 is vulnerable to CVE-2024-36880 5.4.302 is vulnerable to CVE-2024-36897 5.4.302 is vulnerable to CVE-2024-36901 5.4.302 is vulnerable to CVE-2024-36903 5.4.302 is vulnerable to CVE-2024-36908 5.4.302 is vulnerable to CVE-2024-36909 5.4.302 is vulnerable to CVE-2024-36910 5.4.302 is vulnerable to CVE-2024-36911 5.4.302 is vulnerable to CVE-2024-36914 5.4.302 is vulnerable to CVE-2024-36915 5.4.302 is vulnerable to CVE-2024-36917 5.4.302 is vulnerable to CVE-2024-36922 5.4.302 is vulnerable to CVE-2024-36923 5.4.302 is vulnerable to CVE-2024-36924 5.4.302 is vulnerable to CVE-2024-36927 5.4.302 is vulnerable to CVE-2024-36938 5.4.302 is vulnerable to CVE-2024-36949 5.4.302 is vulnerable to CVE-2024-36951 5.4.302 is vulnerable to CVE-2024-36952 5.4.302 is vulnerable to CVE-2024-36953 5.4.302 is vulnerable to CVE-2024-36968 5.4.302 is vulnerable to CVE-2024-36969 5.4.302 is vulnerable to CVE-2024-37021 5.4.302 is vulnerable to CVE-2024-37354 5.4.302 is vulnerable to CVE-2024-38545 5.4.302 is vulnerable to CVE-2024-38546 5.4.302 is vulnerable to CVE-2024-38553 5.4.302 is vulnerable to CVE-2024-38554 5.4.302 is vulnerable to CVE-2024-38556 5.4.302 is vulnerable to CVE-2024-38570 5.4.302 is vulnerable to CVE-2024-38580 5.4.302 is vulnerable to CVE-2024-38581 5.4.302 is vulnerable to CVE-2024-38591 5.4.302 is vulnerable to CVE-2024-38597 5.4.302 is vulnerable to CVE-2024-38602 5.4.302 is vulnerable to CVE-2024-38608 5.4.302 is vulnerable to CVE-2024-38611 5.4.302 is vulnerable to CVE-2024-38620 5.4.302 is vulnerable to CVE-2024-38630 5.4.302 is vulnerable to CVE-2024-38632 5.4.302 is vulnerable to CVE-2024-38662 5.4.302 is vulnerable to CVE-2024-39479 5.4.302 is vulnerable to CVE-2024-39482 5.4.302 is vulnerable to CVE-2024-39484 5.4.302 is vulnerable to CVE-2024-39490 5.4.302 is vulnerable to CVE-2024-39497 5.4.302 is vulnerable to CVE-2024-39507 5.4.302 is vulnerable to CVE-2024-39508 5.4.302 is vulnerable to CVE-2024-40910 5.4.302 is vulnerable to CVE-2024-40911 5.4.302 is vulnerable to CVE-2024-40918 5.4.302 is vulnerable to CVE-2024-40927 5.4.302 is vulnerable to CVE-2024-40929 5.4.302 is vulnerable to CVE-2024-40947 5.4.302 is vulnerable to CVE-2024-40965 5.4.302 is vulnerable to CVE-2024-40966 5.4.302 is vulnerable to CVE-2024-40967 5.4.302 is vulnerable to CVE-2024-40969 5.4.302 is vulnerable to CVE-2024-40970 5.4.302 is vulnerable to CVE-2024-40971 5.4.302 is vulnerable to CVE-2024-40972 5.4.302 is vulnerable to CVE-2024-40973 5.4.302 is vulnerable to CVE-2024-40976 5.4.302 is vulnerable to CVE-2024-40977 5.4.302 is vulnerable to CVE-2024-40990 5.4.302 is vulnerable to CVE-2024-40998 5.4.302 is vulnerable to CVE-2024-40999 5.4.302 is vulnerable to CVE-2024-41000 5.4.302 is vulnerable to CVE-2024-41001 5.4.302 is vulnerable to CVE-2024-41005 5.4.302 is vulnerable to CVE-2024-41008 5.4.302 is vulnerable to CVE-2024-41013 5.4.302 is vulnerable to CVE-2024-41014 5.4.302 is vulnerable to CVE-2024-41023 5.4.302 is vulnerable to CVE-2024-41048 5.4.302 is vulnerable to CVE-2024-41060 5.4.302 is vulnerable to CVE-2024-41062 5.4.302 is vulnerable to CVE-2024-41066 5.4.302 is vulnerable to CVE-2024-41067 5.4.302 is vulnerable to CVE-2024-41069 5.4.302 is vulnerable to CVE-2024-41073 5.4.302 is vulnerable to CVE-2024-41076 5.4.302 is vulnerable to CVE-2024-41077 5.4.302 is vulnerable to CVE-2024-41078 5.4.302 is vulnerable to CVE-2024-41079 5.4.302 is vulnerable to CVE-2024-41080 5.4.302 is vulnerable to CVE-2024-41082 5.4.302 is vulnerable to CVE-2024-41093 5.4.302 is vulnerable to CVE-2024-41935 5.4.302 is vulnerable to CVE-2024-42063 5.4.302 is vulnerable to CVE-2024-42067 5.4.302 is vulnerable to CVE-2024-42068 5.4.302 is vulnerable to CVE-2024-42077 5.4.302 is vulnerable to CVE-2024-42079 5.4.302 is vulnerable to CVE-2024-42080 5.4.302 is vulnerable to CVE-2024-42082 5.4.302 is vulnerable to CVE-2024-42098 5.4.302 is vulnerable to CVE-2024-42110 5.4.302 is vulnerable to CVE-2024-42114 5.4.302 is vulnerable to CVE-2024-42118 5.4.302 is vulnerable to CVE-2024-42120 5.4.302 is vulnerable to CVE-2024-42121 5.4.302 is vulnerable to CVE-2024-42122 5.4.302 is vulnerable to CVE-2024-42123 5.4.302 is vulnerable to CVE-2024-42128 5.4.302 is vulnerable to CVE-2024-42129 5.4.302 is vulnerable to CVE-2024-42130 5.4.302 is vulnerable to CVE-2024-42135 5.4.302 is vulnerable to CVE-2024-42147 5.4.302 is vulnerable to CVE-2024-42155 5.4.302 is vulnerable to CVE-2024-42156 5.4.302 is vulnerable to CVE-2024-42158 5.4.302 is vulnerable to CVE-2024-42160 5.4.302 is vulnerable to CVE-2024-42225 5.4.302 is vulnerable to CVE-2024-42244 5.4.302 is vulnerable to CVE-2024-42252 5.4.302 is vulnerable to CVE-2024-42253 5.4.302 is vulnerable to CVE-2024-42267 5.4.302 is vulnerable to CVE-2024-42296 5.4.302 is vulnerable to CVE-2024-42312 5.4.302 is vulnerable to CVE-2024-42319 5.4.302 is vulnerable to CVE-2024-42321 5.4.302 is vulnerable to CVE-2024-42322 5.4.302 is vulnerable to CVE-2024-43817 5.4.302 is vulnerable to CVE-2024-43819 5.4.302 is vulnerable to CVE-2024-43831 5.4.302 is vulnerable to CVE-2024-43834 5.4.302 is vulnerable to CVE-2024-43863 5.4.302 is vulnerable to CVE-2024-43866 5.4.302 is vulnerable to CVE-2024-43872 5.4.302 is vulnerable to CVE-2024-43877 5.4.302 is vulnerable to CVE-2024-43892 5.4.302 is vulnerable to CVE-2024-43899 5.4.302 is vulnerable to CVE-2024-43900 5.4.302 is vulnerable to CVE-2024-43901 5.4.302 is vulnerable to CVE-2024-43902 5.4.302 is vulnerable to CVE-2024-43904 5.4.302 is vulnerable to CVE-2024-43905 5.4.302 is vulnerable to CVE-2024-43907 5.4.302 is vulnerable to CVE-2024-43909 5.4.302 is vulnerable to CVE-2024-43912 5.4.302 is vulnerable to CVE-2024-44938 5.4.302 is vulnerable to CVE-2024-44939 5.4.302 is vulnerable to CVE-2024-44940 5.4.302 is vulnerable to CVE-2024-44941 5.4.302 is vulnerable to CVE-2024-44942 5.4.302 is vulnerable to CVE-2024-44949 5.4.302 is vulnerable to CVE-2024-44950 5.4.302 is vulnerable to CVE-2024-44957 5.4.302 is vulnerable to CVE-2024-44958 5.4.302 is vulnerable to CVE-2024-44963 5.4.302 is vulnerable to CVE-2024-44972 5.4.302 is vulnerable to CVE-2024-44982 5.4.302 is vulnerable to CVE-2024-44986 5.4.302 is vulnerable to CVE-2024-45015 5.4.302 is vulnerable to CVE-2024-45828 5.4.302 is vulnerable to CVE-2024-46681 5.4.302 is vulnerable to CVE-2024-46695 5.4.302 is vulnerable to CVE-2024-46702 5.4.302 is vulnerable to CVE-2024-46707 5.4.302 is vulnerable to CVE-2024-46713 5.4.302 is vulnerable to CVE-2024-46715 5.4.302 is vulnerable to CVE-2024-46716 5.4.302 is vulnerable to CVE-2024-46717 5.4.302 is vulnerable to CVE-2024-46720 5.4.302 is vulnerable to CVE-2024-46724 5.4.302 is vulnerable to CVE-2024-46725 5.4.302 is vulnerable to CVE-2024-46726 5.4.302 is vulnerable to CVE-2024-46727 5.4.302 is vulnerable to CVE-2024-46728 5.4.302 is vulnerable to CVE-2024-46729 5.4.302 is vulnerable to CVE-2024-46730 5.4.302 is vulnerable to CVE-2024-46731 5.4.302 is vulnerable to CVE-2024-46732 5.4.302 is vulnerable to CVE-2024-46733 5.4.302 is vulnerable to CVE-2024-46751 5.4.302 is vulnerable to CVE-2024-46752 5.4.302 is vulnerable to CVE-2024-46753 5.4.302 is vulnerable to CVE-2024-46754 5.4.302 is vulnerable to CVE-2024-46760 5.4.302 is vulnerable to CVE-2024-46762 5.4.302 is vulnerable to CVE-2024-46763 5.4.302 is vulnerable to CVE-2024-46770 5.4.302 is vulnerable to CVE-2024-46772 5.4.302 is vulnerable to CVE-2024-46773 5.4.302 is vulnerable to CVE-2024-46774 5.4.302 is vulnerable to CVE-2024-46775 5.4.302 is vulnerable to CVE-2024-46776 5.4.302 is vulnerable to CVE-2024-46787 5.4.302 is vulnerable to CVE-2024-46802 5.4.302 is vulnerable to CVE-2024-46806 5.4.302 is vulnerable to CVE-2024-46807 5.4.302 is vulnerable to CVE-2024-46808 5.4.302 is vulnerable to CVE-2024-46809 5.4.302 is vulnerable to CVE-2024-46810 5.4.302 is vulnerable to CVE-2024-46811 5.4.302 is vulnerable to CVE-2024-46812 5.4.302 is vulnerable to CVE-2024-46813 5.4.302 is vulnerable to CVE-2024-46816 5.4.302 is vulnerable to CVE-2024-46819 5.4.302 is vulnerable to CVE-2024-46821 5.4.302 is vulnerable to CVE-2024-46823 5.4.302 is vulnerable to CVE-2024-46825 5.4.302 is vulnerable to CVE-2024-46826 5.4.302 is vulnerable to CVE-2024-46832 5.4.302 is vulnerable to CVE-2024-46834 5.4.302 is vulnerable to CVE-2024-46841 5.4.302 is vulnerable to CVE-2024-46842 5.4.302 is vulnerable to CVE-2024-46848 5.4.302 is vulnerable to CVE-2024-46857 5.4.302 is vulnerable to CVE-2024-46859 5.4.302 is vulnerable to CVE-2024-46860 5.4.302 is vulnerable to CVE-2024-46870 5.4.302 is vulnerable to CVE-2024-46871 5.4.302 is vulnerable to CVE-2024-47141 5.4.302 is vulnerable to CVE-2024-47143 5.4.302 is vulnerable to CVE-2024-47658 5.4.302 is vulnerable to CVE-2024-47660 5.4.302 is vulnerable to CVE-2024-47661 5.4.302 is vulnerable to CVE-2024-47665 5.4.302 is vulnerable to CVE-2024-47666 5.4.302 is vulnerable to CVE-2024-47673 5.4.302 is vulnerable to CVE-2024-47678 5.4.302 is vulnerable to CVE-2024-47683 5.4.302 is vulnerable to CVE-2024-47690 5.4.302 is vulnerable to CVE-2024-47691 5.4.302 is vulnerable to CVE-2024-47693 5.4.302 is vulnerable to CVE-2024-47704 5.4.302 is vulnerable to CVE-2024-47726 5.4.302 is vulnerable to CVE-2024-47728 5.4.302 is vulnerable to CVE-2024-47735 5.4.302 is vulnerable to CVE-2024-47739 5.4.302 is vulnerable to CVE-2024-47745 5.4.302 is vulnerable to CVE-2024-47809 5.4.302 is vulnerable to CVE-2024-48875 5.4.302 is vulnerable to CVE-2024-49569 5.4.302 is vulnerable to CVE-2024-49571 5.4.302 is vulnerable to CVE-2024-49854 5.4.302 is vulnerable to CVE-2024-49858 5.4.302 is vulnerable to CVE-2024-49859 5.4.302 is vulnerable to CVE-2024-49861 5.4.302 is vulnerable to CVE-2024-49863 5.4.302 is vulnerable to CVE-2024-49875 5.4.302 is vulnerable to CVE-2024-49881 5.4.302 is vulnerable to CVE-2024-49889 5.4.302 is vulnerable to CVE-2024-49890 5.4.302 is vulnerable to CVE-2024-49891 5.4.302 is vulnerable to CVE-2024-49893 5.4.302 is vulnerable to CVE-2024-49895 5.4.302 is vulnerable to CVE-2024-49897 5.4.302 is vulnerable to CVE-2024-49898 5.4.302 is vulnerable to CVE-2024-49899 5.4.302 is vulnerable to CVE-2024-49901 5.4.302 is vulnerable to CVE-2024-49905 5.4.302 is vulnerable to CVE-2024-49906 5.4.302 is vulnerable to CVE-2024-49907 5.4.302 is vulnerable to CVE-2024-49908 5.4.302 is vulnerable to CVE-2024-49910 5.4.302 is vulnerable to CVE-2024-49911 5.4.302 is vulnerable to CVE-2024-49912 5.4.302 is vulnerable to CVE-2024-49913 5.4.302 is vulnerable to CVE-2024-49914 5.4.302 is vulnerable to CVE-2024-49915 5.4.302 is vulnerable to CVE-2024-49916 5.4.302 is vulnerable to CVE-2024-49917 5.4.302 is vulnerable to CVE-2024-49918 5.4.302 is vulnerable to CVE-2024-49919 5.4.302 is vulnerable to CVE-2024-49920 5.4.302 is vulnerable to CVE-2024-49921 5.4.302 is vulnerable to CVE-2024-49922 5.4.302 is vulnerable to CVE-2024-49923 5.4.302 is vulnerable to CVE-2024-49925 5.4.302 is vulnerable to CVE-2024-49926 5.4.302 is vulnerable to CVE-2024-49927 5.4.302 is vulnerable to CVE-2024-49929 5.4.302 is vulnerable to CVE-2024-49932 5.4.302 is vulnerable to CVE-2024-49934 5.4.302 is vulnerable to CVE-2024-49937 5.4.302 is vulnerable to CVE-2024-49940 5.4.302 is vulnerable to CVE-2024-49945 5.4.302 is vulnerable to CVE-2024-49950 5.4.302 is vulnerable to CVE-2024-49968 5.4.302 is vulnerable to CVE-2024-49970 5.4.302 is vulnerable to CVE-2024-49974 5.4.302 is vulnerable to CVE-2024-49989 5.4.302 is vulnerable to CVE-2024-49991 5.4.302 is vulnerable to CVE-2024-49992 5.4.302 is vulnerable to CVE-2024-50003 5.4.302 is vulnerable to CVE-2024-50010 5.4.302 is vulnerable to CVE-2024-50014 5.4.302 is vulnerable to CVE-2024-50015 5.4.302 is vulnerable to CVE-2024-50017 5.4.302 is vulnerable to CVE-2024-50036 5.4.302 is vulnerable to CVE-2024-50038 5.4.302 is vulnerable to CVE-2024-50047 5.4.302 is vulnerable to CVE-2024-50056 5.4.302 is vulnerable to CVE-2024-50057 5.4.302 is vulnerable to CVE-2024-50058 5.4.302 is vulnerable to CVE-2024-50060 5.4.302 is vulnerable to CVE-2024-50061 5.4.302 is vulnerable to CVE-2024-50062 5.4.302 is vulnerable to CVE-2024-50067 5.4.302 is vulnerable to CVE-2024-50073 5.4.302 is vulnerable to CVE-2024-50095 5.4.302 is vulnerable to CVE-2024-50112 5.4.302 is vulnerable to CVE-2024-50115 5.4.302 is vulnerable to CVE-2024-50125 5.4.302 is vulnerable to CVE-2024-50135 5.4.302 is vulnerable to CVE-2024-50166 5.4.302 is vulnerable to CVE-2024-50183 5.4.302 is vulnerable to CVE-2024-50187 5.4.302 is vulnerable to CVE-2024-50191 5.4.302 is vulnerable to CVE-2024-50196 5.4.302 is vulnerable to CVE-2024-50211 5.4.302 is vulnerable to CVE-2024-50217 5.4.302 is vulnerable to CVE-2024-50256 5.4.302 is vulnerable to CVE-2024-50258 5.4.302 is vulnerable to CVE-2024-50272 5.4.302 is vulnerable to CVE-2024-50277 5.4.302 is vulnerable to CVE-2024-50280 5.4.302 is vulnerable to CVE-2024-50282 5.4.302 is vulnerable to CVE-2024-50289 5.4.302 is vulnerable to CVE-2024-50298 5.4.302 is vulnerable to CVE-2024-50304 5.4.302 is vulnerable to CVE-2024-52559 5.4.302 is vulnerable to CVE-2024-53050 5.4.302 is vulnerable to CVE-2024-53051 5.4.302 is vulnerable to CVE-2024-53052 5.4.302 is vulnerable to CVE-2024-53058 5.4.302 is vulnerable to CVE-2024-53079 5.4.302 is vulnerable to CVE-2024-53088 5.4.302 is vulnerable to CVE-2024-53090 5.4.302 is vulnerable to CVE-2024-53093 5.4.302 is vulnerable to CVE-2024-53094 5.4.302 is vulnerable to CVE-2024-53095 5.4.302 is vulnerable to CVE-2024-53100 5.4.302 is vulnerable to CVE-2024-53114 5.4.302 is vulnerable to CVE-2024-53128 5.4.302 is vulnerable to CVE-2024-53144 5.4.302 is vulnerable to CVE-2024-53168 5.4.302 is vulnerable to CVE-2024-53177 5.4.302 is vulnerable to CVE-2024-53179 5.4.302 is vulnerable to CVE-2024-53180 5.4.302 is vulnerable to CVE-2024-53187 5.4.302 is vulnerable to CVE-2024-53190 5.4.302 is vulnerable to CVE-2024-53195 5.4.302 is vulnerable to CVE-2024-53206 5.4.302 is vulnerable to CVE-2024-53210 5.4.302 is vulnerable to CVE-2024-53216 5.4.302 is vulnerable to CVE-2024-53218 5.4.302 is vulnerable to CVE-2024-53219 5.4.302 is vulnerable to CVE-2024-53220 5.4.302 is vulnerable to CVE-2024-53224 5.4.302 is vulnerable to CVE-2024-53234 5.4.302 is vulnerable to CVE-2024-53241 5.4.302 is vulnerable to CVE-2024-53685 5.4.302 is vulnerable to CVE-2024-54458 5.4.302 is vulnerable to CVE-2024-54683 5.4.302 is vulnerable to CVE-2024-56369 5.4.302 is vulnerable to CVE-2024-56533 5.4.302 is vulnerable to CVE-2024-56544 5.4.302 is vulnerable to CVE-2024-56551 5.4.302 is vulnerable to CVE-2024-56565 5.4.302 is vulnerable to CVE-2024-56566 5.4.302 is vulnerable to CVE-2024-56568 5.4.302 is vulnerable to CVE-2024-56583 5.4.302 is vulnerable to CVE-2024-56584 5.4.302 is vulnerable to CVE-2024-56588 5.4.302 is vulnerable to CVE-2024-56589 5.4.302 is vulnerable to CVE-2024-56590 5.4.302 is vulnerable to CVE-2024-56591 5.4.302 is vulnerable to CVE-2024-56592 5.4.302 is vulnerable to CVE-2024-56599 5.4.302 is vulnerable to CVE-2024-56604 5.4.302 is vulnerable to CVE-2024-56608 5.4.302 is vulnerable to CVE-2024-56609 5.4.302 is vulnerable to CVE-2024-56611 5.4.302 is vulnerable to CVE-2024-56614 5.4.302 is vulnerable to CVE-2024-56616 5.4.302 is vulnerable to CVE-2024-56623 5.4.302 is vulnerable to CVE-2024-56636 5.4.302 is vulnerable to CVE-2024-56640 5.4.302 is vulnerable to CVE-2024-56641 5.4.302 is vulnerable to CVE-2024-56647 5.4.302 is vulnerable to CVE-2024-56651 5.4.302 is vulnerable to CVE-2024-56658 5.4.302 is vulnerable to CVE-2024-56662 5.4.302 is vulnerable to CVE-2024-56664 5.4.302 is vulnerable to CVE-2024-56692 5.4.302 is vulnerable to CVE-2024-56698 5.4.302 is vulnerable to CVE-2024-56701 5.4.302 is vulnerable to CVE-2024-56703 5.4.302 is vulnerable to CVE-2024-56712 5.4.302 is vulnerable to CVE-2024-56722 5.4.302 is vulnerable to CVE-2024-56751 5.4.302 is vulnerable to CVE-2024-56759 5.4.302 is vulnerable to CVE-2024-56763 5.4.302 is vulnerable to CVE-2024-56775 5.4.302 is vulnerable to CVE-2024-56776 5.4.302 is vulnerable to CVE-2024-56777 5.4.302 is vulnerable to CVE-2024-56778 5.4.302 is vulnerable to CVE-2024-56782 5.4.302 is vulnerable to CVE-2024-56785 5.4.302 is vulnerable to CVE-2024-56787 5.4.302 is vulnerable to CVE-2024-57795 5.4.302 is vulnerable to CVE-2024-57809 5.4.302 is vulnerable to CVE-2024-57838 5.4.302 is vulnerable to CVE-2024-57843 5.4.302 is vulnerable to CVE-2024-57857 5.4.302 is vulnerable to CVE-2024-57872 5.4.302 is vulnerable to CVE-2024-57875 5.4.302 is vulnerable to CVE-2024-57883 5.4.302 is vulnerable to CVE-2024-57887 5.4.302 is vulnerable to CVE-2024-57888 5.4.302 is vulnerable to CVE-2024-57893 5.4.302 is vulnerable to CVE-2024-57896 5.4.302 is vulnerable to CVE-2024-57897 5.4.302 is vulnerable to CVE-2024-57898 5.4.302 is vulnerable to CVE-2024-57899 5.4.302 is vulnerable to CVE-2024-57903 5.4.302 is vulnerable to CVE-2024-57924 5.4.302 is vulnerable to CVE-2024-57939 5.4.302 is vulnerable to CVE-2024-57974 5.4.302 is vulnerable to CVE-2024-57975 5.4.302 is vulnerable to CVE-2024-57976 5.4.302 is vulnerable to CVE-2024-57982 5.4.302 is vulnerable to CVE-2024-57984 5.4.302 is vulnerable to CVE-2024-58005 5.4.302 is vulnerable to CVE-2024-58016 5.4.302 is vulnerable to CVE-2024-58034 5.4.302 is vulnerable to CVE-2024-58053 5.4.302 is vulnerable to CVE-2024-58089 5.4.302 is vulnerable to CVE-2024-58093 5.4.302 is vulnerable to CVE-2024-58094 5.4.302 is vulnerable to CVE-2024-58095 5.4.302 is vulnerable to CVE-2024-58240 5.4.302 is vulnerable to CVE-2024-58241 5.4.302 is vulnerable to CVE-2025-21629 5.4.302 is vulnerable to CVE-2025-21634 5.4.302 is vulnerable to CVE-2025-21635 5.4.302 is vulnerable to CVE-2025-21648 5.4.302 is vulnerable to CVE-2025-21651 5.4.302 is vulnerable to CVE-2025-21682 5.4.302 is vulnerable to CVE-2025-21690 5.4.302 is vulnerable to CVE-2025-21711 5.4.302 is vulnerable to CVE-2025-21712 5.4.302 is vulnerable to CVE-2025-21726 5.4.302 is vulnerable to CVE-2025-21727 5.4.302 is vulnerable to CVE-2025-21734 5.4.302 is vulnerable to CVE-2025-21738 5.4.302 is vulnerable to CVE-2025-21750 5.4.302 is vulnerable to CVE-2025-21758 5.4.302 is vulnerable to CVE-2025-21759 5.4.302 is vulnerable to CVE-2025-21766 5.4.302 is vulnerable to CVE-2025-21768 5.4.302 is vulnerable to CVE-2025-21779 5.4.302 is vulnerable to CVE-2025-21780 5.4.302 is vulnerable to CVE-2025-21792 5.4.302 is vulnerable to CVE-2025-21796 5.4.302 is vulnerable to CVE-2025-21801 5.4.302 is vulnerable to CVE-2025-21802 5.4.302 is vulnerable to CVE-2025-21812 5.4.302 is vulnerable to CVE-2025-21816 5.4.302 is vulnerable to CVE-2025-21820 5.4.302 is vulnerable to CVE-2025-21821 5.4.302 is vulnerable to CVE-2025-21831 5.4.302 is vulnerable to CVE-2025-21838 5.4.302 is vulnerable to CVE-2025-21855 5.4.302 is vulnerable to CVE-2025-21881 5.4.302 is vulnerable to CVE-2025-21891 5.4.302 is vulnerable to CVE-2025-21894 5.4.302 is vulnerable to CVE-2025-21899 5.4.302 is vulnerable to CVE-2025-21912 5.4.302 is vulnerable to CVE-2025-21927 5.4.302 is vulnerable to CVE-2025-21931 5.4.302 is vulnerable to CVE-2025-21941 5.4.302 is vulnerable to CVE-2025-21969 5.4.302 is vulnerable to CVE-2025-21976 5.4.302 is vulnerable to CVE-2025-21985 5.4.302 is vulnerable to CVE-2025-22008 5.4.302 is vulnerable to CVE-2025-22010 5.4.302 is vulnerable to CVE-2025-22022 5.4.302 is vulnerable to CVE-2025-22025 5.4.302 is vulnerable to CVE-2025-22026 5.4.302 is vulnerable to CVE-2025-22027 5.4.302 is vulnerable to CVE-2025-22028 5.4.302 is vulnerable to CVE-2025-22053 5.4.302 is vulnerable to CVE-2025-22055 5.4.302 is vulnerable to CVE-2025-22057 5.4.302 is vulnerable to CVE-2025-22060 5.4.302 is vulnerable to CVE-2025-22072 5.4.302 is vulnerable to CVE-2025-22083 5.4.302 is vulnerable to CVE-2025-22090 5.4.302 is vulnerable to CVE-2025-22103 5.4.302 is vulnerable to CVE-2025-22104 5.4.302 is vulnerable to CVE-2025-22107 5.4.302 is vulnerable to CVE-2025-22109 5.4.302 is vulnerable to CVE-2025-22121 5.4.302 is vulnerable to CVE-2025-22125 5.4.302 is vulnerable to CVE-2025-23131 5.4.302 is vulnerable to CVE-2025-23132 5.4.302 is vulnerable to CVE-2025-23141 5.4.302 is vulnerable to CVE-2025-23148 5.4.302 is vulnerable to CVE-2025-23156 5.4.302 is vulnerable to CVE-2025-23161 5.4.302 is vulnerable to CVE-2025-37739 5.4.302 is vulnerable to CVE-2025-37742 5.4.302 is vulnerable to CVE-2025-37745 5.4.302 is vulnerable to CVE-2025-37756 5.4.302 is vulnerable to CVE-2025-37768 5.4.302 is vulnerable to CVE-2025-37770 5.4.302 is vulnerable to CVE-2025-37800 5.4.302 is vulnerable to CVE-2025-37801 5.4.302 is vulnerable to CVE-2025-37807 5.4.302 is vulnerable to CVE-2025-37830 5.4.302 is vulnerable to CVE-2025-37833 5.4.302 is vulnerable to CVE-2025-37834 5.4.302 is vulnerable to CVE-2025-37836 5.4.302 is vulnerable to CVE-2025-37842 5.4.302 is vulnerable to CVE-2025-37849 5.4.302 is vulnerable to CVE-2025-37852 5.4.302 is vulnerable to CVE-2025-37853 5.4.302 is vulnerable to CVE-2025-37856 5.4.302 is vulnerable to CVE-2025-37867 5.4.302 is vulnerable to CVE-2025-37877 5.4.302 is vulnerable to CVE-2025-37878 5.4.302 is vulnerable to CVE-2025-37879 5.4.302 is vulnerable to CVE-2025-37880 5.4.302 is vulnerable to CVE-2025-37882 5.4.302 is vulnerable to CVE-2025-37883 5.4.302 is vulnerable to CVE-2025-37884 5.4.302 is vulnerable to CVE-2025-37885 5.4.302 is vulnerable to CVE-2025-37911 5.4.302 is vulnerable to CVE-2025-37920 5.4.302 is vulnerable to CVE-2025-37925 5.4.302 is vulnerable to CVE-2025-37928 5.4.302 is vulnerable to CVE-2025-37942 5.4.302 is vulnerable to CVE-2025-37948 5.4.302 is vulnerable to CVE-2025-37951 5.4.302 is vulnerable to CVE-2025-37954 5.4.302 is vulnerable to CVE-2025-37961 5.4.302 is vulnerable to CVE-2025-37963 5.4.302 is vulnerable to CVE-2025-37967 5.4.302 is vulnerable to CVE-2025-37980 5.4.302 is vulnerable to CVE-2025-37992 5.4.302 is vulnerable to CVE-2025-38009 5.4.302 is vulnerable to CVE-2025-38022 5.4.302 is vulnerable to CVE-2025-38039 5.4.302 is vulnerable to CVE-2025-38040 5.4.302 is vulnerable to CVE-2025-38041 5.4.302 is vulnerable to CVE-2025-38045 5.4.302 is vulnerable to CVE-2025-38048 5.4.302 is vulnerable to CVE-2025-38062 5.4.302 is vulnerable to CVE-2025-38063 5.4.302 is vulnerable to CVE-2025-38064 5.4.302 is vulnerable to CVE-2025-38067 5.4.302 is vulnerable to CVE-2025-38068 5.4.302 is vulnerable to CVE-2025-38069 5.4.302 is vulnerable to CVE-2025-38071 5.4.302 is vulnerable to CVE-2025-38073 5.4.302 is vulnerable to CVE-2025-38074 5.4.302 is vulnerable to CVE-2025-38080 5.4.302 is vulnerable to CVE-2025-38084 5.4.302 is vulnerable to CVE-2025-38085 5.4.302 is vulnerable to CVE-2025-38094 5.4.302 is vulnerable to CVE-2025-38095 5.4.302 is vulnerable to CVE-2025-38096 5.4.302 is vulnerable to CVE-2025-38099 5.4.302 is vulnerable to CVE-2025-38105 5.4.302 is vulnerable to CVE-2025-38107 5.4.302 is vulnerable to CVE-2025-38112 5.4.302 is vulnerable to CVE-2025-38117 5.4.302 is vulnerable to CVE-2025-38119 5.4.302 is vulnerable to CVE-2025-38126 5.4.302 is vulnerable to CVE-2025-38129 5.4.302 is vulnerable to CVE-2025-38143 5.4.302 is vulnerable to CVE-2025-38159 5.4.302 is vulnerable to CVE-2025-38161 5.4.302 is vulnerable to CVE-2025-38166 5.4.302 is vulnerable to CVE-2025-38189 5.4.302 is vulnerable to CVE-2025-38192 5.4.302 is vulnerable to CVE-2025-38198 5.4.302 is vulnerable to CVE-2025-38207 5.4.302 is vulnerable to CVE-2025-38208 5.4.302 is vulnerable to CVE-2025-38215 5.4.302 is vulnerable to CVE-2025-38218 5.4.302 is vulnerable to CVE-2025-38232 5.4.302 is vulnerable to CVE-2025-38234 5.4.302 is vulnerable to CVE-2025-38250 5.4.302 is vulnerable to CVE-2025-38257 5.4.302 is vulnerable to CVE-2025-38259 5.4.302 is vulnerable to CVE-2025-38261 5.4.302 is vulnerable to CVE-2025-38263 5.4.302 is vulnerable to CVE-2025-38264 5.4.302 is vulnerable to CVE-2025-38269 5.4.302 is vulnerable to CVE-2025-38272 5.4.302 is vulnerable to CVE-2025-38280 5.4.302 is vulnerable to CVE-2025-38310 5.4.302 is vulnerable to CVE-2025-38319 5.4.302 is vulnerable to CVE-2025-38321 5.4.302 is vulnerable to CVE-2025-38331 5.4.302 is vulnerable to CVE-2025-38333 5.4.302 is vulnerable to CVE-2025-38342 5.4.302 is vulnerable to CVE-2025-38359 5.4.302 is vulnerable to CVE-2025-38361 5.4.302 is vulnerable to CVE-2025-38363 5.4.302 is vulnerable to CVE-2025-38384 5.4.302 is vulnerable to CVE-2025-38409 5.4.302 is vulnerable to CVE-2025-38410 5.4.302 is vulnerable to CVE-2025-38422 5.4.302 is vulnerable to CVE-2025-38425 5.4.302 is vulnerable to CVE-2025-38426 5.4.302 is vulnerable to CVE-2025-38436 5.4.302 is vulnerable to CVE-2025-38438 5.4.302 is vulnerable to CVE-2025-38449 5.4.302 is vulnerable to CVE-2025-38499 5.4.302 is vulnerable to CVE-2025-38503 5.4.302 is vulnerable to CVE-2025-38512 5.4.302 is vulnerable to CVE-2025-38524 5.4.302 is vulnerable to CVE-2025-38527 5.4.302 is vulnerable to CVE-2025-38531 5.4.302 is vulnerable to CVE-2025-38544 5.4.302 is vulnerable to CVE-2025-38556 5.4.302 is vulnerable to CVE-2025-38560 5.4.302 is vulnerable to CVE-2025-38576 5.4.302 is vulnerable to CVE-2025-38584 5.4.302 is vulnerable to CVE-2025-38591 5.4.302 is vulnerable to CVE-2025-38595 5.4.302 is vulnerable to CVE-2025-38614 5.4.302 is vulnerable to CVE-2025-38623 5.4.302 is vulnerable to CVE-2025-38624 5.4.302 is vulnerable to CVE-2025-38626 5.4.302 is vulnerable to CVE-2025-38643 5.4.302 is vulnerable to CVE-2025-38644 5.4.302 is vulnerable to CVE-2025-38645 5.4.302 is vulnerable to CVE-2025-38656 5.4.302 is vulnerable to CVE-2025-38665 5.4.302 is vulnerable to CVE-2025-38676 5.4.302 is vulnerable to CVE-2025-38679 5.4.302 is vulnerable to CVE-2025-38683 5.4.302 is vulnerable to CVE-2025-38684 5.4.302 is vulnerable to CVE-2025-38685 5.4.302 is vulnerable to CVE-2025-38702 5.4.302 is vulnerable to CVE-2025-38704 5.4.302 is vulnerable to CVE-2025-38705 5.4.302 is vulnerable to CVE-2025-38706 5.4.302 is vulnerable to CVE-2025-38709 5.4.302 is vulnerable to CVE-2025-38710 5.4.302 is vulnerable to CVE-2025-38716 5.4.302 is vulnerable to CVE-2025-38717 5.4.302 is vulnerable to CVE-2025-38728 5.4.302 is vulnerable to CVE-2025-38734 5.4.302 is vulnerable to CVE-2025-39677 5.4.302 is vulnerable to CVE-2025-39683 5.4.302 is vulnerable to CVE-2025-39684 5.4.302 is vulnerable to CVE-2025-39685 5.4.302 is vulnerable to CVE-2025-39686 5.4.302 is vulnerable to CVE-2025-39693 5.4.302 is vulnerable to CVE-2025-39697 5.4.302 is vulnerable to CVE-2025-39702 5.4.302 is vulnerable to CVE-2025-39705 5.4.302 is vulnerable to CVE-2025-39706 5.4.302 is vulnerable to CVE-2025-39707 5.4.302 is vulnerable to CVE-2025-39715 5.4.302 is vulnerable to CVE-2025-39716 5.4.302 is vulnerable to CVE-2025-39726 5.4.302 is vulnerable to CVE-2025-39738 5.4.302 is vulnerable to CVE-2025-39744 5.4.302 is vulnerable to CVE-2025-39745 5.4.302 is vulnerable to CVE-2025-39746 5.4.302 is vulnerable to CVE-2025-39747 5.4.302 is vulnerable to CVE-2025-39748 5.4.302 is vulnerable to CVE-2025-39753 5.4.302 is vulnerable to CVE-2025-39754 5.4.302 is vulnerable to CVE-2025-39759 5.4.302 is vulnerable to CVE-2025-39760 5.4.302 is vulnerable to CVE-2025-39762 5.4.302 is vulnerable to CVE-2025-39763 5.4.302 is vulnerable to CVE-2025-39764 5.4.302 is vulnerable to CVE-2025-39770 5.4.302 is vulnerable to CVE-2025-39772 5.4.302 is vulnerable to CVE-2025-39773 5.4.302 is vulnerable to CVE-2025-39781 5.4.302 is vulnerable to CVE-2025-39789 5.4.302 is vulnerable to CVE-2025-39795 5.4.302 is vulnerable to CVE-2025-39797 5.4.302 is vulnerable to CVE-2025-39800 5.4.302 is vulnerable to CVE-2025-39801 5.4.302 is vulnerable to CVE-2025-39810 5.4.302 is vulnerable to CVE-2025-39819 5.4.302 is vulnerable to CVE-2025-39825 5.4.302 is vulnerable to CVE-2025-39826 5.4.302 is vulnerable to CVE-2025-39827 5.4.302 is vulnerable to CVE-2025-39829 5.4.302 is vulnerable to CVE-2025-39833 5.4.302 is vulnerable to CVE-2025-39838 5.4.302 is vulnerable to CVE-2025-39863 5.4.302 is vulnerable to CVE-2025-39865 5.4.302 is vulnerable to CVE-2025-39866 5.4.302 is vulnerable to CVE-2025-39873 5.4.302 is vulnerable to CVE-2025-39901 5.4.302 is vulnerable to CVE-2025-39905 5.4.302 is vulnerable to CVE-2025-39925 5.4.302 is vulnerable to CVE-2025-39927 5.4.302 is vulnerable to CVE-2025-39929 5.4.302 is vulnerable to CVE-2025-39931 5.4.302 is vulnerable to CVE-2025-39932 5.4.302 is vulnerable to CVE-2025-39933 5.4.302 is vulnerable to CVE-2025-39940 5.4.302 is vulnerable to CVE-2025-39949 5.4.302 is vulnerable to CVE-2025-39952 5.4.302 is vulnerable to CVE-2025-39957 5.4.302 is vulnerable to CVE-2025-39958 5.4.302 is vulnerable to CVE-2025-39961 5.4.302 is vulnerable to CVE-2025-39964 5.4.302 is vulnerable to CVE-2025-39990 5.4.302 is vulnerable to CVE-2025-40003 5.4.302 is vulnerable to CVE-2025-40005 5.4.302 is vulnerable to CVE-2025-40021 5.4.302 is vulnerable to CVE-2025-40025 5.4.302 is vulnerable to CVE-2025-40036 5.4.302 is vulnerable to CVE-2025-40043 5.4.302 is vulnerable to CVE-2025-40053 5.4.302 is vulnerable to CVE-2025-40064 5.4.302 is vulnerable to CVE-2025-40074 5.4.302 is vulnerable to CVE-2025-40075 5.4.302 is vulnerable to CVE-2025-40080 5.4.302 is vulnerable to CVE-2025-40082 5.4.302 is vulnerable to CVE-2025-40092 5.4.302 is vulnerable to CVE-2025-40093 5.4.302 is vulnerable to CVE-2025-40094 5.4.302 is vulnerable to CVE-2025-40095 5.4.302 is vulnerable to CVE-2025-40099 5.4.302 is vulnerable to CVE-2025-40100 5.4.302 is vulnerable to CVE-2025-40102 5.4.302 is vulnerable to CVE-2025-40103 5.4.302 is vulnerable to CVE-2025-40104 5.4.302 is vulnerable to CVE-2025-40107 5.4.302 is vulnerable to CVE-2025-40110 5.4.302 is vulnerable to CVE-2025-40123 5.4.302 is vulnerable to CVE-2025-40135 5.4.302 is vulnerable to CVE-2025-40137 5.4.302 is vulnerable to CVE-2025-40139 5.4.302 is vulnerable to CVE-2025-40146 5.4.302 is vulnerable to CVE-2025-40149 5.4.302 is vulnerable to CVE-2025-40158 5.4.302 is vulnerable to CVE-2025-40160 5.4.302 is vulnerable to CVE-2025-40164 5.4.302 is vulnerable to CVE-2025-40168 5.4.302 is vulnerable to CVE-2025-40170 5.4.302 is vulnerable to CVE-2025-40180 5.4.302 is vulnerable to CVE-2025-40193 5.4.302 is vulnerable to CVE-2025-40195 5.4.302 is vulnerable to CVE-2025-40196 5.4.302 is vulnerable to CVE-2025-40206 5.4.302 is vulnerable to CVE-2025-40210 5.4.302 is vulnerable to CVE-2025-40300
Total Vulnerable CVE's in 5.4.302 : 1539
linux-stable-mirror@lists.linaro.org