Changelog in Linux kernel 6.6.127

 
ALSA: hda/realtek: Add quirk for Inspur S14-G1 [+ + +]
Author: Zhang Heng <[email protected]>
Date:   Mon Jan 26 15:35:08 2026 +0800

    ALSA: hda/realtek: Add quirk for Inspur S14-G1
    
    [ Upstream commit 9e18920e783d0bcd4c127a7adc66565243ab9655 ]
    
    Inspur S14-G1 is equipped with ALC256.
    Enable "power saving mode" and Enable "headset jack mode".
    
    Signed-off-by: Zhang Heng <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: hda/realtek: Fix headset mic for TongFang X6AR55xU [+ + +]
Author: Tim Guttzeit <[email protected]>
Date:   Mon Jan 19 16:15:55 2026 +0100

    ALSA: hda/realtek: Fix headset mic for TongFang X6AR55xU
    
    [ Upstream commit b48fe9af1e60360baf09ca6b7a3cd6541f16e611 ]
    
    Add a PCI quirk to enable microphone detection on the headphone jack of
    TongFang X6AR55xU devices.
    
    Signed-off-by: Tim Guttzeit <[email protected]>
    Signed-off-by: Werner Sembach <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ASoC: amd: yc: Add ASUS ExpertBook PM1503CDA to quirks list [+ + +]
Author: Anatolii Shirykalov <[email protected]>
Date:   Mon Jan 19 15:56:18 2026 +0100

    ASoC: amd: yc: Add ASUS ExpertBook PM1503CDA to quirks list
    
    [ Upstream commit 018b211b1d321a52ed8d8de74ce83ce52a2e1224 ]
    
    Add ASUS ExpertBook PM1503CDA to the DMI quirks table to enable
    internal DMIC support via the ACP6x machine driver.
    
    Signed-off-by: Anatolii Shirykalov <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: amd: yc: Add quirk for HP 200 G2a 16 [+ + +]
Author: Dirk Su <[email protected]>
Date:   Thu Jan 29 14:50:19 2026 +0800

    ASoC: amd: yc: Add quirk for HP 200 G2a 16
    
    [ Upstream commit 611c7d2262d5645118e0b3a9a88475d35a8366f2 ]
    
    Fix the missing mic on HP 200 G2a 16 by adding quirk with the
    board ID 8EE4
    
    Signed-off-by: Dirk Su <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: cs35l45: Corrects ASP_TX5 DAPM widget channel [+ + +]
Author: Ricardo Rivera-Matos <[email protected]>
Date:   Thu Jan 15 19:25:10 2026 +0000

    ASoC: cs35l45: Corrects ASP_TX5 DAPM widget channel
    
    [ Upstream commit 6dd0fdc908c02318c28ec2c0979661846ee0a9f7 ]
    
    ASP_TX5 was incorrectly mapped to a channel value of 3 corrects,
    the channel value of 4.
    
    Reviewed-by: Charles Keepax <[email protected]>
    Signed-off-by: Ricardo Rivera-Matos <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: cs42l43: Correct handling of 3-pole jack load detection [+ + +]
Author: Charles Keepax <[email protected]>
Date:   Fri Jan 30 15:09:27 2026 +0000

    ASoC: cs42l43: Correct handling of 3-pole jack load detection
    
    [ Upstream commit e77a4081d7e324dfa876a9560b2a78969446ba82 ]
    
    The load detection process for 3-pole jacks requires slightly
    updated reference values to ensure an accurate result. Update
    the code to apply different tunings for the 3-pole and 4-pole
    cases. This also updates the thresholds overall so update the
    relevant comments to match.
    
    Signed-off-by: Charles Keepax <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: fsl_xcvr: fix missing lock in fsl_xcvr_mode_put() [+ + +]
Author: Ziyi Guo <[email protected]>
Date:   Mon Feb 2 17:41:12 2026 +0000

    ASoC: fsl_xcvr: fix missing lock in fsl_xcvr_mode_put()
    
    [ Upstream commit f514248727606b9087bc38a284ff686e0093abf1 ]
    
    fsl_xcvr_activate_ctl() has
    lockdep_assert_held(&card->snd_card->controls_rwsem),
    but fsl_xcvr_mode_put() calls it without acquiring this lock.
    
    Other callers of fsl_xcvr_activate_ctl() in fsl_xcvr_startup() and
    fsl_xcvr_shutdown() properly acquire the lock with down_read()/up_read().
    
    Add the missing down_read()/up_read() calls around fsl_xcvr_activate_ctl()
    in fsl_xcvr_mode_put() to fix the lockdep assertion and prevent potential
    race conditions when multiple userspace threads access the control.
    
    Signed-off-by: Ziyi Guo <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: Intel: sof_es8336: Add DMI quirk for Huawei BOD-WXX9 [+ + +]
Author: Tagir Garaev <[email protected]>
Date:   Sun Feb 1 15:17:28 2026 +0300

    ASoC: Intel: sof_es8336: Add DMI quirk for Huawei BOD-WXX9
    
    [ Upstream commit 6b641122d31f9d33e7d60047ee0586d1659f3f54 ]
    
    Add DMI entry for Huawei Matebook D (BOD-WXX9) with HEADPHONE_GPIO
    and DMIC quirks.
    
    This device has ES8336 codec with:
    - GPIO 16 (headphone-enable) for headphone amplifier control
    - GPIO 17 (speakers-enable) for speaker amplifier control
    - GPIO 269 for jack detection IRQ
    - 2-channel DMIC
    
    Hardware investigation shows that both GPIO 16 and 17 are required
    for proper audio routing, as headphones and speakers share the same
    physical output (HPOL/HPOR) and are separated only via amplifier
    enable signals.
    
    RFC: Seeking advice on GPIO control issue:
    
    GPIO values change in driver (gpiod_get_value() shows logical value
    changes) but not physically (debugfs gpio shows no change). The same
    gpiod_set_value_cansleep() calls work correctly in probe context with
    msleep(), but fail when called from DAPM event callbacks.
    
    Context information from diagnostics:
    - in_atomic=0, in_interrupt=0, irqs_disabled=0
    - Process context: pipewire
    - GPIO 17 (speakers): changes in driver, no physical change
    - GPIO 16 (headphone): changes in driver, no physical change
    
    In Windows, audio switching works without visible GPIO changes,
    suggesting possible ACPI/firmware involvement.
    
    Any suggestions on how to properly control these GPIOs from DAPM
    events would be appreciated.
    
    Signed-off-by: Tagir Garaev <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
bus: fsl-mc: fix use-after-free in driver_override_show() [+ + +]
Author: Gui-Dong Han <[email protected]>
Date:   Fri Feb 13 11:22:29 2026 -0500

    bus: fsl-mc: fix use-after-free in driver_override_show()
    
    [ Upstream commit 148891e95014b5dc5878acefa57f1940c281c431 ]
    
    The driver_override_show() function reads the driver_override string
    without holding the device_lock. However, driver_override_store() uses
    driver_set_override(), which modifies and frees the string while holding
    the device_lock.
    
    This can result in a concurrent use-after-free if the string is freed
    by the store function while being read by the show function.
    
    Fix this by holding the device_lock around the read operation.
    
    Fixes: 1f86a00c1159 ("bus/fsl-mc: add support for 'driver_override' in the mc-bus")
    Cc: [email protected]
    Signed-off-by: Gui-Dong Han <[email protected]>
    Reviewed-by: Ioana Ciornei <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Christophe Leroy (CS GROUP) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

bus: fsl-mc: Replace snprintf and sprintf with sysfs_emit in sysfs show functions [+ + +]
Author: Chelsy Ratnawat <[email protected]>
Date:   Fri Feb 13 11:22:28 2026 -0500

    bus: fsl-mc: Replace snprintf and sprintf with sysfs_emit in sysfs show functions
    
    [ Upstream commit a50522c805a6c575c80f41b04706e084d814e116 ]
    
    Use sysfs_emit() instead of snprintf()/sprintf()  when writing
    to sysfs buffers, as recommended by the kernel documentation.
    
    Signed-off-by: Chelsy Ratnawat <[email protected]>
    Acked-by: Ioana Ciornei <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Christophe Leroy <[email protected]>
    Stable-dep-of: 148891e95014 ("bus: fsl-mc: fix use-after-free in driver_override_show()")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
