Changes in 5.15.61
Makefile: link with -z noexecstack --no-warn-rwx-segments
x86: link vdso and boot with -z noexecstack --no-warn-rwx-segments
Revert "pNFS: nfs3_set_ds_client should set NFS_CS_NOPING"
scsi: Revert "scsi: qla2xxx: Fix disk failure to rediscover"
pNFS/flexfiles: Report RDMA connection errors to the server
NFSD: Clean up the show_nf_flags() macro
nfsd: eliminate the NFSD_FILE_BREAK_* flags
ALSA: usb-audio: Add quirk for Behringer UMC202HD
ALSA: bcd2000: Fix a UAF bug on the error path of probing
ALSA: hda/realtek: Add quirk for Clevo NV45PZ
ALSA: hda/realtek: Add quirk for HP Spectre x360 15-eb0xxx
wifi: mac80211_hwsim: fix race condition in pending packet
wifi: mac80211_hwsim: add back erroneously removed cast
wifi: mac80211_hwsim: use 32-bit skb cookie
add barriers to buffer_uptodate and set_buffer_uptodate
lockd: detect and reject lock arguments that overflow
HID: hid-input: add Surface Go battery quirk
HID: wacom: Only report rotation for art pen
HID: wacom: Don't register pad_input for touch switch
KVM: nVMX: Snapshot pre-VM-Enter BNDCFGS for !nested_run_pending case
KVM: nVMX: Snapshot pre-VM-Enter DEBUGCTL for !nested_run_pending case
KVM: SVM: Don't BUG if userspace injects an interrupt with GIF=0
KVM: s390: pv: don't present the ecall interrupt twice
KVM: x86: Split kvm_is_valid_cr4() and export only the non-vendor bits
KVM: nVMX: Let userspace set nVMX MSR to any _host_ supported value
KVM: nVMX: Account for KVM reserved CR4 bits in consistency checks
KVM: nVMX: Inject #UD if VMXON is attempted with incompatible CR0/CR4
KVM: x86: Mark TSS busy during LTR emulation _after_ all fault checks
KVM: x86: Set error code to segment selector on LLDT/LTR non-canonical #GP
KVM: nVMX: Always enable TSC scaling for L2 when it was enabled for L1
KVM: x86: Tag kvm_mmu_x86_module_init() with __init
KVM: x86: do not report preemption if the steal time cache is stale
KVM: x86: revalidate steal time cache if MSR value changes
riscv: set default pm_power_off to NULL
ALSA: hda/conexant: Add quirk for LENOVO 20149 Notebook model
ALSA: hda/cirrus - support for iMac 12,1 model
ALSA: hda/realtek: Add quirk for another Asus K42JZ model
ALSA: hda/realtek: Add a quirk for HP OMEN 15 (8786) mute LED
tty: vt: initialize unicode screen buffer
vfs: Check the truncate maximum size in inode_newsize_ok()
fs: Add missing umask strip in vfs_tmpfile
thermal: sysfs: Fix cooling_device_stats_setup() error code path
fbcon: Fix boundary checks for fbcon=vc:n1-n2 parameters
fbcon: Fix accelerated fbdev scrolling while logo is still shown
usbnet: Fix linkwatch use-after-free on disconnect
fix short copy handling in copy_mc_pipe_to_iter()
crypto: ccp - Use kzalloc for sev ioctl interfaces to prevent kernel memory leak
ovl: drop WARN_ON() dentry is NULL in ovl_encode_fh()
parisc: Fix device names in /proc/iomem
parisc: Drop pa_swapper_pg_lock spinlock
parisc: Check the return value of ioremap() in lba_driver_probe()
parisc: io_pgetevents_time64() needs compat syscall in 32-bit compat mode
riscv:uprobe fix SR_SPIE set/clear handling
dt-bindings: riscv: fix SiFive l2-cache's cache-sets
RISC-V: kexec: Fixup use of smp_processor_id() in preemptible context
RISC-V: Fixup get incorrect user mode PC for kernel mode regs
RISC-V: Fixup schedule out issue in machine_crash_shutdown()
RISC-V: Add modules to virtual kernel memory layout dump
rtc: rx8025: fix 12/24 hour mode detection on RX-8035
drm/gem: Properly annotate WW context on drm_gem_lock_reservations() error
drm/shmem-helper: Add missing vunmap on error
drm/vc4: hdmi: Disable audio if dmas property is present but empty
drm/hyperv-drm: Include framebuffer and EDID headers
drm/nouveau: fix another off-by-one in nvbios_addr
drm/nouveau: Don't pm_runtime_put_sync(), only pm_runtime_put_autosuspend()
drm/nouveau/acpi: Don't print error when we get -EINPROGRESS from pm_runtime
drm/nouveau/kms: Fix failure path for creating DP connectors
drm/amdgpu: Check BO's requested pinning domains against its preferred_domains
drm/amdgpu: fix check in fbdev init
bpf: Fix KASAN use-after-free Read in compute_effective_progs
btrfs: reject log replay if there is unsupported RO compat flag
mtd: rawnand: arasan: Fix clock rate in NV-DDR
mtd: rawnand: arasan: Update NAND bus clock instead of system clock
um: Remove straying parenthesis
um: seed rng using host OS rng
iio: fix iio_format_avail_range() printing for none IIO_VAL_INT
iio: light: isl29028: Fix the warning in isl29028_remove()
scsi: sg: Allow waiting for commands to complete on removed device
scsi: qla2xxx: Fix incorrect display of max frame size
scsi: qla2xxx: Zero undefined mailbox IN registers
soundwire: qcom: Check device status before reading devid
ksmbd: fix memory leak in smb2_handle_negotiate
ksmbd: prevent out of bound read for SMB2_TREE_CONNNECT
ksmbd: fix use-after-free bug in smb2_tree_disconect
fuse: limit nsec
fuse: ioctl: translate ENOSYS
serial: mvebu-uart: uart2 error bits clearing
md-raid: destroy the bitmap after destroying the thread
md-raid10: fix KASAN warning
mbcache: don't reclaim used entries
mbcache: add functions to delete entry if unused
media: [PATCH] pci: atomisp_cmd: fix three missing checks on list iterator
ia64, processor: fix -Wincompatible-pointer-types in ia64_get_irr()
PCI: Add defines for normal and subtractive PCI bridges
powerpc/fsl-pci: Fix Class Code of PCIe Root Port
powerpc/ptdump: Fix display of RW pages on FSL_BOOK3E
powerpc/powernv: Avoid crashing if rng is NULL
MIPS: cpuinfo: Fix a warning for CONFIG_CPUMASK_OFFSTACK
coresight: Clear the connection field properly
usb: typec: ucsi: Acknowledge the GET_ERROR_STATUS command completion
USB: HCD: Fix URB giveback issue in tasklet function
ARM: dts: uniphier: Fix USB interrupts for PXs2 SoC
arm64: dts: uniphier: Fix USB interrupts for PXs3 SoC
usb: dwc3: gadget: refactor dwc3_repare_one_trb
usb: dwc3: gadget: fix high speed multiplier setting
netfilter: nf_tables: do not allow SET_ID to refer to another table
netfilter: nf_tables: do not allow CHAIN_ID to refer to another table
netfilter: nf_tables: do not allow RULE_ID to refer to another chain
netfilter: nf_tables: fix null deref due to zeroed list head
epoll: autoremove wakers even more aggressively
x86: Handle idle=nomwait cmdline properly for x86_idle
arch: make TRACE_IRQFLAGS_NMI_SUPPORT generic
arm64: Do not forget syscall when starting a new thread.
arm64: fix oops in concurrently setting insn_emulation sysctls
arm64: kasan: Revert "arm64: mte: reset the page tag in page->flags"
ext2: Add more validity checks for inode counts
sched/fair: Introduce SIS_UTIL to search idle CPU based on sum of util_avg
genirq: Don't return error on missing optional irq_request_resources()
irqchip/mips-gic: Only register IPI domain when SMP is enabled
genirq: GENERIC_IRQ_IPI depends on SMP
sched/core: Always flush pending blk_plug
irqchip/mips-gic: Check the return value of ioremap() in gic_of_init()
wait: Fix __wait_event_hrtimeout for RT/DL tasks
ARM: dts: imx6ul: add missing properties for sram
ARM: dts: imx6ul: change operating-points to uint32-matrix
ARM: dts: imx6ul: fix keypad compatible
ARM: dts: imx6ul: fix csi node compatible
ARM: dts: imx6ul: fix lcdif node compatible
ARM: dts: imx6ul: fix qspi node compatible
ARM: dts: BCM5301X: Add DT for Meraki MR26
ARM: dts: ux500: Fix Codina accelerometer mounting matrix
ARM: dts: ux500: Fix Gavini accelerometer mounting matrix
spi: synquacer: Add missing clk_disable_unprepare()
ARM: OMAP2+: display: Fix refcount leak bug
ARM: OMAP2+: pdata-quirks: Fix refcount leak bug
ACPI: EC: Remove duplicate ThinkPad X1 Carbon 6th entry from DMI quirks
ACPI: EC: Drop the EC_FLAGS_IGNORE_DSDT_GPE quirk
ACPI: PM: save NVS memory for Lenovo G40-45
ACPI: LPSS: Fix missing check in register_device_clock()
ARM: dts: qcom: sdx55: Fix the IRQ trigger type for UART
arm64: dts: qcom: ipq8074: fix NAND node name
arm64: dts: allwinner: a64: orangepi-win: Fix LED node name
ARM: shmobile: rcar-gen2: Increase refcount for new reference
firmware: tegra: Fix error check return value of debugfs_create_file()
hwmon: (dell-smm) Add Dell XPS 13 7390 to fan control whitelist
hwmon: (sht15) Fix wrong assumptions in device remove callback
PM: hibernate: defer device probing when resuming from hibernation
selinux: fix memleak in security_read_state_kernel()
selinux: Add boundary check in put_entry()
kasan: test: Silence GCC 12 warnings
drm/amdgpu: Remove one duplicated ef removal
powerpc/64s: Disable stack variable initialisation for prom_init
spi: spi-rspi: Fix PIO fallback on RZ platforms
ARM: findbit: fix overflowing offset
meson-mx-socinfo: Fix refcount leak in meson_mx_socinfo_init
arm64: dts: renesas: beacon: Fix regulator node names
spi: spi-altera-dfl: Fix an error handling path
ARM: bcm: Fix refcount leak in bcm_kona_smc_init
ACPI: processor/idle: Annotate more functions to live in cpuidle section
ARM: dts: imx7d-colibri-emmc: add cpu1 supply
soc: renesas: r8a779a0-sysc: Fix A2DP1 and A2CV[2357] PDR values
scsi: hisi_sas: Use managed PCI functions
dt-bindings: iio: accel: Add DT binding doc for ADXL355
soc: amlogic: Fix refcount leak in meson-secure-pwrc.c
arm64: dts: renesas: Fix thermal-sensors on single-zone sensors
x86/pmem: Fix platform-device leak in error path
ARM: dts: ast2500-evb: fix board compatible
ARM: dts: ast2600-evb: fix board compatible
ARM: dts: ast2600-evb-a1: fix board compatible
arm64: dts: mt8192: Fix idle-states nodes naming scheme
arm64: dts: mt8192: Fix idle-states entry-method
arm64: select TRACE_IRQFLAGS_NMI_SUPPORT
arm64: cpufeature: Allow different PMU versions in ID_DFR0_EL1
locking/lockdep: Fix lockdep_init_map_*() confusion
arm64: dts: qcom: sc7180: Remove ipa_fw_mem node on trogdor
soc: fsl: guts: machine variable might be unset
block: fix infinite loop for invalid zone append
ARM: dts: qcom: mdm9615: add missing PMIC GPIO reg
ARM: OMAP2+: Fix refcount leak in omapdss_init_of
ARM: OMAP2+: Fix refcount leak in omap3xxx_prm_late_init
arm64: dts: qcom: sdm630: disable GPU by default
arm64: dts: qcom: sdm630: fix the qusb2phy ref clock
arm64: dts: qcom: sdm630: fix gpu's interconnect path
arm64: dts: qcom: sdm636-sony-xperia-ganges-mermaid: correct sdc2 pinconf
cpufreq: zynq: Fix refcount leak in zynq_get_revision
regulator: qcom_smd: Fix pm8916_pldo range
ACPI: APEI: Fix _EINJ vs EFI_MEMORY_SP
ARM: dts: qcom-msm8974: fix irq type on blsp2_uart1
soc: qcom: ocmem: Fix refcount leak in of_get_ocmem
soc: qcom: aoss: Fix refcount leak in qmp_cooling_devices_register
ARM: dts: qcom: pm8841: add required thermal-sensor-cells
bus: hisi_lpc: fix missing platform_device_put() in hisi_lpc_acpi_probe()
stack: Declare {randomize_,}kstack_offset to fix Sparse warnings
arm64: dts: qcom: msm8916: Fix typo in pronto remoteproc node
ACPI: APEI: explicit init of HEST and GHES in apci_init()
drivers/iio: Remove all strcpy() uses
ACPI: VIOT: Fix ACS setup
arm64: dts: qcom: sm6125: Move sdc2 pinctrl from seine-pdx201 to sm6125
arm64: dts: qcom: sm6125: Append -state suffix to pinctrl nodes
arm64: dts: qcom: sm8250: add missing PCIe PHY clock-cells
arm64: dts: mt7622: fix BPI-R64 WPS button
arm64: tegra: Fixup SYSRAM references
arm64: tegra: Update Tegra234 BPMP channel addresses
arm64: tegra: Mark BPMP channels as no-memory-wc
arm64: tegra: Fix SDMMC1 CD on P2888
erofs: avoid consecutive detection for Highmem memory
blk-mq: don't create hctx debugfs dir until q->debugfs_dir is created
spi: Fix simplification of devm_spi_register_controller
spi: tegra20-slink: fix UAF in tegra_slink_remove()
hwmon: (drivetemp) Add module alias
blktrace: Trace remapped requests correctly
PM: domains: Ensure genpd_debugfs_dir exists before remove
dm writecache: return void from functions
dm writecache: count number of blocks read, not number of read bios
dm writecache: count number of blocks written, not number of write bios
dm writecache: count number of blocks discarded, not number of discard bios
regulator: of: Fix refcount leak bug in of_get_regulation_constraints()
soc: qcom: Make QCOM_RPMPD depend on PM
arm64: dts: qcom: qcs404: Fix incorrect USB2 PHYs assignment
irqdomain: Report irq number for NOMAP domains
drivers/perf: arm_spe: Fix consistency of SYS_PMSCR_EL1.CX
nohz/full, sched/rt: Fix missed tick-reenabling bug in dequeue_task_rt()
x86/extable: Fix ex_handler_msr() print condition
selftests/seccomp: Fix compile warning when CC=clang
thermal/tools/tmon: Include pthread and time headers in tmon.h
dm: return early from dm_pr_call() if DM device is suspended
pwm: sifive: Simplify offset calculation for PWMCMP registers
pwm: sifive: Ensure the clk is enabled exactly once per running PWM
pwm: sifive: Shut down hardware only after pwmchip_remove() completed
pwm: lpc18xx-sct: Reduce number of devm memory allocations
pwm: lpc18xx-sct: Simplify driver by not using pwm_[gs]et_chip_data()
pwm: lpc18xx: Fix period handling
drm/dp: Export symbol / kerneldoc fixes for DP AUX bus
drm/bridge: tc358767: Move (e)DP bridge endpoint parsing into dedicated function
ath10k: do not enforce interrupt trigger type
drm/st7735r: Fix module autoloading for Okaya RH128128T
drm/panel: Fix build error when CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20=y && CONFIG_DRM_DISPLAY_HELPER=m
wifi: rtlwifi: fix error codes in rtl_debugfs_set_write_h2c()
ath11k: fix netdev open race
drm/mipi-dbi: align max_chunk to 2 in spi_transfer
ath11k: Fix incorrect debug_mask mappings
drm/radeon: fix potential buffer overflow in ni_set_mc_special_registers()
drm/mediatek: Modify dsi funcs to atomic operations
drm/mediatek: Separate poweron/poweroff from enable/disable and define new funcs
drm/mediatek: Add pull-down MIPI operation in mtk_dsi_poweroff function
drm/meson: encoder_hdmi: switch to bridge DRM_BRIDGE_ATTACH_NO_CONNECTOR
drm/meson: encoder_hdmi: Fix refcount leak in meson_encoder_hdmi_init
drm/bridge: lt9611uxc: Cancel only driver's work
i2c: npcm: Remove own slave addresses 2:10
i2c: npcm: Correct slave role behavior
i2c: mxs: Silence a clang warning
virtio-gpu: fix a missing check to avoid NULL dereference
drm/shmem-helper: Unexport drm_gem_shmem_create_with_handle()
drm/shmem-helper: Export dedicated wrappers for GEM object functions
drm/shmem-helper: Pass GEM shmem object in public interfaces
drm/virtio: Fix NULL vs IS_ERR checking in virtio_gpu_object_shmem_init
drm: adv7511: override i2c address of cec before accessing it
crypto: sun8i-ss - do not allocate memory when handling hash requests
crypto: sun8i-ss - fix error codes in allocate_flows()
net: fix sk_wmem_schedule() and sk_rmem_schedule() errors
can: netlink: allow configuring of fixed bit rates without need for do_set_bittiming callback
can: netlink: allow configuring of fixed data bit rates without need for do_set_data_bittiming callback
i2c: Fix a potential use after free
crypto: sun8i-ss - fix infinite loop in sun8i_ss_setup_ivs()
media: atmel: atmel-sama7g5-isc: fix warning in configs without OF
media: tw686x: Register the irq at the end of probe
media: imx-jpeg: Correct some definition according specification
media: imx-jpeg: Leave a blank space before the configuration data
media: imx-jpeg: Add pm-runtime support for imx-jpeg
media: imx-jpeg: use NV12M to represent non contiguous NV12
media: imx-jpeg: Set V4L2_BUF_FLAG_LAST at eos
media: imx-jpeg: Refactor function mxc_jpeg_parse
media: imx-jpeg: Identify and handle precision correctly
media: imx-jpeg: Handle source change in a function
media: imx-jpeg: Support dynamic resolution change
media: imx-jpeg: Align upwards buffer size
media: imx-jpeg: Implement drain using v4l2-mem2mem helpers
ath9k: fix use-after-free in ath9k_hif_usb_rx_cb
wifi: iwlegacy: 4965: fix potential off-by-one overflow in il4965_rs_fill_link_cmd()
drm/radeon: fix incorrrect SPDX-License-Identifiers
rcutorture: Warn on individual rcu_torture_init() error conditions
rcutorture: Don't cpuhp_remove_state() if cpuhp_setup_state() failed
rcutorture: Fix ksoftirqd boosting timing and iteration
test_bpf: fix incorrect netdev features
crypto: ccp - During shutdown, check SEV data pointer before using
drm: bridge: adv7511: Add check for mipi_dsi_driver_register
media: imx-jpeg: Disable slot interrupt when frame done
drm/mcde: Fix refcount leak in mcde_dsi_bind
media: hdpvr: fix error value returns in hdpvr_read
media: v4l2-mem2mem: prevent pollerr when last_buffer_dequeued is set
media: driver/nxp/imx-jpeg: fix a unexpected return value problem
media: tw686x: Fix memory leak in tw686x_video_init
drm/vc4: plane: Remove subpixel positioning check
drm/vc4: plane: Fix margin calculations for the right/bottom edges
drm/bridge: Add a function to abstract away panels
drm/vc4: dsi: Switch to devm_drm_of_get_bridge
drm/vc4: Use of_device_get_match_data()
drm/vc4: dsi: Release workaround buffer and DMA
drm/vc4: dsi: Correct DSI divider calculations
drm/vc4: dsi: Correct pixel order for DSI0
drm/vc4: dsi: Register dsi0 as the correct vc4 encoder type
drm/vc4: dsi: Fix dsi0 interrupt support
drm/vc4: dsi: Add correct stop condition to vc4_dsi_encoder_disable iteration
drm/vc4: hdmi: Fix HPD GPIO detection
drm/vc4: hdmi: Avoid full hdmi audio fifo writes
drm/vc4: hdmi: Reset HDMI MISC_CONTROL register
drm/vc4: hdmi: Fix timings for interlaced modes
drm/vc4: hdmi: Correct HDMI timing registers for interlaced modes
crypto: arm64/gcm - Select AEAD for GHASH_ARM64_CE
selftests/xsk: Destroy BPF resources only when ctx refcount drops to 0
drm/rockchip: vop: Don't crash for invalid duplicate_state()
drm/rockchip: Fix an error handling path rockchip_dp_probe()
drm/mediatek: dpi: Remove output format of YUV
drm/mediatek: dpi: Only enable dpi after the bridge is enabled
drm: bridge: sii8620: fix possible off-by-one
hinic: Use the bitmap API when applicable
net: hinic: fix bug that ethtool get wrong stats
net: hinic: avoid kernel hung in hinic_get_stats64()
drm/msm/mdp5: Fix global state lock backoff
crypto: hisilicon/sec - don't sleep when in softirq
crypto: hisilicon - Kunpeng916 crypto driver don't sleep when in softirq
media: platform: mtk-mdp: Fix mdp_ipi_comm structure alignment
drm/msm: Avoid dirtyfb stalls on video mode displays (v2)
drm/msm/dpu: Fix for non-visible planes
mt76: mt76x02u: fix possible memory leak in __mt76x02u_mcu_send_msg
mt76: mt7615: do not update pm stats in case of error
ieee80211: add EHT 1K aggregation definitions
mt76: mt7921: fix aggregation subframes setting to HE max
mt76: mt7921: enlarge maximum VHT MPDU length to 11454
mediatek: mt76: mac80211: Fix missing of_node_put() in mt76_led_init()
mediatek: mt76: eeprom: fix missing of_node_put() in mt76_find_power_limits_node()
skmsg: Fix invalid last sg check in sk_msg_recvmsg()
drm/exynos/exynos7_drm_decon: free resources when clk_set_parent() failed.
tcp: make retransmitted SKB fit into the send window
libbpf: Fix the name of a reused map
selftests: timers: valid-adjtimex: build fix for newer toolchains
selftests: timers: clocksource-switch: fix passing errors from child
bpf: Fix subprog names in stack traces.
fs: check FMODE_LSEEK to control internal pipe splicing
media: cedrus: h265: Fix flag name
media: hantro: postproc: Fix motion vector space size
media: hantro: Simplify postprocessor
media: hevc: Embedded indexes in RPS
media: staging: media: hantro: Fix typos
wifi: wil6210: debugfs: fix info leak in wil_write_file_wmi()
wifi: p54: Fix an error handling path in p54spi_probe()
wifi: p54: add missing parentheses in p54_flush()
selftests/bpf: fix a test for snprintf() overflow
libbpf: fix an snprintf() overflow check
can: pch_can: do not report txerr and rxerr during bus-off
can: rcar_can: do not report txerr and rxerr during bus-off
can: sja1000: do not report txerr and rxerr during bus-off
can: hi311x: do not report txerr and rxerr during bus-off
can: sun4i_can: do not report txerr and rxerr during bus-off
can: kvaser_usb_hydra: do not report txerr and rxerr during bus-off
can: kvaser_usb_leaf: do not report txerr and rxerr during bus-off
can: usb_8dev: do not report txerr and rxerr during bus-off
can: error: specify the values of data[5..7] of CAN error frames
can: pch_can: pch_can_error(): initialize errc before using it
Bluetooth: hci_intel: Add check for platform_driver_register
i2c: cadence: Support PEC for SMBus block read
i2c: mux-gpmux: Add of_node_put() when breaking out of loop
wifi: wil6210: debugfs: fix uninitialized variable use in `wil_write_file_wmi()`
wifi: iwlwifi: mvm: fix double list_add at iwl_mvm_mac_wake_tx_queue
wifi: libertas: Fix possible refcount leak in if_usb_probe()
media: cedrus: hevc: Add check for invalid timestamp
net/mlx5e: Remove WARN_ON when trying to offload an unsupported TLS cipher/version
net/mlx5e: Fix the value of MLX5E_MAX_RQ_NUM_MTTS
net/mlx5: Adjust log_max_qp to be 18 at most
crypto: hisilicon/hpre - don't use GFP_KERNEL to alloc mem during softirq
crypto: inside-secure - Add missing MODULE_DEVICE_TABLE for of
crypto: hisilicon/sec - fix auth key size error
inet: add READ_ONCE(sk->sk_bound_dev_if) in INET_MATCH()
ipv6: add READ_ONCE(sk->sk_bound_dev_if) in INET6_MATCH()
net: allow unbound socket for packets in VRF when tcp_l3mdev_accept set
netdevsim: fib: Fix reference count leak on route deletion failure
wifi: rtw88: check the return value of alloc_workqueue()
iavf: Fix max_rate limiting
iavf: Fix 'tc qdisc show' listing too many queues
netdevsim: Avoid allocation warnings triggered from user space
net: rose: fix netdev reference changes
net: ionic: fix error check for vlan flags in ionic_set_nic_features()
dccp: put dccp_qpolicy_full() and dccp_qpolicy_push() in the same lock
net: usb: make USB_RTL8153_ECM non user configurable
wireguard: ratelimiter: use hrtimer in selftest
wireguard: allowedips: don't corrupt stack when detecting overflow
HID: amd_sfh: Don't show client init failed as error when discovery fails
clk: renesas: r9a06g032: Fix UART clkgrp bitsel
mtd: maps: Fix refcount leak in of_flash_probe_versatile
mtd: maps: Fix refcount leak in ap_flash_init
mtd: rawnand: meson: Fix a potential double free issue
of: check previous kernel's ima-kexec-buffer against memory bounds
scsi: qla2xxx: edif: Reduce Initiator-Initiator thrashing
scsi: qla2xxx: edif: Fix potential stuck session in sa update
scsi: qla2xxx: edif: Reduce connection thrash
scsi: qla2xxx: edif: Fix inconsistent check of db_flags
scsi: qla2xxx: edif: Synchronize NPIV deletion with authentication application
scsi: qla2xxx: edif: Add retry for ELS passthrough
scsi: qla2xxx: edif: Fix n2n discovery issue with secure target
scsi: qla2xxx: edif: Fix n2n login retry for secure device
KVM: SVM: Unwind "speculative" RIP advancement if INTn injection "fails"
KVM: SVM: Stuff next_rip on emulated INT3 injection if NRIPS is supported
phy: samsung: exynosautov9-ufs: correct TSRV register configurations
PCI: microchip: Fix refcount leak in mc_pcie_init_irq_domains()
PCI: tegra194: Fix PM error handling in tegra_pcie_config_ep()
HID: cp2112: prevent a buffer overflow in cp2112_xfer()
mtd: sm_ftl: Fix deadlock caused by cancel_work_sync in sm_release
mtd: partitions: Fix refcount leak in parse_redboot_of
mtd: parsers: ofpart: Fix refcount leak in bcm4908_partitions_fw_offset
mtd: st_spi_fsm: Add a clk_disable_unprepare() in .probe()'s error path
PCI: mediatek-gen3: Fix refcount leak in mtk_pcie_init_irq_domains()
fpga: altera-pr-ip: fix unsigned comparison with less than zero
usb: host: Fix refcount leak in ehci_hcd_ppc_of_probe
usb: ohci-nxp: Fix refcount leak in ohci_hcd_nxp_probe
usb: gadget: tegra-xudc: Fix error check in tegra_xudc_powerdomain_init()
usb: xhci: tegra: Fix error check
netfilter: xtables: Bring SPDX identifier back
scsi: qla2xxx: edif: Send LOGO for unexpected IKE message
scsi: qla2xxx: edif: Reduce disruption due to multiple app start
scsi: qla2xxx: edif: Fix no login after app start
scsi: qla2xxx: edif: Tear down session if keys have been removed
scsi: qla2xxx: edif: Fix session thrash
scsi: qla2xxx: edif: Fix no logout on delete for N2N
iio: accel: bma400: Fix the scale min and max macro values
platform/chrome: cros_ec: Always expose last resume result
iio: accel: bma400: Reordering of header files
clk: mediatek: reset: Fix written reset bit offset
lib/test_hmm: avoid accessing uninitialized pages
memremap: remove support for external pgmap refcounts
mm/memremap: fix memunmap_pages() race with get_dev_pagemap()
KVM: Don't set Accessed/Dirty bits for ZERO_PAGE
mwifiex: Ignore BTCOEX events from the 88W8897 firmware
mwifiex: fix sleep in atomic context bugs caused by dev_coredumpv
scsi: iscsi: Allow iscsi_if_stop_conn() to be called from kernel
scsi: iscsi: Add helper to remove a session from the kernel
scsi: iscsi: Fix session removal on shutdown
dmaengine: dw-edma: Fix eDMA Rd/Wr-channels and DMA-direction semantics
mtd: dataflash: Add SPI ID table
clk: qcom: camcc-sm8250: Fix halt on boot by reducing driver's init level
misc: rtsx: Fix an error handling path in rtsx_pci_probe()
driver core: fix potential deadlock in __driver_attach
clk: qcom: clk-krait: unlock spin after mux completion
clk: qcom: gcc-msm8939: Add missing SYSTEM_MM_NOC_BFDCD_CLK_SRC
clk: qcom: gcc-msm8939: Fix bimc_ddr_clk_src rcgr base address
clk: qcom: gcc-msm8939: Add missing system_mm_noc_bfdcd_clk_src
clk: qcom: gcc-msm8939: Point MM peripherals to system_mm_noc clock
usb: host: xhci: use snprintf() in xhci_decode_trb()
RDMA/rxe: Fix deadlock in rxe_do_local_ops()
clk: qcom: ipq8074: fix NSS core PLL-s
clk: qcom: ipq8074: SW workaround for UBI32 PLL lock
clk: qcom: ipq8074: fix NSS port frequency tables
clk: qcom: ipq8074: set BRANCH_HALT_DELAY flag for UBI clocks
clk: qcom: camcc-sdm845: Fix topology around titan_top power domain
clk: qcom: camcc-sm8250: Fix topology around titan_top power domain
clk: qcom: clk-rcg2: Fail Duty-Cycle configuration if MND divider is not enabled.
clk: qcom: clk-rcg2: Make sure to not write d=0 to the NMD register
mm/mempolicy: fix get_nodes out of bound access
PCI: dwc: Stop link on host_init errors and de-initialization
PCI: dwc: Add unroll iATU space support to dw_pcie_disable_atu()
PCI: dwc: Disable outbound windows only for controllers using iATU
PCI: dwc: Set INCREASE_REGION_SIZE flag based on limit address
PCI: dwc: Deallocate EPC memory on dw_pcie_ep_init() errors
PCI: dwc: Always enable CDM check if "snps,enable-cdm-check" exists
soundwire: bus_type: fix remove and shutdown support
soundwire: revisit driver bind/unbind and callbacks
KVM: arm64: Don't return from void function
dmaengine: sf-pdma: Add multithread support for a DMA channel
PCI: endpoint: Don't stop controller when unbinding endpoint function
scsi: qla2xxx: Check correct variable in qla24xx_async_gffid()
intel_th: Fix a resource leak in an error handling path
intel_th: msu-sink: Potential dereference of null pointer
intel_th: msu: Fix vmalloced buffers
binder: fix redefinition of seq_file attributes
staging: rtl8192u: Fix sleep in atomic context bug in dm_fsync_timer_callback
mmc: sdhci-of-esdhc: Fix refcount leak in esdhc_signal_voltage_switch
mmc: mxcmmc: Silence a clang warning
mmc: renesas_sdhi: Get the reset handle early in the probe
memstick/ms_block: Fix some incorrect memory allocation
memstick/ms_block: Fix a memory leak
mmc: sdhci-of-at91: fix set_uhs_signaling rewriting of MC1R
of: device: Fix missing of_node_put() in of_dma_set_restricted_buffer
mmc: block: Add single read for 4k sector cards
KVM: s390: pv: leak the topmost page table when destroy fails
PCI/portdrv: Don't disable AER reporting in get_port_device_capability()
PCI: qcom: Set up rev 2.1.0 PARF_PHY before enabling clocks
scsi: smartpqi: Fix DMA direction for RAID requests
xtensa: iss/network: provide release() callback
xtensa: iss: fix handling error cases in iss_net_configure()
usb: gadget: udc: amd5536 depends on HAS_DMA
usb: aspeed-vhub: Fix refcount leak bug in ast_vhub_init_desc()
usb: dwc3: core: Deprecate GCTL.CORESOFTRESET
usb: dwc3: core: Do not perform GCTL_CORE_SOFTRESET during bootup
usb: dwc3: qcom: fix missing optional irq warnings
eeprom: idt_89hpesx: uninitialized data in idt_dbgfs_csr_write()
phy: stm32: fix error return in stm32_usbphyc_phy_init
interconnect: imx: fix max_node_id
um: random: Don't initialise hwrng struct with zero
RDMA/irdma: Fix a window for use-after-free
RDMA/irdma: Fix VLAN connection with wildcard address
RDMA/irdma: Fix setting of QP context err_rq_idx_valid field
RDMA/rtrs-srv: Fix modinfo output for stringify
RDMA/rtrs: Fix warning when use poll mode on client side.
RDMA/rtrs: Replace duplicate check with is_pollqueue helper
RDMA/rtrs: Introduce destroy_cq helper
RDMA/rtrs: Do not allow sessname to contain special symbols / and .
RDMA/rtrs: Rename rtrs_sess to rtrs_path
RDMA/rtrs-srv: Rename rtrs_srv_sess to rtrs_srv_path
RDMA/rtrs-clt: Rename rtrs_clt_sess to rtrs_clt_path
RDMA/rtrs-clt: Replace list_next_or_null_rr_rcu with an inline function
RDMA/qedr: Fix potential memory leak in __qedr_alloc_mr()
RDMA/hns: Fix incorrect clearing of interrupt status register
RDMA/siw: Fix duplicated reported IW_CM_EVENT_CONNECT_REPLY event
iio: cros: Register FIFO callback after sensor is registered
clk: qcom: gcc-msm8939: Fix weird field spacing in ftbl_gcc_camss_cci_clk
RDMA/hfi1: fix potential memory leak in setup_base_ctxt()
gpio: gpiolib-of: Fix refcount bugs in of_mm_gpiochip_add_data()
HID: mcp2221: prevent a buffer overflow in mcp_smbus_write()
HID: amd_sfh: Add NULL check for hid device
dmaengine: imx-dma: Cast of_device_get_match_data() with (uintptr_t)
scripts/gdb: lx-dmesg: read records individually
scripts/gdb: fix 'lx-dmesg' on 32 bits arch
RDMA/rxe: Fix mw bind to allow any consumer key portion
mmc: cavium-octeon: Add of_node_put() when breaking out of loop
mmc: cavium-thunderx: Add of_node_put() when breaking out of loop
HID: alps: Declare U1_UNICORN_LEGACY support
RDMA/rxe: For invalidate compare according to set keys in mr
PCI: tegra194: Fix Root Port interrupt handling
PCI: tegra194: Fix link up retry sequence
HID: amd_sfh: Handle condition of "no sensors"
USB: serial: fix tty-port initialized comments
usb: cdns3: change place of 'priv_ep' assignment in cdns3_gadget_ep_dequeue(), cdns3_gadget_ep_enable()
mtd: spi-nor: fix spi_nor_spimem_setup_op() call in spi_nor_erase_{sector,chip}()
KVM: nVMX: Set UMIP bit CR4_FIXED1 MSR when emulating UMIP
platform/olpc: Fix uninitialized data in debugfs write
RDMA/srpt: Duplicate port name members
RDMA/srpt: Introduce a reference count in struct srpt_device
RDMA/srpt: Fix a use-after-free
android: binder: stop saving a pointer to the VMA
mm/mmap.c: fix missing call to vm_unacct_memory in mmap_region
selftests: kvm: set rax before vmcall
of/fdt: declared return type does not match actual return type
RDMA/mlx5: Add missing check for return value in get namespace flow
RDMA/rxe: Add memory barriers to kernel queues
RDMA/rxe: Remove the is_user members of struct rxe_sq/rxe_rq/rxe_srq
RDMA/rxe: Fix error unwind in rxe_create_qp()
block/rnbd-srv: Set keep_id to true after mutex_trylock
null_blk: fix ida error handling in null_add_dev()
nvme: use command_id instead of req->tag in trace_nvme_complete_rq()
nvme: define compat_ioctl again to unbreak 32-bit userspace.
nvme: disable namespace access for unsupported metadata
nvme: don't return an error from nvme_configure_metadata
nvme: catch -ENODEV from nvme_revalidate_zones again
block/bio: remove duplicate append pages code
block: ensure iov_iter advances for added pages
jbd2: fix outstanding credits assert in jbd2_journal_commit_transaction()
ext4: recover csum seed of tmp_inode after migrating to extents
jbd2: fix assertion 'jh->b_frozen_data == NULL' failure when journal aborted
usb: cdns3: Don't use priv_dev uninitialized in cdns3_gadget_ep_enable()
opp: Fix error check in dev_pm_opp_attach_genpd()
ASoC: cros_ec_codec: Fix refcount leak in cros_ec_codec_platform_probe
ASoC: samsung: Fix error handling in aries_audio_probe
ASoC: imx-audmux: Silence a clang warning
ASoC: mediatek: mt8173: Fix refcount leak in mt8173_rt5650_rt5676_dev_probe
ASoC: mt6797-mt6351: Fix refcount leak in mt6797_mt6351_dev_probe
ASoC: codecs: da7210: add check for i2c_add_driver
ASoC: mediatek: mt8173-rt5650: Fix refcount leak in mt8173_rt5650_dev_probe
serial: 8250: Export ICR access helpers for internal use
serial: 8250: dma: Allow driver operations before starting DMA transfers
serial: 8250_dw: Store LSR into lsr_saved_flags in dw8250_tx_wait_empty()
ASoC: codecs: msm8916-wcd-digital: move gains from SX_TLV to S8_TLV
ASoC: codecs: wcd9335: move gains from SX_TLV to S8_TLV
rpmsg: char: Add mutex protection for rpmsg_eptdev_open()
rpmsg: mtk_rpmsg: Fix circular locking dependency
remoteproc: k3-r5: Fix refcount leak in k3_r5_cluster_of_init
selftests/livepatch: better synchronize test_klp_callbacks_busy
profiling: fix shift too large makes kernel panic
remoteproc: imx_rproc: Fix refcount leak in imx_rproc_addr_init
ASoC: samsung: h1940_uda1380: include proepr GPIO consumer header
powerpc/perf: Optimize clearing the pending PMI and remove WARN_ON for PMI check in power_pmu_disable
ASoC: samsung: change gpiod_speaker_power and rx1950_audio from global to static variables
tty: n_gsm: Delete gsmtty open SABM frame when config requester
tty: n_gsm: fix user open not possible at responder until initiator open
tty: n_gsm: fix tty registration before control channel open
tty: n_gsm: fix wrong queuing behavior in gsm_dlci_data_output()
tty: n_gsm: fix missing timer to handle stalled links
tty: n_gsm: fix non flow control frames during mux flow off
tty: n_gsm: fix packet re-transmission without open control channel
tty: n_gsm: fix race condition in gsmld_write()
tty: n_gsm: fix resource allocation order in gsm_activate_mux()
ASoC: qcom: Fix missing of_node_put() in asoc_qcom_lpass_cpu_platform_probe()
ASoC: imx-card: Fix DSD/PDM mclk frequency
remoteproc: qcom: wcnss: Fix handling of IRQs
vfio/ccw: Do not change FSM state in subchannel event
serial: 8250_fsl: Don't report FE, PE and OE twice
tty: n_gsm: fix wrong T1 retry count handling
tty: n_gsm: fix DM command
tty: n_gsm: fix missing corner cases in gsmld_poll()
MIPS: vdso: Utilize __pa() for gic_pfn
swiotlb: fail map correctly with failed io_tlb_default_mem
ASoC: mt6359: Fix refcount leak bug
serial: 8250_bcm7271: Save/restore RTS in suspend/resume
iommu/exynos: Handle failed IOMMU device registration properly
9p: fix a bunch of checkpatch warnings
9p: Drop kref usage
9p: Add client parameter to p9_req_put()
net: 9p: fix refcount leak in p9_read_work() error handling
MIPS: Fixed __debug_virt_addr_valid()
rpmsg: qcom_smd: Fix refcount leak in qcom_smd_parse_edge
kfifo: fix kfifo_to_user() return type
lib/smp_processor_id: fix imbalanced instrumentation_end() call
proc: fix a dentry lock race between release_task and lookup
remoteproc: qcom: pas: Check if coredump is enabled
remoteproc: sysmon: Wait for SSCTL service to come up
mfd: t7l66xb: Drop platform disable callback
mfd: max77620: Fix refcount leak in max77620_initialise_fps
iommu/arm-smmu: qcom_iommu: Add of_node_put() when breaking out of loop
perf tools: Fix dso_id inode generation comparison
s390/dump: fix old lowcore virtual vs physical address confusion
s390/maccess: fix semantics of memcpy_real() and its callers
s390/crash: fix incorrect number of bytes to copy to user space
s390/zcore: fix race when reading from hardware system area
ASoC: fsl_asrc: force cast the asrc_format type
ASoC: fsl-asoc-card: force cast the asrc_format type
ASoC: fsl_easrc: use snd_pcm_format_t type for sample_format
ASoC: imx-card: use snd_pcm_format_t type for asrc_format
ASoC: qcom: q6dsp: Fix an off-by-one in q6adm_alloc_copp()
fuse: Remove the control interface for virtio-fs
ASoC: audio-graph-card: Add of_node_put() in fail path
watchdog: sp5100_tco: Fix a memory leak of EFCH MMIO resource
watchdog: armada_37xx_wdt: check the return value of devm_ioremap() in armada_37xx_wdt_probe()
video: fbdev: amba-clcd: Fix refcount leak bugs
video: fbdev: sis: fix typos in SiS_GetModeID()
ASoC: mchp-spdifrx: disable end of block interrupt on failures
powerpc/32: Call mmu_mark_initmem_nx() regardless of data block mapping.
powerpc/32: Do not allow selection of e5500 or e6500 CPUs on PPC32
powerpc/iommu: Fix iommu_table_in_use for a small default DMA window case
powerpc/pci: Prefer PCI domain assignment via DT 'linux,pci-domain' and alias
tty: serial: fsl_lpuart: correct the count of break characters
s390/dump: fix os_info virtual vs physical address confusion
s390/smp: cleanup target CPU callback starting
s390/smp: cleanup control register update routines
s390/maccess: rework absolute lowcore accessors
s390/smp: enforce lowcore protection on CPU restart
f2fs: fix to remove F2FS_COMPR_FL and tag F2FS_NOCOMP_FL at the same time
powerpc/spufs: Fix refcount leak in spufs_init_isolated_loader
powerpc/xive: Fix refcount leak in xive_get_max_prio
powerpc/cell/axon_msi: Fix refcount leak in setup_msi_msg_address
perf symbol: Fail to read phdr workaround
kprobes: Forbid probing on trampoline and BPF code areas
x86/bus_lock: Don't assume the init value of DEBUGCTLMSR.BUS_LOCK_DETECT to be zero
powerpc/pci: Fix PHB numbering when using opal-phbid
genelf: Use HAVE_LIBCRYPTO_SUPPORT, not the never defined HAVE_LIBCRYPTO
scripts/faddr2line: Fix vmlinux detection on arm64
sched/deadline: Merge dl_task_can_attach() and dl_cpu_busy()
sched, cpuset: Fix dl_cpu_busy() panic due to empty cs->cpus_allowed
x86/numa: Use cpumask_available instead of hardcoded NULL check
video: fbdev: arkfb: Fix a divide-by-zero bug in ark_set_pixclock()
tools/thermal: Fix possible path truncations
sched: Fix the check of nr_running at queue wakelist
sched: Remove the limitation of WF_ON_CPU on wakelist if wakee cpu is idle
sched/core: Do not requeue task on CPU excluded from cpus_mask
x86/entry: Build thunk_$(BITS) only if CONFIG_PREEMPTION=y
f2fs: allow compression for mmap files in compress_mode=user
f2fs: do not allow to decompress files have FI_COMPRESS_RELEASED
video: fbdev: vt8623fb: Check the size of screen before memset_io()
video: fbdev: arkfb: Check the size of screen before memset_io()
video: fbdev: s3fb: Check the size of screen before memset_io()
scsi: ufs: core: Correct ufshcd_shutdown() flow
scsi: zfcp: Fix missing auto port scan and thus missing target ports
scsi: qla2xxx: Fix imbalance vha->vref_count
scsi: qla2xxx: Fix discovery issues in FC-AL topology
scsi: qla2xxx: Turn off multi-queue for 8G adapters
scsi: qla2xxx: Fix crash due to stale SRB access around I/O timeouts
scsi: qla2xxx: Fix excessive I/O error messages by default
scsi: qla2xxx: Fix erroneous mailbox timeout after PCI error injection
scsi: qla2xxx: Wind down adapter after PCIe error
scsi: qla2xxx: Fix losing FCP-2 targets on long port disable with I/Os
scsi: qla2xxx: Fix losing target when it reappears during delete
scsi: qla2xxx: Fix losing FCP-2 targets during port perturbation tests
x86/bugs: Enable STIBP for IBPB mitigated RETBleed
ftrace/x86: Add back ftrace_expected assignment
x86/kprobes: Update kcb status flag after singlestepping
x86/olpc: fix 'logical not is only applied to the left hand side'
SMB3: fix lease break timeout when multiple deferred close handles for the same file.
posix-cpu-timers: Cleanup CPU timers before freeing them during exec
Input: gscps2 - check return value of ioremap() in gscps2_probe()
__follow_mount_rcu(): verify that mount_lock remains unchanged
spmi: trace: fix stack-out-of-bound access in SPMI tracing functions
drm/mediatek: Allow commands to be sent during video mode
drm/mediatek: Keep dsi as LP00 before dcs cmds transfer
crypto: blake2s - remove shash module
drm/dp/mst: Read the extended DPCD capabilities during system resume
drm/vc4: drv: Adopt the dma configuration from the HVS or V3D component
usbnet: smsc95xx: Don't clear read-only PHY interrupt
usbnet: smsc95xx: Avoid link settings race on interrupt reception
usbnet: smsc95xx: Forward PHY interrupts to PHY driver to avoid polling
usbnet: smsc95xx: Fix deadlock on runtime resume
firmware: arm_scpi: Ensure scpi_info is not assigned if the probe fails
scsi: lpfc: Fix EEH support for NVMe I/O
scsi: lpfc: SLI path split: Refactor lpfc_iocbq
scsi: lpfc: SLI path split: Refactor fast and slow paths to native SLI4
scsi: lpfc: SLI path split: Refactor SCSI paths
scsi: lpfc: Remove extra atomic_inc on cmd_pending in queuecommand after VMID
intel_th: pci: Add Meteor Lake-P support
intel_th: pci: Add Raptor Lake-S PCH support
intel_th: pci: Add Raptor Lake-S CPU support
KVM: set_msr_mce: Permit guests to ignore single-bit ECC errors
KVM: x86: Signal #GP, not -EPERM, on bad WRMSR(MCi_CTL/STATUS)
iommu/vt-d: avoid invalid memory access via node_online(NUMA_NO_NODE)
PCI/AER: Iterate over error counters instead of error strings
PCI: qcom: Power on PHY before IPQ8074 DBI register accesses
serial: 8250_pci: Refactor the loop in pci_ite887x_init()
serial: 8250_pci: Replace dev_*() by pci_*() macros
serial: 8250: Fold EndRun device support into OxSemi Tornado code
serial: 8250: Add proper clock handling for OxSemi PCIe devices
tty: 8250: Add support for Brainboxes PX cards.
dm writecache: set a default MAX_WRITEBACK_JOBS
kexec, KEYS, s390: Make use of built-in and secondary keyring for signature verification
dm thin: fix use-after-free crash in dm_sm_register_threshold_callback
net/9p: Initialize the iounit field during fid creation
ARM: remove some dead code
timekeeping: contribute wall clock to rng on time change
locking/csd_lock: Change csdlock_debug from early_param to __setup
block: remove the struct blk_queue_ctx forward declaration
block: don't allow the same type rq_qos add more than once
btrfs: ensure pages are unlocked on cow_file_range() failure
btrfs: reset block group chunk force if we have to wait
btrfs: properly flag filesystem with BTRFS_FEATURE_INCOMPAT_BIG_METADATA
ACPI: CPPC: Do not prevent CPPC from working in the future
powerpc/powernv/kvm: Use darn for H_RANDOM on Power9
KVM: x86/pmu: Introduce the ctrl_mask value for fixed counter
KVM: VMX: Mark all PERF_GLOBAL_(OVF)_CTRL bits reserved if there's no vPMU
KVM: x86/pmu: Ignore pmu->global_ctrl check if vPMU doesn't support global_ctrl
KVM: VMX: Add helper to check if the guest PMU has PERF_GLOBAL_CTRL
KVM: nVMX: Attempt to load PERF_GLOBAL_CTRL on nVMX xfer iff it exists
dm raid: fix address sanitizer warning in raid_status
dm raid: fix address sanitizer warning in raid_resume
tracing: Add '__rel_loc' using trace event macros
tracing: Avoid -Warray-bounds warning for __rel_loc macro
ext4: update s_overhead_clusters in the superblock during an on-line resize
ext4: fix extent status tree race in writeback error recovery path
ext4: add EXT4_INODE_HAS_XATTR_SPACE macro in xattr.h
ext4: fix use-after-free in ext4_xattr_set_entry
ext4: correct max_inline_xattr_value_size computing
ext4: correct the misjudgment in ext4_iget_extra_inode
ext4: fix warning in ext4_iomap_begin as race between bmap and write
ext4: check if directory block is within i_size
ext4: make sure ext4_append() always allocates new block
ext4: remove EA inode entry from mbcache on inode eviction
ext4: use kmemdup() to replace kmalloc + memcpy
ext4: unindent codeblock in ext4_xattr_block_set()
ext4: fix race when reusing xattr blocks
KEYS: asymmetric: enforce SM2 signature use pkey algo
tpm: eventlog: Fix section mismatch for DEBUG_SECTION_MISMATCH
xen-blkback: fix persistent grants negotiation
xen-blkback: Apply 'feature_persistent' parameter when connect
xen-blkfront: Apply 'feature_persistent' parameter when connect
powerpc: Fix eh field when calling lwarx on PPC32
tracing: Use a struct alignof to determine trace event field alignment
net_sched: cls_route: remove from list when handle is 0
mac80211: fix a memory leak where sta_info is not freed
tcp: fix over estimation in sk_forced_mem_schedule()
crypto: lib/blake2s - reduce stack frame usage in self test
Revert "mwifiex: fix sleep in atomic context bugs caused by dev_coredumpv"
Revert "s390/smp: enforce lowcore protection on CPU restart"
drm/bridge: tc358767: Fix (e)DP bridge endpoint parsing in dedicated function
net: phy: smsc: Disable Energy Detect Power-Down in interrupt mode
drm/vc4: change vc4_dma_range_matches from a global to static
tracing/perf: Avoid -Warray-bounds warning for __rel_loc macro
drm/msm: Fix dirtyfb refcounting
drm/meson: Fix refcount leak in meson_encoder_hdmi_init
io_uring: mem-account pbuf buckets
Revert "net: usb: ax88179_178a needs FLAG_SEND_ZLP"
Bluetooth: L2CAP: Fix l2cap_global_chan_by_psm regression
drm/bridge: Move devm_drm_of_get_bridge to bridge/panel.c
scsi: lpfc: Fix locking for lpfc_sli_iocbq_lookup()
scsi: lpfc: Fix element offset in __lpfc_sli_release_iocbq_s4()
scsi: lpfc: Resolve some cleanup issues following SLI path refactoring
Linux 5.15.61
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I0849e49fb265651bf6277e4ead9c440d50ed7536
2411 lines
65 KiB
C
2411 lines
65 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* fs/eventpoll.c (Efficient event retrieval implementation)
|
|
* Copyright (C) 2001,...,2009 Davide Libenzi
|
|
*
|
|
* Davide Libenzi <davidel@xmailserver.org>
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/sched/signal.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/file.h>
|
|
#include <linux/signal.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/poll.h>
|
|
#include <linux/string.h>
|
|
#include <linux/list.h>
|
|
#include <linux/hash.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/syscalls.h>
|
|
#include <linux/rbtree.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/eventpoll.h>
|
|
#include <linux/mount.h>
|
|
#include <linux/bitops.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/anon_inodes.h>
|
|
#include <linux/device.h>
|
|
#include <linux/freezer.h>
|
|
#include <linux/uaccess.h>
|
|
#include <asm/io.h>
|
|
#include <asm/mman.h>
|
|
#include <linux/atomic.h>
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/seq_file.h>
|
|
#include <linux/compat.h>
|
|
#include <linux/rculist.h>
|
|
#include <net/busy_poll.h>
|
|
|
|
/*
|
|
* LOCKING:
|
|
* There are three level of locking required by epoll :
|
|
*
|
|
* 1) epmutex (mutex)
|
|
* 2) ep->mtx (mutex)
|
|
* 3) ep->lock (rwlock)
|
|
*
|
|
* The acquire order is the one listed above, from 1 to 3.
|
|
* We need a rwlock (ep->lock) because we manipulate objects
|
|
* from inside the poll callback, that might be triggered from
|
|
* a wake_up() that in turn might be called from IRQ context.
|
|
* So we can't sleep inside the poll callback and hence we need
|
|
* a spinlock. During the event transfer loop (from kernel to
|
|
* user space) we could end up sleeping due a copy_to_user(), so
|
|
* we need a lock that will allow us to sleep. This lock is a
|
|
* mutex (ep->mtx). It is acquired during the event transfer loop,
|
|
* during epoll_ctl(EPOLL_CTL_DEL) and during eventpoll_release_file().
|
|
* Then we also need a global mutex to serialize eventpoll_release_file()
|
|
* and ep_free().
|
|
* This mutex is acquired by ep_free() during the epoll file
|
|
* cleanup path and it is also acquired by eventpoll_release_file()
|
|
* if a file has been pushed inside an epoll set and it is then
|
|
* close()d without a previous call to epoll_ctl(EPOLL_CTL_DEL).
|
|
* It is also acquired when inserting an epoll fd onto another epoll
|
|
* fd. We do this so that we walk the epoll tree and ensure that this
|
|
* insertion does not create a cycle of epoll file descriptors, which
|
|
* could lead to deadlock. We need a global mutex to prevent two
|
|
* simultaneous inserts (A into B and B into A) from racing and
|
|
* constructing a cycle without either insert observing that it is
|
|
* going to.
|
|
* It is necessary to acquire multiple "ep->mtx"es at once in the
|
|
* case when one epoll fd is added to another. In this case, we
|
|
* always acquire the locks in the order of nesting (i.e. after
|
|
* epoll_ctl(e1, EPOLL_CTL_ADD, e2), e1->mtx will always be acquired
|
|
* before e2->mtx). Since we disallow cycles of epoll file
|
|
* descriptors, this ensures that the mutexes are well-ordered. In
|
|
* order to communicate this nesting to lockdep, when walking a tree
|
|
* of epoll file descriptors, we use the current recursion depth as
|
|
* the lockdep subkey.
|
|
* It is possible to drop the "ep->mtx" and to use the global
|
|
* mutex "epmutex" (together with "ep->lock") to have it working,
|
|
* but having "ep->mtx" will make the interface more scalable.
|
|
* Events that require holding "epmutex" are very rare, while for
|
|
* normal operations the epoll private "ep->mtx" will guarantee
|
|
* a better scalability.
|
|
*/
|
|
|
|
/* Epoll private bits inside the event mask */
|
|
#define EP_PRIVATE_BITS (EPOLLWAKEUP | EPOLLONESHOT | EPOLLET | EPOLLEXCLUSIVE)
|
|
|
|
#define EPOLLINOUT_BITS (EPOLLIN | EPOLLOUT)
|
|
|
|
#define EPOLLEXCLUSIVE_OK_BITS (EPOLLINOUT_BITS | EPOLLERR | EPOLLHUP | \
|
|
EPOLLWAKEUP | EPOLLET | EPOLLEXCLUSIVE)
|
|
|
|
/* Maximum number of nesting allowed inside epoll sets */
|
|
#define EP_MAX_NESTS 4
|
|
|
|
#define EP_MAX_EVENTS (INT_MAX / sizeof(struct epoll_event))
|
|
|
|
#define EP_UNACTIVE_PTR ((void *) -1L)
|
|
|
|
#define EP_ITEM_COST (sizeof(struct epitem) + sizeof(struct eppoll_entry))
|
|
|
|
struct epoll_filefd {
|
|
struct file *file;
|
|
int fd;
|
|
} __packed;
|
|
|
|
/* Wait structure used by the poll hooks */
|
|
struct eppoll_entry {
|
|
/* List header used to link this structure to the "struct epitem" */
|
|
struct eppoll_entry *next;
|
|
|
|
/* The "base" pointer is set to the container "struct epitem" */
|
|
struct epitem *base;
|
|
|
|
/*
|
|
* Wait queue item that will be linked to the target file wait
|
|
* queue head.
|
|
*/
|
|
wait_queue_entry_t wait;
|
|
|
|
/* The wait queue head that linked the "wait" wait queue item */
|
|
wait_queue_head_t *whead;
|
|
};
|
|
|
|
/*
|
|
* Each file descriptor added to the eventpoll interface will
|
|
* have an entry of this type linked to the "rbr" RB tree.
|
|
* Avoid increasing the size of this struct, there can be many thousands
|
|
* of these on a server and we do not want this to take another cache line.
|
|
*/
|
|
struct epitem {
|
|
union {
|
|
/* RB tree node links this structure to the eventpoll RB tree */
|
|
struct rb_node rbn;
|
|
/* Used to free the struct epitem */
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
/* List header used to link this structure to the eventpoll ready list */
|
|
struct list_head rdllink;
|
|
|
|
/*
|
|
* Works together "struct eventpoll"->ovflist in keeping the
|
|
* single linked chain of items.
|
|
*/
|
|
struct epitem *next;
|
|
|
|
/* The file descriptor information this item refers to */
|
|
struct epoll_filefd ffd;
|
|
|
|
/* List containing poll wait queues */
|
|
struct eppoll_entry *pwqlist;
|
|
|
|
/* The "container" of this item */
|
|
struct eventpoll *ep;
|
|
|
|
/* List header used to link this item to the "struct file" items list */
|
|
struct hlist_node fllink;
|
|
|
|
/* wakeup_source used when EPOLLWAKEUP is set */
|
|
struct wakeup_source __rcu *ws;
|
|
|
|
/* The structure that describe the interested events and the source fd */
|
|
struct epoll_event event;
|
|
};
|
|
|
|
/*
|
|
* This structure is stored inside the "private_data" member of the file
|
|
* structure and represents the main data structure for the eventpoll
|
|
* interface.
|
|
*/
|
|
struct eventpoll {
|
|
/*
|
|
* This mutex is used to ensure that files are not removed
|
|
* while epoll is using them. This is held during the event
|
|
* collection loop, the file cleanup path, the epoll file exit
|
|
* code and the ctl operations.
|
|
*/
|
|
struct mutex mtx;
|
|
|
|
/* Wait queue used by sys_epoll_wait() */
|
|
wait_queue_head_t wq;
|
|
|
|
/* Wait queue used by file->poll() */
|
|
wait_queue_head_t poll_wait;
|
|
|
|
/* List of ready file descriptors */
|
|
struct list_head rdllist;
|
|
|
|
/* Lock which protects rdllist and ovflist */
|
|
rwlock_t lock;
|
|
|
|
/* RB tree root used to store monitored fd structs */
|
|
struct rb_root_cached rbr;
|
|
|
|
/*
|
|
* This is a single linked list that chains all the "struct epitem" that
|
|
* happened while transferring ready events to userspace w/out
|
|
* holding ->lock.
|
|
*/
|
|
struct epitem *ovflist;
|
|
|
|
/* wakeup_source used when ep_scan_ready_list is running */
|
|
struct wakeup_source *ws;
|
|
|
|
/* The user that created the eventpoll descriptor */
|
|
struct user_struct *user;
|
|
|
|
struct file *file;
|
|
|
|
/* used to optimize loop detection check */
|
|
u64 gen;
|
|
struct hlist_head refs;
|
|
|
|
#ifdef CONFIG_NET_RX_BUSY_POLL
|
|
/* used to track busy poll napi_id */
|
|
unsigned int napi_id;
|
|
#endif
|
|
|
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
/* tracks wakeup nests for lockdep validation */
|
|
u8 nests;
|
|
#endif
|
|
};
|
|
|
|
/* Wrapper struct used by poll queueing */
|
|
struct ep_pqueue {
|
|
poll_table pt;
|
|
struct epitem *epi;
|
|
};
|
|
|
|
/*
|
|
* Configuration options available inside /proc/sys/fs/epoll/
|
|
*/
|
|
/* Maximum number of epoll watched descriptors, per user */
|
|
static long max_user_watches __read_mostly;
|
|
|
|
/*
|
|
* This mutex is used to serialize ep_free() and eventpoll_release_file().
|
|
*/
|
|
static DEFINE_MUTEX(epmutex);
|
|
|
|
static u64 loop_check_gen = 0;
|
|
|
|
/* Used to check for epoll file descriptor inclusion loops */
|
|
static struct eventpoll *inserting_into;
|
|
|
|
/* Slab cache used to allocate "struct epitem" */
|
|
static struct kmem_cache *epi_cache __read_mostly;
|
|
|
|
/* Slab cache used to allocate "struct eppoll_entry" */
|
|
static struct kmem_cache *pwq_cache __read_mostly;
|
|
|
|
/*
|
|
* List of files with newly added links, where we may need to limit the number
|
|
* of emanating paths. Protected by the epmutex.
|
|
*/
|
|
struct epitems_head {
|
|
struct hlist_head epitems;
|
|
struct epitems_head *next;
|
|
};
|
|
static struct epitems_head *tfile_check_list = EP_UNACTIVE_PTR;
|
|
|
|
static struct kmem_cache *ephead_cache __read_mostly;
|
|
|
|
static inline void free_ephead(struct epitems_head *head)
|
|
{
|
|
if (head)
|
|
kmem_cache_free(ephead_cache, head);
|
|
}
|
|
|
|
static void list_file(struct file *file)
|
|
{
|
|
struct epitems_head *head;
|
|
|
|
head = container_of(file->f_ep, struct epitems_head, epitems);
|
|
if (!head->next) {
|
|
head->next = tfile_check_list;
|
|
tfile_check_list = head;
|
|
}
|
|
}
|
|
|
|
static void unlist_file(struct epitems_head *head)
|
|
{
|
|
struct epitems_head *to_free = head;
|
|
struct hlist_node *p = rcu_dereference(hlist_first_rcu(&head->epitems));
|
|
if (p) {
|
|
struct epitem *epi= container_of(p, struct epitem, fllink);
|
|
spin_lock(&epi->ffd.file->f_lock);
|
|
if (!hlist_empty(&head->epitems))
|
|
to_free = NULL;
|
|
head->next = NULL;
|
|
spin_unlock(&epi->ffd.file->f_lock);
|
|
}
|
|
free_ephead(to_free);
|
|
}
|
|
|
|
#ifdef CONFIG_SYSCTL
|
|
|
|
#include <linux/sysctl.h>
|
|
|
|
static long long_zero;
|
|
static long long_max = LONG_MAX;
|
|
|
|
struct ctl_table epoll_table[] = {
|
|
{
|
|
.procname = "max_user_watches",
|
|
.data = &max_user_watches,
|
|
.maxlen = sizeof(max_user_watches),
|
|
.mode = 0644,
|
|
.proc_handler = proc_doulongvec_minmax,
|
|
.extra1 = &long_zero,
|
|
.extra2 = &long_max,
|
|
},
|
|
{ }
|
|
};
|
|
#endif /* CONFIG_SYSCTL */
|
|
|
|
static const struct file_operations eventpoll_fops;
|
|
|
|
static inline int is_file_epoll(struct file *f)
|
|
{
|
|
return f->f_op == &eventpoll_fops;
|
|
}
|
|
|
|
/* Setup the structure that is used as key for the RB tree */
|
|
static inline void ep_set_ffd(struct epoll_filefd *ffd,
|
|
struct file *file, int fd)
|
|
{
|
|
ffd->file = file;
|
|
ffd->fd = fd;
|
|
}
|
|
|
|
/* Compare RB tree keys */
|
|
static inline int ep_cmp_ffd(struct epoll_filefd *p1,
|
|
struct epoll_filefd *p2)
|
|
{
|
|
return (p1->file > p2->file ? +1:
|
|
(p1->file < p2->file ? -1 : p1->fd - p2->fd));
|
|
}
|
|
|
|
/* Tells us if the item is currently linked */
|
|
static inline int ep_is_linked(struct epitem *epi)
|
|
{
|
|
return !list_empty(&epi->rdllink);
|
|
}
|
|
|
|
static inline struct eppoll_entry *ep_pwq_from_wait(wait_queue_entry_t *p)
|
|
{
|
|
return container_of(p, struct eppoll_entry, wait);
|
|
}
|
|
|
|
/* Get the "struct epitem" from a wait queue pointer */
|
|
static inline struct epitem *ep_item_from_wait(wait_queue_entry_t *p)
|
|
{
|
|
return container_of(p, struct eppoll_entry, wait)->base;
|
|
}
|
|
|
|
/**
|
|
* ep_events_available - Checks if ready events might be available.
|
|
*
|
|
* @ep: Pointer to the eventpoll context.
|
|
*
|
|
* Return: a value different than %zero if ready events are available,
|
|
* or %zero otherwise.
|
|
*/
|
|
static inline int ep_events_available(struct eventpoll *ep)
|
|
{
|
|
return !list_empty_careful(&ep->rdllist) ||
|
|
READ_ONCE(ep->ovflist) != EP_UNACTIVE_PTR;
|
|
}
|
|
|
|
#ifdef CONFIG_NET_RX_BUSY_POLL
|
|
static bool ep_busy_loop_end(void *p, unsigned long start_time)
|
|
{
|
|
struct eventpoll *ep = p;
|
|
|
|
return ep_events_available(ep) || busy_loop_timeout(start_time);
|
|
}
|
|
|
|
/*
|
|
* Busy poll if globally on and supporting sockets found && no events,
|
|
* busy loop will return if need_resched or ep_events_available.
|
|
*
|
|
* we must do our busy polling with irqs enabled
|
|
*/
|
|
static bool ep_busy_loop(struct eventpoll *ep, int nonblock)
|
|
{
|
|
unsigned int napi_id = READ_ONCE(ep->napi_id);
|
|
|
|
if ((napi_id >= MIN_NAPI_ID) && net_busy_loop_on()) {
|
|
napi_busy_loop(napi_id, nonblock ? NULL : ep_busy_loop_end, ep, false,
|
|
BUSY_POLL_BUDGET);
|
|
if (ep_events_available(ep))
|
|
return true;
|
|
/*
|
|
* Busy poll timed out. Drop NAPI ID for now, we can add
|
|
* it back in when we have moved a socket with a valid NAPI
|
|
* ID onto the ready list.
|
|
*/
|
|
ep->napi_id = 0;
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* Set epoll busy poll NAPI ID from sk.
|
|
*/
|
|
static inline void ep_set_busy_poll_napi_id(struct epitem *epi)
|
|
{
|
|
struct eventpoll *ep;
|
|
unsigned int napi_id;
|
|
struct socket *sock;
|
|
struct sock *sk;
|
|
|
|
if (!net_busy_loop_on())
|
|
return;
|
|
|
|
sock = sock_from_file(epi->ffd.file);
|
|
if (!sock)
|
|
return;
|
|
|
|
sk = sock->sk;
|
|
if (!sk)
|
|
return;
|
|
|
|
napi_id = READ_ONCE(sk->sk_napi_id);
|
|
ep = epi->ep;
|
|
|
|
/* Non-NAPI IDs can be rejected
|
|
* or
|
|
* Nothing to do if we already have this ID
|
|
*/
|
|
if (napi_id < MIN_NAPI_ID || napi_id == ep->napi_id)
|
|
return;
|
|
|
|
/* record NAPI ID for use in next busy poll */
|
|
ep->napi_id = napi_id;
|
|
}
|
|
|
|
#else
|
|
|
|
static inline bool ep_busy_loop(struct eventpoll *ep, int nonblock)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline void ep_set_busy_poll_napi_id(struct epitem *epi)
|
|
{
|
|
}
|
|
|
|
#endif /* CONFIG_NET_RX_BUSY_POLL */
|
|
|
|
/*
|
|
* As described in commit 0ccf831cb lockdep: annotate epoll
|
|
* the use of wait queues used by epoll is done in a very controlled
|
|
* manner. Wake ups can nest inside each other, but are never done
|
|
* with the same locking. For example:
|
|
*
|
|
* dfd = socket(...);
|
|
* efd1 = epoll_create();
|
|
* efd2 = epoll_create();
|
|
* epoll_ctl(efd1, EPOLL_CTL_ADD, dfd, ...);
|
|
* epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
|
|
*
|
|
* When a packet arrives to the device underneath "dfd", the net code will
|
|
* issue a wake_up() on its poll wake list. Epoll (efd1) has installed a
|
|
* callback wakeup entry on that queue, and the wake_up() performed by the
|
|
* "dfd" net code will end up in ep_poll_callback(). At this point epoll
|
|
* (efd1) notices that it may have some event ready, so it needs to wake up
|
|
* the waiters on its poll wait list (efd2). So it calls ep_poll_safewake()
|
|
* that ends up in another wake_up(), after having checked about the
|
|
* recursion constraints. That are, no more than EP_MAX_POLLWAKE_NESTS, to
|
|
* avoid stack blasting.
|
|
*
|
|
* When CONFIG_DEBUG_LOCK_ALLOC is enabled, make sure lockdep can handle
|
|
* this special case of epoll.
|
|
*/
|
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
|
|
static void ep_poll_safewake(struct eventpoll *ep, struct epitem *epi)
|
|
{
|
|
struct eventpoll *ep_src;
|
|
unsigned long flags;
|
|
u8 nests = 0;
|
|
|
|
/*
|
|
* To set the subclass or nesting level for spin_lock_irqsave_nested()
|
|
* it might be natural to create a per-cpu nest count. However, since
|
|
* we can recurse on ep->poll_wait.lock, and a non-raw spinlock can
|
|
* schedule() in the -rt kernel, the per-cpu variable are no longer
|
|
* protected. Thus, we are introducing a per eventpoll nest field.
|
|
* If we are not being call from ep_poll_callback(), epi is NULL and
|
|
* we are at the first level of nesting, 0. Otherwise, we are being
|
|
* called from ep_poll_callback() and if a previous wakeup source is
|
|
* not an epoll file itself, we are at depth 1 since the wakeup source
|
|
* is depth 0. If the wakeup source is a previous epoll file in the
|
|
* wakeup chain then we use its nests value and record ours as
|
|
* nests + 1. The previous epoll file nests value is stable since its
|
|
* already holding its own poll_wait.lock.
|
|
*/
|
|
if (epi) {
|
|
if ((is_file_epoll(epi->ffd.file))) {
|
|
ep_src = epi->ffd.file->private_data;
|
|
nests = ep_src->nests;
|
|
} else {
|
|
nests = 1;
|
|
}
|
|
}
|
|
spin_lock_irqsave_nested(&ep->poll_wait.lock, flags, nests);
|
|
ep->nests = nests + 1;
|
|
wake_up_locked_poll(&ep->poll_wait, EPOLLIN);
|
|
ep->nests = 0;
|
|
spin_unlock_irqrestore(&ep->poll_wait.lock, flags);
|
|
}
|
|
|
|
#else
|
|
|
|
static void ep_poll_safewake(struct eventpoll *ep, struct epitem *epi)
|
|
{
|
|
wake_up_poll(&ep->poll_wait, EPOLLIN);
|
|
}
|
|
|
|
#endif
|
|
|
|
static void ep_remove_wait_queue(struct eppoll_entry *pwq)
|
|
{
|
|
wait_queue_head_t *whead;
|
|
|
|
rcu_read_lock();
|
|
/*
|
|
* If it is cleared by POLLFREE, it should be rcu-safe.
|
|
* If we read NULL we need a barrier paired with
|
|
* smp_store_release() in ep_poll_callback(), otherwise
|
|
* we rely on whead->lock.
|
|
*/
|
|
whead = smp_load_acquire(&pwq->whead);
|
|
if (whead)
|
|
remove_wait_queue(whead, &pwq->wait);
|
|
rcu_read_unlock();
|
|
}
|
|
|
|
/*
|
|
* This function unregisters poll callbacks from the associated file
|
|
* descriptor. Must be called with "mtx" held (or "epmutex" if called from
|
|
* ep_free).
|
|
*/
|
|
static void ep_unregister_pollwait(struct eventpoll *ep, struct epitem *epi)
|
|
{
|
|
struct eppoll_entry **p = &epi->pwqlist;
|
|
struct eppoll_entry *pwq;
|
|
|
|
while ((pwq = *p) != NULL) {
|
|
*p = pwq->next;
|
|
ep_remove_wait_queue(pwq);
|
|
kmem_cache_free(pwq_cache, pwq);
|
|
}
|
|
}
|
|
|
|
/* call only when ep->mtx is held */
|
|
static inline struct wakeup_source *ep_wakeup_source(struct epitem *epi)
|
|
{
|
|
return rcu_dereference_check(epi->ws, lockdep_is_held(&epi->ep->mtx));
|
|
}
|
|
|
|
/* call only when ep->mtx is held */
|
|
static inline void ep_pm_stay_awake(struct epitem *epi)
|
|
{
|
|
struct wakeup_source *ws = ep_wakeup_source(epi);
|
|
|
|
if (ws)
|
|
__pm_stay_awake(ws);
|
|
}
|
|
|
|
static inline bool ep_has_wakeup_source(struct epitem *epi)
|
|
{
|
|
return rcu_access_pointer(epi->ws) ? true : false;
|
|
}
|
|
|
|
/* call when ep->mtx cannot be held (ep_poll_callback) */
|
|
static inline void ep_pm_stay_awake_rcu(struct epitem *epi)
|
|
{
|
|
struct wakeup_source *ws;
|
|
|
|
rcu_read_lock();
|
|
ws = rcu_dereference(epi->ws);
|
|
if (ws)
|
|
__pm_stay_awake(ws);
|
|
rcu_read_unlock();
|
|
}
|
|
|
|
|
|
/*
|
|
* ep->mutex needs to be held because we could be hit by
|
|
* eventpoll_release_file() and epoll_ctl().
|
|
*/
|
|
static void ep_start_scan(struct eventpoll *ep, struct list_head *txlist)
|
|
{
|
|
/*
|
|
* Steal the ready list, and re-init the original one to the
|
|
* empty list. Also, set ep->ovflist to NULL so that events
|
|
* happening while looping w/out locks, are not lost. We cannot
|
|
* have the poll callback to queue directly on ep->rdllist,
|
|
* because we want the "sproc" callback to be able to do it
|
|
* in a lockless way.
|
|
*/
|
|
lockdep_assert_irqs_enabled();
|
|
write_lock_irq(&ep->lock);
|
|
list_splice_init(&ep->rdllist, txlist);
|
|
WRITE_ONCE(ep->ovflist, NULL);
|
|
write_unlock_irq(&ep->lock);
|
|
}
|
|
|
|
static void ep_done_scan(struct eventpoll *ep,
|
|
struct list_head *txlist)
|
|
{
|
|
struct epitem *epi, *nepi;
|
|
|
|
write_lock_irq(&ep->lock);
|
|
/*
|
|
* During the time we spent inside the "sproc" callback, some
|
|
* other events might have been queued by the poll callback.
|
|
* We re-insert them inside the main ready-list here.
|
|
*/
|
|
for (nepi = READ_ONCE(ep->ovflist); (epi = nepi) != NULL;
|
|
nepi = epi->next, epi->next = EP_UNACTIVE_PTR) {
|
|
/*
|
|
* We need to check if the item is already in the list.
|
|
* During the "sproc" callback execution time, items are
|
|
* queued into ->ovflist but the "txlist" might already
|
|
* contain them, and the list_splice() below takes care of them.
|
|
*/
|
|
if (!ep_is_linked(epi)) {
|
|
/*
|
|
* ->ovflist is LIFO, so we have to reverse it in order
|
|
* to keep in FIFO.
|
|
*/
|
|
list_add(&epi->rdllink, &ep->rdllist);
|
|
ep_pm_stay_awake(epi);
|
|
}
|
|
}
|
|
/*
|
|
* We need to set back ep->ovflist to EP_UNACTIVE_PTR, so that after
|
|
* releasing the lock, events will be queued in the normal way inside
|
|
* ep->rdllist.
|
|
*/
|
|
WRITE_ONCE(ep->ovflist, EP_UNACTIVE_PTR);
|
|
|
|
/*
|
|
* Quickly re-inject items left on "txlist".
|
|
*/
|
|
list_splice(txlist, &ep->rdllist);
|
|
__pm_relax(ep->ws);
|
|
|
|
if (!list_empty(&ep->rdllist)) {
|
|
if (waitqueue_active(&ep->wq))
|
|
wake_up(&ep->wq);
|
|
}
|
|
|
|
write_unlock_irq(&ep->lock);
|
|
}
|
|
|
|
static void epi_rcu_free(struct rcu_head *head)
|
|
{
|
|
struct epitem *epi = container_of(head, struct epitem, rcu);
|
|
kmem_cache_free(epi_cache, epi);
|
|
}
|
|
|
|
/*
|
|
* Removes a "struct epitem" from the eventpoll RB tree and deallocates
|
|
* all the associated resources. Must be called with "mtx" held.
|
|
*/
|
|
static int ep_remove(struct eventpoll *ep, struct epitem *epi)
|
|
{
|
|
struct file *file = epi->ffd.file;
|
|
struct epitems_head *to_free;
|
|
struct hlist_head *head;
|
|
|
|
lockdep_assert_irqs_enabled();
|
|
|
|
/*
|
|
* Removes poll wait queue hooks.
|
|
*/
|
|
ep_unregister_pollwait(ep, epi);
|
|
|
|
/* Remove the current item from the list of epoll hooks */
|
|
spin_lock(&file->f_lock);
|
|
to_free = NULL;
|
|
head = file->f_ep;
|
|
if (head->first == &epi->fllink && !epi->fllink.next) {
|
|
file->f_ep = NULL;
|
|
if (!is_file_epoll(file)) {
|
|
struct epitems_head *v;
|
|
v = container_of(head, struct epitems_head, epitems);
|
|
if (!smp_load_acquire(&v->next))
|
|
to_free = v;
|
|
}
|
|
}
|
|
hlist_del_rcu(&epi->fllink);
|
|
spin_unlock(&file->f_lock);
|
|
free_ephead(to_free);
|
|
|
|
rb_erase_cached(&epi->rbn, &ep->rbr);
|
|
|
|
write_lock_irq(&ep->lock);
|
|
if (ep_is_linked(epi))
|
|
list_del_init(&epi->rdllink);
|
|
write_unlock_irq(&ep->lock);
|
|
|
|
wakeup_source_unregister(ep_wakeup_source(epi));
|
|
/*
|
|
* At this point it is safe to free the eventpoll item. Use the union
|
|
* field epi->rcu, since we are trying to minimize the size of
|
|
* 'struct epitem'. The 'rbn' field is no longer in use. Protected by
|
|
* ep->mtx. The rcu read side, reverse_path_check_proc(), does not make
|
|
* use of the rbn field.
|
|
*/
|
|
call_rcu(&epi->rcu, epi_rcu_free);
|
|
|
|
percpu_counter_dec(&ep->user->epoll_watches);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void ep_free(struct eventpoll *ep)
|
|
{
|
|
struct rb_node *rbp;
|
|
struct epitem *epi;
|
|
|
|
/* We need to release all tasks waiting for these file */
|
|
if (waitqueue_active(&ep->poll_wait))
|
|
ep_poll_safewake(ep, NULL);
|
|
|
|
/*
|
|
* We need to lock this because we could be hit by
|
|
* eventpoll_release_file() while we're freeing the "struct eventpoll".
|
|
* We do not need to hold "ep->mtx" here because the epoll file
|
|
* is on the way to be removed and no one has references to it
|
|
* anymore. The only hit might come from eventpoll_release_file() but
|
|
* holding "epmutex" is sufficient here.
|
|
*/
|
|
mutex_lock(&epmutex);
|
|
|
|
/*
|
|
* Walks through the whole tree by unregistering poll callbacks.
|
|
*/
|
|
for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
|
|
epi = rb_entry(rbp, struct epitem, rbn);
|
|
|
|
ep_unregister_pollwait(ep, epi);
|
|
cond_resched();
|
|
}
|
|
|
|
/*
|
|
* Walks through the whole tree by freeing each "struct epitem". At this
|
|
* point we are sure no poll callbacks will be lingering around, and also by
|
|
* holding "epmutex" we can be sure that no file cleanup code will hit
|
|
* us during this operation. So we can avoid the lock on "ep->lock".
|
|
* We do not need to lock ep->mtx, either, we only do it to prevent
|
|
* a lockdep warning.
|
|
*/
|
|
mutex_lock(&ep->mtx);
|
|
while ((rbp = rb_first_cached(&ep->rbr)) != NULL) {
|
|
epi = rb_entry(rbp, struct epitem, rbn);
|
|
ep_remove(ep, epi);
|
|
cond_resched();
|
|
}
|
|
mutex_unlock(&ep->mtx);
|
|
|
|
mutex_unlock(&epmutex);
|
|
mutex_destroy(&ep->mtx);
|
|
free_uid(ep->user);
|
|
wakeup_source_unregister(ep->ws);
|
|
kfree(ep);
|
|
}
|
|
|
|
static int ep_eventpoll_release(struct inode *inode, struct file *file)
|
|
{
|
|
struct eventpoll *ep = file->private_data;
|
|
|
|
if (ep)
|
|
ep_free(ep);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt, int depth);
|
|
|
|
static __poll_t __ep_eventpoll_poll(struct file *file, poll_table *wait, int depth)
|
|
{
|
|
struct eventpoll *ep = file->private_data;
|
|
LIST_HEAD(txlist);
|
|
struct epitem *epi, *tmp;
|
|
poll_table pt;
|
|
__poll_t res = 0;
|
|
|
|
init_poll_funcptr(&pt, NULL);
|
|
|
|
/* Insert inside our poll wait queue */
|
|
poll_wait(file, &ep->poll_wait, wait);
|
|
|
|
/*
|
|
* Proceed to find out if wanted events are really available inside
|
|
* the ready list.
|
|
*/
|
|
mutex_lock_nested(&ep->mtx, depth);
|
|
ep_start_scan(ep, &txlist);
|
|
list_for_each_entry_safe(epi, tmp, &txlist, rdllink) {
|
|
if (ep_item_poll(epi, &pt, depth + 1)) {
|
|
res = EPOLLIN | EPOLLRDNORM;
|
|
break;
|
|
} else {
|
|
/*
|
|
* Item has been dropped into the ready list by the poll
|
|
* callback, but it's not actually ready, as far as
|
|
* caller requested events goes. We can remove it here.
|
|
*/
|
|
__pm_relax(ep_wakeup_source(epi));
|
|
list_del_init(&epi->rdllink);
|
|
}
|
|
}
|
|
ep_done_scan(ep, &txlist);
|
|
mutex_unlock(&ep->mtx);
|
|
return res;
|
|
}
|
|
|
|
/*
|
|
* Differs from ep_eventpoll_poll() in that internal callers already have
|
|
* the ep->mtx so we need to start from depth=1, such that mutex_lock_nested()
|
|
* is correctly annotated.
|
|
*/
|
|
static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt,
|
|
int depth)
|
|
{
|
|
struct file *file = epi->ffd.file;
|
|
__poll_t res;
|
|
|
|
pt->_key = epi->event.events;
|
|
if (!is_file_epoll(file))
|
|
res = vfs_poll(file, pt);
|
|
else
|
|
res = __ep_eventpoll_poll(file, pt, depth);
|
|
return res & epi->event.events;
|
|
}
|
|
|
|
static __poll_t ep_eventpoll_poll(struct file *file, poll_table *wait)
|
|
{
|
|
return __ep_eventpoll_poll(file, wait, 0);
|
|
}
|
|
|
|
#ifdef CONFIG_PROC_FS
|
|
static void ep_show_fdinfo(struct seq_file *m, struct file *f)
|
|
{
|
|
struct eventpoll *ep = f->private_data;
|
|
struct rb_node *rbp;
|
|
|
|
mutex_lock(&ep->mtx);
|
|
for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
|
|
struct epitem *epi = rb_entry(rbp, struct epitem, rbn);
|
|
struct inode *inode = file_inode(epi->ffd.file);
|
|
|
|
seq_printf(m, "tfd: %8d events: %8x data: %16llx "
|
|
" pos:%lli ino:%lx sdev:%x\n",
|
|
epi->ffd.fd, epi->event.events,
|
|
(long long)epi->event.data,
|
|
(long long)epi->ffd.file->f_pos,
|
|
inode->i_ino, inode->i_sb->s_dev);
|
|
if (seq_has_overflowed(m))
|
|
break;
|
|
}
|
|
mutex_unlock(&ep->mtx);
|
|
}
|
|
#endif
|
|
|
|
/* File callbacks that implement the eventpoll file behaviour */
|
|
static const struct file_operations eventpoll_fops = {
|
|
#ifdef CONFIG_PROC_FS
|
|
.show_fdinfo = ep_show_fdinfo,
|
|
#endif
|
|
.release = ep_eventpoll_release,
|
|
.poll = ep_eventpoll_poll,
|
|
.llseek = noop_llseek,
|
|
};
|
|
|
|
/*
|
|
* This is called from eventpoll_release() to unlink files from the eventpoll
|
|
* interface. We need to have this facility to cleanup correctly files that are
|
|
* closed without being removed from the eventpoll interface.
|
|
*/
|
|
void eventpoll_release_file(struct file *file)
|
|
{
|
|
struct eventpoll *ep;
|
|
struct epitem *epi;
|
|
struct hlist_node *next;
|
|
|
|
/*
|
|
* We don't want to get "file->f_lock" because it is not
|
|
* necessary. It is not necessary because we're in the "struct file"
|
|
* cleanup path, and this means that no one is using this file anymore.
|
|
* So, for example, epoll_ctl() cannot hit here since if we reach this
|
|
* point, the file counter already went to zero and fget() would fail.
|
|
* The only hit might come from ep_free() but by holding the mutex
|
|
* will correctly serialize the operation. We do need to acquire
|
|
* "ep->mtx" after "epmutex" because ep_remove() requires it when called
|
|
* from anywhere but ep_free().
|
|
*
|
|
* Besides, ep_remove() acquires the lock, so we can't hold it here.
|
|
*/
|
|
mutex_lock(&epmutex);
|
|
if (unlikely(!file->f_ep)) {
|
|
mutex_unlock(&epmutex);
|
|
return;
|
|
}
|
|
hlist_for_each_entry_safe(epi, next, file->f_ep, fllink) {
|
|
ep = epi->ep;
|
|
mutex_lock_nested(&ep->mtx, 0);
|
|
ep_remove(ep, epi);
|
|
mutex_unlock(&ep->mtx);
|
|
}
|
|
mutex_unlock(&epmutex);
|
|
}
|
|
|
|
static int ep_alloc(struct eventpoll **pep)
|
|
{
|
|
int error;
|
|
struct user_struct *user;
|
|
struct eventpoll *ep;
|
|
|
|
user = get_current_user();
|
|
error = -ENOMEM;
|
|
ep = kzalloc(sizeof(*ep), GFP_KERNEL);
|
|
if (unlikely(!ep))
|
|
goto free_uid;
|
|
|
|
mutex_init(&ep->mtx);
|
|
rwlock_init(&ep->lock);
|
|
init_waitqueue_head(&ep->wq);
|
|
init_waitqueue_head(&ep->poll_wait);
|
|
INIT_LIST_HEAD(&ep->rdllist);
|
|
ep->rbr = RB_ROOT_CACHED;
|
|
ep->ovflist = EP_UNACTIVE_PTR;
|
|
ep->user = user;
|
|
|
|
*pep = ep;
|
|
|
|
return 0;
|
|
|
|
free_uid:
|
|
free_uid(user);
|
|
return error;
|
|
}
|
|
|
|
/*
|
|
* Search the file inside the eventpoll tree. The RB tree operations
|
|
* are protected by the "mtx" mutex, and ep_find() must be called with
|
|
* "mtx" held.
|
|
*/
|
|
static struct epitem *ep_find(struct eventpoll *ep, struct file *file, int fd)
|
|
{
|
|
int kcmp;
|
|
struct rb_node *rbp;
|
|
struct epitem *epi, *epir = NULL;
|
|
struct epoll_filefd ffd;
|
|
|
|
ep_set_ffd(&ffd, file, fd);
|
|
for (rbp = ep->rbr.rb_root.rb_node; rbp; ) {
|
|
epi = rb_entry(rbp, struct epitem, rbn);
|
|
kcmp = ep_cmp_ffd(&ffd, &epi->ffd);
|
|
if (kcmp > 0)
|
|
rbp = rbp->rb_right;
|
|
else if (kcmp < 0)
|
|
rbp = rbp->rb_left;
|
|
else {
|
|
epir = epi;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return epir;
|
|
}
|
|
|
|
#ifdef CONFIG_KCMP
|
|
static struct epitem *ep_find_tfd(struct eventpoll *ep, int tfd, unsigned long toff)
|
|
{
|
|
struct rb_node *rbp;
|
|
struct epitem *epi;
|
|
|
|
for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
|
|
epi = rb_entry(rbp, struct epitem, rbn);
|
|
if (epi->ffd.fd == tfd) {
|
|
if (toff == 0)
|
|
return epi;
|
|
else
|
|
toff--;
|
|
}
|
|
cond_resched();
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
struct file *get_epoll_tfile_raw_ptr(struct file *file, int tfd,
|
|
unsigned long toff)
|
|
{
|
|
struct file *file_raw;
|
|
struct eventpoll *ep;
|
|
struct epitem *epi;
|
|
|
|
if (!is_file_epoll(file))
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
ep = file->private_data;
|
|
|
|
mutex_lock(&ep->mtx);
|
|
epi = ep_find_tfd(ep, tfd, toff);
|
|
if (epi)
|
|
file_raw = epi->ffd.file;
|
|
else
|
|
file_raw = ERR_PTR(-ENOENT);
|
|
mutex_unlock(&ep->mtx);
|
|
|
|
return file_raw;
|
|
}
|
|
#endif /* CONFIG_KCMP */
|
|
|
|
/*
|
|
* Adds a new entry to the tail of the list in a lockless way, i.e.
|
|
* multiple CPUs are allowed to call this function concurrently.
|
|
*
|
|
* Beware: it is necessary to prevent any other modifications of the
|
|
* existing list until all changes are completed, in other words
|
|
* concurrent list_add_tail_lockless() calls should be protected
|
|
* with a read lock, where write lock acts as a barrier which
|
|
* makes sure all list_add_tail_lockless() calls are fully
|
|
* completed.
|
|
*
|
|
* Also an element can be locklessly added to the list only in one
|
|
* direction i.e. either to the tail or to the head, otherwise
|
|
* concurrent access will corrupt the list.
|
|
*
|
|
* Return: %false if element has been already added to the list, %true
|
|
* otherwise.
|
|
*/
|
|
static inline bool list_add_tail_lockless(struct list_head *new,
|
|
struct list_head *head)
|
|
{
|
|
struct list_head *prev;
|
|
|
|
/*
|
|
* This is simple 'new->next = head' operation, but cmpxchg()
|
|
* is used in order to detect that same element has been just
|
|
* added to the list from another CPU: the winner observes
|
|
* new->next == new.
|
|
*/
|
|
if (cmpxchg(&new->next, new, head) != new)
|
|
return false;
|
|
|
|
/*
|
|
* Initially ->next of a new element must be updated with the head
|
|
* (we are inserting to the tail) and only then pointers are atomically
|
|
* exchanged. XCHG guarantees memory ordering, thus ->next should be
|
|
* updated before pointers are actually swapped and pointers are
|
|
* swapped before prev->next is updated.
|
|
*/
|
|
|
|
prev = xchg(&head->prev, new);
|
|
|
|
/*
|
|
* It is safe to modify prev->next and new->prev, because a new element
|
|
* is added only to the tail and new->next is updated before XCHG.
|
|
*/
|
|
|
|
prev->next = new;
|
|
new->prev = prev;
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Chains a new epi entry to the tail of the ep->ovflist in a lockless way,
|
|
* i.e. multiple CPUs are allowed to call this function concurrently.
|
|
*
|
|
* Return: %false if epi element has been already chained, %true otherwise.
|
|
*/
|
|
static inline bool chain_epi_lockless(struct epitem *epi)
|
|
{
|
|
struct eventpoll *ep = epi->ep;
|
|
|
|
/* Fast preliminary check */
|
|
if (epi->next != EP_UNACTIVE_PTR)
|
|
return false;
|
|
|
|
/* Check that the same epi has not been just chained from another CPU */
|
|
if (cmpxchg(&epi->next, EP_UNACTIVE_PTR, NULL) != EP_UNACTIVE_PTR)
|
|
return false;
|
|
|
|
/* Atomically exchange tail */
|
|
epi->next = xchg(&ep->ovflist, epi);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* This is the callback that is passed to the wait queue wakeup
|
|
* mechanism. It is called by the stored file descriptors when they
|
|
* have events to report.
|
|
*
|
|
* This callback takes a read lock in order not to contend with concurrent
|
|
* events from another file descriptor, thus all modifications to ->rdllist
|
|
* or ->ovflist are lockless. Read lock is paired with the write lock from
|
|
* ep_scan_ready_list(), which stops all list modifications and guarantees
|
|
* that lists state is seen correctly.
|
|
*
|
|
* Another thing worth to mention is that ep_poll_callback() can be called
|
|
* concurrently for the same @epi from different CPUs if poll table was inited
|
|
* with several wait queues entries. Plural wakeup from different CPUs of a
|
|
* single wait queue is serialized by wq.lock, but the case when multiple wait
|
|
* queues are used should be detected accordingly. This is detected using
|
|
* cmpxchg() operation.
|
|
*/
|
|
static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, void *key)
|
|
{
|
|
int pwake = 0;
|
|
struct epitem *epi = ep_item_from_wait(wait);
|
|
struct eventpoll *ep = epi->ep;
|
|
__poll_t pollflags = key_to_poll(key);
|
|
unsigned long flags;
|
|
int ewake = 0;
|
|
|
|
read_lock_irqsave(&ep->lock, flags);
|
|
|
|
ep_set_busy_poll_napi_id(epi);
|
|
|
|
/*
|
|
* If the event mask does not contain any poll(2) event, we consider the
|
|
* descriptor to be disabled. This condition is likely the effect of the
|
|
* EPOLLONESHOT bit that disables the descriptor when an event is received,
|
|
* until the next EPOLL_CTL_MOD will be issued.
|
|
*/
|
|
if (!(epi->event.events & ~EP_PRIVATE_BITS))
|
|
goto out_unlock;
|
|
|
|
/*
|
|
* Check the events coming with the callback. At this stage, not
|
|
* every device reports the events in the "key" parameter of the
|
|
* callback. We need to be able to handle both cases here, hence the
|
|
* test for "key" != NULL before the event match test.
|
|
*/
|
|
if (pollflags && !(pollflags & epi->event.events))
|
|
goto out_unlock;
|
|
|
|
/*
|
|
* If we are transferring events to userspace, we can hold no locks
|
|
* (because we're accessing user memory, and because of linux f_op->poll()
|
|
* semantics). All the events that happen during that period of time are
|
|
* chained in ep->ovflist and requeued later on.
|
|
*/
|
|
if (READ_ONCE(ep->ovflist) != EP_UNACTIVE_PTR) {
|
|
if (chain_epi_lockless(epi))
|
|
ep_pm_stay_awake_rcu(epi);
|
|
} else if (!ep_is_linked(epi)) {
|
|
/* In the usual case, add event to ready list. */
|
|
if (list_add_tail_lockless(&epi->rdllink, &ep->rdllist))
|
|
ep_pm_stay_awake_rcu(epi);
|
|
}
|
|
|
|
/*
|
|
* Wake up ( if active ) both the eventpoll wait list and the ->poll()
|
|
* wait list.
|
|
*/
|
|
if (waitqueue_active(&ep->wq)) {
|
|
if ((epi->event.events & EPOLLEXCLUSIVE) &&
|
|
!(pollflags & POLLFREE)) {
|
|
switch (pollflags & EPOLLINOUT_BITS) {
|
|
case EPOLLIN:
|
|
if (epi->event.events & EPOLLIN)
|
|
ewake = 1;
|
|
break;
|
|
case EPOLLOUT:
|
|
if (epi->event.events & EPOLLOUT)
|
|
ewake = 1;
|
|
break;
|
|
case 0:
|
|
ewake = 1;
|
|
break;
|
|
}
|
|
}
|
|
wake_up(&ep->wq);
|
|
}
|
|
if (waitqueue_active(&ep->poll_wait))
|
|
pwake++;
|
|
|
|
out_unlock:
|
|
read_unlock_irqrestore(&ep->lock, flags);
|
|
|
|
/* We have to call this outside the lock */
|
|
if (pwake)
|
|
ep_poll_safewake(ep, epi);
|
|
|
|
if (!(epi->event.events & EPOLLEXCLUSIVE))
|
|
ewake = 1;
|
|
|
|
if (pollflags & POLLFREE) {
|
|
/*
|
|
* If we race with ep_remove_wait_queue() it can miss
|
|
* ->whead = NULL and do another remove_wait_queue() after
|
|
* us, so we can't use __remove_wait_queue().
|
|
*/
|
|
list_del_init(&wait->entry);
|
|
/*
|
|
* ->whead != NULL protects us from the race with ep_free()
|
|
* or ep_remove(), ep_remove_wait_queue() takes whead->lock
|
|
* held by the caller. Once we nullify it, nothing protects
|
|
* ep/epi or even wait.
|
|
*/
|
|
smp_store_release(&ep_pwq_from_wait(wait)->whead, NULL);
|
|
}
|
|
|
|
return ewake;
|
|
}
|
|
|
|
/*
|
|
* This is the callback that is used to add our wait queue to the
|
|
* target file wakeup lists.
|
|
*/
|
|
static void ep_ptable_queue_proc(struct file *file, wait_queue_head_t *whead,
|
|
poll_table *pt)
|
|
{
|
|
struct ep_pqueue *epq = container_of(pt, struct ep_pqueue, pt);
|
|
struct epitem *epi = epq->epi;
|
|
struct eppoll_entry *pwq;
|
|
|
|
if (unlikely(!epi)) // an earlier allocation has failed
|
|
return;
|
|
|
|
pwq = kmem_cache_alloc(pwq_cache, GFP_KERNEL);
|
|
if (unlikely(!pwq)) {
|
|
epq->epi = NULL;
|
|
return;
|
|
}
|
|
|
|
init_waitqueue_func_entry(&pwq->wait, ep_poll_callback);
|
|
pwq->whead = whead;
|
|
pwq->base = epi;
|
|
if (epi->event.events & EPOLLEXCLUSIVE)
|
|
add_wait_queue_exclusive(whead, &pwq->wait);
|
|
else
|
|
add_wait_queue(whead, &pwq->wait);
|
|
pwq->next = epi->pwqlist;
|
|
epi->pwqlist = pwq;
|
|
}
|
|
|
|
static void ep_rbtree_insert(struct eventpoll *ep, struct epitem *epi)
|
|
{
|
|
int kcmp;
|
|
struct rb_node **p = &ep->rbr.rb_root.rb_node, *parent = NULL;
|
|
struct epitem *epic;
|
|
bool leftmost = true;
|
|
|
|
while (*p) {
|
|
parent = *p;
|
|
epic = rb_entry(parent, struct epitem, rbn);
|
|
kcmp = ep_cmp_ffd(&epi->ffd, &epic->ffd);
|
|
if (kcmp > 0) {
|
|
p = &parent->rb_right;
|
|
leftmost = false;
|
|
} else
|
|
p = &parent->rb_left;
|
|
}
|
|
rb_link_node(&epi->rbn, parent, p);
|
|
rb_insert_color_cached(&epi->rbn, &ep->rbr, leftmost);
|
|
}
|
|
|
|
|
|
|
|
#define PATH_ARR_SIZE 5
|
|
/*
|
|
* These are the number paths of length 1 to 5, that we are allowing to emanate
|
|
* from a single file of interest. For example, we allow 1000 paths of length
|
|
* 1, to emanate from each file of interest. This essentially represents the
|
|
* potential wakeup paths, which need to be limited in order to avoid massive
|
|
* uncontrolled wakeup storms. The common use case should be a single ep which
|
|
* is connected to n file sources. In this case each file source has 1 path
|
|
* of length 1. Thus, the numbers below should be more than sufficient. These
|
|
* path limits are enforced during an EPOLL_CTL_ADD operation, since a modify
|
|
* and delete can't add additional paths. Protected by the epmutex.
|
|
*/
|
|
static const int path_limits[PATH_ARR_SIZE] = { 1000, 500, 100, 50, 10 };
|
|
static int path_count[PATH_ARR_SIZE];
|
|
|
|
static int path_count_inc(int nests)
|
|
{
|
|
/* Allow an arbitrary number of depth 1 paths */
|
|
if (nests == 0)
|
|
return 0;
|
|
|
|
if (++path_count[nests] > path_limits[nests])
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
static void path_count_init(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < PATH_ARR_SIZE; i++)
|
|
path_count[i] = 0;
|
|
}
|
|
|
|
static int reverse_path_check_proc(struct hlist_head *refs, int depth)
|
|
{
|
|
int error = 0;
|
|
struct epitem *epi;
|
|
|
|
if (depth > EP_MAX_NESTS) /* too deep nesting */
|
|
return -1;
|
|
|
|
/* CTL_DEL can remove links here, but that can't increase our count */
|
|
hlist_for_each_entry_rcu(epi, refs, fllink) {
|
|
struct hlist_head *refs = &epi->ep->refs;
|
|
if (hlist_empty(refs))
|
|
error = path_count_inc(depth);
|
|
else
|
|
error = reverse_path_check_proc(refs, depth + 1);
|
|
if (error != 0)
|
|
break;
|
|
}
|
|
return error;
|
|
}
|
|
|
|
/**
|
|
* reverse_path_check - The tfile_check_list is list of epitem_head, which have
|
|
* links that are proposed to be newly added. We need to
|
|
* make sure that those added links don't add too many
|
|
* paths such that we will spend all our time waking up
|
|
* eventpoll objects.
|
|
*
|
|
* Return: %zero if the proposed links don't create too many paths,
|
|
* %-1 otherwise.
|
|
*/
|
|
static int reverse_path_check(void)
|
|
{
|
|
struct epitems_head *p;
|
|
|
|
for (p = tfile_check_list; p != EP_UNACTIVE_PTR; p = p->next) {
|
|
int error;
|
|
path_count_init();
|
|
rcu_read_lock();
|
|
error = reverse_path_check_proc(&p->epitems, 0);
|
|
rcu_read_unlock();
|
|
if (error)
|
|
return error;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int ep_create_wakeup_source(struct epitem *epi)
|
|
{
|
|
struct name_snapshot n;
|
|
struct wakeup_source *ws;
|
|
|
|
if (!epi->ep->ws) {
|
|
epi->ep->ws = wakeup_source_register(NULL, "eventpoll");
|
|
if (!epi->ep->ws)
|
|
return -ENOMEM;
|
|
}
|
|
|
|
take_dentry_name_snapshot(&n, epi->ffd.file->f_path.dentry);
|
|
ws = wakeup_source_register(NULL, n.name.name);
|
|
release_dentry_name_snapshot(&n);
|
|
|
|
if (!ws)
|
|
return -ENOMEM;
|
|
rcu_assign_pointer(epi->ws, ws);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* rare code path, only used when EPOLL_CTL_MOD removes a wakeup source */
|
|
static noinline void ep_destroy_wakeup_source(struct epitem *epi)
|
|
{
|
|
struct wakeup_source *ws = ep_wakeup_source(epi);
|
|
|
|
RCU_INIT_POINTER(epi->ws, NULL);
|
|
|
|
/*
|
|
* wait for ep_pm_stay_awake_rcu to finish, synchronize_rcu is
|
|
* used internally by wakeup_source_remove, too (called by
|
|
* wakeup_source_unregister), so we cannot use call_rcu
|
|
*/
|
|
synchronize_rcu();
|
|
wakeup_source_unregister(ws);
|
|
}
|
|
|
|
static int attach_epitem(struct file *file, struct epitem *epi)
|
|
{
|
|
struct epitems_head *to_free = NULL;
|
|
struct hlist_head *head = NULL;
|
|
struct eventpoll *ep = NULL;
|
|
|
|
if (is_file_epoll(file))
|
|
ep = file->private_data;
|
|
|
|
if (ep) {
|
|
head = &ep->refs;
|
|
} else if (!READ_ONCE(file->f_ep)) {
|
|
allocate:
|
|
to_free = kmem_cache_zalloc(ephead_cache, GFP_KERNEL);
|
|
if (!to_free)
|
|
return -ENOMEM;
|
|
head = &to_free->epitems;
|
|
}
|
|
spin_lock(&file->f_lock);
|
|
if (!file->f_ep) {
|
|
if (unlikely(!head)) {
|
|
spin_unlock(&file->f_lock);
|
|
goto allocate;
|
|
}
|
|
file->f_ep = head;
|
|
to_free = NULL;
|
|
}
|
|
hlist_add_head_rcu(&epi->fllink, file->f_ep);
|
|
spin_unlock(&file->f_lock);
|
|
free_ephead(to_free);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Must be called with "mtx" held.
|
|
*/
|
|
static int ep_insert(struct eventpoll *ep, const struct epoll_event *event,
|
|
struct file *tfile, int fd, int full_check)
|
|
{
|
|
int error, pwake = 0;
|
|
__poll_t revents;
|
|
struct epitem *epi;
|
|
struct ep_pqueue epq;
|
|
struct eventpoll *tep = NULL;
|
|
|
|
if (is_file_epoll(tfile))
|
|
tep = tfile->private_data;
|
|
|
|
lockdep_assert_irqs_enabled();
|
|
|
|
if (unlikely(percpu_counter_compare(&ep->user->epoll_watches,
|
|
max_user_watches) >= 0))
|
|
return -ENOSPC;
|
|
percpu_counter_inc(&ep->user->epoll_watches);
|
|
|
|
if (!(epi = kmem_cache_zalloc(epi_cache, GFP_KERNEL))) {
|
|
percpu_counter_dec(&ep->user->epoll_watches);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
/* Item initialization follow here ... */
|
|
INIT_LIST_HEAD(&epi->rdllink);
|
|
epi->ep = ep;
|
|
ep_set_ffd(&epi->ffd, tfile, fd);
|
|
epi->event = *event;
|
|
epi->next = EP_UNACTIVE_PTR;
|
|
|
|
if (tep)
|
|
mutex_lock_nested(&tep->mtx, 1);
|
|
/* Add the current item to the list of active epoll hook for this file */
|
|
if (unlikely(attach_epitem(tfile, epi) < 0)) {
|
|
if (tep)
|
|
mutex_unlock(&tep->mtx);
|
|
kmem_cache_free(epi_cache, epi);
|
|
percpu_counter_dec(&ep->user->epoll_watches);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
if (full_check && !tep)
|
|
list_file(tfile);
|
|
|
|
/*
|
|
* Add the current item to the RB tree. All RB tree operations are
|
|
* protected by "mtx", and ep_insert() is called with "mtx" held.
|
|
*/
|
|
ep_rbtree_insert(ep, epi);
|
|
if (tep)
|
|
mutex_unlock(&tep->mtx);
|
|
|
|
/* now check if we've created too many backpaths */
|
|
if (unlikely(full_check && reverse_path_check())) {
|
|
ep_remove(ep, epi);
|
|
return -EINVAL;
|
|
}
|
|
|
|
if (epi->event.events & EPOLLWAKEUP) {
|
|
error = ep_create_wakeup_source(epi);
|
|
if (error) {
|
|
ep_remove(ep, epi);
|
|
return error;
|
|
}
|
|
}
|
|
|
|
/* Initialize the poll table using the queue callback */
|
|
epq.epi = epi;
|
|
init_poll_funcptr(&epq.pt, ep_ptable_queue_proc);
|
|
|
|
/*
|
|
* Attach the item to the poll hooks and get current event bits.
|
|
* We can safely use the file* here because its usage count has
|
|
* been increased by the caller of this function. Note that after
|
|
* this operation completes, the poll callback can start hitting
|
|
* the new item.
|
|
*/
|
|
revents = ep_item_poll(epi, &epq.pt, 1);
|
|
|
|
/*
|
|
* We have to check if something went wrong during the poll wait queue
|
|
* install process. Namely an allocation for a wait queue failed due
|
|
* high memory pressure.
|
|
*/
|
|
if (unlikely(!epq.epi)) {
|
|
ep_remove(ep, epi);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
/* We have to drop the new item inside our item list to keep track of it */
|
|
write_lock_irq(&ep->lock);
|
|
|
|
/* record NAPI ID of new item if present */
|
|
ep_set_busy_poll_napi_id(epi);
|
|
|
|
/* If the file is already "ready" we drop it inside the ready list */
|
|
if (revents && !ep_is_linked(epi)) {
|
|
list_add_tail(&epi->rdllink, &ep->rdllist);
|
|
ep_pm_stay_awake(epi);
|
|
|
|
/* Notify waiting tasks that events are available */
|
|
if (waitqueue_active(&ep->wq))
|
|
wake_up(&ep->wq);
|
|
if (waitqueue_active(&ep->poll_wait))
|
|
pwake++;
|
|
}
|
|
|
|
write_unlock_irq(&ep->lock);
|
|
|
|
/* We have to call this outside the lock */
|
|
if (pwake)
|
|
ep_poll_safewake(ep, NULL);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Modify the interest event mask by dropping an event if the new mask
|
|
* has a match in the current file status. Must be called with "mtx" held.
|
|
*/
|
|
static int ep_modify(struct eventpoll *ep, struct epitem *epi,
|
|
const struct epoll_event *event)
|
|
{
|
|
int pwake = 0;
|
|
poll_table pt;
|
|
|
|
lockdep_assert_irqs_enabled();
|
|
|
|
init_poll_funcptr(&pt, NULL);
|
|
|
|
/*
|
|
* Set the new event interest mask before calling f_op->poll();
|
|
* otherwise we might miss an event that happens between the
|
|
* f_op->poll() call and the new event set registering.
|
|
*/
|
|
epi->event.events = event->events; /* need barrier below */
|
|
epi->event.data = event->data; /* protected by mtx */
|
|
if (epi->event.events & EPOLLWAKEUP) {
|
|
if (!ep_has_wakeup_source(epi))
|
|
ep_create_wakeup_source(epi);
|
|
} else if (ep_has_wakeup_source(epi)) {
|
|
ep_destroy_wakeup_source(epi);
|
|
}
|
|
|
|
/*
|
|
* The following barrier has two effects:
|
|
*
|
|
* 1) Flush epi changes above to other CPUs. This ensures
|
|
* we do not miss events from ep_poll_callback if an
|
|
* event occurs immediately after we call f_op->poll().
|
|
* We need this because we did not take ep->lock while
|
|
* changing epi above (but ep_poll_callback does take
|
|
* ep->lock).
|
|
*
|
|
* 2) We also need to ensure we do not miss _past_ events
|
|
* when calling f_op->poll(). This barrier also
|
|
* pairs with the barrier in wq_has_sleeper (see
|
|
* comments for wq_has_sleeper).
|
|
*
|
|
* This barrier will now guarantee ep_poll_callback or f_op->poll
|
|
* (or both) will notice the readiness of an item.
|
|
*/
|
|
smp_mb();
|
|
|
|
/*
|
|
* Get current event bits. We can safely use the file* here because
|
|
* its usage count has been increased by the caller of this function.
|
|
* If the item is "hot" and it is not registered inside the ready
|
|
* list, push it inside.
|
|
*/
|
|
if (ep_item_poll(epi, &pt, 1)) {
|
|
write_lock_irq(&ep->lock);
|
|
if (!ep_is_linked(epi)) {
|
|
list_add_tail(&epi->rdllink, &ep->rdllist);
|
|
ep_pm_stay_awake(epi);
|
|
|
|
/* Notify waiting tasks that events are available */
|
|
if (waitqueue_active(&ep->wq))
|
|
wake_up(&ep->wq);
|
|
if (waitqueue_active(&ep->poll_wait))
|
|
pwake++;
|
|
}
|
|
write_unlock_irq(&ep->lock);
|
|
}
|
|
|
|
/* We have to call this outside the lock */
|
|
if (pwake)
|
|
ep_poll_safewake(ep, NULL);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int ep_send_events(struct eventpoll *ep,
|
|
struct epoll_event __user *events, int maxevents)
|
|
{
|
|
struct epitem *epi, *tmp;
|
|
LIST_HEAD(txlist);
|
|
poll_table pt;
|
|
int res = 0;
|
|
|
|
/*
|
|
* Always short-circuit for fatal signals to allow threads to make a
|
|
* timely exit without the chance of finding more events available and
|
|
* fetching repeatedly.
|
|
*/
|
|
if (fatal_signal_pending(current))
|
|
return -EINTR;
|
|
|
|
init_poll_funcptr(&pt, NULL);
|
|
|
|
mutex_lock(&ep->mtx);
|
|
ep_start_scan(ep, &txlist);
|
|
|
|
/*
|
|
* We can loop without lock because we are passed a task private list.
|
|
* Items cannot vanish during the loop we are holding ep->mtx.
|
|
*/
|
|
list_for_each_entry_safe(epi, tmp, &txlist, rdllink) {
|
|
struct wakeup_source *ws;
|
|
__poll_t revents;
|
|
|
|
if (res >= maxevents)
|
|
break;
|
|
|
|
/*
|
|
* Activate ep->ws before deactivating epi->ws to prevent
|
|
* triggering auto-suspend here (in case we reactive epi->ws
|
|
* below).
|
|
*
|
|
* This could be rearranged to delay the deactivation of epi->ws
|
|
* instead, but then epi->ws would temporarily be out of sync
|
|
* with ep_is_linked().
|
|
*/
|
|
ws = ep_wakeup_source(epi);
|
|
if (ws) {
|
|
if (ws->active)
|
|
__pm_stay_awake(ep->ws);
|
|
__pm_relax(ws);
|
|
}
|
|
|
|
list_del_init(&epi->rdllink);
|
|
|
|
/*
|
|
* If the event mask intersect the caller-requested one,
|
|
* deliver the event to userspace. Again, we are holding ep->mtx,
|
|
* so no operations coming from userspace can change the item.
|
|
*/
|
|
revents = ep_item_poll(epi, &pt, 1);
|
|
if (!revents)
|
|
continue;
|
|
|
|
events = epoll_put_uevent(revents, epi->event.data, events);
|
|
if (!events) {
|
|
list_add(&epi->rdllink, &txlist);
|
|
ep_pm_stay_awake(epi);
|
|
if (!res)
|
|
res = -EFAULT;
|
|
break;
|
|
}
|
|
res++;
|
|
if (epi->event.events & EPOLLONESHOT)
|
|
epi->event.events &= EP_PRIVATE_BITS;
|
|
else if (!(epi->event.events & EPOLLET)) {
|
|
/*
|
|
* If this file has been added with Level
|
|
* Trigger mode, we need to insert back inside
|
|
* the ready list, so that the next call to
|
|
* epoll_wait() will check again the events
|
|
* availability. At this point, no one can insert
|
|
* into ep->rdllist besides us. The epoll_ctl()
|
|
* callers are locked out by
|
|
* ep_scan_ready_list() holding "mtx" and the
|
|
* poll callback will queue them in ep->ovflist.
|
|
*/
|
|
list_add_tail(&epi->rdllink, &ep->rdllist);
|
|
ep_pm_stay_awake(epi);
|
|
}
|
|
}
|
|
ep_done_scan(ep, &txlist);
|
|
mutex_unlock(&ep->mtx);
|
|
|
|
return res;
|
|
}
|
|
|
|
static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms)
|
|
{
|
|
struct timespec64 now;
|
|
|
|
if (ms < 0)
|
|
return NULL;
|
|
|
|
if (!ms) {
|
|
to->tv_sec = 0;
|
|
to->tv_nsec = 0;
|
|
return to;
|
|
}
|
|
|
|
to->tv_sec = ms / MSEC_PER_SEC;
|
|
to->tv_nsec = NSEC_PER_MSEC * (ms % MSEC_PER_SEC);
|
|
|
|
ktime_get_ts64(&now);
|
|
*to = timespec64_add_safe(now, *to);
|
|
return to;
|
|
}
|
|
|
|
/*
|
|
* autoremove_wake_function, but remove even on failure to wake up, because we
|
|
* know that default_wake_function/ttwu will only fail if the thread is already
|
|
* woken, and in that case the ep_poll loop will remove the entry anyways, not
|
|
* try to reuse it.
|
|
*/
|
|
static int ep_autoremove_wake_function(struct wait_queue_entry *wq_entry,
|
|
unsigned int mode, int sync, void *key)
|
|
{
|
|
int ret = default_wake_function(wq_entry, mode, sync, key);
|
|
|
|
list_del_init(&wq_entry->entry);
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* ep_poll - Retrieves ready events, and delivers them to the caller-supplied
|
|
* event buffer.
|
|
*
|
|
* @ep: Pointer to the eventpoll context.
|
|
* @events: Pointer to the userspace buffer where the ready events should be
|
|
* stored.
|
|
* @maxevents: Size (in terms of number of events) of the caller event buffer.
|
|
* @timeout: Maximum timeout for the ready events fetch operation, in
|
|
* timespec. If the timeout is zero, the function will not block,
|
|
* while if the @timeout ptr is NULL, the function will block
|
|
* until at least one event has been retrieved (or an error
|
|
* occurred).
|
|
*
|
|
* Return: the number of ready events which have been fetched, or an
|
|
* error code, in case of error.
|
|
*/
|
|
static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,
|
|
int maxevents, struct timespec64 *timeout)
|
|
{
|
|
int res, eavail, timed_out = 0;
|
|
u64 slack = 0;
|
|
wait_queue_entry_t wait;
|
|
ktime_t expires, *to = NULL;
|
|
|
|
lockdep_assert_irqs_enabled();
|
|
|
|
if (timeout && (timeout->tv_sec | timeout->tv_nsec)) {
|
|
slack = select_estimate_accuracy(timeout);
|
|
to = &expires;
|
|
*to = timespec64_to_ktime(*timeout);
|
|
} else if (timeout) {
|
|
/*
|
|
* Avoid the unnecessary trip to the wait queue loop, if the
|
|
* caller specified a non blocking operation.
|
|
*/
|
|
timed_out = 1;
|
|
}
|
|
|
|
/*
|
|
* This call is racy: We may or may not see events that are being added
|
|
* to the ready list under the lock (e.g., in IRQ callbacks). For cases
|
|
* with a non-zero timeout, this thread will check the ready list under
|
|
* lock and will add to the wait queue. For cases with a zero
|
|
* timeout, the user by definition should not care and will have to
|
|
* recheck again.
|
|
*/
|
|
eavail = ep_events_available(ep);
|
|
|
|
while (1) {
|
|
if (eavail) {
|
|
/*
|
|
* Try to transfer events to user space. In case we get
|
|
* 0 events and there's still timeout left over, we go
|
|
* trying again in search of more luck.
|
|
*/
|
|
res = ep_send_events(ep, events, maxevents);
|
|
if (res)
|
|
return res;
|
|
}
|
|
|
|
if (timed_out)
|
|
return 0;
|
|
|
|
eavail = ep_busy_loop(ep, timed_out);
|
|
if (eavail)
|
|
continue;
|
|
|
|
if (signal_pending(current))
|
|
return -EINTR;
|
|
|
|
/*
|
|
* Internally init_wait() uses autoremove_wake_function(),
|
|
* thus wait entry is removed from the wait queue on each
|
|
* wakeup. Why it is important? In case of several waiters
|
|
* each new wakeup will hit the next waiter, giving it the
|
|
* chance to harvest new event. Otherwise wakeup can be
|
|
* lost. This is also good performance-wise, because on
|
|
* normal wakeup path no need to call __remove_wait_queue()
|
|
* explicitly, thus ep->lock is not taken, which halts the
|
|
* event delivery.
|
|
*
|
|
* In fact, we now use an even more aggressive function that
|
|
* unconditionally removes, because we don't reuse the wait
|
|
* entry between loop iterations. This lets us also avoid the
|
|
* performance issue if a process is killed, causing all of its
|
|
* threads to wake up without being removed normally.
|
|
*/
|
|
init_wait(&wait);
|
|
wait.func = ep_autoremove_wake_function;
|
|
|
|
write_lock_irq(&ep->lock);
|
|
/*
|
|
* Barrierless variant, waitqueue_active() is called under
|
|
* the same lock on wakeup ep_poll_callback() side, so it
|
|
* is safe to avoid an explicit barrier.
|
|
*/
|
|
__set_current_state(TASK_INTERRUPTIBLE);
|
|
|
|
/*
|
|
* Do the final check under the lock. ep_scan_ready_list()
|
|
* plays with two lists (->rdllist and ->ovflist) and there
|
|
* is always a race when both lists are empty for short
|
|
* period of time although events are pending, so lock is
|
|
* important.
|
|
*/
|
|
eavail = ep_events_available(ep);
|
|
if (!eavail)
|
|
__add_wait_queue_exclusive(&ep->wq, &wait);
|
|
|
|
write_unlock_irq(&ep->lock);
|
|
|
|
if (!eavail)
|
|
timed_out = !freezable_schedule_hrtimeout_range(to, slack,
|
|
HRTIMER_MODE_ABS);
|
|
__set_current_state(TASK_RUNNING);
|
|
|
|
/*
|
|
* We were woken up, thus go and try to harvest some events.
|
|
* If timed out and still on the wait queue, recheck eavail
|
|
* carefully under lock, below.
|
|
*/
|
|
eavail = 1;
|
|
|
|
if (!list_empty_careful(&wait.entry)) {
|
|
write_lock_irq(&ep->lock);
|
|
/*
|
|
* If the thread timed out and is not on the wait queue,
|
|
* it means that the thread was woken up after its
|
|
* timeout expired before it could reacquire the lock.
|
|
* Thus, when wait.entry is empty, it needs to harvest
|
|
* events.
|
|
*/
|
|
if (timed_out)
|
|
eavail = list_empty(&wait.entry);
|
|
__remove_wait_queue(&ep->wq, &wait);
|
|
write_unlock_irq(&ep->lock);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* ep_loop_check_proc - verify that adding an epoll file inside another
|
|
* epoll structure does not violate the constraints, in
|
|
* terms of closed loops, or too deep chains (which can
|
|
* result in excessive stack usage).
|
|
*
|
|
* @ep: the &struct eventpoll to be currently checked.
|
|
* @depth: Current depth of the path being checked.
|
|
*
|
|
* Return: %zero if adding the epoll @file inside current epoll
|
|
* structure @ep does not violate the constraints, or %-1 otherwise.
|
|
*/
|
|
static int ep_loop_check_proc(struct eventpoll *ep, int depth)
|
|
{
|
|
int error = 0;
|
|
struct rb_node *rbp;
|
|
struct epitem *epi;
|
|
|
|
mutex_lock_nested(&ep->mtx, depth + 1);
|
|
ep->gen = loop_check_gen;
|
|
for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
|
|
epi = rb_entry(rbp, struct epitem, rbn);
|
|
if (unlikely(is_file_epoll(epi->ffd.file))) {
|
|
struct eventpoll *ep_tovisit;
|
|
ep_tovisit = epi->ffd.file->private_data;
|
|
if (ep_tovisit->gen == loop_check_gen)
|
|
continue;
|
|
if (ep_tovisit == inserting_into || depth > EP_MAX_NESTS)
|
|
error = -1;
|
|
else
|
|
error = ep_loop_check_proc(ep_tovisit, depth + 1);
|
|
if (error != 0)
|
|
break;
|
|
} else {
|
|
/*
|
|
* If we've reached a file that is not associated with
|
|
* an ep, then we need to check if the newly added
|
|
* links are going to add too many wakeup paths. We do
|
|
* this by adding it to the tfile_check_list, if it's
|
|
* not already there, and calling reverse_path_check()
|
|
* during ep_insert().
|
|
*/
|
|
list_file(epi->ffd.file);
|
|
}
|
|
}
|
|
mutex_unlock(&ep->mtx);
|
|
|
|
return error;
|
|
}
|
|
|
|
/**
|
|
* ep_loop_check - Performs a check to verify that adding an epoll file (@to)
|
|
* into another epoll file (represented by @ep) does not create
|
|
* closed loops or too deep chains.
|
|
*
|
|
* @ep: Pointer to the epoll we are inserting into.
|
|
* @to: Pointer to the epoll to be inserted.
|
|
*
|
|
* Return: %zero if adding the epoll @to inside the epoll @from
|
|
* does not violate the constraints, or %-1 otherwise.
|
|
*/
|
|
static int ep_loop_check(struct eventpoll *ep, struct eventpoll *to)
|
|
{
|
|
inserting_into = ep;
|
|
return ep_loop_check_proc(to, 0);
|
|
}
|
|
|
|
static void clear_tfile_check_list(void)
|
|
{
|
|
rcu_read_lock();
|
|
while (tfile_check_list != EP_UNACTIVE_PTR) {
|
|
struct epitems_head *head = tfile_check_list;
|
|
tfile_check_list = head->next;
|
|
unlist_file(head);
|
|
}
|
|
rcu_read_unlock();
|
|
}
|
|
|
|
/*
|
|
* Open an eventpoll file descriptor.
|
|
*/
|
|
static int do_epoll_create(int flags)
|
|
{
|
|
int error, fd;
|
|
struct eventpoll *ep = NULL;
|
|
struct file *file;
|
|
|
|
/* Check the EPOLL_* constant for consistency. */
|
|
BUILD_BUG_ON(EPOLL_CLOEXEC != O_CLOEXEC);
|
|
|
|
if (flags & ~EPOLL_CLOEXEC)
|
|
return -EINVAL;
|
|
/*
|
|
* Create the internal data structure ("struct eventpoll").
|
|
*/
|
|
error = ep_alloc(&ep);
|
|
if (error < 0)
|
|
return error;
|
|
/*
|
|
* Creates all the items needed to setup an eventpoll file. That is,
|
|
* a file structure and a free file descriptor.
|
|
*/
|
|
fd = get_unused_fd_flags(O_RDWR | (flags & O_CLOEXEC));
|
|
if (fd < 0) {
|
|
error = fd;
|
|
goto out_free_ep;
|
|
}
|
|
file = anon_inode_getfile("[eventpoll]", &eventpoll_fops, ep,
|
|
O_RDWR | (flags & O_CLOEXEC));
|
|
if (IS_ERR(file)) {
|
|
error = PTR_ERR(file);
|
|
goto out_free_fd;
|
|
}
|
|
ep->file = file;
|
|
fd_install(fd, file);
|
|
return fd;
|
|
|
|
out_free_fd:
|
|
put_unused_fd(fd);
|
|
out_free_ep:
|
|
ep_free(ep);
|
|
return error;
|
|
}
|
|
|
|
SYSCALL_DEFINE1(epoll_create1, int, flags)
|
|
{
|
|
return do_epoll_create(flags);
|
|
}
|
|
|
|
SYSCALL_DEFINE1(epoll_create, int, size)
|
|
{
|
|
if (size <= 0)
|
|
return -EINVAL;
|
|
|
|
return do_epoll_create(0);
|
|
}
|
|
|
|
static inline int epoll_mutex_lock(struct mutex *mutex, int depth,
|
|
bool nonblock)
|
|
{
|
|
if (!nonblock) {
|
|
mutex_lock_nested(mutex, depth);
|
|
return 0;
|
|
}
|
|
if (mutex_trylock(mutex))
|
|
return 0;
|
|
return -EAGAIN;
|
|
}
|
|
|
|
int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds,
|
|
bool nonblock)
|
|
{
|
|
int error;
|
|
int full_check = 0;
|
|
struct fd f, tf;
|
|
struct eventpoll *ep;
|
|
struct epitem *epi;
|
|
struct eventpoll *tep = NULL;
|
|
|
|
error = -EBADF;
|
|
f = fdget(epfd);
|
|
if (!f.file)
|
|
goto error_return;
|
|
|
|
/* Get the "struct file *" for the target file */
|
|
tf = fdget(fd);
|
|
if (!tf.file)
|
|
goto error_fput;
|
|
|
|
/* The target file descriptor must support poll */
|
|
error = -EPERM;
|
|
if (!file_can_poll(tf.file))
|
|
goto error_tgt_fput;
|
|
|
|
/* Check if EPOLLWAKEUP is allowed */
|
|
if (ep_op_has_event(op))
|
|
ep_take_care_of_epollwakeup(epds);
|
|
|
|
/*
|
|
* We have to check that the file structure underneath the file descriptor
|
|
* the user passed to us _is_ an eventpoll file. And also we do not permit
|
|
* adding an epoll file descriptor inside itself.
|
|
*/
|
|
error = -EINVAL;
|
|
if (f.file == tf.file || !is_file_epoll(f.file))
|
|
goto error_tgt_fput;
|
|
|
|
/*
|
|
* epoll adds to the wakeup queue at EPOLL_CTL_ADD time only,
|
|
* so EPOLLEXCLUSIVE is not allowed for a EPOLL_CTL_MOD operation.
|
|
* Also, we do not currently supported nested exclusive wakeups.
|
|
*/
|
|
if (ep_op_has_event(op) && (epds->events & EPOLLEXCLUSIVE)) {
|
|
if (op == EPOLL_CTL_MOD)
|
|
goto error_tgt_fput;
|
|
if (op == EPOLL_CTL_ADD && (is_file_epoll(tf.file) ||
|
|
(epds->events & ~EPOLLEXCLUSIVE_OK_BITS)))
|
|
goto error_tgt_fput;
|
|
}
|
|
|
|
/*
|
|
* At this point it is safe to assume that the "private_data" contains
|
|
* our own data structure.
|
|
*/
|
|
ep = f.file->private_data;
|
|
|
|
/*
|
|
* When we insert an epoll file descriptor inside another epoll file
|
|
* descriptor, there is the chance of creating closed loops, which are
|
|
* better be handled here, than in more critical paths. While we are
|
|
* checking for loops we also determine the list of files reachable
|
|
* and hang them on the tfile_check_list, so we can check that we
|
|
* haven't created too many possible wakeup paths.
|
|
*
|
|
* We do not need to take the global 'epumutex' on EPOLL_CTL_ADD when
|
|
* the epoll file descriptor is attaching directly to a wakeup source,
|
|
* unless the epoll file descriptor is nested. The purpose of taking the
|
|
* 'epmutex' on add is to prevent complex toplogies such as loops and
|
|
* deep wakeup paths from forming in parallel through multiple
|
|
* EPOLL_CTL_ADD operations.
|
|
*/
|
|
error = epoll_mutex_lock(&ep->mtx, 0, nonblock);
|
|
if (error)
|
|
goto error_tgt_fput;
|
|
if (op == EPOLL_CTL_ADD) {
|
|
if (READ_ONCE(f.file->f_ep) || ep->gen == loop_check_gen ||
|
|
is_file_epoll(tf.file)) {
|
|
mutex_unlock(&ep->mtx);
|
|
error = epoll_mutex_lock(&epmutex, 0, nonblock);
|
|
if (error)
|
|
goto error_tgt_fput;
|
|
loop_check_gen++;
|
|
full_check = 1;
|
|
if (is_file_epoll(tf.file)) {
|
|
tep = tf.file->private_data;
|
|
error = -ELOOP;
|
|
if (ep_loop_check(ep, tep) != 0)
|
|
goto error_tgt_fput;
|
|
}
|
|
error = epoll_mutex_lock(&ep->mtx, 0, nonblock);
|
|
if (error)
|
|
goto error_tgt_fput;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Try to lookup the file inside our RB tree. Since we grabbed "mtx"
|
|
* above, we can be sure to be able to use the item looked up by
|
|
* ep_find() till we release the mutex.
|
|
*/
|
|
epi = ep_find(ep, tf.file, fd);
|
|
|
|
error = -EINVAL;
|
|
switch (op) {
|
|
case EPOLL_CTL_ADD:
|
|
if (!epi) {
|
|
epds->events |= EPOLLERR | EPOLLHUP;
|
|
error = ep_insert(ep, epds, tf.file, fd, full_check);
|
|
} else
|
|
error = -EEXIST;
|
|
break;
|
|
case EPOLL_CTL_DEL:
|
|
if (epi)
|
|
error = ep_remove(ep, epi);
|
|
else
|
|
error = -ENOENT;
|
|
break;
|
|
case EPOLL_CTL_MOD:
|
|
if (epi) {
|
|
if (!(epi->event.events & EPOLLEXCLUSIVE)) {
|
|
epds->events |= EPOLLERR | EPOLLHUP;
|
|
error = ep_modify(ep, epi, epds);
|
|
}
|
|
} else
|
|
error = -ENOENT;
|
|
break;
|
|
}
|
|
mutex_unlock(&ep->mtx);
|
|
|
|
error_tgt_fput:
|
|
if (full_check) {
|
|
clear_tfile_check_list();
|
|
loop_check_gen++;
|
|
mutex_unlock(&epmutex);
|
|
}
|
|
|
|
fdput(tf);
|
|
error_fput:
|
|
fdput(f);
|
|
error_return:
|
|
|
|
return error;
|
|
}
|
|
|
|
/*
|
|
* The following function implements the controller interface for
|
|
* the eventpoll file that enables the insertion/removal/change of
|
|
* file descriptors inside the interest set.
|
|
*/
|
|
SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
|
|
struct epoll_event __user *, event)
|
|
{
|
|
struct epoll_event epds;
|
|
|
|
if (ep_op_has_event(op) &&
|
|
copy_from_user(&epds, event, sizeof(struct epoll_event)))
|
|
return -EFAULT;
|
|
|
|
return do_epoll_ctl(epfd, op, fd, &epds, false);
|
|
}
|
|
|
|
/*
|
|
* Implement the event wait interface for the eventpoll file. It is the kernel
|
|
* part of the user space epoll_wait(2).
|
|
*/
|
|
static int do_epoll_wait(int epfd, struct epoll_event __user *events,
|
|
int maxevents, struct timespec64 *to)
|
|
{
|
|
int error;
|
|
struct fd f;
|
|
struct eventpoll *ep;
|
|
|
|
/* The maximum number of event must be greater than zero */
|
|
if (maxevents <= 0 || maxevents > EP_MAX_EVENTS)
|
|
return -EINVAL;
|
|
|
|
/* Verify that the area passed by the user is writeable */
|
|
if (!access_ok(events, maxevents * sizeof(struct epoll_event)))
|
|
return -EFAULT;
|
|
|
|
/* Get the "struct file *" for the eventpoll file */
|
|
f = fdget(epfd);
|
|
if (!f.file)
|
|
return -EBADF;
|
|
|
|
/*
|
|
* We have to check that the file structure underneath the fd
|
|
* the user passed to us _is_ an eventpoll file.
|
|
*/
|
|
error = -EINVAL;
|
|
if (!is_file_epoll(f.file))
|
|
goto error_fput;
|
|
|
|
/*
|
|
* At this point it is safe to assume that the "private_data" contains
|
|
* our own data structure.
|
|
*/
|
|
ep = f.file->private_data;
|
|
|
|
/* Time to fish for events ... */
|
|
error = ep_poll(ep, events, maxevents, to);
|
|
|
|
error_fput:
|
|
fdput(f);
|
|
return error;
|
|
}
|
|
|
|
SYSCALL_DEFINE4(epoll_wait, int, epfd, struct epoll_event __user *, events,
|
|
int, maxevents, int, timeout)
|
|
{
|
|
struct timespec64 to;
|
|
|
|
return do_epoll_wait(epfd, events, maxevents,
|
|
ep_timeout_to_timespec(&to, timeout));
|
|
}
|
|
|
|
/*
|
|
* Implement the event wait interface for the eventpoll file. It is the kernel
|
|
* part of the user space epoll_pwait(2).
|
|
*/
|
|
static int do_epoll_pwait(int epfd, struct epoll_event __user *events,
|
|
int maxevents, struct timespec64 *to,
|
|
const sigset_t __user *sigmask, size_t sigsetsize)
|
|
{
|
|
int error;
|
|
|
|
/*
|
|
* If the caller wants a certain signal mask to be set during the wait,
|
|
* we apply it here.
|
|
*/
|
|
error = set_user_sigmask(sigmask, sigsetsize);
|
|
if (error)
|
|
return error;
|
|
|
|
error = do_epoll_wait(epfd, events, maxevents, to);
|
|
|
|
restore_saved_sigmask_unless(error == -EINTR);
|
|
|
|
return error;
|
|
}
|
|
|
|
SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events,
|
|
int, maxevents, int, timeout, const sigset_t __user *, sigmask,
|
|
size_t, sigsetsize)
|
|
{
|
|
struct timespec64 to;
|
|
|
|
return do_epoll_pwait(epfd, events, maxevents,
|
|
ep_timeout_to_timespec(&to, timeout),
|
|
sigmask, sigsetsize);
|
|
}
|
|
|
|
SYSCALL_DEFINE6(epoll_pwait2, int, epfd, struct epoll_event __user *, events,
|
|
int, maxevents, const struct __kernel_timespec __user *, timeout,
|
|
const sigset_t __user *, sigmask, size_t, sigsetsize)
|
|
{
|
|
struct timespec64 ts, *to = NULL;
|
|
|
|
if (timeout) {
|
|
if (get_timespec64(&ts, timeout))
|
|
return -EFAULT;
|
|
to = &ts;
|
|
if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
|
|
return -EINVAL;
|
|
}
|
|
|
|
return do_epoll_pwait(epfd, events, maxevents, to,
|
|
sigmask, sigsetsize);
|
|
}
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
static int do_compat_epoll_pwait(int epfd, struct epoll_event __user *events,
|
|
int maxevents, struct timespec64 *timeout,
|
|
const compat_sigset_t __user *sigmask,
|
|
compat_size_t sigsetsize)
|
|
{
|
|
long err;
|
|
|
|
/*
|
|
* If the caller wants a certain signal mask to be set during the wait,
|
|
* we apply it here.
|
|
*/
|
|
err = set_compat_user_sigmask(sigmask, sigsetsize);
|
|
if (err)
|
|
return err;
|
|
|
|
err = do_epoll_wait(epfd, events, maxevents, timeout);
|
|
|
|
restore_saved_sigmask_unless(err == -EINTR);
|
|
|
|
return err;
|
|
}
|
|
|
|
COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd,
|
|
struct epoll_event __user *, events,
|
|
int, maxevents, int, timeout,
|
|
const compat_sigset_t __user *, sigmask,
|
|
compat_size_t, sigsetsize)
|
|
{
|
|
struct timespec64 to;
|
|
|
|
return do_compat_epoll_pwait(epfd, events, maxevents,
|
|
ep_timeout_to_timespec(&to, timeout),
|
|
sigmask, sigsetsize);
|
|
}
|
|
|
|
COMPAT_SYSCALL_DEFINE6(epoll_pwait2, int, epfd,
|
|
struct epoll_event __user *, events,
|
|
int, maxevents,
|
|
const struct __kernel_timespec __user *, timeout,
|
|
const compat_sigset_t __user *, sigmask,
|
|
compat_size_t, sigsetsize)
|
|
{
|
|
struct timespec64 ts, *to = NULL;
|
|
|
|
if (timeout) {
|
|
if (get_timespec64(&ts, timeout))
|
|
return -EFAULT;
|
|
to = &ts;
|
|
if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
|
|
return -EINVAL;
|
|
}
|
|
|
|
return do_compat_epoll_pwait(epfd, events, maxevents, to,
|
|
sigmask, sigsetsize);
|
|
}
|
|
|
|
#endif
|
|
|
|
static int __init eventpoll_init(void)
|
|
{
|
|
struct sysinfo si;
|
|
|
|
si_meminfo(&si);
|
|
/*
|
|
* Allows top 4% of lomem to be allocated for epoll watches (per user).
|
|
*/
|
|
max_user_watches = (((si.totalram - si.totalhigh) / 25) << PAGE_SHIFT) /
|
|
EP_ITEM_COST;
|
|
BUG_ON(max_user_watches < 0);
|
|
|
|
/*
|
|
* We can have many thousands of epitems, so prevent this from
|
|
* using an extra cache line on 64-bit (and smaller) CPUs
|
|
*/
|
|
BUILD_BUG_ON(sizeof(void *) <= 8 && sizeof(struct epitem) > 128);
|
|
|
|
/* Allocates slab cache used to allocate "struct epitem" items */
|
|
epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem),
|
|
0, SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL);
|
|
|
|
/* Allocates slab cache used to allocate "struct eppoll_entry" */
|
|
pwq_cache = kmem_cache_create("eventpoll_pwq",
|
|
sizeof(struct eppoll_entry), 0, SLAB_PANIC|SLAB_ACCOUNT, NULL);
|
|
|
|
ephead_cache = kmem_cache_create("ep_head",
|
|
sizeof(struct epitems_head), 0, SLAB_PANIC|SLAB_ACCOUNT, NULL);
|
|
|
|
return 0;
|
|
}
|
|
fs_initcall(eventpoll_init);
|