6.6.120-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainerPATCH 415/737 lib/crypto: x86/blake2s: Fix 32-bit arg treated as 64-bit
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit 2f22115709fc7ebcfa40af3367a508fbbd2f71e9 upstream.
In the C code, the 'inc' argument to the assembly functions blake2s_compress_ssse3() and blake2s_compress_avx512() is declared with type u32, matching blake2s_compress(). The assembly code then reads it from the 64-bit %rcx. However, the ABI doesn't guarantee zero-extension to 64 bits, nor do gcc or clang guarantee it. Therefore, fix these functions to read this argument from the 32-bit %ecx.
In theory, this bug could have caused the wrong 'inc' value to be used, causing incorrect BLAKE2s hashes. In practice, probably not: I've fixed essentially this same bug in many other assembly files too, but there's never been a real report of it having caused a problem. In x86_64, all writes to 32-bit registers are zero-extended to 64 bits. That results in zero-extension in nearly all situations. I've only been able to demonstrate a lack of zero-extension with a somewhat contrived example involving truncation, e.g. when the C code has a u64 variable holding 0x1234567800000040 and passes it as a u32 expecting it to be truncated to 0x40 (64). But that's not what the real code does, of course.
--- arch/x86/crypto/blake2s-core.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/crypto/blake2s-core.S +2 -2
@@ -54,7 +54,7 @@ SYM_FUNC_START(blake2s_compress_ssse3) movdqa ROT16(%rip),%xmm12 movdqa ROR328(%rip),%xmm13 movdqu 0x20(%rdi),%xmm14 - movq %rcx,%xmm15 + movd %ecx,%xmm15 leaq SIGMA+0xa0(%rip),%r8 jmp .Lbeginofloop .align 32
@@ -179,7 +179,7 @@ SYM_FUNC_START(blake2s_compress_avx512) vmovdqu (%rdi),%xmm0 vmovdqu 0x10(%rdi),%xmm1 vmovdqu 0x20(%rdi),%xmm4 - vmovq %rcx,%xmm5 + vmovd %ecx,%xmm5 vmovdqa IV(%rip),%xmm14 vmovdqa IV+16(%rip),%xmm15 jmp .Lblake2s_compress_avx512_mainloop
Greg Kroah-Hartman
maintainerPATCH 416/737 s390/dasd: Fix gendisk parent after copy pair swap
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Haberland <[email protected]>
commit c943bfc6afb8d0e781b9b7406f36caa8bbf95cb9 upstream.
After a copy pair swap the block device's "device" symlink points to the secondary CCW device, but the gendisk's parent remained the primary, leaving /sys/block/<dasdx> under the wrong parent.
Move the gendisk to the secondary's device with device_move(), keeping the sysfs topology consistent after the swap.
--- drivers/s390/block/dasd_eckd.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/s390/block/dasd_eckd.c +8 -0
@@ -6189,6 +6189,7 @@ static int dasd_eckd_copy_pair_swap(strustruct dasd_copy_relation *copy;struct dasd_block *block;struct gendisk *gdp; +int rc; copy = device->copy;if (!copy)
@@ -6223,6 +6224,13 @@ static int dasd_eckd_copy_pair_swap(stru/* swap blocklayer device link */ gdp = block->gdp;dasd_add_link_to_gendisk (gdp, secondary); + rc =device_move (disk_to_dev (gdp), &secondary->cdev->dev,DPM_ORDER_NONE ); +if (rc) { +dev_err (&primary->cdev->dev, +"copy_pair_swap: moving blockdevice parent %s->%s failed (%d)\n" , +dev_name (&primary->cdev->dev), +dev_name (&secondary->cdev->dev), rc); + }/* re-enable device */ dasd_device_remove_stop_bits (primary,DASD_STOPPED_PPRC );
Greg Kroah-Hartman
maintainerPATCH 417/737 block: rate-limit capacity change info log
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Chen <[email protected]>
commit 3179a5f7f86bcc3acd5d6fb2a29f891ef5615852 upstream.
loop devices under heavy stress-ng loop streessor can trigger many capacity change events in a short time. Each event prints an info message from set_capacity_and_notify(), flooding the console and contributing to soft lockups on slow consoles.
Switch the printk in set_capacity_and_notify() to pr_info_ratelimited() so frequent capacity changes do not spam the log while still reporting occasional changes.
--- block/genhd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/genhd.c +1 -1
@@ -83,7 +83,7 @@ bool set_capacity_and_notify(struct gend (disk->flags & GENHD_FL_HIDDEN))return false; -pr_info ("%s: detected capacity change from %lld to %lld\n" , +pr_info_ratelimited ("%s: detected capacity change from %lld to %lld\n" , disk->disk_name, capacity, size);/*
Greg Kroah-Hartman
maintainerPATCH 418/737 floppy: fix for PAGE_SIZE != 4KB
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rene Rebe <[email protected]>
commit 82d20481024cbae2ea87fe8b86d12961bfda7169 upstream.
For years I wondered why the floppy driver does not just work on sparc64, e.g:
root@SUNW_375_0066:# disktype /dev/fd0 disktype: Can't open /dev/fd0: No such device or address
[ 525.341906] disktype: attempt to access beyond end of device fd0: rw=0, sector=0, nr_sectors = 16 limit=8 [ 525.341991] floppy: error 10 while reading block 0
Turns out floppy.c __floppy_read_block_0 tries to read one page for the first test read to determine the disk size and thus fails if that is greater than 4k. Adjust minimum MAX_DISK_SIZE to PAGE_SIZE to fix floppy on sparc64 and likely all other PAGE_SIZE != 4KB configs.
--- drivers/block/floppy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/block/floppy.c +1 -1
@@ -331,7 +331,7 @@ static bool initialized;* This default is used whenever the current disk size is unknown. * [Now it is rather a minimum] */ -#define MAX_DISK_SIZE 4/* 3984 */ +#define MAX_DISK_SIZE (PAGE_SIZE / 1024)/* * globals used by 'result()'
Greg Kroah-Hartman
maintainerPATCH 419/737 kallsyms: Fix wrong "big" kernel symbol type read from procfs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zheng Yejian <[email protected]>
commit f3f9f42232dee596d15491ca3f611d02174db49c upstream.
Currently when the length of a symbol is longer than 0x7f characters, its type shown in /proc/kallsyms can be incorrect.
I found this issue when reading the code, but it can be reproduced by following steps:
1. Define a function which symbol length is 130 characters:
#define X13(x) x##x##x##x##x##x##x##x##x##x##x##x##x
static noinline void X13(x123456789)(void)
{
printk("hello world\n");
}2. The type in vmlinux is 't':
$ nm vmlinux | grep x123456
ffffffff816290f0 t x123456789x123456789x123456789x12[...] 3. Then boot the kernel, the type shown in /proc/kallsyms becomes 'g'
instead of the expected 't':
# cat /proc/kallsyms | grep x123456
ffffffff816290f0 g x123456789x123456789x123456789x12[...]The root cause is that, after commit 73bbb94466fd ("kallsyms: support "big" kernel symbols"), ULEB128 was used to encode symbol name length. That is, for "big" kernel symbols of which name length is longer than 0x7f characters, the length info is encoded into 2 bytes.
kallsyms_get_symbol_type() expects to read the first char of the symbol name which indicates the symbol type. However, due to the "big" symbol case not being handled, the symbol type read from /proc/kallsyms may be wrong, so handle it properly.
--- kernel/kallsyms.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
kernel/kallsyms.c +4 -1
@@ -103,8 +103,11 @@ static char kallsyms_get_symbol_type(uns {/* * Get just the first code, look it up in the token table, -* and return the first char from this token. +* and return the first char from this token. If MSB of length +* is 1, it is a "big" symbol, so needs an additional byte. */ +if (kallsyms_names[off] &0x80 ) + off++;return kallsyms_token_table[kallsyms_token_index[kallsyms_names[off +1 ]]]; }
Greg Kroah-Hartman
maintainerPATCH 420/737 fs/ntfs3: fix mount failure for sparse runs in run_unpack()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Komarov <[email protected]>
commit 801f614ba263cb37624982b27b4c82f3c3c597a9 upstream.
Some NTFS volumes failed to mount because sparse data runs were not handled correctly during runlist unpacking. The code performed arithmetic on the special SPARSE_LCN64 marker, leading to invalid LCN values and mount errors.
Add an explicit check for the case described above, marking the run as sparse without applying arithmetic.
--- fs/ntfs3/run.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/ntfs3/run.c +5 -1
@@ -984,8 +984,12 @@ int run_unpack(struct runs_tree *run, stif (!dlcn)return -EINVAL ; -if (check_add_overflow (prev_lcn, dlcn, &lcn)) +/* Check special combination: 0 + SPARSE_LCN64. */ +if (!prev_lcn && dlcn ==SPARSE_LCN64 ) { + lcn =SPARSE_LCN64 ; + }else if (check_add_overflow (prev_lcn, dlcn, &lcn)) {return -EINVAL ; + } prev_lcn = lcn; }else return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 421/737 ktest.pl: Fix uninitialized var in config-bisect.pl
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit d3042cbe84a060b4df764eb6c5300bbe20d125ca upstream.
The error path of copying the old config used the wrong variable in the error message:
$ mkdir /tmp/build $ ./tools/testing/ktest/config-bisect.pl -b /tmp/build config-good /tmp/config-bad $ chmod 0 /tmp/build $ ./tools/testing/ktest/config-bisect.pl -b /tmp/build config-good /tmp/config-bad good cp /tmp/build//.config config-good.tmp ... [0 seconds] FAILED! Use of uninitialized value $config in concatenation (.) or string at ./tools/testing/ktest/config-bisect.pl line 744. failed to copy to config-good.tmp
When it should have shown:
failed to copy /tmp/build//.config to config-good.tmp
--- tools/testing/ktest/config-bisect.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/testing/ktest/config-bisect.pl +2 -2
@@ -741,9 +741,9 @@ if ($start) { die "Can not find file $bad\n"; } if ($val eq "good") { - run_command "cp $output_config $good" or die "failed to copy $config to $good\n"; + run_command "cp $output_config $good" or die "failed to copy $output_config to $good\n"; } elsif ($val eq "bad") { - run_command "cp $output_config $bad" or die "failed to copy $config to $bad\n"; + run_command "cp $output_config $bad" or die "failed to copy $output_config to $bad\n"; } }
Greg Kroah-Hartman
maintainerPATCH 422/737 ext4: xattr: fix null pointer deref in ext4_raw_inode()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karina Yankevich <[email protected]>
commit b97cb7d6a051aa6ebd57906df0e26e9e36c26d14 upstream.
If ext4_get_inode_loc() fails (e.g. if it returns -EFSCORRUPTED), iloc.bh will remain set to NULL. Since ext4_xattr_inode_dec_ref_all() lacks error checking, this will lead to a null pointer dereference in ext4_raw_inode(), called right after ext4_get_inode_loc().
Found by Linux Verification Center (linuxtesting.org) with SVACE.
Message-ID: <[email protected]>
--- fs/ext4/xattr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/ext4/xattr.c +5 -1
@@ -1191,7 +1191,11 @@ ext4_xattr_inode_dec_ref_all(handle_t *hif (block_csum) end = (void *)bh->b_data + bh->b_size;else { -ext4_get_inode_loc (parent, &iloc); + err =ext4_get_inode_loc (parent, &iloc); +if (err) { +EXT4_ERROR_INODE (parent,"parent inode loc (error %d)" , err); +return ; + } end = (void *)ext4_raw_inode (&iloc) +EXT4_SB (parent->i_sb)->s_inode_size; }
Greg Kroah-Hartman
maintainerPATCH 423/737 ext4: clear i_state_flags when alloc inode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haibo Chen <[email protected]>
commit 4091c8206cfd2e3bb529ef260887296b90d9b6a2 upstream.
i_state_flags used on 32-bit archs, need to clear this flag when alloc inode.
Find this issue when umount ext4, sometimes track the inode as orphan accidently, cause ext4 mesg dump.
Message-ID: <[email protected]>
--- fs/ext4/ialloc.c | 1 - fs/ext4/inode.c | 1 - fs/ext4/super.c | 1 + 3 files changed, 1 insertion(+), 2 deletions(-)
fs/ext4/ialloc.c +0 -1
@@ -1299,7 +1299,6 @@ got: sizeof(gen)); } -ext4_clear_state_flags (ei);/* Only relevant on 32-bit archs */ ext4_set_inode_state (inode,EXT4_STATE_NEW ); ei->i_extra_isize = sbi->s_want_extra_isize;
fs/ext4/inode.c +0 -1
@@ -4913,7 +4913,6 @@ struct inode *__ext4_iget(struct super_b ei->i_projid =make_kprojid (&init_user_ns, i_projid);set_nlink (inode,le16_to_cpu (raw_inode->i_links_count)); -ext4_clear_state_flags (ei);/* Only relevant on 32-bit archs */ ei->i_inline_off =0 ; ei->i_dir_start_lookup =0 ; ei->i_dtime =le32_to_cpu (raw_inode->i_dtime);
fs/ext4/super.c +1 -0
@@ -1412,6 +1412,7 @@ static struct inode *ext4_alloc_inode(stinode_set_iversion (&ei->vfs_inode,1 ); ei->i_flags =0 ; +ext4_clear_state_flags (ei);/* Only relevant on 32-bit archs */ spin_lock_init (&ei->i_raw_lock); ei->i_prealloc_node =RB_ROOT ;atomic_set (&ei->i_prealloc_active,0 );
Greg Kroah-Hartman
maintainerPATCH 424/737 ext4: fix incorrect group number assertion in mb_check_buddy
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yongjian Sun <[email protected]>
commit 3f7a79d05c692c7cfec70bf104b1b3c3d0ce6247 upstream.
When the MB_CHECK_ASSERT macro is enabled, an assertion failure can occur in __mb_check_buddy when checking preallocated blocks (pa) in a block group:
Assertion failure in mb_free_blocks() : "groupnr == e4b->bd_group"
This happens when a pa at the very end of a block group (e.g., pa_pstart=32765, pa_len=3 in a group of 32768 blocks) becomes exhausted - its pa_pstart is advanced by pa_len to 32768, which lies in the next block group. If this exhausted pa (with pa_len == 0) is still in the bb_prealloc_list during the buddy check, the assertion incorrectly flags it as belonging to the wrong group. A possible sequence is as follows:
ext4_mb_new_blocks
ext4_mb_release_context
pa->pa_pstart += EXT4_C2B(sbi, ac->ac_b_ex.fe_len)
pa->pa_len -= ac->ac_b_ex.fe_len
__mb_check_buddy
for each pa in group
ext4_get_group_no_and_offset
MB_CHECK_ASSERT(groupnr == e4b->bd_group)To fix this, we modify the check to skip block group validation for exhausted preallocations (where pa_len == 0). Such entries are in a transitional state and will be removed from the list soon, so they should not trigger an assertion. This change prevents the false positive while maintaining the integrity of the checks for active allocations.
Message-ID: <[email protected]>
--- fs/ext4/mballoc.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ext4/mballoc.c +2 -0
@@ -777,6 +777,8 @@ static void __mb_check_buddy(struct ext4ext4_group_t groupnr;struct ext4_prealloc_space *pa; pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list); +if (!pa->pa_len) +continue ;ext4_get_group_no_and_offset (sb, pa->pa_pstart, &groupnr, &k);MB_CHECK_ASSERT (groupnr == e4b->bd_group);for (i =0 ; i < pa->pa_len; i++)
Greg Kroah-Hartman
maintainerPATCH 425/737 ext4: align max orphan file size with e2fsprogs limit
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baokun Li <[email protected]>
commit 7c11c56eb32eae96893eebafdbe3decadefe88ad upstream.
Kernel commit 0a6ce20c1564 ("ext4: verify orphan file size is not too big") limits the maximum supported orphan file size to 8 << 20.
However, in e2fsprogs, the orphan file size is set to 32–512 filesystem blocks when creating a filesystem.
With 64k block size, formatting an ext4 fs >32G gives an orphan file bigger than the kernel allows, so mount prints an error and fails:
EXT4-fs (vdb): orphan file too big: 8650752
EXT4-fs (vdb): mount failed
To prevent this issue and allow previously created 64KB filesystems to mount, we updates the maximum allowed orphan file size in the kernel to 512 filesystem blocks.
Message-ID: <[email protected]>
--- fs/ext4/orphan.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/ext4/orphan.c +3 -1
@@ -8,6 +8,8 @@#include "ext4.h" #include "ext4_jbd2.h" +#define EXT4_MAX_ORPHAN_FILE_BLOCKS 512 +static int ext4_orphan_file_add (handle_t *handle,struct inode *inode) {int i, j, start;
@@ -589,7 +591,7 @@ int ext4_init_orphan_info(struct super_b* consuming absurd amounts of memory when pinning blocks of orphan * file in memory. */ -if (inode->i_size >8 <<20 ) { +if (inode->i_size > (EXT4_MAX_ORPHAN_FILE_BLOCKS << inode->i_blkbits)) {ext4_msg (sb,KERN_ERR ,"orphan file too big: %llu" , (unsigned long long )inode->i_size); ret = -EFSCORRUPTED ;
Greg Kroah-Hartman
maintainerPATCH 426/737 jbd2: use a per-journal lock_class_key for jbd2_trans_commit_key
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit 524c3853831cf4f7e1db579e487c757c3065165c upstream.
syzbot is reporting possibility of deadlock due to sharing lock_class_key for jbd2_handle across ext4 and ocfs2. But this is a false positive, for one disk partition can't have two filesystems at the same time.
Message-ID: <[email protected]>
--- fs/jbd2/journal.c | 6 ++++-- include/linux/jbd2.h | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-)
fs/jbd2/journal.c +4 -2
@@ -1563,7 +1563,6 @@ static journal_t *journal_init_common(ststruct block_device *fs_dev, unsigned long long start, int len, int blocksize) { - static struct lock_class_key jbd2_trans_commit_key; journal_t *journal;int err;int n;
@@ -1572,6 +1571,7 @@ static journal_t *journal_init_common(stif (!journal)return ERR_PTR (-ENOMEM ); +lockdep_register_key (&journal->jbd2_trans_commit_key); journal->j_blocksize = blocksize; journal->j_dev = bdev; journal->j_fs_dev = fs_dev;
@@ -1601,7 +1601,7 @@ static journal_t *journal_init_common(st journal->j_max_batch_time =15000 ;/* 15ms */ atomic_set (&journal->j_reserved_credits,0 );lockdep_init_map (&journal->j_trans_commit_map,"jbd2_handle" , - &jbd2_trans_commit_key,0 ); + &journal->jbd2_trans_commit_key,0 );/* The journal is marked for error until we succeed with recovery! */ journal->j_flags =JBD2_ABORT ;
@@ -1648,6 +1648,7 @@ err_cleanup:kfree (journal->j_wbuf);jbd2_journal_destroy_revoke (journal);journal_fail_superblock (journal); +lockdep_unregister_key (&journal->jbd2_trans_commit_key);kfree (journal);return ERR_PTR (err); }
@@ -2229,6 +2230,7 @@ int jbd2_journal_destroy(journal_t *jourcrypto_free_shash (journal->j_chksum_driver);kfree (journal->j_fc_wbuf);kfree (journal->j_wbuf); +lockdep_unregister_key (&journal->jbd2_trans_commit_key);kfree (journal);return err;
include/linux/jbd2.h +6 -0
@@ -1266,6 +1266,12 @@ struct journal_s*/ struct lockdep_map j_trans_commit_map;#endif +/** +* @jbd2_trans_commit_key: +* +* "struct lock_class_key" for @j_trans_commit_map +*/ +struct lock_class_key jbd2_trans_commit_key;/** * @j_fc_cleanup_callback:
Greg Kroah-Hartman
maintainerPATCH 427/737 jbd2: use a weaker annotation in journal handling
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Byungchul Park <[email protected]>
commit 40a71b53d5a6d4ea17e4d54b99b2ac03a7f5e783 upstream.
jbd2 journal handling code doesn't want jbd2_might_wait_for_commit() to be placed between start_this_handle() and stop_this_handle(). So it marks the region with rwsem_acquire_read() and rwsem_release().
However, the annotation is too strong for that purpose. We don't have to use more than try lock annotation for that.
rwsem_acquire_read() implies:
1. might be a waiter on contention of the lock.
2. enter to the critical section of the lock.
All we need in here is to act 2, not 1. So trylock version of annotation is sufficient for that purpose. Now that dept partially relies on lockdep annotaions, dept interpets rwsem_acquire_read() as a potential wait and might report a deadlock by the wait.
Replace it with trylock version of annotation.
Message-ID: <[email protected]>
--- fs/jbd2/transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/jbd2/transaction.c +1 -1
@@ -445,7 +445,7 @@ repeat:read_unlock (&journal->j_state_lock); current->journal_info = handle; -rwsem_acquire_read (&journal->j_trans_commit_map,0 ,0 , _THIS_IP_); +rwsem_acquire_read (&journal->j_trans_commit_map,0 ,1 , _THIS_IP_);jbd2_journal_free_transaction (new_transaction);/* * Ensure that no allocations done while the transaction is open are
Greg Kroah-Hartman
maintainerPATCH 428/737 media: v4l2-mem2mem: Fix outdated documentation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
commit 082b86919b7a94de01d849021b4da820a6cb89dc upstream.
Commit cbd9463da1b1 ("media: v4l2-mem2mem: Avoid calling .device_run in v4l2_m2m_job_finish") deferred calls to .device_run() to a work queue to avoid recursive calls when a job is finished right away from .device_run(). It failed to update the v4l2_m2m_job_finish() documentation that still states the function must not be called from .device_run(). Fix it.
--- include/media/v4l2-mem2mem.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
include/media/v4l2-mem2mem.h +1 -2
@@ -185,8 +185,7 @@ void v4l2_m2m_try_schedule(struct v4l2_m* other instances to take control of the device. * * This function has to be called only after &v4l2_m2m_ops->device_run -* callback has been called on the driver. To prevent recursion, it should -* not be called directly from the &v4l2_m2m_ops->device_run callback though. +* callback has been called on the driver. */ void v4l2_m2m_job_finish (struct v4l2_m2m_dev *m2m_dev,struct v4l2_m2m_ctx *m2m_ctx);
Greg Kroah-Hartman
maintainerPATCH 429/737 mptcp: schedule rtx timer only after pushing data
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 2ea6190f42d0416a4310e60a7fcb0b49fcbbd4fb upstream.
The MPTCP protocol usually schedule the retransmission timer only when there is some chances for such retransmissions to happen.
With a notable exception: __mptcp_push_pending() currently schedule such timer unconditionally, potentially leading to unnecessary rtx timer expiration.
The issue is present since the blamed commit below but become easily reproducible after commit 27b0e701d387 ("mptcp: drop bogus optimization in __mptcp_check_push()")
--- net/mptcp/protocol.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
net/mptcp/protocol.c +9 -6
@@ -1630,7 +1630,7 @@ void __mptcp_push_pending(struct sock *sstruct mptcp_sendmsg_info info = { .flags = flags, }; -bool do_check_data_fin = false; +bool copied = false;int push_count =1 ;while (mptcp_send_head (sk) && (push_count >0 )) {
@@ -1672,7 +1672,7 @@ void __mptcp_push_pending(struct sock *s push_count--;continue ; } - do_check_data_fin = true; + copied = true; } } }
@@ -1681,11 +1681,14 @@ void __mptcp_push_pending(struct sock *sif (ssk)mptcp_push_release (ssk, &info); -/* ensure the rtx timer is running */ -if (!mptcp_rtx_timer_pending (sk)) -mptcp_reset_rtx_timer (sk); -if (do_check_data_fin) +/* Avoid scheduling the rtx timer if no data has been pushed; the timer +* will be updated on positive acks by __mptcp_cleanup_una(). +*/ +if (copied) { +if (!mptcp_rtx_timer_pending (sk)) +mptcp_reset_rtx_timer (sk);mptcp_check_send_data_fin (sk); + } }static void __mptcp_subflow_push_pending (struct sock *sk,struct sock *ssk,bool first)
Greg Kroah-Hartman
maintainerPATCH 430/737 mptcp: avoid deadlock on fallback while reinjecting
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit ffb8c27b0539dd90262d1021488e7817fae57c42 upstream.
Jakub reported an MPTCP deadlock at fallback time:
WARNING: possible recursive locking detected
6.18.0-rc7-virtme #1 Not tainted
--------------------------------------------
mptcp_connect/20858 is trying to acquire lock:
ff1100001da18b60 (&msk->fallback_lock){+.-.}-{3:3}, at: __mptcp_try_fallback+0xd8/0x280
but task is already holding lock:
ff1100001da18b60 (&msk->fallback_lock){+.-.}-{3:3}, at: __mptcp_retrans+0x352/0xaa0
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
---- lock(&msk->fallback_lock);
lock(&msk->fallback_lock);
*** DEADLOCK ***
May be due to missing lock nesting notation
3 locks held by mptcp_connect/20858:
#0: ff1100001da18290 (sk_lock-AF_INET){+.+.}-{0:0}, at: mptcp_sendmsg+0x114/0x1bc0 #1: ff1100001db40fd0 (k-sk_lock-AF_INET#2){+.+.}-{0:0}, at: __mptcp_retrans+0x2cb/0xaa0 #2: ff1100001da18b60 (&msk->fallback_lock){+.-.}-{3:3}, at: __mptcp_retrans+0x352/0xaa0
stack backtrace: CPU: 0 UID: 0 PID: 20858 Comm: mptcp_connect Not tainted 6.18.0-rc7-virtme #1 PREEMPT(full) Hardware name: Bochs, BIOS Bochs 01/01/2011 Call Trace: <TASK> dump_stack_lvl+0x6f/0xa0 print_deadlock_bug.cold+0xc0/0xcd validate_chain+0x2ff/0x5f0 __lock_acquire+0x34c/0x740 lock_acquire.part.0+0xbc/0x260 _raw_spin_lock_bh+0x38/0x50 __mptcp_try_fallback+0xd8/0x280 mptcp_sendmsg_frag+0x16c2/0x3050 __mptcp_retrans+0x421/0xaa0 mptcp_release_cb+0x5aa/0xa70 release_sock+0xab/0x1d0 mptcp_sendmsg+0xd5b/0x1bc0 sock_write_iter+0x281/0x4d0 new_sync_write+0x3c5/0x6f0 vfs_write+0x65e/0xbb0 ksys_write+0x17e/0x200 do_syscall_64+0xbb/0xfd0 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x7fa5627cbc5e Code: 4d 89 d8 e8 14 bd 00 00 4c 8b 5d f8 41 8b 93 08 03 00 00 59 5e 48 83 f8 fc 74 11 c9 c3 0f 1f 80 00 00 00 00 48 8b 45 10 0f 05 <c9> c3 83 e2 39 83 fa 08 75 e7 e8 13 ff ff ff 0f 1f 00 f3 0f 1e fa RSP: 002b:00007fff1fe14700 EFLAGS: 00000202 ORIG_RAX: 0000000000000001 RAX: ffffffffffffffda RBX: 0000000000000005 RCX: 00007fa5627cbc5e RDX: 0000000000001f9c RSI: 00007fff1fe16984 RDI: 0000000000000005 RBP: 00007fff1fe14710 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000202 R12: 00007fff1fe16920 R13: 0000000000002000 R14: 0000000000001f9c R15: 0000000000001f9c
The packet scheduler could attempt a reinjection after receiving an MP_FAIL and before the infinite map has been transmitted, causing a deadlock since MPTCP needs to do the reinjection atomically from WRT fallback.
Address the issue explicitly avoiding the reinjection in the critical scenario. Note that this is the only fallback critical section that could potentially send packets and hit the double-lock.
--- net/mptcp/protocol.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/mptcp/protocol.c +5 -2
@@ -2712,10 +2712,13 @@ static void __mptcp_retrans(struct sock/* * make the whole retrans decision, xmit, disallow -* fallback atomic +* fallback atomic, note that we can't retrans even +* when an infinite fallback is in progress, i.e. new +* subflows are disallowed. */ spin_lock_bh (&msk->fallback_lock); -if (__mptcp_check_fallback (msk)) { +if (__mptcp_check_fallback (msk) || + !msk->allow_subflows) {spin_unlock_bh (&msk->fallback_lock);release_sock (ssk); goto clear_scheduled;
Greg Kroah-Hartman
maintainerPATCH 431/737 usb: usb-storage: Maintain minimal modifications to the bcdDevice range.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Changcheng <[email protected]>
commit 0831269b5f71594882accfceb02638124f88955d upstream.
We cannot determine which models require the NO_ATA_1X and IGNORE_RESIDUE quirks aside from the EL-R12 optical drive device.
--- drivers/usb/storage/unusual_uas.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/storage/unusual_uas.h +1 -1
@@ -98,7 +98,7 @@ UNUSUAL_DEV(0x125f, 0xa94a, 0x0160, 0x01 US_FL_NO_ATA_1X),/* Reported-by: Benjamin Tissoires <[email protected]> */ -UNUSUAL_DEV(0x13fd, 0x3940, 0x0309, 0x0309, +UNUSUAL_DEV(0x13fd, 0x3940, 0x0000, 0x0309, "Initio Corporation", "INIC-3069", USB_SC_DEVICE, USB_PR_DEVICE, NULL,
Greg Kroah-Hartman
maintainerPATCH 432/737 media: dvb-usb: dtv5100: fix out-of-bounds in dtv5100_i2c_msg()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeongjun Park <[email protected]>
commit b91e6aafe8d356086cc621bc03e35ba2299e4788 upstream.
rlen value is a user-controlled value, but dtv5100_i2c_msg() does not check the size of the rlen value. Therefore, if it is set to a value larger than sizeof(st->data), an out-of-bounds vuln occurs for st->data.
Therefore, we need to add proper range checking to prevent this vuln.
--- drivers/media/usb/dvb-usb/dtv5100.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/media/usb/dvb-usb/dtv5100.c +5 -0
@@ -55,6 +55,11 @@ static int dtv5100_i2c_msg(struct dvb_us } index = (addr <<8 ) + wbuf[0 ]; +if (rlen >sizeof (st->data)) { +warn ("rlen = %x is too big!\n" , rlen); +return -EINVAL ; + } +memcpy (st->data, rbuf, rlen);msleep (1 );/* avoid I2C errors */ return usb_control_msg(d->udev, pipe, request,
Greg Kroah-Hartman
maintainerPATCH 433/737 media: pvrusb2: Fix incorrect variable used in trace message
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
commit be440980eace19c035a0745fd6b6e42707bc4f49 upstream.
The pvr2_trace message is reporting an error about control read transfers, however it is using the incorrect variable write_len instead of read_lean. Fix this by using the correct variable read_len.
--- drivers/media/usb/pvrusb2/pvrusb2-hdw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/usb/pvrusb2/pvrusb2-hdw.c +1 -1
@@ -3622,7 +3622,7 @@ static int pvr2_send_request_ex(struct ppvr2_trace (PVR2_TRACE_ERROR_LEGS ,"Attempted to execute %d byte control-read transfer (limit=%d)" , - write_len,PVR2_CTL_BUFFSIZE ); + read_len,PVR2_CTL_BUFFSIZE );return -EINVAL ; }if ((!write_len) && (!read_len)) {
Greg Kroah-Hartman
maintainerPATCH 434/737 phy: broadcom: bcm63xx-usbh: fix section mismatches
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 356d1924b9a6bc2164ce2bf1fad147b0c37ae085 upstream.
Platform drivers can be probed after their init sections have been discarded (e.g. on probe deferral or manual rebind through sysfs) so the probe function and match table must not live in init.
--- drivers/phy/broadcom/phy-bcm63xx-usbh.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/phy/broadcom/phy-bcm63xx-usbh.c +3 -3
@@ -375,7 +375,7 @@ static struct phy *bcm63xx_usbh_phy_xlatreturn of_phy_simple_xlate (dev, args); } -static int __init bcm63xx_usbh_phy_probe (struct platform_device *pdev) +static int bcm63xx_usbh_phy_probe (struct platform_device *pdev) {struct device *dev = &pdev->dev;struct bcm63xx_usbh_phy *usbh;
@@ -432,7 +432,7 @@ static int __init bcm63xx_usbh_phy_probereturn 0 ; } -static const struct of_device_id bcm63xx_usbh_phy_ids[]__initconst = { +static const struct of_device_id bcm63xx_usbh_phy_ids[] = { { .compatible ="brcm,bcm6318-usbh-phy" , .data = &usbh_bcm6318 }, { .compatible ="brcm,bcm6328-usbh-phy" , .data = &usbh_bcm6328 }, { .compatible ="brcm,bcm6358-usbh-phy" , .data = &usbh_bcm6358 },
@@ -443,7 +443,7 @@ static const struct of_device_id bcm63xx };MODULE_DEVICE_TABLE (of, bcm63xx_usbh_phy_ids); -static struct platform_driver bcm63xx_usbh_phy_driver__refdata = { +static struct platform_driver bcm63xx_usbh_phy_driver = { .driver = { .name ="bcm63xx-usbh-phy" , .of_match_table = bcm63xx_usbh_phy_ids,
Greg Kroah-Hartman
maintainerPATCH 435/737 USB: lpc32xx_udc: Fix error handling in probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit c84117912bddd9e5d87e68daf182410c98181407 upstream.
lpc32xx_udc_probe() acquires an i2c_client reference through isp1301_get_client() but fails to release it in both error handling paths and the normal removal path. This could result in a reference count leak for the I2C device, preventing proper cleanup and potentially leading to resource exhaustion. Add put_device() to release the reference in the probe failure path and in the remove function.
Calling path: isp1301_get_client() -> of_find_i2c_device_by_node() -> i2c_find_device_by_fwnode(). As comments of i2c_find_device_by_fwnode() says, 'The user must call put_device(&client->dev) once done with the i2c client.'
Found by code review.
--- drivers/usb/gadget/udc/lpc32xx_udc.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
drivers/usb/gadget/udc/lpc32xx_udc.c +15 -6
@@ -3027,7 +3027,7 @@ static int lpc32xx_udc_probe(struct plat pdev->dev.dma_mask = &lpc32xx_usbd_dmamask; retval =dma_set_coherent_mask (&pdev->dev,DMA_BIT_MASK (32 ));if (retval) -return retval; + goto i2c_fail; udc->board = &lpc32xx_usbddata;
@@ -3045,28 +3045,32 @@ static int lpc32xx_udc_probe(struct plat/* Get IRQs */ for (i =0 ; i <4 ; i++) { udc->udp_irq[i] =platform_get_irq (pdev, i); -if (udc->udp_irq[i] <0 ) -return udc->udp_irq[i]; +if (udc->udp_irq[i] <0 ) { + retval = udc->udp_irq[i]; + goto i2c_fail; + } } udc->udp_baseaddr =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (udc->udp_baseaddr)) {dev_err (udc->dev,"IO map failure\n" ); -return PTR_ERR (udc->udp_baseaddr); + retval =PTR_ERR (udc->udp_baseaddr); + goto i2c_fail; }/* Get USB device clock */ udc->usb_slv_clk =devm_clk_get (&pdev->dev,NULL );if (IS_ERR (udc->usb_slv_clk)) {dev_err (udc->dev,"failed to acquire USB device clock\n" ); -return PTR_ERR (udc->usb_slv_clk); + retval =PTR_ERR (udc->usb_slv_clk); + goto i2c_fail; }/* Enable USB device clock */ retval =clk_prepare_enable (udc->usb_slv_clk);if (retval <0 ) {dev_err (udc->dev,"failed to start USB device clock\n" ); -return retval; + goto i2c_fail; }/* Setup deferred workqueue data */
@@ -3168,6 +3172,8 @@ dma_alloc_fail:dma_free_coherent (&pdev->dev,UDCA_BUFF_SIZE , udc->udca_v_base, udc->udca_p_base); i2c_fail: +if (udc->isp1301_i2c_client) +put_device (&udc->isp1301_i2c_client->dev);clk_disable_unprepare (udc->usb_slv_clk);dev_err (udc->dev,"%s probe failed, %d\n" , driver_name, retval);
@@ -3193,6 +3199,9 @@ static int lpc32xx_udc_remove(struct pladma_free_coherent (&pdev->dev,UDCA_BUFF_SIZE , udc->udca_v_base, udc->udca_p_base); +if (udc->isp1301_i2c_client) +put_device (&udc->isp1301_i2c_client->dev); +clk_disable_unprepare (udc->usb_slv_clk);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 436/737 usb: phy: fsl-usb: Fix use-after-free in delayed work during device removal
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit 41ca62e3e21e48c2903b3b45e232cf4f2ff7434f upstream.
The delayed work item otg_event is initialized in fsl_otg_conf() and scheduled under two conditions:
1. When a host controller binds to the OTG controller.
2. When the USB ID pin state changes (cable insertion/removal).
A race condition occurs when the device is removed via fsl_otg_remove():
the fsl_otg instance may be freed while the delayed work is still pending or executing. This leads to use-after-free when the work function fsl_otg_event() accesses the already freed memory.
The problematic scenario:
(detach thread) | (delayed work)
fsl_otg_remove() |
kfree(fsl_otg_dev) //FREE| fsl_otg_event()
| og = container_of(...) //USE
| og-> //USEFix this by calling disable_delayed_work_sync() in fsl_otg_remove() before deallocating the fsl_otg structure. This ensures the delayed work is properly canceled and completes execution prior to memory deallocation.
This bug was identified through static analysis.
--- drivers/usb/phy/phy-fsl-usb.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/phy/phy-fsl-usb.c +1 -0
@@ -987,6 +987,7 @@ static void fsl_otg_remove(struct platfo {struct fsl_usb2_platform_data *pdata =dev_get_platdata (&pdev->dev); +disable_delayed_work_sync (&fsl_otg_dev->otg_event);usb_remove_phy (&fsl_otg_dev->phy);free_irq (fsl_otg_dev->irq, fsl_otg_dev);
Greg Kroah-Hartman
maintainerPATCH 437/737 usb: phy: isp1301: fix non-OF device reference imbalance
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit b4b64fda4d30a83a7f00e92a0c8a1d47699609f3 upstream.
A recent change fixing a device reference leak in a UDC driver introduced a potential use-after-free in the non-OF case as the isp1301_get_client() helper only increases the reference count for the returned I2C device in the OF case.
Increment the reference count also for non-OF so that the caller can decrement it unconditionally.
Note that this is inherently racy just as using the returned I2C device is since nothing is preventing the PHY driver from being unbound while in use.
--- drivers/usb/phy/phy-isp1301.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/usb/phy/phy-isp1301.c +6 -1
@@ -149,7 +149,12 @@ struct i2c_client *isp1301_get_client(streturn client;/* non-DT: only one ISP1301 chip supported */ -return isp1301_i2c_client; +if (isp1301_i2c_client) { +get_device (&isp1301_i2c_client->dev); +return isp1301_i2c_client; + } + +return NULL ; }EXPORT_SYMBOL_GPL (isp1301_get_client);
Greg Kroah-Hartman
maintainerPATCH 438/737 usb: dwc3: of-simple: fix clock resource leak in dwc3_of_simple_probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miaoqian Lin <[email protected]>
commit 3b4961313d31e200c9e974bb1536cdea217f78b5 upstream.
When clk_bulk_prepare_enable() fails, the error path jumps to err_resetc_assert, skipping clk_bulk_put_all() and leaking the clock references acquired by clk_bulk_get_all().
Add err_clk_put_all label to properly release clock resources in all error paths.
Found via static analysis and code review.
--- drivers/usb/dwc3/dwc3-of-simple.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/usb/dwc3/dwc3-of-simple.c +4 -3
@@ -71,11 +71,11 @@ static int dwc3_of_simple_probe(struct p simple->num_clocks = ret; ret =clk_bulk_prepare_enable (simple->num_clocks, simple->clks);if (ret) - goto err_resetc_assert; + goto err_clk_put_all; ret =of_platform_populate (np,NULL ,NULL , dev);if (ret) - goto err_clk_put; + goto err_clk_disable;pm_runtime_set_active (dev);pm_runtime_enable (dev);
@@ -83,8 +83,9 @@ static int dwc3_of_simple_probe(struct preturn 0 ; -err_clk_put: +err_clk_disable:clk_bulk_disable_unprepare (simple->num_clocks, simple->clks); +err_clk_put_all:clk_bulk_put_all (simple->num_clocks, simple->clks); err_resetc_assert:
Greg Kroah-Hartman
maintainerPATCH 439/737 usb: dwc3: keep susphy enabled during exit to avoid controller faults
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Udipto Goswami <[email protected]>
commit e1003aa7ec9eccdde4c926bd64ef42816ad55f25 upstream.
On some platforms, switching USB roles from host to device can trigger controller faults due to premature PHY power-down. This occurs when the PHY is disabled too early during teardown, causing synchronization issues between the PHY and controller.
Keep susphy enabled during dwc3_host_exit() and dwc3_gadget_exit() ensures the PHY remains in a low-power state capable of handling required commands during role switch.
--- drivers/usb/dwc3/gadget.c | 2 +- drivers/usb/dwc3/host.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/usb/dwc3/gadget.c +1 -1
@@ -4807,7 +4807,7 @@ void dwc3_gadget_exit(struct dwc3 *dwc)if (!dwc->gadget)return ; -dwc3_enable_susphy (dwc, false); +dwc3_enable_susphy (dwc, true);usb_del_gadget (dwc->gadget);dwc3_gadget_free_endpoints (dwc);usb_put_gadget (dwc->gadget);
drivers/usb/dwc3/host.c +1 -1
@@ -168,7 +168,7 @@ void dwc3_host_exit(struct dwc3 *dwc)if (dwc->sys_wakeup)device_init_wakeup (&dwc->xhci->dev, false); -dwc3_enable_susphy (dwc, false); +dwc3_enable_susphy (dwc, true);platform_device_unregister (dwc->xhci); dwc->xhci =NULL ; }
Greg Kroah-Hartman
maintainerPATCH 440/737 usb: renesas_usbhs: Fix a resource leak in usbhs_pipe_malloc()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
commit 36cc7e09df9e43db21b46519b740145410dd9f4a upstream.
usbhsp_get_pipe() set pipe's flags to IS_USED. In error paths, usbhsp_put_pipe() is required to clear pipe's flags to prevent pipe exhaustion.
--- drivers/usb/renesas_usbhs/pipe.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/renesas_usbhs/pipe.c +2 -0
@@ -713,11 +713,13 @@ struct usbhs_pipe *usbhs_pipe_malloc(str/* make sure pipe is not busy */ ret =usbhsp_pipe_barrier (pipe);if (ret <0 ) { +usbhsp_put_pipe (pipe);dev_err (dev,"pipe setup failed %d\n" ,usbhs_pipe_number (pipe));return NULL ; }if (usbhsp_setup_pipecfg (pipe, is_host, dir_in, &pipecfg)) { +usbhsp_put_pipe (pipe);dev_err (dev,"can't setup pipe\n" );return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 441/737 char: applicom: fix NULL pointer dereference in ac_ioctl
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tianchu Chen <[email protected]>
commit 82d12088c297fa1cef670e1718b3d24f414c23f7 upstream.
Discovered by Atuin - Automated Vulnerability Discovery Engine.
In ac_ioctl, the validation of IndexCard and the check for a valid RamIO pointer are skipped when cmd is 6. However, the function unconditionally executes readb(apbs[IndexCard].RamIO + VERS) at the end.
If cmd is 6, IndexCard may reference a board that does not exist (where RamIO is NULL), leading to a NULL pointer dereference.
Fix this by skipping the readb access when cmd is 6, as this command is a global information query and does not target a specific board context.
--- drivers/char/applicom.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/char/applicom.c +4 -1
@@ -836,7 +836,10 @@ static long ac_ioctl(struct file *file, ret = -ENOTTY ;break ; } - Dummy =readb (apbs[IndexCard].RamIO +VERS ); + +if (cmd !=6 ) + Dummy =readb (apbs[IndexCard].RamIO +VERS ); +kfree (adgl);mutex_unlock (&ac_mutex);return ret;
Greg Kroah-Hartman
maintainerPATCH 442/737 intel_th: Fix error handling in intel_th_output_open
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit 6d5925b667e4ed9e77c8278cc215191d29454a3f upstream.
intel_th_output_open() calls bus_find_device_by_devt() which internally increments the device reference count via get_device(), but this reference is not properly released in several error paths. When device driver is unavailable, file operations cannot be obtained, or the driver's open method fails, the function returns without calling put_device(), leading to a permanent device reference count leak. This prevents the device from being properly released and could cause resource exhaustion over time.
Found by code review.
--- drivers/hwtracing/intel_th/core.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
drivers/hwtracing/intel_th/core.c +15 -5
@@ -810,13 +810,17 @@ static int intel_th_output_open(struct iint err; dev =bus_find_device_by_devt (&intel_th_bus, inode->i_rdev); -if (!dev || !dev->driver) -return -ENODEV ; +if (!dev || !dev->driver) { + err = -ENODEV ; + goto out_no_device; + } thdrv =to_intel_th_driver (dev->driver); fops =fops_get (thdrv->fops); -if (!fops) -return -ENODEV ; +if (!fops) { + err = -ENODEV ; + goto out_put_device; + }replace_fops (file, fops);
@@ -824,10 +828,16 @@ static int intel_th_output_open(struct iif (file->f_op->open) { err = file->f_op->open (inode, file); -return err; +if (err) + goto out_put_device; }return 0 ; + +out_put_device: +put_device (dev); +out_no_device: +return err; }static const struct file_operations intel_th_output_fops = {
Greg Kroah-Hartman
maintainerPATCH 443/737 cpuidle: governors: teo: Drop misguided target residency check
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
commit a03b2011808ab02ccb7ab6b573b013b77fbb5921 upstream.
When the target residency of the current candidate idle state is greater than the expected time till the closest timer (the sleep length), it does not matter whether or not the tick has already been stopped or if it is going to be stopped. The closest timer will trigger anyway at its due time, so if an idle state with target residency above the sleep length is selected, energy will be wasted and there may be excess latency.
Of course, if the closest timer were canceled before it could trigger, a deeper idle state would be more suitable, but this is not expected to happen (generally speaking, hrtimers are not expected to be canceled as a rule).
Accordingly, the teo_state_ok() check done in that case causes energy to be wasted more often than it allows any energy to be saved (if it allows any energy to be saved at all), so drop it and let the governor use the teo_find_shallower_state() return value as the new candidate idle state index.
--- drivers/cpuidle/governors/teo.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/cpuidle/governors/teo.c +2 -5
@@ -595,11 +595,8 @@ static int teo_select(struct cpuidle_dri* If the closest expected timer is before the terget residency of the * candidate state, a shallower one needs to be found. */ -if (drv->states[idx].target_residency_ns > duration_ns) { - i =teo_find_shallower_state (drv, dev, idx, duration_ns, false); -if (teo_state_ok (i, drv)) - idx = i; - } +if (drv->states[idx].target_residency_ns > duration_ns) + idx =teo_find_shallower_state (drv, dev, idx, duration_ns, false);/* * If the selected state's target residency is below the tick length
Greg Kroah-Hartman
maintainerPATCH 444/737 cpufreq: nforce2: fix reference count leak in nforce2
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miaoqian Lin <[email protected]>
commit 9600156bb99852c216a2128cdf9f114eb67c350f upstream.
There are two reference count leaks in this driver:
1. In nforce2_fsb_read(): pci_get_subsys() increases the reference count of the PCI device, but pci_dev_put() is never called to release it, thus leaking the reference.
2. In nforce2_detect_chipset(): pci_get_subsys() gets a reference to the nforce2_dev which is stored in a global variable, but the reference is never released when the module is unloaded.
Fix both by:
- Adding pci_dev_put(nforce2_sub5) in nforce2_fsb_read() after reading the configuration.
- Adding pci_dev_put(nforce2_dev) in nforce2_exit() to release the global device reference.
Found via static analysis.
--- drivers/cpufreq/cpufreq-nforce2.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cpufreq/cpufreq-nforce2.c +3 -0
@@ -145,6 +145,8 @@ static unsigned int nforce2_fsb_read(intpci_read_config_dword (nforce2_sub5,NFORCE2_BOOTFSB , &fsb); fsb /=1000000 ; +pci_dev_put (nforce2_sub5); +/* Check if PLL register is already set */ pci_read_config_byte (nforce2_dev,NFORCE2_PLLENABLE , (u8 *)&temp);
@@ -432,6 +434,7 @@ static int __init nforce2_init(void) static void __exit nforce2_exit(void) {cpufreq_unregister_driver (&nforce2_driver); +pci_dev_put (nforce2_dev); }module_init (nforce2_init);
Greg Kroah-Hartman
maintainerPATCH 445/737 scsi: Revert "scsi: qla2xxx: Perform lockless command completion in abort path"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Battersby <[email protected]>
commit b57fbc88715b6d18f379463f48a15b560b087ffe upstream.
This reverts commit 0367076b0817d5c75dfb83001ce7ce5c64d803a9.
The commit being reverted added code to __qla2x00_abort_all_cmds() to call sp->done() without holding a spinlock. But unlike the older code below it, this new code failed to check sp->cmd_type and just assumed TYPE_SRB, which results in a jump to an invalid pointer in target-mode with TYPE_TGT_CMD:
qla2xxx [0000:65:00.0]-d034:8: qla24xx_do_nack_work create sess success
0000000009f7a79b
qla2xxx [0000:65:00.0]-5003:8: ISP System Error - mbx1=1ff5h mbx2=10h
mbx3=0h mbx4=0h mbx5=191h mbx6=0h mbx7=0h.
qla2xxx [0000:65:00.0]-d01e:8: -> fwdump no buffer
qla2xxx [0000:65:00.0]-f03a:8: qla_target(0): System error async event
0x8002 occurred
qla2xxx [0000:65:00.0]-00af:8: Performing ISP error recovery -
ha=0000000058183fda.
BUG: kernel NULL pointer dereference, address: 0000000000000000 PF: supervisor instruction fetch in kernel mode PF: error_code(0x0010) - not-present page PGD 0 P4D 0 Oops: 0010 [#1] SMP CPU: 2 PID: 9446 Comm: qla2xxx_8_dpc Tainted: G O 6.1.133 #1 Hardware name: Supermicro Super Server/X11SPL-F, BIOS 4.2 12/15/2023 RIP: 0010:0x0 Code: Unable to access opcode bytes at 0xffffffffffffffd6. RSP: 0018:ffffc90001f93dc8 EFLAGS: 00010206 RAX: 0000000000000282 RBX: 0000000000000355 RCX: ffff88810d16a000 RDX: ffff88810dbadaa8 RSI: 0000000000080000 RDI: ffff888169dc38c0 RBP: ffff888169dc38c0 R08: 0000000000000001 R09: 0000000000000045 R10: ffffffffa034bdf0 R11: 0000000000000000 R12: ffff88810800bb40 R13: 0000000000001aa8 R14: ffff888100136610 R15: ffff8881070f7400 FS: 0000000000000000(0000) GS:ffff88bf80080000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffffffffffffffd6 CR3: 000000010c8ff006 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> ? __die+0x4d/0x8b ? page_fault_oops+0x91/0x180 ? trace_buffer_unlock_commit_regs+0x38/0x1a0 ? exc_page_fault+0x391/0x5e0 ? asm_exc_page_fault+0x22/0x30 __qla2x00_abort_all_cmds+0xcb/0x3e0 [qla2xxx_scst] qla2x00_abort_all_cmds+0x50/0x70 [qla2xxx_scst] qla2x00_abort_isp_cleanup+0x3b7/0x4b0 [qla2xxx_scst] qla2x00_abort_isp+0xfd/0x860 [qla2xxx_scst] qla2x00_do_dpc+0x581/0xa40 [qla2xxx_scst] kthread+0xa8/0xd0 </TASK>
Then commit 4475afa2646d ("scsi: qla2xxx: Complete command early within lock") added the spinlock back, because not having the lock caused a race and a crash. But qla2x00_abort_srb() in the switch below already checks for qla2x00_chip_is_down() and handles it the same way, so the code above the switch is now redundant and still buggy in target-mode. Remove it.
--- drivers/scsi/qla2xxx/qla_os.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/scsi/qla2xxx/qla_os.c +0 -6
@@ -1874,12 +1874,6 @@ __qla2x00_abort_all_cmds(struct qla_qpaifor (cnt =1 ; cnt < req->num_outstanding_cmds; cnt++) { sp = req->outstanding_cmds[cnt];if (sp) { -if (qla2x00_chip_is_down (vha)) { - req->outstanding_cmds[cnt] =NULL ; - sp->done (sp, res); -continue ; - } -switch (sp->cmd_type) {case TYPE_SRB :qla2x00_abort_srb (qp, sp, res, &flags);
Greg Kroah-Hartman
maintainerPATCH 446/737 scsi: aic94xx: fix use-after-free in device removal path
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
commit f6ab594672d4cba08540919a4e6be2e202b60007 upstream.
The asd_pci_remove() function fails to synchronize with pending tasklets before freeing the asd_ha structure, leading to a potential use-after-free vulnerability.
When a device removal is triggered (via hot-unplug or module unload), race condition can occur.
The fix adds tasklet_kill() before freeing the asd_ha structure, ensuring all scheduled tasklets complete before cleanup proceeds.
--- drivers/scsi/aic94xx/aic94xx_init.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/aic94xx/aic94xx_init.c +3 -0
@@ -896,6 +896,9 @@ static void asd_pci_remove(struct pci_deasd_disable_ints (asd_ha); +/* Ensure all scheduled tasklets complete before freeing resources */ +tasklet_kill (&asd_ha->seq.dl_tasklet); +asd_remove_dev_attrs (asd_ha);/* XXX more here as needed */
Greg Kroah-Hartman
maintainerPATCH 447/737 NFSD: use correct reservation type in nfsd4_scsi_fence_client
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dai Ngo <[email protected]>
commit 6f52063db9aabdaabea929b1e998af98c2e8d917 upstream.
The reservation type argument for the pr_preempt call should match the one used in nfsd4_block_get_device_info_scsi.
--- fs/nfsd/blocklayout.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/nfsd/blocklayout.c +2 -1
@@ -334,7 +334,8 @@ nfsd4_scsi_fence_client(struct nfs4_layostruct block_device *bdev = ls->ls_file->nf_file->f_path.mnt->mnt_sb->s_bdev; bdev->bd_disk->fops->pr_ops->pr_preempt (bdev,NFSD_MDS_PR_KEY , -nfsd4_scsi_pr_key (clp),0 , true); +nfsd4_scsi_pr_key (clp), +PR_EXCLUSIVE_ACCESS_REG_ONLY , true); }const struct nfsd4_layout_ops scsi_layout_ops = {
Greg Kroah-Hartman
maintainerPATCH 448/737 scsi: target: Reset t_task_cdb pointer in error case
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Vatoropin <[email protected]>
commit 5053eab38a4c4543522d0c320c639c56a8b59908 upstream.
If allocation of cmd->t_task_cdb fails, it remains NULL but is later dereferenced in the 'err' path.
In case of error, reset NULL t_task_cdb value to point at the default fixed-size buffer.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/target/target_core_transport.c | 1 + 1 file changed, 1 insertion(+)
drivers/target/target_core_transport.c +1 -0
@@ -1524,6 +1524,7 @@ target_cmd_init_cdb(struct se_cmd *cmd,if (scsi_command_size (cdb) >sizeof (cmd->__t_task_cdb)) { cmd->t_task_cdb =kzalloc (scsi_command_size (cdb), gfp);if (!cmd->t_task_cdb) { + cmd->t_task_cdb = &cmd->__t_task_cdb[0 ]; pr_err("Unable to allocate cmd->t_task_cdb" " %u > sizeof(cmd->__t_task_cdb): %lu ops\n", scsi_command_size(cdb),
Greg Kroah-Hartman
maintainerPATCH 449/737 f2fs: ensure node page reads complete before f2fs_put_super() finishes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Prusakowski <[email protected]>
commit 297baa4aa263ff8f5b3d246ee16a660d76aa82c4 upstream.
Xfstests generic/335, generic/336 sometimes crash with the following message:
F2FS-fs (dm-0): detect filesystem reference count leak during umount, type: 9, count: 1
------------[ cut here ]------------ kernel BUG at fs/f2fs/super.c:1939! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 1 UID: 0 PID: 609351 Comm: umount Tainted: G W 6.17.0-rc5-xfstests-g9dd1835ecda5 #1 PREEMPT(none) Tainted: [W]=WARN Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:f2fs_put_super+0x3b3/0x3c0 Call Trace: <TASK> generic_shutdown_super+0x7e/0x190 kill_block_super+0x1a/0x40 kill_f2fs_super+0x9d/0x190 deactivate_locked_super+0x30/0xb0 cleanup_mnt+0xba/0x150 task_work_run+0x5c/0xa0 exit_to_user_mode_loop+0xb7/0xc0 do_syscall_64+0x1ae/0x1c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e </TASK> ---[ end trace 0000000000000000 ]---
It appears that sometimes it is possible that f2fs_put_super() is called before all node page reads are completed.
Adding a call to f2fs_wait_on_all_pages() for F2FS_RD_NODE fixes the problem.
--- fs/f2fs/super.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
fs/f2fs/super.c +9 -8
@@ -1637,14 +1637,6 @@ static void f2fs_put_super(struct super_truncate_inode_pages_final (META_MAPPING (sbi)); } -for (i =0 ; i <NR_COUNT_TYPE ; i++) { -if (!get_pages (sbi, i)) -continue ; -f2fs_err (sbi,"detect filesystem reference count leak during " -"umount, type: %d, count: %lld" , i,get_pages (sbi, i)); -f2fs_bug_on (sbi,1 ); - } -f2fs_bug_on (sbi, sbi->fsync_node_num);f2fs_destroy_compress_inode (sbi);
@@ -1655,6 +1647,15 @@ static void f2fs_put_super(struct super_iput (sbi->meta_inode); sbi->meta_inode =NULL ; +/* Should check the page counts after dropping all node/meta pages */ +for (i =0 ; i <NR_COUNT_TYPE ; i++) { +if (!get_pages (sbi, i)) +continue ; +f2fs_err (sbi,"detect filesystem reference count leak during " +"umount, type: %d, count: %lld" , i,get_pages (sbi, i)); +f2fs_bug_on (sbi,1 ); + } +/* * iput() can update stat information, if f2fs_write_checkpoint() * above failed with error.
Greg Kroah-Hartman
maintainerPATCH 450/737 f2fs: fix to avoid updating zero-sized extent in extent cache
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
commit 7c37c79510329cd951a4dedf3f7bf7e2b18dccec upstream.
As syzbot reported:
F2FS-fs (loop0): __update_extent_tree_range: extent len is zero, type: 0, extent [0, 0, 0], age [0, 0]
------------[ cut here ]------------ kernel BUG at fs/f2fs/extent_cache.c:678! Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 0 UID: 0 PID: 5336 Comm: syz.0.0 Not tainted syzkaller #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 RIP: 0010:__update_extent_tree_range+0x13bc/0x1500 fs/f2fs/extent_cache.c:678 Call Trace: <TASK> f2fs_update_read_extent_cache_range+0x192/0x3e0 fs/f2fs/extent_cache.c:1085 f2fs_do_zero_range fs/f2fs/file.c:1657 [inline] f2fs_zero_range+0x10c1/0x1580 fs/f2fs/file.c:1737 f2fs_fallocate+0x583/0x990 fs/f2fs/file.c:2030 vfs_fallocate+0x669/0x7e0 fs/open.c:342 ioctl_preallocate fs/ioctl.c:289 [inline] file_ioctl+0x611/0x780 fs/ioctl.c:-1 do_vfs_ioctl+0xb33/0x1430 fs/ioctl.c:576 __do_sys_ioctl fs/ioctl.c:595 [inline] __se_sys_ioctl+0x82/0x170 fs/ioctl.c:583 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f07bc58eec9
In error path of f2fs_zero_range(), it may add a zero-sized extent into extent cache, it should be avoided.
--- fs/f2fs/file.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/f2fs/file.c +5 -2
@@ -1584,8 +1584,11 @@ static int f2fs_do_zero_range(struct dnof2fs_set_data_blkaddr (dn,NEW_ADDR ); } -f2fs_update_read_extent_cache_range (dn, start,0 , index - start); -f2fs_update_age_extent_cache_range (dn, start, index - start); +if (index > start) { +f2fs_update_read_extent_cache_range (dn, start,0 , + index - start); +f2fs_update_age_extent_cache_range (dn, start, index - start); + }return ret; }
Greg Kroah-Hartman
maintainerPATCH 451/737 f2fs: invalidate dentry cache on failed whiteout creation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Deepanshu Kartikey <[email protected]>
commit d33f89b34aa313f50f9a512d58dd288999f246b0 upstream.
F2FS can mount filesystems with corrupted directory depth values that get runtime-clamped to MAX_DIR_HASH_DEPTH. When RENAME_WHITEOUT operations are performed on such directories, f2fs_rename performs directory modifications (updating target entry and deleting source entry) before attempting to add the whiteout entry via f2fs_add_link.
If f2fs_add_link fails due to the corrupted directory structure, the function returns an error to VFS, but the partial directory modifications have already been committed to disk. VFS assumes the entire rename operation failed and does not update the dentry cache, leaving stale mappings.
In the error path, VFS does not call d_move() to update the dentry cache. This results in new_dentry still pointing to the old inode (new_inode) which has already had its i_nlink decremented to zero. The stale cache causes subsequent operations to incorrectly reference the freed inode.
This causes subsequent operations to use cached dentry information that no longer matches the on-disk state. When a second rename targets the same entry, VFS attempts to decrement i_nlink on the stale inode, which may already have i_nlink=0, triggering a WARNING in drop_nlink().
Example sequence:
1. First rename (RENAME_WHITEOUT): file2 → file1
- f2fs updates file1 entry on disk (points to inode 8)
- f2fs deletes file2 entry on disk
- f2fs_add_link(whiteout) fails (corrupted directory)
- Returns error to VFS
- VFS does not call d_move() due to error
- VFS cache still has: file1 → inode 7 (stale!)
- inode 7 has i_nlink=0 (already decremented)
2. Second rename: file3 → file1
- VFS uses stale cache: file1 → inode 7
- Tries to drop_nlink on inode 7 (i_nlink already 0)
- WARNING in drop_nlink()
Fix this by explicitly invalidating old_dentry and new_dentry when f2fs_add_link fails during whiteout creation. This forces VFS to refresh from disk on subsequent operations, ensuring cache consistency even when the rename partially succeeds.
Reproducer:
1. Mount F2FS image with corrupted i_current_depth
2. renameat2(file2, file1, RENAME_WHITEOUT)
3. renameat2(file3, file1, 0)
4. System triggers WARNING in drop_nlink()
--- fs/f2fs/namei.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/f2fs/namei.c +4 -2
@@ -1044,9 +1044,11 @@ static int f2fs_rename(struct mnt_idmapif (whiteout) {set_inode_flag (whiteout,FI_INC_LINK ); err =f2fs_add_link (old_dentry, whiteout); -if (err) +if (err) { +d_invalidate (old_dentry); +d_invalidate (new_dentry); goto put_out_dir; - + }spin_lock (&whiteout->i_lock); whiteout->i_state &= ~I_LINKABLE ;spin_unlock (&whiteout->i_lock);
Greg Kroah-Hartman
maintainerPATCH 452/737 f2fs: fix age extent cache insertion skip on counter overflow
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaole He <[email protected]>
commit 27bf6a637b7613fc85fa6af468b7d612d78cd5c0 upstream.
The age extent cache uses last_blocks (derived from allocated_data_blocks) to determine data age. However, there's a conflict between the deletion
marker (last_blocks=0) and legitimate last_blocks=0 cases when allocated_data_blocks overflows to 0 after reaching ULLONG_MAX.
In this case, valid extents are incorrectly skipped due to the "if (!tei->last_blocks)" check in __update_extent_tree_range().
This patch fixes the issue by:
1. Reserving ULLONG_MAX as an invalid/deletion marker
2. Limiting allocated_data_blocks to range [0, ULLONG_MAX-1]
3. Using F2FS_EXTENT_AGE_INVALID for deletion scenarios
4. Adjusting overflow age calculation from ULLONG_MAX to (ULLONG_MAX-1)
Reproducer (using a patched kernel with allocated_data_blocks initialized to ULLONG_MAX - 3 for quick testing):
Step 1: Mount and check initial state
# dd if=/dev/zero of=/tmp/test.img bs=1M count=100 # mkfs.f2fs -f /tmp/test.img # mkdir -p /mnt/f2fs_test # mount -t f2fs -o loop,age_extent_cache /tmp/test.img /mnt/f2fs_test # cat /sys/kernel/debug/f2fs/status | grep -A 4 "Block Age" Allocated Data Blocks: 18446744073709551612 # ULLONG_MAX - 3 Inner Struct Count: tree: 1(0), node: 0
Step 2: Create files and write data to trigger overflow
# touch /mnt/f2fs_test/{1,2,3,4}.txt; sync
# cat /sys/kernel/debug/f2fs/status | grep -A 4 "Block Age"
Allocated Data Blocks: 18446744073709551613 # ULLONG_MAX - 2
Inner Struct Count: tree: 5(0), node: 1# dd if=/dev/urandom of=/mnt/f2fs_test/1.txt bs=4K count=1; sync # cat /sys/kernel/debug/f2fs/status | grep -A 4 "Block Age" Allocated Data Blocks: 18446744073709551614 # ULLONG_MAX - 1 Inner Struct Count: tree: 5(0), node: 2
# dd if=/dev/urandom of=/mnt/f2fs_test/2.txt bs=4K count=1; sync # cat /sys/kernel/debug/f2fs/status | grep -A 4 "Block Age" Allocated Data Blocks: 18446744073709551615 # ULLONG_MAX Inner Struct Count: tree: 5(0), node: 3
# dd if=/dev/urandom of=/mnt/f2fs_test/3.txt bs=4K count=1; sync # cat /sys/kernel/debug/f2fs/status | grep -A 4 "Block Age" Allocated Data Blocks: 0 # Counter overflowed! Inner Struct Count: tree: 5(0), node: 4
Step 3: Trigger the bug - next write should create node but gets skipped
# dd if=/dev/urandom of=/mnt/f2fs_test/4.txt bs=4K count=1; sync # cat /sys/kernel/debug/f2fs/status | grep -A 4 "Block Age" Allocated Data Blocks: 1 Inner Struct Count: tree: 5(0), node: 4
Expected: node: 5 (new extent node for 4.txt)
Actual: node: 4 (extent insertion was incorrectly skipped due to last_blocks = allocated_data_blocks = 0 in __get_new_block_age)
After this fix, the extent node is correctly inserted and node count becomes 5 as expected.
--- fs/f2fs/extent_cache.c | 5 +++-- fs/f2fs/f2fs.h | 6 ++++++ fs/f2fs/segment.c | 9 +++++++-- 3 files changed, 16 insertions(+), 4 deletions(-)
fs/f2fs/extent_cache.c +3 -2
@@ -755,7 +755,7 @@ static void __update_extent_tree_range(s } goto out_read_extent_cache; update_age_extent_cache: -if (!tei->last_blocks) +if (tei->last_blocks ==F2FS_EXTENT_AGE_INVALID ) goto out_read_extent_cache; __set_extent_info(&ei, fofs, len, 0, false,
@@ -859,7 +859,7 @@ static int __get_new_block_age(struct in cur_age = cur_blocks - tei.last_blocks; else/* allocated_data_blocks overflow */ - cur_age =ULLONG_MAX - tei.last_blocks + cur_blocks; + cur_age = (ULLONG_MAX -1 ) - tei.last_blocks + cur_blocks;if (tei.age) ei->age =__calculate_block_age (sbi, cur_age, tei.age);
@@ -1063,6 +1063,7 @@ void f2fs_update_age_extent_cache_range(struct extent_info ei = { .fofs = fofs, .len = len, + .last_blocks =F2FS_EXTENT_AGE_INVALID , };if (!__may_extent_tree (dn->inode,EX_BLOCK_AGE ))
fs/f2fs/f2fs.h +6 -0
@@ -626,6 +626,12 @@ enum extent_type { NR_EXTENT_CACHES, }; +/* +* Reserved value to mark invalid age extents, hence valid block range +* from 0 to ULLONG_MAX-1 +*/ +#define F2FS_EXTENT_AGE_INVALID ULLONG_MAX +struct extent_info {unsigned int fofs;/* start offset in a file */ unsigned int len;/* length of the extent */
fs/f2fs/segment.c +7 -2
@@ -3542,8 +3542,13 @@ skip_new_segment:locate_dirty_segment (sbi,GET_SEGNO (sbi, old_blkaddr));locate_dirty_segment (sbi,GET_SEGNO (sbi, *new_blkaddr)); -if (IS_DATASEG (curseg->seg_type)) -atomic64_inc (&sbi->allocated_data_blocks); +if (IS_DATASEG (curseg->seg_type)) { +unsigned long long new_val; + + new_val =atomic64_inc_return (&sbi->allocated_data_blocks); +if (unlikely (new_val ==ULLONG_MAX )) +atomic64_set (&sbi->allocated_data_blocks,0 ); + }up_write (&sit_i->sentry_lock);
Greg Kroah-Hartman
maintainerPATCH 453/737 f2fs: fix return value of f2fs_recover_fsync_data()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
commit 01fba45deaddcce0d0b01c411435d1acf6feab7b upstream.
With below scripts, it will trigger panic in f2fs:
mkfs.f2fs -f /dev/vdd
mount /dev/vdd /mnt/f2fs
touch /mnt/f2fs/foo
sync
echo 111 >> /mnt/f2fs/foof2fs_io fsync /mnt/f2fs/foof2fs_io shutdown 2 /mnt/f2fs
umount /mnt/f2fs
mount -o ro,norecovery /dev/vdd /mnt/f2fs or
mount -o ro,disable_roll_forward /dev/vdd /mnt/f2fs
F2FS-fs (vdd): f2fs_recover_fsync_data: recovery fsync data, check_only: 0 F2FS-fs (vdd): Mounted with checkpoint version = 7f5c361f F2FS-fs (vdd): Stopped filesystem due to reason: 0
F2FS-fs (vdd): f2fs_recover_fsync_data: recovery fsync data, check_only: 1 Filesystem f2fs get_tree() didn't set fc->root, returned 1
------------[ cut here ]------------ kernel BUG at fs/super.c:1761! Oops: invalid opcode: 0000 [#1] SMP PTI CPU: 3 UID: 0 PID: 722 Comm: mount Not tainted 6.18.0-rc2+ #721 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:vfs_get_tree.cold+0x18/0x1a Call Trace: <TASK> fc_mount+0x13/0xa0 path_mount+0x34e/0xc50 __x64_sys_mount+0x121/0x150 do_syscall_64+0x84/0x800 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7fa6cc126cfe
The root cause is we missed to handle error number returned from f2fs_recover_fsync_data() when mounting image w/ ro,norecovery or ro,disable_roll_forward mount option, result in returning a positive error number to vfs_get_tree(), fix it.
--- fs/f2fs/super.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
fs/f2fs/super.c +9 -5
@@ -4692,11 +4692,15 @@ try_onemore: } }else { err =f2fs_recover_fsync_data (sbi, true); - -if (!f2fs_readonly (sb) && err >0 ) { - err = -EINVAL ; -f2fs_err (sbi,"Need to recover fsync data" ); - goto free_meta; +if (err >0 ) { +if (!f2fs_readonly (sb)) { +f2fs_err (sbi,"Need to recover fsync data" ); + err = -EINVAL ; + goto free_meta; + }else { +f2fs_info (sbi,"drop all fsynced data" ); + err =0 ; + } } }
Greg Kroah-Hartman
maintainerPATCH 454/737 tools/testing/nvdimm: Use per-DIMM device handle
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alison Schofield <[email protected]>
commit f59b701b4674f7955170b54c4167c5590f4714eb upstream.
KASAN reports a global-out-of-bounds access when running these nfit
tests: clear.sh, pmem-errors.sh, pfn-meta-errors.sh, btt-errors.sh, daxdev-errors.sh, and inject-error.sh.
[] BUG: KASAN: global-out-of-bounds in nfit_test_ctl+0x769f/0x7840 [nfit_test] [] Read of size 4 at addr ffffffffc03ea01c by task ndctl/1215
[] The buggy address belongs to the variable:
[] handle+0x1c/0x1df4 [nfit_test]
nfit_test_search_spa() uses handle[nvdimm->id] to retrieve a device handle and triggers a KASAN error when it reads past the end of the handle array. It should not be indexing the handle array at all.
The correct device handle is stored in per-DIMM test data. Each DIMM has a struct nfit_mem that embeds a struct acpi_nfit_memdev that describes the NFIT device handle. Use that device handle here.
--- tools/testing/nvdimm/test/nfit.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
tools/testing/nvdimm/test/nfit.c +6 -1
@@ -670,6 +670,7 @@ static int nfit_test_search_spa(struct n .addr = spa->spa, .region = NULL, }; +struct nfit_mem *nfit_mem;u64 dpa; ret = device_for_each_child(&bus->dev, &ctx,
@@ -687,8 +688,12 @@ static int nfit_test_search_spa(struct n*/ nd_mapping = &nd_region->mapping[nd_region->ndr_mappings -1 ]; nvdimm = nd_mapping->nvdimm; + nfit_mem =nvdimm_provider_data (nvdimm); +if (!nfit_mem) +return -EINVAL ; - spa->devices[0 ].nfit_device_handle = handle[nvdimm->id]; + spa->devices[0 ].nfit_device_handle = +__to_nfit_memdev (nfit_mem)->device_handle; spa->num_nvdimms =1 ; spa->devices[0 ].dpa = dpa;
Greg Kroah-Hartman
maintainerPATCH 455/737 media: vidtv: initialize local pointers upon transfer of memory ownership
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeongjun Park <[email protected]>
commit 98aabfe2d79f74613abc2b0b1cef08f97eaf5322 upstream.
vidtv_channel_si_init() creates a temporary list (program, service, event) and ownership of the memory itself is transferred to the PAT/SDT/EIT tables through vidtv_psi_pat_program_assign(), vidtv_psi_sdt_service_assign(), vidtv_psi_eit_event_assign().
The problem here is that the local pointer where the memory ownership transfer was completed is not initialized to NULL. This causes the vidtv_psi_pmt_create_sec_for_each_pat_entry() function to fail, and in the flow that jumps to free_eit, the memory that was freed by vidtv_psi_*_table_destroy() can be accessed again by vidtv_psi_*_event_destroy() due to the uninitialized local pointer, so it is freed once again.
Therefore, to prevent use-after-free and double-free vulnerability, local pointers must be initialized to NULL when transferring memory ownership.
--- drivers/media/test-drivers/vidtv/vidtv_channel.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/media/test-drivers/vidtv/vidtv_channel.c +3 -0
@@ -461,12 +461,15 @@ int vidtv_channel_si_init(struct vidtv_m/* assemble all programs and assign to PAT */ vidtv_psi_pat_program_assign (m->si.pat, programs); + programs =NULL ;/* assemble all services and assign to SDT */ vidtv_psi_sdt_service_assign (m->si.sdt, services); + services =NULL ;/* assemble all events and assign to EIT */ vidtv_psi_eit_event_assign (m->si.eit, events); + events =NULL ; m->si.pmt_secs =vidtv_psi_pmt_create_sec_for_each_pat_entry (m->si.pat, m->pcr_pid);
Greg Kroah-Hartman
maintainerPATCH 456/737 ocfs2: fix kernel BUG in ocfs2_find_victim_chain
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prithvi Tambewagh <[email protected]>
commit 039bef30e320827bac8990c9f29d2a68cd8adb5f upstream.
syzbot reported a kernel BUG in ocfs2_find_victim_chain() because the cl_next_free_rec field of the allocation chain list (next free slot in the chain list) is 0, triggring the BUG_ON(!cl->cl_next_free_rec) condition in ocfs2_find_victim_chain() and panicking the kernel.
To fix this, an if condition is introduced in ocfs2_claim_suballoc_bits(), just before calling ocfs2_find_victim_chain(), the code block in it being executed when either of the following conditions is true:
1. cl_next_free_rec is equal to 0, indicating that there are no free chains in the allocation chain list
2. cl_next_free_rec is greater than cl_count (the total number of chains in the allocation chain list)
Either of them being true is indicative of the fact that there are no chains left for usage.
This is addressed using ocfs2_error(), which prints
the error log for debugging purposes, rather than panicking the kernel.
--- fs/ocfs2/suballoc.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
fs/ocfs2/suballoc.c +10 -0
@@ -1923,6 +1923,16 @@ static int ocfs2_claim_suballoc_bits(str } cl = (struct ocfs2_chain_list *) &fe->id2.i_chain; +if (!le16_to_cpu (cl->cl_next_free_rec) || +le16_to_cpu (cl->cl_next_free_rec) >le16_to_cpu (cl->cl_count)) { + status =ocfs2_error (ac->ac_inode->i_sb, +"Chain allocator dinode %llu has invalid next " +"free chain record %u, but only %u total\n" , + (unsigned long long )le64_to_cpu (fe->i_blkno), +le16_to_cpu (cl->cl_next_free_rec), +le16_to_cpu (cl->cl_count)); + goto bail; + } victim =ocfs2_find_victim_chain (cl); ac->ac_chain = victim;
Greg Kroah-Hartman
maintainerPATCH 457/737 KVM: x86: Dont clear async #PF queue when CR0.PG is disabled (e.g. on #SMI)
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxim Levitsky <[email protected]>
commit ab4e41eb9fabd4607304fa7cfe8ec9c0bd8e1552 upstream.
Fix an interaction between SMM and PV asynchronous #PFs where an #SMI can cause KVM to drop an async #PF ready event, and thus result in guest tasks becoming permanently stuck due to the task that encountered the #PF never being resumed. Specifically, don't clear the completion queue when paging is disabled, and re-check for completed async #PFs if/when paging is enabled.
Prior to commit 2635b5c4a0e4 ("KVM: x86: interrupt based APF 'page ready' event delivery"), flushing the APF queue without notifying the guest of completed APF requests when paging is disabled was "necessary", in that delivering a #PF to the guest when paging is disabled would likely confuse and/or crash the guest. And presumably the original async #PF development assumed that a guest would only disable paging when there was no intent to ever re-enable paging.
That assumption fails in several scenarios, most visibly on an emulated SMI, as entering SMM always disables CR0.PG (i.e. initially runs with paging disabled). When the SMM handler eventually executes RSM, the interrupted paging-enabled is restored, and the async #PF event is lost.
Similarly, invoking firmware, e.g. via EFI runtime calls, might require a transition through paging modes and thus also disable paging with valid entries in the competion queue.
To avoid dropping completion events, drop the "clear" entirely, and handle paging-enable transitions in the same way KVM already handles APIC enable/disable events: if a vCPU's APIC is disabled, APF completion events are not kept pending and not injected while APIC is disabled. Once a vCPU's APIC is re-enabled, KVM raises KVM_REQ_APF_READY so that the vCPU recognizes any pending pending #APF ready events.
[sean: rework changelog to call out #PF injection, drop "real mode"
references, expand the code comment]
--- arch/x86/kvm/x86.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
arch/x86/kvm/x86.c +15 -10
@@ -855,6 +855,13 @@ bool kvm_require_dr(struct kvm_vcpu *vcp }EXPORT_SYMBOL_GPL (kvm_require_dr); +static bool kvm_pv_async_pf_enabled (struct kvm_vcpu *vcpu) +{ +u64 mask =KVM_ASYNC_PF_ENABLED |KVM_ASYNC_PF_DELIVERY_AS_INT ; + +return (vcpu->arch.apf.msr_en_val & mask) == mask; +} +static inline u64 pdptr_rsvd_bits (struct kvm_vcpu *vcpu) {return vcpu->arch.reserved_gpa_bits |rsvd_bits (5 ,8 ) |rsvd_bits (1 ,2 );
@@ -947,15 +954,20 @@ void kvm_post_set_cr0(struct kvm_vcpu *v }if ((cr0 ^ old_cr0) &X86_CR0_PG ) { -kvm_clear_async_pf_completion_queue (vcpu); -kvm_async_pf_hash_reset (vcpu); -/* * Clearing CR0.PG is defined to flush the TLB from the guest's * perspective. */ if (!(cr0 &X86_CR0_PG ))kvm_make_request (KVM_REQ_TLB_FLUSH_GUEST , vcpu); +/* +* Check for async #PF completion events when enabling paging, +* as the vCPU may have previously encountered async #PFs (it's +* entirely legal for the guest to toggle paging on/off without +* waiting for the async #PF queue to drain). +*/ +else if (kvm_pv_async_pf_enabled (vcpu)) +kvm_make_request (KVM_REQ_APF_READY , vcpu); }if ((cr0 ^ old_cr0) &KVM_MMU_CR0_ROLE_BITS )
@@ -3398,13 +3410,6 @@ static int set_msr_mce(struct kvm_vcpu *return 0 ; } -static inline bool kvm_pv_async_pf_enabled (struct kvm_vcpu *vcpu) -{ -u64 mask =KVM_ASYNC_PF_ENABLED |KVM_ASYNC_PF_DELIVERY_AS_INT ; - -return (vcpu->arch.apf.msr_en_val & mask) == mask; -} -static int kvm_pv_enable_async_pf (struct kvm_vcpu *vcpu,u64 data) {gpa_t gpa = data & ~0x3f ;
Greg Kroah-Hartman
maintainerPATCH 458/737 platform/chrome: cros_ec_ishtp: Fix UAF after unbinding driver
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tzung-Bi Shih <[email protected]>
commit 944edca81e7aea15f83cf9a13a6ab67f711e8abd upstream.
After unbinding the driver, another kthread cros_ec_console_log_work is still accessing the device, resulting an UAF and crash.
The driver doesn't unregister the EC device in .remove() which should shutdown sub-devices synchronously. Fix it.
--- drivers/platform/chrome/cros_ec_ishtp.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/chrome/cros_ec_ishtp.c +1 -0
@@ -715,6 +715,7 @@ static void cros_ec_ishtp_remove(structcancel_work_sync (&client_data->work_ishtp_reset);cancel_work_sync (&client_data->work_ec_evt); +cros_ec_unregister (client_data->ec_dev);cros_ish_deinit (cros_ish_cl);ishtp_put_device (cl_device); }
Greg Kroah-Hartman
maintainerPATCH 459/737 scs: fix a wrong parameter in __scs_magic
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhichi Lin <[email protected]>
commit 08bd4c46d5e63b78e77f2605283874bbe868ab19 upstream.
__scs_magic() needs a 'void *' variable, but a 'struct task_struct *' is given. 'task_scs(tsk)' is the starting address of the task's shadow call stack, and '__scs_magic(task_scs(tsk))' is the end address of the task's shadow call stack. Here should be '__scs_magic(task_scs(tsk))'.
The user-visible effect of this bug is that when CONFIG_DEBUG_STACK_USAGE is enabled, the shadow call stack usage checking function (scs_check_usage) would scan an incorrect memory range. This could lead to:
1. **Inaccurate stack usage reporting**: The function would calculate wrong usage statistics for the shadow call stack, potentially showing incorrect value in kmsg.
2. **Potential kernel crash**: If the value of __scs_magic(tsk)is greater than that of __scs_magic(task_scs(tsk)), the for loop may access unmapped memory, potentially causing a kernel panic. However, this scenario is unlikely because task_struct is allocated via the slab allocator (which typically returns lower addresses), while the shadow call stack returned by task_scs(tsk) is allocated via vmalloc(which typically returns higher addresses).
However, since this is purely a debugging feature (CONFIG_DEBUG_STACK_USAGE), normal production systems should be not unaffected. The bug only impacts developers and testers who are actively debugging stack usage with this configuration enabled.
--- kernel/scs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/scs.c +1 -1
@@ -135,7 +135,7 @@ static void scs_check_usage(struct task_if (!IS_ENABLED (CONFIG_DEBUG_STACK_USAGE ))return ; -for (p =task_scs (tsk); p <__scs_magic (tsk); ++p) { +for (p =task_scs (tsk); p <__scs_magic (task_scs (tsk)); ++p) {if (!READ_ONCE_NOCHECK (*p))break ; used +=sizeof (*p);
Greg Kroah-Hartman
maintainerPATCH 460/737 parisc: Do not reprogram affinitiy on ASP chip
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
commit dca7da244349eef4d78527cafc0bf80816b261f5 upstream.
The ASP chip is a very old variant of the GSP chip and is used e.g. in HP 730 workstations. When trying to reprogram the affinity it will crash with a HPMC as the relevant registers don't seem to be at the usual location. Let's avoid the crash by checking the sversion. Also note, that reprogramming isn't necessary either, as the HP730 is a just a single-CPU machine.
--- drivers/parisc/gsc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/parisc/gsc.c +3 -1
@@ -154,7 +154,9 @@ static int gsc_set_affinity_irq(struct i gsc_dev->eim = ((u32 ) gsc_dev->gsc_irq.txn_addr) | gsc_dev->gsc_irq.txn_data;/* switch IRQ's for devices below LASI/WAX to other CPU */ -gsc_writel (gsc_dev->eim, gsc_dev->hpa +OFFSET_IAR ); +/* ASP chip (svers 0x70) does not support reprogramming */ +if (gsc_dev->gsc->id.sversion !=0x70 ) +gsc_writel (gsc_dev->eim, gsc_dev->hpa +OFFSET_IAR );irq_data_update_effective_affinity (d, &tmask);
Greg Kroah-Hartman
maintainerPATCH 461/737 libceph: make decode_pool() more resilient against corrupted osdmaps
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Dryomov <[email protected]>
commit 8c738512714e8c0aa18f8a10c072d5b01c83db39 upstream.
If the osdmap is (maliciously) corrupted such that the encoded length of ceph_pg_pool envelope is less than what is expected for a particular encoding version, out-of-bounds reads may ensue because the only bounds check that is there is based on that length value.
This patch adds explicit bounds checks for each field that is decoded or skipped.
--- net/ceph/osdmap.c | 118 ++++++++++++++++++++++++------------------------------ 1 file changed, 53 insertions(+), 65 deletions(-)
net/ceph/osdmap.c +53 -65
@@ -806,51 +806,49 @@ static int decode_pool(void **p, void *eceph_decode_need (p, end, len, bad); pool_end = *p + len; +ceph_decode_need (p, end,4 +4 +4 , bad); pi->type =ceph_decode_8 (p); pi->size =ceph_decode_8 (p); pi->crush_ruleset =ceph_decode_8 (p); pi->object_hash =ceph_decode_8 (p); - pi->pg_num =ceph_decode_32 (p); pi->pgp_num =ceph_decode_32 (p); - *p +=4 +4 ;/* skip lpg* */ - *p +=4 ;/* skip last_change */ - *p +=8 +4 ;/* skip snap_seq, snap_epoch */ +/* lpg*, last_change, snap_seq, snap_epoch */ +ceph_decode_skip_n (p, end,8 +4 +8 +4 , bad);/* skip snaps */ - num =ceph_decode_32 (p); +ceph_decode_32_safe (p, end, num, bad);while (num--) { - *p +=8 ;/* snapid key */ - *p +=1 +1 ;/* versions */ - len =ceph_decode_32 (p); - *p += len; +/* snapid key, pool snap (with versions) */ +ceph_decode_skip_n (p, end,8 +2 , bad); +ceph_decode_skip_string (p, end, bad); } -/* skip removed_snaps */ - num =ceph_decode_32 (p); - *p += num * (8 +8 ); +/* removed_snaps */ +ceph_decode_skip_map (p, end,64 ,64 , bad); +ceph_decode_need (p, end,8 +8 +4 , bad); *p +=8 ;/* skip auid */ pi->flags =ceph_decode_64 (p); *p +=4 ;/* skip crash_replay_interval */ if (ev >=7 ) - pi->min_size =ceph_decode_8 (p); +ceph_decode_8_safe (p, end, pi->min_size, bad);else pi->min_size = pi->size - pi->size /2 ;if (ev >=8 ) - *p +=8 +8 ;/* skip quota_max_* */ +/* quota_max_* */ +ceph_decode_skip_n (p, end,8 +8 , bad);if (ev >=9 ) { -/* skip tiers */ - num =ceph_decode_32 (p); - *p += num *8 ; +/* tiers */ +ceph_decode_skip_set (p, end,64 , bad); +ceph_decode_need (p, end,8 +1 +8 +8 , bad); *p +=8 ;/* skip tier_of */ *p +=1 ;/* skip cache_mode */ - pi->read_tier =ceph_decode_64 (p); pi->write_tier =ceph_decode_64 (p); }else {
@@ -858,86 +856,76 @@ static int decode_pool(void **p, void *e pi->write_tier =-1 ; } -if (ev >=10 ) { -/* skip properties */ - num =ceph_decode_32 (p); -while (num--) { - len =ceph_decode_32 (p); - *p += len;/* key */ - len =ceph_decode_32 (p); - *p += len;/* val */ - } - } +if (ev >=10 ) +/* properties */ +ceph_decode_skip_map (p, end, string, string, bad);if (ev >=11 ) { -/* skip hit_set_params */ - *p +=1 +1 ;/* versions */ - len =ceph_decode_32 (p); - *p += len; +/* hit_set_params (with versions) */ +ceph_decode_skip_n (p, end,2 , bad); +ceph_decode_skip_string (p, end, bad); - *p +=4 ;/* skip hit_set_period */ - *p +=4 ;/* skip hit_set_count */ +/* hit_set_period, hit_set_count */ +ceph_decode_skip_n (p, end,4 +4 , bad); }if (ev >=12 ) - *p +=4 ;/* skip stripe_width */ +/* stripe_width */ +ceph_decode_skip_32 (p, end, bad); -if (ev >=13 ) { - *p +=8 ;/* skip target_max_bytes */ - *p +=8 ;/* skip target_max_objects */ - *p +=4 ;/* skip cache_target_dirty_ratio_micro */ - *p +=4 ;/* skip cache_target_full_ratio_micro */ - *p +=4 ;/* skip cache_min_flush_age */ - *p +=4 ;/* skip cache_min_evict_age */ - } - -if (ev >=14 ) { -/* skip erasure_code_profile */ - len =ceph_decode_32 (p); - *p += len; - } +if (ev >=13 ) +/* target_max_*, cache_target_*, cache_min_* */ +ceph_decode_skip_n (p, end,16 +8 +8 , bad); + +if (ev >=14 ) +/* erasure_code_profile */ +ceph_decode_skip_string (p, end, bad);/* * last_force_op_resend_preluminous, will be overridden if the * map was encoded with RESEND_ON_SPLIT */ if (ev >=15 ) - pi->last_force_request_resend =ceph_decode_32 (p); +ceph_decode_32_safe (p, end, pi->last_force_request_resend, bad);else pi->last_force_request_resend =0 ;if (ev >=16 ) - *p +=4 ;/* skip min_read_recency_for_promote */ +/* min_read_recency_for_promote */ +ceph_decode_skip_32 (p, end, bad);if (ev >=17 ) - *p +=8 ;/* skip expected_num_objects */ +/* expected_num_objects */ +ceph_decode_skip_64 (p, end, bad);if (ev >=19 ) - *p +=4 ;/* skip cache_target_dirty_high_ratio_micro */ +/* cache_target_dirty_high_ratio_micro */ +ceph_decode_skip_32 (p, end, bad);if (ev >=20 ) - *p +=4 ;/* skip min_write_recency_for_promote */ +/* min_write_recency_for_promote */ +ceph_decode_skip_32 (p, end, bad);if (ev >=21 ) - *p +=1 ;/* skip use_gmt_hitset */ +/* use_gmt_hitset */ +ceph_decode_skip_8 (p, end, bad);if (ev >=22 ) - *p +=1 ;/* skip fast_read */ +/* fast_read */ +ceph_decode_skip_8 (p, end, bad); -if (ev >=23 ) { - *p +=4 ;/* skip hit_set_grade_decay_rate */ - *p +=4 ;/* skip hit_set_search_last_n */ - } +if (ev >=23 ) +/* hit_set_grade_decay_rate, hit_set_search_last_n */ +ceph_decode_skip_n (p, end,4 +4 , bad);if (ev >=24 ) { -/* skip opts */ - *p +=1 +1 ;/* versions */ - len =ceph_decode_32 (p); - *p += len; +/* opts (with versions) */ +ceph_decode_skip_n (p, end,2 , bad); +ceph_decode_skip_string (p, end, bad); }if (ev >=25 ) - pi->last_force_request_resend =ceph_decode_32 (p); +ceph_decode_32_safe (p, end, pi->last_force_request_resend, bad);/* ignore the rest */
Greg Kroah-Hartman
maintainerPATCH 462/737 KVM: x86: WARN if hrtimer callback for periodic APIC timer fires with period=0
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit 0ea9494be9c931ddbc084ad5e11fda91b554cf47 upstream.
WARN and don't restart the hrtimer if KVM's callback runs with the guest's APIC timer in periodic mode but with a period of '0', as not advancing the hrtimer's deadline would put the CPU into an infinite loop of hrtimer events. Observing a period of '0' should be impossible, even when the hrtimer is running on a different CPU than the vCPU, as KVM is supposed to cancel the hrtimer before changing (or zeroing) the period, e.g. when switching from periodic to one-shot.
--- arch/x86/kvm/lapic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/lapic.c +1 -1
@@ -2855,7 +2855,7 @@ static enum hrtimer_restart apic_timer_fapic_timer_expired (apic, true); -if (lapic_is_periodic (apic)) { +if (lapic_is_periodic (apic) && !WARN_ON_ONCE (!apic->lapic_timer.period)) {advance_periodic_target_expiration (apic);hrtimer_add_expires_ns (&ktimer->timer, ktimer->period);return HRTIMER_RESTART ;
Greg Kroah-Hartman
maintainerPATCH 463/737 KVM: x86: Explicitly set new periodic hrtimer expiration in apic_timer_fn()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: fuqiang wang <[email protected]>
commit 9633f180ce994ab293ce4924a9b7aaf4673aa114 upstream.
When restarting an hrtimer to emulate a the guest's APIC timer in periodic mode, explicitly set the expiration using the target expiration computed by advance_periodic_target_expiration() instead of adding the period to the existing timer. This will allow making adjustments to the expiration, e.g. to deal with expirations far in the past, without having to implement the same logic in both advance_periodic_target_expiration() and apic_timer_fn().
--- arch/x86/kvm/lapic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/lapic.c +1 -1
@@ -2857,7 +2857,7 @@ static enum hrtimer_restart apic_timer_fif (lapic_is_periodic (apic) && !WARN_ON_ONCE (!apic->lapic_timer.period)) {advance_periodic_target_expiration (apic); -hrtimer_add_expires_ns (&ktimer->timer, ktimer->period); +hrtimer_set_expires (&ktimer->timer, ktimer->target_expiration);return HRTIMER_RESTART ; }else return HRTIMER_NORESTART ;
Greg Kroah-Hartman
maintainerPATCH 464/737 KVM: x86: Fix VM hard lockup after prolonged inactivity with periodic HV timer
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: fuqiang wang <[email protected]>
commit 18ab3fc8e880791aa9f7c000261320fc812b5465 upstream.
When advancing the target expiration for the guest's APIC timer in periodic mode, set the expiration to "now" if the target expiration is in the past (similar to what is done in update_target_expiration()). Blindly adding the period to the previous target expiration can result in KVM generating a practically unbounded number of hrtimer IRQs due to programming an expired timer over and over. In extreme scenarios, e.g. if userspace pauses/suspends a VM for an extended duration, this can even cause hard lockups in the host.
Currently, the bug only affects Intel CPUs when using the hypervisor timer (HV timer), a.k.a. the VMX preemption timer. Unlike the software timer, a.k.a. hrtimer, which KVM keeps running even on exits to userspace, the HV timer only runs while the guest is active. As a result, if the vCPU does not run for an extended duration, there will be a huge gap between the target expiration and the current time the vCPU resumes running. Because the target expiration is incremented by only one period on each timer expiration, this leads to a series of timer expirations occurring rapidly after the vCPU/VM resumes.
More critically, when the vCPU first triggers a periodic HV timer expiration after resuming, advancing the expiration by only one period will result in a target expiration in the past. As a result, the delta may be calculated as a negative value. When the delta is converted into an absolute value (tscdeadline is an unsigned u64), the resulting value can overflow what the HV timer is capable of programming. I.e. the large value will exceed the VMX Preemption Timer's maximum bit width of cpu_preemption_timer_multi + 32, and thus cause KVM to switch from the HV timer to the software timer (hrtimers).
After switching to the software timer, periodic timer expiration callbacks may be executed consecutively within a single clock interrupt handler, because hrtimers honors KVM's request for an expiration in the past and immediately re-invokes KVM's callback after reprogramming. And because the interrupt handler runs with IRQs disabled, restarting KVM's hrtimer over and over until the target expiration is advanced to "now" can result in a hard lockup.
E.g. the following hard lockup was triggered in the host when running a Windows VM (only relevant because it used the APIC timer in periodic mode) after resuming the VM from a long suspend (in the host).
NMI watchdog: Watchdog detected hard LOCKUP on cpu 45
...
RIP: 0010:advance_periodic_target_expiration+0x4d/0x80 [kvm] ... RSP: 0018:ff4f88f5d98d8ef0 EFLAGS: 00000046 RAX: fff0103f91be678e RBX: fff0103f91be678e RCX: 00843a7d9e127bcc RDX: 0000000000000002 RSI: 0052ca4003697505 RDI: ff440d5bfbdbd500 RBP: ff440d5956f99200 R08: ff2ff2a42deb6a84 R09: 000000000002a6c0 R10: 0122d794016332b3 R11: 0000000000000000 R12: ff440db1af39cfc0 R13: ff440db1af39cfc0 R14: ffffffffc0d4a560 R15: ff440db1af39d0f8 FS: 00007f04a6ffd700(0000) GS:ff440db1af380000(0000) knlGS:000000e38a3b8000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000000d5651feff8 CR3: 000000684e038002 CR4: 0000000000773ee0 PKRU: 55555554 Call Trace: <IRQ> apic_timer_fn+0x31/0x50 [kvm] __hrtimer_run_queues+0x100/0x280 hrtimer_interrupt+0x100/0x210 ? ttwu_do_wakeup+0x19/0x160 smp_apic_timer_interrupt+0x6a/0x130 apic_timer_interrupt+0xf/0x20 </IRQ>
Moreover, if the suspend duration of the virtual machine is not long enough to trigger a hard lockup in this scenario, since commit 98c25ead5eda ("KVM: VMX: Move preemption timer <=> hrtimer dance to common x86"), KVM will continue using the software timer until the guest reprograms the APIC timer in some way. Since the periodic timer does not require frequent APIC timer register programming, the guest may continue to use the software timer in perpetuity.
--- arch/x86/kvm/lapic.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-)
arch/x86/kvm/lapic.c +23 -5
@@ -2058,15 +2058,33 @@ static void advance_periodic_target_expiktime_t delta;/* -* Synchronize both deadlines to the same time source or -* differences in the periods (caused by differences in the -* underlying clocks or numerical approximation errors) will -* cause the two to drift apart over time as the errors -* accumulate. +* Use kernel time as the time source for both the hrtimer deadline and +* TSC-based deadline so that they stay synchronized. Computing each +* deadline independently will cause the two deadlines to drift apart +* over time as differences in the periods accumulate, e.g. due to +* differences in the underlying clocks or numerical approximation errors. */ apic->lapic_timer.target_expiration =ktime_add_ns (apic->lapic_timer.target_expiration, apic->lapic_timer.period); + +/* +* If the new expiration is in the past, e.g. because userspace stopped +* running the VM for an extended duration, then force the expiration +* to "now" and don't try to play catch-up with the missed events. KVM +* will only deliver a single interrupt regardless of how many events +* are pending, i.e. restarting the timer with an expiration in the +* past will do nothing more than waste host cycles, and can even lead +* to a hard lockup in extreme cases. +*/ +if (ktime_before (apic->lapic_timer.target_expiration, now)) + apic->lapic_timer.target_expiration = now; + +/* +* Note, ensuring the expiration isn't in the past also prevents delta +* from going negative, which could cause the TSC deadline to become +* excessively large due to it an unsigned value. +*/ delta =ktime_sub (apic->lapic_timer.target_expiration, now); apic->lapic_timer.tscdeadline =kvm_read_l1_tsc (apic->vcpu, tscl) +nsec_to_cycles (apic->vcpu, delta);
Greg Kroah-Hartman
maintainerPATCH 465/737 KVM: nSVM: Avoid incorrect injection of SVM_EXIT_CR0_SEL_WRITE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yosry Ahmed <[email protected]>
commit 3d80f4c93d3d26d0f9a0dd2844961a632eeea634 upstream.
When emulating L2 instructions, svm_check_intercept() checks whether a write to CR0 should trigger a synthesized #VMEXIT with SVM_EXIT_CR0_SEL_WRITE. However, it does not check whether L1 enabled the intercept for SVM_EXIT_WRITE_CR0, which has higher priority according to the APM (24593—Rev. 3.42—March 2024, Table 15-7):
When both selective and non-selective CR0-write intercepts are active at the same time, the non-selective intercept takes priority. With respect to exceptions, the priority of this intercept is the same as the generic CR0-write intercept.
Make sure L1 does NOT intercept SVM_EXIT_WRITE_CR0 before checking if SVM_EXIT_CR0_SEL_WRITE needs to be injected.
Opportunistically tweak the "not CR0" logic to explicitly bail early so that it's more obvious that only CR0 has a selective intercept, and that modifying icpt_info.exit_code is functionally necessary so that the call to nested_svm_exit_handled() checks the correct exit code.
--- arch/x86/kvm/svm/svm.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-)
arch/x86/kvm/svm/svm.c +19 -5
@@ -4548,15 +4548,29 @@ static int svm_check_intercept(struct kvcase SVM_EXIT_WRITE_CR0 : {unsigned long cr0, val; -if (info->intercept == x86_intercept_cr_write) +/* +* Adjust the exit code accordingly if a CR other than CR0 is +* being written, and skip straight to the common handling as +* only CR0 has an additional selective intercept. +*/ +if (info->intercept == x86_intercept_cr_write && info->modrm_reg) { icpt_info.exit_code += info->modrm_reg; +break ; + } -if (icpt_info.exit_code !=SVM_EXIT_WRITE_CR0 || - info->intercept == x86_intercept_clts) +/* +* Convert the exit_code to SVM_EXIT_CR0_SEL_WRITE if a +* selective CR0 intercept is triggered (the common logic will +* treat the selective intercept as being enabled). Note, the +* unconditional intercept has higher priority, i.e. this is +* only relevant if *only* the selective intercept is enabled. +*/ +if (vmcb12_is_intercept (&svm->nested.ctl,INTERCEPT_CR0_WRITE ) || + !(vmcb12_is_intercept (&svm->nested.ctl,INTERCEPT_SELECTIVE_CR0 )))break ; -if (!(vmcb12_is_intercept (&svm->nested.ctl, -INTERCEPT_SELECTIVE_CR0 ))) +/* CLTS never triggers INTERCEPT_SELECTIVE_CR0 */ +if (info->intercept == x86_intercept_clts)break ; cr0 = vcpu->arch.cr0 & ~SVM_CR0_SELECTIVE_MASK ;
Greg Kroah-Hartman
maintainerPATCH 466/737 KVM: SVM: Mark VMCB_NPT as dirty on nested VMRUN
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jim Mattson <[email protected]>
commit 7c8b465a1c91f674655ea9cec5083744ec5f796a upstream.
Mark the VMCB_NPT bit as dirty in nested_vmcb02_prepare_save() on every nested VMRUN.
If L1 changes the PAT MSR between two VMRUN instructions on the same L1 vCPU, the g_pat field in the associated vmcb02 will change, and the VMCB_NPT clean bit should be cleared.
--- arch/x86/kvm/svm/nested.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/kvm/svm/nested.c +1 -0
@@ -544,6 +544,7 @@ static void nested_vmcb02_prepare_save(sstruct kvm_vcpu *vcpu = &svm->vcpu;nested_vmcb02_compute_g_pat (svm); +vmcb_mark_dirty (vmcb02,VMCB_NPT );/* Load the nested guest state */ if (svm->nested.vmcb12_gpa != svm->nested.last_vmcb12_gpa) {
Greg Kroah-Hartman
maintainerPATCH 467/737 KVM: nSVM: Propagate SVM_EXIT_CR0_SEL_WRITE correctly for LMSW emulation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yosry Ahmed <[email protected]>
commit 5674a76db0213f9db1e4d08e847ff649b46889c0 upstream.
When emulating L2 instructions, svm_check_intercept() checks whether a write to CR0 should trigger a synthesized #VMEXIT with SVM_EXIT_CR0_SEL_WRITE. For MOV-to-CR0, SVM_EXIT_CR0_SEL_WRITE is only triggered if any bit other than CR0.MP and CR0.TS is updated. However, according to the APM (24593—Rev. 3.42—March 2024, Table 15-7):
The LMSW instruction treats the selective CR0-write intercept as a non-selective intercept (i.e., it intercepts regardless of the value being written).
Skip checking the changed bits for x86_intercept_lmsw and always inject SVM_EXIT_CR0_SEL_WRITE.
--- arch/x86/kvm/svm/svm.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
arch/x86/kvm/svm/svm.c +9 -9
@@ -4573,20 +4573,20 @@ static int svm_check_intercept(struct kvif (info->intercept == x86_intercept_clts)break ; - cr0 = vcpu->arch.cr0 & ~SVM_CR0_SELECTIVE_MASK ; - val = info->src_val & ~SVM_CR0_SELECTIVE_MASK ; - +/* LMSW always triggers INTERCEPT_SELECTIVE_CR0 */ if (info->intercept == x86_intercept_lmsw) { - cr0 &=0xfUL ; - val &=0xfUL ; -/* lmsw can't clear PE - catch this here */ -if (cr0 &X86_CR0_PE ) - val |=X86_CR0_PE ; + icpt_info.exit_code =SVM_EXIT_CR0_SEL_WRITE ; +break ; } +/* +* MOV-to-CR0 only triggers INTERCEPT_SELECTIVE_CR0 if any bit +* other than SVM_CR0_SELECTIVE_MASK is changed. +*/ + cr0 = vcpu->arch.cr0 & ~SVM_CR0_SELECTIVE_MASK ; + val = info->src_val & ~SVM_CR0_SELECTIVE_MASK ;if (cr0 ^ val) icpt_info.exit_code =SVM_EXIT_CR0_SEL_WRITE ; -break ; }case SVM_EXIT_READ_DR0 :
Greg Kroah-Hartman
maintainerPATCH 468/737 KVM: SVM: Mark VMCB_PERM_MAP as dirty on nested VMRUN
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jim Mattson <[email protected]>
commit 93c9e107386dbe1243287a5b14ceca894de372b9 upstream.
Mark the VMCB_PERM_MAP bit as dirty in nested_vmcb02_prepare_control() on every nested VMRUN.
If L1 changes MSR interception (INTERCEPT_MSR_PROT) between two VMRUN instructions on the same L1 vCPU, the msrpm_base_pa in the associated vmcb02 will change, and the VMCB_PERM_MAP clean bit should be cleared.
--- arch/x86/kvm/svm/nested.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/kvm/svm/nested.c +1 -0
@@ -676,6 +676,7 @@ static void nested_vmcb02_prepare_contro vmcb02->control.nested_ctl = vmcb01->control.nested_ctl; vmcb02->control.iopm_base_pa = vmcb01->control.iopm_base_pa; vmcb02->control.msrpm_base_pa = vmcb01->control.msrpm_base_pa; +vmcb_mark_dirty (vmcb02,VMCB_PERM_MAP );/* Done at vmrun: asid. */
Greg Kroah-Hartman
maintainerPATCH 469/737 KVM: nSVM: Set exit_code_hi to -1 when synthesizing SVM_EXIT_ERR (failed VMRUN)
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit f402ecd7a8b6446547076f4bd24bd5d4dcc94481 upstream.
Set exit_code_hi to -1u as a temporary band-aid to fix a long-standing (effectively since KVM's inception) bug where KVM treats the exit code as a 32-bit value, when in reality it's a 64-bit value. Per the APM, offset 0x70 is a single 64-bit value:
070h 63:0 EXITCODE
And a sane reading of the error values defined in "Table C-1. SVM Intercept Codes" is that negative values use the full 64 bits:
–1 VMEXIT_INVALID Invalid guest state in VMCB.
–2 VMEXIT_BUSYBUSY bit was set in the VMSA
–3 VMEXIT_IDLE_REQUIREDThe sibling thread is not in an idle state -4 VMEXIT_INVALID_PMC Invalid PMC state
And that interpretation is confirmed by testing on Milan and Turin (by setting bits in CR0[63:32] to generate VMEXIT_INVALID on VMRUN).
Furthermore, Xen has treated exitcode as a 64-bit value since HVM support was adding in 2006 (see Xen commit d1bd157fbc ("Big merge the HVM full-virtualisation abstractions.")).
--- arch/x86/kvm/svm/nested.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/kvm/svm/nested.c +2 -2
@@ -886,7 +886,7 @@ int nested_svm_vmrun(struct kvm_vcpu *vcif (!nested_vmcb_check_save (vcpu) || !nested_vmcb_check_controls (vcpu)) { vmcb12->control.exit_code =SVM_EXIT_ERR ; - vmcb12->control.exit_code_hi =0 ; + vmcb12->control.exit_code_hi =-1u ; vmcb12->control.exit_info_1 =0 ; vmcb12->control.exit_info_2 =0 ; goto out;
@@ -919,7 +919,7 @@ out_exit_err: svm->soft_int_injected = false; svm->vmcb->control.exit_code =SVM_EXIT_ERR ; - svm->vmcb->control.exit_code_hi =0 ; + svm->vmcb->control.exit_code_hi =-1u ; svm->vmcb->control.exit_info_1 =0 ; svm->vmcb->control.exit_info_2 =0 ;
Greg Kroah-Hartman
maintainerPATCH 470/737 KVM: nSVM: Clear exit_code_hi in VMCB when synthesizing nested VM-Exits
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit da01f64e7470988f8607776aa7afa924208863fb upstream.
Explicitly clear exit_code_hi in the VMCB when synthesizing "normal" nested VM-Exits, as the full exit code is a 64-bit value (spoiler alert), and all exit codes for non-failing VMRUN use only bits 31:0.
--- arch/x86/kvm/svm/svm.c | 2 ++ arch/x86/kvm/svm/svm.h | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-)
arch/x86/kvm/svm/svm.c +2 -0
@@ -2645,6 +2645,7 @@ static bool check_selective_cr0_intercepif (cr0 ^ val) { svm->vmcb->control.exit_code =SVM_EXIT_CR0_SEL_WRITE ; + svm->vmcb->control.exit_code_hi =0 ; ret = (nested_svm_exit_handled (svm) ==NESTED_EXIT_DONE ); }
@@ -4647,6 +4648,7 @@ static int svm_check_intercept(struct kvif (static_cpu_has (X86_FEATURE_NRIPS )) vmcb->control.next_rip = info->next_rip; vmcb->control.exit_code = icpt_info.exit_code; + vmcb->control.exit_code_hi =0 ; vmexit =nested_svm_exit_handled (svm); ret = (vmexit == NESTED_EXIT_DONE) ? X86EMUL_INTERCEPTED
arch/x86/kvm/svm/svm.h +4 -3
@@ -601,9 +601,10 @@ int nested_svm_vmexit(struct vcpu_svm *sstatic inline int nested_svm_simple_vmexit (struct vcpu_svm *svm,u32 exit_code) { - svm->vmcb->control.exit_code = exit_code; - svm->vmcb->control.exit_info_1 =0 ; - svm->vmcb->control.exit_info_2 =0 ; + svm->vmcb->control.exit_code = exit_code; + svm->vmcb->control.exit_code_hi =0 ; + svm->vmcb->control.exit_info_1 =0 ; + svm->vmcb->control.exit_info_2 =0 ;return nested_svm_vmexit (svm); }
Greg Kroah-Hartman
maintainerPATCH 471/737 xfs: fix a memory leak in xfs_buf_item_init()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
commit fc40459de82543b565ebc839dca8f7987f16f62e upstream.
xfs_buf_item_get_format() may allocate memory for bip->bli_formats, free the memory in the error path.
--- fs/xfs/xfs_buf_item.c | 1 + 1 file changed, 1 insertion(+)
fs/xfs/xfs_buf_item.c +1 -0
@@ -900,6 +900,7 @@ xfs_buf_item_init( map_size =DIV_ROUND_UP (chunks,NBWORD );if (map_size >XFS_BLF_DATAMAP_SIZE ) { +xfs_buf_item_free_format (bip);kmem_cache_free (xfs_buf_item_cache, bip); xfs_err(mp, "buffer item dirty bitmap (%u uints) too small to reflect %u bytes!",
Greg Kroah-Hartman
maintainerPATCH 472/737 tracing: Do not register unsupported perf events
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit ef7f38df890f5dcd2ae62f8dbde191d72f3bebae upstream.
Synthetic events currently do not have a function to register perf events. This leads to calling the tracepoint register functions with a NULL function pointer which triggers:
------------[ cut here ]------------ WARNING: kernel/tracepoint.c:175 at tracepoint_add_func+0x357/0x370, CPU#2: perf/2272 Modules linked in: kvm_intel kvm irqbypass CPU: 2 UID: 0 PID: 2272 Comm: perf Not tainted 6.18.0-ftest-11964-ge022764176fc-dirty #323 PREEMPTLAZY Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.17.0-debian-1.17.0-1 04/01/2014 RIP: 0010:tracepoint_add_func+0x357/0x370 Code: 28 9c e8 4c 0b f5 ff eb 0f 4c 89 f7 48 c7 c6 80 4d 28 9c e8 ab 89 f4 ff 31 c0 5b 41 5c 41 5d 41 5e 41 5f 5d c3 cc cc cc cc cc <0f> 0b 49 c7 c6 ea ff ff ff e9 ee fe ff ff 0f 0b e9 f9 fe ff ff 0f RSP: 0018:ffffabc0c44d3c40 EFLAGS: 00010246 RAX: 0000000000000001 RBX: ffff9380aa9e4060 RCX: 0000000000000000 RDX: 000000000000000a RSI: ffffffff9e1d4a98 RDI: ffff937fcf5fd6c8 RBP: 0000000000000001 R08: 0000000000000007 R09: ffff937fcf5fc780 R10: 0000000000000003 R11: ffffffff9c193910 R12: 000000000000000a R13: ffffffff9e1e5888 R14: 0000000000000000 R15: ffffabc0c44d3c78 FS: 00007f6202f5f340(0000) GS:ffff93819f00f000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000055d3162281a8 CR3: 0000000106a56003 CR4: 0000000000172ef0 Call Trace: <TASK> tracepoint_probe_register+0x5d/0x90 synth_event_reg+0x3c/0x60 perf_trace_event_init+0x204/0x340 perf_trace_init+0x85/0xd0 perf_tp_event_init+0x2e/0x50 perf_try_init_event+0x6f/0x230 ? perf_event_alloc+0x4bb/0xdc0 perf_event_alloc+0x65a/0xdc0 __se_sys_perf_event_open+0x290/0x9f0 do_syscall_64+0x93/0x7b0 ? entry_SYSCALL_64_after_hwframe+0x76/0x7e ? trace_hardirqs_off+0x53/0xc0 entry_SYSCALL_64_after_hwframe+0x76/0x7e
Instead, have the code return -ENODEV, which doesn't warn and has perf error out with:
# perf record -e synthetic:futex_wait Error: The sys_perf_event_open() syscall returned with 19 (No such device) for event (synthetic:futex_wait). "dmesg | grep -i perf" may provide additional information.
Ideally perf should support synthetic events, but for now just fix the warning. The support can come later.
--- kernel/trace/trace_events.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/trace/trace_events.c +2 -0
@@ -689,6 +689,8 @@ int trace_event_reg(struct trace_event_c#ifdef CONFIG_PERF_EVENTS case TRACE_REG_PERF_REGISTER : +if (!call->class->perf_probe) +return -ENODEV ;return tracepoint_probe_register (call->tp, call->class->perf_probe, call);
Greg Kroah-Hartman
maintainerPATCH 473/737 PM: runtime: Do not clear needs_force_resume with enabled runtime PM
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
commit 359afc8eb02a518fbdd0cbd462c8c2827c6cbec2 upstream.
Commit 89d9cec3b1e9 ("PM: runtime: Clear power.needs_force_resume in pm_runtime_reinit()") added provisional clearing of power.needs_force_resume to pm_runtime_reinit(), but it is done unconditionally which is a mistake because pm_runtime_reinit() may race with driver probing and removal [1].
To address this, notice that power.needs_force_resume should never be set when runtime PM is enabled and so it only needs to be cleared when runtime PM is disabled, and update pm_runtime_init() to only clear that flag when runtime PM is disabled.
--- drivers/base/power/runtime.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
drivers/base/power/runtime.c +12 -10
@@ -1827,16 +1827,18 @@ void pm_runtime_init(struct device *dev)*/ void pm_runtime_reinit (struct device *dev) { -if (!pm_runtime_enabled (dev)) { -if (dev->power.runtime_status ==RPM_ACTIVE ) -pm_runtime_set_suspended (dev); -if (dev->power.irq_safe) { -spin_lock_irq (&dev->power.lock); - dev->power.irq_safe =0 ; -spin_unlock_irq (&dev->power.lock); -if (dev->parent) -pm_runtime_put (dev->parent); - } +if (pm_runtime_enabled (dev)) +return ; + +if (dev->power.runtime_status ==RPM_ACTIVE ) +pm_runtime_set_suspended (dev); + +if (dev->power.irq_safe) { +spin_lock_irq (&dev->power.lock); + dev->power.irq_safe =0 ; +spin_unlock_irq (&dev->power.lock); +if (dev->parent) +pm_runtime_put (dev->parent); }/* * Clear power.needs_force_resume in case it has been set by
Greg Kroah-Hartman
maintainerPATCH 474/737 r8169: fix RTL8117 Wake-on-Lan in DASH mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: René Rebe <[email protected]>
commit dd75c723ef566f7f009c047f47e0eee95fe348ab upstream.
Wake-on-Lan does currently not work for r8169 in DASH mode, e.g. the ASUS Pro WS X570-ACE with RTL8168fp/RTL8117.
Fix by not returning early in rtl_prepare_power_down when dash_enabled. While this fixes WoL, it still kills the OOB RTL8117 remote management BMC connection. Fix by not calling rtl8168_driver_stop if WoL is enabled.
--- drivers/net/ethernet/realtek/r8169_main.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/net/ethernet/realtek/r8169_main.c +1 -4
@@ -2581,9 +2581,6 @@ static void rtl_wol_enable_rx(struct rtlstatic void rtl_prepare_power_down (struct rtl8169_private *tp) { -if (tp->dash_enabled) -return ; -if (tp->mac_version ==RTL_GIGA_MAC_VER_32 || tp->mac_version ==RTL_GIGA_MAC_VER_33 )rtl_ephy_write (tp,0x19 ,0xff64 );
@@ -4721,7 +4718,7 @@ static void rtl8169_down(struct rtl8169_rtl_disable_exit_l1 (tp);rtl_prepare_power_down (tp); -if (tp->dash_type !=RTL_DASH_NONE ) +if (tp->dash_type !=RTL_DASH_NONE && !tp->saved_wolopts)rtl8168_driver_stop (tp); }
Greg Kroah-Hartman
maintainerPATCH 475/737 fsnotify: do not generate ACCESS/MODIFY events on child for special files
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Goldstein <[email protected]>
commit 635bc4def026a24e071436f4f356ea08c0eed6ff upstream.
inotify/fanotify do not allow users with no read access to a file to subscribe to events (e.g. IN_ACCESS/IN_MODIFY), but they do allow the same user to subscribe for watching events on children when the user has access to the parent directory (e.g. /dev).
Users with no read access to a file but with read access to its parent directory can still stat the file and see if it was accessed/modified via atime/mtime change.
The same is not true for special files (e.g. /dev/null). Users will not generally observe atime/mtime changes when other users read/write to special files, only when someone sets atime/mtime via utimensat().
Align fsnotify events with this stat behavior and do not generate ACCESS/MODIFY events to parent watchers on read/write of special files. The events are still generated to parent watchers on utimensat(). This closes some side-channels that could be possibly used for information exfiltration [1].
[1] https://snee.la/pdf/pubs/file-notification-attacks.pdf
--- fs/notify/fsnotify.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
fs/notify/fsnotify.c +8 -1
@@ -224,8 +224,15 @@ int __fsnotify_parent(struct dentry *den/* * Include parent/name in notification either if some notification * groups require parent info or the parent is interested in this event. +* The parent interest in ACCESS/MODIFY events does not apply to special +* files, where read/write are not on the filesystem of the parent and +* events can provide an undesirable side-channel for information +* exfiltration. */ - parent_interested = mask & p_mask &ALL_FSNOTIFY_EVENTS ; + parent_interested = mask & p_mask &ALL_FSNOTIFY_EVENTS && + !(data_type ==FSNOTIFY_EVENT_PATH && +d_is_special (dentry) && + (mask & (FS_ACCESS |FS_MODIFY )));if (parent_needed || parent_interested) {/* When notifying parent, child should be passed as data */ WARN_ON_ONCE (inode !=fsnotify_data_inode (data, data_type));
Greg Kroah-Hartman
maintainerPATCH 476/737 net/handshake: restore destructor on submit failure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: caoping <[email protected]>
commit 6af2a01d65f89e73c1cbb9267f8880d83a88cee4 upstream.
handshake_req_submit() replaces sk->sk_destruct but never restores it when submission fails before the request is hashed. handshake_sk_destruct() then returns early and the original destructor never runs, leaking the socket. Restore sk_destruct on the error path.
--- net/handshake/request.c | 2 ++ 1 file changed, 2 insertions(+)
net/handshake/request.c +2 -0
@@ -277,6 +277,8 @@ int handshake_req_submit(struct socket * out_unlock:spin_unlock (&hn->hn_lock); out_err: +/* Restore original destructor so socket teardown still runs on failure */ + req->hr_sk->sk_destruct = req->hr_odestruct;trace_handshake_submit_err (net, req, req->hr_sk, ret);handshake_req_destroy (req);return ret;
Greg Kroah-Hartman
maintainerPATCH 477/737 nfsd: Mark variable __maybe_unused to avoid W=1 build break
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit ebae102897e760e9e6bc625f701dd666b2163bd1 upstream.
Clang is not happy about set but (in some cases) unused variable:
fs/nfsd/export.c:1027:17: error: variable 'inode' set but not used [-Werror,-Wunused-but-set-variable]
since it's used as a parameter to dprintk() which might be configured a no-op. To avoid uglifying code with the specific ifdeffery just mark the variable __maybe_unused.
The commit [1], which introduced this behaviour, is quite old and hence the Fixes tag points to the first of the Git era.
--- fs/nfsd/export.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfsd/export.c +1 -1
@@ -1014,7 +1014,7 @@ exp_rootfh(struct net *net, struct auth_ {struct svc_export *exp;struct path path; -struct inode *inode; +struct inode *inode__maybe_unused ;struct svc_fh fh;int err;struct nfsd_net *nn =net_generic (net, nfsd_net_id);
Greg Kroah-Hartman
maintainerPATCH 478/737 svcrdma: return 0 on success from svc_rdma_copy_inline_range
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joshua Rogers <[email protected]>
commit 94972027ab55b200e031059fd6c7a649f8248020 upstream.
The function comment specifies 0 on success and -EINVAL on invalid parameters. Make the tail return 0 after a successful copy loop.
--- net/sunrpc/xprtrdma/svc_rdma_rw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sunrpc/xprtrdma/svc_rdma_rw.c +1 -1
@@ -834,7 +834,7 @@ static int svc_rdma_copy_inline_range(st offset += page_len; } -return -EINVAL ; +return 0 ; }/**
Greg Kroah-Hartman
maintainerPATCH 479/737 SUNRPC: svcauth_gss: avoid NULL deref on zero length gss_token in gss_read_proxy_verf
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joshua Rogers <[email protected]>
commit d4b69a6186b215d2dc1ebcab965ed88e8d41768d upstream.
A zero length gss_token results in pages == 0 and in_token->pages[0] is NULL. The code unconditionally evaluates page_address(in_token->pages[0]) for the initial memcpy, which can dereference NULL even when the copy length is 0. Guard the first memcpy so it only runs when length > 0.
--- net/sunrpc/auth_gss/svcauth_gss.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/sunrpc/auth_gss/svcauth_gss.c +2 -1
@@ -1093,7 +1093,8 @@ static int gss_read_proxy_verf(struct sv } length = min_t(unsigned int, inlen, (char *)xdr->end - (char *)xdr->p); -memcpy (page_address (in_token->pages[0 ]), xdr->p, length); +if (length) +memcpy (page_address (in_token->pages[0 ]), xdr->p, length); inlen -= length; to_offs = length;
Greg Kroah-Hartman
maintainerPATCH 480/737 powerpc/kexec: Enable SMT before waking offline CPUs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nysal Jan K.A. <[email protected]>
commit c2296a1e42418556efbeb5636c4fa6aa6106713a upstream.
If SMT is disabled or a partial SMT state is enabled, when a new kernel image is loaded for kexec, on reboot the following warning is observed:
kexec: Waking offline cpu 228.
WARNING: CPU: 0 PID: 9062 at arch/powerpc/kexec/core_64.c:223 kexec_prepare_cpus+0x1b0/0x1bc [snip] NIP kexec_prepare_cpus+0x1b0/0x1bc LR kexec_prepare_cpus+0x1a0/0x1bc Call Trace: kexec_prepare_cpus+0x1a0/0x1bc (unreliable) default_machine_kexec+0x160/0x19c machine_kexec+0x80/0x88 kernel_kexec+0xd0/0x118 __do_sys_reboot+0x210/0x2c4 system_call_exception+0x124/0x320 system_call_vectored_common+0x15c/0x2ec
This occurs as add_cpu() fails due to cpu_bootable() returning false for CPUs that fail the cpu_smt_thread_allowed() check or non primary threads if SMT is disabled.
Fix the issue by enabling SMT and resetting the number of SMT threads to the number of threads per core, before attempting to wake up all present CPUs.
--- arch/powerpc/kexec/core_64.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
arch/powerpc/kexec/core_64.c +19 -0
@@ -200,6 +200,23 @@ static void kexec_prepare_cpus_wait(intmb (); } + +/* +* The add_cpu() call in wake_offline_cpus() can fail as cpu_bootable() +* returns false for CPUs that fail the cpu_smt_thread_allowed() check +* or non primary threads if SMT is disabled. Re-enable SMT and set the +* number of SMT threads to threads per core. +*/ +static void kexec_smt_reenable (void ) +{ +#if defined(CONFIG_SMP ) && defined(CONFIG_HOTPLUG_SMT ) +lock_device_hotplug (); + cpu_smt_num_threads = threads_per_core; + cpu_smt_control =CPU_SMT_ENABLED ; +unlock_device_hotplug (); +#endif +} +/* * We need to make sure each present CPU is online. The next kernel will scan * the device tree and assume primary threads are online and query secondary
@@ -214,6 +231,8 @@ static void wake_offline_cpus(void) {int cpu =0 ; +kexec_smt_reenable (); +for_each_present_cpu (cpu) {if (!cpu_online (cpu)) { printk(KERN_INFO "kexec: Waking offline cpu %d.\n",
Greg Kroah-Hartman
maintainerPATCH 481/737 btrfs: dont log conflicting inode if its a dir moved in the current transaction
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 266273eaf4d99475f1ae57f687b3e42bc71ec6f0 upstream.
We can't log a conflicting inode if it's a directory and it was moved from one parent directory to another parent directory in the current transaction, as this can result an attempt to have a directory with two hard links during log replay, one for the old parent directory and another for the new parent directory.
The following scenario triggers that issue:
1) We have directories "dir1" and "dir2" created in a past transaction. Directory "dir1" has inode A as its parent directory;
2) We move "dir1" to some other directory;
3) We create a file with the name "dir1" in directory inode A;
4) We fsync the new file. This results in logging the inode of the new file and the inode for the directory "dir1" that was previously moved in the current transaction. So the log tree has the INODE_REF item for the new location of "dir1";
5) We move the new file to some other directory. This results in updating the log tree to included the new INODE_REF for the new location of the file and removes the INODE_REF for the old location. This happens during the rename when we call btrfs_log_new_name();
6) We fsync the file, and that persists the log tree changes done in the previous step (btrfs_log_new_name() only updates the log tree in memory);
7) We have a power failure;
8) Next time the fs is mounted, log replay happens and when processing the inode for directory "dir1" we find a new INODE_REF and add that link, but we don't remove the old link of the inode since we have not logged the old parent directory of the directory inode "dir1".
As a result after log replay finishes when we trigger writeback of the subvolume tree's extent buffers, the tree check will detect that we have a directory a hard link count of 2 and we get a mount failure. The errors and stack traces reported in dmesg/syslog are like this:
[ 3845.729764] BTRFS info (device dm-0): start tree-log replay [ 3845.730304] page: refcount:3 mapcount:0 mapping:000000005c8a3027 index:0x1d00 pfn:0x11510c [ 3845.731236] memcg:ffff9264c02f4e00 [ 3845.731751] aops:btree_aops [btrfs] ino:1 [ 3845.732300] flags: 0x17fffc00000400a(uptodate|private|writeback|node=0|zone=2|lastcpupid=0x1ffff) [ 3845.733346] raw: 017fffc00000400a 0000000000000000 dead000000000122 ffff9264d978aea8 [ 3845.734265] raw: 0000000000001d00 ffff92650e6d4738 00000003ffffffff ffff9264c02f4e00 [ 3845.735305] page dumped because: eb page dump [ 3845.735981] BTRFS critical (device dm-0): corrupt leaf: root=5 block=30408704 slot=6 ino=257, invalid nlink: has 2 expect no more than 1 for dir [ 3845.737786] BTRFS info (device dm-0): leaf 30408704 gen 10 total ptrs 17 free space 14881 owner 5 [ 3845.737789] BTRFS info (device dm-0): refs 4 lock_owner 0 current 30701 [ 3845.737792] item 0 key (256 INODE_ITEM 0) itemoff 16123 itemsize 160 [ 3845.737794] inode generation 3 transid 9 size 16 nbytes 16384 [ 3845.737795] block group 0 mode 40755 links 1 uid 0 gid 0 [ 3845.737797] rdev 0 sequence 2 flags 0x0 [ 3845.737798] atime 1764259517.0 [ 3845.737800] ctime 1764259517.572889464 [ 3845.737801] mtime 1764259517.572889464 [ 3845.737802] otime 1764259517.0 [ 3845.737803] item 1 key (256 INODE_REF 256) itemoff 16111 itemsize 12 [ 3845.737805] index 0 name_len 2 [ 3845.737807] item 2 key (256 DIR_ITEM 2363071922) itemoff 16077 itemsize 34 [ 3845.737808] location key (257 1 0) type 2 [ 3845.737810] transid 9 data_len 0 name_len 4 [ 3845.737811] item 3 key (256 DIR_ITEM 2676584006) itemoff 16043 itemsize 34 [ 3845.737813] location key (258 1 0) type 2 [ 3845.737814] transid 9 data_len 0 name_len 4 [ 3845.737815] item 4 key (256 DIR_INDEX 2) itemoff 16009 itemsize 34 [ 3845.737816] location key (257 1 0) type 2 [ 3845.737818] transid 9 data_len 0 name_len 4 [ 3845.737819] item 5 key (256 DIR_INDEX 3) itemoff 15975 itemsize 34 [ 3845.737820] location key (258 1 0) type 2 [ 3845.737821] transid 9 data_len 0 name_len 4 [ 3845.737822] item 6 key (257 INODE_ITEM 0) itemoff 15815 itemsize 160 [ 3845.737824] inode generation 9 transid 10 size 6 nbytes 0 [ 3845.737825] block group 0 mode 40755 links 2 uid 0 gid 0 [ 3845.737826] rdev 0 sequence 1 flags 0x0 [ 3845.737827] atime 1764259517.572889464 [ 3845.737828] ctime 1764259517.572889464 [ 3845.737830] mtime 1764259517.572889464 [ 3845.737831] otime 1764259517.572889464 [ 3845.737832] item 7 key (257 INODE_REF 256) itemoff 15801 itemsize 14 [ 3845.737833] index 2 name_len 4 [ 3845.737834] item 8 key (257 INODE_REF 258) itemoff 15787 itemsize 14 [ 3845.737836] index 2 name_len 4 [ 3845.737837] item 9 key (257 DIR_ITEM 2507850652) itemoff 15754 itemsize 33 [ 3845.737838] location key (259 1 0) type 1 [ 3845.737839] transid 10 data_len 0 name_len 3 [ 3845.737840] item 10 key (257 DIR_INDEX 2) itemoff 15721 itemsize 33 [ 3845.737842] location key (259 1 0) type 1 [ 3845.737843] transid 10 data_len 0 name_len 3 [ 3845.737844] item 11 key (258 INODE_ITEM 0) itemoff 15561 itemsize 160 [ 3845.737846] inode generation 9 transid 10 size 8 nbytes 0 [ 3845.737847] block group 0 mode 40755 links 1 uid 0 gid 0 [ 3845.737848] rdev 0 sequence 1 flags 0x0 [ 3845.737849] atime 1764259517.572889464 [ 3845.737850] ctime 1764259517.572889464 [ 3845.737851] mtime 1764259517.572889464 [ 3845.737852] otime 1764259517.572889464 [ 3845.737853] item 12 key (258 INODE_REF 256) itemoff 15547 itemsize 14 [ 3845.737855] index 3 name_len 4 [ 3845.737856] item 13 key (258 DIR_ITEM 1843588421) itemoff 15513 itemsize 34 [ 3845.737857] location key (257 1 0) type 2 [ 3845.737858] transid 10 data_len 0 name_len 4 [ 3845.737860] item 14 key (258 DIR_INDEX 2) itemoff 15479 itemsize 34 [ 3845.737861] location key (257 1 0) type 2 [ 3845.737862] transid 10 data_len 0 name_len 4 [ 3845.737863] item 15 key (259 INODE_ITEM 0) itemoff 15319 itemsize 160 [ 3845.737865] inode generation 10 transid 10 size 0 nbytes 0 [ 3845.737866] block group 0 mode 100600 links 1 uid 0 gid 0 [ 3845.737867] rdev 0 sequence 2 flags 0x0 [ 3845.737868] atime 1764259517.580874966 [ 3845.737869] ctime 1764259517.586121869 [ 3845.737870] mtime 1764259517.580874966 [ 3845.737872] otime 1764259517.580874966 [ 3845.737873] item 16 key (259 INODE_REF 257) itemoff 15306 itemsize 13 [ 3845.737874] index 2 name_len 3 [ 3845.737875] BTRFS error (device dm-0): block=30408704 write time tree block corruption detected [ 3845.739448] ------------[ cut here ]------------ [ 3845.740092] WARNING: CPU: 5 PID: 30701 at fs/btrfs/disk-io.c:335 btree_csum_one_bio+0x25a/0x270 [btrfs] [ 3845.741439] Modules linked in: btrfs dm_flakey crc32c_cryptoapi (...) [ 3845.750626] CPU: 5 UID: 0 PID: 30701 Comm: mount Tainted: G W 6.18.0-rc6-btrfs-next-218+ #1 PREEMPT(full) [ 3845.752414] Tainted: [W]=WARN [ 3845.752828] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org 04/01/2014 [ 3845.754499] RIP: 0010:btree_csum_one_bio+0x25a/0x270 [btrfs] [ 3845.755460] Code: 31 f6 48 89 (...) [ 3845.758685] RSP: 0018:ffffa8d9c5677678 EFLAGS: 00010246 [ 3845.759450] RAX: 0000000000000000 RBX: ffff92650e6d4738 RCX: 0000000000000000 [ 3845.760309] RDX: 0000000000000000 RSI: ffffffff9aab45b9 RDI: ffff9264c4748000 [ 3845.761239] RBP: ffff9264d4324000 R08: 0000000000000000 R09: ffffa8d9c5677468 [ 3845.762607] R10: ffff926bdc1fffa8 R11: 0000000000000003 R12: ffffa8d9c5677680 [ 3845.764099] R13: 0000000000004000 R14: ffff9264dd624000 R15: ffff9264d978aba8 [ 3845.765094] FS: 00007f751fa5a840(0000) GS:ffff926c42a82000(0000) knlGS:0000000000000000 [ 3845.766226] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 3845.766970] CR2: 0000558df1815380 CR3: 000000010ed88003 CR4: 0000000000370ef0 [ 3845.768009] Call Trace: [ 3845.768392] <TASK> [ 3845.768714] btrfs_submit_bbio+0x6ee/0x7f0 [btrfs] [ 3845.769640] ? write_one_eb+0x28e/0x340 [btrfs] [ 3845.770588] btree_write_cache_pages+0x2f0/0x550 [btrfs] [ 3845.771286] ? alloc_extent_state+0x19/0x100 [btrfs] [ 3845.771967] ? merge_next_state+0x1a/0x90 [btrfs] [ 3845.772586] ? set_extent_bit+0x233/0x8b0 [btrfs] [ 3845.773198] ? xas_load+0x9/0xc0 [ 3845.773589] ? xas_find+0x14d/0x1a0 [ 3845.773969] do_writepages+0xc6/0x160 [ 3845.774367] filemap_fdatawrite_wbc+0x48/0x60 [ 3845.775003] __filemap_fdatawrite_range+0x5b/0x80 [ 3845.775902] btrfs_write_marked_extents+0x61/0x170 [btrfs] [ 3845.776707] btrfs_write_and_wait_transaction+0x4e/0xc0 [btrfs] [ 3845.777379] ? _raw_spin_unlock_irqrestore+0x23/0x40 [ 3845.777923] btrfs_commit_transaction+0x5ea/0xd20 [btrfs] [ 3845.778551] ? _raw_spin_unlock+0x15/0x30 [ 3845.778986] ? release_extent_buffer+0x34/0x160 [btrfs] [ 3845.779659] btrfs_recover_log_trees+0x7a3/0x7c0 [btrfs] [ 3845.780416] ? __pfx_replay_one_buffer+0x10/0x10 [btrfs] [ 3845.781499] open_ctree+0x10bb/0x15f0 [btrfs] [ 3845.782194] btrfs_get_tree.cold+0xb/0x16c [btrfs] [ 3845.782764] ? fscontext_read+0x15c/0x180 [ 3845.783202] ? rw_verify_area+0x50/0x180 [ 3845.783667] vfs_get_tree+0x25/0xd0 [ 3845.784047] vfs_cmd_create+0x59/0xe0 [ 3845.784458] __do_sys_fsconfig+0x4f6/0x6b0 [ 3845.784914] do_syscall_64+0x50/0x1220 [ 3845.785340] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 3845.785980] RIP: 0033:0x7f751fc7f4aa [ 3845.786759] Code: 73 01 c3 48 (...) [ 3845.789951] RSP: 002b:00007ffcdba45dc8 EFLAGS: 00000246 ORIG_RAX: 00000000000001af [ 3845.791402] RAX: ffffffffffffffda RBX: 000055ccc8291c20 RCX: 00007f751fc7f4aa [ 3845.792688] RDX: 0000000000000000 RSI: 0000000000000006 RDI: 0000000000000003 [ 3845.794308] RBP: 000055ccc8292120 R08: 0000000000000000 R09: 0000000000000000 [ 3845.795829] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 [ 3845.797183] R13: 00007f751fe11580 R14: 00007f751fe1326c R15: 00007f751fdf8a23 [ 3845.798633] </TASK> [ 3845.799067] ---[ end trace 0000000000000000 ]--- [ 3845.800215] BTRFS: error (device dm-0) in btrfs_commit_transaction:2553: errno=-5 IO failure (Error while writing out transaction) [ 3845.801860] BTRFS warning (device dm-0 state E): Skipping commit of aborted transaction. [ 3845.802815] BTRFS error (device dm-0 state EA): Transaction aborted (error -5) [ 3845.803728] BTRFS: error (device dm-0 state EA) in cleanup_transaction:2036: errno=-5 IO failure [ 3845.805374] BTRFS: error (device dm-0 state EA) in btrfs_replay_log:2083: errno=-5 IO failure (Failed to recover log tree) [ 3845.807919] BTRFS error (device dm-0 state EA): open_ctree failed: -5
Fix this by never logging a conflicting inode that is a directory and was moved in the current transaction (its last_unlink_trans equals the current transaction) and instead fallback to a transaction commit.
A test case for fstests will follow soon.
--- fs/btrfs/tree-log.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
fs/btrfs/tree-log.c +38 -0
@@ -5704,6 +5704,33 @@ static int conflicting_inode_is_dir(strureturn ret; } +static bool can_log_conflicting_inode (const struct btrfs_trans_handle *trans, +const struct btrfs_inode *inode) +{ +if (!S_ISDIR (inode->vfs_inode.i_mode)) +return true; + +if (inode->last_unlink_trans < trans->transid) +return true; + +/* +* If this is a directory and its unlink_trans is not from a past +* transaction then we must fallback to a transaction commit in order +* to avoid getting a directory with 2 hard links after log replay. +* +* This happens if a directory A is renamed, moved from one parent +* directory to another one, a new file is created in the old parent +* directory with the old name of our directory A, the new file is +* fsynced, then we moved the new file to some other parent directory +* and fsync again the new file. This results in a log tree where we +* logged that directory A existed, with the INODE_REF item for the +* new location but without having logged its old parent inode, so +* that on log replay we add a new link for the new location but the +* old link remains, resulting in a link count of 2. +*/ +return false; +} + static int add_conflicting_inode(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct btrfs_path *path,
@@ -5807,6 +5834,11 @@ static int add_conflicting_inode(structreturn 0 ; } +if (!can_log_conflicting_inode (trans, inode)) { +btrfs_add_delayed_iput (inode); +return BTRFS_LOG_FORCE_COMMIT ; + } +btrfs_add_delayed_iput (inode); ino_elem =kmalloc (sizeof (*ino_elem),GFP_NOFS );
@@ -5871,6 +5903,12 @@ static int log_conflicting_inodes(structbreak ; } +if (!can_log_conflicting_inode (trans, inode)) { +btrfs_add_delayed_iput (inode); + ret =BTRFS_LOG_FORCE_COMMIT ; +break ; + } +/* * Always log the directory, we cannot make this * conditional on need_log_inode() because the directory
Greg Kroah-Hartman
maintainerPATCH 482/737 s390/ipl: Clear SBP flag when bootprog is set
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Schnelle <[email protected]>
commit b1aa01d31249bd116b18c7f512d3e46b4b4ad83b upstream.
With z16 a new flag 'search boot program' was introduced for list-directed IPL (SCSI, NVMe, ECKD DASD). If this flag is set, e.g. via selecting the "Automatic" value for the "Boot program selector" control on an HMC load panel, it is copied to the reipl structure from the initial ipl structure. When a user now sets a boot prog via sysfs, the flag is not cleared and the bootloader will again automatically select the boot program, ignoring user configuration.
To avoid that, clear the SBP flag when a bootprog sysfs file is written.
--- arch/s390/include/uapi/asm/ipl.h | 1 arch/s390/kernel/ipl.c | 48 +++++++++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 12 deletions(-)
arch/s390/include/uapi/asm/ipl.h +1 -0
@@ -15,6 +15,7 @@ struct ipl_pl_hdr {#define IPL_PL_FLAG_IPLPS 0x80#define IPL_PL_FLAG_SIPL 0x40#define IPL_PL_FLAG_IPLSR 0x20 +#define IPL_PL_FLAG_SBP 0x10/* IPL Parameter Block header */ struct ipl_pb_hdr {
arch/s390/kernel/ipl.c +36 -12
102 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 483/737 gpio: regmap: Fix memleak in error path in gpio_regmap_register()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wentao Guan <[email protected]>
commit 52721cfc78c76b09c66e092b52617006390ae96a upstream.
Call gpiochip_remove() to free the resources allocated by gpiochip_add_data() in error path.
--- drivers/gpio/gpio-regmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpio/gpio-regmap.c +1 -1
@@ -310,7 +310,7 @@ struct gpio_regmap *gpio_regmap_register config->regmap_irq_line, config->regmap_irq_flags, 0, config->regmap_irq_chip, &gpio->irq_chip_data);if (ret) - goto err_free_bitmap; + goto err_remove_gpiochip; irq_domain =regmap_irq_get_domain (gpio->irq_chip_data); }else
Greg Kroah-Hartman
maintainerPATCH 484/737 io_uring/poll: correctly handle io_poll_add() return value on update
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
Commit 84230ad2d2afbf0c44c32967e525c0ad92e26b4e upstream.
When the core of io_uring was updated to handle completions consistently and with fixed return codes, the POLL_REMOVE opcode with updates got slightly broken. If a POLL_ADD is pending and then POLL_REMOVE is used to update the events of that request, if that update causes the POLL_ADD to now trigger, then that completion is lost and a CQE is never posted.
Additionally, ensure that if an update does cause an existing POLL_ADD to complete, that the completion value isn't always overwritten with -ECANCELED. For that case, whatever io_poll_add() set the value to should just be retained.
--- io_uring/poll.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
io_uring/poll.c +7 -2
@@ -1024,12 +1024,17 @@ found: ret2 =io_poll_add (preq, issue_flags & ~IO_URING_F_UNLOCKED );/* successfully updated, don't complete poll request */ -if (!ret2 || ret2 == -EIOCBQUEUED ) +if (ret2 ==IOU_ISSUE_SKIP_COMPLETE ) goto out; +/* request completed as part of the update, complete it */ +else if (ret2 ==IOU_OK ) + goto complete; } -req_set_fail (preq);io_req_set_res (preq, -ECANCELED ,0 ); +complete: +if (preq->cqe.res <0 ) +req_set_fail (preq); preq->io_task_work.func = io_req_task_complete;io_req_task_work_add (preq); out:
Greg Kroah-Hartman
maintainerPATCH 485/737 drm/amd/display: Use GFP_ATOMIC in dc_create_plane_state()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 3c41114dcdabb7b25f5bc33273c6db9c7af7f4a7 upstream.
This can get called from an atomic context.
--- drivers/gpu/drm/amd/display/dc/core/dc_surface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc_surface.c +1 -1
@@ -104,7 +104,7 @@ void enable_surface_flip_reporting(strucstruct dc_plane_state *dc_create_plane_state (struct dc *dc) {struct dc_plane_state *plane_state =kvzalloc (sizeof (*plane_state), -GFP_KERNEL ); +GFP_ATOMIC );if (NULL == plane_state)return NULL ;
Greg Kroah-Hartman
maintainerPATCH 486/737 selftests: openvswitch: Fix escape chars in regexp.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Moreno <[email protected]>
commit 3fde60afe1f84746c1177861bd27b3ebb00cb8f5 upstream.
Character sequences starting with \ are interpreted by python as escaped Unicode characters. However, they have other meaning in regular expressions (e.g: "\d").
It seems Python >= 3.12 starts emitting a SyntaxWarning when these escaped sequences are not recognized as valid Unicode characters.
An example of these warnings:
tools/testing/selftests/net/openvswitch/ovs-dpctl.py:505:
SyntaxWarning: invalid escape sequence '\d'
Fix all the warnings by flagging literals as raw strings.
--- tools/testing/selftests/net/openvswitch/ovs-dpctl.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
tools/testing/selftests/net/openvswitch/ovs-dpctl.py +8 -8
@@ -489,7 +489,7 @@ class ovsactions(nla): actstr, reason = parse_extract_field( actstr, "drop(", - "([0-9]+)", + r"([0-9]+)", lambda x: int(x, 0), False, None,
@@ -502,9 +502,9 @@ class ovsactions(nla): actstr = actstr[len("drop"): ] return (totallen - len(actstr)) - elif parse_starts_block(actstr, "^(\d+)", False, True): + elif parse_starts_block(actstr, r"^(\d+)", False, True): actstr, output = parse_extract_field( - actstr, None, "(\d+)", lambda x: int(x), False, "0" + actstr, None, r"(\d+)", lambda x: int(x), False, "0" ) self["attrs"].append(["OVS_ACTION_ATTR_OUTPUT", output]) parsed = True
@@ -512,7 +512,7 @@ class ovsactions(nla): actstr, recircid = parse_extract_field( actstr, "recirc(", - "([0-9a-fA-Fx]+)", + r"([0-9a-fA-Fx]+)", lambda x: int(x, 0), False, 0,
@@ -588,17 +588,17 @@ class ovsactions(nla): actstr = actstr[3:] actstr, ip_block_min = parse_extract_field( - actstr, "=", "([0-9a-fA-F\.]+)", str, False + actstr, "=", r"([0-9a-fA-F\.]+)", str, False ) actstr, ip_block_max = parse_extract_field( - actstr, "-", "([0-9a-fA-F\.]+)", str, False + actstr, "-", r"([0-9a-fA-F\.]+)", str, False ) actstr, proto_min = parse_extract_field( - actstr, ":", "(\d+)", int, False + actstr, ":", r"(\d+)", int, False ) actstr, proto_max = parse_extract_field( - actstr, "-", "(\d+)", int, False + actstr, "-", r"(\d+)", int, False ) if t is not None:
Greg Kroah-Hartman
maintainerPATCH 487/737 crypto: af_alg - zero initialize memory allocated via sock_kmalloc
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shivani Agarwal <[email protected]>
commit 6f6e309328d53a10c0fe1f77dec2db73373179b6 upstream.
Several crypto user API contexts and requests allocated with sock_kmalloc() were left uninitialized, relying on callers to set fields explicitly. This resulted in the use of uninitialized data in certain error paths or when new fields are added in the future.
The ACVP patches also contain two user-space interface files:algif_kpp.c and algif_akcipher.c. These too rely on proper initialization of their context structures.
A particular issue has been observed with the newly added 'inflight' variable introduced in af_alg_ctx by commit:
67b164a871af ("crypto: af_alg - Disallow multiple in-flight AIO requests")
Because the context is not memset to zero after allocation, the inflight variable has contained garbage values. As a result, af_alg_alloc_areq() has incorrectly returned -EBUSY randomly when the garbage value was interpreted as true:
https://github.com/gregkh/linux/blame/master/crypto/af_alg.c#L1209
The check directly tests ctx->inflight without explicitly comparing against true/false. Since inflight is only ever set to true or false later, an uninitialized value has triggered -EBUSY failures. Zero-initializing memory allocated with sock_kmalloc() ensures inflight and other fields start in a known state, removing random issues caused by uninitialized data.
--- crypto/af_alg.c | 5 ++--- crypto/algif_hash.c | 3 +-- crypto/algif_rng.c | 3 +-- 3 files changed, 4 insertions(+), 7 deletions(-)
crypto/af_alg.c +2 -3
@@ -1211,15 +1211,14 @@ struct af_alg_async_req *af_alg_alloc_arif (unlikely (!areq))return ERR_PTR (-ENOMEM ); +memset (areq,0 , areqlen); + ctx->inflight = true; areq->areqlen = areqlen; areq->sk = sk; areq->first_rsgl.sgl.sgt.sgl = areq->first_rsgl.sgl.sgl; - areq->last_rsgl =NULL ;INIT_LIST_HEAD (&areq->rsgl_list); - areq->tsgl =NULL ; - areq->tsgl_entries =0 ;return areq; }
crypto/algif_hash.c +1 -2
@@ -416,9 +416,8 @@ static int hash_accept_parent_nokey(voidif (!ctx)return -ENOMEM ; - ctx->result =NULL ; +memset (ctx,0 , len); ctx->len = len; - ctx->more = false;crypto_init_wait (&ctx->wait); ask->private = ctx;
crypto/algif_rng.c +1 -2
@@ -248,9 +248,8 @@ static int rng_accept_parent(void *privaif (!ctx)return -ENOMEM ; +memset (ctx,0 , len); ctx->len = len; - ctx->addtl =NULL ; - ctx->addtl_len =0 ;/* * No seeding done at that point -- if multiple accepts are
Greg Kroah-Hartman
maintainerPATCH 488/737 crypto: caam - Add check for kcalloc() in test_len()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guangshuo Li <[email protected]>
commit 7cf6e0b69b0d90ab042163e5bbddda0dfcf8b6a7 upstream.
As kcalloc() may fail, check its return value to avoid a NULL pointer dereference when passing the buffer to rng->read(). On allocation failure, log the error and return since test_len() returns void.
--- drivers/crypto/caam/caamrng.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/crypto/caam/caamrng.c +3 -1
@@ -181,7 +181,9 @@ static inline void test_len(struct hwrng *rng, size_t len, bool wait)struct device *dev = ctx->ctrldev; buf =kcalloc (CAAM_RNG_MAX_FIFO_STORE_SIZE ,sizeof (u8),GFP_KERNEL ); - +if (!buf) { +return ; + }while (len >0 ) { read_len = rng->read (rng, buf, len, wait);
Signature · 1 line
2.52.0
Greg Kroah-Hartman
maintainerPATCH 489/737 amba: tegra-ahb: Fix device leak on SMMU enable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 500e1368e46928f4b2259612dcabb6999afae2a6 upstream.
Make sure to drop the reference taken to the AHB platform device when looking up its driver data while enabling the SMMU.
Note that holding a reference to a device does not prevent its driver data from going away.
--- drivers/amba/tegra-ahb.c | 1 + 1 file changed, 1 insertion(+)
drivers/amba/tegra-ahb.c +1 -0
@@ -144,6 +144,7 @@ int tegra_ahb_enable_smmu(struct device_if (!dev)return -EPROBE_DEFER ; ahb =dev_get_drvdata (dev); +put_device (dev); val =gizmo_readl (ahb,AHB_ARBITRATION_XBAR_CTRL ); val |=AHB_ARBITRATION_XBAR_CTRL_SMMU_INIT_DONE ;gizmo_writel (ahb, val,AHB_ARBITRATION_XBAR_CTRL );
Greg Kroah-Hartman
maintainerPATCH 490/737 tracing: Fix fixed array of synthetic event
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 47ef834209e5981f443240d8a8b45bf680df22aa upstream.
The commit 4d38328eb442d ("tracing: Fix synth event printk format for str fields") replaced "%.*s" with "%s" but missed removing the number size of the dynamic and static strings. The commit e1a453a57bc7 ("tracing: Do not add length to print format in synthetic events") fixed the dynamic part but did not fix the static part. That is, with the commands:
# echo 's:wake_lat char[] wakee; u64 delta;' >> /sys/kernel/tracing/dynamic_events # echo 'hist:keys=pid:ts=common_timestamp.usecs if !(common_flags & 0x18)' > /sys/kernel/tracing/events/sched/sched_waking/trigger # echo 'hist:keys=next_pid:delta=common_timestamp.usecs-$ts:onmatch(sched.sched_waking).trace(wake_lat,next_comm,$delta)' > /sys/kernel/tracing/events/sched/sched_switch/trigger
That caused the output of:
<idle>-0 [001] d..5. 193.428167: wake_lat: wakee=(efault)sshd-sessiondelta=155
sshd-session-879 [001] d..5. 193.811080: wake_lat: wakee=(efault)kworker/u34:5delta=58
<idle>-0 [002] d..5. 193.811198: wake_lat: wakee=(efault)bashdelta=91The commit e1a453a57bc7 fixed the part where the synthetic event had "char[] wakee". But if one were to replace that with a static size string:
# echo 's:wake_lat char[16] wakee; u64 delta;' >> /sys/kernel/tracing/dynamic_events
Where "wakee" is defined as "char[16]" and not "char[]" making it a static size, the code triggered the "(efaul)" again.
Remove the added STR_VAR_LEN_MAX size as the string is still going to be nul terminated.
--- kernel/trace/trace_events_synth.c | 1 - 1 file changed, 1 deletion(-)
kernel/trace/trace_events_synth.c +0 -1
@@ -382,7 +382,6 @@ static enum print_line_t print_synth_eve n_u64++; }else {trace_seq_printf (s, print_fmt, se->fields[i]->name, -STR_VAR_LEN_MAX , (char *)&entry->fields[n_u64].as_u64, i == se->n_fields -1 ?"" :" " ); n_u64 +=STR_VAR_LEN_MAX /sizeof (u64);
Greg Kroah-Hartman
maintainerPATCH 491/737 soc: qcom: ocmem: fix device leak on lookup
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit b5c16ea57b030b8e9428ec726e26219dfe05c3d9 upstream.
Make sure to drop the reference taken to the ocmem platform device when looking up its driver data.
Note that holding a reference to a device does not prevent its driver data from going away so there is no point in keeping the reference.
Also note that commit 0ff027027e05 ("soc: qcom: ocmem: Fix missing put_device() call in of_get_ocmem") fixed the leak in a lookup error path, but the reference is still leaking on success.
--- drivers/soc/qcom/ocmem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/soc/qcom/ocmem.c +1 -1
@@ -204,9 +204,9 @@ struct ocmem *of_get_ocmem(struct deviceof_node_put (devnode); ocmem =platform_get_drvdata (pdev); +put_device (&pdev->dev);if (!ocmem) {dev_err (dev,"Cannot get ocmem\n" ); -put_device (&pdev->dev);return ERR_PTR (-ENODEV ); }return ocmem;
Greg Kroah-Hartman
maintainerPATCH 492/737 soc: amlogic: canvas: fix device leak on lookup
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 32200f4828de9d7e6db379909898e718747f4e18 upstream.
Make sure to drop the reference taken to the canvas platform device when looking up its driver data.
Note that holding a reference to a device does not prevent its driver data from going away so there is no point in keeping the reference.
Also note that commit 28f851e6afa8 ("soc: amlogic: canvas: add missing put_device() call in meson_canvas_get()") fixed the leak in a lookup error path, but the reference is still leaking on success.
--- drivers/soc/amlogic/meson-canvas.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/soc/amlogic/meson-canvas.c +2 -3
@@ -73,10 +73,9 @@ struct meson_canvas *meson_canvas_get(st* current state, this driver probe cannot return -EPROBE_DEFER */ canvas =dev_get_drvdata (&canvas_pdev->dev); -if (!canvas) { -put_device (&canvas_pdev->dev); +put_device (&canvas_pdev->dev); +if (!canvas)return ERR_PTR (-EINVAL ); - }return canvas; }
Greg Kroah-Hartman
maintainerPATCH 493/737 rpmsg: glink: fix rpmsg device leak
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit a53e356df548f6b0e82529ef3cc6070f42622189 upstream.
While testing rpmsg-char interface it was noticed that duplicate sysfs entries are getting created and below warning is noticed.
Reason for this is that we are leaking rpmsg device pointer, setting it null without actually unregistering device.
Any further attempts to unregister fail because rpdev is NULL, resulting in a leak.
Fix this by unregistering rpmsg device before removing its reference from rpmsg channel.
sysfs: cannot create duplicate filename '/devices/platform/soc@0/3700000.remot eproc/remoteproc/remoteproc1/3700000.remoteproc:glink-edge/3700000.remoteproc:
glink-edge.adsp_apps.-1.-1'
[ 114.115347] CPU: 0 UID: 0 PID: 9 Comm: kworker/0:0 Not tainted 6.16.0-rc4 #7 PREEMPT [ 114.115355] Hardware name: Qualcomm Technologies, Inc. Robotics RB3gen2 (DT) [ 114.115358] Workqueue: events qcom_glink_work [ 114.115371] Call trace:8 [ 114.115374] show_stack+0x18/0x24 (C) [ 114.115382] dump_stack_lvl+0x60/0x80 [ 114.115388] dump_stack+0x18/0x24 [ 114.115393] sysfs_warn_dup+0x64/0x80 [ 114.115402] sysfs_create_dir_ns+0xf4/0x120 [ 114.115409] kobject_add_internal+0x98/0x260 [ 114.115416] kobject_add+0x9c/0x108 [ 114.115421] device_add+0xc4/0x7a0 [ 114.115429] rpmsg_register_device+0x5c/0xb0 [ 114.115434] qcom_glink_work+0x4bc/0x820 [ 114.115438] process_one_work+0x148/0x284 [ 114.115446] worker_thread+0x2c4/0x3e0 [ 114.115452] kthread+0x12c/0x204 [ 114.115457] ret_from_fork+0x10/0x20 [ 114.115464] kobject: kobject_add_internal failed for 3700000.remoteproc: glink-edge.adsp_apps.-1.-1 with -EEXIST, don't try to register things with the same name in the same directory. [ 114.250045] rpmsg 3700000.remoteproc:glink-edge.adsp_apps.-1.-1:
device_add failed: -17
--- drivers/rpmsg/qcom_glink_native.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/rpmsg/qcom_glink_native.c +8 -0
@@ -1317,6 +1317,7 @@ static void qcom_glink_destroy_ept(struc {struct glink_channel *channel =to_glink_channel (ept);struct qcom_glink *glink = channel->glink; +struct rpmsg_channel_info chinfo;unsigned long flags;spin_lock_irqsave (&channel->recv_lock, flags);
@@ -1324,6 +1325,13 @@ static void qcom_glink_destroy_ept(strucspin_unlock_irqrestore (&channel->recv_lock, flags);/* Decouple the potential rpdev from the channel */ +if (channel->rpdev) { +strscpy_pad (chinfo.name, channel->name,sizeof (chinfo.name)); + chinfo.src =RPMSG_ADDR_ANY ; + chinfo.dst =RPMSG_ADDR_ANY ; + +rpmsg_unregister_device (glink->dev, &chinfo); + } channel->rpdev =NULL ;qcom_glink_send_close_req (glink, channel);
Greg Kroah-Hartman
maintainerPATCH 494/737 platform/x86: intel: chtwc_int33fe: dont dereference swnode args
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bartosz Golaszewski <[email protected]>
commit 527250cd9092461f1beac3e4180a4481bffa01b5 upstream.
Members of struct software_node_ref_args should not be dereferenced directly but set using the provided macros. Commit d7cdbbc93c56 ("software node: allow referencing firmware nodes") changed the name of the software node member and caused a build failure. Remove all direct dereferences of the ref struct as a fix.
However, this driver also seems to abuse the software node interface by waiting for a node with an arbitrary name "intel-xhci-usb-sw" to appear in the system before setting up the reference for the I2C device, while the actual software node already exists in the intel-xhci-usb-role-switch module and should be used to set up a static reference. Add a FIXME for a future improvement.
--- drivers/platform/x86/intel/chtwc_int33fe.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-)
drivers/platform/x86/intel/chtwc_int33fe.c +20 -9
@@ -77,7 +77,7 @@ static const struct software_node max170* software node. */ static struct software_node_ref_args fusb302_mux_refs[] = { - { .node =NULL }, +SOFTWARE_NODE_REFERENCE (NULL ), };static const struct property_entry fusb302_properties[] = {
@@ -190,11 +190,6 @@ static void cht_int33fe_remove_nodes(str {software_node_unregister_node_group (node_group); -if (fusb302_mux_refs[0 ].node) { -fwnode_handle_put (software_node_fwnode (fusb302_mux_refs[0 ].node)); - fusb302_mux_refs[0 ].node =NULL ; - } -if (data->dp) { data->dp->secondary =NULL ;fwnode_handle_put (data->dp);
@@ -202,7 +197,15 @@ static void cht_int33fe_remove_nodes(str } } -static int cht_int33fe_add_nodes (struct cht_int33fe_data *data) +static void cht_int33fe_put_swnode (void *data) +{ +struct fwnode_handle *fwnode = data; + +fwnode_handle_put (fwnode); + fusb302_mux_refs[0 ] =SOFTWARE_NODE_REFERENCE (NULL ); +} + +static int cht_int33fe_add_nodes (struct device *dev,struct cht_int33fe_data *data) {const struct software_node *mux_ref_node;int ret;
@@ -212,17 +215,25 @@ static int cht_int33fe_add_nodes(struct* until the mux driver has created software node for the mux device. * It means we depend on the mux driver. This function will return * -EPROBE_DEFER until the mux device is registered. +* +* FIXME: the relevant software node exists in intel-xhci-usb-role-switch +* and - if exported - could be used to set up a static reference. */ mux_ref_node =software_node_find_by_name (NULL ,"intel-xhci-usb-sw" );if (!mux_ref_node)return -EPROBE_DEFER ; + ret =devm_add_action_or_reset (dev, cht_int33fe_put_swnode, +software_node_fwnode (mux_ref_node)); +if (ret) +return ret; +/* * Update node used in "usb-role-switch" property. Note that we * rely on software_node_register_node_group() to use the original * instance of properties instead of copying them. */ - fusb302_mux_refs[0 ].node = mux_ref_node; + fusb302_mux_refs[0 ] =SOFTWARE_NODE_REFERENCE (mux_ref_node); ret =software_node_register_node_group (node_group);if (ret)
@@ -345,7 +356,7 @@ static int cht_int33fe_typec_probe(strucreturn fusb302_irq; } - ret =cht_int33fe_add_nodes (data); + ret =cht_int33fe_add_nodes (dev, data);if (ret)return ret;
Greg Kroah-Hartman
maintainerPATCH 495/737 i2c: amd-mp2: fix reference leak in MP2 PCI device
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit a6ee6aac66fb394b7f6e6187c73bdcd873f2d139 upstream.
In i2c_amd_probe(), amd_mp2_find_device() utilizes driver_find_next_device() which internally calls driver_find_device() to locate the matching device. driver_find_device() increments the reference count of the found device by calling get_device(), but amd_mp2_find_device() fails to call put_device() to decrement the reference count before returning. This results in a reference count leak of the PCI device each time i2c_amd_probe() is executed, which may prevent the device from being properly released and cause a memory leak.
Found by code review.
--- drivers/i2c/busses/i2c-amd-mp2-pci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-amd-mp2-pci.c +4 -1
@@ -461,13 +461,16 @@ struct amd_mp2_dev *amd_mp2_find_device( {struct device *dev;struct pci_dev *pci_dev; +struct amd_mp2_dev *mp2_dev; dev =driver_find_next_device (&amd_mp2_pci_driver.driver,NULL );if (!dev)return NULL ; pci_dev =to_pci_dev (dev); -return (struct amd_mp2_dev *)pci_get_drvdata (pci_dev); + mp2_dev = (struct amd_mp2_dev *)pci_get_drvdata (pci_dev); +put_device (dev); +return mp2_dev; }EXPORT_SYMBOL_GPL (amd_mp2_find_device);
Greg Kroah-Hartman
maintainerPATCH 496/737 hwmon: (max16065) Use local variable to avoid TOCTOU
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gui-Dong Han <[email protected]>
commit b8d5acdcf525f44e521ca4ef51dce4dac403dab4 upstream.
In max16065_current_show, data->curr_sense is read twice: once for the error check and again for the calculation. Since i2c_smbus_read_byte_data returns negative error codes on failure, if the data changes to an error code between the check and the use, ADC_TO_CURR results in an incorrect calculation.
Read data->curr_sense into a local variable to ensure consistency. Note that data->curr_gain is constant and safe to access directly.
This aligns max16065_current_show with max16065_input_show, which already uses a local variable for the same reason.
--- drivers/hwmon/max16065.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/hwmon/max16065.c +4 -3
@@ -216,12 +216,13 @@ static ssize_t max16065_current_show(str struct device_attribute *da, char *buf) { struct max16065_data *data = max16065_update_device(dev); +int curr_sense = data->curr_sense; -if (unlikely (data->curr_sense <0 )) -return data->curr_sense; +if (unlikely (curr_sense <0 )) +return curr_sense;return sysfs_emit (buf,"%d\n" , -ADC_TO_CURR (data->curr_sense, data->curr_gain)); +ADC_TO_CURR (curr_sense, data->curr_gain)); } static ssize_t max16065_limit_store(struct device *dev,
Greg Kroah-Hartman
maintainerPATCH 497/737 hwmon: (w83791d) Convert macros to functions to avoid TOCTOU
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gui-Dong Han <[email protected]>
commit 670d7ef945d3a84683594429aea6ab2cdfa5ceb4 upstream.
The macro FAN_FROM_REG evaluates its arguments multiple times. When used in lockless contexts involving shared driver data, this leads to Time-of-Check to Time-of-Use (TOCTOU) race conditions, potentially causing divide-by-zero errors.
Convert the macro to a static function. This guarantees that arguments are evaluated only once (pass-by-value), preventing the race conditions.
Additionally, in store_fan_div, move the calculation of the minimum limit inside the update lock. This ensures that the read-modify-write sequence operates on consistent data.
Adhere to the principle of minimal changes by only converting macros that evaluate arguments multiple times and are used in lockless contexts.
--- drivers/hwmon/w83791d.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
drivers/hwmon/w83791d.c +11 -6
@@ -218,9 +218,14 @@ static u8 fan_to_reg(long rpm, int div)return clamp_val ((1350000 + rpm * div /2 ) / (rpm * div),1 ,254 ); } -#define FAN_FROM_REG (val, div) ((val) == 0 ? -1 : \ - ((val) == 255 ? 0 : \ - 1350000 / ((val) * (div)))) +static int fan_from_reg (int val,int div) +{ +if (val ==0 ) +return -1 ; +if (val ==255 ) +return 0 ; +return 1350000 / (val * div); +}/* for temp1 which is 8-bit resolution, LSB = 1 degree Celsius */ #define TEMP1_FROM_REG (val) ((val) * 1000)
@@ -521,7 +526,7 @@ static ssize_t show_##reg(struct devicestruct w83791d_data *data =w83791d_update_device (dev); \int nr = sensor_attr->index; \return sprintf (buf,"%d\n" , \ -FAN_FROM_REG (data->reg[nr],DIV_FROM_REG (data->fan_div[nr]))); \ +fan_from_reg (data->reg[nr],DIV_FROM_REG (data->fan_div[nr]))); \ }show_fan_reg (fan);
@@ -585,10 +590,10 @@ static ssize_t store_fan_div(struct deviif (err)return err; +mutex_lock (&data->update_lock);/* Save fan_min */ - min =FAN_FROM_REG (data->fan_min[nr],DIV_FROM_REG (data->fan_div[nr])); + min =fan_from_reg (data->fan_min[nr],DIV_FROM_REG (data->fan_div[nr])); -mutex_lock (&data->update_lock); data->fan_div[nr] =div_to_reg (nr, val);switch (nr) {
Greg Kroah-Hartman
maintainerPATCH 498/737 hwmon: (w83l786ng) Convert macros to functions to avoid TOCTOU
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gui-Dong Han <[email protected]>
commit 07272e883fc61574b8367d44de48917f622cdd83 upstream.
The macros FAN_FROM_REG and TEMP_FROM_REG evaluate their arguments multiple times. When used in lockless contexts involving shared driver data, this causes Time-of-Check to Time-of-Use (TOCTOU) race conditions.
Convert the macros to static functions. This guarantees that arguments are evaluated only once (pass-by-value), preventing the race conditions.
Adhere to the principle of minimal changes by only converting macros that evaluate arguments multiple times and are used in lockless contexts.
--- drivers/hwmon/w83l786ng.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
drivers/hwmon/w83l786ng.c +18 -8
@@ -76,15 +76,25 @@ FAN_TO_REG(long rpm, int div)return clamp_val ((1350000 + rpm * div /2 ) / (rpm * div),1 ,254 ); } -#define FAN_FROM_REG (val, div) ((val) == 0 ? -1 : \ - ((val) == 255 ? 0 : \ - 1350000 / ((val) * (div)))) +static int fan_from_reg (int val,int div) +{ +if (val ==0 ) +return -1 ; +if (val ==255 ) +return 0 ; +return 1350000 / (val * div); +}/* for temp */ #define TEMP_TO_REG (val) (clamp_val(((val) < 0 ? (val) + 0x100 * 1000 \ : (val)) / 1000, 0, 0xff)) -#define TEMP_FROM_REG (val) (((val) & 0x80 ? \ - (val) - 0x100 : (val)) * 1000) + +static int temp_from_reg (int val) +{ +if (val &0x80 ) +return (val -0x100 ) *1000 ; +return val *1000 ; +}/* * The analog voltage inputs have 8mV LSB. Since the sysfs output is
@@ -280,7 +290,7 @@ static ssize_t show_##reg(struct deviceint nr =to_sensor_dev_attr (attr)->index; \struct w83l786ng_data *data =w83l786ng_update_device (dev); \return sprintf (buf,"%d\n" , \ -FAN_FROM_REG (data->reg[nr],DIV_FROM_REG (data->fan_div[nr]))); \ +fan_from_reg (data->reg[nr],DIV_FROM_REG (data->fan_div[nr]))); \ }show_fan_reg (fan);
@@ -347,7 +357,7 @@ store_fan_div(struct device *dev, struct/* Save fan_min */ mutex_lock (&data->update_lock); - min =FAN_FROM_REG (data->fan_min[nr],DIV_FROM_REG (data->fan_div[nr])); + min =fan_from_reg (data->fan_min[nr],DIV_FROM_REG (data->fan_div[nr])); data->fan_div[nr] =DIV_TO_REG (val);
@@ -409,7 +419,7 @@ show_temp(struct device *dev, struct devint nr = sensor_attr->nr;int index = sensor_attr->index;struct w83l786ng_data *data =w83l786ng_update_device (dev); -return sprintf (buf,"%d\n" ,TEMP_FROM_REG (data->temp[nr][index])); +return sprintf (buf,"%d\n" ,temp_from_reg (data->temp[nr][index])); } static ssize_t
Greg Kroah-Hartman
maintainerPATCH 499/737 ARM: dts: microchip: sama5d2: fix spi flexcom fifo size to 32
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Ferre <[email protected]>
commit 7d5864dc5d5ea6a35983dd05295fb17f2f2f44ce upstream.
Unlike standalone spi peripherals, on sama5d2, the flexcom spi have fifo size of 32 data. Fix flexcom/spi nodes where this property is wrong.
--- arch/arm/boot/dts/microchip/sama5d2.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm/boot/dts/microchip/sama5d2.dtsi +5 -5
@@ -568,7 +568,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(12))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
@@ -639,7 +639,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(14))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
@@ -851,7 +851,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(16))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
@@ -922,7 +922,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(18))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
@@ -994,7 +994,7 @@ AT91_XDMAC_DT_PER_IF(1) | AT91_XDMAC_DT_PERID(20))>; dma-names = "tx", "rx"; - atmel,fifo-size = <16>; + atmel,fifo-size = <32>; status = "disabled"; };
Greg Kroah-Hartman
maintainerPATCH 500/737 iommu/mediatek: fix use-after-free on probe deferral
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit de83d4617f9fe059623e97acf7e1e10d209625b5 upstream.
The driver is dropping the references taken to the larb devices during probe after successful lookup as well as on errors. This can potentially lead to a use-after-free in case a larb device has not yet been bound to its driver so that the iommu driver probe defers.
Fix this by keeping the references as expected while the iommu driver is bound.
--- drivers/iommu/mtk_iommu.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
drivers/iommu/mtk_iommu.c +18 -7
@@ -1196,16 +1196,19 @@ static int mtk_iommu_mm_dts_parse(struct }component_match_add (dev, match, component_compare_dev, &plarbdev->dev); -platform_device_put (plarbdev); } -if (!frst_avail_smicomm_node) -return -EINVAL ; +if (!frst_avail_smicomm_node) { + ret = -EINVAL ; + goto err_larbdev_put; + } pcommdev =of_find_device_by_node (frst_avail_smicomm_node);of_node_put (frst_avail_smicomm_node); -if (!pcommdev) -return -ENODEV ; +if (!pcommdev) { + ret = -ENODEV ; + goto err_larbdev_put; + } data->smicomm_dev = &pcommdev->dev; link = device_link_add(data->smicomm_dev, dev,
@@ -1213,7 +1216,8 @@ static int mtk_iommu_mm_dts_parse(structplatform_device_put (pcommdev);if (!link) {dev_err (dev,"Unable to link %s.\n" ,dev_name (data->smicomm_dev)); -return -EINVAL ; + ret = -EINVAL ; + goto err_larbdev_put; }return 0 ;
@@ -1385,8 +1389,12 @@ out_sysfs_remove:iommu_device_sysfs_remove (&data->iommu); out_list_del:list_del (&data->list); -if (MTK_IOMMU_IS_TYPE (data->plat_data,MTK_IOMMU_TYPE_MM )) +if (MTK_IOMMU_IS_TYPE (data->plat_data,MTK_IOMMU_TYPE_MM )) {device_link_remove (data->smicomm_dev, dev); + +for (i =0 ; i <MTK_LARB_NR_MAX ; i++) +put_device (data->larb_imu[i].dev); + } out_runtime_disable:pm_runtime_disable (dev);return ret;
@@ -1406,6 +1414,9 @@ static void mtk_iommu_remove(struct platif (MTK_IOMMU_IS_TYPE (data->plat_data,MTK_IOMMU_TYPE_MM )) {device_link_remove (data->smicomm_dev, &pdev->dev);component_master_del (&pdev->dev, &mtk_iommu_com_ops); + +for (i =0 ; i <MTK_LARB_NR_MAX ; i++) +put_device (data->larb_imu[i].dev); }pm_runtime_disable (&pdev->dev);for (i =0 ; i < data->plat_data->banks_num; i++) {
Greg Kroah-Hartman
maintainerPATCH 501/737 wifi: rtw88: limit indirect IO under powered off for RTL8822CS
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ping-Ke Shih <[email protected]>
[ Upstream commit f3ccdfda345ca9a624ea425840a926b8338c1e25 ]
The indirect IO is necessary for RTL8822CS, but not necessary for other chips. Otherwiese, it throws errors and becomes unusable.
rtw88_8723cs mmc1:0001:1: WOW Firmware version 11.0.0, H2C version 0 rtw88_8723cs mmc1:0001:1: Firmware version 11.0.0, H2C version 0 rtw88_8723cs mmc1:0001:1: sdio read32 failed (0xf0): -110 rtw88_8723cs mmc1:0001:1: sdio write8 failed (0x1c): -110 rtw88_8723cs mmc1:0001:1: sdio read32 failed (0xf0): -110
By vendor driver, only RTL8822CS and RTL8822ES need indirect IO, but RTL8822ES isn't supported yet. Therefore, limit it to RTL8822CS only.
--- drivers/net/wireless/realtek/rtw88/sdio.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw88/sdio.c +3 -1
@@ -143,8 +143,10 @@ static u32 rtw_sdio_to_io_address(struct rtw_dev *rtwdev, u32 addr,static bool rtw_sdio_use_direct_io (struct rtw_dev *rtwdev,u32 addr) { +bool might_indirect_under_power_off = rtwdev->chip->id ==RTW_CHIP_TYPE_8822C ; +if (!test_bit (RTW_FLAG_POWERON , rtwdev->flags) && - !rtw_sdio_is_bus_addr (addr)) + !rtw_sdio_is_bus_addr (addr) && might_indirect_under_power_off)return false; return !rtw_sdio_is_sdio30_supported(rtwdev) ||
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 502/737 wifi: cfg80211: sme: store capped length in __cfg80211_connect_result()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 2b77b9551d1184cb5af8271ff350e6e2c1b3db0d ]
The QGenie AI code review tool says we should store the capped length to wdev->u.client.ssid_len. The AI is correct.
--- net/wireless/sme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/wireless/sme.c +1 -1
@@ -925,7 +925,7 @@ void __cfg80211_connect_result(struct net_device *dev, ssid_len =min (ssid->datalen,IEEE80211_MAX_SSID_LEN );memcpy (wdev->u.client.ssid, ssid->data, ssid_len); - wdev->u.client.ssid_len = ssid->datalen; + wdev->u.client.ssid_len = ssid_len;break ; }rcu_read_unlock ();
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 503/737 wifi: mac80211: do not use old MBSSID elements
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aloka Dixit <[email protected]>
[ Upstream commit a519be2f5d958c5804f2cfd68f1f384291271fab ]
When userspace brings down and deletes a non-transmitted profile, it is expected to send a new updated Beacon template for the transmitted profile of that multiple BSSID (MBSSID) group which does not include the removed profile in MBSSID element. This update comes via NL80211_CMD_SET_BEACON.
Such updates work well as long as the group continues to have at least one non-transmitted profile as NL80211_ATTR_MBSSID_ELEMS is included in the new Beacon template.
But when the last non-trasmitted profile is removed, it still gets included in Beacon templates sent to driver. This happens because when no MBSSID elements are sent by the userspace, ieee80211_assign_beacon() ends up using the element stored from earlier Beacon template.
Do not copy old MBSSID elements, instead userspace should always include these when applicable.
--- net/mac80211/cfg.c | 10 ---------- 1 file changed, 10 deletions(-)
net/mac80211/cfg.c +0 -10
@@ -1147,7 +1147,6 @@ ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, size =sizeof (*new) + new_head_len + new_tail_len; -/* new or old multiple BSSID elements? */ if (params->mbssid_ies) { mbssid = params->mbssid_ies; size +=struct_size (new->mbssid_ies, elem, mbssid->cnt);
@@ -1157,15 +1156,6 @@ ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, } size +=ieee80211_get_mbssid_beacon_len (mbssid, rnr, mbssid->cnt); - }else if (old && old->mbssid_ies) { - mbssid = old->mbssid_ies; - size +=struct_size (new->mbssid_ies, elem, mbssid->cnt); -if (old && old->rnr_ies) { - rnr = old->rnr_ies; - size +=struct_size (new->rnr_ies, elem, rnr->cnt); - } - size +=ieee80211_get_mbssid_beacon_len (mbssid, rnr, - mbssid->cnt); } new =kzalloc (size,GFP_KERNEL );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 504/737 i40e: fix scheduling in set_rx_mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Przemyslaw Korba <[email protected]>
[ Upstream commit be43abc5514167cc129a8d8e9727b89b8e1d9719 ]
Add service task schedule to set_rx_mode.
In some cases there are error messages printed out in PTP application (ptp4l):
ptp4l[13848.762]: port 1 (ens2f3np3): received SYNC without timestamp ptp4l[13848.825]: port 1 (ens2f3np3): received SYNC without timestamp ptp4l[13848.887]: port 1 (ens2f3np3): received SYNC without timestamp
This happens when service task would not run immediately after set_rx_mode, and we need it for setup tasks. This service task checks, if PTP RX packets are hung in firmware, and propagate correct settings such as multicast address for IEEE 1588 Precision Time Protocol. RX timestamping depends on some of these filters set. Bug happens only with high PTP packets frequency incoming, and not every run since sometimes service task is being ran from a different place immediately after starting ptp4l.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -0
@@ -2260,6 +2260,7 @@ static void i40e_set_rx_mode(struct net_device *netdev) vsi->flags |=I40E_VSI_FLAG_FILTER_CHANGED ;set_bit (__I40E_MACVLAN_SYNC_PENDING, vsi->back->state); } +i40e_service_event_schedule (vsi->back); }/**
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 505/737 iavf: fix off-by-one issues in iavf_config_rss_reg()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kohei Enju <[email protected]>
[ Upstream commit 6daa2893f323981c7894c68440823326e93a7d61 ]
There are off-by-one bugs when configuring RSS hash key and lookup table, causing out-of-bounds reads to memory [1] and out-of-bounds writes to device registers.
Before commit 43a3d9ba34c9 ("i40evf: Allow PF driver to configure RSS"), the loop upper bounds were:
i <= I40E_VFQF_{HKEY,HLUT}_MAX_INDEXwhich is safe since the value is the last valid index.
That commit changed the bounds to:
i <= adapter->rss_{key,lut}_size / 4where rss_{key,lut}_size / 4 is the number of dwords, so the last valid index is (rss_{key,lut}_size / 4) - 1. Therefore, using <= accesses one element past the end.
Fix the issues by using < instead of <=, ensuring we do not exceed the bounds.
[1] KASAN splat about rss_key_size off-by-one
BUG: KASAN: slab-out-of-bounds in iavf_config_rss+0x619/0x800
Read of size 4 at addr ffff888102c50134 by task kworker/u8:6/63
CPU: 0 UID: 0 PID: 63 Comm: kworker/u8:6 Not tainted 6.18.0-rc2-enjuk-tnguy-00378-g3005f5b77652-dirty #156 PREEMPT(voluntary)
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
Workqueue: iavf iavf_watchdog_task
Call Trace:
<TASK>
dump_stack_lvl+0x6f/0xb0
print_report+0x170/0x4f3
kasan_report+0xe1/0x1a0
iavf_config_rss+0x619/0x800
iavf_watchdog_task+0x2be7/0x3230
process_one_work+0x7fd/0x1420
worker_thread+0x4d1/0xd40
kthread+0x344/0x660
ret_from_fork+0x249/0x320
ret_from_fork_asm+0x1a/0x30
</TASK>
Allocated by task 63:
kasan_save_stack+0x30/0x50
kasan_save_track+0x14/0x30
__kasan_kmalloc+0x7f/0x90
__kmalloc_noprof+0x246/0x6f0
iavf_watchdog_task+0x28fc/0x3230
process_one_work+0x7fd/0x1420
worker_thread+0x4d1/0xd40
kthread+0x344/0x660
ret_from_fork+0x249/0x320
ret_from_fork_asm+0x1a/0x30
The buggy address belongs to the object at ffff888102c50100
which belongs to the cache kmalloc-64 of size 64
The buggy address is located 0 bytes to the right of
allocated 52-byte region [ffff888102c50100, ffff888102c50134)
The buggy address belongs to the physical page:
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x102c50
flags: 0x200000000000000(node=0|zone=2)
page_type: f5(slab)
raw: 0200000000000000 ffff8881000418c0 dead000000000122 0000000000000000
raw: 0000000000000000 0000000080200020 00000000f5000000 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff888102c50000: 00 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc
ffff888102c50080: 00 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc
>ffff888102c50100: 00 00 00 00 00 00 04 fc fc fc fc fc fc fc fc fc
^
ffff888102c50180: 00 00 00 00 00 00 00 00 fc fc fc fc fc fc fc fc
ffff888102c50200: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc--- drivers/net/ethernet/intel/iavf/iavf_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +2 -2
@@ -1750,11 +1750,11 @@ static int iavf_config_rss_reg(struct iavf_adapter *adapter)u16 i; dw = (u32 *)adapter->rss_key; -for (i =0 ; i <= adapter->rss_key_size /4 ; i++) +for (i =0 ; i < adapter->rss_key_size /4 ; i++)wr32 (hw,IAVF_VFQF_HKEY (i), dw[i]); dw = (u32 *)adapter->rss_lut; -for (i =0 ; i <= adapter->rss_lut_size /4 ; i++) +for (i =0 ; i < adapter->rss_lut_size /4 ; i++)wr32 (hw,IAVF_VFQF_HLUT (i), dw[i]);iavf_flush (hw);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 506/737 crypto: seqiv - Do not use req->iv after crypto_aead_encrypt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit 50fdb78b7c0bcc550910ef69c0984e751cac72fa ]
As soon as crypto_aead_encrypt is called, the underlying request may be freed by an asynchronous completion. Thus dereferencing req->iv after it returns is invalid.
Instead of checking req->iv against info, create a new variable unaligned_info and use it for that purpose instead.
--- crypto/seqiv.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
crypto/seqiv.c +5 -3
@@ -50,6 +50,7 @@ static int seqiv_aead_encrypt(struct aead_request *req)struct aead_geniv_ctx *ctx =crypto_aead_ctx (geniv);struct aead_request *subreq =aead_request_ctx (req);crypto_completion_t compl; +bool unaligned_info;void *data;u8 *info;unsigned int ivsize =8 ;
@@ -79,8 +80,9 @@ static int seqiv_aead_encrypt(struct aead_request *req)return err; } -if (unlikely (!IS_ALIGNED ((unsigned long )info, -crypto_aead_alignmask (geniv) +1 ))) { + unaligned_info = !IS_ALIGNED ((unsigned long )info, +crypto_aead_alignmask (geniv) +1 ); +if (unlikely (unaligned_info)) { info =kmemdup (req->iv, ivsize, req->base.flags &CRYPTO_TFM_REQ_MAY_SLEEP ?GFP_KERNEL :GFP_ATOMIC );
@@ -100,7 +102,7 @@ static int seqiv_aead_encrypt(struct aead_request *req)scatterwalk_map_and_copy (info, req->dst, req->assoclen, ivsize,1 ); err =crypto_aead_encrypt (subreq); -if (unlikely (info != req->iv)) +if (unlikely (unaligned_info))seqiv_aead_encrypt_complete2 (req, err);return err; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 507/737 Bluetooth: btusb: revert use of devm_kzalloc in btusb
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raphael Pinsonneault-Thibeault <[email protected]>
[ Upstream commit 252714f1e8bdd542025b16321c790458014d6880 ]
This reverts commit 98921dbd00c4e ("Bluetooth: Use devm_kzalloc in btusb.c file").
In btusb_probe(), we use devm_kzalloc() to allocate the btusb data. This ties the lifetime of all the btusb data to the binding of a driver to one interface, INTF. In a driver that binds to other interfaces, ISOC and DIAG, this is an accident waiting to happen.
The issue is revealed in btusb_disconnect(), where calling usb_driver_release_interface(&btusb_driver, data->intf) will have devm free the data that is also being used by the other interfaces of the driver that may not be released yet.
To fix this, revert the use of devm and go back to freeing memory explicitly.
--- drivers/bluetooth/btusb.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/bluetooth/btusb.c +9 -3
@@ -4342,7 +4342,7 @@ static int btusb_probe(struct usb_interface *intf,return -ENODEV ; } - data =devm_kzalloc (&intf->dev,sizeof (*data),GFP_KERNEL ); + data =kzalloc (sizeof (*data),GFP_KERNEL );if (!data)return -ENOMEM ;
@@ -4365,8 +4365,10 @@ static int btusb_probe(struct usb_interface *intf, } } -if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep) +if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep) { +kfree (data);return -ENODEV ; + }if (id->driver_info &BTUSB_AMP ) { data->cmdreq_type =USB_TYPE_CLASS |0x01 ;
@@ -4421,8 +4423,10 @@ static int btusb_probe(struct usb_interface *intf, data->recv_acl = hci_recv_frame; hdev =hci_alloc_dev_priv (priv_size); -if (!hdev) +if (!hdev) { +kfree (data);return -ENOMEM ; + } hdev->bus =HCI_USB ;hci_set_drvdata (hdev, data);
@@ -4690,6 +4694,7 @@ static int btusb_probe(struct usb_interface *intf,if (data->reset_gpio)gpiod_put (data->reset_gpio);hci_free_dev (hdev); +kfree (data);return err; }
@@ -4738,6 +4743,7 @@ static void btusb_disconnect(struct usb_interface *intf) }hci_free_dev (hdev); +kfree (data); }#ifdef CONFIG_PM
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 508/737 net: mdio: aspeed: add dummy read to avoid read-after-write issue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacky Chou <[email protected]>
[ Upstream commit d1a1a4bade4b20c0858d0b2f81d2611de055f675 ]
The Aspeed MDIO controller may return incorrect data when a read operation follows immediately after a write. Due to a controller bug, the subsequent read can latch stale data, causing the polling logic to terminate earlier than expected.
To work around this hardware issue, insert a dummy read after each write operation. This ensures that the next actual read returns the correct data and prevents premature polling exit.
This workaround has been verified to stabilize MDIO transactions on affected Aspeed platforms.
--- drivers/net/mdio/mdio-aspeed.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/mdio/mdio-aspeed.c +7 -0
@@ -63,6 +63,13 @@ static int aspeed_mdio_op(struct mii_bus *bus, u8 st, u8 op, u8 phyad, u8 regad,iowrite32 (ctrl, ctx->base +ASPEED_MDIO_CTRL ); +/* Workaround for read-after-write issue. +* The controller may return stale data if a read follows immediately +* after a write. A dummy read forces the hardware to update its +* internal state, ensuring that the next real read returns correct data. +*/ +ioread32 (ctx->base +ASPEED_MDIO_CTRL ); + return readl_poll_timeout(ctx->base + ASPEED_MDIO_CTRL, ctrl, !(ctrl & ASPEED_MDIO_CTRL_FIRE), ASPEED_MDIO_INTERVAL_US,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 509/737 net: openvswitch: Avoid needlessly taking the RTNL on vport destroy
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit 5498227676303e3ffa9a3a46214af96bc3e81314 ]
The openvswitch teardown code will immediately call ovs_netdev_detach_dev() in response to a NETDEV_UNREGISTER notification. It will then start the dp_notify_work workqueue, which will later end up calling the vport destroy() callback. This callback takes the RTNL to do another ovs_netdev_detach_port(), which in this case is unnecessary. This causes extra pressure on the RTNL, in some cases leading to "unregister_netdevice: waiting for XX to become free" warnings on teardown.
We can straight-forwardly avoid the extra RTNL lock acquisition by checking the device flags before taking the lock, and skip the locking altogether if the IFF_OVS_DATAPATH flag has already been unset.
--- net/openvswitch/vport-netdev.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
net/openvswitch/vport-netdev.c +13 -4
@@ -153,10 +153,19 @@ void ovs_netdev_detach_dev(struct vport *vport)static void netdev_destroy (struct vport *vport) { -rtnl_lock (); -if (netif_is_ovs_port (vport->dev)) -ovs_netdev_detach_dev (vport); -rtnl_unlock (); +/* When called from ovs_db_notify_wq() after a dp_device_event(), the +* port has already been detached, so we can avoid taking the RTNL by +* checking this first. +*/ +if (netif_is_ovs_port (vport->dev)) { +rtnl_lock (); +/* Check again while holding the lock to ensure we don't race +* with the netdev notifier and detach twice. +*/ +if (netif_is_ovs_port (vport->dev)) +ovs_netdev_detach_dev (vport); +rtnl_unlock (); + }call_rcu (&vport->rcu, vport_netdev_free); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 510/737 ip6_gre: make ip6gre_header() robust
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit db5b4e39c4e63700c68a7e65fc4e1f1375273476 ]
Over the years, syzbot found many ways to crash the kernel in ip6gre_header() [1].
This involves team or bonding drivers ability to dynamically change their dev->needed_headroom and/or dev->hard_header_len
In this particular crash mld_newpack() allocated an skb with a too small reserve/headroom, and by the time mld_sendpack() was called, syzbot managed to attach an ip6gre device.
[1]
skbuff: skb_under_panic: text:ffffffff8a1d69a8 len:136 put:40 head:ffff888059bc7000 data:ffff888059bc6fe8 tail:0x70 end:0x6c0 dev:team0
------------[ cut here ]------------ kernel BUG at net/core/skbuff.c:213 ! <TASK> skb_under_panic net/core/skbuff.c:223 [inline] skb_push+0xc3/0xe0 net/core/skbuff.c:2641 ip6gre_header+0xc8/0x790 net/ipv6/ip6_gre.c:1371 dev_hard_header include/linux/netdevice.h:3436 [inline] neigh_connected_output+0x286/0x460 net/core/neighbour.c:1618 neigh_output include/net/neighbour.h:556 [inline] ip6_finish_output2+0xfb3/0x1480 net/ipv6/ip6_output.c:136 __ip6_finish_output net/ipv6/ip6_output.c:-1 [inline] ip6_finish_output+0x234/0x7d0 net/ipv6/ip6_output.c:220 NF_HOOK_COND include/linux/netfilter.h:307 [inline] ip6_output+0x340/0x550 net/ipv6/ip6_output.c:247 NF_HOOK+0x9e/0x380 include/linux/netfilter.h:318 mld_sendpack+0x8d4/0xe60 net/ipv6/mcast.c:1855 mld_send_cr net/ipv6/mcast.c:2154 [inline] mld_ifc_work+0x83e/0xd60 net/ipv6/mcast.c:2693
--- net/ipv6/ip6_gre.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
net/ipv6/ip6_gre.c +8 -1
@@ -1382,9 +1382,16 @@ static int ip6gre_header(struct sk_buff *skb, struct net_device *dev, {struct ip6_tnl *t =netdev_priv (dev);struct ipv6hdr *ipv6h; +int needed;__be16 *p; - ipv6h =skb_push (skb, t->hlen +sizeof (*ipv6h)); + needed = t->hlen +sizeof (*ipv6h); +if (skb_headroom (skb) < needed && +pskb_expand_head (skb,HH_DATA_ALIGN (needed -skb_headroom (skb)), +0 ,GFP_ATOMIC )) +return -needed; + + ipv6h =skb_push (skb, needed);ip6_flow_hdr (ipv6h,0 ,ip6_make_flowlabel (dev_net (dev), skb, t->fl.u.ip6.flowlabel, true, &t->fl.u.ip6));
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 511/737 platform/x86: msi-laptop: add missing sysfs_remove_group()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 1461209cf813b6ee6d40f29b96b544587df6d2b1 ]
A sysfs group is created in msi_init() when old_ec_model is enabled, but never removed. Remove the msipf_old_attribute_group in that case.
--- drivers/platform/x86/msi-laptop.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/platform/x86/msi-laptop.c +3 -0
@@ -1130,6 +1130,9 @@ static void __exit msi_cleanup(void)sysfs_remove_group (&msipf_device->dev.kobj, &msipf_attribute_group);if (!quirks->old_ec_model && threeg_exists)device_remove_file (&msipf_device->dev, &dev_attr_threeg); +if (quirks->old_ec_model) +sysfs_remove_group (&msipf_device->dev.kobj, + &msipf_old_attribute_group);platform_device_unregister (msipf_device);platform_driver_unregister (&msipf_driver);backlight_device_unregister (msibl_device);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 512/737 platform/x86: ibm_rtl: fix EBDA signature search pointer arithmetic
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit 15dd100349b8526cbdf2de0ce3e72e700eb6c208 ]
The ibm_rtl_init() function searches for the signature but has a pointer arithmetic error. The loop counter suggests searching at 4-byte intervals but the implementation only advances by 1 byte per iteration.
Fix by properly advancing the pointer by sizeof(unsigned int) bytes each iteration.
--- drivers/platform/x86/ibm_rtl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/ibm_rtl.c +1 -1
@@ -272,7 +272,7 @@ static int __init ibm_rtl_init(void) {/* search for the _RTL_ signature at the start of the table */ for (i =0 ; i < ebda_size/sizeof (unsigned int ); i++) {struct ibm_rtl_table __iomem * tmp; - tmp = (struct ibm_rtl_table __iomem *) (ebda_map+i); + tmp = (struct ibm_rtl_table __iomem *) (ebda_map + i*sizeof (unsigned int ));if ((readq (&tmp->signature) &RTL_MASK ) ==RTL_SIGNATURE ) {phys_addr_t addr;unsigned int plen;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 513/737 team: fix check for port enabled in team_queue_override_port_prio_changed()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Pirko <[email protected]>
[ Upstream commit 932ac51d9953eaf77a1252f79b656d4ca86163c6 ]
There has been a syzkaller bug reported recently with the following trace:
list_del corruption, ffff888058bea080->prev is LIST_POISON2 (dead000000000122)
------------[ cut here ]------------ kernel BUG at lib/list_debug.c:59! Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 3 UID: 0 PID: 21246 Comm: syz.0.2928 Not tainted syzkaller #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 RIP: 0010:__list_del_entry_valid_or_report+0x13e/0x200 lib/list_debug.c:59 Code: 48 c7 c7 e0 71 f0 8b e8 30 08 ef fc 90 0f 0b 48 89 ef e8 a5 02 55 fd 48 89 ea 48 89 de 48 c7 c7 40 72 f0 8b e8 13 08 ef fc 90 <0f> 0b 48 89 ef e8 88 02 55 fd 48 89 ea 48 b8 00 00 00 00 00 fc ff RSP: 0018:ffffc9000d49f370 EFLAGS: 00010286 RAX: 000000000000004e RBX: ffff888058bea080 RCX: ffffc9002817d000 RDX: 0000000000000000 RSI: ffffffff819becc6 RDI: 0000000000000005 RBP: dead000000000122 R08: 0000000000000005 R09: 0000000000000000 R10: 0000000080000000 R11: 0000000000000001 R12: ffff888039e9c230 R13: ffff888058bea088 R14: ffff888058bea080 R15: ffff888055461480 FS: 00007fbbcfe6f6c0(0000) GS:ffff8880d6d0a000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000000110c3afcb0 CR3: 00000000382c7000 CR4: 0000000000352ef0 Call Trace: <TASK> __list_del_entry_valid include/linux/list.h:132 [inline] __list_del_entry include/linux/list.h:223 [inline] list_del_rcu include/linux/rculist.h:178 [inline] __team_queue_override_port_del drivers/net/team/team_core.c:826 [inline] __team_queue_override_port_del drivers/net/team/team_core.c:821 [inline] team_queue_override_port_prio_changed drivers/net/team/team_core.c:883 [inline] team_priority_option_set+0x171/0x2f0 drivers/net/team/team_core.c:1534 team_option_set drivers/net/team/team_core.c:376 [inline] team_nl_options_set_doit+0x8ae/0xe60 drivers/net/team/team_core.c:2653 genl_family_rcv_msg_doit+0x209/0x2f0 net/netlink/genetlink.c:1115 genl_family_rcv_msg net/netlink/genetlink.c:1195 [inline] genl_rcv_msg+0x55c/0x800 net/netlink/genetlink.c:1210 netlink_rcv_skb+0x158/0x420 net/netlink/af_netlink.c:2552 genl_rcv+0x28/0x40 net/netlink/genetlink.c:1219 netlink_unicast_kernel net/netlink/af_netlink.c:1320 [inline] netlink_unicast+0x5aa/0x870 net/netlink/af_netlink.c:1346 netlink_sendmsg+0x8c8/0xdd0 net/netlink/af_netlink.c:1896 sock_sendmsg_nosec net/socket.c:727 [inline] __sock_sendmsg net/socket.c:742 [inline] ____sys_sendmsg+0xa98/0xc70 net/socket.c:2630 ___sys_sendmsg+0x134/0x1d0 net/socket.c:2684 __sys_sendmsg+0x16d/0x220 net/socket.c:2716 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xcd/0xfa0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f
The problem is in this flow:
1) Port is enabled, queue_id != 0, in qom_list
2) Port gets disabled
-> team_port_disable()
-> team_queue_override_port_del()
-> del (removed from list)
3) Port is disabled, queue_id != 0, not in any list
4) Priority changes
-> team_queue_override_port_prio_changed()
-> checks: port disabled && queue_id != 0
-> calls del - hits the BUG as it is removed alreadyTo fix this, change the check in team_queue_override_port_prio_changed() so it returns early if port is not enabled.
--- drivers/net/team/team.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/team/team.c +1 -1
@@ -876,7 +876,7 @@ static void __team_queue_override_enabled_check(struct team *team)static void team_queue_override_port_prio_changed (struct team *team,struct team_port *port) { -if (!port->queue_id ||team_port_enabled (port)) +if (!port->queue_id || !team_port_enabled (port))return ;__team_queue_override_port_del (team, port);__team_queue_override_port_add (team, port);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 514/737 amd-xgbe: reset retries and mode on RX adapt failures
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raju Rangoju <[email protected]>
[ Upstream commit df60c332caf95d70f967aeace826e7e2f0847361 ]
During the stress tests, early RX adaptation handshakes can fail, such as missing the RX_ADAPT ACK or not receiving a coefficient update before block lock is established. Continuing to retry RX adaptation in this state is often ineffective if the current mode selection is not viable.
Resetting the RX adaptation retry counter when an RX_ADAPT request fails to receive ACK or a coefficient update prior to block lock, and clearing mode_set so the next bring-up performs a fresh mode selection rather than looping on a likely invalid configuration.
--- drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +2 -0
@@ -2036,6 +2036,7 @@ static void xgbe_set_rx_adap_mode(struct xgbe_prv_data *pdata, {if (pdata->rx_adapt_retries++ >=MAX_RX_ADAPT_RETRIES ) { pdata->rx_adapt_retries =0 ; + pdata->mode_set = false;return ; }
@@ -2082,6 +2083,7 @@ static void xgbe_rx_adaptation(struct xgbe_prv_data *pdata)*/ netif_dbg (pdata, link, pdata->netdev,"Block_lock done" ); pdata->rx_adapt_done = true; + pdata->rx_adapt_retries =0 ; pdata->mode_set = false;return ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 515/737 net: usb: rtl8150: fix memory leak on usb_submit_urb() failure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Deepakkumar Karn <[email protected]>
[ Upstream commit 12cab1191d9890097171156d06bfa8d31f1e39c8 ]
In async_set_registers(), when usb_submit_urb() fails, the allocated
async_req structure and URB are not freed, causing a memory leak.
The completion callback async_set_reg_cb() is responsible for freeing these allocations, but it is only called after the URB is successfully submitted and completes (successfully or with error). If submission fails, the callback never runs and the memory is leaked.
Fix this by freeing both the URB and the request structure in the error path when usb_submit_urb() fails.
--- drivers/net/usb/rtl8150.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/usb/rtl8150.c +2 -0
@@ -211,6 +211,8 @@ static int async_set_registers(rtl8150_t *dev, u16 indx, u16 size, u16 reg)if (res == -ENODEV )netif_device_detach (dev->netdev);dev_err (&dev->udev->dev,"%s failed with %d\n" , __func__, res); +kfree (req); +usb_free_urb (async_urb); }return res; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 516/737 selftests: net: fix "buffer overflow detected" for tap.c
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice C. Munduruca <[email protected]>
[ Upstream commit 472c5dd6b95c02b3e5d7395acf542150e91165e7 ]
When the selftest 'tap.c' is compiled with '-D_FORTIFY_SOURCE=3', the strcpy() in rtattr_add_strsz() is replaced with a checked version which causes the test to consistently fail when compiled with toolchains for which this option is enabled by default.
TAP version 13
1..3
# Starting 3 tests from 1 test cases.
# RUN tap.test_packet_valid_udp_gso ...
*** buffer overflow detected ***: terminated
# test_packet_valid_udp_gso: Test terminated by assertion
# FAIL tap.test_packet_valid_udp_gso
not ok 1 tap.test_packet_valid_udp_gso
# RUN tap.test_packet_valid_udp_csum ...
*** buffer overflow detected ***: terminated
# test_packet_valid_udp_csum: Test terminated by assertion
# FAIL tap.test_packet_valid_udp_csum
not ok 2 tap.test_packet_valid_udp_csum
# RUN tap.test_packet_crash_tap_invalid_eth_proto ...
*** buffer overflow detected ***: terminated
# test_packet_crash_tap_invalid_eth_proto: Test terminated by assertion
# FAIL tap.test_packet_crash_tap_invalid_eth_proto
not ok 3 tap.test_packet_crash_tap_invalid_eth_proto
# FAILED: 0 / 3 tests passed.
# Totals: pass:0 fail:3 xfail:0 xpass:0 skip:0 error:0
A buffer overflow is detected by the fortified glibc __strcpy_chk() since the __builtin_object_size() of RTA_DATA(rta) is incorrectly reported as 1, even though there is ample space in its bounding buffer req.
Additionally, given that IFLA_IFNAME also expects a null-terminated string, callers of rtaddr_add_str{,sz}() could simply use the rtaddr_add_strsz() variant. (which has been renamed to remove the trailing sz) memset() has been used for this function since it is unchecked and thus circumvents the issue discussed in the previous paragraph.
--- tools/testing/selftests/net/tap.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
tools/testing/selftests/net/tap.c +5 -11
@@ -56,18 +56,12 @@ static void rtattr_end(struct nlmsghdr *nh, struct rtattr *attr)static struct rtattr *rtattr_add_str (struct nlmsghdr *nh,unsigned short type,const char *s) { -struct rtattr *rta =rtattr_add (nh, type,strlen (s)); +unsigned int strsz =strlen (s) +1 ; +struct rtattr *rta; -memcpy (RTA_DATA (rta), s,strlen (s)); -return rta; -} - -static struct rtattr *rtattr_add_strsz (struct nlmsghdr *nh,unsigned short type, -const char *s) -{ -struct rtattr *rta =rtattr_add (nh, type,strlen (s) +1 ); + rta =rtattr_add (nh, type, strsz); -strcpy (RTA_DATA (rta), s); +memcpy (RTA_DATA (rta), s, strsz);return rta; }
@@ -119,7 +113,7 @@ static int dev_create(const char *dev, const char *link_type, link_info =rtattr_begin (&req.nh,IFLA_LINKINFO ); -rtattr_add_strsz (&req.nh,IFLA_INFO_KIND , link_type); +rtattr_add_str (&req.nh,IFLA_INFO_KIND , link_type);if (fill_info_data) { info_data =rtattr_begin (&req.nh,IFLA_INFO_DATA );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 517/737 smc91x: fix broken irq-context in PREEMPT_RT
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yeoreum Yun <[email protected]>
[ Upstream commit 6402078bd9d1ed46e79465e1faaa42e3458f8a33 ]
When smc91x.c is built with PREEMPT_RT, the following splat occurs in FVP_RevC:
[ 13.055000] smc91x LNRO0003:00 eth0: link up, 10Mbps, half-duplex, lpa 0x0000
[ 13.062137] BUG: workqueue leaked atomic, lock or RCU: kworker/2:1[106]
[ 13.062137] preempt=0x00000000 lock=0->0 RCU=0->1 workfn=mld_ifc_work
[ 13.062266] C
** replaying previous printk message **
[ 13.062266] CPU: 2 UID: 0 PID: 106 Comm: kworker/2:1 Not tainted 6.18.0-dirty #179 PREEMPT_{RT,(full)}
[ 13.062353] Hardware name: , BIOS
[ 13.062382] Workqueue: mld mld_ifc_work
[ 13.062469] Call trace:
[ 13.062494] show_stack+0x24/0x40 (C)
[ 13.062602] __dump_stack+0x28/0x48
[ 13.062710] dump_stack_lvl+0x7c/0xb0
[ 13.062818] dump_stack+0x18/0x34
[ 13.062926] process_scheduled_works+0x294/0x450
[ 13.063043] worker_thread+0x260/0x3d8
[ 13.063124] kthread+0x1c4/0x228
[ 13.063235] ret_from_fork+0x10/0x20This happens because smc_special_trylock() disables IRQs even on PREEMPT_RT,
but smc_special_unlock() does not restore IRQs on PREEMPT_RT.
The reason is that smc_special_unlock() calls spin_unlock_irqrestore(),
and rcu_read_unlock_bh() in __dev_queue_xmit() cannot invokercu_read_unlock() through __local_bh_enable_ip() when current->softirq_disable_cnt becomes zero.
To address this issue, replace smc_special_trylock() with spin_trylock_irqsave().
--- drivers/net/ethernet/smsc/smc91x.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-)
drivers/net/ethernet/smsc/smc91x.c +1 -9
@@ -515,15 +515,7 @@ static inline void smc_rcv(struct net_device *dev)* any other concurrent access and C would always interrupt B. But life * isn't that easy in a SMP world... */ -#define smc_special_trylock (lock, flags) \ -({ \ - int __ret; \ - local_irq_save(flags); \ - __ret = spin_trylock(lock); \ - if (!__ret) \ - local_irq_restore(flags); \ - __ret; \ -}) +#define smc_special_trylock (lock, flags) spin_trylock_irqsave(lock, flags)#define smc_special_lock (lock, flags) spin_lock_irqsave(lock, flags)#define smc_special_unlock (lock, flags) spin_unlock_irqrestore(lock, flags)#else
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 518/737 genalloc.h: fix htmldocs warning
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Morton <[email protected]>
[ Upstream commit 5393802c94e0ab1295c04c94c57bcb00222d4674 ]
WARNING: include/linux/genalloc.h:52 function parameter 'start_addr' not described in 'genpool_algo_t'
--- include/linux/genalloc.h | 1 + 1 file changed, 1 insertion(+)
include/linux/genalloc.h +1 -0
@@ -44,6 +44,7 @@ struct gen_pool;* @nr: The number of zeroed bits we're looking for * @data: optional additional data used by the callback * @pool: the pool being allocated from +* @start_addr: start address of memory chunk */ typedef unsigned long (*genpool_algo_t)(unsigned long *map, unsigned long size,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 519/737 firewire: nosy: Fix dma_free_coherent() size
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit c48c0fd0e19684b6ecdb4108a429e3a4e73f5e21 ]
It looks like the buffer allocated and mapped in add_card() is done with size RCV_BUFFER_SIZE which is 16 KB and 4KB.
--- drivers/firewire/nosy.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/firewire/nosy.c +5 -5
@@ -36,6 +36,8 @@static char driver_name[] =KBUILD_MODNAME ; +#define RCV_BUFFER_SIZE (16 * 1024) +/* this is the physical layout of a PCL, its size is 128 bytes */ struct pcl {__le32 next;
@@ -517,16 +519,14 @@ remove_card(struct pci_dev *dev) lynx->rcv_start_pcl, lynx->rcv_start_pcl_bus);dma_free_coherent (&lynx->pci_device->dev,sizeof (struct pcl ), lynx->rcv_pcl, lynx->rcv_pcl_bus); -dma_free_coherent (&lynx->pci_device->dev,PAGE_SIZE , lynx->rcv_buffer, - lynx->rcv_buffer_bus); +dma_free_coherent (&lynx->pci_device->dev,RCV_BUFFER_SIZE , + lynx->rcv_buffer, lynx->rcv_buffer_bus);iounmap (lynx->registers);pci_disable_device (dev);lynx_put (lynx); } -#define RCV_BUFFER_SIZE (16 * 1024) -static int add_card (struct pci_dev *dev,const struct pci_device_id *unused) {
@@ -680,7 +680,7 @@ add_card(struct pci_dev *dev, const struct pci_device_id *unused)dma_free_coherent (&lynx->pci_device->dev,sizeof (struct pcl ), lynx->rcv_pcl, lynx->rcv_pcl_bus);if (lynx->rcv_buffer) -dma_free_coherent (&lynx->pci_device->dev,PAGE_SIZE , +dma_free_coherent (&lynx->pci_device->dev,RCV_BUFFER_SIZE , lynx->rcv_buffer, lynx->rcv_buffer_bus);iounmap (lynx->registers);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 520/737 net: dsa: b53: skip multicast entries for fdb_dump()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit d42bce414d1c5c0b536758466a1f63ac358e613c ]
port_fdb_dump() is supposed to only add fdb entries, but we iterate over the full ARL table, which also includes multicast entries.
So check if the entry is a multicast entry before passing it on to the callback().
Additionally, the port of those entries is a bitmask, not a port number, so any included entries would have even be for the wrong port.
--- drivers/net/dsa/b53/b53_common.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/dsa/b53/b53_common.c +3 -0
@@ -1846,6 +1846,9 @@ static int b53_fdb_copy(int port, const struct b53_arl_entry *ent,if (!ent->is_valid)return 0 ; +if (is_multicast_ether_addr (ent->mac)) +return 0 ; +if (port != ent->port)return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 521/737 net: usb: asix: validate PHY address before use
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Deepanshu Kartikey <[email protected]>
[ Upstream commit a1e077a3f76eea0dc671ed6792e7d543946227e8 ]
The ASIX driver reads the PHY address from the USB device via asix_read_phy_addr(). A malicious or faulty device can return an invalid address (>= PHY_MAX_ADDR), which causes a warning in mdiobus_get_phy():
addr 207 out of range
WARNING: drivers/net/phy/mdio_bus.c:76
Validate the PHY address in asix_read_phy_addr() and remove the now-redundant check in ax88172a.c.
--- drivers/net/usb/asix_common.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/usb/asix_common.c +5 -0
@@ -335,6 +335,11 @@ int asix_read_phy_addr(struct usbnet *dev, bool internal) offset = (internal ?1 :0 ); ret = buf[offset]; +if (ret >=PHY_MAX_ADDR ) { +netdev_err (dev->net,"invalid PHY address: %d\n" , ret); +return -ENODEV ; + } +netdev_dbg (dev->net,"%s PHY address 0x%x\n" , internal ?"internal" :"external" , ret);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 522/737 net: bridge: Describe @tunnel_hash member in net_bridge_vlan_group struct
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bagas Sanjaya <[email protected]>
[ Upstream commit f79f9b7ace1713e4b83888c385f5f55519dfb687 ]
Sphinx reports kernel-doc warning:
WARNING: ./net/bridge/br_private.h:267 struct member 'tunnel_hash' not described in 'net_bridge_vlan_group'
Fix it by describing @tunnel_hash member.
--- net/bridge/br_private.h | 1 + 1 file changed, 1 insertion(+)
net/bridge/br_private.h +1 -0
@@ -245,6 +245,7 @@ struct net_bridge_vlan {* struct net_bridge_vlan_group * * @vlan_hash: VLAN entry rhashtable +* @tunnel_hash: Hash table to map from tunnel key ID (e.g. VXLAN VNI) to VLAN * @vlan_list: sorted VLAN entry list * @num_vlans: number of total VLAN entries * @pvid: PVID VLAN id
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 523/737 platform/x86: hp-bioscfg: Fix out-of-bounds array access in ACPI package parsing
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit e44c42c830b7ab36e3a3a86321c619f24def5206 ]
The hp_populate_*_elements_from_package() functions in the hp-bioscfg driver contain out-of-bounds array access vulnerabilities.
These functions parse ACPI packages into internal data structures using a for loop with index variable 'elem' that iterates through enum_obj/integer_obj/order_obj/password_obj/string_obj arrays.
When processing multi-element fields like PREREQUISITES and ENUM_POSSIBLE_VALUES, these functions read multiple consecutive array elements using expressions like 'enum_obj[elem + reqs]' and 'enum_obj[elem + pos_values]' within nested loops.
The bug is that the bounds check only validated elem, but did not consider the additional offset when accessing elem + reqs or elem + pos_values.
The fix changes the bounds check to validate the actual accessed index.
--- drivers/platform/x86/hp/hp-bioscfg/enum-attributes.c | 4 ++-- drivers/platform/x86/hp/hp-bioscfg/int-attributes.c | 2 +- drivers/platform/x86/hp/hp-bioscfg/order-list-attributes.c | 5 +++++ drivers/platform/x86/hp/hp-bioscfg/passwdobj-attributes.c | 5 +++++ drivers/platform/x86/hp/hp-bioscfg/string-attributes.c | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-)
drivers/platform/x86/hp/hp-bioscfg/enum-attributes.c +2 -2
@@ -210,7 +210,7 @@ static int hp_populate_enumeration_elements_from_package(union acpi_object *enumcase PREREQUISITES : size =min_t (u32, enum_data->common.prerequisites_size,MAX_PREREQUISITES_SIZE );for (reqs =0 ; reqs < size; reqs++) { -if (elem >= enum_obj_count) { +if (elem + reqs >= enum_obj_count) {pr_err ("Error enum-objects package is too small\n" );return -EINVAL ; }
@@ -261,7 +261,7 @@ static int hp_populate_enumeration_elements_from_package(union acpi_object *enumfor (pos_values =0 ; pos_values < size && pos_values <MAX_VALUES_SIZE ; pos_values++) { -if (elem >= enum_obj_count) { +if (elem + pos_values >= enum_obj_count) {pr_err ("Error enum-objects package is too small\n" );return -EINVAL ; }
drivers/platform/x86/hp/hp-bioscfg/int-attributes.c +1 -1
@@ -228,7 +228,7 @@ static int hp_populate_integer_elements_from_package(union acpi_object *integer_ size =min_t (u32, integer_data->common.prerequisites_size,MAX_PREREQUISITES_SIZE );for (reqs =0 ; reqs < size; reqs++) { -if (elem >= integer_obj_count) { +if (elem + reqs >= integer_obj_count) {pr_err ("Error elem-objects package is too small\n" );return -EINVAL ; }
drivers/platform/x86/hp/hp-bioscfg/order-list-attributes.c +5 -0
@@ -220,6 +220,11 @@ static int hp_populate_ordered_list_elements_from_package(union acpi_object *ord size =min_t (u32, ordered_list_data->common.prerequisites_size,MAX_PREREQUISITES_SIZE );for (reqs =0 ; reqs < size; reqs++) { +if (elem + reqs >= order_obj_count) { +pr_err ("Error elem-objects package is too small\n" ); +return -EINVAL ; + } + ret =hp_convert_hexstr_to_str (order_obj[elem + reqs].string.pointer, order_obj[elem + reqs].string.length, &str_value, &value_len);
drivers/platform/x86/hp/hp-bioscfg/passwdobj-attributes.c +5 -0
@@ -309,6 +309,11 @@ static int hp_populate_password_elements_from_package(union acpi_object *passwor MAX_PREREQUISITES_SIZE);for (reqs =0 ; reqs < size; reqs++) { +if (elem + reqs >= password_obj_count) { +pr_err ("Error elem-objects package is too small\n" ); +return -EINVAL ; + } + ret =hp_convert_hexstr_to_str (password_obj[elem + reqs].string.pointer, password_obj[elem + reqs].string.length, &str_value, &value_len);
drivers/platform/x86/hp/hp-bioscfg/string-attributes.c +1 -1
@@ -219,7 +219,7 @@ static int hp_populate_string_elements_from_package(union acpi_object *string_ob MAX_PREREQUISITES_SIZE);for (reqs =0 ; reqs < size; reqs++) { -if (elem >= string_obj_count) { +if (elem + reqs >= string_obj_count) {pr_err ("Error elem-objects package is too small\n" );return -EINVAL ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 524/737 octeontx2-pf: fix "UBSAN: shift-out-of-bounds error"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anshumali Gaur <[email protected]>
[ Upstream commit 85f4b0c650d9f9db10bda8d3acfa1af83bf78cf7 ]
This patch ensures that the RX ring size (rx_pending) is not set below the permitted length. This avoids UBSAN shift-out-of-bounds errors when users passes small or zero ring sizes via ethtool -G.
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c +8 -0
@@ -432,6 +432,14 @@ static int otx2_set_ringparam(struct net_device *netdev,*/ if (rx_count < pfvf->hw.rq_skid) rx_count = pfvf->hw.rq_skid; + +if (ring->rx_pending <16 ) { +netdev_err (netdev, +"rx ring size %u invalid, min is 16\n" , + ring->rx_pending); +return -EINVAL ; + } + rx_count =Q_COUNT (Q_SIZE (rx_count,3 ));/* Due pipelining impact minimum 2000 unused SQ CQE's
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 525/737 net: stmmac: fix the crash issue for zero copy XDP_TX action
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Fang <[email protected]>
[ Upstream commit a48e232210009be50591fdea8ba7c07b0f566a13 ]
There is a crash issue when running zero copy XDP_TX action, the crash log is shown below.
[ 216.122464] Unable to handle kernel paging request at virtual address fffeffff80000000 [ 216.187524] Internal error: Oops: 0000000096000144 [#1] SMP [ 216.301694] Call trace: [ 216.304130] dcache_clean_poc+0x20/0x38 (P) [ 216.308308] __dma_sync_single_for_device+0x1bc/0x1e0 [ 216.313351] stmmac_xdp_xmit_xdpf+0x354/0x400 [ 216.317701] __stmmac_xdp_run_prog+0x164/0x368 [ 216.322139] stmmac_napi_poll_rxtx+0xba8/0xf00 [ 216.326576] __napi_poll+0x40/0x218 [ 216.408054] Kernel panic - not syncing: Oops: Fatal exception in interrupt
For XDP_TX action, the xdp_buff is converted to xdp_frame by xdp_convert_buff_to_frame(). The memory type of the resulting xdp_frame depends on the memory type of the xdp_buff. For page pool based xdp_buff it produces xdp_frame with memory type MEM_TYPE_PAGE_POOL. For zero copy XSK pool based xdp_buff it produces xdp_frame with memory type MEM_TYPE_PAGE_ORDER0. However, stmmac_xdp_xmit_back() does not check the memory type and always uses the page pool type, this leads to invalid mappings and causes the crash. Therefore, check the xdp_buff memory type in stmmac_xdp_xmit_back() to fix this issue.
--- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +15 -2
@@ -87,6 +87,7 @@ MODULE_PARM_DESC(phyaddr, "Physical device address");#define STMMAC_XDP_CONSUMED BIT(0)#define STMMAC_XDP_TX BIT(1)#define STMMAC_XDP_REDIRECT BIT(2) +#define STMMAC_XSK_CONSUMED BIT(3)static int flow_ctrl =FLOW_AUTO ;module_param (flow_ctrl, int,0644 );
@@ -4875,6 +4876,7 @@ static int stmmac_xdp_get_tx_queue(struct stmmac_priv *priv,static int stmmac_xdp_xmit_back (struct stmmac_priv *priv,struct xdp_buff *xdp) { +bool zc = !!(xdp->rxq->mem.type ==MEM_TYPE_XSK_BUFF_POOL );struct xdp_frame *xdpf =xdp_convert_buff_to_frame (xdp);int cpu =smp_processor_id ();struct netdev_queue *nq;
@@ -4891,9 +4893,18 @@ static int stmmac_xdp_xmit_back(struct stmmac_priv *priv,/* Avoids TX time-out as we are sharing with slow path */ txq_trans_cond_update (nq); - res =stmmac_xdp_xmit_xdpf (priv, queue, xdpf, false); -if (res ==STMMAC_XDP_TX ) +/* For zero copy XDP_TX action, dma_map is true */ + res =stmmac_xdp_xmit_xdpf (priv, queue, xdpf, zc); +if (res ==STMMAC_XDP_TX ) {stmmac_flush_tx_descriptors (priv, queue); + }else if (res ==STMMAC_XDP_CONSUMED && zc) { +/* xdp has been freed by xdp_convert_buff_to_frame(), +* no need to call xsk_buff_free() again, so return +* STMMAC_XSK_CONSUMED. +*/ + res =STMMAC_XSK_CONSUMED ; +xdp_return_frame (xdpf); + }__netif_tx_unlock (nq);
@@ -5239,6 +5250,8 @@ static int stmmac_rx_zc(struct stmmac_priv *priv, int limit, u32 queue)break ;case STMMAC_XDP_CONSUMED :xsk_buff_free (buf->xdp); + fallthrough; +case STMMAC_XSK_CONSUMED : rx_dropped++;break ;case STMMAC_XDP_TX :
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 526/737 ipv6: BUG() in pskb_expand_head() as part of calipso_skbuff_setattr()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Rosenberg <[email protected]>
[ Upstream commit 58fc7342b529803d3c221101102fe913df7adb83 ]
There exists a kernel oops caused by a BUG_ON(nhead < 0) at net/core/skbuff.c:2232 in pskb_expand_head().
This bug is triggered as part of the calipso_skbuff_setattr() routine when skb_cow() is passed headroom > INT_MAX (i.e. (int)(skb_headroom(skb) + len_delta) < 0).
The root cause of the bug is due to an implicit integer cast in __skb_cow(). The check (headroom > skb_headroom(skb)) is meant to ensure that delta = headroom - skb_headroom(skb) is never negative, otherwise we will trigger a BUG_ON in pskb_expand_head(). However, if headroom > INT_MAX and delta <= -NET_SKB_PAD, the check passes, delta becomes negative, and pskb_expand_head() is passed a negative value for nhead.
Fix the trigger condition in calipso_skbuff_setattr(). Avoid passing "negative" headroom sizes to skb_cow() within calipso_skbuff_setattr() by only using skb_cow() to grow headroom.
PoC:
Using `netlabelctl` tool:
netlabelctl map del default
netlabelctl calipso add pass doi:7
netlabelctl map add default address:0::1/128 protocol:calipso,7
Then run the following PoC:
int fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
// setup msghdr
int cmsg_size = 2;
int cmsg_len = 0x60;
struct msghdr msg;
struct sockaddr_in6 dest_addr;
struct cmsghdr * cmsg = (struct cmsghdr *) calloc(1,
sizeof(struct cmsghdr) + cmsg_len);
msg.msg_name = &dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = NULL;
msg.msg_iovlen = 0;
msg.msg_control = cmsg;
msg.msg_controllen = cmsg_len;
msg.msg_flags = 0;
// setup sockaddr
dest_addr.sin6_family = AF_INET6;
dest_addr.sin6_port = htons(31337);
dest_addr.sin6_flowinfo = htonl(31337);
dest_addr.sin6_addr = in6addr_loopback;
dest_addr.sin6_scope_id = 31337;
// setup cmsghdr
cmsg->cmsg_len = cmsg_len;
cmsg->cmsg_level = IPPROTO_IPV6;
cmsg->cmsg_type = IPV6_HOPOPTS;
char * hop_hdr = (char *)cmsg + sizeof(struct cmsghdr);
hop_hdr[1] = 0x9; //set hop size - (0x9 + 1) * 8 = 80
sendmsg(fd, &msg, 0);--- net/ipv6/calipso.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/calipso.c +2 -1
@@ -1345,7 +1345,8 @@ static int calipso_skbuff_setattr(struct sk_buff *skb,/* At this point new_end aligns to 4n, so (new_end & 4) pads to 8n */ pad = ((new_end &4 ) + (end &7 )) &7 ; len_delta = new_end - (int )end + pad; - ret_val =skb_cow (skb,skb_headroom (skb) + len_delta); + ret_val =skb_cow (skb, +skb_headroom (skb) + (len_delta >0 ? len_delta :0 ));if (ret_val <0 )return ret_val;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 527/737 ipv4: Fix reference count leak when using error routes with nexthop objects
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit ac782f4e3bfcde145b8a7f8af31d9422d94d172a ]
When a nexthop object is deleted, it is marked as dead and then fib_table_flush() is called to flush all the routes that are using the dead nexthop.
The current logic in fib_table_flush() is to only flush error routes (e.g., blackhole) when it is called as part of network namespace dismantle (i.e., with flush_all=true). Therefore, error routes are not flushed when their nexthop object is deleted:
# ip link add name dummy1 up type dummy # ip nexthop add id 1 dev dummy1 # ip route add 198.51.100.1/32 nhid 1 # ip route add blackhole 198.51.100.2/32 nhid 1 # ip nexthop del id 1 # ip route show blackhole 198.51.100.2 nhid 1 dev dummy1
As such, they keep holding a reference on the nexthop object which in turn holds a reference on the nexthop device, resulting in a reference count leak:
# ip link del dev dummy1 [ 70.516258] unregister_netdevice: waiting for dummy1 to become free. Usage count = 2
Fix by flushing error routes when their nexthop is marked as dead.
IPv6 does not suffer from this problem.
--- net/ipv4/fib_trie.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/ipv4/fib_trie.c +4 -3
@@ -2059,10 +2059,11 @@ int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all)continue ; } -/* Do not flush error routes if network namespace is -* not being dismantled +/* When not flushing the entire table, skip error +* routes that are not marked for deletion. */ -if (!flush_all && fib_props[fa->fa_type].error) { +if (!flush_all && fib_props[fa->fa_type].error && + !(fi->fib_flags &RTNH_F_DEAD )) { slen = fa->fa_slen;continue ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 528/737 net: rose: fix invalid array index in rose_kill_by_device()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pwnverse <[email protected]>
[ Upstream commit 6595beb40fb0ec47223d3f6058ee40354694c8e4 ]
rose_kill_by_device() collects sockets into a local array[] and then iterates over them to disconnect sockets bound to a device being brought down.
The loop mistakenly indexes array[cnt] instead of array[i]. For cnt < ARRAY_SIZE(array), this reads an uninitialized entry; for cnt == ARRAY_SIZE(array), it is an out-of-bounds read. Either case can lead to an invalid socket pointer dereference and also leaks references taken via sock_hold().
Fix the index to use i.
--- net/rose/af_rose.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/rose/af_rose.c +1 -1
@@ -205,7 +205,7 @@ static void rose_kill_by_device(struct net_device *dev)spin_unlock_bh (&rose_list_lock);for (i =0 ; i < cnt; i++) { - sk = array[cnt]; + sk = array[i]; rose =rose_sk (sk);lock_sock (sk);spin_lock_bh (&rose_list_lock);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 529/737 RDMA/irdma: avoid invalid read in irdma_net_event
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Schmidt <[email protected]>
[ Upstream commit 6f05611728e9d0ab024832a4f1abb74a5f5d0bb0 ]
irdma_net_event() should not dereference anything from "neigh" (alias "ptr") until it has checked that the event is NETEVENT_NEIGH_UPDATE. Other events come with different structures pointed to by "ptr" and they may be smaller than struct neighbour.
Move the read of neigh->dev under the NETEVENT_NEIGH_UPDATE case.
The bug is mostly harmless, but it triggers KASAN on debug kernels:
BUG: KASAN: stack-out-of-bounds in irdma_net_event+0x32e/0x3b0 [irdma] Read of size 8 at addr ffffc900075e07f0 by task kworker/27:2/542554 CPU: 27 PID: 542554 Comm: kworker/27:2 Kdump: loaded Not tainted 5.14.0-630.el9.x86_64+debug #1 Hardware name: [...] Workqueue: events rt6_probe_deferred Call Trace: <IRQ> dump_stack_lvl+0x60/0xb0 print_address_description.constprop.0+0x2c/0x3f0 print_report+0xb4/0x270 kasan_report+0x92/0xc0 irdma_net_event+0x32e/0x3b0 [irdma] notifier_call_chain+0x9e/0x180 atomic_notifier_call_chain+0x5c/0x110 rt6_do_redirect+0xb91/0x1080 tcp_v6_err+0xe9b/0x13e0 icmpv6_notify+0x2b2/0x630 ndisc_redirect_rcv+0x328/0x530 icmpv6_rcv+0xc16/0x1360 ip6_protocol_deliver_rcu+0xb84/0x12e0 ip6_input_finish+0x117/0x240 ip6_input+0xc4/0x370 ipv6_rcv+0x420/0x7d0 __netif_receive_skb_one_core+0x118/0x1b0 process_backlog+0xd1/0x5d0 __napi_poll.constprop.0+0xa3/0x440 net_rx_action+0x78a/0xba0 handle_softirqs+0x2d4/0x9c0 do_softirq+0xad/0xe0 </IRQ>
--- drivers/infiniband/hw/irdma/utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/infiniband/hw/irdma/utils.c +2 -1
@@ -251,7 +251,7 @@ int irdma_net_event(struct notifier_block *notifier, unsigned long event, void *ptr) {struct neighbour *neigh = ptr; -struct net_device *real_dev, *netdev = (struct net_device *)neigh->dev; +struct net_device *real_dev, *netdev;struct irdma_device *iwdev;struct ib_device *ibdev;__be32 *p;
@@ -260,6 +260,7 @@ int irdma_net_event(struct notifier_block *notifier, unsigned long event,switch (event) {case NETEVENT_NEIGH_UPDATE : + netdev = neigh->dev; real_dev =rdma_vlan_dev_real_dev (netdev);if (!real_dev) real_dev = netdev;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 530/737 RDMA/efa: Remove possible negative shift
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Margolin <[email protected]>
[ Upstream commit 85463eb6a46caf2f1e0e1a6d0731f2f3bab17780 ]
The page size used for device might in some cases be smaller than PAGE_SIZE what results in a negative shift when calculating the number of host pages in PAGE_SIZE for a debug log. Remove the debug line together with the calculation.
--- drivers/infiniband/hw/efa/efa_verbs.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/infiniband/hw/efa/efa_verbs.c +0 -4
@@ -1224,13 +1224,9 @@ static int umem_to_page_list(struct efa_dev *dev, u32 hp_cnt, u8 hp_shift) { -u32 pages_in_hp =BIT (hp_shift -PAGE_SHIFT );struct ib_block_iter biter;unsigned int hp_idx =0 ; -ibdev_dbg (&dev->ibdev,"hp_cnt[%u], pages_in_hp[%u]\n" , - hp_cnt, pages_in_hp); -rdma_umem_for_each_dma_block (umem, &biter,BIT (hp_shift)) page_list[hp_idx++] =rdma_block_iter_dma_address (&biter);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 531/737 RDMA/core: Fix logic error in ib_get_gids_from_rdma_hdr()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jang Ingyu <[email protected]>
[ Upstream commit 8aaa848eaddd9ef8680fc6aafbd3a0646da5df40 ]
Fix missing comparison operator for RDMA_NETWORK_ROCE_V1 in the conditional statement. The constant was used directly instead of being compared with net_type, causing the condition to always evaluate to true.
--- drivers/infiniband/core/verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/core/verbs.c +1 -1
@@ -735,7 +735,7 @@ int ib_get_gids_from_rdma_hdr(const union rdma_network_hdr *hdr, (struct in6_addr *)dgid);return 0 ; }else if (net_type ==RDMA_NETWORK_IPV6 || - net_type ==RDMA_NETWORK_IB ||RDMA_NETWORK_ROCE_V1 ) { + net_type ==RDMA_NETWORK_IB || net_type ==RDMA_NETWORK_ROCE_V1 ) { *dgid = hdr->ibgrh.dgid; *sgid = hdr->ibgrh.sgid;return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 532/737 RDMA/bnxt_re: Fix incorrect BAR check in bnxt_qplib_map_creq_db()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit 145a417a39d7efbc881f52e829817376972b278c ]
RCFW_COMM_CONS_PCI_BAR_REGION is defined as BAR 2, so checking !creq_db->reg.bar_id is incorrect and always false.
pci_resource_start() returns the BAR base address, and a value of 0 indicates that the BAR is unassigned. Update the condition to test bar_base == 0 instead.
This ensures the driver detects and logs an error for an unassigned RCFW communication BAR.
--- drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c +1 -1
@@ -1116,7 +1116,7 @@ static int bnxt_qplib_map_creq_db(struct bnxt_qplib_rcfw *rcfw, u32 reg_offt) creq_db->dbinfo.flags =0 ; creq_db->reg.bar_id =RCFW_COMM_CONS_PCI_BAR_REGION ; creq_db->reg.bar_base =pci_resource_start (pdev, creq_db->reg.bar_id); -if (!creq_db->reg.bar_id) +if (!creq_db->reg.bar_base)dev_err (&pdev->dev,"QPLIB: CREQ BAR region %d resc start is 0!" , creq_db->reg.bar_id);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 533/737 RDMA/bnxt_re: Fix IB_SEND_IP_CSUM handling in post_send
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit f01765a2361323e78e3d91b1cb1d5527a83c5cf7 ]
The bnxt_re SEND path checks wr->send_flags to enable features such as IP checksum offload. However, send_flags is a bitmask and may contain multiple flags (e.g. IB_SEND_SIGNALED | IB_SEND_IP_CSUM), while the existing code uses a switch() statement that only matches when send_flags is exactly IB_SEND_IP_CSUM.
As a result, checksum offload is not enabled when additional SEND flags are present.
Replace the switch() with a bitmask test:
if (wr->send_flags & IB_SEND_IP_CSUM)
This ensures IP checksum offload is enabled correctly when multiple SEND flags are used.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +1 -6
@@ -2771,14 +2771,9 @@ int bnxt_re_post_send(struct ib_qp *ib_qp, const struct ib_send_wr *wr, wqe.rawqp1.lflags |=SQ_SEND_RAWETH_QP1_LFLAGS_ROCE_CRC ; } -switch (wr->send_flags) { -case IB_SEND_IP_CSUM : +if (wr->send_flags &IB_SEND_IP_CSUM ) wqe.rawqp1.lflags |=SQ_SEND_RAWETH_QP1_LFLAGS_IP_CHKSUM ; -break ; -default : -break ; - } fallthrough;case IB_WR_SEND_WITH_INV : rc =bnxt_re_build_send_wqe (qp, wr, &wqe);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 534/737 RDMA/bnxt_re: Fix to use correct page size for PDE table
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit 3d70e0fb0f289b0c778041c5bb04d099e1aa7c1c ]
In bnxt_qplib_alloc_init_hwq(), while allocating memory for PDE table driver incorrectly is using the "pg_size" value passed to the function. Fixed to use the right value 4K. Also, fixed the allocation size for PBL table.
--- drivers/infiniband/hw/bnxt_re/qplib_res.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_res.c +2 -2
@@ -243,7 +243,7 @@ int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq,if (npbl %BIT (MAX_PDL_LVL_SHIFT )) npde++;/* Alloc PDE pages */ - sginfo.pgsize = npde * pg_size; + sginfo.pgsize = npde *ROCE_PG_SIZE_4K ; sginfo.npages =1 ; rc =__alloc_pbl (res, &hwq->pbl[PBL_LVL_0 ], &sginfo);if (rc)
@@ -251,7 +251,7 @@ int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq,/* Alloc PBL pages */ sginfo.npages = npbl; - sginfo.pgsize =PAGE_SIZE ; + sginfo.pgsize =ROCE_PG_SIZE_4K ; rc =__alloc_pbl (res, &hwq->pbl[PBL_LVL_1 ], &sginfo);if (rc) goto fail;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 535/737 ksmbd: Fix memory leak in get_file_all_info()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zilin Guan <[email protected]>
[ Upstream commit 0c56693b06a68476ba113db6347e7897475f9e4c ]
In get_file_all_info(), if vfs_getattr() fails, the function returns immediately without freeing the allocated filename, leading to a memory leak.
Fix this by freeing the filename before returning in this error case.
--- fs/smb/server/smb2pdu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/smb/server/smb2pdu.c +3 -1
@@ -4912,8 +4912,10 @@ static int get_file_all_info(struct ksmbd_work *work, ret =vfs_getattr (&fp->filp->f_path, &stat,STATX_BASIC_STATS ,AT_STATX_SYNC_AS_STAT ); -if (ret) +if (ret) { +kfree (filename);return ret; + }ksmbd_debug (SMB ,"filename = %s\n" , filename); delete_pending =ksmbd_inode_pending_delete (fp);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 536/737 RDMA/rtrs: Fix clt_path::max_pages_per_mr calculation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Honggang LI <[email protected]>
[ Upstream commit 43bd09d5b750f700499ae8ec45fd41a4c48673e6 ]
If device max_mr_size bits in the range [mr_page_shift+31:mr_page_shift] are zero, the min3 function will set clt_path::max_pages_per_mr to zero.
alloc_path_reqs will pass zero, which is invalid, as the third parameter to ib_alloc_mr.
--- drivers/infiniband/ulp/rtrs/rtrs-clt.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/ulp/rtrs/rtrs-clt.c +1 -0
@@ -1465,6 +1465,7 @@ static void query_fast_reg_mode(struct rtrs_clt_path *clt_path) mr_page_shift =max (12 ,ffs (ib_dev->attrs.page_size_cap) -1 ); max_pages_per_mr = ib_dev->attrs.max_mr_size;do_div (max_pages_per_mr, (1ull << mr_page_shift)); + max_pages_per_mr =min_not_zero ((u32 )max_pages_per_mr,U32_MAX ); clt_path->max_pages_per_mr =min3 (clt_path->max_pages_per_mr, (u32 )max_pages_per_mr, ib_dev->attrs.max_fast_reg_page_list_len);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 537/737 RDMA/bnxt_re: fix dma_free_coherent() pointer
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit fcd431a9627f272b4c0bec445eba365fe2232a94 ]
The dma_alloc_coherent() allocates a dma-mapped buffer, pbl->pg_arr[i]. The dma_free_coherent() should pass the same buffer to dma_free_coherent() and not page-aligned.
--- drivers/infiniband/hw/bnxt_re/qplib_res.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_res.c +1 -3
@@ -70,9 +70,7 @@ static void __free_pbl(struct bnxt_qplib_res *res, struct bnxt_qplib_pbl *pbl,for (i =0 ; i < pbl->pg_count; i++) {if (pbl->pg_arr[i])dma_free_coherent (&pdev->dev, pbl->pg_size, - (void *)((unsigned long ) - pbl->pg_arr[i] & -PAGE_MASK ), + pbl->pg_arr[i], pbl->pg_map_arr[i]);else dev_warn(&pdev->dev,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 538/737 blk-mq: dont schedule block kworker on isolated CPUs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit a46c27026da10a126dd870f7b65380010bd20db5 ]
Kernel parameter of isolcpus= or 'nohz_full=' are used to isolate CPUs for specific task, and it isn't expected to let block IO disturb these CPUs. blk-mq kworker shouldn't be scheduled on isolated CPUs. Also if isolated CPUs is run for blk-mq kworker, long block IO latency can be caused.
Kernel workqueue only respects CPU isolation for WQ_UNBOUND, for bound WQ, the responsibility is on user because CPU is specified as WQ API parameter, such as mod_delayed_work_on(cpu), queue_delayed_work_on(cpu) and queue_work_on(cpu).
So not run blk-mq kworker on isolated CPUs by removing isolated CPUs from hctx->cpumask. Meantime use queue map to check if all CPUs in this hw queue are offline instead of hctx->cpumask, this way can avoid any cost in fast IO code path, and is safe since hctx->cpumask are only used in the two cases.
Stable-dep-of: 10845a105bbc ("blk-mq: skip CPU offline notify on unmapped hctx")
--- block/blk-mq.c | 57 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 10 deletions(-)
block/blk-mq.c +47 -10
@@ -30,6 +30,7 @@#include <linux/prefetch.h> #include <linux/blk-crypto.h> #include <linux/part_stat.h> +#include <linux/sched/isolation.h> #include <trace/events/block.h>
@@ -2193,6 +2194,15 @@ static inline int blk_mq_first_mapped_cpu(struct blk_mq_hw_ctx *hctx)return cpu; } +/* +* ->next_cpu is always calculated from hctx->cpumask, so simply use +* it for speeding up the check +*/ +static bool blk_mq_hctx_empty_cpumask (struct blk_mq_hw_ctx *hctx) +{ +return hctx->next_cpu >= nr_cpu_ids; +} +/* * It'd be great if the workqueue API had a way to pass * in a mask and had some smarts for more clever placement.
@@ -2204,7 +2214,8 @@ static int blk_mq_hctx_next_cpu(struct blk_mq_hw_ctx *hctx)bool tried = false;int next_cpu = hctx->next_cpu; -if (hctx->queue->nr_hw_queues ==1 ) +/* Switch to unbound if no allowable CPUs in this hctx */ +if (hctx->queue->nr_hw_queues ==1 ||blk_mq_hctx_empty_cpumask (hctx))return WORK_CPU_UNBOUND ;if (--hctx->next_cpu_batch <=0 ) {
@@ -3535,14 +3546,30 @@ static bool blk_mq_hctx_has_requests(struct blk_mq_hw_ctx *hctx)return data.has_rq; } -static inline bool blk_mq_last_cpu_in_hctx (unsigned int cpu, -struct blk_mq_hw_ctx *hctx) +static bool blk_mq_hctx_has_online_cpu (struct blk_mq_hw_ctx *hctx, +unsigned int this_cpu) { -if (cpumask_first_and (hctx->cpumask, cpu_online_mask) != cpu) -return false; -if (cpumask_next_and (cpu, hctx->cpumask, cpu_online_mask) < nr_cpu_ids) -return false; -return true; +enum hctx_type type = hctx->type; +int cpu; + +/* +* hctx->cpumask has to rule out isolated CPUs, but userspace still +* might submit IOs on these isolated CPUs, so use the queue map to +* check if all CPUs mapped to this hctx are offline +*/ +for_each_online_cpu (cpu) { +struct blk_mq_hw_ctx *h =blk_mq_map_queue_type (hctx->queue, + type, cpu); + +if (h != hctx) +continue ; + +/* this hctx has at least one online CPU */ +if (this_cpu != cpu) +return true; + } + +return false; }static int blk_mq_hctx_notify_offline (unsigned int cpu,struct hlist_node *node)
@@ -3551,8 +3578,7 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node) struct blk_mq_hw_ctx, cpuhp_online);int ret =0 ; -if (!cpumask_test_cpu (cpu, hctx->cpumask) || - !blk_mq_last_cpu_in_hctx (cpu, hctx)) +if (blk_mq_hctx_has_online_cpu (hctx, cpu))return 0 ;/*
@@ -4045,6 +4071,8 @@ static void blk_mq_map_swqueue(struct request_queue *q) }queue_for_each_hw_ctx (q, hctx, i) { +int cpu; +/* * If no software queues are mapped to this hardware queue, * disable it and free the request entries.
@@ -4071,6 +4099,15 @@ static void blk_mq_map_swqueue(struct request_queue *q)*/ sbitmap_resize (&hctx->ctx_map, hctx->nr_ctx); +/* +* Rule out isolated CPUs from hctx->cpumask to avoid +* running block kworker on isolated CPUs +*/ +for_each_cpu (cpu, hctx->cpumask) { +if (cpu_is_isolated (cpu)) +cpumask_clear_cpu (cpu, hctx->cpumask); + } +/* * Initialize batch roundrobin counts */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 539/737 blk-mq: skip CPU offline notify on unmapped hctx
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Zhang <[email protected]>
[ Upstream commit 10845a105bbcb030647a729f1716c2309da71d33 ]
If an hctx has no software ctx mapped, blk_mq_map_swqueue() never allocates tags and leaves hctx->tags NULL. The CPU hotplug offline notifier can still run for that hctx, return early since hctx cannot hold any requests.
--- block/blk-mq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/blk-mq.c +1 -1
@@ -3578,7 +3578,7 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node) struct blk_mq_hw_ctx, cpuhp_online);int ret =0 ; -if (blk_mq_hctx_has_online_cpu (hctx, cpu)) +if (!hctx->nr_ctx ||blk_mq_hctx_has_online_cpu (hctx, cpu))return 0 ;/*
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 540/737 selftests/ftrace: traceonoff_triggers: strip off names
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yipeng Zou <[email protected]>
[ Upstream commit b889b4fb4cbea3ca7eb9814075d6a51936394bd9 ]
The func_traceonoff_triggers.tc sometimes goes to fail on my board, Kunpeng-920.
[root@localhost]# ./ftracetest ./test.d/ftrace/func_traceonoff_triggers.tc -l fail.log === Ftrace unit tests === [1] ftrace - test for function traceon/off triggers [FAIL] [2] (instance) ftrace - test for function traceon/off triggers [UNSUPPORTED]
I look up the log, and it shows that the md5sum is different between csum1 and csum2.
++ cnt=611
++ sleep .1
+++ cnt_trace
+++ grep -v '^#' trace
+++ wc -l
++ cnt2=611
++ '[' 611 -ne 611 ']'
+++ cat tracing_on
++ on=0
++ '[' 0 '!=' 0 ']'
+++ md5sum trace
++ csum1='76896aa74362fff66a6a5f3cf8a8a500 trace'
++ sleep .1
+++ md5sum trace
++ csum2='ee8625a21c058818fc26e45c1ed3f6de trace'
++ '[' '76896aa74362fff66a6a5f3cf8a8a500 trace' '!=' 'ee8625a21c058818fc26e45c1ed3f6de trace' ']' ++ fail 'Tracing file is still changing'
++ echo Tracing file is still changing
Tracing file is still changing
++ exit_fail
++ exit 1
So I directly dump the trace file before md5sum, the diff shows that:
[root@localhost]# diff trace_1.log trace_2.log -y --suppress-common-lines dockerd-12285 [036] d.... 18385.510290: sched_stat | <...>-12285 [036] d.... 18385.510290: sched_stat dockerd-12285 [036] d.... 18385.510291: sched_swit | <...>-12285 [036] d.... 18385.510291: sched_swit <...>-740 [044] d.... 18385.602859: sched_stat | kworker/44:1-740 [044] d.... 18385.602859: sched_stat <...>-740 [044] d.... 18385.602860: sched_swit | kworker/44:1-740 [044] d.... 18385.602860: sched_swit
And we can see that <...> filed be filled with names.
We can strip off the names there to fix that.
After strip off the names:
kworker/u257:0-12 [019] d..2. 2528.758910: sched_stat | -12 [019] d..2. 2528.758910: sched_stat_runtime: comm=k kworker/u257:0-12 [019] d..2. 2528.758912: sched_swit | -12 [019] d..2. 2528.758912: sched_switch: prev_comm=kw <idle>-0 [000] d.s5. 2528.762318: sched_waki | -0 [000] d.s5. 2528.762318: sched_waking: comm=sshd pi <idle>-0 [037] dNh2. 2528.762326: sched_wake | -0 [037] dNh2. 2528.762326: sched_wakeup: comm=sshd pi <idle>-0 [037] d..2. 2528.762334: sched_swit | -0 [037] d..2. 2528.762334: sched_switch: prev_comm=sw
--- .../ftrace/test.d/ftrace/func_traceonoff_triggers.tc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/testing/selftests/ftrace/test.d/ftrace/func_traceonoff_triggers.tc +3 -2
@@ -90,9 +90,10 @@ if [ $on != "0" ]; then fail "Tracing is not off" fi -csum1=`md5sum trace` +# Cannot rely on names being around as they are only cached, strip them +csum1=`cat trace | sed -e 's/^ *[^ ]*\(-[0-9][0-9]*\)/\1/' | md5sum` sleep $SLEEP_TIME -csum2=`md5sum trace` +csum2=`cat trace | sed -e 's/^ *[^ ]*\(-[0-9][0-9]*\)/\1/' | md5sum` if [ "$csum1" != "$csum2" ]; then fail "Tracing file is still changing"
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 541/737 ntfs: Do not overwrite uptodate pages
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox (Oracle) <[email protected]>
commit 68f6bd128e75a032432eda9d16676ed2969a1096 upstream.
When reading a compressed file, we may read several pages in addition to the one requested. The current code will overwrite pages in the page cache with the data from disc which can definitely result in changes that have been made being lost.
For example if we have four consecutie pages ABCD in the file compressed into a single extent, on first access, we'll bring in ABCD. Then we write to page B. Memory pressure results in the eviction of ACD. When we attempt to write to page C, we will overwrite the data in page B with the data currently on disk.
I haven't investigated the decompression code to check whether it's OK to overwrite a clean page or whether it might be possible to see corrupt data. Out of an abundance of caution, decline to overwrite uptodate pages, not just dirty pages.
--- fs/ntfs3/frecord.c | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-)
fs/ntfs3/frecord.c +29 -6
@@ -2075,6 +2075,29 @@ out:return err; } +static struct page *ntfs_lock_new_page (struct address_space *mapping, +pgoff_t index,gfp_t gfp) +{ +struct folio *folio =__filemap_get_folio (mapping, index, +FGP_LOCK |FGP_ACCESSED |FGP_CREAT , gfp); +struct page *page; + +if (IS_ERR (folio)) +return ERR_CAST (folio); + +if (!folio_test_uptodate (folio)) +return folio_file_page (folio, index); + +/* Use a temporary page to avoid data corruption */ +folio_unlock (folio); +folio_put (folio); + page =alloc_page (gfp); +if (!page) +return ERR_PTR (-ENOMEM ); +__SetPageLocked (page); +return page; +} +/* * ni_readpage_cmpr *
@@ -2128,9 +2151,9 @@ int ni_readpage_cmpr(struct ntfs_inode *if (i == idx)continue ; - pg =find_or_create_page (mapping, index, gfp_mask); -if (!pg) { - err = -ENOMEM ; + pg =ntfs_lock_new_page (mapping, index, gfp_mask); +if (IS_ERR (pg)) { + err =PTR_ERR (pg); goto out1; } pages[i] = pg;
@@ -2232,13 +2255,13 @@ int ni_decompress_file(struct ntfs_inodefor (i =0 ; i < pages_per_frame; i++, index++) {struct page *pg; - pg =find_or_create_page (mapping, index, gfp_mask); -if (!pg) { + pg =ntfs_lock_new_page (mapping, index, gfp_mask); +if (IS_ERR (pg)) {while (i--) {unlock_page (pages[i]);put_page (pages[i]); } - err = -ENOMEM ; + err =PTR_ERR (pg); goto out; } pages[i] = pg;
Greg Kroah-Hartman
maintainerPATCH 542/737 ASoC: stm32: sai: fix device leak on probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit e26ff429eaf10c4ef1bc3dabd9bf27eb54b7e1f4 upstream.
Make sure to drop the reference taken when looking up the sync provider device and its driver data during DAI probe on probe failures and on unbind.
Note that holding a reference to a device does not prevent its driver data from going away so there is no point in keeping the reference.
--- sound/soc/stm/stm32_sai.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/stm/stm32_sai.c +1 -1
@@ -127,6 +127,7 @@ static int stm32_sai_set_sync(struct stm } sai_provider =platform_get_drvdata (pdev); +put_device (&pdev->dev);if (!sai_provider) {dev_err (&sai_client->pdev->dev,"SAI sync provider data not found\n" );
@@ -143,7 +144,6 @@ static int stm32_sai_set_sync(struct stm ret =stm32_sai_sync_conf_provider (sai_provider, synco); error: -put_device (&pdev->dev);of_node_put (np_provider);return ret; }
Greg Kroah-Hartman
maintainerPATCH 543/737 ASoC: stm32: sai: fix clk prepare imbalance on probe failure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 312ec2f0d9d1a5656f76d770bbf1d967e9289aa7 upstream.
Make sure to unprepare the parent clock also on probe failures (e.g. probe deferral).
--- sound/soc/stm/stm32_sai_sub.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
sound/soc/stm/stm32_sai_sub.c +21 -7
@@ -1501,14 +1501,21 @@ static int stm32_sai_sub_parse_of(structif (of_property_present (np,"#clock-cells" )) { ret =stm32_sai_add_mclk_provider (sai);if (ret <0 ) -return ret; + goto err_unprepare_pclk; }else { sai->sai_mclk =devm_clk_get_optional (&pdev->dev,"MCLK" ); -if (IS_ERR (sai->sai_mclk)) -return PTR_ERR (sai->sai_mclk); +if (IS_ERR (sai->sai_mclk)) { + ret =PTR_ERR (sai->sai_mclk); + goto err_unprepare_pclk; + } }return 0 ; + +err_unprepare_pclk: +clk_unprepare (sai->pdata->pclk); + +return ret; }static int stm32_sai_sub_probe (struct platform_device *pdev)
@@ -1552,26 +1559,33 @@ static int stm32_sai_sub_probe(struct pl IRQF_SHARED, dev_name(&pdev->dev), sai);if (ret) {dev_err (&pdev->dev,"IRQ request returned %d\n" , ret); -return ret; + goto err_unprepare_pclk; }if (STM_SAI_PROTOCOL_IS_SPDIF (sai)) conf = &stm32_sai_pcm_config_spdif; ret =snd_dmaengine_pcm_register (&pdev->dev, conf,0 ); -if (ret) -return dev_err_probe (&pdev->dev, ret,"Could not register pcm dma\n" ); +if (ret) { + ret =dev_err_probe (&pdev->dev, ret,"Could not register pcm dma\n" ); + goto err_unprepare_pclk; + } ret =snd_soc_register_component (&pdev->dev, &stm32_component, &sai->cpu_dai_drv,1 );if (ret) {snd_dmaengine_pcm_unregister (&pdev->dev); -return ret; + goto err_unprepare_pclk; }pm_runtime_enable (&pdev->dev);return 0 ; + +err_unprepare_pclk: +clk_unprepare (sai->pdata->pclk); + +return ret; }static void stm32_sai_sub_remove (struct platform_device *pdev)
Greg Kroah-Hartman
maintainerPATCH 544/737 ASoC: stm32: sai: fix OF node leak on probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 23261f0de09427367e99f39f588e31e2856a690e upstream.
The reference taken to the sync provider OF node when probing the platform device is currently only dropped if the set_sync() callback fails during DAI probe.
Make sure to drop the reference on platform probe failures (e.g. probe deferral) and on driver unbind.
This also avoids a potential use-after-free in case the DAI is ever reprobed without first rebinding the platform driver.
--- sound/soc/stm/stm32_sai.c | 12 +++--------- sound/soc/stm/stm32_sai_sub.c | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 16 deletions(-)
sound/soc/stm/stm32_sai.c +3 -9
@@ -122,7 +122,6 @@ static int stm32_sai_set_sync(struct stmif (!pdev) {dev_err (&sai_client->pdev->dev,"Device not found for node %pOFn\n" , np_provider); -of_node_put (np_provider);return -ENODEV ; }
@@ -131,21 +130,16 @@ static int stm32_sai_set_sync(struct stmif (!sai_provider) {dev_err (&sai_client->pdev->dev,"SAI sync provider data not found\n" ); - ret = -EINVAL ; - goto error; +return -EINVAL ; }/* Configure sync client */ ret =stm32_sai_sync_conf_client (sai_client, synci);if (ret <0 ) - goto error; +return ret;/* Configure sync provider */ - ret =stm32_sai_sync_conf_provider (sai_provider, synco); - -error: -of_node_put (np_provider); -return ret; +return stm32_sai_sync_conf_provider (sai_provider, synco); }static int stm32_sai_probe (struct platform_device *pdev)
sound/soc/stm/stm32_sai_sub.c +16 -7
@@ -1453,7 +1453,8 @@ static int stm32_sai_sub_parse_of(structdev_err (&pdev->dev,"External synchro not supported\n" );of_node_put (args.np); -return -EINVAL ; + ret = -EINVAL ; + goto err_put_sync_provider; } sai->sync =SAI_SYNC_EXTERNAL ;
@@ -1462,7 +1463,8 @@ static int stm32_sai_sub_parse_of(struct (sai->synci > (SAI_GCR_SYNCIN_MAX + 1))) {dev_err (&pdev->dev,"Wrong SAI index\n" );of_node_put (args.np); -return -EINVAL ; + ret = -EINVAL ; + goto err_put_sync_provider; } if (of_property_match_string(args.np, "compatible",
@@ -1476,7 +1478,8 @@ static int stm32_sai_sub_parse_of(structif (!sai->synco) {dev_err (&pdev->dev,"Unknown SAI sub-block\n" );of_node_put (args.np); -return -EINVAL ; + ret = -EINVAL ; + goto err_put_sync_provider; } }
@@ -1486,13 +1489,15 @@ static int stm32_sai_sub_parse_of(structof_node_put (args.np); sai->sai_ck =devm_clk_get (&pdev->dev,"sai_ck" ); -if (IS_ERR (sai->sai_ck)) -return dev_err_probe (&pdev->dev,PTR_ERR (sai->sai_ck), -"Missing kernel clock sai_ck\n" ); +if (IS_ERR (sai->sai_ck)) { + ret =dev_err_probe (&pdev->dev,PTR_ERR (sai->sai_ck), +"Missing kernel clock sai_ck\n" ); + goto err_put_sync_provider; + } ret =clk_prepare (sai->pdata->pclk);if (ret <0 ) -return ret; + goto err_put_sync_provider;if (STM_SAI_IS_F4 (sai->pdata))return 0 ;
@@ -1514,6 +1519,8 @@ static int stm32_sai_sub_parse_of(struct err_unprepare_pclk:clk_unprepare (sai->pdata->pclk); +err_put_sync_provider: +of_node_put (sai->np_sync_provider);return ret; }
@@ -1584,6 +1591,7 @@ static int stm32_sai_sub_probe(struct pl err_unprepare_pclk:clk_unprepare (sai->pdata->pclk); +of_node_put (sai->np_sync_provider);return ret; }
@@ -1596,6 +1604,7 @@ static void stm32_sai_sub_remove(structsnd_dmaengine_pcm_unregister (&pdev->dev);snd_soc_unregister_component (&pdev->dev);pm_runtime_disable (&pdev->dev); +of_node_put (sai->np_sync_provider); }#ifdef CONFIG_PM_SLEEP
Greg Kroah-Hartman
maintainerPATCH 545/737 ASoC: qcom: q6apm-dai: set flags to reflect correct operation of appl_ptr
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit 950a4e5788fc7dc6e8e93614a7d4d0449c39fb8d upstream.
Driver does not expect the appl_ptr to move backward and requires explict sync. Make sure that the userspace does not do appl_ptr rewinds by specifying the correct flags in pcm_info.
Without this patch, the result could be a forever loop as current logic assumes that appl_ptr can only move forward.
--- sound/soc/qcom/qdsp6/q6apm-dai.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/qcom/qdsp6/q6apm-dai.c +2 -0
@@ -85,6 +85,7 @@ static struct snd_pcm_hardware q6apm_dai .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_BLOCK_TRANSFER |SNDRV_PCM_INFO_MMAP_VALID |SNDRV_PCM_INFO_INTERLEAVED |SNDRV_PCM_INFO_PAUSE |SNDRV_PCM_INFO_RESUME | +SNDRV_PCM_INFO_NO_REWINDS |SNDRV_PCM_INFO_SYNC_APPLPTR | SNDRV_PCM_INFO_BATCH), .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE), .rates = SNDRV_PCM_RATE_8000_48000,
@@ -104,6 +105,7 @@ static struct snd_pcm_hardware q6apm_dai .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_BLOCK_TRANSFER |SNDRV_PCM_INFO_MMAP_VALID |SNDRV_PCM_INFO_INTERLEAVED |SNDRV_PCM_INFO_PAUSE |SNDRV_PCM_INFO_RESUME | +SNDRV_PCM_INFO_NO_REWINDS |SNDRV_PCM_INFO_SYNC_APPLPTR | SNDRV_PCM_INFO_BATCH), .formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE), .rates = SNDRV_PCM_RATE_8000_192000,
Greg Kroah-Hartman
maintainerPATCH 546/737 ASoC: qcom: q6asm-dai: perform correct state check before closing
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit bfbb12dfa144d45575bcfe139a71360b3ce80237 upstream.
Do not stop a q6asm stream if its not started, this can result in unnecessary dsp command which will timeout anyway something like below:
q6asm-dai ab00000.remoteproc:glink-edge:apr:service@7:dais: CMD 10bcd timeout
Fix this by correctly checking the state.
--- sound/soc/qcom/qdsp6/q6asm-dai.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/soc/qcom/qdsp6/q6asm-dai.c +2 -1
@@ -237,13 +237,14 @@ static int q6asm_dai_prepare(struct snd_ prtd->pcm_count =snd_pcm_lib_period_bytes (substream); prtd->pcm_irq_pos =0 ;/* rate and channels are sent to audio driver */ -if (prtd->state) { +if (prtd->state ==Q6ASM_STREAM_RUNNING ) {/* clear the previous setup if any */ q6asm_cmd (prtd->audio_client, prtd->stream_id,CMD_CLOSE );q6asm_unmap_memory_regions (substream->stream, prtd->audio_client);q6routing_stream_close (soc_prtd->dai_link->id, substream->stream); + prtd->state =Q6ASM_STREAM_STOPPED ; } ret = q6asm_map_memory_regions(substream->stream, prtd->audio_client,
Greg Kroah-Hartman
maintainerPATCH 547/737 ASoC: qcom: q6adm: the the copp device only during last instance
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit 74cc4f3ea4e99262ba0d619c6a4ee33e2cd47f65 upstream.
A matching Common object post processing instance is normally resused across multiple streams. However currently we close this on DSP even though there is a refcount on this copp object, this can result in below error.
q6routing ab00000.remoteproc:glink-edge:apr:service@8:routing: Found Matching Copp 0x0 qcom-q6adm aprsvc:service:4:8: cmd = 0x10325 return error = 0x2 q6routing ab00000.remoteproc:glink-edge:apr:service@8:routing: DSP returned error[2] q6routing ab00000.remoteproc:glink-edge:apr:service@8:routing: Found Matching Copp 0x0 qcom-q6adm aprsvc:service:4:8: cmd = 0x10325 return error = 0x2 q6routing ab00000.remoteproc:glink-edge:apr:service@8:routing: DSP returned error[2] qcom-q6adm aprsvc:service:4:8: cmd = 0x10327 return error = 0x2 qcom-q6adm aprsvc:service:4:8: DSP returned error[2]
qcom-q6adm aprsvc:service:4:8: Failed to close copp -22
qcom-q6adm aprsvc:service:4:8: cmd = 0x10327 return error = 0x2 qcom-q6adm aprsvc:service:4:8: DSP returned error[2]
qcom-q6adm aprsvc:service:4:8: Failed to close copp -22
Fix this by addressing moving the adm_close to copp_kref destructor callback.
--- sound/soc/qcom/qdsp6/q6adm.c | 146 ++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 75 deletions(-)
sound/soc/qcom/qdsp6/q6adm.c +71 -75
@@ -109,11 +109,75 @@ static struct q6copp *q6adm_find_copp(st } +static int q6adm_apr_send_copp_pkt (struct q6adm *adm,struct q6copp *copp, +struct apr_pkt *pkt,uint32_t rsp_opcode) +{ +struct device *dev = adm->dev; +uint32_t opcode = pkt->hdr.opcode; +int ret; + +mutex_lock (&adm->lock); + copp->result.opcode =0 ; + copp->result.status =0 ; + ret =apr_send_pkt (adm->apr, pkt); +if (ret <0 ) { +dev_err (dev,"Failed to send APR packet\n" ); + ret = -EINVAL ; + goto err; + } + +/* Wait for the callback with copp id */ +if (rsp_opcode) + ret =wait_event_timeout (copp->wait, + (copp->result.opcode == opcode) || + (copp->result.opcode == rsp_opcode), +msecs_to_jiffies (TIMEOUT_MS )); +else + ret =wait_event_timeout (copp->wait, + (copp->result.opcode == opcode), +msecs_to_jiffies (TIMEOUT_MS )); + +if (!ret) { +dev_err (dev,"ADM copp cmd timedout\n" ); + ret = -ETIMEDOUT ; + }else if (copp->result.status >0 ) { +dev_err (dev,"DSP returned error[%d]\n" , + copp->result.status); + ret = -EINVAL ; + } + +err: +mutex_unlock (&adm->lock); +return ret; +} + +static int q6adm_device_close (struct q6adm *adm,struct q6copp *copp, +int port_id,int copp_idx) +{ +struct apr_pkt close; + + close.hdr.hdr_field =APR_HDR_FIELD (APR_MSG_TYPE_SEQ_CMD , +APR_HDR_LEN (APR_HDR_SIZE ), +APR_PKT_VER ); + close.hdr.pkt_size =sizeof (close); + close.hdr.src_port = port_id; + close.hdr.dest_port = copp->id; + close.hdr.token = port_id <<16 | copp_idx; + close.hdr.opcode =ADM_CMD_DEVICE_CLOSE_V5 ; + +return q6adm_apr_send_copp_pkt (adm, copp, &close,0 ); +} +static void q6adm_free_copp (struct kref *ref) { struct q6copp *c = container_of(ref, struct q6copp, refcount);struct q6adm *adm = c->adm;unsigned long flags; +int ret; + + ret =q6adm_device_close (adm, c, c->afe_port, c->copp_idx); +if (ret <0 ) +dev_err (adm->dev,"Failed to close copp %d\n" , ret);spin_lock_irqsave (&adm->copps_list_lock, flags);clear_bit (c->copp_idx, &adm->copp_bitmap[c->afe_port]);
@@ -155,13 +219,13 @@ static int q6adm_callback(struct apr_devswitch (result->opcode) {case ADM_CMD_DEVICE_OPEN_V5 :case ADM_CMD_DEVICE_CLOSE_V5 : - copp =q6adm_find_copp (adm, port_idx, copp_idx); -if (!copp) -return 0 ; - - copp->result = *result; -wake_up (&copp->wait); -kref_put (&copp->refcount, q6adm_free_copp); +list_for_each_entry (copp, &adm->copps_list, node) { +if ((port_idx == copp->afe_port) && (copp_idx == copp->copp_idx)) { + copp->result = *result; +wake_up (&copp->wait); +break ; + } + }break ;case ADM_CMD_MATRIX_MAP_ROUTINGS_V5 : adm->result = *result;
@@ -234,65 +298,6 @@ static struct q6copp *q6adm_alloc_copp(sreturn c; } -static int q6adm_apr_send_copp_pkt (struct q6adm *adm,struct q6copp *copp, -struct apr_pkt *pkt,uint32_t rsp_opcode) -{ -struct device *dev = adm->dev; -uint32_t opcode = pkt->hdr.opcode; -int ret; - -mutex_lock (&adm->lock); - copp->result.opcode =0 ; - copp->result.status =0 ; - ret =apr_send_pkt (adm->apr, pkt); -if (ret <0 ) { -dev_err (dev,"Failed to send APR packet\n" ); - ret = -EINVAL ; - goto err; - } - -/* Wait for the callback with copp id */ -if (rsp_opcode) - ret =wait_event_timeout (copp->wait, - (copp->result.opcode == opcode) || - (copp->result.opcode == rsp_opcode), -msecs_to_jiffies (TIMEOUT_MS )); -else - ret =wait_event_timeout (copp->wait, - (copp->result.opcode == opcode), -msecs_to_jiffies (TIMEOUT_MS )); - -if (!ret) { -dev_err (dev,"ADM copp cmd timedout\n" ); - ret = -ETIMEDOUT ; - }else if (copp->result.status >0 ) { -dev_err (dev,"DSP returned error[%d]\n" , - copp->result.status); - ret = -EINVAL ; - } - -err: -mutex_unlock (&adm->lock); -return ret; -} - -static int q6adm_device_close (struct q6adm *adm,struct q6copp *copp, -int port_id,int copp_idx) -{ -struct apr_pkt close; - - close.hdr.hdr_field =APR_HDR_FIELD (APR_MSG_TYPE_SEQ_CMD , -APR_HDR_LEN (APR_HDR_SIZE ), -APR_PKT_VER ); - close.hdr.pkt_size =sizeof (close); - close.hdr.src_port = port_id; - close.hdr.dest_port = copp->id; - close.hdr.token = port_id <<16 | copp_idx; - close.hdr.opcode =ADM_CMD_DEVICE_CLOSE_V5 ; - -return q6adm_apr_send_copp_pkt (adm, copp, &close,0 ); -} - static struct q6copp *q6adm_find_matching_copp(struct q6adm *adm, int port_id, int topology, int mode, int rate,
@@ -567,15 +572,6 @@ EXPORT_SYMBOL_GPL(q6adm_matrix_map);*/ int q6adm_close (struct device *dev,struct q6copp *copp) { -struct q6adm *adm =dev_get_drvdata (dev->parent); -int ret =0 ; - - ret =q6adm_device_close (adm, copp, copp->afe_port, copp->copp_idx); -if (ret <0 ) { -dev_err (adm->dev,"Failed to close copp %d\n" , ret); -return ret; - } -kref_put (&copp->refcount, q6adm_free_copp);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 548/737 ASoC: qcom: qdsp6: q6asm-dai: set 10 ms period and buffer alignment.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit 81c53b52de21b8d5a3de55ebd06b6bf188bf7efd upstream.
DSP expects the periods to be aligned to fragment sizes, currently setting up to hw constriants on periods bytes is not going to work correctly as we can endup with periods sizes aligned to 32 bytes however not aligned to fragment size.
Update the constriants to use fragment size, and also set at step of 10ms for period size to accommodate DSP requirements of 10ms latency.
--- sound/soc/qcom/qdsp6/q6asm-dai.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/qcom/qdsp6/q6asm-dai.c +2 -2
@@ -413,13 +413,13 @@ static int q6asm_dai_open(struct snd_soc } ret =snd_pcm_hw_constraint_step (runtime,0 , -SNDRV_PCM_HW_PARAM_PERIOD_BYTES ,32 ); +SNDRV_PCM_HW_PARAM_PERIOD_SIZE ,480 );if (ret <0 ) {dev_err (dev,"constraint for period bytes step ret = %d\n" , ret); } ret =snd_pcm_hw_constraint_step (runtime,0 , -SNDRV_PCM_HW_PARAM_BUFFER_BYTES ,32 ); +SNDRV_PCM_HW_PARAM_BUFFER_SIZE ,480 );if (ret <0 ) {dev_err (dev,"constraint for buffer bytes step ret = %d\n" , ret);
Greg Kroah-Hartman
maintainerPATCH 549/737 iommu/amd: Fix pci_segment memleak in alloc_pci_segment()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinhui Guo <[email protected]>
commit 75ba146c2674ba49ed8a222c67f9abfb4a4f2a4f upstream.
Fix a memory leak of struct amd_iommu_pci_segment in alloc_pci_segment() when system memory (or contiguous memory) is insufficient.
--- drivers/iommu/amd/init.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/iommu/amd/init.c +12 -3
@@ -1666,13 +1666,22 @@ static struct amd_iommu_pci_seg *__initlist_add_tail (&pci_seg->list, &amd_iommu_pci_seg_list);if (alloc_dev_table (pci_seg)) -return NULL ; + goto err_free_pci_seg;if (alloc_alias_table (pci_seg)) -return NULL ; + goto err_free_dev_table;if (alloc_rlookup_table (pci_seg)) -return NULL ; + goto err_free_alias_table;return pci_seg; + +err_free_alias_table: +free_alias_table (pci_seg); +err_free_dev_table: +free_dev_table (pci_seg); +err_free_pci_seg: +list_del (&pci_seg->list); +kfree (pci_seg); +return NULL ; } static struct amd_iommu_pci_seg *__init get_pci_segment(u16 id,
Greg Kroah-Hartman
maintainerPATCH 550/737 iommu/apple-dart: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit a6eaa872c52a181ae9a290fd4e40c9df91166d7a upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
--- drivers/iommu/apple-dart.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/apple-dart.c +2 -0
@@ -758,6 +758,8 @@ static int apple_dart_of_xlate(struct destruct apple_dart *cfg_dart;int i, sid; +put_device (&iommu_pdev->dev); +if (args->args_count !=1 )return -EINVAL ; sid = args->args[0 ];
Greg Kroah-Hartman
maintainerPATCH 551/737 iommu/exynos: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 05913cc43cb122f9afecdbe775115c058b906e1b upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
Note that commit 1a26044954a6 ("iommu/exynos: add missing put_device() call in exynos_iommu_of_xlate()") fixed the leak in a couple of error paths, but the reference is still leaking on success.
--- drivers/iommu/exynos-iommu.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/iommu/exynos-iommu.c +3 -6
@@ -1443,17 +1443,14 @@ static int exynos_iommu_of_xlate(structreturn -ENODEV ; data =platform_get_drvdata (sysmmu); -if (!data) { -put_device (&sysmmu->dev); +put_device (&sysmmu->dev); +if (!data)return -ENODEV ; - }if (!owner) { owner =kzalloc (sizeof (*owner),GFP_KERNEL ); -if (!owner) { -put_device (&sysmmu->dev); +if (!owner)return -ENOMEM ; - }INIT_LIST_HEAD (&owner->controllers);mutex_init (&owner->rpm_lock);
Greg Kroah-Hartman
maintainerPATCH 552/737 iommu/ipmmu-vmsa: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 80aa518452c4aceb9459f9a8e3184db657d1b441 upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
--- drivers/iommu/ipmmu-vmsa.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/ipmmu-vmsa.c +2 -0
@@ -681,6 +681,8 @@ static int ipmmu_init_platform_device(stdev_iommu_priv_set (dev,platform_get_drvdata (ipmmu_pdev)); +put_device (&ipmmu_pdev->dev); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 553/737 iommu/mediatek-v1: fix device leak on probe_device()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit c77ad28bfee0df9cbc719eb5adc9864462cfb65b upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during probe_device().
--- drivers/iommu/mtk_iommu_v1.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/mtk_iommu_v1.c +2 -0
@@ -420,6 +420,8 @@ static int mtk_iommu_v1_create_mapping(sreturn -EINVAL ;dev_iommu_priv_set (dev,platform_get_drvdata (m4updev)); + +put_device (&m4updev->dev); } ret =iommu_fwspec_add_ids (dev, args->args,1 );
Greg Kroah-Hartman
maintainerPATCH 554/737 iommu/mediatek-v1: fix device leaks on probe()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 46207625c9f33da0e43bb4ae1e91f0791b6ed633 upstream.
Make sure to drop the references taken to the larb devices during probe on probe failure (e.g. probe deferral) and on driver unbind.
--- drivers/iommu/mtk_iommu_v1.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
drivers/iommu/mtk_iommu_v1.c +18 -5
@@ -654,8 +654,10 @@ static int mtk_iommu_v1_probe(struct plastruct platform_device *plarbdev; larbnode =of_parse_phandle (dev->of_node,"mediatek,larbs" , i); -if (!larbnode) -return -EINVAL ; +if (!larbnode) { + ret = -EINVAL ; + goto out_put_larbs; + }if (!of_device_is_available (larbnode)) {of_node_put (larbnode);
@@ -665,11 +667,14 @@ static int mtk_iommu_v1_probe(struct pla plarbdev =of_find_device_by_node (larbnode);if (!plarbdev) {of_node_put (larbnode); -return -ENODEV ; + ret = -ENODEV ; + goto out_put_larbs; }if (!plarbdev->dev.driver) {of_node_put (larbnode); -return -EPROBE_DEFER ; +put_device (&plarbdev->dev); + ret = -EPROBE_DEFER ; + goto out_put_larbs; } data->larb_imu[i].dev = &plarbdev->dev;
@@ -681,7 +686,7 @@ static int mtk_iommu_v1_probe(struct pla ret =mtk_iommu_v1_hw_init (data);if (ret) -return ret; + goto out_put_larbs; ret =iommu_device_sysfs_add (&data->iommu, &pdev->dev,NULL ,dev_name (&pdev->dev));
@@ -703,12 +708,17 @@ out_sysfs_remove:iommu_device_sysfs_remove (&data->iommu); out_clk_unprepare:clk_disable_unprepare (data->bclk); +out_put_larbs: +for (i =0 ; i <MTK_LARB_NR_MAX ; i++) +put_device (data->larb_imu[i].dev); +return ret; }static void mtk_iommu_v1_remove (struct platform_device *pdev) {struct mtk_iommu_v1_data *data =platform_get_drvdata (pdev); +int i;iommu_device_sysfs_remove (&data->iommu);iommu_device_unregister (&data->iommu);
@@ -716,6 +726,9 @@ static void mtk_iommu_v1_remove(struct pclk_disable_unprepare (data->bclk);devm_free_irq (&pdev->dev, data->irq, data);component_master_del (&pdev->dev, &mtk_iommu_v1_com_ops); + +for (i =0 ; i <MTK_LARB_NR_MAX ; i++) +put_device (data->larb_imu[i].dev); }static int __maybe_unused mtk_iommu_v1_suspend (struct device *dev)
Greg Kroah-Hartman
maintainerPATCH 555/737 iommu/mediatek: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit b3f1ee18280363ef17f82b564fc379ceba9ec86f upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
--- drivers/iommu/mtk_iommu.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/mtk_iommu.c +2 -0
@@ -959,6 +959,8 @@ static int mtk_iommu_of_xlate(struct devreturn -EINVAL ;dev_iommu_priv_set (dev,platform_get_drvdata (m4updev)); + +put_device (&m4updev->dev); }return iommu_fwspec_add_ids (dev, args->args,1 );
Greg Kroah-Hartman
maintainerPATCH 556/737 iommu/omap: fix device leaks on probe_device()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit b5870691065e6bbe6ba0650c0412636c6a239c5a upstream.
Make sure to drop the references taken to the iommu platform devices when looking up their driver data during probe_device().
Note that the arch data device pointer added by commit 604629bcb505 ("iommu/omap: add support for late attachment of iommu devices") has never been used. Remove it to underline that the references are not needed.
--- drivers/iommu/omap-iommu.c | 2 +- drivers/iommu/omap-iommu.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-)
drivers/iommu/omap-iommu.c +1 -1
@@ -1681,6 +1681,7 @@ static struct iommu_device *omap_iommu_p } oiommu =platform_get_drvdata (pdev); +put_device (&pdev->dev);if (!oiommu) {of_node_put (np);kfree (arch_data);
@@ -1688,7 +1689,6 @@ static struct iommu_device *omap_iommu_p } tmp->iommu_dev = oiommu; - tmp->dev = &pdev->dev;of_node_put (np); }
drivers/iommu/omap-iommu.h +0 -2
@@ -88,7 +88,6 @@ struct omap_iommu {/** * struct omap_iommu_arch_data - omap iommu private data * @iommu_dev: handle of the OMAP iommu device -* @dev: handle of the iommu device * * This is an omap iommu private data object, which binds an iommu user * to its iommu device. This object should be placed at the iommu user's
@@ -97,7 +96,6 @@ struct omap_iommu {*/ struct omap_iommu_arch_data {struct omap_iommu *iommu_dev; -struct device *dev; };struct cr_regs {
Greg Kroah-Hartman
maintainerPATCH 557/737 iommu/qcom: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 6a3908ce56e6879920b44ef136252b2f0c954194 upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
Note that commit e2eae09939a8 ("iommu/qcom: add missing put_device() call in qcom_iommu_of_xlate()") fixed the leak in a couple of error paths, but the reference is still leaking on success and late failures.
--- drivers/iommu/arm/arm-smmu/qcom_iommu.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/iommu/arm/arm-smmu/qcom_iommu.c +4 -6
@@ -539,14 +539,14 @@ static int qcom_iommu_of_xlate(struct de qcom_iommu =platform_get_drvdata (iommu_pdev); +put_device (&iommu_pdev->dev); +/* make sure the asid specified in dt is valid, so we don't have * to sanity check this elsewhere: */ if (WARN_ON (asid > qcom_iommu->max_asid) || -WARN_ON (qcom_iommu->ctxs[asid] ==NULL )) { -put_device (&iommu_pdev->dev); +WARN_ON (qcom_iommu->ctxs[asid] ==NULL ))return -EINVAL ; - }if (!dev_iommu_priv_get (dev)) {dev_iommu_priv_set (dev, qcom_iommu);
@@ -555,10 +555,8 @@ static int qcom_iommu_of_xlate(struct de* multiple different iommu devices. Multiple context * banks are ok, but multiple devices are not: */ -if (WARN_ON (qcom_iommu !=dev_iommu_priv_get (dev))) { -put_device (&iommu_pdev->dev); +if (WARN_ON (qcom_iommu !=dev_iommu_priv_get (dev)))return -EINVAL ; - } }return iommu_fwspec_add_ids (dev, &asid,1 );
Greg Kroah-Hartman
maintainerPATCH 558/737 iommu/sun50i: fix device leak on of_xlate()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit f916109bf53864605d10bf6f4215afa023a80406 upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate().
--- drivers/iommu/sun50i-iommu.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/sun50i-iommu.c +2 -0
@@ -824,6 +824,8 @@ static int sun50i_iommu_of_xlate(structdev_iommu_priv_set (dev,platform_get_drvdata (iommu_pdev)); +put_device (&iommu_pdev->dev); +return iommu_fwspec_add_ids (dev, &id,1 ); }
Greg Kroah-Hartman
maintainerPATCH 559/737 iommu/tegra: fix device leak on probe_device()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit c08934a61201db8f1d1c66fcc63fb2eb526b656d upstream.
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during probe_device().
Note that commit 9826e393e4a8 ("iommu/tegra-smmu: Fix missing put_device() call in tegra_smmu_find") fixed the leak in an error path, but the reference is still leaking on success.
--- drivers/iommu/tegra-smmu.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/iommu/tegra-smmu.c +2 -3
@@ -804,10 +804,9 @@ static struct tegra_smmu *tegra_smmu_finreturn NULL ; mc =platform_get_drvdata (pdev); -if (!mc) { -put_device (&pdev->dev); +put_device (&pdev->dev); +if (!mc)return NULL ; - }return mc->smmu; }
Greg Kroah-Hartman
maintainerPATCH 560/737 iommu: disable SVA when CONFIG_X86 is set
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lu Baolu <[email protected]>
commit 72f98ef9a4be30d2a60136dd6faee376f780d06c upstream.
Patch series "Fix stale IOTLB entries for kernel address space", v7.
This proposes a fix for a security vulnerability related to IOMMU Shared Virtual Addressing (SVA). In an SVA context, an IOMMU can cache kernel page table entries. When a kernel page table page is freed and reallocated for another purpose, the IOMMU might still hold stale, incorrect entries. This can be exploited to cause a use-after-free or write-after-free condition, potentially leading to privilege escalation or data corruption.
This solution introduces a deferred freeing mechanism for kernel page table pages, which provides a safe window to notify the IOMMU to invalidate its caches before the page is reused.
This patch (of 8):
In the IOMMU Shared Virtual Addressing (SVA) context, the IOMMU hardware shares and walks the CPU's page tables. The x86 architecture maps the kernel's virtual address space into the upper portion of every process's page table. Consequently, in an SVA context, the IOMMU hardware can walk and cache kernel page table entries.
The Linux kernel currently lacks a notification mechanism for kernel page table changes, specifically when page table pages are freed and reused. The IOMMU driver is only notified of changes to user virtual address mappings. This can cause the IOMMU's internal caches to retain stale entries for kernel VA.
Use-After-Free (UAF) and Write-After-Free (WAF) conditions arise when kernel page table pages are freed and later reallocated. The IOMMU could misinterpret the new data as valid page table entries. The IOMMU might then walk into attacker-controlled memory, leading to arbitrary physical memory DMA access or privilege escalation. This is also a Write-After-Free issue, as the IOMMU will potentially continue to write Accessed and Dirty bits to the freed memory while attempting to walk the stale page tables.
Currently, SVA contexts are unprivileged and cannot access kernel mappings. However, the IOMMU will still walk kernel-only page tables all the way down to the leaf entries, where it realizes the mapping is for the kernel and errors out. This means the IOMMU still caches these intermediate page table entries, making the described vulnerability a real concern.
Disable SVA on x86 architecture until the IOMMU can receive notification to flush the paging cache before freeing the CPU kernel page table pages.
--- drivers/iommu/iommu-sva.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/iommu/iommu-sva.c +3 -0
@@ -71,6 +71,9 @@ struct iommu_sva *iommu_sva_bind_device(if (!handle)return ERR_PTR (-ENOMEM ); +if (IS_ENABLED (CONFIG_X86 )) +return ERR_PTR (-EOPNOTSUPP ); +mutex_lock (&iommu_sva_lock);/* Search for an existing domain. */ domain = iommu_get_domain_for_dev_pasid(dev, mm->pasid,
Greg Kroah-Hartman
maintainerPATCH 561/737 HID: logitech-dj: Remove duplicate error logging
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit ca389a55d8b2d86a817433bf82e0602b68c4d541 upstream.
logi_dj_recv_query_paired_devices() and logi_dj_recv_switch_to_dj_mode() both have 2 callers which all log an error if the function fails. Move the error logging to inside these 2 functions to remove the duplicated error logging in the callers.
While at it also move the logi_dj_recv_send_report() call error handling in logi_dj_recv_switch_to_dj_mode() to directly after the call. That call only fails if the report cannot be found and in that case it does nothing, so the msleep() is not necessary on failures.
--- drivers/hid/hid-logitech-dj.c | 56 +++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 33 deletions(-)
drivers/hid/hid-logitech-dj.c +23 -33
@@ -805,7 +805,6 @@ static void delayedwork_callback(structstruct dj_workitem workitem;unsigned long flags;int count; -int retval;dbg_hid ("%s\n" , __func__);
@@ -842,11 +841,7 @@ static void delayedwork_callback(structlogi_dj_recv_destroy_djhid_device (djrcv_dev, &workitem);break ;case WORKITEM_TYPE_UNKNOWN : - retval =logi_dj_recv_query_paired_devices (djrcv_dev); -if (retval) { -hid_err (djrcv_dev->hidpp,"%s: logi_dj_recv_query_paired_devices error: %d\n" , - __func__, retval); - } +logi_dj_recv_query_paired_devices (djrcv_dev);break ;case WORKITEM_TYPE_EMPTY :dbg_hid ("%s: device list is empty\n" , __func__);
@@ -1239,8 +1234,10 @@ static int logi_dj_recv_query_paired_dev djrcv_dev->last_query = jiffies; -if (djrcv_dev->type != recvr_type_dj) -return logi_dj_recv_query_hidpp_devices (djrcv_dev); +if (djrcv_dev->type != recvr_type_dj) { + retval =logi_dj_recv_query_hidpp_devices (djrcv_dev); + goto out; + } dj_report =kzalloc (sizeof (struct dj_report ),GFP_KERNEL );if (!dj_report)
@@ -1250,6 +1247,10 @@ static int logi_dj_recv_query_paired_dev dj_report->report_type =REPORT_TYPE_CMD_GET_PAIRED_DEVICES ; retval =logi_dj_recv_send_report (djrcv_dev, dj_report);kfree (dj_report); +out: +if (retval <0 ) +hid_err (djrcv_dev->hidpp,"%s error:%d\n" , __func__, retval); +return retval; }
@@ -1275,6 +1276,8 @@ static int logi_dj_recv_switch_to_dj_mod (u8 )timeout; retval =logi_dj_recv_send_report (djrcv_dev, dj_report); +if (retval) + goto out;/* * Ugly sleep to work around a USB 3.0 bug when the receiver is
@@ -1283,11 +1286,6 @@ static int logi_dj_recv_switch_to_dj_mod* 50 msec should gives enough time to the receiver to be ready. */ msleep (50 ); - -if (retval) { -kfree (dj_report); -return retval; - } }/*
@@ -1313,7 +1311,12 @@ static int logi_dj_recv_switch_to_dj_modHIDPP_REPORT_SHORT_LENGTH ,HID_OUTPUT_REPORT , HID_REQ_SET_REPORT); +out:kfree (dj_report); + +if (retval <0 ) +hid_err (hdev,"%s error:%d\n" , __func__, retval); +return retval; }
@@ -1835,11 +1838,8 @@ static int logi_dj_probe(struct hid_deviif (has_hidpp) { retval =logi_dj_recv_switch_to_dj_mode (djrcv_dev,0 ); -if (retval <0 ) { -hid_err (hdev,"%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n" , - __func__, retval); +if (retval <0 ) goto switch_to_dj_mode_fail; - } }/* This is enabling the polling urb on the IN endpoint */
@@ -1857,15 +1857,11 @@ static int logi_dj_probe(struct hid_devispin_lock_irqsave (&djrcv_dev->lock, flags); djrcv_dev->ready = true;spin_unlock_irqrestore (&djrcv_dev->lock, flags); - retval =logi_dj_recv_query_paired_devices (djrcv_dev); -if (retval <0 ) { -hid_err (hdev,"%s: logi_dj_recv_query_paired_devices error:%d\n" , - __func__, retval); -/* -* This can happen with a KVM, let the probe succeed, -* logi_dj_recv_queue_unknown_work will retry later. -*/ - } +/* +* This can fail with a KVM. Ignore errors to let the probe +* succeed, logi_dj_recv_queue_unknown_work will retry later. +*/ +logi_dj_recv_query_paired_devices (djrcv_dev); }return 0 ;
@@ -1882,18 +1878,12 @@ hid_hw_start_fail:#ifdef CONFIG_PM static int logi_dj_reset_resume (struct hid_device *hdev) { -int retval;struct dj_receiver_dev *djrcv_dev =hid_get_drvdata (hdev);if (!djrcv_dev || djrcv_dev->hidpp != hdev)return 0 ; - retval =logi_dj_recv_switch_to_dj_mode (djrcv_dev,0 ); -if (retval <0 ) { -hid_err (hdev,"%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n" , - __func__, retval); - } - +logi_dj_recv_switch_to_dj_mode (djrcv_dev,0 );return 0 ; }#endif
Greg Kroah-Hartman
maintainerPATCH 562/737 PCI/PM: Reinstate clearing state_saved in legacy and !PM codepaths
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Wunner <[email protected]>
commit 894f475f88e06c0f352c829849560790dbdedbe5 upstream.
When a PCI device is suspended, it is normally the PCI core's job to save Config Space and put the device into a low power state. However drivers are allowed to assume these responsibilities. When they do, the PCI core can tell by looking at the state_saved flag in struct pci_dev: The flag is cleared before commencing the suspend sequence and it is set when pci_save_state() is called. If the PCI core finds the flag set late in the suspend sequence, it refrains from calling pci_save_state() itself.
But there are two corner cases where the PCI core neglects to clear the flag before commencing the suspend sequence:
* If a driver has legacy PCI PM callbacks, pci_legacy_suspend() neglects to clear the flag. The (stale) flag is subsequently queried by pci_legacy_suspend() itself and pci_legacy_suspend_late().
* If a device has no driver or its driver has no PCI PM callbacks, pci_pm_freeze() neglects to clear the flag. The (stale) flag is subsequently queried by pci_pm_freeze_noirq().
The flag may be set prior to suspend if the device went through error
recovery: Drivers commonly invoke pci_restore_state() + pci_save_state() to restore Config Space after reset.
The flag may also be set if drivers call pci_save_state() on probe to allow for recovery from subsequent errors.
The result is that pci_legacy_suspend_late() and pci_pm_freeze_noirq() don't call pci_save_state() and so the state that will be restored on resume is the one recorded on last error recovery or on probe, not the one that the device had on suspend. If the two states happen to be identical, there's no problem.
Reinstate clearing the flag in pci_legacy_suspend() and pci_pm_freeze(). The two functions used to do that until commit 4b77b0a2ba27 ("PCI: Clear saved_state after the state has been restored") deemed it unnecessary because it assumed that it's sufficient to clear the flag on resume in pci_restore_state(). The commit seemingly did not take into account that pci_save_state() and pci_restore_state() are not only used by power management code, but also for error recovery.
Devices without driver or whose driver has no PCI PM callbacks may be in runtime suspend when pci_pm_freeze() is called. Their state has already been saved, so don't clear the flag to skip a pointless pci_save_state() in pci_pm_freeze_noirq().
None of the drivers with legacy PCI PM callbacks seem to use runtime PM, so clear the flag unconditionally in their case.
--- drivers/pci/pci-driver.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pci/pci-driver.c +4 -0
@@ -644,6 +644,8 @@ static int pci_legacy_suspend(struct devstruct pci_dev *pci_dev =to_pci_dev (dev);struct pci_driver *drv = pci_dev->driver; + pci_dev->state_saved = false; +if (drv && drv->suspend) {pci_power_t prev = pci_dev->current_state;int error;
@@ -1048,6 +1050,8 @@ static int pci_pm_freeze(struct device *if (!pm) {pci_pm_default_suspend (pci_dev); +if (!pm_runtime_suspended (dev)) + pci_dev->state_saved = false;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 563/737 arm64: dts: ti: k3-j721e-sk: Fix pinmux for pin Y1 used by power regulator
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Siddharth Vadapalli <[email protected]>
commit 51f89c488f2ecc020f82bfedd77482584ce8027a upstream.
The SoC pin Y1 is incorrectly defined in the WKUP Pinmux device-tree node (pinctrl@4301c000) leading to the following silent failure:
pinctrl-single 4301c000.pinctrl: mux offset out of range: 0x1dc (0x178)
According to the datasheet for the J721E SoC [0], the pin Y1 belongs to the MAIN Pinmux device-tree node (pinctrl@11c000). This is confirmed by the address of the pinmux register for it on page 142 of the datasheet which is 0x00011C1DC.
Hence fix it.
[0]: https://www.ti.com/lit/ds/symlink/tda4vm.pdf
--- arch/arm64/boot/dts/ti/k3-j721e-sk.dts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/arm64/boot/dts/ti/k3-j721e-sk.dts +6 -6
@@ -571,6 +571,12 @@ J721E_IOPAD(0x234, PIN_INPUT, 7) /* (U3) EXT_REFCLK1.GPIO1_12 */ >; }; + + vdd_sd_dv_pins_default: vdd-sd-dv-default-pins { + pinctrl-single,pins = < + J721E_IOPAD(0x1dc, PIN_OUTPUT, 7) /* (Y1) SPI1_CLK.GPIO0_118 */ + >; + }; }; &wkup_pmx0 {
@@ -626,12 +632,6 @@ >; }; - vdd_sd_dv_pins_default: vdd-sd-dv-default-pins { - pinctrl-single,pins = < - J721E_IOPAD(0x1dc, PIN_OUTPUT, 7) /* (Y1) SPI1_CLK.GPIO0_118 */ - >; - }; - wkup_uart0_pins_default: wkup-uart0-default-pins { pinctrl-single,pins = < J721E_WKUP_IOPAD(0xa0, PIN_INPUT, 0) /* (J29) WKUP_UART0_RXD */
Greg Kroah-Hartman
maintainerPATCH 564/737 powerpc, mm: Fix mprotect on book3s 32-bit
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Vasilevsky <[email protected]>
commit 78fc63ffa7813e33681839bb33826c24195f0eb7 upstream.
On 32-bit book3s with hash-MMUs, tlb_flush() was a no-op. This was unnoticed because all uses until recently were for unmaps, and thus handled by __tlb_remove_tlb_entry().
After commit 4a18419f71cd ("mm/mprotect: use mmu_gather") in kernel 5.19, tlb_gather_mmu() started being used for mprotect as well. This caused mprotect to simply not work on these machines:
int *ptr = mmap(NULL, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
*ptr = 1; // force HPTE to be created
mprotect(ptr, 4096, PROT_READ);
*ptr = 2; // should segfault, but succeeds
Fixed by making tlb_flush() actually flush TLB pages. This finally agrees with the behaviour of boot3s64's tlb_flush().
--- arch/powerpc/include/asm/book3s/32/tlbflush.h | 5 ++++- arch/powerpc/mm/book3s32/tlb.c | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-)
arch/powerpc/include/asm/book3s/32/tlbflush.h +4 -1
@@ -11,6 +11,7 @@void hash__flush_tlb_mm (struct mm_struct *mm);void hash__flush_tlb_page (struct vm_area_struct *vma,unsigned long vmaddr);void hash__flush_range (struct mm_struct *mm,unsigned long start,unsigned long end); +void hash__flush_gather (struct mmu_gather *tlb);#ifdef CONFIG_SMP void _tlbie (unsigned long address);
@@ -29,7 +30,9 @@ void _tlbia(void);static inline void tlb_flush (struct mmu_gather *tlb) {/* 603 needs to flush the whole TLB here since it doesn't use a hash table. */ -if (!mmu_has_feature (MMU_FTR_HPTE_TABLE )) +if (mmu_has_feature (MMU_FTR_HPTE_TABLE )) +hash__flush_gather (tlb); +else _tlbia (); }
arch/powerpc/mm/book3s32/tlb.c +9 -0
@@ -105,3 +105,12 @@ void hash__flush_tlb_page(struct vm_areaflush_hash_pages (mm->context.id, vmaddr,pmd_val (*pmd),1 ); }EXPORT_SYMBOL (hash__flush_tlb_page); + +void hash__flush_gather (struct mmu_gather *tlb) +{ +if (tlb->fullmm || tlb->need_flush_all) +hash__flush_tlb_mm (tlb->mm); +else +hash__flush_range (tlb->mm, tlb->start, tlb->end); +} +EXPORT_SYMBOL (hash__flush_gather);
Greg Kroah-Hartman
maintainerPATCH 565/737 powerpc/64s/slb: Fix SLB multihit issue during SLB preload
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Donet Tom <[email protected]>
commit 00312419f0863964625d6dcda8183f96849412c6 upstream.
On systems using the hash MMU, there is a software SLB preload cache that mirrors the entries loaded into the hardware SLB buffer. This preload cache is subject to periodic eviction — typically after every 256 context switches — to remove old entry.
To optimize performance, the kernel skips switch_mmu_context() in switch_mm_irqs_off() when the prev and next mm_struct are the same. However, on hash MMU systems, this can lead to inconsistencies between the hardware SLB and the software preload cache.
If an SLB entry for a process is evicted from the software cache on one CPU, and the same process later runs on another CPU without executing switch_mmu_context(), the hardware SLB may retain stale entries. If the kernel then attempts to reload that entry, it can trigger an SLB multi-hit error.
The following timeline shows how stale SLB entries are created and can cause a multi-hit error when a process moves between CPUs without a MMU context switch.
CPU 0 CPU 1
----- -----
Process P
exec swapper/1
load_elf_binary
begin_new_exc
activate_mm
switch_mm_irqs_off
switch_mmu_context
switch_slb
/*
* This invalidates all
* the entries in the HW
* and setup the new HW
* SLB entries as per the
* preload cache.
*/context_switchsched_migrate_task migrates process P to cpu-1
Process swapper/0 context switch (to process P)
(uses mm_struct of Process P) switch_mm_irqs_off()
switch_slb
load_slb++
/*
* load_slb becomes 0 here
* and we evict an entry from
* the preload cache with
* preload_age(). We still
* keep HW SLB and preload
* cache in sync, that is
* because all HW SLB entries
* anyways gets evicted in
* switch_slb during SLBIA.
* We then only add those
* entries back in HW SLB,
* which are currently
* present in preload_cache
* (after eviction). */
load_elf_binary continues...
setup_new_exec()
slb_setup_new_exec()
sched_switch event sched_migrate_task migrates process P to cpu-0
context_switch from swapper/0 to Process P
switch_mm_irqs_off()
/*
* Since both prev and next mm struct are same we don't call
* switch_mmu_context(). This will cause the HW SLB and SW preload
* cache to go out of sync in preload_new_slb_context. Because there
* was an SLB entry which was evicted from both HW and preload cache
* on cpu-1. Now later in preload_new_slb_context(), when we will try
* to add the same preload entry again, we will add this to the SW
* preload cache and then will add it to the HW SLB. Since on cpu-0
* this entry was never invalidated, hence adding this entry to the HW
* SLB will cause a SLB multi-hit error.
*/load_elf_binary continues...
START_THREAD
start_thread
preload_new_slb_context
/*
* This tries to add a new EA to preload cache which was earlier
* evicted from both cpu-1 HW SLB and preload cache. This caused the
* HW SLB of cpu-0 to go out of sync with the SW preload cache. The
* reason for this was, that when we context switched back on CPU-0,
* we should have ideally called switch_mmu_context() which will
* bring the HW SLB entries on CPU-0 in sync with SW preload cache
* entries by setting up the mmu context properly. But we didn't do
* that since the prev mm_struct running on cpu-0 was same as the
* next mm_struct (which is true for swapper / kernel threads). So
* now when we try to add this new entry into the HW SLB of cpu-0,
* we hit a SLB multi-hit error.
*/
WARNING: CPU: 0 PID: 1810970 at arch/powerpc/mm/book3s64/slb.c:62 assert_slb_presence+0x2c/0x50(48 results) 02:47:29 [20157/42149] Modules linked in: CPU: 0 UID: 0 PID: 1810970 Comm: dd Not tainted 6.16.0-rc3-dirty #12 VOLUNTARY Hardware name: IBM pSeries (emulated by qemu) POWER8 (architected) 0x4d0200 0xf000004 of:SLOF,HEAD hv:linux,kvm pSeries NIP: c00000000015426c LR: c0000000001543b4 CTR: 0000000000000000 REGS: c0000000497c77e0 TRAP: 0700 Not tainted (6.16.0-rc3-dirty) MSR: 8000000002823033 <SF,VEC,VSX,FP,ME,IR,DR,RI,LE> CR: 28888482 XER: 00000000 CFAR: c0000000001543b0 IRQMASK: 3 <...> NIP [c00000000015426c] assert_slb_presence+0x2c/0x50 LR [c0000000001543b4] slb_insert_entry+0x124/0x390 Call Trace: 0x7fffceb5ffff (unreliable) preload_new_slb_context+0x100/0x1a0 start_thread+0x26c/0x420 load_elf_binary+0x1b04/0x1c40 bprm_execve+0x358/0x680 do_execveat_common+0x1f8/0x240 sys_execve+0x58/0x70 system_call_exception+0x114/0x300 system_call_common+0x160/0x2c4
Quoted 1 line
From the above analysis, during early exec the hardware SLB is cleared,
and entries from the software preload cache are reloaded into hardware by switch_slb. However, preload_new_slb_context and slb_setup_new_exec also attempt to load some of the same entries, which can trigger a multi-hit. In most cases, these additional preloads simply hit existing entries and add nothing new. Removing these functions avoids redundant preloads and eliminates the multi-hit issue. This patch removes these two functions.
We tested process switching performance using the context_switch benchmark on POWER9/hash, and observed no regression.
Without this patch: 129041 ops/sec With this patch: 129341 ops/sec
We also measured SLB faults during boot, and the counts are essentially the same with and without this patch.
SLB faults without this patch: 19727 SLB faults with this patch: 19786
--- arch/powerpc/include/asm/book3s/64/mmu-hash.h | 1 arch/powerpc/kernel/process.c | 5 - arch/powerpc/mm/book3s64/internal.h | 2 arch/powerpc/mm/book3s64/mmu_context.c | 2 arch/powerpc/mm/book3s64/slb.c | 88 -------------------------- 5 files changed, 98 deletions(-)
arch/powerpc/include/asm/book3s/64/mmu-hash.h +0 -1
@@ -524,7 +524,6 @@ void slb_save_contents(struct slb_entryvoid slb_dump_contents (struct slb_entry *slb_ptr);extern void slb_vmalloc_update (void ); -void preload_new_slb_context (unsigned long start,unsigned long sp);#ifdef CONFIG_PPC_64S_HASH_MMU void slb_set_size (u16 size);
arch/powerpc/kernel/process.c +0 -5
@@ -1882,8 +1882,6 @@ int copy_thread(struct task_struct *p, creturn 0 ; } -void preload_new_slb_context (unsigned long start,unsigned long sp); -/* * Set up a thread for executing a new program */
@@ -1891,9 +1889,6 @@ void start_thread(struct pt_regs *regs, {#ifdef CONFIG_PPC64 unsigned long load_addr = regs->gpr[2 ];/* saved by ELF_PLAT_INIT */ - -if (IS_ENABLED (CONFIG_PPC_BOOK3S_64 ) && !radix_enabled ()) -preload_new_slb_context (start, sp);#endif #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
arch/powerpc/mm/book3s64/internal.h +0 -2
@@ -24,8 +24,6 @@ static inline bool stress_hpt(void)void hpt_do_stress (unsigned long ea,unsigned long hpte_group); -void slb_setup_new_exec (void ); -void exit_lazy_flush_tlb (struct mm_struct *mm,bool always_flush);#endif /* ARCH_POWERPC_MM_BOOK3S64_INTERNAL_H */
arch/powerpc/mm/book3s64/mmu_context.c +0 -2
@@ -150,8 +150,6 @@ static int hash__init_new_context(structvoid hash__setup_new_exec (void ) {slice_setup_new_exec (); - -slb_setup_new_exec (); }#else static inline int hash__init_new_context (struct mm_struct *mm)
arch/powerpc/mm/book3s64/slb.c +0 -88
94 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 566/737 leds: leds-lp50xx: Allow LED 0 to be added to module bank
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Hitz <[email protected]>
commit 26fe74d598c32e7bc6f150edfc4aa43e1bee55db upstream.
led_banks contains LED module number(s) that should be grouped into the module bank. led_banks is 0-initialized.
By checking the led_banks entries for 0, un-set entries are detected. But a 0-entry also indicates that LED module 0 should be grouped into the module bank.
By only iterating over the available entries no check for unused entries is required and LED module 0 can be added to bank.
--- drivers/leds/leds-lp50xx.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/leds/leds-lp50xx.c +4 -6
@@ -346,17 +346,15 @@ out:return ret; } -static int lp50xx_set_banks (struct lp50xx *priv,u32 led_banks[]) +static int lp50xx_set_banks (struct lp50xx *priv,u32 led_banks[],int num_leds) {u8 led_config_lo, led_config_hi;u32 bank_enable_mask =0 ;int ret;int i; -for (i =0 ; i < priv->chip_info->max_modules; i++) { -if (led_banks[i]) - bank_enable_mask |= (1 << led_banks[i]); - } +for (i =0 ; i < num_leds; i++) + bank_enable_mask |= (1 << led_banks[i]); led_config_lo = bank_enable_mask; led_config_hi = bank_enable_mask >>8 ;
@@ -412,7 +410,7 @@ static int lp50xx_probe_leds(struct fwnoreturn ret; } - ret =lp50xx_set_banks (priv, led_banks); + ret =lp50xx_set_banks (priv, led_banks, num_leds);if (ret) {dev_err (priv->dev,"Cannot setup banked LEDs\n" );return ret;
Greg Kroah-Hartman
maintainerPATCH 567/737 leds: leds-lp50xx: LP5009 supports 3 modules for a total of 9 LEDs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Hitz <[email protected]>
commit 5246e3673eeeccb4f5bf4f42375dd495d465ac15 upstream.
LP5009 supports 9 LED outputs that are grouped into 3 modules.
--- drivers/leds/leds-lp50xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/leds/leds-lp50xx.c +1 -1
@@ -56,7 +56,7 @@/* There are 3 LED outputs per bank */ #define LP50XX_LEDS_PER_MODULE 3 -#define LP5009_MAX_LED_MODULES 2 +#define LP5009_MAX_LED_MODULES 3#define LP5012_MAX_LED_MODULES 4#define LP5018_MAX_LED_MODULES 6#define LP5024_MAX_LED_MODULES 8