mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-06 03:45:24 -04:00
remotes/origin/tmp-387dbb9:
reverting enum-conversion, Handle CPU state and all USB patches
ANDROID: bpf: do not fail to load if log is full
ANDROID: fix kernelci compressed kernel linking
ANDROID: GKI: Update symbol list for Zebra
UPSTREAM: posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del()
Linux 5.4.295
scsi: qedf: Use designated initializer for struct qed_fcoe_cb_ops
arm64/ptrace: Fix stack-out-of-bounds read in regs_get_kernel_stack_nth()
perf: Fix sample vs do_exit()
s390/pci: Fix __pcilg_mio_inuser() inline assembly
rtc: test: Fix invalid format specifier.
jbd2: fix data-race and null-ptr-deref in jbd2_journal_dirty_metadata()
mm/huge_memory: fix dereferencing invalid pmd migration entry
rtc: Make rtc_time64_to_tm() support dates before 1970
rtc: Improve performance of rtc_time64_to_tm(). Add tests.
xprtrdma: fix pointer derefs in error cases of rpcrdma_ep_create
posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del()
ARM: dts: am335x-bone-common: Increase MDIO reset deassert delay to 50ms
ARM: dts: am335x-bone-common: Increase MDIO reset deassert time
ARM: dts: am335x-bone-common: Add GPIO PHY reset on revision C3 board
net: atm: fix /proc/net/atm/lec handling
net: atm: add lec_mutex
calipso: Fix null-ptr-deref in calipso_req_{set,del}attr().
tipc: fix null-ptr-deref when acquiring remote ip of ethernet bearer
tcp: fix tcp_packet_delayed() for tcp_is_non_sack_preventing_reopen() behavior
atm: atmtcp: Free invalid length skb in atmtcp_c_send().
mpls: Use rcu_dereference_rtnl() in mpls_route_input_rcu().
wifi: carl9170: do not ping device which has failed to load firmware
aoe: clean device rq_list in aoedev_downdev()
hwmon: (occ) fix unaligned accesses
drm/nouveau/bl: increase buffer size to avoid truncate warning
erofs: remove unused trace event erofs_destroy_inode
ALSA: hda/realtek: enable headset mic on Latitude 5420 Rugged
ALSA: hda/intel: Add Thinkpad E15 to PM deny list
Input: sparcspkr - avoid unannotated fall-through
HID: usbhid: Eliminate recurrent out-of-bounds bug in usbhid_parse()
atm: Revert atm_account_tx() if copy_from_iter_full() fails.
selinux: fix selinux_xfrm_alloc_user() to set correct ctx_len
scsi: s390: zfcp: Ensure synchronous unit_add
scsi: storvsc: Increase the timeouts to storvsc_timeout
jffs2: check jffs2_prealloc_raw_node_refs() result in few other places
jffs2: check that raw node were preallocated before writing summary
drivers/rapidio/rio_cm.c: prevent possible heap overwrite
Revert "x86/bugs: Make spectre user default depend on MITIGATION_SPECTRE_V2" on v6.6 and older
powerpc/eeh: Fix missing PE bridge reconfiguration during VFIO EEH recovery
platform/x86: dell_rbu: Stop overwriting data buffer
platform: Add Surface platform directory
Revert "bus: ti-sysc: Probe for l4_wkup and l4_cfg interconnect devices first"
tee: Prevent size calculation wraparound on 32-bit kernels
ARM: OMAP2+: Fix l4ls clk domain handling in STANDBY
bus: fsl-mc: increase MC_CMD_COMPLETION_TIMEOUT_MS value
watchdog: da9052_wdt: respect TWDMIN
i40e: fix MMIO write access to an invalid page in i40e_clear_hw
sock: Correct error checking condition for (assign|release)_proto_idx()
scsi: lpfc: Use memcpy() for BIOS version
vxlan: Do not treat dst cache initialization errors as fatal
clk: rockchip: rk3036: mark ddrphy as critical
wifi: mac80211: do not offer a mesh path if forwarding is disabled
net: mlx4: add SOF_TIMESTAMPING_TX_SOFTWARE flag when getting ts info
pinctrl: armada-37xx: propagate error from armada_37xx_gpio_get()
pinctrl: armada-37xx: propagate error from armada_37xx_pmx_gpio_set_direction()
pinctrl: armada-37xx: propagate error from armada_37xx_gpio_get_direction()
pinctrl: armada-37xx: propagate error from armada_37xx_pmx_set_by_name()
ipv4/route: Use this_cpu_inc() for stats on PREEMPT_RT
tcp: fix initial tp->rcvq_space.space value for passive TS enabled flows
tcp: always seek for minimal rtt in tcp_rcv_rtt_update()
net: dlink: add synchronization for stats update
sctp: Do not wake readers in __sctp_write_space()
emulex/benet: correct command version selection in be_cmd_get_stats()
i2c: designware: Invoke runtime suspend on quick slave re-registration
net: macb: Check return value of dma_set_mask_and_coherent()
cpufreq: Force sync policy boost with global boost on sysfs update
nios2: force update_mmu_cache on spurious tlb-permission--related pagefaults
media: platform: exynos4-is: Add hardware sync wait to fimc_is_hw_change_mode()
media: tc358743: ignore video while HPD is low
drm/amdkfd: Set SDMA_RLCx_IB_CNTL/SWITCH_INSIDE_IB
jfs: Fix null-ptr-deref in jfs_ioc_trim
drm/amdgpu/gfx9: fix CSIB handling
drm/amdgpu/gfx8: fix CSIB handling
jfs: fix array-index-out-of-bounds read in add_missing_indices
drm/amdgpu/gfx7: fix CSIB handling
drm/amdgpu/gfx10: fix CSIB handling
drm/msm/a6xx: Increase HFI response timeout
drm/amd/display: Add NULL pointer checks in dm_force_atomic_commit()
media: uapi: v4l: Fix V4L2_TYPE_IS_OUTPUT condition
drm/msm/hdmi: add runtime PM calls to DDC transfer function
drm/bridge: analogix_dp: Add irq flag IRQF_NO_AUTOEN instead of calling disable_irq()
sunrpc: update nextcheck time when adding new cache entries
drm/amdgpu/gfx6: fix CSIB handling
ACPI: battery: negate current when discharging
PM: runtime: fix denying of auto suspend in pm_suspend_timer_fn()
power: supply: bq27xxx: Retrieve again when busy
ACPICA: fix acpi parse and parseext cache leaks
ACPICA: Avoid sequence overread in call to strncmp()
ACPICA: fix acpi operand cache leak in dswstate.c
iio: adc: ad7606_spi: fix reg write value mask
PCI: Fix lock symmetry in pci_slot_unlock()
PCI: Add ACS quirk for Loongson PCIe
uio_hv_generic: Use correct size for interrupt and monitor pages
regulator: max14577: Add error check for max14577_read_reg()
mips: Add -std= flag specified in KBUILD_CFLAGS to vdso CFLAGS
staging: iio: ad5933: Correct settling cycles encoding per datasheet
net: ch9200: fix uninitialised access during mii_nway_restart
ftrace: Fix UAF when lookup kallsym after ftrace disabled
dm-mirror: fix a tiny race condition
mtd: nand: sunxi: Add randomizer configuration before randomizer enable
mtd: rawnand: sunxi: Add randomizer configuration in sunxi_nfc_hw_ecc_write_chunk
mm: fix ratelimit_pages update error in dirty_ratio_handler()
ipc: fix to protect IPCS lookups using RCU
parisc: fix building with gcc-15
vgacon: Add check for vc_origin address range in vgacon_scroll()
fbdev: Fix fb_set_var to prevent null-ptr-deref in fb_videomode_to_var
EDAC/altera: Use correct write width with the INTTEST register
NFC: nci: uart: Set tty->disc_data only in success path
f2fs: prevent kernel warning due to negative i_nlink from corrupted image
Input: ims-pcu - check record size in ims_pcu_flash_firmware()
ext4: fix calculation of credits for extent tree modification
ext4: inline: fix len overflow in ext4_prepare_inline_data
bus: fsl-mc: do not add a device-link for the UAPI used DPMCP device
ata: pata_via: Force PIO for ATAPI devices on VT6415/VT6330
ARM: 9447/1: arm/memremap: fix arch_memremap_can_ram_remap()
media: v4l2-dev: fix error handling in __video_register_device()
media: gspca: Add error handling for stv06xx_read_sensor()
wifi: rtlwifi: disable ASPM for RTL8723BE with subsystem ID 11ad:1723
nfsd: nfsd4_spo_must_allow() must check this is a v4 compound request
wifi: p54: prevent buffer-overflow in p54_rx_eeprom_readback()
gfs2: move msleep to sleepable context
configfs: Do not override creating attribute file failure in populate_attrs()
net: usb: aqc111: debug info before sanitation
calipso: unlock rcu before returning -EAFNOSUPPORT
xen/arm: call uaccess_ttbr0_enable for dm_op hypercall
usb: Flush altsetting 0 endpoints before reinitializating them after reset.
fs/filesystems: Fix potential unsigned integer underflow in fs_name()
net/mdiobus: Fix potential out-of-bounds read/write access
drm/amd/display: Do not add '-mhard-float' to dcn2{1,0}_resource.o for clang
drm/amd/display: Do not add '-mhard-float' to dml_ccflags for clang
MIPS: Move '-Wa,-msoft-float' check from as-option to cc-option
x86/boot/compressed: prefer cc-option for CFLAGS additions
net: mdio: C22 is now optional, EOPNOTSUPP if not provided
net_sched: tbf: fix a race in tbf_change()
net_sched: red: fix a race in __red_change()
net_sched: prio: fix a race in prio_tune()
net/mlx5: Fix return value when searching for existing flow group
net/mlx5: Wait for inactive autogroups
i40e: retry VFLR handling if there is ongoing VF reset
i40e: return false from i40e_reset_vf if reset is in progress
net_sched: sch_sfq: fix a potential crash on gso_skb handling
scsi: iscsi: Fix incorrect error path labels for flashnode operations
NFSD: Fix NFSv3 SETATTR/CREATE's handling of large file sizes
NFSD: Fix ia_size underflow
Input: synaptics-rmi - fix crash with unsupported versions of F34
Input: synaptics-rmi4 - convert to use sysfs_emit() APIs
pmdomain: core: Fix error checking in genpd_dev_pm_attach_by_id()
do_change_type(): refuse to operate on unmounted/not ours mounts
PM: sleep: Fix power.is_suspended cleanup for direct-complete devices
ice: create new Tx scheduler nodes for new queues only
Bluetooth: L2CAP: Fix not responding with L2CAP_CR_LE_ENCRYPTION
net/mlx4_en: Prevent potential integer overflow calculating Hz
vt: remove VT_RESIZE and VT_RESIZEX from vt_compat_ioctl()
serial: Fix potential null-ptr-deref in mlb_usio_probe()
usb: renesas_usbhs: Reorder clock handling and power management in probe
rtc: Fix offset calculation for .start_secs < 0
rtc: sh: assign correct interrupts with DT
perf record: Fix incorrect --user-regs comments
perf tests switch-tracking: Fix timestamp comparison
mfd: stmpe-spi: Correct the name used in MODULE_DEVICE_TABLE
mfd: exynos-lpass: Avoid calling exynos_lpass_disable() twice in exynos_lpass_remove()
rpmsg: qcom_smd: Fix uninitialized return variable in __qcom_smd_send()
perf scripts python: exported-sql-viewer.py: Fix pattern matching with Python 3
perf ui browser hists: Set actions->thread before calling do_zoom_thread()
fbdev: core: fbcvt: avoid division by 0 in fb_cvt_hperiod()
soc: aspeed: Add NULL check in aspeed_lpc_enable_snoop()
soc: aspeed: lpc: Fix impossible judgment condition
arm64: dts: rockchip: disable unrouted USB controllers and PHY on RK3399 Puma with Haikou
ARM: dts: qcom: apq8064 merge hw splinlock into corresponding syscon device
bus: fsl-mc: fix double-free on mc_dev
nilfs2: do not propagate ENOENT error from nilfs_btree_propagate()
nilfs2: add pointer check for nilfs_direct_propagate()
Squashfs: check return result of sb_min_blocksize
ARM: dts: at91: at91sam9263: fix NAND chip selects
ARM: dts: at91: usb_a9263: fix GPIO for Dataflash chip select
f2fs: fix to correct check conditions in f2fs_cross_rename
f2fs: use d_inode(dentry) cleanup dentry->d_inode
calipso: Don't call calipso functions for AF_INET sk.
net: lan743x: rename lan743x_reset_phy to lan743x_hw_reset_phy
net: usb: aqc111: fix error handling of usbnet read calls
netfilter: nf_tables: nft_fib_ipv6: fix VRF ipv4/ipv6 result discrepancy
wifi: ath9k_htc: Abort software beacon handling if disabled
bpf: Fix WARN() in get_bpf_raw_tp_regs
pinctrl: at91: Fix possible out-of-boundary access
ktls, sockmap: Fix missing uncharge operation
netfilter: bridge: Move specific fragmented packet to slow_path instead of dropping it
f2fs: clean up w/ fscrypt_is_bounce_page()
RDMA/hns: Include hnae3.h in hns_roce_hw_v2.h
wifi: rtw88: do not ignore hardware read error during DPK
net: ncsi: Fix GCPS 64-bit member variables
f2fs: fix to do sanity check on sbi->total_valid_block_count
drm/tegra: rgb: Fix the unbound reference count
drm/vkms: Adjust vkms_state->active_planes allocation type
drm: rcar-du: Fix memory leak in rcar_du_vsps_init()
selftests/seccomp: fix syscall_restart test for arm compat
firmware: psci: Fix refcount leak in psci_dt_init
m68k: mac: Fix macintosh_config for Mac II
drm/vmwgfx: Add seqno waiter for sync_files
spi: sh-msiof: Fix maximum DMA transfer size
ACPI: OSI: Stop advertising support for "3.0 _SCP Extensions"
x86/mtrr: Check if fixed-range MTRRs exist in mtrr_save_fixed_ranges()
PM: wakeup: Delete space in the end of string shown by pm_show_wakelocks()
EDAC/skx_common: Fix general protection fault
crypto: marvell/cesa - Avoid empty transfer descriptor
crypto: marvell/cesa - Handle zero-length skcipher requests
x86/cpu: Sanitize CPUID(0x80000000) output
perf/core: Fix broken throttling when max_samples_per_tick=1
gfs2: gfs2_create_inode error handling fix
netfilter: nft_socket: fix sk refcount leaks
thunderbolt: Do not double dequeue a configuration request
usb: usbtmc: Fix timeout value in get_stb
usb: storage: Ignore UAS driver for SanDisk 3.2 Gen2 storage device
usb: quirks: Add NO_LPM quirk for SanDisk Extreme 55AE
pinctrl: armada-37xx: set GPIO output value before setting direction
pinctrl: armada-37xx: use correct OUTPUT_VAL register for GPIOs > 31
tracing: Fix compilation warning on arm32
BACKPORT: binder: Create safe versions of binder log files
UPSTREAM: binder: Refactor binder_node print synchronization
Revert "coredump: hand a pidfd to the usermode coredump helper"
Linux 5.4.294
xen/swiotlb: relax alignment requirements
platform/x86: thinkpad_acpi: Ignore battery threshold change event notification
platform/x86: fujitsu-laptop: Support Lifebook S2110 hotkeys
spi: spi-sun4i: fix early activation
um: let 'make clean' properly clean underlying SUBARCH as well
platform/x86: thinkpad_acpi: Support also NEC Lavie X1475JAS
nfs: don't share pNFS DS connections between net namespaces
HID: quirks: Add ADATA XPG alpha wireless mouse support
coredump: hand a pidfd to the usermode coredump helper
fork: use pidfd_prepare()
pid: add pidfd_prepare()
pidfd: check pid has attached task in fdinfo
coredump: fix error handling for replace_fd()
net_sched: hfsc: Address reentrant enqueue adding class to eltree twice
smb: client: Reset all search buffer pointers when releasing buffer
smb: client: Fix use-after-free in cifs_fill_dirent
drm/i915/gvt: fix unterminated-string-initialization warning
netfilter: nf_tables: do not defer rule destruction via call_rcu
netfilter: nf_tables: wait for rcu grace period on net_device removal
netfilter: nf_tables: pass nft_chain to destroy function, not nft_ctx
kbuild: Disable -Wdefault-const-init-unsafe
spi: spi-fsl-dspi: restrict register range for regmap access
mm/page_alloc.c: avoid infinite retries caused by cpuset race
memcg: always call cond_resched() after fn()
drm/edid: fixed the bug that hdr metadata was not reset
llc: fix data loss when reading from a socket in llc_ui_recvmsg()
ALSA: pcm: Fix race of buffer access at PCM OSS layer
can: bcm: add missing rcu read protection for procfs content
can: bcm: add locking for bcm_op runtime updates
crypto: algif_hash - fix double free in hash_accept
sch_hfsc: Fix qlen accounting bug when using peek in hfsc_enqueue()
net: dwmac-sun8i: Use parsed internal PHY address instead of 1
bridge: netfilter: Fix forwarding of fragmented packets
xfrm: Sanitize marks before insert
__legitimize_mnt(): check for MNT_SYNC_UMOUNT should be under mount_lock
xenbus: Allow PVH dom0 a non-local xenstore
btrfs: correct the order of prelim_ref arguments in btrfs__prelim_ref
nvmet-tcp: don't restore null sk_state_change
ASoC: Intel: bytcr_rt5640: Add DMI quirk for Acer Aspire SW3-013
pinctrl: meson: define the pull up/down resistor value as 60 kOhm
drm: Add valid clones check
drm/atomic: clarify the rules around drm_atomic_state->allow_modeset
regulator: ad5398: Add device tree support
wifi: rtw88: Don't use static local variable in rtw8822b_set_tx_power_index_by_rate
bpftool: Fix readlink usage in get_fd_type
HID: usbkbd: Fix the bit shift number for LED_KANA
scsi: st: Restore some drive settings after reset
scsi: lpfc: Handle duplicate D_IDs in ndlp search-by D_ID routine
rcu: fix header guard for rcu_all_qs()
rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y
vxlan: Annotate FDB data races
hwmon: (xgene-hwmon) use appropriate type for the latency value
ip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure().
net/mlx5e: reduce rep rxq depth to 256 for ECPF
net/mlx5e: set the tx_queue_len for pfifo_fast
net/mlx5: Extend Ethtool loopback selftest to support non-linear SKB
phy: core: don't require set_mode() callback for phy_get_mode() to work
net/mlx4_core: Avoid impossible mlx4_db_alloc() order value
smack: recognize ipv4 CIPSO w/o categories
pinctrl: devicetree: do not goto err when probing hogs in pinctrl_dt_to_map
ASoC: ops: Enforce platform maximum on initial value
net/mlx5: Apply rate-limiting to high temperature warning
net/mlx5: Modify LSB bitmask in temperature event to include only the first bit
ACPI: HED: Always initialize before evged
PCI: Fix old_size lower bound in calculate_iosize() too
EDAC/ie31200: work around false positive build warning
net: pktgen: fix access outside of user given buffer in pktgen_thread_write()
wifi: rtw88: Fix rtw_init_ht_cap() for RTL8814AU
scsi: mpt3sas: Send a diag reset if target reset fails
MIPS: pm-cps: Use per-CPU variables as per-CPU, not per-core
MIPS: Use arch specific syscall name match function
cpuidle: menu: Avoid discarding useful information
x86/nmi: Add an emergency handler in nmi_desc & use it in nmi_shootdown_cpus()
bonding: report duplicate MAC address in all situations
net: xgene-v2: remove incorrect ACPI_PTR annotation
drm/amdkfd: KFD release_work possible circular locking
net/mlx5: Avoid report two health errors on same syndrome
fpga: altera-cvp: Increase credit timeout
drm/mediatek: mtk_dpi: Add checks for reg_h_fre_con existence
hwmon: (gpio-fan) Add missing mutex locks
x86/bugs: Make spectre user default depend on MITIGATION_SPECTRE_V2
net: pktgen: fix mpls maximum labels list parsing
pinctrl: bcm281xx: Use "unsigned int" instead of bare "unsigned"
media: cx231xx: set device_caps for 417
orangefs: Do not truncate file size
dm cache: prevent BUG_ON by blocking retries on failed device resumes
media: c8sectpfe: Call of_node_put(i2c_bus) only once in c8sectpfe_probe()
ARM: tegra: Switch DSI-B clock parent to PLLD on Tegra114
ieee802154: ca8210: Use proper setters and getters for bitwise types
rtc: ds1307: stop disabling alarms on probe
powerpc/prom_init: Fixup missing #size-cells on PowerBook6,7
mmc: sdhci: Disable SD card clock before changing parameters
netfilter: conntrack: Bound nf_conntrack sysctl writes
posix-timers: Add cond_resched() to posix_timer_add() search loop
xen: Add support for XenServer 6.1 platform device
dm: restrict dm device size to 2^63-512 bytes
kbuild: fix argument parsing in scripts/config
scsi: st: ERASE does not change tape location
scsi: st: Tighten the page format heuristics with MODE SELECT
ext4: reorder capability check last
um: Update min_low_pfn to match changes in uml_reserved
um: Store full CSGSFS and SS register from mcontext
btrfs: send: return -ENAMETOOLONG when attempting a path that is too long
btrfs: avoid linker error in btrfs_find_create_tree_block()
i2c: pxa: fix call balance of i2c->clk handling routines
mmc: host: Wait for Vdd to settle on card power off
libnvdimm/labels: Fix divide error in nd_label_data_init()
pNFS/flexfiles: Report ENETDOWN as a connection error
tools/build: Don't pass test log files to linker
dql: Fix dql->limit value when reset.
SUNRPC: rpc_clnt_set_transport() must not change the autobind setting
NFSv4: Treat ENETUNREACH errors as fatal for state recovery
fbdev: core: tileblit: Implement missing margin clearing for tileblit
fbdev: fsl-diu-fb: add missing device_remove_file()
mailbox: use error ret code of of_parse_phandle_with_args()
kconfig: merge_config: use an empty file as initfile
cgroup: Fix compilation issue due to cgroup_mutex not being exported
dma-mapping: avoid potential unused data compilation warning
scsi: target: iscsi: Fix timeout on deleted connection
openvswitch: Fix unsafe attribute parsing in output_userspace()
Input: synaptics - enable InterTouch on TUXEDO InfinityBook Pro 14 v5
Input: synaptics - enable SMBus for HP Elitebook 850 G1
clocksource/i8253: Use raw_spinlock_irqsave() in clockevent_i8253_disable()
phy: renesas: rcar-gen3-usb2: Set timing registers only once
phy: Fix error handling in tegra_xusb_port_init
ALSA: es1968: Add error handling for snd_pcm_hw_constraint_pow2()
ACPI: PPTT: Fix processor subtable walk
dmaengine: Revert "dmaengine: dmatest: Fix dmatest waiting less when interrupted"
NFSv4/pnfs: Reset the layout state after a layoutreturn
NFSv4/pnfs: pnfs_set_layout_stateid() should update the layout cred
qlcnic: fix memory leak in qlcnic_sriov_channel_cfg_cmd()
ALSA: sh: SND_AICA should depend on SH_DMA_API
net: dsa: sja1105: discard incoming frames in BR_STATE_LISTENING
spi: loopback-test: Do not split 1024-byte hexdumps
nfs: handle failure of nfs_get_lock_context in unlock path
RDMA/rxe: Fix slab-use-after-free Read in rxe_queue_cleanup bug
iio: chemical: sps30: use aligned_s64 for timestamp
iio: adc: ad7768-1: Fix insufficient alignment of timestamp.
staging: axis-fifo: Correct handling of tx_fifo_depth for size validation
staging: axis-fifo: avoid parsing ignored device tree properties
staging: axis-fifo: Remove hardware resets for user errors
staging: axis-fifo: replace spinlock with mutex
platform/x86: asus-wmi: Fix wlan_ctrl_by_user detection
do_umount(): add missing barrier before refcount checks in sync case
nvme: unblock ctrl state transition for firmware update
MIPS: Fix MAX_REG_OFFSET
iio: adc: dln2: Use aligned_s64 for timestamp
types: Complement the aligned types with signed 64-bit one
usb: usbtmc: Fix erroneous generic_read ioctl return
usb: usbtmc: Fix erroneous wait_srq ioctl return
usb: usbtmc: Fix erroneous get_stb ioctl error returns
USB: usbtmc: use interruptible sleep in usbtmc_read
usb: typec: ucsi: displayport: Fix NULL pointer access
usb: typec: tcpm: delay SNK_TRY_WAIT_DEBOUNCE to SRC_TRYWAIT transition
ocfs2: stop quota recovery before disabling quotas
ocfs2: implement handshaking with ocfs2 recovery thread
ocfs2: switch osb->disable_recovery to enum
module: ensure that kobject_put() is safe for module type kobjects
xenbus: Use kref to track req lifetime
usb: uhci-platform: Make the clock really optional
iio: imu: st_lsm6dsx: fix possible lockup in st_lsm6dsx_read_tagged_fifo
iio: imu: st_lsm6dsx: fix possible lockup in st_lsm6dsx_read_fifo
iio: adis16201: Correct inclinometer channel resolution
iio: adc: ad7606: fix serial register access
staging: iio: adc: ad7816: Correct conditional logic for store mode
Input: synaptics - enable InterTouch on Dell Precision M3800
Input: synaptics - enable InterTouch on Dynabook Portege X30L-G
Input: synaptics - enable InterTouch on Dynabook Portege X30-D
net: dsa: b53: fix learning on VLAN unaware bridges
netfilter: ipset: fix region locking in hash types
sch_htb: make htb_deactivate() idempotent
scsi: target: Fix WRITE_SAME No Data Buffer crash
dm: fix copying after src array boundaries
iommu/amd: Fix potential buffer overflow in parse_ivrs_acpihid
arm64: dts: rockchip: fix iface clock-name on px30 iommus
usb: chipidea: ci_hdrc_imx: implement usb_phy_init() error handling
usb: chipidea: ci_hdrc_imx: use dev_err_probe()
usb: chipidea: imx: refine the error handling for hsic
usb: chipidea: imx: change hsic power regulator as optional
irqchip/gic-v2m: Prevent use after free of gicv2m_get_fwnode()
irqchip/gic-v2m: Mark a few functions __init
irqchip/gic-v2m: Add const to of_device_id
sch_htb: make htb_qlen_notify() idempotent
of: module: add buffer overflow check in of_modalias()
PCI: imx6: Skip controller_id generation logic for i.MX7D
net: fec: ERR007885 Workaround for conventional TX
net: lan743x: Fix memleak issue when GSO enabled
lan743x: fix endianness when accessing descriptors
lan743x: remove redundant initialization of variable current_head_index
nvme-tcp: fix premature queue removal and I/O failover
net: dlink: Correct endianness handling of led_mode
net_sched: qfq: Fix double list add in class with netem as child qdisc
net_sched: hfsc: Fix a UAF vulnerability in class with netem as child qdisc
net_sched: drr: Fix double list add in class with netem as child qdisc
net/mlx5: E-Switch, Initialize MAC Address for Default GID
tracing: Fix oob write in trace_seq_to_buffer()
dm: always update the array size in realloc_argv on success
dm-integrity: fix a warning on invalid table line
wifi: brcm80211: fmac: Add error handling for brcmf_usb_dl_writeimage()
amd-xgbe: Fix to ensure dependent features are toggled with RX checksum offload
parisc: Fix double SIGFPE crash
i2c: imx-lpi2c: Fix clock count when probe defers
EDAC/altera: Set DDR and SDMMC interrupt mask before registration
EDAC/altera: Test the correct error reg offset
ANDROID: binder: fix minimum node priority comparison
ANDROID: 16K: Remove ELF padding entry from map_file ranges
Linux 5.4.293
MIPS: cm: Fix warning if MIPS_CM is disabled
crypto: atmel-sha204a - Set hwrng quality to lowest possible
comedi: jr3_pci: Fix synchronous deletion of timer
md/raid1: Add check for missing source disk in process_checks()
scsi: pm80xx: Set phy_attached to zero when device is gone
x86/bugs: Don't fill RSB on VMEXIT with eIBRS+retpoline
ACPI PPTT: Fix coding mistakes in a couple of sizeof() calls
selftests: ublk: fix test_stripe_04
udmabuf: fix a buf size overflow issue during udmabuf creation
KVM: s390: Don't use %pK through tracepoints
sched/isolation: Make CONFIG_CPU_ISOLATION depend on CONFIG_SMP
ntb: reduce stack usage in idt_scan_mws
qibfs: fix _another_ leak
usb: gadget: aspeed: Add NULL pointer check in ast_vhub_init_dev()
dmaengine: dmatest: Fix dmatest waiting less when interrupted
usb: host: max3421-hcd: Add missing spi_device_id table
parisc: PDT: Fix missing prototype warning
clk: check for disabled clock-provider in of_clk_get_hw_from_clkspec()
crypto: null - Use spin lock instead of mutex
MIPS: cm: Detect CM quirks from device tree
USB: VLI disk crashes if LPM is used
usb: quirks: Add delay init quirk for SanDisk 3.2Gen1 Flash Drive
usb: quirks: add DELAY_INIT quirk for Silicon Motion Flash Drive
usb: dwc3: gadget: check that event count does not exceed event buffer length
USB: OHCI: Add quirk for LS7A OHCI controller (rev 0x02)
usb: cdns3: Fix deadlock when using NCM gadget
USB: serial: simple: add OWON HDS200 series oscilloscope support
USB: serial: option: add Sierra Wireless EM9291
USB: serial: ftdi_sio: add support for Abacus Electrics Optical Probe
serial: sifive: lock port in startup()/shutdown() callbacks
USB: storage: quirk for ADATA Portable HDD CH94
mcb: fix a double free bug in chameleon_parse_gdd()
virtio_console: fix missing byte order handling for cols and rows
net_sched: hfsc: Fix a potential UAF in hfsc_dequeue() too
net_sched: hfsc: Fix a UAF vulnerability in class handling
tipc: fix NULL pointer dereference in tipc_mon_reinit_self()
net: phy: leds: fix memory leak
cpufreq: scpi: Fix null-ptr-deref in scpi_cpufreq_get_rate()
drm/amd/pm: Prevent division by zero
misc: pci_endpoint_test: Fix displaying 'irq_type' after 'request_irq' error
misc: pci_endpoint_test: Use INTX instead of LEGACY
PCI: Rename PCI_IRQ_LEGACY to PCI_IRQ_INTX
iio: adc: ad7768-1: Fix conversion result sign
iio: adc: ad7768-1: Move setting of val a bit later to avoid unnecessary return value check
net: dsa: mv88e6xxx: fix VTU methods for 6320 family
media: vim2m: print device name after registering device
ext4: fix OOB read when checking dotdot dir
ext4: optimize __ext4_check_dir_entry()
ext4: don't over-report free space or inodes in statvfs
ext4: code cleanup for ext4_statfs_project()
ext4: simplify checking quota limits in ext4_statfs()
platform/x86: ISST: Correct command storage data length
MIPS: ds1287: Match ds1287_set_base_clock() function types
MIPS: cevt-ds1287: Add missing ds1287.h include
MIPS: dec: Declare which_prom() as static
virtio-net: Add validation for used length
RDMA/srpt: Support specifying the srpt_service_guid parameter
openvswitch: fix lockup on tx to unregistering netdev with carrier
net: openvswitch: fix race on port output
mmc: cqhci: Fix checking of CQHCI_HALT state
nvmet-fc: Remove unused functions
usb: dwc3: support continuous runtime PM with dual role
misc: pci_endpoint_test: Fix 'irq_type' to convey the correct type
misc: pci_endpoint_test: Avoid issue of interrupts remaining after request_irq error
tcp/dccp: Don't use timer_pending() in reqsk_queue_unlink().
powerpc/prom_init: Use -ffreestanding to avoid a reference to bcmp
kbuild: Add '-fno-builtin-wcslen'
cpufreq: Reference count policy in cpufreq_update_limits()
drm/sti: remove duplicate object names
drm/nouveau: prime: fix ttm_bo_delayed_delete oops
drm/repaper: fix integer overflows in repeat functions
module: sign with sha512 instead of sha1 by default
perf/x86/intel/uncore: Fix the scale of IIO free running counters on SNR
perf/x86/intel: Allow to update user space GPRs from PEBS records
virtiofs: add filesystem context source name check
riscv: Avoid fortify warning in syscall_get_arguments()
isofs: Prevent the use of too small fid
i2c: cros-ec-tunnel: defer probe if parent EC is not present
hfs/hfsplus: fix slab-out-of-bounds in hfs_bnode_read_key
btrfs: correctly escape subvol in btrfs_show_options()
nfs: add missing selections of CONFIG_CRC32
nfs: move nfs_fhandle_hash to common include file
NFSD: Constify @fh argument of knfsd_fh_hash()
asus-laptop: Fix an uninitialized variable
writeback: fix false warning in inode_to_wb()
net: b53: enable BPDU reception for management port
net: openvswitch: fix nested key length validation in the set() action
Revert "wifi: mac80211: Update skb's control block key in ieee80211_tx_dequeue()"
Bluetooth: btrtl: Prevent potential NULL dereference
Bluetooth: hci_event: Fix sending MGMT_EV_DEVICE_FOUND for invalid address
RDMA/usnic: Fix passing zero to PTR_ERR in usnic_ib_pci_probe()
scsi: iscsi: Fix missing scsi_host_put() in error path
wifi: wl1251: fix memory leak in wl1251_tx_work
wifi: mac80211: Purge vif txq in ieee80211_do_stop()
wifi: mac80211: Update skb's control block key in ieee80211_tx_dequeue()
wifi: at76c50x: fix use after free access in at76_disconnect
HSI: ssi_protocol: Fix use after free vulnerability in ssi_protocol Driver Due to Race Condition
pwm: mediatek: always use bus clock for PWM on MT7622
Bluetooth: hci_uart: Fix another race during initialization
x86/e820: Fix handling of subpage regions when calculating nosave ranges in e820__register_nosave_regions()
PCI: Fix reference leak in pci_alloc_child_bus()
of/irq: Fix device node refcount leakages in of_irq_init()
of/irq: Fix device node refcount leakage in API irq_of_parse_and_map()
of/irq: Fix device node refcount leakages in of_irq_count()
ntb: use 64-bit arithmetic for the MSI doorbell mask
gpio: zynq: Fix wakeup source leaks on device unbind
ftrace: Add cond_resched() to ftrace_graph_set_hash()
dm-integrity: set ti->error on memory allocation failure
crypto: ccp - Fix check for the primary ASP device
thermal/drivers/rockchip: Add missing rk3328 mapping entry
sctp: detect and prevent references to a freed transport in sendmsg
mm: add missing release barrier on PGDAT_RECLAIM_LOCKED unlock
sparc/mm: disable preemption in lazy mmu mode
arm64: dts: mediatek: mt8173: Fix disp-pwm compatible string
mtd: rawnand: Add status chack in r852_ready()
mtd: inftlcore: Add error check for inftl_read_oob()
lib: scatterlist: fix sg_split_phys to preserve original scatterlist offsets
locking/lockdep: Decrease nr_unused_locks if lock unused in zap_class()
jbd2: remove wrong sb->s_sequence check
i3c: Add NULL pointer check in i3c_master_queue_ibi()
ext4: fix off-by-one error in do_split
wifi: mac80211: fix integer overflow in hwmp_route_info_get()
net: dsa: mv88e6xxx: workaround RGMII transmit delay erratum for 6320 family
media: venus: hfi_parser: add check to avoid out of bound access
media: i2c: ov7251: Introduce 1 ms delay between regulators and en GPIO
media: i2c: ov7251: Set enable GPIO low in probe
media: v4l2-dv-timings: prevent possible overflow in v4l2_detect_gtf()
media: streamzap: prevent processing IR data on URB failure
mtd: rawnand: brcmnand: fix PM resume warning
arm64: cputype: Add MIDR_CORTEX_A76AE
xenfs/xensyms: respect hypervisor's "next" indication
media: siano: Fix error handling in smsdvb_module_init()
media: venus: hfi: add check to handle incorrect queue size
media: venus: hfi: add a check to handle OOB in sfr region
media: i2c: adv748x: Fix test pattern selection mask
ext4: don't treat fhandle lookup of ea_inode as FS corruption
ext4: reject casefold inode flag without casefold feature
bpf: support SKF_NET_OFF and SKF_LL_OFF on skb frags
bpf: Add endian modifiers to fix endian warnings
pwm: fsl-ftm: Handle clk_get_rate() returning 0
pwm: mediatek: Prevent divide-by-zero in pwm_mediatek_config()
pwm: mediatek: Always use bus clock
fbdev: omapfb: Add 'plane' value check
drm/mediatek: mtk_dpi: Explicitly manage TVD clock in power on/off
drm/amdkfd: Fix pqm_destroy_queue race with GPU reset
drm/amdkfd: clamp queue size to minimum
drm: panel-orientation-quirks: Add new quirk for GPD Win 2
drm: panel-orientation-quirks: Add support for AYANEO 2S
drm: allow encoder mode_set even when connectors change for crtc
Bluetooth: hci_uart: fix race during initialization
tracing: fix return value in __ftrace_event_enable_disable for TRACE_REG_UNREGISTER
net: vlan: don't propagate flags on open
wifi: mt76: mt76x2u: add TP-Link TL-WDN6200 ID to device table
scsi: st: Fix array overflow in st_setup()
ext4: ignore xattrs past end
ext4: protect ext4_release_dquot against freezing
ahci: add PCI ID for Marvell 88SE9215 SATA Controller
ata: libata-eh: Do not use ATAPI DMA for a device limited to PIO mode
jfs: add sanity check for agwidth in dbMount
jfs: Prevent copying of nlink with value 0 from disk inode
fs/jfs: Prevent integer overflow in AG size calculation
fs/jfs: cast inactags to s64 to prevent potential overflow
page_pool: avoid infinite loop to schedule delayed worker
ALSA: usb-audio: Fix CME quirk for UF series keyboards
ALSA: hda: intel: Fix Optimus when GPU has no sound
HID: pidff: Fix null pointer dereference in pidff_find_fields
HID: pidff: Do not send effect envelope if it's empty
HID: pidff: Convert infinite length from Linux API to PID standard
xen/mcelog: Add __nonstring annotations for unterminated strings
perf: arm_pmu: Don't disable counter in armpmu_add()
x86/cpu: Don't clear X86_FEATURE_LAHF_LM flag in init_amd_k8() on AMD when running in a virtual machine
pm: cpupower: bench: Prevent NULL dereference on malloc failure
net: ppp: Add bound checking for skb data on ppp_sync_txmung
ata: sata_sx4: Add error handling in pdc20621_i2c_read()
ata: sata_sx4: Drop pointless VPRINTK() calls and convert the remaining ones
tipc: fix memory leak in tipc_link_xmit
ata: pata_pxa: Fix potential NULL pointer dereference in pxa_ata_probe()
UPSTREAM: net_sched: Prevent creation of classes with TC_H_ROOT
Linux 5.4.292
jfs: add index corruption check to DT_GETPAGE()
jfs: fix slab-out-of-bounds read in ea_get()
tracing: Fix use-after-free in print_graph_function_flags during tracer switching
mmc: sdhci-pxav3: set NEED_RSP_BUSY capability
ACPI: resource: Skip IRQ override on ASUS Vivobook 14 X1404VAP
x86/mm: Fix flush_tlb_range() when used for zapping normal PMDs
x86/tsc: Always save/restore TSC sched_clock() on suspend/resume
ntb_perf: Delete duplicate dmaengine_unmap_put() call in perf_copy_chunk()
can: flexcan: only change CAN state when link up in system PM
arcnet: Add NULL check in com20020pci_probe()
net: dsa: mv88e6xxx: propperly shutdown PPU re-enable timer on destroy
ipv6: fix omitted netlink attributes when using RTEXT_FILTER_SKIP_STATS
vsock: avoid timeout during connect() if the socket is closing
net_sched: skbprio: Remove overly strict queue assertions
netlabel: Fix NULL pointer exception caused by CALIPSO on IPv4 sockets
ntb: intel: Fix using link status DB's
ntb_hw_switchtec: Fix shift-out-of-bounds in switchtec_ntb_mw_set_trans
spufs: fix a leak in spufs_create_context()
spufs: fix a leak on spufs_new_file() failure
hwmon: (nct6775-core) Fix out of bounds access for NCT679{8,9}
can: statistics: use atomic access in hot path
locking/semaphore: Use wake_q to wake up processes outside lock critical section
sched/deadline: Use online cpus for validating runtime
affs: don't write overlarge OFS data block size fields
affs: generate OFS sequence numbers starting at 1
wifi: iwlwifi: fw: allocate chained SG tables for dump
sched/smt: Always inline sched_smt_active()
octeontx2-af: Fix mbox INTR handler when num VFs > 64
ring-buffer: Fix bytes_dropped calculation issue
objtool, media: dib8000: Prevent divide-by-zero in dib8000_set_dds()
fs/procfs: fix the comment above proc_pid_wchan()
perf python: Check if there is space to copy all the event
perf python: Decrement the refcount of just created event on failure
perf python: Fixup description of sample.id event member
ocfs2: validate l_tree_depth to avoid out-of-bounds access
kexec: initialize ELF lowest address to ULONG_MAX
perf units: Fix insufficient array space
iio: accel: mma8452: Ensure error return on failure to matching oversampling ratio
coresight: catu: Fix number of pages while using 64k pages
isofs: fix KMSAN uninit-value bug in do_isofs_readdir()
x86/dumpstack: Fix inaccurate unwinding from exception stacks due to misplaced assignment
mfd: sm501: Switch to BIT() to mitigate integer overflows
RDMA/mlx5: Fix mlx5_poll_one() cur_qp update flow
power: supply: max77693: Fix wrong conversion of charge input threshold value
x86/entry: Fix ORC unwinder for PUSH_REGS with save_ret=1
clk: amlogic: g12a: fix mmc A peripheral clock
clk: amlogic: gxbb: drop non existing 32k clock parent
clk: amlogic: g12b: fix cluster A parent data
IB/mad: Check available slots before posting receive WRs
clk: rockchip: rk3328: fix wrong clk_ref_usb3otg parent
pinctrl: renesas: rza2: Fix missing of_node_put() call
lib: 842: Improve error handling in sw842_compress()
bpf: Use preempt_count() directly in bpf_send_signal_common()
clk: amlogic: gxbb: drop incorrect flag on 32k clock
fbdev: sm501fb: Add some geometry checks.
mdacon: rework dependency list
fbdev: au1100fb: Move a variable assignment behind a null pointer check
PCI: pciehp: Don't enable HPIE when resuming in poll mode
PCI: Remove stray put_device() in pci_register_host_bridge()
PCI/portdrv: Only disable pciehp interrupts early when needed
PCI/ASPM: Fix link state exit during switch upstream function removal
drm/mediatek: mtk_hdmi: Fix typo for aud_sampe_size member
ALSA: hda/realtek: Always honor no_shutup_pins
perf/ring_buffer: Allow the EPOLLRDNORM flag for poll
lockdep: Don't disable interrupts on RT in disable_irq_nosync_lockdep.*()
PM: sleep: Fix handling devices with direct_complete set on errors
thermal: int340x: Add NULL check for adev
EDAC/ie31200: Fix the error path order of ie31200_init()
EDAC/ie31200: Fix the DIMM size mask for several SoCs
EDAC/ie31200: Fix the size of EDAC_MC_LAYER_CHIP_SELECT layer
selinux: Chain up tool resolving errors in install_policy.sh
x86/platform: Only allow CONFIG_EISA for 32-bit
x86/fpu: Avoid copying dynamic FP state from init_task in arch_dup_task_struct()
cpufreq: governor: Fix negative 'idle_time' handling in dbs_update()
x86/mm/pat: cpa-test: fix length for CPA_ARRAY test
serial: 8250_dma: terminate correct DMA in tx_dma_flush()
memstick: rtsx_usb_ms: Fix slab-use-after-free in rtsx_usb_ms_drv_remove
net: usb: usbnet: restore usb%d name exception for local mac addresses
net: usb: qmi_wwan: add Telit Cinterion FE990B composition
net: usb: qmi_wwan: add Telit Cinterion FN990B composition
tty: serial: 8250: Add some more device IDs
counter: stm32-lptimer-cnt: fix error handling when enabling
netfilter: socket: Lookup orig tuple for IPv6 SNAT
ARM: Remove address checking for MMUless devices
ARM: 9351/1: fault: Add "cut here" line for prefetch aborts
ARM: 9350/1: fault: Implement copy_from_kernel_nofault_allowed()
atm: Fix NULL pointer dereference
HID: hid-plantronics: Add mic mute mapping and generalize quirks
ALSA: usb-audio: Add quirk for Plantronics headsets to fix control names
drm/radeon: fix uninitialized size issue in radeon_vce_cs_parse()
batman-adv: Ignore own maximum aggregation size during RX
ARM: shmobile: smp: Enforce shmobile_smp_* alignment
mmc: atmel-mci: Add missing clk_disable_unprepare()
drm/v3d: Don't run jobs that have errors flagged in its fence
i2c: omap: fix IRQ storms
net/neighbor: add missing policy for NDTPA_QUEUE_LENBYTES
net: atm: fix use after free in lec_send()
ipv6: Set errno after ip_fib_metrics_init() in ip6_route_info_create().
ipv6: Fix memleak of nhc_pcpu_rth_output in fib_check_nh_v6_gw().
Bluetooth: Fix error code in chan_alloc_skb_cb()
RDMA/hns: Fix wrong value of max_sge_rd
RDMA/bnxt_re: Avoid clearing VLAN_ID mask in modify qp path
xfrm_output: Force software GSO only in tunnel mode
firmware: imx-scu: fix OF node leak in .probe()
i2c: sis630: Fix an error handling path in sis630_probe()
i2c: ali15x3: Fix an error handling path in ali15x3_probe()
i2c: ali1535: Fix an error handling path in ali1535_probe()
ASoC: codecs: wm0010: Fix error handling path in wm0010_spi_probe()
drm/gma500: Add NULL check for pci_gfx_root in mid_get_vbt_data()
qlcnic: fix memory leak issues in qlcnic_sriov_common.c
drm/amd/display: Assign normalized_pix_clk when color depth = 14
drm/atomic: Filter out redundant DPMS calls
x86/microcode/AMD: Fix out-of-bounds on systems with CPU-less NUMA nodes
USB: serial: option: match on interface class for Telit FN990B
USB: serial: option: fix Telit Cinterion FE990A name
USB: serial: option: add Telit Cinterion FE990B compositions
USB: serial: ftdi_sio: add support for Altera USB Blaster 3
block: fix 'kmem_cache of name 'bio-108' already exists'
drm/nouveau: Do not override forced connector status
x86/irq: Define trace events conditionally
fuse: don't truncate cached, mutated symlink
nvme: only allow entering LIVE from CONNECTING state
sctp: Fix undefined behavior in left shift operation
nvmet-rdma: recheck queue state is LIVE in state lock in recv done
ASoC: rsnd: don't indicate warning on rsnd_kctrl_accept_runtime()
s390/cio: Fix CHPID "configure" attribute caching
HID: ignore non-functional sensor in HP 5MP Camera
HID: intel-ish-hid: fix the length of MNG_SYNC_FW_CLOCK in doorbell
ACPI: resource: IRQ override for Eluktronics MECH-17
scsi: qla1280: Fix kernel oops when debug level > 2
iscsi_ibft: Fix UBSAN shift-out-of-bounds warning in ibft_attr_show_nic()
powercap: call put_device() on an error path in powercap_register_control_type()
hrtimers: Mark is_migration_base() with __always_inline
nvme-fc: go straight to connecting state when initializing
net/mlx5e: Prevent bridge link show failure for non-eswitch-allowed devices
netfilter: nft_exthdr: fix offset with ipv4_find_option()
net_sched: Prevent creation of classes with TC_H_ROOT
ipvs: prevent integer overflow in do_ip_vs_get_ctl()
netfilter: nf_conncount: Fully initialize struct nf_conncount_tuple in insert_tree()
Drivers: hv: vmbus: Don't release fb_mmio resource in vmbus_free_mmio()
drivers/hv: Replace binary semaphore with mutex
netpoll: hold rcu read lock in __netpoll_send_skb()
netpoll: netpoll_send_skb() returns transmit status
netpoll: move netpoll_send_skb() out of line
netpoll: remove dev argument from netpoll_send_skb_on_dev()
netpoll: Fix use correct return type for ndo_start_xmit()
pinctrl: bcm281xx: Fix incorrect regmap max_registers value
sctp: sysctl: auth_enable: avoid using current->nsproxy
sctp: sysctl: cookie_hmac_alg: avoid using current->nsproxy
Revert "sctp: sysctl: auth_enable: avoid using current->nsproxy"
Revert "sctp: sysctl: cookie_hmac_alg: avoid using current->nsproxy"
sched/isolation: Prevent boot crash when the boot CPU is nohz_full
clockevents/drivers/i8253: Fix stop sequence for timer 0
vlan: fix memory leak in vlan_newlink()
UPSTREAM: net: sched: Disallow replacing of child qdisc from one parent to another
UPSTREAM: pfifo_tail_enqueue: Drop new packet when sch->limit == 0
Revert "tasklet: Introduce new initialization API"
Revert "net: usb: rtl8150: use new tasklet API"
Revert "net: usb: rtl8150: enable basic endpoint checking"
Revert "usb: xhci: Add timeout argument in address_device USB HCD callback"
Revert "usb: xhci: Fix NULL pointer dereference on certain command aborts"
Linux 5.4.291
eeprom: digsy_mtc: Make GPIO lookup table match the device
slimbus: messaging: Free transaction ID in delayed interrupt scenario
intel_th: pci: Add Panther Lake-P/U support
intel_th: pci: Add Panther Lake-H support
intel_th: pci: Add Arrow Lake support
Squashfs: check the inode number is not the invalid value of zero
xhci: pci: Fix indentation in the PCI device ID definitions
usb: gadget: Check bmAttributes only if configuration is valid
usb: gadget: Fix setting self-powered state on suspend
usb: gadget: Set self-powered based on MaxPower and bmAttributes
usb: typec: tcpci_rt1711h: Unmask alert interrupts to fix functionality
usb: typec: ucsi: increase timeout for PPM reset operations
usb: atm: cxacru: fix a flaw in existing endpoint checks
usb: renesas_usbhs: Flush the notify_hotplug_work
usb: quirks: Add DELAY_INIT and NO_LPM for Prolific Mass Storage Card Reader
usb: renesas_usbhs: Use devm_usb_get_phy()
usb: renesas_usbhs: Call clk_put()
Revert "drivers/card_reader/rtsx_usb: Restore interrupt based detection"
gpio: rcar: Fix missing of_node_put() call
net: ipv6: fix missing dst ref drop in ila lwtunnel
net: ipv6: fix dst ref loop in ila lwtunnel
net-timestamp: support TCP GSO case for a few missing flags
vlan: enforce underlying device type
ppp: Fix KMSAN uninit-value warning with bpf
be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink
drm/sched: Fix preprocessor guard
hwmon: fix a NULL vs IS_ERR_OR_NULL() check in xgene_hwmon_probe()
llc: do not use skb_get() before dev_queue_xmit()
hwmon: (ad7314) Validate leading zero bits and return error
hwmon: (ntc_thermistor) Fix the ncpXXxh103 sensor table
hwmon: (pmbus) Initialise page count in pmbus_identify()
caif_virtio: fix wrong pointer check in cfv_probe()
net: gso: fix ownership in __udp_gso_segment
HID: intel-ish-hid: Fix use-after-free issue in ishtp_hid_remove()
HID: google: fix unused variable warning under !CONFIG_ACPI
wifi: iwlwifi: limit printed string from FW file
mm/page_alloc: fix uninitialized variable
rapidio: fix an API misues when rio_add_net() fails
rapidio: add check for rio_add_net() in rio_scan_alloc_net()
wifi: nl80211: reject cooked mode if it is set along with other flags
wifi: cfg80211: regulatory: improve invalid hints checking
x86/cpu: Properly parse CPUID leaf 0x2 TLB descriptor 0x63
x86/cpu: Validate CPUID leaf 0x2 EDX output
x86/cacheinfo: Validate CPUID leaf 0x2 EDX output
platform/x86: thinkpad_acpi: Add battery quirk for ThinkPad X131e
drm/radeon: Fix rs400_gpu_init for ATI mobility radeon Xpress 200M
ALSA: hda/realtek: update ALC222 depop optimize
ALSA: hda: intel: Add Dell ALC3271 to power_save denylist
HID: appleir: Fix potential NULL dereference at raw event handle
Revert "of: reserved-memory: Fix using wrong number of cells to get property 'alignment'"
drm/amdgpu: disable BAR resize on Dell G5 SE
drm/amdgpu: Check extended configuration space register when system uses large bar
drm/amdgpu: skip BAR resizing if the bios already did it
acct: perform last write from workqueue
kernel/acct.c: use dedicated helper to access rlimit values
kernel/acct.c: use #elif instead of #end and #elif
drop_monitor: fix incorrect initialization order
pfifo_tail_enqueue: Drop new packet when sch->limit == 0
sched/core: Prevent rescheduling when interrupts are disabled
phy: exynos5-usbdrd: fix MPLL_MULTIPLIER and SSC_REFCLKSEL masks in refclk
phy: tegra: xusb: reset VBUS & ID OVERRIDE
usbnet: gl620a: fix endpoint checking in genelink_bind()
perf/core: Fix low freq setting via IOC_PERIOD
ftrace: Avoid potential division by zero in function_stat_show()
x86/CPU: Fix warm boot hang regression on AMD SC1100 SoC systems
net: mvpp2: cls: Fixed Non IP flow, with vlan tag flow defination.
ipvs: Always clear ipvs_property flag in skb_scrub_packet()
ASoC: es8328: fix route from DAC to output
net: cadence: macb: Synchronize stats calculations
net: loopback: Avoid sending IP packets without an Ethernet header
sunrpc: suppress warnings for unused procfs functions
batman-adv: Drop unmanaged ELP metric worker
batman-adv: Ignore neighbor throughput metrics in error case
acct: block access to kernel internal filesystems
ALSA: hda/conexant: Add quirk for HP ProBook 450 G4 mute LED
nfp: bpf: Add check for nfp_app_ctrl_msg_alloc()
tee: optee: Fix supplicant wait loop
power: supply: da9150-fg: fix potential overflow
flow_dissector: Fix port range key handling in BPF conversion
flow_dissector: Fix handling of mixed port and port-range keys
net: extract port range fields from fl_flow_key
geneve: Suppress list corruption splat in geneve_destroy_tunnels().
gtp: Suppress list corruption splat in gtp_net_exit_batch_rtnl().
geneve: Fix use-after-free in geneve_find_dev().
powerpc/code-patching: Fix KASAN hit by not flagging text patching area as VM_ALLOC
ALSA: hda/realtek: Fixup ALC225 depop procedure
ALSA: hda/realtek - Add type for ALC287
powerpc/64s: Rewrite __real_pte() and __rpte_to_hidx() as static inline
powerpc/64s/mm: Move __real_pte stubs into hash-4k.h
USB: gadget: f_midi: f_midi_complete to call queue_work
usb/gadget: f_midi: Replace tasklet with work
usb/gadget: f_midi: convert tasklets to use new tasklet_setup() API
usb: dwc3: Fix timeout issue during controller enter/exit from halt state
usb: dwc3: Increase DWC3 controller halt timeout
memcg: fix soft lockup in the OOM process
mm: update mark_victim tracepoints fields
crypto: testmgr - some more fixes to RSA test vectors
crypto: testmgr - populate RSA CRT parameters in RSA test vectors
crypto: testmgr - fix version number of RSA tests
crypto: testmgr - Fix wrong test case of RSA
crypto: testmgr - fix wrong key length for pkcs1pad
driver core: bus: Fix double free in driver API bus_register()
scsi: storvsc: Set correct data length for sending SCSI command without payload
vlan: move dev_put into vlan_dev_uninit
vlan: introduce vlan_dev_free_egress_priority
ima: Fix use-after-free on a dentry's dname.name
pps: Fix a use-after-free
btrfs: avoid monopolizing a core when activating a swap file
Revert "btrfs: avoid monopolizing a core when activating a swap file"
x86/i8253: Disable PIT timer 0 when not in use
parport_pc: add support for ASIX AX99100
serial: 8250_pci: add support for ASIX AX99100
can: ems_pci: move ASIX AX99100 ids to pci_ids.h
nilfs2: protect access to buffers with no active references
nilfs2: do not force clear folio if buffer is referenced
nilfs2: do not output warnings when clearing dirty buffers
alpha: replace hardcoded stack offsets with autogenerated ones
ndisc: extend RCU protection in ndisc_send_skb()
openvswitch: use RCU protection in ovs_vport_cmd_fill_info()
arp: use RCU protection in arp_xmit()
neighbour: use RCU protection in __neigh_notify()
neighbour: delete redundant judgment statements
ndisc: use RCU protection in ndisc_alloc_skb()
ipv6: use RCU protection in ip6_default_advmss()
ipv4: use RCU protection in inet_select_addr()
ipv4: use RCU protection in rt_is_expired()
net: add dev_net_rcu() helper
net: treat possible_net_t net pointer as an RCU one and add read_pnet_rcu()
regmap-irq: Add missing kfree()
partitions: mac: fix handling of bogus partition table
gpio: stmpe: Check return value of stmpe_reg_read in stmpe_gpio_irq_sync_unlock
alpha: align stack for page fault and user unaligned trap handlers
serial: 8250: Fix fifo underflow on flush
alpha: make stack 16-byte aligned (most cases)
can: j1939: j1939_sk_send_loop(): fix unable to send messages with data length zero
can: c_can: fix unbalanced runtime PM disable in error path
USB: serial: option: drop MeiG Smart defines
USB: serial: option: fix Telit Cinterion FN990A name
USB: serial: option: add Telit Cinterion FN990B compositions
USB: serial: option: add MeiG Smart SLM828
usb: cdc-acm: Fix handling of oversized fragments
usb: cdc-acm: Check control transfer buffer size before access
USB: cdc-acm: Fill in Renesas R-Car D3 USB Download mode quirk
USB: hub: Ignore non-compliant devices with too many configs or interfaces
usb: gadget: f_midi: fix MIDI Streaming descriptor lengths
USB: Add USB_QUIRK_NO_LPM quirk for sony xperia xz1 smartphone
USB: quirks: add USB_QUIRK_NO_LPM quirk for Teclast dist
USB: pci-quirks: Fix HCCPARAMS register error for LS7A EHCI
usb: dwc2: gadget: remove of_node reference upon udc_stop
usb: gadget: udc: renesas_usb3: Fix compiler warning
usb: roles: set switch registered flag early on
batman-adv: fix panic during interface removal
ASoC: Intel: bytcr_rt5640: Add DMI quirk for Vexia Edu Atla 10 tablet 5V
orangefs: fix a oob in orangefs_debug_write
Grab mm lock before grabbing pt lock
vfio/pci: Enable iowrite64 and ioread64 for vfio pci
media: cxd2841er: fix 64-bit division on gcc-9
x86/xen: allow larger contiguous memory regions in PV guests
xen: remove a confusing comment on auto-translated guest I/O
gpio: bcm-kona: Add missing newline to dev_err format string
gpio: bcm-kona: Make sure GPIO bits are unlocked when requesting IRQ
gpio: bcm-kona: Fix GPIO lock/unlock for banks above bank 0
arm64: cacheinfo: Avoid out-of-bounds write to cacheinfo array
team: better TEAM_OPTION_TYPE_STRING validation
vrf: use RCU protection in l3mdev_l3_out()
ndisc: ndisc_send_redirect() must use dev_get_by_index_rcu()
HID: multitouch: Add NULL check in mt_input_configured
ocfs2: check dir i_size in ocfs2_find_entry
MIPS: ftrace: Declare ftrace_get_parent_ra_addr() as static
ptp: Ensure info->enable callback is always set
net/ncsi: wait for the last response to Deselect Package before configuring channel
misc: fastrpc: Fix registered buffer page address
mtd: onenand: Fix uninitialized retlen in do_otp_read()
NFC: nci: Add bounds checking in nci_hci_create_pipe()
nilfs2: fix possible int overflows in nilfs_fiemap()
ocfs2: handle a symlink read error correctly
ocfs2: fix incorrect CPU endianness conversion causing mount failure
vfio/platform: check the bounds of read/write syscalls
nvmem: core: improve range check for nvmem_cell_write()
crypto: qce - unregister previously registered algos in error path
crypto: qce - fix goto jump in error path
media: uvcvideo: Remove redundant NULL assignment
media: uvcvideo: Fix event flags in uvc_ctrl_send_events
media: ov5640: fix get_light_freq on auto
soc: qcom: smem_state: fix missing of_node_put in error path
kbuild: Move -Wenum-enum-conversion to W=2
powerpc/pseries/eeh: Fix get PE state translation
serial: sh-sci: Do not probe the serial port if its slot in sci_ports[] is in use
serial: sh-sci: Drop __initdata macro for port_cfg
soc: qcom: socinfo: Avoid out of bounds read of serial number
usb: gadget: f_tcm: Don't prepare BOT write request twice
usb: gadget: f_tcm: ep_autoconfig with fullspeed endpoint
usb: gadget: f_tcm: Decrement command ref count on cleanup
usb: gadget: f_tcm: Translate error to sense
wifi: brcmfmac: fix NULL pointer dereference in brcmf_txfinalize()
HID: hid-sensor-hub: don't use stale platform-data on remove
of: reserved-memory: Fix using wrong number of cells to get property 'alignment'
of: Fix of_find_node_opts_by_path() handling of alias+path+options
of: Correct child specifier used as input of the 2nd nexus node
perf bench: Fix undefined behavior in cmpworker()
clk: qcom: clk-rpmh: prevent integer overflow in recalc_rate
clk: qcom: clk-alpha-pll: fix alpha mode configuration
Bluetooth: L2CAP: handle NULL sock pointer in l2cap_sock_alloc
drm/komeda: Add check for komeda_get_layer_fourcc_list()
KVM: s390: vsie: fix some corner-cases when grabbing vsie pages
KVM: Explicitly verify target vCPU is online in kvm_get_vcpu()
arm64: dts: rockchip: increase gmac rx_delay on rk3399-puma
binfmt_flat: Fix integer overflow bug on 32 bit systems
m68k: vga: Fix I/O defines
s390/futex: Fix FUTEX_OP_ANDN implementation
leds: lp8860: Write full EEPROM, not only half of it
cpufreq: s3c64xx: Fix compilation warning
tun: revert fix group permission check
netem: Update sch->q.qlen before qdisc_tree_reduce_backlog()
net: rose: lock the socket in rose_bind()
udp: gso: do not drop small packets when PMTU reduces
tg3: Disable tg3 PCIe AER on system reboot
gpu: drm_dp_cec: fix broken CEC adapter properties check
firmware: iscsi_ibft: fix ISCSI_IBFT Kconfig entry
nvme: handle connectivity loss in nvme_set_queue_count
usb: xhci: Fix NULL pointer dereference on certain command aborts
usb: xhci: Add timeout argument in address_device USB HCD callback
net: usb: rtl8150: enable basic endpoint checking
net: usb: rtl8150: use new tasklet API
tasklet: Introduce new initialization API
kbuild: userprogs: use correct lld when linking through clang
sched: sch_cake: add bounds checks to host bulk flow fairness counts
media: uvcvideo: Remove dangling pointers
media: uvcvideo: Only save async fh if success
nilfs2: handle errors that nilfs_prepare_chunk() may return
nilfs2: eliminate staggered calls to kunmap in nilfs_rename
nilfs2: move page release outside of nilfs_delete_entry and nilfs_set_link
spi-mxs: Fix chipselect glitch
x86/mm: Don't disable PCID when INVLPG has been fixed by microcode
APEI: GHES: Have GHES honor the panic= setting
HID: Wacom: Add PCI Wacom device support
mfd: lpc_ich: Add another Gemini Lake ISA bridge PCI device-id
tomoyo: don't emit warning in tomoyo_write_control()
wifi: brcmsmac: add gain range check to wlc_phy_iqcal_gainparams_nphy()
mmc: core: Respect quirk_max_rate for non-UHS SDIO card
tun: fix group permission check
printk: Fix signed integer overflow when defining LOG_BUF_LEN_MAX
x86/amd_nb: Restrict init function to AMD-based systems
sched: Don't try to catch up excess steal time.
btrfs: convert BUG_ON in btrfs_reloc_cow_block() to proper error handling
btrfs: fix use-after-free when attempting to join an aborted transaction
btrfs: output the reason for open_ctree() failure
usb: gadget: f_tcm: Don't free command immediately
media: uvcvideo: Fix double free in error path
HID: core: Fix assumption that Resolution Multipliers must be in Logical Collections
usb: typec: tcpm: set SRC_SEND_CAPABILITIES timeout to PD_T_SENDER_RESPONSE
drivers/card_reader/rtsx_usb: Restore interrupt based detection
ktest.pl: Check kernelrelease return in get_version
NFSD: Reset cb_seq_status after NFS4ERR_DELAY
hexagon: Fix unbalanced spinlock in die()
hexagon: fix using plain integer as NULL pointer warning in cmpxchg
genksyms: fix memory leak when the same symbol is read from *.symref file
genksyms: fix memory leak when the same symbol is added from source
net: sh_eth: Fix missing rtnl lock in suspend/resume path
vsock: Allow retrying on connect() failure
perf trace: Fix runtime error of index out of bounds
net: davicom: fix UAF in dm9000_drv_remove
net: rose: fix timer races against user threads
PM: hibernate: Add error handling for syscore_suspend()
ipmr: do not call mr_mfc_uses_dev() for unres entries
net: fec: implement TSO descriptor cleanup
ubifs: skip dumping tnc tree when zroot is null
rtc: pcf85063: fix potential OOB write in PCF85063 NVMEM read
dmaengine: ti: edma: fix OF node reference leaks in edma_driver
module: Extend the preempt disabled section in dereference_symbol_descriptor().
ocfs2: mark dquot as inactive if failed to start trans while releasing dquot
scsi: ufs: bsg: Delete bsg_dev when setting up bsg fails
scsi: mpt3sas: Set ioc->manu_pg11.EEDPTagMode directly to 1
staging: media: imx: fix OF node leak in imx_media_add_of_subdevs()
media: uvcvideo: Propagate buf->error to userspace
media: camif-core: Add check for clk_enable()
media: mipi-csis: Add check for clk_enable()
PCI: endpoint: Destroy the EPC device in devm_pci_epc_destroy()
media: lmedm04: Handle errors for lme2510_int_read
media: lmedm04: Use GFP_KERNEL for URB allocation/submission.
media: rc: iguanair: handle timeouts
fbdev: omapfb: Fix an OF node leak in dss_of_port_get_parent_device()
ARM: dts: mediatek: mt7623: fix IR nodename
arm64: dts: mediatek: mt8173-evb: Fix MT6397 PMIC sub-node names
arm64: dts: mediatek: mt8173-evb: Drop regulator-compatible property
rdma/cxgb4: Prevent potential integer overflow on 32bit
RDMA/mlx4: Avoid false error about access to uninitialized gids array
bpf: Send signals asynchronously if !preemptible
perf report: Fix misleading help message about --demangle
perf top: Don't complain about lack of vmlinux when not resolving some kernel samples
padata: fix sysfs store callback check
ktest.pl: Remove unused declarations in run_bisect_test function
perf header: Fix one memory leakage in process_bpf_prog_info()
perf header: Fix one memory leakage in process_bpf_btf()
ASoC: sun4i-spdif: Add clock multiplier settings
tools/testing/selftests/bpf/test_tc_tunnel.sh: Fix wait for server bind
net: sched: Disallow replacing of child qdisc from one parent to another
net/mlxfw: Drop hard coded max FW flash image size
net: let net.core.dev_weight always be non-zero
clk: analogbits: Fix incorrect calculation of vco rate delta
selftests: harness: fix printing of mismatch values in __EXPECT()
selftests/harness: Display signed values correctly
wifi: wlcore: fix unbalanced pm_runtime calls
regulator: of: Implement the unwind path of of_regulator_match()
team: prevent adding a device which is already a team device lower
cpupower: fix TSC MHz calculation
wifi: rtlwifi: pci: wait for firmware loading before releasing memory
wifi: rtlwifi: fix memory leaks and invalid access at probe error path
wifi: rtlwifi: remove unused check_buddy_priv
wifi: rtlwifi: remove unused dualmac control leftovers
wifi: rtlwifi: remove unused timer and related code
rtlwifi: replace usage of found with dedicated list iterator variable
dt-bindings: mmc: controller: clarify the address-cells description
wifi: rtlwifi: usb: fix workqueue leak when probe fails
wifi: rtlwifi: rtl8192se: rise completion of firmware loading as last step
rtlwifi: rtl8192se Rename RT_TRACE to rtl_dbg
wifi: rtlwifi: do not complete firmware loading needlessly
ipmi: ipmb: Add check devm_kasprintf() returned value
drm/amdgpu: Fix potential NULL pointer dereference in atomctrl_get_smc_sclk_range_table
drm/etnaviv: Fix page property being used for non writecombine buffers
partitions: ldm: remove the initial kernel-doc notation
nbd: don't allow reconnect after disconnect
afs: Fix directory format encoding struct
overflow: Allow mixed type arguments
overflow: Correct check_shl_overflow() comment
overflow: Add __must_check attribute to check_*() helpers
udf: Fix use of check_add_overflow() with mixed type arguments
perf cs-etm: Add missing variable in cs_etm__process_queues()
UPSTREAM: f2fs: compress: don't allow unaligned truncation on released compress inode
UPSTREAM: net: core: reject skb_copy(_expand) for fraglist GSO skbs
UPSTREAM: udp: prevent local UDP tunnel packets from being GROed
UPSTREAM: udp: do not transition UDP GRO fraglist partial checksums to unnecessary
UPSTREAM: udp: do not accept non-tunnel GSO skbs landing in a tunnel
UPSTREAM: binder: Return EFAULT if we fail BINDER_ENABLE_ONEWAY_SPAM_DETECTION
ANDROID: ABI: Cuttlefish Symbol update
Revert "net: net_namespace: Optimize the code"
Revert "net: add exit_batch_rtnl() method"
Revert "gtp: use exit_batch_rtnl() method"
Revert "gtp: Use for_each_netdev_rcu() in gtp_genl_dump_pdp()."
Revert "gtp: Destroy device along with udp socket's netns dismantle."
ANDROID: gki - change networking configuration
Linux 5.4.290
Partial revert of xhci: use pm_ptr() instead #ifdef for CONFIG_PM conditionals
xhci: use pm_ptr() instead of #ifdef for CONFIG_PM conditionals
drm/v3d: Assign job pointer to NULL before signaling the fence
Input: xpad - add support for wooting two he (arm)
Input: xpad - add unofficial Xbox 360 wireless receiver clone
Input: atkbd - map F23 key to support default copilot shortcut
Revert "usb: gadget: u_serial: Disable ep before setting port to null to fix the crash caused by port being null"
USB: serial: quatech2: fix null-ptr-deref in qt2_process_read_urb()
ext4: fix slab-use-after-free in ext4_split_extent_at()
ext4: avoid ext4_error()'s caused by ENOMEM in the truncate path
vfio/platform: check the bounds of read/write syscalls
net/xen-netback: prevent UAF in xenvif_flush_hash()
net: xen-netback: hash.c: Use built-in RCU list checking
signal/m68k: Use force_sigsegv(SIGSEGV) in fpsp040_die
m68k: Add missing mmap_read_lock() to sys_cacheflush()
m68k: Update ->thread.esp0 before calling syscall_trace() in ret_from_signal
gfs2: Truncate address space when flipping GFS2_DIF_JDATA flag
irqchip/sunxi-nmi: Add missing SKIP_WAKE flag
scsi: iscsi: Fix redundant response for ISCSI_UEVENT_GET_HOST_STATS request
ASoC: wm8994: Add depends on MFD core
net: fix data-races around sk->sk_forward_alloc
scsi: sg: Fix slab-use-after-free read in sg_release()
ipv6: avoid possible NULL deref in rt6_uncached_list_flush_dev()
hrtimers: Handle CPU state correctly on hotplug
irqchip/gic-v3: Handle CPU_PM_ENTER_FAILED correctly
fs/proc: fix softlockup in __read_vmcore (part 2)
net: ethernet: xgbe: re-add aneg to supported features in PHY quirks
nvmet: propagate npwg topology
poll_wait: add mb() to fix theoretical race between waitqueue_active() and .poll()
kheaders: Ignore silly-rename files
hfs: Sanity check the root record
mac802154: check local interfaces before deleting sdata list
i2c: mux: demux-pinctrl: check initial mux selection, too
drm/v3d: Ensure job pointer is set to NULL after job completion
nfp: bpf: prevent integer overflow in nfp_bpf_event_output()
gtp: Destroy device along with udp socket's netns dismantle.
gtp: Use for_each_netdev_rcu() in gtp_genl_dump_pdp().
gtp: use exit_batch_rtnl() method
net: add exit_batch_rtnl() method
net: net_namespace: Optimize the code
net: ethernet: ti: cpsw_ale: Fix cpsw_ale_get_field()
sctp: sysctl: rto_min/max: avoid using current->nsproxy
ocfs2: fix slab-use-after-free due to dangling pointer dqi_priv
ocfs2: correct return value of ocfs2_local_free_info()
phy: core: Fix that API devm_of_phy_provider_unregister() fails to unregister the phy provider
phy: core: fix code style in devm_of_phy_provider_unregister
arm64: dts: rockchip: add hevc power domain clock to rk3328
arm64: dts: rockchip: add #power-domain-cells to power domain nodes
arm64: dts: rockchip: fix pd_tcpc0 and pd_tcpc1 node position on rk3399
arm64: dts: rockchip: fix defines in pd_vio node for rk3399
iio: inkern: call iio_device_put() only on mapped devices
iio: adc: at91: call input_free_device() on allocated iio_dev
iio: adc: ti-ads124s08: Use gpiod_set_value_cansleep()
iio: gyro: fxas21002c: Fix missing data update in trigger handler
iio: adc: ti-ads8688: fix information leak in triggered buffer
iio: imu: kmx61: fix information leak in triggered buffer
iio: light: vcnl4035: fix information leak in triggered buffer
iio: dummy: iio_simply_dummy_buffer: fix information leak in triggered buffer
iio: pressure: zpa2326: fix information leak in triggered buffer
usb: gadget: f_fs: Remove WARN_ON in functionfs_bind
usb: fix reference leak in usb_new_device()
USB: core: Disable LPM only for non-suspended ports
USB: usblp: return error when setting unsupported protocol
usb: gadget: u_serial: Disable ep before setting port to null to fix the crash caused by port being null
USB: serial: cp210x: add Phoenix Contact UPS Device
usb-storage: Add max sectors quirk for Nokia 208
staging: iio: ad9832: Correct phase range check
staging: iio: ad9834: Correct phase range check
USB: serial: option: add Neoway N723-EA support
USB: serial: option: add MeiG Smart SRM815
drm/amd/display: increase MAX_SURFACES to the value supported by hw
ACPI: resource: Add Asus Vivobook X1504VAP to irq1_level_low_skip_override[]
ACPI: resource: Add TongFang GM5HG0A to irq1_edge_low_force_override[]
drm/amd/display: Add check for granularity in dml ceil/floor helpers
sctp: sysctl: auth_enable: avoid using current->nsproxy
sctp: sysctl: cookie_hmac_alg: avoid using current->nsproxy
dm thin: make get_first_thin use rcu-safe list first function
tls: Fix tls_sw_sendmsg error handling
net_sched: cls_flow: validate TCA_FLOW_RSHIFT attribute
tcp/dccp: allow a connection when sk_max_ack_backlog is zero
tcp/dccp: complete lockless accesses to sk->sk_max_ack_backlog
net: 802: LLC+SNAP OID:PID lookup on start of skb data
ieee802154: ca8210: Add missing check for kfifo_alloc() in ca8210_probe()
dm array: fix cursor index when skipping across block boundaries
dm array: fix unreleased btree blocks on closing a faulty array cursor
dm array: fix releasing a faulty array block twice in dm_array_cursor_end
jbd2: flush filesystem device before updating tail sequence
ANDROID: kernelci build-break for 64-bit riscv clang builds (5.4 only)
Revert "BACKPORT: RISC-V: Stop relying on GCC's register allocator's hueristics"
Revert "ANDROID: declare sp_in_global outside of CONFIG_FRAME_POINTER".
Conflicts:
Makefile
arch/arm64/include/asm/cputype.h
drivers/clk/qcom/clk-alpha-pll.c
drivers/platform/Kconfig
drivers/platform/Makefile
drivers/soc/qcom/socinfo.c
include/linux/pid.h
mm/oom_kill.c
Change-Id: I5ab3bedbb68119a9e80e5d5eca28a8a819798b17
Signed-off-by: kamasali Satyanarayan <quic_kamasali@quicinc.com>
1785 lines
44 KiB
C
1785 lines
44 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* linux/kernel/exit.c
|
|
*
|
|
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
*/
|
|
|
|
#include <linux/mm.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/sched/autogroup.h>
|
|
#include <linux/sched/mm.h>
|
|
#include <linux/sched/stat.h>
|
|
#include <linux/sched/task.h>
|
|
#include <linux/sched/task_stack.h>
|
|
#include <linux/sched/cputime.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/module.h>
|
|
#include <linux/capability.h>
|
|
#include <linux/completion.h>
|
|
#include <linux/personality.h>
|
|
#include <linux/tty.h>
|
|
#include <linux/iocontext.h>
|
|
#include <linux/key.h>
|
|
#include <linux/cpu.h>
|
|
#include <linux/acct.h>
|
|
#include <linux/tsacct_kern.h>
|
|
#include <linux/file.h>
|
|
#include <linux/fdtable.h>
|
|
#include <linux/freezer.h>
|
|
#include <linux/binfmts.h>
|
|
#include <linux/nsproxy.h>
|
|
#include <linux/pid_namespace.h>
|
|
#include <linux/ptrace.h>
|
|
#include <linux/profile.h>
|
|
#include <linux/mount.h>
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/kthread.h>
|
|
#include <linux/mempolicy.h>
|
|
#include <linux/taskstats_kern.h>
|
|
#include <linux/delayacct.h>
|
|
#include <linux/cgroup.h>
|
|
#include <linux/syscalls.h>
|
|
#include <linux/signal.h>
|
|
#include <linux/posix-timers.h>
|
|
#include <linux/cn_proc.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/futex.h>
|
|
#include <linux/pipe_fs_i.h>
|
|
#include <linux/audit.h> /* for audit_free() */
|
|
#include <linux/resource.h>
|
|
#include <linux/blkdev.h>
|
|
#include <linux/task_io_accounting_ops.h>
|
|
#include <linux/tracehook.h>
|
|
#include <linux/fs_struct.h>
|
|
#include <linux/init_task.h>
|
|
#include <linux/perf_event.h>
|
|
#include <trace/events/sched.h>
|
|
#include <linux/hw_breakpoint.h>
|
|
#include <linux/oom.h>
|
|
#include <linux/writeback.h>
|
|
#include <linux/shm.h>
|
|
#include <linux/kcov.h>
|
|
#include <linux/random.h>
|
|
#include <linux/rcuwait.h>
|
|
#include <linux/compat.h>
|
|
#include <linux/sysfs.h>
|
|
|
|
#include <linux/uaccess.h>
|
|
#include <asm/unistd.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/mmu_context.h>
|
|
|
|
/*
|
|
* The default value should be high enough to not crash a system that randomly
|
|
* crashes its kernel from time to time, but low enough to at least not permit
|
|
* overflowing 32-bit refcounts or the ldsem writer count.
|
|
*/
|
|
static unsigned int oops_limit = 10000;
|
|
|
|
#ifdef CONFIG_SYSCTL
|
|
static struct ctl_table kern_exit_table[] = {
|
|
{
|
|
.procname = "oops_limit",
|
|
.data = &oops_limit,
|
|
.maxlen = sizeof(oops_limit),
|
|
.mode = 0644,
|
|
.proc_handler = proc_douintvec,
|
|
},
|
|
{ }
|
|
};
|
|
|
|
static __init int kernel_exit_sysctls_init(void)
|
|
{
|
|
register_sysctl_init("kernel", kern_exit_table);
|
|
return 0;
|
|
}
|
|
late_initcall(kernel_exit_sysctls_init);
|
|
#endif
|
|
|
|
static atomic_t oops_count = ATOMIC_INIT(0);
|
|
|
|
#ifdef CONFIG_SYSFS
|
|
static ssize_t oops_count_show(struct kobject *kobj, struct kobj_attribute *attr,
|
|
char *page)
|
|
{
|
|
return sysfs_emit(page, "%d\n", atomic_read(&oops_count));
|
|
}
|
|
|
|
static struct kobj_attribute oops_count_attr = __ATTR_RO(oops_count);
|
|
|
|
static __init int kernel_exit_sysfs_init(void)
|
|
{
|
|
sysfs_add_file_to_group(kernel_kobj, &oops_count_attr.attr, NULL);
|
|
return 0;
|
|
}
|
|
late_initcall(kernel_exit_sysfs_init);
|
|
#endif
|
|
|
|
static void __unhash_process(struct task_struct *p, bool group_dead)
|
|
{
|
|
nr_threads--;
|
|
detach_pid(p, PIDTYPE_PID);
|
|
if (group_dead) {
|
|
detach_pid(p, PIDTYPE_TGID);
|
|
detach_pid(p, PIDTYPE_PGID);
|
|
detach_pid(p, PIDTYPE_SID);
|
|
|
|
list_del_rcu(&p->tasks);
|
|
list_del_init(&p->sibling);
|
|
__this_cpu_dec(process_counts);
|
|
}
|
|
list_del_rcu(&p->thread_group);
|
|
list_del_rcu(&p->thread_node);
|
|
}
|
|
|
|
/*
|
|
* This function expects the tasklist_lock write-locked.
|
|
*/
|
|
static void __exit_signal(struct task_struct *tsk)
|
|
{
|
|
struct signal_struct *sig = tsk->signal;
|
|
bool group_dead = thread_group_leader(tsk);
|
|
struct sighand_struct *sighand;
|
|
struct tty_struct *tty;
|
|
u64 utime, stime;
|
|
|
|
sighand = rcu_dereference_check(tsk->sighand,
|
|
lockdep_tasklist_lock_is_held());
|
|
spin_lock(&sighand->siglock);
|
|
|
|
#ifdef CONFIG_POSIX_TIMERS
|
|
posix_cpu_timers_exit(tsk);
|
|
if (group_dead) {
|
|
posix_cpu_timers_exit_group(tsk);
|
|
} else {
|
|
/*
|
|
* This can only happen if the caller is de_thread().
|
|
* FIXME: this is the temporary hack, we should teach
|
|
* posix-cpu-timers to handle this case correctly.
|
|
*/
|
|
if (unlikely(has_group_leader_pid(tsk)))
|
|
posix_cpu_timers_exit_group(tsk);
|
|
}
|
|
#endif
|
|
|
|
if (group_dead) {
|
|
tty = sig->tty;
|
|
sig->tty = NULL;
|
|
} else {
|
|
/*
|
|
* If there is any task waiting for the group exit
|
|
* then notify it:
|
|
*/
|
|
if (sig->notify_count > 0 && !--sig->notify_count)
|
|
wake_up_process(sig->group_exit_task);
|
|
|
|
if (tsk == sig->curr_target)
|
|
sig->curr_target = next_thread(tsk);
|
|
}
|
|
|
|
add_device_randomness((const void*) &tsk->se.sum_exec_runtime,
|
|
sizeof(unsigned long long));
|
|
|
|
/*
|
|
* Accumulate here the counters for all threads as they die. We could
|
|
* skip the group leader because it is the last user of signal_struct,
|
|
* but we want to avoid the race with thread_group_cputime() which can
|
|
* see the empty ->thread_head list.
|
|
*/
|
|
task_cputime(tsk, &utime, &stime);
|
|
write_seqlock(&sig->stats_lock);
|
|
sig->utime += utime;
|
|
sig->stime += stime;
|
|
sig->gtime += task_gtime(tsk);
|
|
sig->min_flt += tsk->min_flt;
|
|
sig->maj_flt += tsk->maj_flt;
|
|
sig->nvcsw += tsk->nvcsw;
|
|
sig->nivcsw += tsk->nivcsw;
|
|
sig->inblock += task_io_get_inblock(tsk);
|
|
sig->oublock += task_io_get_oublock(tsk);
|
|
task_io_accounting_add(&sig->ioac, &tsk->ioac);
|
|
sig->sum_sched_runtime += tsk->se.sum_exec_runtime;
|
|
sig->nr_threads--;
|
|
__unhash_process(tsk, group_dead);
|
|
write_sequnlock(&sig->stats_lock);
|
|
|
|
/*
|
|
* Do this under ->siglock, we can race with another thread
|
|
* doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals.
|
|
*/
|
|
flush_sigqueue(&tsk->pending);
|
|
tsk->sighand = NULL;
|
|
spin_unlock(&sighand->siglock);
|
|
|
|
__cleanup_sighand(sighand);
|
|
clear_tsk_thread_flag(tsk, TIF_SIGPENDING);
|
|
if (group_dead) {
|
|
flush_sigqueue(&sig->shared_pending);
|
|
tty_kref_put(tty);
|
|
}
|
|
}
|
|
|
|
static void delayed_put_task_struct(struct rcu_head *rhp)
|
|
{
|
|
struct task_struct *tsk = container_of(rhp, struct task_struct, rcu);
|
|
|
|
perf_event_delayed_put(tsk);
|
|
trace_sched_process_free(tsk);
|
|
put_task_struct(tsk);
|
|
}
|
|
|
|
void put_task_struct_rcu_user(struct task_struct *task)
|
|
{
|
|
if (refcount_dec_and_test(&task->rcu_users))
|
|
call_rcu(&task->rcu, delayed_put_task_struct);
|
|
}
|
|
|
|
void release_task(struct task_struct *p)
|
|
{
|
|
struct task_struct *leader;
|
|
int zap_leader;
|
|
repeat:
|
|
/* don't need to get the RCU readlock here - the process is dead and
|
|
* can't be modifying its own credentials. But shut RCU-lockdep up */
|
|
rcu_read_lock();
|
|
atomic_dec(&__task_cred(p)->user->processes);
|
|
rcu_read_unlock();
|
|
|
|
proc_flush_task(p);
|
|
cgroup_release(p);
|
|
|
|
write_lock_irq(&tasklist_lock);
|
|
ptrace_release_task(p);
|
|
__exit_signal(p);
|
|
|
|
/*
|
|
* If we are the last non-leader member of the thread
|
|
* group, and the leader is zombie, then notify the
|
|
* group leader's parent process. (if it wants notification.)
|
|
*/
|
|
zap_leader = 0;
|
|
leader = p->group_leader;
|
|
if (leader != p && thread_group_empty(leader)
|
|
&& leader->exit_state == EXIT_ZOMBIE) {
|
|
/*
|
|
* If we were the last child thread and the leader has
|
|
* exited already, and the leader's parent ignores SIGCHLD,
|
|
* then we are the one who should release the leader.
|
|
*/
|
|
zap_leader = do_notify_parent(leader, leader->exit_signal);
|
|
if (zap_leader)
|
|
leader->exit_state = EXIT_DEAD;
|
|
}
|
|
|
|
write_unlock_irq(&tasklist_lock);
|
|
release_thread(p);
|
|
put_task_struct_rcu_user(p);
|
|
|
|
p = leader;
|
|
if (unlikely(zap_leader))
|
|
goto repeat;
|
|
}
|
|
|
|
void rcuwait_wake_up(struct rcuwait *w)
|
|
{
|
|
struct task_struct *task;
|
|
|
|
rcu_read_lock();
|
|
|
|
/*
|
|
* Order condition vs @task, such that everything prior to the load
|
|
* of @task is visible. This is the condition as to why the user called
|
|
* rcuwait_trywake() in the first place. Pairs with set_current_state()
|
|
* barrier (A) in rcuwait_wait_event().
|
|
*
|
|
* WAIT WAKE
|
|
* [S] tsk = current [S] cond = true
|
|
* MB (A) MB (B)
|
|
* [L] cond [L] tsk
|
|
*/
|
|
smp_mb(); /* (B) */
|
|
|
|
task = rcu_dereference(w->task);
|
|
if (task)
|
|
wake_up_process(task);
|
|
rcu_read_unlock();
|
|
}
|
|
|
|
/*
|
|
* Determine if a process group is "orphaned", according to the POSIX
|
|
* definition in 2.2.2.52. Orphaned process groups are not to be affected
|
|
* by terminal-generated stop signals. Newly orphaned process groups are
|
|
* to receive a SIGHUP and a SIGCONT.
|
|
*
|
|
* "I ask you, have you ever known what it is to be an orphan?"
|
|
*/
|
|
static int will_become_orphaned_pgrp(struct pid *pgrp,
|
|
struct task_struct *ignored_task)
|
|
{
|
|
struct task_struct *p;
|
|
|
|
do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
|
|
if ((p == ignored_task) ||
|
|
(p->exit_state && thread_group_empty(p)) ||
|
|
is_global_init(p->real_parent))
|
|
continue;
|
|
|
|
if (task_pgrp(p->real_parent) != pgrp &&
|
|
task_session(p->real_parent) == task_session(p))
|
|
return 0;
|
|
} while_each_pid_task(pgrp, PIDTYPE_PGID, p);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int is_current_pgrp_orphaned(void)
|
|
{
|
|
int retval;
|
|
|
|
read_lock(&tasklist_lock);
|
|
retval = will_become_orphaned_pgrp(task_pgrp(current), NULL);
|
|
read_unlock(&tasklist_lock);
|
|
|
|
return retval;
|
|
}
|
|
|
|
static bool has_stopped_jobs(struct pid *pgrp)
|
|
{
|
|
struct task_struct *p;
|
|
|
|
do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
|
|
if (p->signal->flags & SIGNAL_STOP_STOPPED)
|
|
return true;
|
|
} while_each_pid_task(pgrp, PIDTYPE_PGID, p);
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* Check to see if any process groups have become orphaned as
|
|
* a result of our exiting, and if they have any stopped jobs,
|
|
* send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2)
|
|
*/
|
|
static void
|
|
kill_orphaned_pgrp(struct task_struct *tsk, struct task_struct *parent)
|
|
{
|
|
struct pid *pgrp = task_pgrp(tsk);
|
|
struct task_struct *ignored_task = tsk;
|
|
|
|
if (!parent)
|
|
/* exit: our father is in a different pgrp than
|
|
* we are and we were the only connection outside.
|
|
*/
|
|
parent = tsk->real_parent;
|
|
else
|
|
/* reparent: our child is in a different pgrp than
|
|
* we are, and it was the only connection outside.
|
|
*/
|
|
ignored_task = NULL;
|
|
|
|
if (task_pgrp(parent) != pgrp &&
|
|
task_session(parent) == task_session(tsk) &&
|
|
will_become_orphaned_pgrp(pgrp, ignored_task) &&
|
|
has_stopped_jobs(pgrp)) {
|
|
__kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp);
|
|
__kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp);
|
|
}
|
|
}
|
|
|
|
#ifdef CONFIG_MEMCG
|
|
/*
|
|
* A task is exiting. If it owned this mm, find a new owner for the mm.
|
|
*/
|
|
void mm_update_next_owner(struct mm_struct *mm)
|
|
{
|
|
struct task_struct *c, *g, *p = current;
|
|
|
|
retry:
|
|
/*
|
|
* If the exiting or execing task is not the owner, it's
|
|
* someone else's problem.
|
|
*/
|
|
if (mm->owner != p)
|
|
return;
|
|
/*
|
|
* The current owner is exiting/execing and there are no other
|
|
* candidates. Do not leave the mm pointing to a possibly
|
|
* freed task structure.
|
|
*/
|
|
if (atomic_read(&mm->mm_users) <= 1) {
|
|
WRITE_ONCE(mm->owner, NULL);
|
|
return;
|
|
}
|
|
|
|
read_lock(&tasklist_lock);
|
|
/*
|
|
* Search in the children
|
|
*/
|
|
list_for_each_entry(c, &p->children, sibling) {
|
|
if (c->mm == mm)
|
|
goto assign_new_owner;
|
|
}
|
|
|
|
/*
|
|
* Search in the siblings
|
|
*/
|
|
list_for_each_entry(c, &p->real_parent->children, sibling) {
|
|
if (c->mm == mm)
|
|
goto assign_new_owner;
|
|
}
|
|
|
|
/*
|
|
* Search through everything else, we should not get here often.
|
|
*/
|
|
for_each_process(g) {
|
|
if (atomic_read(&mm->mm_users) <= 1)
|
|
break;
|
|
if (g->flags & PF_KTHREAD)
|
|
continue;
|
|
for_each_thread(g, c) {
|
|
if (c->mm == mm)
|
|
goto assign_new_owner;
|
|
if (c->mm)
|
|
break;
|
|
}
|
|
}
|
|
read_unlock(&tasklist_lock);
|
|
/*
|
|
* We found no owner yet mm_users > 1: this implies that we are
|
|
* most likely racing with swapoff (try_to_unuse()) or /proc or
|
|
* ptrace or page migration (get_task_mm()). Mark owner as NULL.
|
|
*/
|
|
WRITE_ONCE(mm->owner, NULL);
|
|
return;
|
|
|
|
assign_new_owner:
|
|
BUG_ON(c == p);
|
|
get_task_struct(c);
|
|
/*
|
|
* The task_lock protects c->mm from changing.
|
|
* We always want mm->owner->mm == mm
|
|
*/
|
|
task_lock(c);
|
|
/*
|
|
* Delay read_unlock() till we have the task_lock()
|
|
* to ensure that c does not slip away underneath us
|
|
*/
|
|
read_unlock(&tasklist_lock);
|
|
if (c->mm != mm) {
|
|
task_unlock(c);
|
|
put_task_struct(c);
|
|
goto retry;
|
|
}
|
|
WRITE_ONCE(mm->owner, c);
|
|
task_unlock(c);
|
|
put_task_struct(c);
|
|
}
|
|
#endif /* CONFIG_MEMCG */
|
|
|
|
/*
|
|
* Turn us into a lazy TLB process if we
|
|
* aren't already..
|
|
*/
|
|
static void exit_mm(void)
|
|
{
|
|
struct mm_struct *mm = current->mm;
|
|
struct core_state *core_state;
|
|
|
|
exit_mm_release(current, mm);
|
|
if (!mm)
|
|
return;
|
|
sync_mm_rss(mm);
|
|
/*
|
|
* Serialize with any possible pending coredump.
|
|
* We must hold mmap_sem around checking core_state
|
|
* and clearing tsk->mm. The core-inducing thread
|
|
* will increment ->nr_threads for each thread in the
|
|
* group with ->mm != NULL.
|
|
*/
|
|
down_read(&mm->mmap_sem);
|
|
core_state = mm->core_state;
|
|
if (core_state) {
|
|
struct core_thread self;
|
|
|
|
up_read(&mm->mmap_sem);
|
|
|
|
self.task = current;
|
|
if (self.task->flags & PF_SIGNALED)
|
|
self.next = xchg(&core_state->dumper.next, &self);
|
|
else
|
|
self.task = NULL;
|
|
/*
|
|
* Implies mb(), the result of xchg() must be visible
|
|
* to core_state->dumper.
|
|
*/
|
|
if (atomic_dec_and_test(&core_state->nr_threads))
|
|
complete(&core_state->startup);
|
|
|
|
for (;;) {
|
|
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
if (!self.task) /* see coredump_finish() */
|
|
break;
|
|
freezable_schedule();
|
|
}
|
|
__set_current_state(TASK_RUNNING);
|
|
down_read(&mm->mmap_sem);
|
|
}
|
|
mmgrab(mm);
|
|
BUG_ON(mm != current->active_mm);
|
|
/* more a memory barrier than a real lock */
|
|
task_lock(current);
|
|
current->mm = NULL;
|
|
up_read(&mm->mmap_sem);
|
|
enter_lazy_tlb(mm, current);
|
|
task_unlock(current);
|
|
mm_update_next_owner(mm);
|
|
mmput(mm);
|
|
if (test_thread_flag(TIF_MEMDIE))
|
|
exit_oom_victim();
|
|
}
|
|
|
|
static struct task_struct *find_alive_thread(struct task_struct *p)
|
|
{
|
|
struct task_struct *t;
|
|
|
|
for_each_thread(p, t) {
|
|
if (!(t->flags & PF_EXITING))
|
|
return t;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static struct task_struct *find_child_reaper(struct task_struct *father,
|
|
struct list_head *dead)
|
|
__releases(&tasklist_lock)
|
|
__acquires(&tasklist_lock)
|
|
{
|
|
struct pid_namespace *pid_ns = task_active_pid_ns(father);
|
|
struct task_struct *reaper = pid_ns->child_reaper;
|
|
struct task_struct *p, *n;
|
|
|
|
if (likely(reaper != father))
|
|
return reaper;
|
|
|
|
reaper = find_alive_thread(father);
|
|
if (reaper) {
|
|
pid_ns->child_reaper = reaper;
|
|
return reaper;
|
|
}
|
|
|
|
write_unlock_irq(&tasklist_lock);
|
|
|
|
list_for_each_entry_safe(p, n, dead, ptrace_entry) {
|
|
list_del_init(&p->ptrace_entry);
|
|
release_task(p);
|
|
}
|
|
|
|
zap_pid_ns_processes(pid_ns);
|
|
write_lock_irq(&tasklist_lock);
|
|
|
|
return father;
|
|
}
|
|
|
|
/*
|
|
* When we die, we re-parent all our children, and try to:
|
|
* 1. give them to another thread in our thread group, if such a member exists
|
|
* 2. give it to the first ancestor process which prctl'd itself as a
|
|
* child_subreaper for its children (like a service manager)
|
|
* 3. give it to the init process (PID 1) in our pid namespace
|
|
*/
|
|
static struct task_struct *find_new_reaper(struct task_struct *father,
|
|
struct task_struct *child_reaper)
|
|
{
|
|
struct task_struct *thread, *reaper;
|
|
|
|
thread = find_alive_thread(father);
|
|
if (thread)
|
|
return thread;
|
|
|
|
if (father->signal->has_child_subreaper) {
|
|
unsigned int ns_level = task_pid(father)->level;
|
|
/*
|
|
* Find the first ->is_child_subreaper ancestor in our pid_ns.
|
|
* We can't check reaper != child_reaper to ensure we do not
|
|
* cross the namespaces, the exiting parent could be injected
|
|
* by setns() + fork().
|
|
* We check pid->level, this is slightly more efficient than
|
|
* task_active_pid_ns(reaper) != task_active_pid_ns(father).
|
|
*/
|
|
for (reaper = father->real_parent;
|
|
task_pid(reaper)->level == ns_level;
|
|
reaper = reaper->real_parent) {
|
|
if (reaper == &init_task)
|
|
break;
|
|
if (!reaper->signal->is_child_subreaper)
|
|
continue;
|
|
thread = find_alive_thread(reaper);
|
|
if (thread)
|
|
return thread;
|
|
}
|
|
}
|
|
|
|
return child_reaper;
|
|
}
|
|
|
|
/*
|
|
* Any that need to be release_task'd are put on the @dead list.
|
|
*/
|
|
static void reparent_leader(struct task_struct *father, struct task_struct *p,
|
|
struct list_head *dead)
|
|
{
|
|
if (unlikely(p->exit_state == EXIT_DEAD))
|
|
return;
|
|
|
|
/* We don't want people slaying init. */
|
|
p->exit_signal = SIGCHLD;
|
|
|
|
/* If it has exited notify the new parent about this child's death. */
|
|
if (!p->ptrace &&
|
|
p->exit_state == EXIT_ZOMBIE && thread_group_empty(p)) {
|
|
if (do_notify_parent(p, p->exit_signal)) {
|
|
p->exit_state = EXIT_DEAD;
|
|
list_add(&p->ptrace_entry, dead);
|
|
}
|
|
}
|
|
|
|
kill_orphaned_pgrp(p, father);
|
|
}
|
|
|
|
/*
|
|
* This does two things:
|
|
*
|
|
* A. Make init inherit all the child processes
|
|
* B. Check to see if any process groups have become orphaned
|
|
* as a result of our exiting, and if they have any stopped
|
|
* jobs, send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2)
|
|
*/
|
|
static void forget_original_parent(struct task_struct *father,
|
|
struct list_head *dead)
|
|
{
|
|
struct task_struct *p, *t, *reaper;
|
|
|
|
if (unlikely(!list_empty(&father->ptraced)))
|
|
exit_ptrace(father, dead);
|
|
|
|
/* Can drop and reacquire tasklist_lock */
|
|
reaper = find_child_reaper(father, dead);
|
|
if (list_empty(&father->children))
|
|
return;
|
|
|
|
reaper = find_new_reaper(father, reaper);
|
|
list_for_each_entry(p, &father->children, sibling) {
|
|
for_each_thread(p, t) {
|
|
t->real_parent = reaper;
|
|
BUG_ON((!t->ptrace) != (t->parent == father));
|
|
if (likely(!t->ptrace))
|
|
t->parent = t->real_parent;
|
|
if (t->pdeath_signal)
|
|
group_send_sig_info(t->pdeath_signal,
|
|
SEND_SIG_NOINFO, t,
|
|
PIDTYPE_TGID);
|
|
}
|
|
/*
|
|
* If this is a threaded reparent there is no need to
|
|
* notify anyone anything has happened.
|
|
*/
|
|
if (!same_thread_group(reaper, father))
|
|
reparent_leader(father, p, dead);
|
|
}
|
|
list_splice_tail_init(&father->children, &reaper->children);
|
|
}
|
|
|
|
/*
|
|
* Send signals to all our closest relatives so that they know
|
|
* to properly mourn us..
|
|
*/
|
|
static void exit_notify(struct task_struct *tsk, int group_dead)
|
|
{
|
|
bool autoreap;
|
|
struct task_struct *p, *n;
|
|
LIST_HEAD(dead);
|
|
|
|
write_lock_irq(&tasklist_lock);
|
|
forget_original_parent(tsk, &dead);
|
|
|
|
if (group_dead)
|
|
kill_orphaned_pgrp(tsk->group_leader, NULL);
|
|
|
|
tsk->exit_state = EXIT_ZOMBIE;
|
|
if (unlikely(tsk->ptrace)) {
|
|
int sig = thread_group_leader(tsk) &&
|
|
thread_group_empty(tsk) &&
|
|
!ptrace_reparented(tsk) ?
|
|
tsk->exit_signal : SIGCHLD;
|
|
autoreap = do_notify_parent(tsk, sig);
|
|
} else if (thread_group_leader(tsk)) {
|
|
autoreap = thread_group_empty(tsk) &&
|
|
do_notify_parent(tsk, tsk->exit_signal);
|
|
} else {
|
|
autoreap = true;
|
|
}
|
|
|
|
if (autoreap) {
|
|
tsk->exit_state = EXIT_DEAD;
|
|
list_add(&tsk->ptrace_entry, &dead);
|
|
}
|
|
|
|
/* mt-exec, de_thread() is waiting for group leader */
|
|
if (unlikely(tsk->signal->notify_count < 0))
|
|
wake_up_process(tsk->signal->group_exit_task);
|
|
write_unlock_irq(&tasklist_lock);
|
|
|
|
list_for_each_entry_safe(p, n, &dead, ptrace_entry) {
|
|
list_del_init(&p->ptrace_entry);
|
|
release_task(p);
|
|
}
|
|
}
|
|
|
|
#ifdef CONFIG_DEBUG_STACK_USAGE
|
|
static void check_stack_usage(void)
|
|
{
|
|
static DEFINE_SPINLOCK(low_water_lock);
|
|
static int lowest_to_date = THREAD_SIZE;
|
|
unsigned long free;
|
|
|
|
free = stack_not_used(current);
|
|
|
|
if (free >= lowest_to_date)
|
|
return;
|
|
|
|
spin_lock(&low_water_lock);
|
|
if (free < lowest_to_date) {
|
|
pr_info("%s (%d) used greatest stack depth: %lu bytes left\n",
|
|
current->comm, task_pid_nr(current), free);
|
|
lowest_to_date = free;
|
|
}
|
|
spin_unlock(&low_water_lock);
|
|
}
|
|
#else
|
|
static inline void check_stack_usage(void) {}
|
|
#endif
|
|
|
|
void __noreturn do_exit(long code)
|
|
{
|
|
struct task_struct *tsk = current;
|
|
int group_dead;
|
|
|
|
/*
|
|
* We can get here from a kernel oops, sometimes with preemption off.
|
|
* Start by checking for critical errors.
|
|
* Then fix up important state like USER_DS and preemption.
|
|
* Then do everything else.
|
|
*/
|
|
|
|
WARN_ON(blk_needs_flush_plug(tsk));
|
|
|
|
if (unlikely(in_interrupt()))
|
|
panic("Aiee, killing interrupt handler!");
|
|
if (unlikely(!tsk->pid))
|
|
panic("Attempted to kill the idle task!");
|
|
|
|
/*
|
|
* If do_exit is called because this processes oopsed, it's possible
|
|
* that get_fs() was left as KERNEL_DS, so reset it to USER_DS before
|
|
* continuing. Amongst other possible reasons, this is to prevent
|
|
* mm_release()->clear_child_tid() from writing to a user-controlled
|
|
* kernel address.
|
|
*/
|
|
set_fs(USER_DS);
|
|
|
|
if (unlikely(in_atomic())) {
|
|
pr_info("note: %s[%d] exited with preempt_count %d\n",
|
|
current->comm, task_pid_nr(current),
|
|
preempt_count());
|
|
preempt_count_set(PREEMPT_ENABLED);
|
|
}
|
|
|
|
profile_task_exit(tsk);
|
|
kcov_task_exit(tsk);
|
|
|
|
ptrace_event(PTRACE_EVENT_EXIT, code);
|
|
|
|
validate_creds_for_do_exit(tsk);
|
|
|
|
/*
|
|
* We're taking recursive faults here in do_exit. Safest is to just
|
|
* leave this task alone and wait for reboot.
|
|
*/
|
|
if (unlikely(tsk->flags & PF_EXITING)) {
|
|
pr_alert("Fixing recursive fault but reboot is needed!\n");
|
|
futex_exit_recursive(tsk);
|
|
set_current_state(TASK_UNINTERRUPTIBLE);
|
|
schedule();
|
|
}
|
|
|
|
exit_signals(tsk); /* sets PF_EXITING */
|
|
|
|
/* sync mm's RSS info before statistics gathering */
|
|
if (tsk->mm)
|
|
sync_mm_rss(tsk->mm);
|
|
acct_update_integrals(tsk);
|
|
group_dead = atomic_dec_and_test(&tsk->signal->live);
|
|
if (group_dead) {
|
|
/*
|
|
* If the last thread of global init has exited, panic
|
|
* immediately to get a useable coredump.
|
|
*/
|
|
if (unlikely(is_global_init(tsk)))
|
|
panic("Attempted to kill init! exitcode=0x%08x\n",
|
|
tsk->signal->group_exit_code ?: (int)code);
|
|
|
|
#ifdef CONFIG_POSIX_TIMERS
|
|
hrtimer_cancel(&tsk->signal->real_timer);
|
|
exit_itimers(tsk->signal);
|
|
#endif
|
|
if (tsk->mm)
|
|
setmax_mm_hiwater_rss(&tsk->signal->maxrss, tsk->mm);
|
|
}
|
|
acct_collect(code, group_dead);
|
|
if (group_dead)
|
|
tty_audit_exit();
|
|
audit_free(tsk);
|
|
|
|
tsk->exit_code = code;
|
|
taskstats_exit(tsk, group_dead);
|
|
|
|
/*
|
|
* Since sampling can touch ->mm, make sure to stop everything before we
|
|
* tear it down.
|
|
*
|
|
* Also flushes inherited counters to the parent - before the parent
|
|
* gets woken up by child-exit notifications.
|
|
*/
|
|
perf_event_exit_task(tsk);
|
|
|
|
exit_mm();
|
|
|
|
if (group_dead)
|
|
acct_process();
|
|
trace_sched_process_exit(tsk);
|
|
|
|
exit_sem(tsk);
|
|
exit_shm(tsk);
|
|
exit_files(tsk);
|
|
exit_fs(tsk);
|
|
if (group_dead)
|
|
disassociate_ctty(1);
|
|
exit_task_namespaces(tsk);
|
|
exit_task_work(tsk);
|
|
exit_thread(tsk);
|
|
exit_umh(tsk);
|
|
|
|
sched_autogroup_exit_task(tsk);
|
|
cgroup_exit(tsk);
|
|
|
|
/*
|
|
* FIXME: do that only when needed, using sched_exit tracepoint
|
|
*/
|
|
flush_ptrace_hw_breakpoint(tsk);
|
|
|
|
exit_tasks_rcu_start();
|
|
exit_notify(tsk, group_dead);
|
|
proc_exit_connector(tsk);
|
|
mpol_put_task_policy(tsk);
|
|
#ifdef CONFIG_FUTEX
|
|
if (unlikely(current->pi_state_cache))
|
|
kfree(current->pi_state_cache);
|
|
#endif
|
|
/*
|
|
* Make sure we are holding no locks:
|
|
*/
|
|
debug_check_no_locks_held();
|
|
|
|
if (tsk->io_context)
|
|
exit_io_context(tsk);
|
|
|
|
if (tsk->splice_pipe)
|
|
free_pipe_info(tsk->splice_pipe);
|
|
|
|
if (tsk->task_frag.page)
|
|
put_page(tsk->task_frag.page);
|
|
|
|
validate_creds_for_do_exit(tsk);
|
|
|
|
check_stack_usage();
|
|
preempt_disable();
|
|
if (tsk->nr_dirtied)
|
|
__this_cpu_add(dirty_throttle_leaks, tsk->nr_dirtied);
|
|
exit_rcu();
|
|
exit_tasks_rcu_finish();
|
|
|
|
lockdep_free_task(tsk);
|
|
do_task_dead();
|
|
}
|
|
EXPORT_SYMBOL_GPL(do_exit);
|
|
|
|
void __noreturn make_task_dead(int signr)
|
|
{
|
|
/*
|
|
* Take the task off the cpu after something catastrophic has
|
|
* happened.
|
|
*/
|
|
unsigned int limit;
|
|
|
|
/*
|
|
* Every time the system oopses, if the oops happens while a reference
|
|
* to an object was held, the reference leaks.
|
|
* If the oops doesn't also leak memory, repeated oopsing can cause
|
|
* reference counters to wrap around (if they're not using refcount_t).
|
|
* This means that repeated oopsing can make unexploitable-looking bugs
|
|
* exploitable through repeated oopsing.
|
|
* To make sure this can't happen, place an upper bound on how often the
|
|
* kernel may oops without panic().
|
|
*/
|
|
limit = READ_ONCE(oops_limit);
|
|
if (atomic_inc_return(&oops_count) >= limit && limit)
|
|
panic("Oopsed too often (kernel.oops_limit is %d)", limit);
|
|
|
|
do_exit(signr);
|
|
}
|
|
|
|
void complete_and_exit(struct completion *comp, long code)
|
|
{
|
|
if (comp)
|
|
complete(comp);
|
|
|
|
do_exit(code);
|
|
}
|
|
EXPORT_SYMBOL(complete_and_exit);
|
|
|
|
SYSCALL_DEFINE1(exit, int, error_code)
|
|
{
|
|
do_exit((error_code&0xff)<<8);
|
|
}
|
|
|
|
/*
|
|
* Take down every thread in the group. This is called by fatal signals
|
|
* as well as by sys_exit_group (below).
|
|
*/
|
|
void
|
|
do_group_exit(int exit_code)
|
|
{
|
|
struct signal_struct *sig = current->signal;
|
|
|
|
BUG_ON(exit_code & 0x80); /* core dumps don't get here */
|
|
|
|
if (signal_group_exit(sig))
|
|
exit_code = sig->group_exit_code;
|
|
else if (!thread_group_empty(current)) {
|
|
struct sighand_struct *const sighand = current->sighand;
|
|
|
|
spin_lock_irq(&sighand->siglock);
|
|
if (signal_group_exit(sig))
|
|
/* Another thread got here before we took the lock. */
|
|
exit_code = sig->group_exit_code;
|
|
else {
|
|
sig->group_exit_code = exit_code;
|
|
sig->flags = SIGNAL_GROUP_EXIT;
|
|
zap_other_threads(current);
|
|
}
|
|
spin_unlock_irq(&sighand->siglock);
|
|
}
|
|
|
|
do_exit(exit_code);
|
|
/* NOTREACHED */
|
|
}
|
|
|
|
/*
|
|
* this kills every thread in the thread group. Note that any externally
|
|
* wait4()-ing process will get the correct exit code - even if this
|
|
* thread is not the thread group leader.
|
|
*/
|
|
SYSCALL_DEFINE1(exit_group, int, error_code)
|
|
{
|
|
do_group_exit((error_code & 0xff) << 8);
|
|
/* NOTREACHED */
|
|
return 0;
|
|
}
|
|
|
|
struct waitid_info {
|
|
pid_t pid;
|
|
uid_t uid;
|
|
int status;
|
|
int cause;
|
|
};
|
|
|
|
struct wait_opts {
|
|
enum pid_type wo_type;
|
|
int wo_flags;
|
|
struct pid *wo_pid;
|
|
|
|
struct waitid_info *wo_info;
|
|
int wo_stat;
|
|
struct rusage *wo_rusage;
|
|
|
|
wait_queue_entry_t child_wait;
|
|
int notask_error;
|
|
};
|
|
|
|
static int eligible_pid(struct wait_opts *wo, struct task_struct *p)
|
|
{
|
|
return wo->wo_type == PIDTYPE_MAX ||
|
|
task_pid_type(p, wo->wo_type) == wo->wo_pid;
|
|
}
|
|
|
|
static int
|
|
eligible_child(struct wait_opts *wo, bool ptrace, struct task_struct *p)
|
|
{
|
|
if (!eligible_pid(wo, p))
|
|
return 0;
|
|
|
|
/*
|
|
* Wait for all children (clone and not) if __WALL is set or
|
|
* if it is traced by us.
|
|
*/
|
|
if (ptrace || (wo->wo_flags & __WALL))
|
|
return 1;
|
|
|
|
/*
|
|
* Otherwise, wait for clone children *only* if __WCLONE is set;
|
|
* otherwise, wait for non-clone children *only*.
|
|
*
|
|
* Note: a "clone" child here is one that reports to its parent
|
|
* using a signal other than SIGCHLD, or a non-leader thread which
|
|
* we can only see if it is traced by us.
|
|
*/
|
|
if ((p->exit_signal != SIGCHLD) ^ !!(wo->wo_flags & __WCLONE))
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Handle sys_wait4 work for one task in state EXIT_ZOMBIE. We hold
|
|
* read_lock(&tasklist_lock) on entry. If we return zero, we still hold
|
|
* the lock and this task is uninteresting. If we return nonzero, we have
|
|
* released the lock and the system call should return.
|
|
*/
|
|
static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
|
|
{
|
|
int state, status;
|
|
pid_t pid = task_pid_vnr(p);
|
|
uid_t uid = from_kuid_munged(current_user_ns(), task_uid(p));
|
|
struct waitid_info *infop;
|
|
|
|
if (!likely(wo->wo_flags & WEXITED))
|
|
return 0;
|
|
|
|
if (unlikely(wo->wo_flags & WNOWAIT)) {
|
|
status = p->exit_code;
|
|
get_task_struct(p);
|
|
read_unlock(&tasklist_lock);
|
|
sched_annotate_sleep();
|
|
if (wo->wo_rusage)
|
|
getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
|
|
put_task_struct(p);
|
|
goto out_info;
|
|
}
|
|
/*
|
|
* Move the task's state to DEAD/TRACE, only one thread can do this.
|
|
*/
|
|
state = (ptrace_reparented(p) && thread_group_leader(p)) ?
|
|
EXIT_TRACE : EXIT_DEAD;
|
|
if (cmpxchg(&p->exit_state, EXIT_ZOMBIE, state) != EXIT_ZOMBIE)
|
|
return 0;
|
|
/*
|
|
* We own this thread, nobody else can reap it.
|
|
*/
|
|
read_unlock(&tasklist_lock);
|
|
sched_annotate_sleep();
|
|
|
|
/*
|
|
* Check thread_group_leader() to exclude the traced sub-threads.
|
|
*/
|
|
if (state == EXIT_DEAD && thread_group_leader(p)) {
|
|
struct signal_struct *sig = p->signal;
|
|
struct signal_struct *psig = current->signal;
|
|
unsigned long maxrss;
|
|
u64 tgutime, tgstime;
|
|
|
|
/*
|
|
* The resource counters for the group leader are in its
|
|
* own task_struct. Those for dead threads in the group
|
|
* are in its signal_struct, as are those for the child
|
|
* processes it has previously reaped. All these
|
|
* accumulate in the parent's signal_struct c* fields.
|
|
*
|
|
* We don't bother to take a lock here to protect these
|
|
* p->signal fields because the whole thread group is dead
|
|
* and nobody can change them.
|
|
*
|
|
* psig->stats_lock also protects us from our sub-theads
|
|
* which can reap other children at the same time. Until
|
|
* we change k_getrusage()-like users to rely on this lock
|
|
* we have to take ->siglock as well.
|
|
*
|
|
* We use thread_group_cputime_adjusted() to get times for
|
|
* the thread group, which consolidates times for all threads
|
|
* in the group including the group leader.
|
|
*/
|
|
thread_group_cputime_adjusted(p, &tgutime, &tgstime);
|
|
spin_lock_irq(¤t->sighand->siglock);
|
|
write_seqlock(&psig->stats_lock);
|
|
psig->cutime += tgutime + sig->cutime;
|
|
psig->cstime += tgstime + sig->cstime;
|
|
psig->cgtime += task_gtime(p) + sig->gtime + sig->cgtime;
|
|
psig->cmin_flt +=
|
|
p->min_flt + sig->min_flt + sig->cmin_flt;
|
|
psig->cmaj_flt +=
|
|
p->maj_flt + sig->maj_flt + sig->cmaj_flt;
|
|
psig->cnvcsw +=
|
|
p->nvcsw + sig->nvcsw + sig->cnvcsw;
|
|
psig->cnivcsw +=
|
|
p->nivcsw + sig->nivcsw + sig->cnivcsw;
|
|
psig->cinblock +=
|
|
task_io_get_inblock(p) +
|
|
sig->inblock + sig->cinblock;
|
|
psig->coublock +=
|
|
task_io_get_oublock(p) +
|
|
sig->oublock + sig->coublock;
|
|
maxrss = max(sig->maxrss, sig->cmaxrss);
|
|
if (psig->cmaxrss < maxrss)
|
|
psig->cmaxrss = maxrss;
|
|
task_io_accounting_add(&psig->ioac, &p->ioac);
|
|
task_io_accounting_add(&psig->ioac, &sig->ioac);
|
|
write_sequnlock(&psig->stats_lock);
|
|
spin_unlock_irq(¤t->sighand->siglock);
|
|
}
|
|
|
|
if (wo->wo_rusage)
|
|
getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
|
|
status = (p->signal->flags & SIGNAL_GROUP_EXIT)
|
|
? p->signal->group_exit_code : p->exit_code;
|
|
wo->wo_stat = status;
|
|
|
|
if (state == EXIT_TRACE) {
|
|
write_lock_irq(&tasklist_lock);
|
|
/* We dropped tasklist, ptracer could die and untrace */
|
|
ptrace_unlink(p);
|
|
|
|
/* If parent wants a zombie, don't release it now */
|
|
state = EXIT_ZOMBIE;
|
|
if (do_notify_parent(p, p->exit_signal))
|
|
state = EXIT_DEAD;
|
|
p->exit_state = state;
|
|
write_unlock_irq(&tasklist_lock);
|
|
}
|
|
if (state == EXIT_DEAD)
|
|
release_task(p);
|
|
|
|
out_info:
|
|
infop = wo->wo_info;
|
|
if (infop) {
|
|
if ((status & 0x7f) == 0) {
|
|
infop->cause = CLD_EXITED;
|
|
infop->status = status >> 8;
|
|
} else {
|
|
infop->cause = (status & 0x80) ? CLD_DUMPED : CLD_KILLED;
|
|
infop->status = status & 0x7f;
|
|
}
|
|
infop->pid = pid;
|
|
infop->uid = uid;
|
|
}
|
|
|
|
return pid;
|
|
}
|
|
|
|
static int *task_stopped_code(struct task_struct *p, bool ptrace)
|
|
{
|
|
if (ptrace) {
|
|
if (task_is_traced(p) && !(p->jobctl & JOBCTL_LISTENING))
|
|
return &p->exit_code;
|
|
} else {
|
|
if (p->signal->flags & SIGNAL_STOP_STOPPED)
|
|
return &p->signal->group_exit_code;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/**
|
|
* wait_task_stopped - Wait for %TASK_STOPPED or %TASK_TRACED
|
|
* @wo: wait options
|
|
* @ptrace: is the wait for ptrace
|
|
* @p: task to wait for
|
|
*
|
|
* Handle sys_wait4() work for %p in state %TASK_STOPPED or %TASK_TRACED.
|
|
*
|
|
* CONTEXT:
|
|
* read_lock(&tasklist_lock), which is released if return value is
|
|
* non-zero. Also, grabs and releases @p->sighand->siglock.
|
|
*
|
|
* RETURNS:
|
|
* 0 if wait condition didn't exist and search for other wait conditions
|
|
* should continue. Non-zero return, -errno on failure and @p's pid on
|
|
* success, implies that tasklist_lock is released and wait condition
|
|
* search should terminate.
|
|
*/
|
|
static int wait_task_stopped(struct wait_opts *wo,
|
|
int ptrace, struct task_struct *p)
|
|
{
|
|
struct waitid_info *infop;
|
|
int exit_code, *p_code, why;
|
|
uid_t uid = 0; /* unneeded, required by compiler */
|
|
pid_t pid;
|
|
|
|
/*
|
|
* Traditionally we see ptrace'd stopped tasks regardless of options.
|
|
*/
|
|
if (!ptrace && !(wo->wo_flags & WUNTRACED))
|
|
return 0;
|
|
|
|
if (!task_stopped_code(p, ptrace))
|
|
return 0;
|
|
|
|
exit_code = 0;
|
|
spin_lock_irq(&p->sighand->siglock);
|
|
|
|
p_code = task_stopped_code(p, ptrace);
|
|
if (unlikely(!p_code))
|
|
goto unlock_sig;
|
|
|
|
exit_code = *p_code;
|
|
if (!exit_code)
|
|
goto unlock_sig;
|
|
|
|
if (!unlikely(wo->wo_flags & WNOWAIT))
|
|
*p_code = 0;
|
|
|
|
uid = from_kuid_munged(current_user_ns(), task_uid(p));
|
|
unlock_sig:
|
|
spin_unlock_irq(&p->sighand->siglock);
|
|
if (!exit_code)
|
|
return 0;
|
|
|
|
/*
|
|
* Now we are pretty sure this task is interesting.
|
|
* Make sure it doesn't get reaped out from under us while we
|
|
* give up the lock and then examine it below. We don't want to
|
|
* keep holding onto the tasklist_lock while we call getrusage and
|
|
* possibly take page faults for user memory.
|
|
*/
|
|
get_task_struct(p);
|
|
pid = task_pid_vnr(p);
|
|
why = ptrace ? CLD_TRAPPED : CLD_STOPPED;
|
|
read_unlock(&tasklist_lock);
|
|
sched_annotate_sleep();
|
|
if (wo->wo_rusage)
|
|
getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
|
|
put_task_struct(p);
|
|
|
|
if (likely(!(wo->wo_flags & WNOWAIT)))
|
|
wo->wo_stat = (exit_code << 8) | 0x7f;
|
|
|
|
infop = wo->wo_info;
|
|
if (infop) {
|
|
infop->cause = why;
|
|
infop->status = exit_code;
|
|
infop->pid = pid;
|
|
infop->uid = uid;
|
|
}
|
|
return pid;
|
|
}
|
|
|
|
/*
|
|
* Handle do_wait work for one task in a live, non-stopped state.
|
|
* read_lock(&tasklist_lock) on entry. If we return zero, we still hold
|
|
* the lock and this task is uninteresting. If we return nonzero, we have
|
|
* released the lock and the system call should return.
|
|
*/
|
|
static int wait_task_continued(struct wait_opts *wo, struct task_struct *p)
|
|
{
|
|
struct waitid_info *infop;
|
|
pid_t pid;
|
|
uid_t uid;
|
|
|
|
if (!unlikely(wo->wo_flags & WCONTINUED))
|
|
return 0;
|
|
|
|
if (!(p->signal->flags & SIGNAL_STOP_CONTINUED))
|
|
return 0;
|
|
|
|
spin_lock_irq(&p->sighand->siglock);
|
|
/* Re-check with the lock held. */
|
|
if (!(p->signal->flags & SIGNAL_STOP_CONTINUED)) {
|
|
spin_unlock_irq(&p->sighand->siglock);
|
|
return 0;
|
|
}
|
|
if (!unlikely(wo->wo_flags & WNOWAIT))
|
|
p->signal->flags &= ~SIGNAL_STOP_CONTINUED;
|
|
uid = from_kuid_munged(current_user_ns(), task_uid(p));
|
|
spin_unlock_irq(&p->sighand->siglock);
|
|
|
|
pid = task_pid_vnr(p);
|
|
get_task_struct(p);
|
|
read_unlock(&tasklist_lock);
|
|
sched_annotate_sleep();
|
|
if (wo->wo_rusage)
|
|
getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
|
|
put_task_struct(p);
|
|
|
|
infop = wo->wo_info;
|
|
if (!infop) {
|
|
wo->wo_stat = 0xffff;
|
|
} else {
|
|
infop->cause = CLD_CONTINUED;
|
|
infop->pid = pid;
|
|
infop->uid = uid;
|
|
infop->status = SIGCONT;
|
|
}
|
|
return pid;
|
|
}
|
|
|
|
/*
|
|
* Consider @p for a wait by @parent.
|
|
*
|
|
* -ECHILD should be in ->notask_error before the first call.
|
|
* Returns nonzero for a final return, when we have unlocked tasklist_lock.
|
|
* Returns zero if the search for a child should continue;
|
|
* then ->notask_error is 0 if @p is an eligible child,
|
|
* or still -ECHILD.
|
|
*/
|
|
static int wait_consider_task(struct wait_opts *wo, int ptrace,
|
|
struct task_struct *p)
|
|
{
|
|
/*
|
|
* We can race with wait_task_zombie() from another thread.
|
|
* Ensure that EXIT_ZOMBIE -> EXIT_DEAD/EXIT_TRACE transition
|
|
* can't confuse the checks below.
|
|
*/
|
|
int exit_state = READ_ONCE(p->exit_state);
|
|
int ret;
|
|
|
|
if (unlikely(exit_state == EXIT_DEAD))
|
|
return 0;
|
|
|
|
ret = eligible_child(wo, ptrace, p);
|
|
if (!ret)
|
|
return ret;
|
|
|
|
if (unlikely(exit_state == EXIT_TRACE)) {
|
|
/*
|
|
* ptrace == 0 means we are the natural parent. In this case
|
|
* we should clear notask_error, debugger will notify us.
|
|
*/
|
|
if (likely(!ptrace))
|
|
wo->notask_error = 0;
|
|
return 0;
|
|
}
|
|
|
|
if (likely(!ptrace) && unlikely(p->ptrace)) {
|
|
/*
|
|
* If it is traced by its real parent's group, just pretend
|
|
* the caller is ptrace_do_wait() and reap this child if it
|
|
* is zombie.
|
|
*
|
|
* This also hides group stop state from real parent; otherwise
|
|
* a single stop can be reported twice as group and ptrace stop.
|
|
* If a ptracer wants to distinguish these two events for its
|
|
* own children it should create a separate process which takes
|
|
* the role of real parent.
|
|
*/
|
|
if (!ptrace_reparented(p))
|
|
ptrace = 1;
|
|
}
|
|
|
|
/* slay zombie? */
|
|
if (exit_state == EXIT_ZOMBIE) {
|
|
/* we don't reap group leaders with subthreads */
|
|
if (!delay_group_leader(p)) {
|
|
/*
|
|
* A zombie ptracee is only visible to its ptracer.
|
|
* Notification and reaping will be cascaded to the
|
|
* real parent when the ptracer detaches.
|
|
*/
|
|
if (unlikely(ptrace) || likely(!p->ptrace))
|
|
return wait_task_zombie(wo, p);
|
|
}
|
|
|
|
/*
|
|
* Allow access to stopped/continued state via zombie by
|
|
* falling through. Clearing of notask_error is complex.
|
|
*
|
|
* When !@ptrace:
|
|
*
|
|
* If WEXITED is set, notask_error should naturally be
|
|
* cleared. If not, subset of WSTOPPED|WCONTINUED is set,
|
|
* so, if there are live subthreads, there are events to
|
|
* wait for. If all subthreads are dead, it's still safe
|
|
* to clear - this function will be called again in finite
|
|
* amount time once all the subthreads are released and
|
|
* will then return without clearing.
|
|
*
|
|
* When @ptrace:
|
|
*
|
|
* Stopped state is per-task and thus can't change once the
|
|
* target task dies. Only continued and exited can happen.
|
|
* Clear notask_error if WCONTINUED | WEXITED.
|
|
*/
|
|
if (likely(!ptrace) || (wo->wo_flags & (WCONTINUED | WEXITED)))
|
|
wo->notask_error = 0;
|
|
} else {
|
|
/*
|
|
* @p is alive and it's gonna stop, continue or exit, so
|
|
* there always is something to wait for.
|
|
*/
|
|
wo->notask_error = 0;
|
|
}
|
|
|
|
/*
|
|
* Wait for stopped. Depending on @ptrace, different stopped state
|
|
* is used and the two don't interact with each other.
|
|
*/
|
|
ret = wait_task_stopped(wo, ptrace, p);
|
|
if (ret)
|
|
return ret;
|
|
|
|
/*
|
|
* Wait for continued. There's only one continued state and the
|
|
* ptracer can consume it which can confuse the real parent. Don't
|
|
* use WCONTINUED from ptracer. You don't need or want it.
|
|
*/
|
|
return wait_task_continued(wo, p);
|
|
}
|
|
|
|
/*
|
|
* Do the work of do_wait() for one thread in the group, @tsk.
|
|
*
|
|
* -ECHILD should be in ->notask_error before the first call.
|
|
* Returns nonzero for a final return, when we have unlocked tasklist_lock.
|
|
* Returns zero if the search for a child should continue; then
|
|
* ->notask_error is 0 if there were any eligible children,
|
|
* or still -ECHILD.
|
|
*/
|
|
static int do_wait_thread(struct wait_opts *wo, struct task_struct *tsk)
|
|
{
|
|
struct task_struct *p;
|
|
|
|
list_for_each_entry(p, &tsk->children, sibling) {
|
|
int ret = wait_consider_task(wo, 0, p);
|
|
|
|
if (ret)
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int ptrace_do_wait(struct wait_opts *wo, struct task_struct *tsk)
|
|
{
|
|
struct task_struct *p;
|
|
|
|
list_for_each_entry(p, &tsk->ptraced, ptrace_entry) {
|
|
int ret = wait_consider_task(wo, 1, p);
|
|
|
|
if (ret)
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int child_wait_callback(wait_queue_entry_t *wait, unsigned mode,
|
|
int sync, void *key)
|
|
{
|
|
struct wait_opts *wo = container_of(wait, struct wait_opts,
|
|
child_wait);
|
|
struct task_struct *p = key;
|
|
|
|
if (!eligible_pid(wo, p))
|
|
return 0;
|
|
|
|
if ((wo->wo_flags & __WNOTHREAD) && wait->private != p->parent)
|
|
return 0;
|
|
|
|
return default_wake_function(wait, mode, sync, key);
|
|
}
|
|
|
|
void __wake_up_parent(struct task_struct *p, struct task_struct *parent)
|
|
{
|
|
__wake_up_sync_key(&parent->signal->wait_chldexit,
|
|
TASK_INTERRUPTIBLE, 1, p);
|
|
}
|
|
|
|
static long do_wait(struct wait_opts *wo)
|
|
{
|
|
struct task_struct *tsk;
|
|
int retval;
|
|
|
|
trace_sched_process_wait(wo->wo_pid);
|
|
|
|
init_waitqueue_func_entry(&wo->child_wait, child_wait_callback);
|
|
wo->child_wait.private = current;
|
|
add_wait_queue(¤t->signal->wait_chldexit, &wo->child_wait);
|
|
repeat:
|
|
/*
|
|
* If there is nothing that can match our criteria, just get out.
|
|
* We will clear ->notask_error to zero if we see any child that
|
|
* might later match our criteria, even if we are not able to reap
|
|
* it yet.
|
|
*/
|
|
wo->notask_error = -ECHILD;
|
|
if ((wo->wo_type < PIDTYPE_MAX) &&
|
|
(!wo->wo_pid || hlist_empty(&wo->wo_pid->tasks[wo->wo_type])))
|
|
goto notask;
|
|
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
read_lock(&tasklist_lock);
|
|
tsk = current;
|
|
do {
|
|
retval = do_wait_thread(wo, tsk);
|
|
if (retval)
|
|
goto end;
|
|
|
|
retval = ptrace_do_wait(wo, tsk);
|
|
if (retval)
|
|
goto end;
|
|
|
|
if (wo->wo_flags & __WNOTHREAD)
|
|
break;
|
|
} while_each_thread(current, tsk);
|
|
read_unlock(&tasklist_lock);
|
|
|
|
notask:
|
|
retval = wo->notask_error;
|
|
if (!retval && !(wo->wo_flags & WNOHANG)) {
|
|
retval = -ERESTARTSYS;
|
|
if (!signal_pending(current)) {
|
|
schedule();
|
|
goto repeat;
|
|
}
|
|
}
|
|
end:
|
|
__set_current_state(TASK_RUNNING);
|
|
remove_wait_queue(¤t->signal->wait_chldexit, &wo->child_wait);
|
|
return retval;
|
|
}
|
|
|
|
static long kernel_waitid(int which, pid_t upid, struct waitid_info *infop,
|
|
int options, struct rusage *ru)
|
|
{
|
|
struct wait_opts wo;
|
|
struct pid *pid = NULL;
|
|
enum pid_type type;
|
|
long ret;
|
|
|
|
if (options & ~(WNOHANG|WNOWAIT|WEXITED|WSTOPPED|WCONTINUED|
|
|
__WNOTHREAD|__WCLONE|__WALL))
|
|
return -EINVAL;
|
|
if (!(options & (WEXITED|WSTOPPED|WCONTINUED)))
|
|
return -EINVAL;
|
|
|
|
switch (which) {
|
|
case P_ALL:
|
|
type = PIDTYPE_MAX;
|
|
break;
|
|
case P_PID:
|
|
type = PIDTYPE_PID;
|
|
if (upid <= 0)
|
|
return -EINVAL;
|
|
|
|
pid = find_get_pid(upid);
|
|
break;
|
|
case P_PGID:
|
|
type = PIDTYPE_PGID;
|
|
if (upid < 0)
|
|
return -EINVAL;
|
|
|
|
if (upid)
|
|
pid = find_get_pid(upid);
|
|
else
|
|
pid = get_task_pid(current, PIDTYPE_PGID);
|
|
break;
|
|
case P_PIDFD:
|
|
type = PIDTYPE_PID;
|
|
if (upid < 0)
|
|
return -EINVAL;
|
|
|
|
pid = pidfd_get_pid(upid);
|
|
if (IS_ERR(pid))
|
|
return PTR_ERR(pid);
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
|
|
wo.wo_type = type;
|
|
wo.wo_pid = pid;
|
|
wo.wo_flags = options;
|
|
wo.wo_info = infop;
|
|
wo.wo_rusage = ru;
|
|
ret = do_wait(&wo);
|
|
|
|
put_pid(pid);
|
|
return ret;
|
|
}
|
|
|
|
SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
|
|
infop, int, options, struct rusage __user *, ru)
|
|
{
|
|
struct rusage r;
|
|
struct waitid_info info = {.status = 0};
|
|
long err = kernel_waitid(which, upid, &info, options, ru ? &r : NULL);
|
|
int signo = 0;
|
|
|
|
if (err > 0) {
|
|
signo = SIGCHLD;
|
|
err = 0;
|
|
if (ru && copy_to_user(ru, &r, sizeof(struct rusage)))
|
|
return -EFAULT;
|
|
}
|
|
if (!infop)
|
|
return err;
|
|
|
|
if (!user_access_begin(infop, sizeof(*infop)))
|
|
return -EFAULT;
|
|
|
|
unsafe_put_user(signo, &infop->si_signo, Efault);
|
|
unsafe_put_user(0, &infop->si_errno, Efault);
|
|
unsafe_put_user(info.cause, &infop->si_code, Efault);
|
|
unsafe_put_user(info.pid, &infop->si_pid, Efault);
|
|
unsafe_put_user(info.uid, &infop->si_uid, Efault);
|
|
unsafe_put_user(info.status, &infop->si_status, Efault);
|
|
user_access_end();
|
|
return err;
|
|
Efault:
|
|
user_access_end();
|
|
return -EFAULT;
|
|
}
|
|
|
|
long kernel_wait4(pid_t upid, int __user *stat_addr, int options,
|
|
struct rusage *ru)
|
|
{
|
|
struct wait_opts wo;
|
|
struct pid *pid = NULL;
|
|
enum pid_type type;
|
|
long ret;
|
|
|
|
if (options & ~(WNOHANG|WUNTRACED|WCONTINUED|
|
|
__WNOTHREAD|__WCLONE|__WALL))
|
|
return -EINVAL;
|
|
|
|
/* -INT_MIN is not defined */
|
|
if (upid == INT_MIN)
|
|
return -ESRCH;
|
|
|
|
if (upid == -1)
|
|
type = PIDTYPE_MAX;
|
|
else if (upid < 0) {
|
|
type = PIDTYPE_PGID;
|
|
pid = find_get_pid(-upid);
|
|
} else if (upid == 0) {
|
|
type = PIDTYPE_PGID;
|
|
pid = get_task_pid(current, PIDTYPE_PGID);
|
|
} else /* upid > 0 */ {
|
|
type = PIDTYPE_PID;
|
|
pid = find_get_pid(upid);
|
|
}
|
|
|
|
wo.wo_type = type;
|
|
wo.wo_pid = pid;
|
|
wo.wo_flags = options | WEXITED;
|
|
wo.wo_info = NULL;
|
|
wo.wo_stat = 0;
|
|
wo.wo_rusage = ru;
|
|
ret = do_wait(&wo);
|
|
put_pid(pid);
|
|
if (ret > 0 && stat_addr && put_user(wo.wo_stat, stat_addr))
|
|
ret = -EFAULT;
|
|
|
|
return ret;
|
|
}
|
|
|
|
SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
|
|
int, options, struct rusage __user *, ru)
|
|
{
|
|
struct rusage r;
|
|
long err = kernel_wait4(upid, stat_addr, options, ru ? &r : NULL);
|
|
|
|
if (err > 0) {
|
|
if (ru && copy_to_user(ru, &r, sizeof(struct rusage)))
|
|
return -EFAULT;
|
|
}
|
|
return err;
|
|
}
|
|
|
|
#ifdef __ARCH_WANT_SYS_WAITPID
|
|
|
|
/*
|
|
* sys_waitpid() remains for compatibility. waitpid() should be
|
|
* implemented by calling sys_wait4() from libc.a.
|
|
*/
|
|
SYSCALL_DEFINE3(waitpid, pid_t, pid, int __user *, stat_addr, int, options)
|
|
{
|
|
return kernel_wait4(pid, stat_addr, options, NULL);
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
COMPAT_SYSCALL_DEFINE4(wait4,
|
|
compat_pid_t, pid,
|
|
compat_uint_t __user *, stat_addr,
|
|
int, options,
|
|
struct compat_rusage __user *, ru)
|
|
{
|
|
struct rusage r;
|
|
long err = kernel_wait4(pid, stat_addr, options, ru ? &r : NULL);
|
|
if (err > 0) {
|
|
if (ru && put_compat_rusage(&r, ru))
|
|
return -EFAULT;
|
|
}
|
|
return err;
|
|
}
|
|
|
|
COMPAT_SYSCALL_DEFINE5(waitid,
|
|
int, which, compat_pid_t, pid,
|
|
struct compat_siginfo __user *, infop, int, options,
|
|
struct compat_rusage __user *, uru)
|
|
{
|
|
struct rusage ru;
|
|
struct waitid_info info = {.status = 0};
|
|
long err = kernel_waitid(which, pid, &info, options, uru ? &ru : NULL);
|
|
int signo = 0;
|
|
if (err > 0) {
|
|
signo = SIGCHLD;
|
|
err = 0;
|
|
if (uru) {
|
|
/* kernel_waitid() overwrites everything in ru */
|
|
if (COMPAT_USE_64BIT_TIME)
|
|
err = copy_to_user(uru, &ru, sizeof(ru));
|
|
else
|
|
err = put_compat_rusage(&ru, uru);
|
|
if (err)
|
|
return -EFAULT;
|
|
}
|
|
}
|
|
|
|
if (!infop)
|
|
return err;
|
|
|
|
if (!user_access_begin(infop, sizeof(*infop)))
|
|
return -EFAULT;
|
|
|
|
unsafe_put_user(signo, &infop->si_signo, Efault);
|
|
unsafe_put_user(0, &infop->si_errno, Efault);
|
|
unsafe_put_user(info.cause, &infop->si_code, Efault);
|
|
unsafe_put_user(info.pid, &infop->si_pid, Efault);
|
|
unsafe_put_user(info.uid, &infop->si_uid, Efault);
|
|
unsafe_put_user(info.status, &infop->si_status, Efault);
|
|
user_access_end();
|
|
return err;
|
|
Efault:
|
|
user_access_end();
|
|
return -EFAULT;
|
|
}
|
|
#endif
|
|
|
|
__weak void abort(void)
|
|
{
|
|
BUG();
|
|
|
|
/* if that doesn't kill us, halt */
|
|
panic("Oops failed to kill thread");
|
|
}
|
|
EXPORT_SYMBOL(abort);
|