cpuset: Fix missing adaptation for cpuset_is_populated [+ + +]
Author: Chen Ridong <[email protected]>
Date:   Wed Jan 14 01:51:29 2026 +0000

    cpuset: Fix missing adaptation for cpuset_is_populated
    
    Commit b1bcaed1e39a ("cpuset: Treat cpusets in attaching as populated")
    was backported to the long‑term support (LTS) branches. However, because
    commit d5cf4d34a333 ("cgroup/cpuset: Don't track # of local child
    partitions") was not backported, a corresponding adaptation to the
    backported code is still required.
    
    To ensure correct behavior, replace cgroup_is_populated with
    cpuset_is_populated in the partition_is_populated function.
    
    Cc: [email protected]      # 6.1+
    Fixes: b1bcaed1e39a ("cpuset: Treat cpusets in attaching as populated")
    Cc: Waiman Long <[email protected]>
    Cc: Tejun Heo <[email protected]>
    Signed-off-by: Chen Ridong <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/tegra: hdmi: sor: Fix error: variable ‘j’ set but not used [+ + +]
Author: Brahmajit Das <[email protected]>
Date:   Tue Sep 2 02:50:20 2025 +0530

    drm/tegra: hdmi: sor: Fix error: variable ‘j’ set but not used
    
    [ Upstream commit 1beee8d0c263b3e239c8d6616e4f8bb700bed658 ]
    
    The variable j is set, however never used in or outside the loop, thus
    resulting in dead code.
    Building with GCC 16 results in a build error due to
    -Werror=unused-but-set-variable= enabled by default.
    This patch clean up the dead code and fixes the build error.
    
    Example build log:
    drivers/gpu/drm/tegra/sor.c:1867:19: error: variable ‘j’ set but not used [-Werror=unused-but-set-variable=]
     1867 |         size_t i, j;
          |                   ^
    
    Signed-off-by: Brahmajit Das <[email protected]>
    Signed-off-by: Thierry Reding <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
f2fs: fix IS_CHECKPOINTED flag inconsistency issue caused by concurrent atomic commit and checkpoint writes [+ + +]
Author: Yongpeng Yang <[email protected]>
Date:   Tue Feb 17 10:45:24 2026 -0500

    f2fs: fix IS_CHECKPOINTED flag inconsistency issue caused by concurrent atomic commit and checkpoint writes
    
    [ Upstream commit 7633a7387eb4d0259d6bea945e1d3469cd135bbc ]
    
    During SPO tests, when mounting F2FS, an -EINVAL error was returned from
    f2fs_recover_inode_page. The issue occurred under the following scenario
    
    Thread A                                     Thread B
    f2fs_ioc_commit_atomic_write
     - f2fs_do_sync_file // atomic = true
      - f2fs_fsync_node_pages
        : last_folio = inode folio
        : schedule before folio_lock(last_folio) f2fs_write_checkpoint
                                                  - block_operations// writeback last_folio
                                                  - schedule before f2fs_flush_nat_entries
        : set_fsync_mark(last_folio, 1)
        : set_dentry_mark(last_folio, 1)
        : folio_mark_dirty(last_folio)
        - __write_node_folio(last_folio)
          : f2fs_down_read(&sbi->node_write)//block
                                                  - f2fs_flush_nat_entries
                                                    : {struct nat_entry}->flag |= BIT(IS_CHECKPOINTED)
                                                  - unblock_operations
                                                    : f2fs_up_write(&sbi->node_write)
                                                 f2fs_write_checkpoint//return
          : f2fs_do_write_node_page()
    f2fs_ioc_commit_atomic_write//return
                                                 SPO
    
    Thread A calls f2fs_need_dentry_mark(sbi, ino), and the last_folio has
    already been written once. However, the {struct nat_entry}->flag did not
    have the IS_CHECKPOINTED set, causing set_dentry_mark(last_folio, 1) and
    write last_folio again after Thread B finishes f2fs_write_checkpoint.
    
    After SPO and reboot, it was detected that {struct node_info}->blk_addr
    was not NULL_ADDR because Thread B successfully write the checkpoint.
    
    This issue only occurs in atomic write scenarios. For regular file
    fsync operations, the folio must be dirty. If
    block_operations->f2fs_sync_node_pages successfully submit the folio
    write, this path will not be executed. Otherwise, the
    f2fs_write_checkpoint will need to wait for the folio write submission
    to complete, as sbi->nr_pages[F2FS_DIRTY_NODES] > 0. Therefore, the
    situation where f2fs_need_dentry_mark checks that the {struct
    nat_entry}->flag /wo the IS_CHECKPOINTED flag, but the folio write has
    already been submitted, will not occur.
    
    Therefore, for atomic file fsync, sbi->node_write should be acquired
    through __write_node_folio to ensure that the IS_CHECKPOINTED flag
    correctly indicates that the checkpoint write has been completed.
    
    Fixes: 608514deba38 ("f2fs: set fsync mark only for the last dnode")
    Cc: [email protected]
    Signed-off-by: Sheng Yong <[email protected]>
    Signed-off-by: Jinbao Liu <[email protected]>
    Signed-off-by: Yongpeng Yang <[email protected]>
    Reviewed-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ folio => page ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

f2fs: fix out-of-bounds access in sysfs attribute read/write [+ + +]
Author: Yongpeng Yang <[email protected]>
Date:   Wed Jan 7 10:33:46 2026 +0800

    f2fs: fix out-of-bounds access in sysfs attribute read/write
    
    commit 98ea0039dbfdd00e5cc1b9a8afa40434476c0955 upstream.
    
    Some f2fs sysfs attributes suffer from out-of-bounds memory access and
    incorrect handling of integer values whose size is not 4 bytes.
    
    For example:
    vm:~# echo 65537 > /sys/fs/f2fs/vde/carve_out
    vm:~# cat /sys/fs/f2fs/vde/carve_out
    65537
    vm:~# echo 4294967297 > /sys/fs/f2fs/vde/atgc_age_threshold
    vm:~# cat /sys/fs/f2fs/vde/atgc_age_threshold
    1
    
    carve_out maps to {struct f2fs_sb_info}->carve_out, which is a 8-bit
    integer. However, the sysfs interface allows setting it to a value
    larger than 255, resulting in an out-of-range update.
    
    atgc_age_threshold maps to {struct atgc_management}->age_threshold,
    which is a 64-bit integer, but its sysfs interface cannot correctly set
    values larger than UINT_MAX.
    
    The root causes are:
    1. __sbi_store() treats all default values as unsigned int, which
    prevents updating integers larger than 4 bytes and causes out-of-bounds
    writes for integers smaller than 4 bytes.
    
    2. f2fs_sbi_show() also assumes all default values are unsigned int,
    leading to out-of-bounds reads and incorrect access to integers larger
    than 4 bytes.
    
    This patch introduces {struct f2fs_attr}->size to record the actual size
    of the integer associated with each sysfs attribute. With this
    information, sysfs read and write operations can correctly access and
    update values according to their real data size, avoiding memory
    corruption and truncation.
    
    Fixes: b59d0bae6ca3 ("f2fs: add sysfs support for controlling the gc_thread")
    Cc: [email protected]
    Signed-off-by: Jinbao Liu <[email protected]>
    Signed-off-by: Yongpeng Yang <[email protected]>
    Reviewed-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

f2fs: fix to add gc count stat in f2fs_gc_range [+ + +]
Author: Zhiguo Niu <[email protected]>
Date:   Fri Dec 26 10:56:04 2025 +0800

    f2fs: fix to add gc count stat in f2fs_gc_range
    
    commit 761dac9073cd67d4705a94cd1af674945a117f4c upstream.
    
    It missed the stat count in f2fs_gc_range.
    
    Cc: [email protected]
    Fixes: 9bf1dcbdfdc8 ("f2fs: fix to account gc stats correctly")
    Signed-off-by: Zhiguo Niu <[email protected]>
    Reviewed-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

f2fs: fix to avoid mapping wrong physical block for swapfile [+ + +]
Author: Chao Yu <[email protected]>
Date:   Tue Feb 17 10:20:32 2026 -0500

    f2fs: fix to avoid mapping wrong physical block for swapfile
    
    [ Upstream commit 5c145c03188bc9ba1c29e0bc4d527a5978fc47f9 ]
    
    Xiaolong Guo reported a f2fs bug in bugzilla [1]
    
    [1] https://bugzilla.kernel.org/show_bug.cgi?id=220951
    
    Quoted:
    
    "When using stress-ng's swap stress test on F2FS filesystem with kernel 6.6+,
    the system experiences data corruption leading to either:
    1 dm-verity corruption errors and device reboot
    2 F2FS node corruption errors and boot hangs
    
    The issue occurs specifically when:
    1 Using F2FS filesystem (ext4 is unaffected)
    2 Swapfile size is less than F2FS section size (2MB)
    3 Swapfile has fragmented physical layout (multiple non-contiguous extents)
    4 Kernel version is 6.6+ (6.1 is unaffected)
    
    The root cause is in check_swap_activate() function in fs/f2fs/data.c. When the
    first extent of a small swapfile (< 2MB) is not aligned to section boundaries,
    the function incorrectly treats it as the last extent, failing to map
    subsequent extents. This results in incorrect swap_extent creation where only
    the first extent is mapped, causing subsequent swap writes to overwrite wrong
    physical locations (other files' data).
    
    Steps to Reproduce
    1 Setup a device with F2FS-formatted userdata partition
    2 Compile stress-ng from https://github.com/ColinIanKing/stress-ng
    3 Run swap stress test: (Android devices)
    adb shell "cd /data/stressng; ./stress-ng-64 --metrics-brief --timeout 60
    --swap 0"
    
    Log:
    1 Ftrace shows in kernel 6.6, only first extent is mapped during second
    f2fs_map_blocks call in check_swap_activate():
    stress-ng-swap-8990: f2fs_map_blocks: ino=11002, file offset=0, start
    blkaddr=0x43143, len=0x1
    (Only 4KB mapped, not the full swapfile)
    2 in kernel 6.1, both extents are correctly mapped:
    stress-ng-swap-5966: f2fs_map_blocks: ino=28011, file offset=0, start
    blkaddr=0x13cd4, len=0x1
    stress-ng-swap-5966: f2fs_map_blocks: ino=28011, file offset=1, start
    blkaddr=0x60c84b, len=0xff
    
    The problematic code is in check_swap_activate():
    if ((pblock - SM_I(sbi)->main_blkaddr) % blks_per_sec ||
        nr_pblocks % blks_per_sec ||
        !f2fs_valid_pinned_area(sbi, pblock)) {
        bool last_extent = false;
    
        not_aligned++;
    
        nr_pblocks = roundup(nr_pblocks, blks_per_sec);
        if (cur_lblock + nr_pblocks > sis->max)
            nr_pblocks -= blks_per_sec;
    
        /* this extent is last one */
        if (!nr_pblocks) {
            nr_pblocks = last_lblock - cur_lblock;
            last_extent = true;
        }
    
        ret = f2fs_migrate_blocks(inode, cur_lblock, nr_pblocks);
        if (ret) {
            if (ret == -ENOENT)
                ret = -EINVAL;
            goto out;
        }
    
        if (!last_extent)
            goto retry;
    }
    
    When the first extent is unaligned and roundup(nr_pblocks, blks_per_sec)
    exceeds sis->max, we subtract blks_per_sec resulting in nr_pblocks = 0. The
    code then incorrectly assumes this is the last extent, sets nr_pblocks =
    last_lblock - cur_lblock (entire swapfile), and performs migration. After
    migration, it doesn't retry mapping, so subsequent extents are never processed.
    "
    
    In order to fix this issue, we need to lookup block mapping info after
    we migrate all blocks in the tail of swapfile.
    
    Cc: [email protected]
    Fixes: 9703d69d9d15 ("f2fs: support file pinning for zoned devices")
    Cc: Daeho Jeong <[email protected]>
    Reported-and-tested-by: Xiaolong Guo <[email protected]>
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220951
    Signed-off-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ f2fs_is_sequential_zone_area() => !f2fs_valid_pinned_area() ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

f2fs: fix to avoid UAF in f2fs_write_end_io() [+ + +]
Author: Chao Yu <[email protected]>
Date:   Tue Feb 17 10:35:47 2026 -0500

    f2fs: fix to avoid UAF in f2fs_write_end_io()
    
    [ Upstream commit ce2739e482bce8d2c014d76c4531c877f382aa54 ]
    
    As syzbot reported an use-after-free issue in f2fs_write_end_io().
    
    It is caused by below race condition:
    
    loop device                             umount
    - worker_thread
     - loop_process_work
      - do_req_filebacked
       - lo_rw_aio
        - lo_rw_aio_complete
         - blk_mq_end_request
          - blk_update_request
           - f2fs_write_end_io
            - dec_page_count
            - folio_end_writeback
                                            - kill_f2fs_super
                                             - kill_block_super
                                              - f2fs_put_super
                                             : free(sbi)
           : get_pages(, F2FS_WB_CP_DATA)
             accessed sbi which is freed
    
    In kill_f2fs_super(), we will drop all page caches of f2fs inodes before
    call free(sbi), it guarantee that all folios should end its writeback, so
    it should be safe to access sbi before last folio_end_writeback().
    
    Let's relocate ckpt thread wakeup flow before folio_end_writeback() to
    resolve this issue.
    
    Cc: [email protected]
    Fixes: e234088758fc ("f2fs: avoid wait if IO end up when do_checkpoint for better performance")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=b4444e3c972a7a124187
    Signed-off-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ folio => page ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

f2fs: fix zoned block device information initialization [+ + +]
Author: Wenjie Qi <[email protected]>
Date:   Tue Feb 17 10:20:31 2026 -0500

    f2fs: fix zoned block device information initialization
    
    [ Upstream commit 0f9b12142be1af8555cfe53c6fbecb8e60a40dac ]
    
    If the max open zones of zoned devices are less than
    the active logs of F2FS, the device may error due to
    insufficient zone resources when multiple active logs
    are being written at the same time.
    
    Signed-off-by: Wenjie Qi <[email protected]>
    Signed-off-by: Chao Yu <[email protected]>
    Reviewed-by: Daeho Jeong <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    Stable-dep-of: 5c145c03188b ("f2fs: fix to avoid mapping wrong physical block for swapfile")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
fbdev: rivafb: fix divide error in nv3_arb() [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Sun Dec 7 15:25:32 2025 +0800

    fbdev: rivafb: fix divide error in nv3_arb()
    
    commit 0209e21e3c372fa2da04c39214bec0b64e4eb5f4 upstream.
    
    A userspace program can trigger the RIVA NV3 arbitration code by calling
    the FBIOPUT_VSCREENINFO ioctl on /dev/fb*. When doing so, the driver
    recomputes FIFO arbitration parameters in nv3_arb(), using state->mclk_khz
    (derived from the PRAMDAC MCLK PLL) as a divisor without validating it
    first.
    
    In a normal setup, state->mclk_khz is provided by the real hardware and is
    non-zero. However, an attacker can construct a malicious or misconfigured
    device (e.g. a crafted/emulated PCI device) that exposes a bogus PLL
    configuration, causing state->mclk_khz to become zero.  Once
    nv3_get_param() calls nv3_arb(), the division by state->mclk_khz in the gns
    calculation causes a divide error and crashes the kernel.
    
    Fix this by checking whether state->mclk_khz is zero and bailing out before
    doing the division.
    
    The following log reveals it:
    
    rivafb: setting virtual Y resolution to 2184
    divide error: 0000 [#1] PREEMPT SMP KASAN PTI
    CPU: 0 PID: 2187 Comm: syz-executor.0 Not tainted 5.18.0-rc1+ #1
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    RIP: 0010:nv3_arb drivers/video/fbdev/riva/riva_hw.c:439 [inline]
    RIP: 0010:nv3_get_param+0x3ab/0x13b0 drivers/video/fbdev/riva/riva_hw.c:546
    Call Trace:
      nv3CalcArbitration.constprop.0+0x255/0x460 drivers/video/fbdev/riva/riva_hw.c:603
      nv3UpdateArbitrationSettings drivers/video/fbdev/riva/riva_hw.c:637 [inline]
      CalcStateExt+0x447/0x1b90 drivers/video/fbdev/riva/riva_hw.c:1246
      riva_load_video_mode+0x8a9/0xea0 drivers/video/fbdev/riva/fbdev.c:779
      rivafb_set_par+0xc0/0x5f0 drivers/video/fbdev/riva/fbdev.c:1196
      fb_set_var+0x604/0xeb0 drivers/video/fbdev/core/fbmem.c:1033
      do_fb_ioctl+0x234/0x670 drivers/video/fbdev/core/fbmem.c:1109
      fb_ioctl+0xdd/0x130 drivers/video/fbdev/core/fbmem.c:1188
      __x64_sys_ioctl+0x122/0x190 fs/ioctl.c:856
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Helge Deller <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

fbdev: smscufx: properly copy ioctl memory to kernelspace [+ + +]
Author: Greg Kroah-Hartman <[email protected]>
Date:   Sun Dec 28 14:17:03 2025 +0100

    fbdev: smscufx: properly copy ioctl memory to kernelspace
    
    commit 120adae7b42faa641179270c067864544a50ab69 upstream.
    
    The UFX_IOCTL_REPORT_DAMAGE ioctl does not properly copy data from
    userspace to kernelspace, and instead directly references the memory,
    which can cause problems if invalid data is passed from userspace.  Fix
    this all up by correctly copying the memory before accessing it within
    the kernel.
    
    Reported-by: Tianchu Chen <[email protected]>
    Cc: stable <[email protected]>
    Cc: Steve Glendinning <[email protected]>
    Cc: Helge Deller <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Helge Deller <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
gpio: sprd: Change sprd_gpio lock to raw_spin_lock [+ + +]
Author: Xuewen Yan <[email protected]>
Date:   Mon Jan 26 17:42:09 2026 +0800

    gpio: sprd: Change sprd_gpio lock to raw_spin_lock
    
    [ Upstream commit 96313fcc1f062ba239f4832c9eff685da6c51c99 ]
    
    There was a lockdep warning in sprd_gpio:
    
    [    6.258269][T329@C6] [ BUG: Invalid wait context ]
    [    6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G        W  OE
    [    6.258272][T329@C6] -----------------------------
    [    6.258273][T329@C6] modprobe/329 is trying to lock:
    [    6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
    [    6.258282][T329@C6] other info that might help us debug this:
    [    6.258283][T329@C6] context-{5:5}
    [    6.258285][T329@C6] 3 locks held by modprobe/329:
    [    6.258286][T329@C6]  #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
    [    6.258295][T329@C6]  #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
    [    6.258304][T329@C6]  #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
    [    6.258313][T329@C6] stack backtrace:
    [    6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G        W  OE       6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT  3ad5b0f45741a16e5838da790706e16ceb6717df
    [    6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
    [    6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
    [    6.258318][T329@C6] Call trace:
    [    6.258318][T329@C6]  show_stack+0x20/0x30 (C)
    [    6.258321][T329@C6]  __dump_stack+0x28/0x3c
    [    6.258324][T329@C6]  dump_stack_lvl+0xac/0xf0
    [    6.258326][T329@C6]  dump_stack+0x18/0x3c
    [    6.258329][T329@C6]  __lock_acquire+0x824/0x2c28
    [    6.258331][T329@C6]  lock_acquire+0x148/0x2cc
    [    6.258333][T329@C6]  _raw_spin_lock_irqsave+0x6c/0xb4
    [    6.258334][T329@C6]  sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
    [    6.258337][T329@C6]  irq_startup+0x238/0x350
    [    6.258340][T329@C6]  __setup_irq+0x504/0x82c
    [    6.258342][T329@C6]  request_threaded_irq+0x118/0x184
    [    6.258344][T329@C6]  devm_request_threaded_irq+0x94/0x120
    [    6.258347][T329@C6]  sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
    [    6.258352][T329@C6]  sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
    [    6.258358][T329@C6]  i2c_device_probe+0x2c8/0x350
    [    6.258361][T329@C6]  really_probe+0x1a8/0x46c
    [    6.258363][T329@C6]  __driver_probe_device+0xa4/0x10c
    [    6.258366][T329@C6]  driver_probe_device+0x44/0x1b4
    [    6.258369][T329@C6]  __driver_attach+0xd0/0x204
    [    6.258371][T329@C6]  bus_for_each_dev+0x10c/0x168
    [    6.258373][T329@C6]  driver_attach+0x2c/0x3c
    [    6.258376][T329@C6]  bus_add_driver+0x154/0x29c
    [    6.258378][T329@C6]  driver_register+0x70/0x10c
    [    6.258381][T329@C6]  i2c_register_driver+0x48/0xc8
    [    6.258384][T329@C6]  init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
    [    6.258389][T329@C6]  do_one_initcall+0x128/0x42c
    [    6.258392][T329@C6]  do_init_module+0x60/0x254
    [    6.258395][T329@C6]  load_module+0x1054/0x1220
    [    6.258397][T329@C6]  __arm64_sys_finit_module+0x240/0x35c
    [    6.258400][T329@C6]  invoke_syscall+0x60/0xec
    [    6.258402][T329@C6]  el0_svc_common+0xb0/0xe4
    [    6.258405][T329@C6]  do_el0_svc+0x24/0x30
    [    6.258407][T329@C6]  el0_svc+0x54/0x1c4
    [    6.258409][T329@C6]  el0t_64_sync_handler+0x68/0xdc
    [    6.258411][T329@C6]  el0t_64_sync+0x1c4/0x1c8
    
    This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
    however the sprd_gpio->lock would use in hard-irq, this is unsafe.
    
    So change the spin_lock_t to raw_spin_lock_t to use the spinlock
    in hard-irq.
    
    Signed-off-by: Xuewen Yan <[email protected]>
    Reviewed-by: Baolin Wang <[email protected]>
    Reviewed-by: Sebastian Andrzej Siewior <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    [Bartosz: tweaked the commit message]
    Signed-off-by: Bartosz Golaszewski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
gpiolib: acpi: Fix gpio count with string references [+ + +]
Author: Alban Bedel <[email protected]>
Date:   Thu Jan 29 15:59:44 2026 +0100

    gpiolib: acpi: Fix gpio count with string references
    
    [ Upstream commit c62e0658d458d8f100445445c3ddb106f3824a45 ]
    
    Since commit 9880702d123f2 ("ACPI: property: Support using strings in
    reference properties") it is possible to use strings instead of local
    references. This work fine with single GPIO but not with arrays as
    acpi_gpio_package_count() didn't handle this case. Update it to handle
    strings like local references to cover this case as well.
    
    Signed-off-by: Alban Bedel <[email protected]>
    Reviewed-by: Mika Westerberg <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Bartosz Golaszewski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
Linux: Linux 6.6.127 [+ + +]
Author: Greg Kroah-Hartman <[email protected]>
Date:   Thu Feb 19 16:28:28 2026 +0100

    Linux 6.6.127
    
    Link: https://lore.kernel.org/r/[email protected]
    Tested-by: Florian Fainelli <[email protected]>
    Tested-by: Peter Schneider <[email protected]>
    Tested-by: Jon Hunter <[email protected]>
    Tested-by: Brett A C Sheffield <[email protected]>
    Tested-by: Mark Brown <[email protected]>
    Tested-by: Francesco Dolcini <[email protected]>
    Tested-by: Ron Economos <[email protected]>
    Tested-by: Miguel Ojeda <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
LoongArch: Add WriteCombine shadow mapping in KASAN [+ + +]
Author: Kanglong Wang <[email protected]>
Date:   Tue Nov 12 16:35:39 2024 +0800

    LoongArch: Add WriteCombine shadow mapping in KASAN
    
    commit 139d42ca51018c1d43ab5f35829179f060d1ab31 upstream.
    
    Currently, the kernel couldn't boot when ARCH_IOREMAP, ARCH_WRITECOMBINE
    and KASAN are enabled together. Because DMW2 is used by kernel now which
    is configured as 0xa000000000000000 for WriteCombine, but KASAN has no
    segment mapping for it. This patch fix this issue.
    
    Solution: Add the relevant definitions for WriteCombine (DMW2) in KASAN.
    
    Cc: [email protected]
    Fixes: 8e02c3b782ec ("LoongArch: Add writecombine support for DMW-based ioremap()")
    Signed-off-by: Kanglong Wang <[email protected]>
    Signed-off-by: Huacai Chen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

LoongArch: Add writecombine support for DMW-based ioremap() [+ + +]
Author: Huacai Chen <[email protected]>
Date:   Sat Jul 20 22:40:59 2024 +0800

    LoongArch: Add writecombine support for DMW-based ioremap()
    
    commit 8e02c3b782ec64343f3cccc8dc5a8be2b379e80b upstream.
    
    Currently, only TLB-based ioremap() support writecombine, so add the
    counterpart for DMW-based ioremap() with help of DMW2. The base address
    (WRITECOMBINE_BASE) is configured as 0xa000000000000000.
    
    DMW3 is unused by kernel now, however firmware may leave garbage in them
    and interfere kernel's address mapping. So clear it as necessary.
    
    BTW, centralize the DMW configuration to macro SETUP_DMWINS.
    
    Signed-off-by: Jiaxun Yang <[email protected]>
    Signed-off-by: Huacai Chen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

LoongArch: Rework KASAN initialization for PTW-enabled systems [+ + +]
Author: Tiezhu Yang <[email protected]>
Date:   Tue Feb 10 19:31:17 2026 +0800

    LoongArch: Rework KASAN initialization for PTW-enabled systems
    
    commit 5ec5ac4ca27e4daa234540ac32f9fc5219377d53 upstream.
    
    kasan_init_generic() indicates that kasan is fully initialized, so it
    should be put at end of kasan_init().
    
    Otherwise bringing up the primary CPU failed when CONFIG_KASAN is set
    on PTW-enabled systems, here are the call chains:
    
        kernel_entry()
          start_kernel()
            setup_arch()
              kasan_init()
                kasan_init_generic()
    
    The reason is PTW-enabled systems have speculative accesses which means
    memory accesses to the shadow memory after kasan_init() may be executed
    by hardware before. However, accessing shadow memory is safe only after
    kasan fully initialized because kasan_init() uses a temporary PGD table
    until we have populated all levels of shadow page tables and writen the
    PGD register. Moving kasan_init_generic() later can defer the occasion
    of kasan_enabled(), so as to avoid speculative accesses on shadow pages.
    
    After moving kasan_init_generic() to the end, kasan_init() can no longer
    call kasan_mem_to_shadow() for shadow address conversion because it will
    always return kasan_early_shadow_page. On the other hand, we should keep
    the current logic of kasan_mem_to_shadow() for both the early and final
    stage because there may be instrumentation before kasan_init().
    
    To solve this, we factor out a new mem_to_shadow() function from current
    kasan_mem_to_shadow() for the shadow address conversion in kasan_init().
    
    Cc: [email protected]
    Signed-off-by: Tiezhu Yang <[email protected]>
    Signed-off-by: Huacai Chen <[email protected]>
    [ Huacai: To backport from upstream to 6.6 & 6.12, kasan_enabled() is
              replaced with kasan_arch_is_ready() and kasan_init_generic()
              is replaced with "kasan_early_stage = false". ]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
mm/hugetlb: fix copy_hugetlb_page_range() to use ->pt_share_count [+ + +]
Author: Jane Chu <[email protected]>
Date:   Mon Sep 15 18:45:20 2025 -0600

    mm/hugetlb: fix copy_hugetlb_page_range() to use ->pt_share_count
    
    commit 14967a9c7d247841b0312c48dcf8cd29e55a4cc8 upstream.
    
    commit 59d9094df3d79 ("mm: hugetlb: independent PMD page table shared
    count") introduced ->pt_share_count dedicated to hugetlb PMD share count
    tracking, but omitted fixing copy_hugetlb_page_range(), leaving the
    function relying on page_count() for tracking that no longer works.
    
    When lazy page table copy for hugetlb is disabled, that is, revert commit
    bcd51a3c679d ("hugetlb: lazy page table copies in fork()") fork()'ing with
    hugetlb PMD sharing quickly lockup -
    
    [  239.446559] watchdog: BUG: soft lockup - CPU#75 stuck for 27s!
    [  239.446611] RIP: 0010:native_queued_spin_lock_slowpath+0x7e/0x2e0
    [  239.446631] Call Trace:
    [  239.446633]  <TASK>
    [  239.446636]  _raw_spin_lock+0x3f/0x60
    [  239.446639]  copy_hugetlb_page_range+0x258/0xb50
    [  239.446645]  copy_page_range+0x22b/0x2c0
    [  239.446651]  dup_mmap+0x3e2/0x770
    [  239.446654]  dup_mm.constprop.0+0x5e/0x230
    [  239.446657]  copy_process+0xd17/0x1760
    [  239.446660]  kernel_clone+0xc0/0x3e0
    [  239.446661]  __do_sys_clone+0x65/0xa0
    [  239.446664]  do_syscall_64+0x82/0x930
    [  239.446668]  ? count_memcg_events+0xd2/0x190
    [  239.446671]  ? syscall_trace_enter+0x14e/0x1f0
    [  239.446676]  ? syscall_exit_work+0x118/0x150
    [  239.446677]  ? arch_exit_to_user_mode_prepare.constprop.0+0x9/0xb0
    [  239.446681]  ? clear_bhb_loop+0x30/0x80
    [  239.446684]  ? clear_bhb_loop+0x30/0x80
    [  239.446686]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
    
    There are two options to resolve the potential latent issue:
      1. warn against PMD sharing in copy_hugetlb_page_range(),
      2. fix it.
    This patch opts for the second option.
    While at it, simplify the comment, the details are not actually relevant
    anymore.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Fixes: 59d9094df3d7 ("mm: hugetlb: independent PMD page table shared count")
    Signed-off-by: Jane Chu <[email protected]>
    Reviewed-by: Harry Yoo <[email protected]>
    Acked-by: Oscar Salvador <[email protected]>
    Acked-by: David Hildenbrand <[email protected]>
    Cc: Jann Horn <[email protected]>
    Cc: Liu Shixin <[email protected]>
    Cc: Muchun Song <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: David Hildenbrand (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mm/hugetlb: fix excessive IPI broadcasts when unsharing PMD tables using mmu_gather [+ + +]
Author: David Hildenbrand (Red Hat) <[email protected]>
Date:   Tue Dec 23 22:40:37 2025 +0100

    mm/hugetlb: fix excessive IPI broadcasts when unsharing PMD tables using mmu_gather
    
    commit 8ce720d5bd91e9dc16db3604aa4b1bf76770a9a1 upstream.
    
    As reported, ever since commit 1013af4f585f ("mm/hugetlb: fix
    huge_pmd_unshare() vs GUP-fast race") we can end up in some situations
    where we perform so many IPI broadcasts when unsharing hugetlb PMD page
    tables that it severely regresses some workloads.
    
    In particular, when we fork()+exit(), or when we munmap() a large
    area backed by many shared PMD tables, we perform one IPI broadcast per
    unshared PMD table.
    
    There are two optimizations to be had:
    
    (1) When we process (unshare) multiple such PMD tables, such as during
        exit(), it is sufficient to send a single IPI broadcast (as long as
        we respect locking rules) instead of one per PMD table.
    
        Locking prevents that any of these PMD tables could get reused before
        we drop the lock.
    
    (2) When we are not the last sharer (> 2 users including us), there is
        no need to send the IPI broadcast. The shared PMD tables cannot
        become exclusive (fully unshared) before an IPI will be broadcasted
        by the last sharer.
    
        Concurrent GUP-fast could walk into a PMD table just before we
        unshared it. It could then succeed in grabbing a page from the
        shared page table even after munmap() etc succeeded (and supressed
        an IPI). But there is not difference compared to GUP-fast just
        sleeping for a while after grabbing the page and re-enabling IRQs.
    
        Most importantly, GUP-fast will never walk into page tables that are
        no-longer shared, because the last sharer will issue an IPI
        broadcast.
    
        (if ever required, checking whether the PUD changed in GUP-fast
         after grabbing the page like we do in the PTE case could handle
         this)
    
    So let's rework PMD sharing TLB flushing + IPI sync to use the mmu_gather
    infrastructure so we can implement these optimizations and demystify the
    code at least a bit. Extend the mmu_gather infrastructure to be able to
    deal with our special hugetlb PMD table sharing implementation.
    
    To make initialization of the mmu_gather easier when working on a single
    VMA (in particular, when dealing with hugetlb), provide
    tlb_gather_mmu_vma().
    
    We'll consolidate the handling for (full) unsharing of PMD tables in
    tlb_unshare_pmd_ptdesc() and tlb_flush_unshared_tables(), and track
    in "struct mmu_gather" whether we had (full) unsharing of PMD tables.
    
    Because locking is very special (concurrent unsharing+reuse must be
    prevented), we disallow deferring flushing to tlb_finish_mmu() and instead
    require an explicit earlier call to tlb_flush_unshared_tables().
    
    From hugetlb code, we call huge_pmd_unshare_flush() where we make sure
    that the expected lock protecting us from concurrent unsharing+reuse is
    still held.
    
    Check with a VM_WARN_ON_ONCE() in tlb_finish_mmu() that
    tlb_flush_unshared_tables() was properly called earlier.
    
    Document it all properly.
    
    Notes about tlb_remove_table_sync_one() interaction with unsharing:
    
    There are two fairly tricky things:
    
    (1) tlb_remove_table_sync_one() is a NOP on architectures without
        CONFIG_MMU_GATHER_RCU_TABLE_FREE.
    
        Here, the assumption is that the previous TLB flush would send an
        IPI to all relevant CPUs. Careful: some architectures like x86 only
        send IPIs to all relevant CPUs when tlb->freed_tables is set.
    
        The relevant architectures should be selecting
        MMU_GATHER_RCU_TABLE_FREE, but x86 might not do that in stable
        kernels and it might have been problematic before this patch.
    
        Also, the arch flushing behavior (independent of IPIs) is different
        when tlb->freed_tables is set. Do we have to enlighten them to also
        take care of tlb->unshared_tables? So far we didn't care, so
        hopefully we are fine. Of course, we could be setting
        tlb->freed_tables as well, but that might then unnecessarily flush
        too much, because the semantics of tlb->freed_tables are a bit
        fuzzy.
    
        This patch changes nothing in this regard.
    
    (2) tlb_remove_table_sync_one() is not a NOP on architectures with
        CONFIG_MMU_GATHER_RCU_TABLE_FREE that actually don't need a sync.
    
        Take x86 as an example: in the common case (!pv, !X86_FEATURE_INVLPGB)
        we still issue IPIs during TLB flushes and don't actually need the
        second tlb_remove_table_sync_one().
    
        This optimized can be implemented on top of this, by checking e.g., in
        tlb_remove_table_sync_one() whether we really need IPIs. But as
        described in (1), it really must honor tlb->freed_tables then to
        send IPIs to all relevant CPUs.
    
    Notes on TLB flushing changes:
    
    (1) Flushing for non-shared PMD tables
    
        We're converting from flush_hugetlb_tlb_range() to
        tlb_remove_huge_tlb_entry(). Given that we properly initialize the
        MMU gather in tlb_gather_mmu_vma() to be hugetlb aware, similar to
        __unmap_hugepage_range(), that should be fine.
    
    (2) Flushing for shared PMD tables
    
        We're converting from various things (flush_hugetlb_tlb_range(),
        tlb_flush_pmd_range(), flush_tlb_range()) to tlb_flush_pmd_range().
    
        tlb_flush_pmd_range() achieves the same that
        tlb_remove_huge_tlb_entry() would achieve in these scenarios.
        Note that tlb_remove_huge_tlb_entry() also calls
        __tlb_remove_tlb_entry(), however that is only implemented on
        powerpc, which does not support PMD table sharing.
    
        Similar to (1), tlb_gather_mmu_vma() should make sure that TLB
        flushing keeps on working as expected.
    
    Further, note that the ptdesc_pmd_pts_dec() in huge_pmd_share() is not a
    concern, as we are holding the i_mmap_lock the whole time, preventing
    concurrent unsharing. That ptdesc_pmd_pts_dec() usage will be removed
    separately as a cleanup later.
    
    There are plenty more cleanups to be had, but they have to wait until
    this is fixed.
    
    [[email protected]: fix kerneldoc]
      Link: https://lkml.kernel.org/r/[email protected]
    Link: https://lkml.kernel.org/r/[email protected]
    Fixes: 1013af4f585f ("mm/hugetlb: fix huge_pmd_unshare() vs GUP-fast race")
    Signed-off-by: David Hildenbrand (Red Hat) <[email protected]>
    Reported-by: "Uschakow, Stanislav" <[email protected]>
    Closes: https://lore.kernel.org/all/[email protected]/
    Tested-by: Laurence Oberman <[email protected]>
    Acked-by: Harry Yoo <[email protected]>
    Reviewed-by: Lorenzo Stoakes <[email protected]>
    Cc: Lance Yang <[email protected]>
    Cc: Liu Shixin <[email protected]>
    Cc: Oscar Salvador <[email protected]>
    Cc: Rik van Riel <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: David Hildenbrand (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mm/hugetlb: fix hugetlb_pmd_shared() [+ + +]
Author: David Hildenbrand (Red Hat) <[email protected]>
Date:   Tue Dec 23 22:40:34 2025 +0100

    mm/hugetlb: fix hugetlb_pmd_shared()
    
    commit ca1a47cd3f5f4c46ca188b1c9a27af87d1ab2216 upstream.
    
    Patch series "mm/hugetlb: fixes for PMD table sharing (incl.  using
    mmu_gather)", v3.
    
    One functional fix, one performance regression fix, and two related
    comment fixes.
    
    I cleaned up my prototype I recently shared [1] for the performance fix,
    deferring most of the cleanups I had in the prototype to a later point.
    While doing that I identified the other things.
    
    The goal of this patch set is to be backported to stable trees "fairly"
    easily. At least patch #1 and #4.
    
    Patch #1 fixes hugetlb_pmd_shared() not detecting any sharing
    Patch #2 + #3 are simple comment fixes that patch #4 interacts with.
    Patch #4 is a fix for the reported performance regression due to excessive
    IPI broadcasts during fork()+exit().
    
    The last patch is all about TLB flushes, IPIs and mmu_gather.
    Read: complicated
    
    There are plenty of cleanups in the future to be had + one reasonable
    optimization on x86. But that's all out of scope for this series.
    
    Runtime tested, with a focus on fixing the performance regression using
    the original reproducer [2] on x86.
    
    
    This patch (of 4):
    
    We switched from (wrongly) using the page count to an independent shared
    count.  Now, shared page tables have a refcount of 1 (excluding
    speculative references) and instead use ptdesc->pt_share_count to identify
    sharing.
    
    We didn't convert hugetlb_pmd_shared(), so right now, we would never
    detect a shared PMD table as such, because sharing/unsharing no longer
    touches the refcount of a PMD table.
    
    Page migration, like mbind() or migrate_pages() would allow for migrating
    folios mapped into such shared PMD tables, even though the folios are not
    exclusive.  In smaps we would account them as "private" although they are
    "shared", and we would be wrongly setting the PM_MMAP_EXCLUSIVE in the
    pagemap interface.
    
    Fix it by properly using ptdesc_pmd_is_shared() in hugetlb_pmd_shared().
    
    Link: https://lkml.kernel.org/r/[email protected]
    Link: https://lkml.kernel.org/r/[email protected]
    Link: https://lore.kernel.org/all/[email protected]/ [1]
    Link: https://lore.kernel.org/all/[email protected]/ [2]
    Fixes: 59d9094df3d7 ("mm: hugetlb: independent PMD page table shared count")
    Signed-off-by: David Hildenbrand (Red Hat) <[email protected]>
    Reviewed-by: Rik van Riel <[email protected]>
    Reviewed-by: Lance Yang <[email protected]>
    Tested-by: Lance Yang <[email protected]>
    Reviewed-by: Harry Yoo <[email protected]>
    Tested-by: Laurence Oberman <[email protected]>
    Reviewed-by: Lorenzo Stoakes <[email protected]>
    Acked-by: Oscar Salvador <[email protected]>
    Cc: Liu Shixin <[email protected]>
    Cc: "Uschakow, Stanislav" <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: David Hildenbrand (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mm/hugetlb: fix two comments related to huge_pmd_unshare() [+ + +]
Author: David Hildenbrand (Red Hat) <[email protected]>
Date:   Tue Dec 23 22:40:35 2025 +0100

    mm/hugetlb: fix two comments related to huge_pmd_unshare()
    
    commit 3937027caecb4f8251e82dd857ba1d749bb5a428 upstream.
    
    Ever since we stopped using the page count to detect shared PMD page
    tables, these comments are outdated.
    
    The only reason we have to flush the TLB early is because once we drop the
    i_mmap_rwsem, the previously shared page table could get freed (to then
    get reallocated and used for other purpose).  So we really have to flush
    the TLB before that could happen.
    
    So let's simplify the comments a bit.
    
    The "If we unshared PMDs, the TLB flush was not recorded in mmu_gather."
    part introduced as in commit a4a118f2eead ("hugetlbfs: flush TLBs
    correctly after huge_pmd_unshare") was confusing: sure it is recorded in
    the mmu_gather, otherwise tlb_flush_mmu_tlbonly() wouldn't do anything.
    So let's drop that comment while at it as well.
    
    We'll centralize these comments in a single helper as we rework the code
    next.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Fixes: 59d9094df3d7 ("mm: hugetlb: independent PMD page table shared count")
    Signed-off-by: David Hildenbrand (Red Hat) <[email protected]>
    Reviewed-by: Rik van Riel <[email protected]>
    Tested-by: Laurence Oberman <[email protected]>
    Reviewed-by: Lorenzo Stoakes <[email protected]>
    Acked-by: Oscar Salvador <[email protected]>
    Reviewed-by: Harry Yoo <[email protected]>
    Cc: Liu Shixin <[email protected]>
    Cc: Lance Yang <[email protected]>
    Cc: "Uschakow, Stanislav" <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: David Hildenbrand (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net: tunnel: make skb_vlan_inet_prepare() return drop reasons [+ + +]
Author: Menglong Dong <[email protected]>
Date:   Wed Oct 9 10:28:21 2024 +0800

    net: tunnel: make skb_vlan_inet_prepare() return drop reasons
    
    [ Upstream commit 9990ddf47d4168088e2246c3d418bf526e40830d ]
    
    Make skb_vlan_inet_prepare return the skb drop reasons, which is just
    what pskb_may_pull_reason() returns. Meanwhile, adjust all the call of
    it.
    
    Signed-off-by: Menglong Dong <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
PCI: endpoint: Avoid creating sub-groups asynchronously [+ + +]
Author: Liu Song <[email protected]>
Date:   Fri Feb 13 20:49:23 2026 -0500

    PCI: endpoint: Avoid creating sub-groups asynchronously
    
    [ Upstream commit 7c5c7d06bd1f86d2c3ebe62be903a4ba42db4d2c ]
    
    The asynchronous creation of sub-groups by a delayed work could lead to a
    NULL pointer dereference when the driver directory is removed before the
    work completes.
    
    The crash can be easily reproduced with the following commands:
    
      # cd /sys/kernel/config/pci_ep/functions/pci_epf_test
      # for i in {1..20}; do mkdir test && rmdir test; done
    
      BUG: kernel NULL pointer dereference, address: 0000000000000088
      ...
      Call Trace:
       configfs_register_group+0x3d/0x190
       pci_epf_cfs_work+0x41/0x110
       process_one_work+0x18f/0x350
       worker_thread+0x25a/0x3a0
    
    Fix this issue by using configfs_add_default_group() API which does not
    have the deadlock problem as configfs_register_group() and does not require
    the delayed work handler.
    
    Fixes: e85a2d783762 ("PCI: endpoint: Add support in configfs to associate two EPCs with EPF")
    Signed-off-by: Liu Song <[email protected]>
    [mani: slightly reworded the description and added stable list]
    Signed-off-by: Manivannan Sadhasivam <[email protected]>
    Signed-off-by: Bjorn Helgaas <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

PCI: endpoint: Remove unused field in struct pci_epf_group [+ + +]
Author: Christophe JAILLET <[email protected]>
Date:   Fri Feb 13 20:49:22 2026 -0500

    PCI: endpoint: Remove unused field in struct pci_epf_group
    
    [ Upstream commit 328e4dffbeecc0f2cc5a149dee6c11a0577c9671 ]
    
    In "struct pci_epf_group", the 'type_group' field is unused.
    
    This was added, but already unused, by commit 70b3740f2c19 ("PCI: endpoint:
    Automatically create a function specific attributes group").
    
    Thus, remove it.
    
    Found with cppcheck, unusedStructMember.
    
    [kwilczynski: commit log]
    Link: https://lore.kernel.org/linux-pci/6507d44b6c60a19af35a605e2d58050be8872ab6.1712341008.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Christophe JAILLET <[email protected]>
    Signed-off-by: Krzysztof Wilczyński <[email protected]>
    Signed-off-by: Bjorn Helgaas <[email protected]>
    Stable-dep-of: 7c5c7d06bd1f ("PCI: endpoint: Avoid creating sub-groups asynchronously")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
platform/x86/amd/pmc: Add quirk for MECHREVO Wujie 15X Pro [+ + +]
Author: gongqi <[email protected]>
Date:   Thu Jan 22 23:55:00 2026 +0800

    platform/x86/amd/pmc: Add quirk for MECHREVO Wujie 15X Pro
    
    [ Upstream commit 2b4e00d8e70ca8736fda82447be6a4e323c6d1f5 ]
    
    The MECHREVO Wujie 15X Pro suffers from spurious IRQ issues related to
    the AMD PMC. Add it to the quirk list to use the spurious_8042 fix.
    
    Signed-off-by: gongqi <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Ilpo Järvinen <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
platform/x86: classmate-laptop: Add missing NULL pointer checks [+ + +]
Author: Rafael J. Wysocki <[email protected]>
Date:   Mon Jan 26 21:02:40 2026 +0100

    platform/x86: classmate-laptop: Add missing NULL pointer checks
    
    [ Upstream commit fe747d7112283f47169e9c16e751179a9b38611e ]
    
    In a few places in the Classmate laptop driver, code using the accel
    object may run before that object's address is stored in the driver
    data of the input device using it.
    
    For example, cmpc_accel_sensitivity_store_v4() is the "show" method
    of cmpc_accel_sensitivity_attr_v4 which is added in cmpc_accel_add_v4(),
    before calling dev_set_drvdata() for inputdev->dev.  If the sysfs
    attribute is accessed prematurely, the dev_get_drvdata(&inputdev->dev)
    call in in cmpc_accel_sensitivity_store_v4() returns NULL which
    leads to a NULL pointer dereference going forward.
    
    Moreover, sysfs attributes using the input device are added before
    initializing that device by cmpc_add_acpi_notify_device() and if one
    of them is accessed before running that function, a NULL pointer
    dereference will occur.
    
    For example, cmpc_accel_sensitivity_attr_v4 is added before calling
    cmpc_add_acpi_notify_device() and if it is read prematurely, the
    dev_get_drvdata(&acpi->dev) call in cmpc_accel_sensitivity_show_v4()
    returns NULL which leads to a NULL pointer dereference going forward.
    
    Fix this by adding NULL pointer checks in all of the relevant places.
    
    Signed-off-by: Rafael J. Wysocki <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Ilpo Järvinen <[email protected]>
    Signed-off-by: Ilpo Järvinen <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

platform/x86: panasonic-laptop: Fix sysfs group leak in error path [+ + +]
Author: Rafael J. Wysocki <[email protected]>
Date:   Tue Jan 20 16:43:44 2026 +0100

    platform/x86: panasonic-laptop: Fix sysfs group leak in error path
    
    [ Upstream commit 43b0b7eff4b3fb684f257d5a24376782e9663465 ]
    
    The acpi_pcc_hotkey_add() error path leaks sysfs group pcc_attr_group
    if platform_device_register_simple() fails for the "panasonic" platform
    device.
    
    Address this by making it call sysfs_remove_group() in that case for
    the group in question.
    
    Signed-off-by: Rafael J. Wysocki <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Ilpo Järvinen <[email protected]>
    Signed-off-by: Ilpo Järvinen <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
Revert "wireguard: device: enable threaded NAPI" [+ + +]
Author: Daniel Borkmann <[email protected]>
Date:   Mon Feb 16 22:31:13 2026 +0100

    Revert "wireguard: device: enable threaded NAPI"
    
    This reverts commit 8c9e9cd398777fd60ba202211da1110614cb5bc5 which is
    commit db9ae3b6b43c79b1ba87eea849fd65efa05b4b2e upstream.
    
    We have had three independent production user reports in combination
    with Cilium utilizing WireGuard as encryption underneath that k8s Pod
    E/W traffic to certain peer nodes fully stalled. The situation appears
    as follows:
    
      - Occurs very rarely but at random times under heavy networking load.
      - Once the issue triggers the decryption side stops working completely
        for that WireGuard peer, other peers keep working fine. The stall
        happens also for newly initiated connections towards that particular
        WireGuard peer.
      - Only the decryption side is affected, never the encryption side.
      - Once it triggers, it never recovers and remains in this state,
        the CPU/mem on that node looks normal, no leak, busy loop or crash.
      - bpftrace on the affected system shows that wg_prev_queue_enqueue
        fails, thus the MAX_QUEUED_PACKETS (1024 skbs!) for the peer's
        rx_queue is reached.
      - Also, bpftrace shows that wg_packet_rx_poll for that peer is never
        called again after reaching this state for that peer. For other
        peers wg_packet_rx_poll does get called normally.
      - Commit db9ae3b ("wireguard: device: enable threaded NAPI")
        switched WireGuard to threaded NAPI by default. The default has
        not been changed for triggering the issue, neither did CPU
        hotplugging occur (i.e. 5bd8de2 ("wireguard: queueing: always
        return valid online CPU in wg_cpumask_choose_online()")).
      - The issue has been observed with stable kernels of v5.15 as well as
        v6.1. It was reported to us that v5.10 stable is working fine, and
        no report on v6.6 stable either (somewhat related discussion in [0]
        though).
      - In the WireGuard driver the only material difference between v5.10
        stable and v5.15 stable is the switch to threaded NAPI by default.
    
        [0] https://lore.kernel.org/netdev/CA+wXwBTT74RErDGAnj98PqS=wvdh8eM1pi4q6tTdExtjnokKqA@mail.gmail.com/
    
    Breakdown of the problem:
    
      1) skbs arriving for decryption are enqueued to the peer->rx_queue in
         wg_packet_consume_data via wg_queue_enqueue_per_device_and_peer.
      2) The latter only moves the skb into the MPSC peer queue if it does
         not surpass MAX_QUEUED_PACKETS (1024) which is kept track in an
         atomic counter via wg_prev_queue_enqueue.
      3) In case enqueueing was successful, the skb is also queued up
         in the device queue, round-robin picks a next online CPU, and
         schedules the decryption worker.
      4) The wg_packet_decrypt_worker, once scheduled, picks these up
         from the queue, decrypts the packets and once done calls into
         wg_queue_enqueue_per_peer_rx.
      5) The latter updates the state to PACKET_STATE_CRYPTED on success
         and calls napi_schedule on the per peer->napi instance.
      6) NAPI then polls via wg_packet_rx_poll. wg_prev_queue_peek checks
         on the peer->rx_queue. It will wg_prev_queue_dequeue if the
         queue->peeked skb was not cached yet, or just return the latter
         otherwise. (wg_prev_queue_drop_peeked later clears the cache.)
      7) From an ordering perspective, the peer->rx_queue has skbs in order
         while the device queue with the per-CPU worker threads from a
         global ordering PoV can finish the decryption and signal the skb
         PACKET_STATE_CRYPTED out of order.
      8) A situation can be observed that the first packet coming in will
         be stuck waiting for the decryption worker to be scheduled for
         a longer time when the system is under pressure.
      9) While this is the case, the other CPUs in the meantime finish
         decryption and call into napi_schedule.
     10) Now in wg_packet_rx_poll it picks up the first in-order skb
         from the peer->rx_queue and sees that its state is still
         PACKET_STATE_UNCRYPTED. The NAPI poll routine then exits early
         with work_done = 0 and calls napi_complete_done, signalling
         it "finished" processing.
     11) The assumption in wg_packet_decrypt_worker is that when the
         decryption finished the subsequent napi_schedule will always
         lead to a later invocation of wg_packet_rx_poll to pick up
         the finished packet.
     12) However, it appears that a later napi_schedule does /not/
         schedule a later poll and thus no wg_packet_rx_poll.
     13) If this situation happens exactly for the corner case where
         the decryption worker of the first packet is stuck and waiting
         to be scheduled, and the network load for WireGuard is very
         high then the queue can build up to MAX_QUEUED_PACKETS.
     14) If this situation occurs, then no new decryption worker will
         be scheduled and also no new napi_schedule to make forward
         progress.
     15) This means the peer->rx_queue stops processing packets completely
         and they are indefinitely stuck waiting for a new NAPI poll on
         that peer which never happens. New packets for that peer are
         then dropped due to full queue, as it has been observed on the
         production machines.
    
    Technically, the backport of commit db9ae3b6b43c ("wireguard: device:
    enable threaded NAPI") to stable should not have happened since it is
    more of an optimization rather than a pure fix and addresses a NAPI
    situation with utilizing many WireGuard tunnel devices in parallel.
    Revert it from stable given the backport triggers a regression for
    mentioned kernels.
    
    Signed-off-by: Daniel Borkmann <[email protected]>
    Acked-by: Jason A. Donenfeld <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
romfs: check sb_set_blocksize() return value [+ + +]
Author: Deepanshu Kartikey <[email protected]>
Date:   Tue Jan 13 14:10:37 2026 +0530

    romfs: check sb_set_blocksize() return value
    
    [ Upstream commit ab7ad7abb3660c58ffffdf07ff3bb976e7e0afa0 ]
    
    romfs_fill_super() ignores the return value of sb_set_blocksize(), which
    can fail if the requested block size is incompatible with the block
    device's configuration.
    
    This can be triggered by setting a loop device's block size larger than
    PAGE_SIZE using ioctl(LOOP_SET_BLOCK_SIZE, 32768), then mounting a romfs
    filesystem on that device.
    
    When sb_set_blocksize(sb, ROMBSIZE) is called with ROMBSIZE=4096 but the
    device has logical_block_size=32768, bdev_validate_blocksize() fails
    because the requested size is smaller than the device's logical block
    size. sb_set_blocksize() returns 0 (failure), but romfs ignores this and
    continues mounting.
    
    The superblock's block size remains at the device's logical block size
    (32768). Later, when sb_bread() attempts I/O with this oversized block
    size, it triggers a kernel BUG in folio_set_bh():
    
        kernel BUG at fs/buffer.c:1582!
        BUG_ON(size > PAGE_SIZE);
    
    Fix by checking the return value of sb_set_blocksize() and failing the
    mount with -EINVAL if it returns 0.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=9c4e33e12283d9437c25
    Signed-off-by: Deepanshu Kartikey <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
scsi: qla2xxx: Fix bsg_done() causing double free [+ + +]
Author: Anil Gurumurthy <[email protected]>
Date:   Wed Dec 10 15:46:03 2025 +0530

    scsi: qla2xxx: Fix bsg_done() causing double free
    
    commit c2c68225b1456f4d0d393b5a8778d51bb0d5b1d0 upstream.
    
    Kernel panic observed on system,
    
    [5353358.825191] BUG: unable to handle page fault for address: ff5f5e897b024000
    [5353358.825194] #PF: supervisor write access in kernel mode
    [5353358.825195] #PF: error_code(0x0002) - not-present page
    [5353358.825196] PGD 100006067 P4D 0
    [5353358.825198] Oops: 0002 [#1] PREEMPT SMP NOPTI
    [5353358.825200] CPU: 5 PID: 2132085 Comm: qlafwupdate.sub Kdump: loaded Tainted: G        W    L    -------  ---  5.14.0-503.34.1.el9_5.x86_64 #1
    [5353358.825203] Hardware name: HPE ProLiant DL360 Gen11/ProLiant DL360 Gen11, BIOS 2.44 01/17/2025
    [5353358.825204] RIP: 0010:memcpy_erms+0x6/0x10
    [5353358.825211] RSP: 0018:ff591da8f4f6b710 EFLAGS: 00010246
    [5353358.825212] RAX: ff5f5e897b024000 RBX: 0000000000007090 RCX: 0000000000001000
    [5353358.825213] RDX: 0000000000001000 RSI: ff591da8f4fed090 RDI: ff5f5e897b024000
    [5353358.825214] RBP: 0000000000010000 R08: ff5f5e897b024000 R09: 0000000000000000
    [5353358.825215] R10: ff46cf8c40517000 R11: 0000000000000001 R12: 0000000000008090
    [5353358.825216] R13: ff591da8f4f6b720 R14: 0000000000001000 R15: 0000000000000000
    [5353358.825218] FS:  00007f1e88d47740(0000) GS:ff46cf935f940000(0000) knlGS:0000000000000000
    [5353358.825219] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [5353358.825220] CR2: ff5f5e897b024000 CR3: 0000000231532004 CR4: 0000000000771ef0
    [5353358.825221] PKRU: 55555554
    [5353358.825222] Call Trace:
    [5353358.825223]  <TASK>
    [5353358.825224]  ? show_trace_log_lvl+0x1c4/0x2df
    [5353358.825229]  ? show_trace_log_lvl+0x1c4/0x2df
    [5353358.825232]  ? sg_copy_buffer+0xc8/0x110
    [5353358.825236]  ? __die_body.cold+0x8/0xd
    [5353358.825238]  ? page_fault_oops+0x134/0x170
    [5353358.825242]  ? kernelmode_fixup_or_oops+0x84/0x110
    [5353358.825244]  ? exc_page_fault+0xa8/0x150
    [5353358.825247]  ? asm_exc_page_fault+0x22/0x30
    [5353358.825252]  ? memcpy_erms+0x6/0x10
    [5353358.825253]  sg_copy_buffer+0xc8/0x110
    [5353358.825259]  qla2x00_process_vendor_specific+0x652/0x1320 [qla2xxx]
    [5353358.825317]  qla24xx_bsg_request+0x1b2/0x2d0 [qla2xxx]
    
    Most routines in qla_bsg.c call bsg_done() only for success cases.
    However a few invoke it for failure case as well leading to a double
    free. Validate before calling bsg_done().
    
    Cc: [email protected]
    Signed-off-by: Anil Gurumurthy <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Himanshu Madhani <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
 
USB: serial: option: add Telit FN920C04 RNDIS compositions [+ + +]
Author: Fabio Porcedda <[email protected]>
Date:   Fri Jan 23 16:19:16 2026 +0100

    USB: serial: option: add Telit FN920C04 RNDIS compositions
    
    commit 509f403f3ccec14188036212118651bf23599396 upstream.
    
    Add the following compositions:
    
    0x10a1: RNDIS + tty (AT/NMEA) + tty (AT) + tty (diag)
    T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  9 Spd=480 MxCh= 0
    D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=1bc7 ProdID=10a1 Rev=05.15
    S:  Manufacturer=Telit Cinterion
    S:  Product=FN920
    S:  SerialNumber=d128dba9
    C:  #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA
    I:  If#= 0 Alt= 0 #EPs= 1 Cls=ef(misc ) Sub=04 Prot=01 Driver=rndis_host
    E:  Ad=82(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
    I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host
    E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=60 Driver=option
    E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=84(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=86(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    I:  If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    
    0x10a6: RNDIS + tty (AT/NMEA) + tty (AT) + tty (diag)
    T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 10 Spd=480 MxCh= 0
    D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=1bc7 ProdID=10a6 Rev=05.15
    S:  Manufacturer=Telit Cinterion
    S:  Product=FN920
    S:  SerialNumber=d128dba9
    C:  #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA
    I:  If#= 0 Alt= 0 #EPs= 1 Cls=ef(misc ) Sub=04 Prot=01 Driver=rndis_host
    E:  Ad=82(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
    I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host
    E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=84(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=86(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    I:  If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    
    0x10ab: RNDIS + tty (AT) + tty (diag) + DPL (Data Packet Logging) + adb
    T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 11 Spd=480 MxCh= 0
    D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=1bc7 ProdID=10ab Rev=05.15
    S:  Manufacturer=Telit Cinterion
    S:  Product=FN920
    S:  SerialNumber=d128dba9
    C:  #Ifs= 6 Cfg#= 1 Atr=e0 MxPwr=500mA
    I:  If#= 0 Alt= 0 #EPs= 1 Cls=ef(misc ) Sub=04 Prot=01 Driver=rndis_host
    E:  Ad=82(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
    I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host
    E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=84(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    I:  If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:  If#= 4 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=80 Driver=(none)
    E:  Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:  If#= 5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
    E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    
    Cc: [email protected]
    Signed-off-by: Fabio Porcedda <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>