6.12.2-rc1 review
Subsystems (8)
Greg Kroah-Hartman
maintainerPATCH 478/826 perf test attr: Add back missing topdown events
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Veronika Molnarova <[email protected]>
[ Upstream commit 6bff76af9635411214ca44ea38fc2781e78064b6 ]
With the patch 0b6c5371c03c "Add missing topdown metrics events" eight topdown metric events with numbers ranging from 0x8000 to 0x8700 were added to the test since they were added as 'perf stat' default events. Later the patch 951efb9976ce "Update no event/metric expectations" kept only 4 of those events(0x8000-0x8300).
Currently, the topdown events with numbers 0x8400 to 0x8700 are missing from the list of expected events resulting in a failure. Add back the missing topdown events.
--- tools/perf/tests/attr/test-stat-default | 90 ++++++++++---- tools/perf/tests/attr/test-stat-detailed-1 | 106 +++++++++++----- tools/perf/tests/attr/test-stat-detailed-2 | 130 ++++++++++++------- tools/perf/tests/attr/test-stat-detailed-3 | 138 ++++++++++++++------- 4 files changed, 320 insertions(+), 144 deletions(-)
tools/perf/tests/attr/test-stat-default +67 -23
@@ -88,98 +88,142 @@ enable_on_exec=0 read_format=15 optional=1 -# PERF_TYPE_RAW / topdown-fe-bound (0x8200) +# PERF_TYPE_RAW / topdown-bad-spec (0x8100) [event13:base-stat] fd=13 group_fd=11 type=4 -config=33280 +config=33024 disabled=0 enable_on_exec=0 read_format=15 optional=1 -# PERF_TYPE_RAW / topdown-be-bound (0x8300) +# PERF_TYPE_RAW / topdown-fe-bound (0x8200) [event14:base-stat] fd=14 group_fd=11 type=4 -config=33536 +config=33280 disabled=0 enable_on_exec=0 read_format=15 optional=1 -# PERF_TYPE_RAW / topdown-bad-spec (0x8100) +# PERF_TYPE_RAW / topdown-be-bound (0x8300) [event15:base-stat] fd=15 group_fd=11 type=4 -config=33024 +config=33536 disabled=0 enable_on_exec=0 read_format=15 optional=1 -# PERF_TYPE_RAW / INT_MISC.UOP_DROPPING +# PERF_TYPE_RAW / topdown-heavy-ops (0x8400) [event16:base-stat] fd=16 +group_fd=11 type=4 -config=4109 +config=33792 +disabled=0 +enable_on_exec=0 +read_format=15 optional=1 -# PERF_TYPE_RAW / cpu/INT_MISC.RECOVERY_CYCLES,cmask=1,edge/ +# PERF_TYPE_RAW / topdown-br-mispredict (0x8500) [event17:base-stat] fd=17 +group_fd=11 type=4 -config=17039629 +config=34048 +disabled=0 +enable_on_exec=0 +read_format=15 optional=1 -# PERF_TYPE_RAW / CPU_CLK_UNHALTED.THREAD +# PERF_TYPE_RAW / topdown-fetch-lat (0x8600) [event18:base-stat] fd=18 +group_fd=11 type=4 -config=60 +config=34304 +disabled=0 +enable_on_exec=0 +read_format=15 optional=1 -# PERF_TYPE_RAW / INT_MISC.RECOVERY_CYCLES_ANY +# PERF_TYPE_RAW / topdown-mem-bound (0x8700) [event19:base-stat] fd=19 +group_fd=11 type=4 -config=2097421 +config=34560 +disabled=0 +enable_on_exec=0 +read_format=15 optional=1 -# PERF_TYPE_RAW / CPU_CLK_UNHALTED.REF_XCLK +# PERF_TYPE_RAW / INT_MISC.UOP_DROPPING [event20:base-stat] fd=20 type=4 -config=316 +config=4109 optional=1 -# PERF_TYPE_RAW / IDQ_UOPS_NOT_DELIVERED.CORE +# PERF_TYPE_RAW / cpu/INT_MISC.RECOVERY_CYCLES,cmask=1,edge/ [event21:base-stat] fd=21 type=4 -config=412 +config=17039629 optional=1 -# PERF_TYPE_RAW / CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE +# PERF_TYPE_RAW / CPU_CLK_UNHALTED.THREAD [event22:base-stat] fd=22 type=4 -config=572 +config=60 optional=1 -# PERF_TYPE_RAW / UOPS_RETIRED.RETIRE_SLOTS +# PERF_TYPE_RAW / INT_MISC.RECOVERY_CYCLES_ANY [event23:base-stat] fd=23 type=4 -config=706 +config=2097421 optional=1 -# PERF_TYPE_RAW / UOPS_ISSUED.ANY +# PERF_TYPE_RAW / CPU_CLK_UNHALTED.REF_XCLK [event24:base-stat] fd=24 type=4 +config=316 +optional=1 + +# PERF_TYPE_RAW / IDQ_UOPS_NOT_DELIVERED.CORE +[event25:base-stat] +fd=25 +type=4 +config=412 +optional=1 + +# PERF_TYPE_RAW / CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE +[event26:base-stat] +fd=26 +type=4 +config=572 +optional=1 + +# PERF_TYPE_RAW / UOPS_RETIRED.RETIRE_SLOTS +[event27:base-stat] +fd=27 +type=4 +config=706 +optional=1 + +# PERF_TYPE_RAW / UOPS_ISSUED.ANY +[event28:base-stat] +fd=28 +type=4 config=270 optional=1
tools/perf/tests/attr/test-stat-detailed-1 +75 -31
206 lines not on this page · raw message
tools/perf/tests/attr/test-stat-detailed-2 +87 -43
266 lines not on this page · raw message
tools/perf/tests/attr/test-stat-detailed-3 +91 -47
286 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 479/826 rust: rbtree: fix `SAFETY` comments that should be `# Safety` sections
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miguel Ojeda <[email protected]>
[ Upstream commit 8333ff4d0799aafbe4275cddcbaf45e545e4efba ]
The tag SAFETY is used for safety comments, i.e. // SAFETY, while a Safety section is used for safety preconditions in code documentation, i.e. /// # Safety.
Fix the three instances recently added in rbtree that Clippy would have normally caught in a public item, so that we can enable checking of private items in one of the following commits.
--- rust/kernel/rbtree.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
rust/kernel/rbtree.rs +6 -3
@@ -884,7 +884,8 @@ fn get_neighbor_raw(&self, direction: Direction) -> Option<NonNull<bindings::rb_NonNull ::new (neighbor) } -/// SAFETY: +/// # Safety +/// /// - `node` must be a valid pointer to a node in an [`RBTree`]. /// - The caller has immutable access to `node` for the duration of 'b. unsafe fn to_key_value <'b>(node:NonNull <bindings::rb_node >) -> (&'bK , &'bV ) {
@@ -894,7 +895,8 @@ unsafe fn to_key_value<'b>(node: NonNull<bindings::rb_node>) -> (&'b K, &'b V) { (k,unsafe { &*v }) } -/// SAFETY: +/// # Safety +/// /// - `node` must be a valid pointer to a node in an [`RBTree`]. /// - The caller has mutable access to `node` for the duration of 'b. unsafe fn to_key_value_mut <'b>(node:NonNull <bindings::rb_node >) -> (&'bK , &'bmut V ) {
@@ -904,7 +906,8 @@ unsafe fn to_key_value_mut<'b>(node: NonNull<bindings::rb_node>) -> (&'b K, &'b (k,unsafe { &mut *v }) } -/// SAFETY: +/// # Safety +/// /// - `node` must be a valid pointer to a node in an [`RBTree`]. /// - The caller has immutable access to the key for the duration of 'b. unsafe fn to_key_value_raw <'b>(node:NonNull <bindings::rb_node >) -> (&'bK , *mut V ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 480/826 f2fs: compress: fix inconsistent update of i_blocks in release_compress_blocks and reserve_compress_blocks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qi Han <[email protected]>
[ Upstream commit 26413ce18e85de3dda2cd3d72c3c3e8ab8f4f996 ]
After release a file and subsequently reserve it, the FSCK flag is set when the file is deleted, as shown in the following backtrace:
F2FS-fs (dm-48): Inconsistent i_blocks, ino:401231, iblocks:1448, sectors:1472
fs_rec_info_write_type+0x58/0x274 f2fs_rec_info_write+0x1c/0x2c set_sbi_flag+0x74/0x98 dec_valid_block_count+0x150/0x190 f2fs_truncate_data_blocks_range+0x2d4/0x3cc f2fs_do_truncate_blocks+0x2fc/0x5f0 f2fs_truncate_blocks+0x68/0x100 f2fs_truncate+0x80/0x128 f2fs_evict_inode+0x1a4/0x794 evict+0xd4/0x280 iput+0x238/0x284 do_unlinkat+0x1ac/0x298 __arm64_sys_unlinkat+0x48/0x68 invoke_syscall+0x58/0x11c
For clusters of the following type, i_blocks are decremented by 1 and i_compr_blocks are incremented by 7 in release_compress_blocks, while updates to i_blocks and i_compr_blocks are skipped in reserve_compress_blocks.
raw node:
D D D D D D D D
after compress:
C D D D D D D D
after reserve:
C D D D D D D D
Let's update i_blocks and i_compr_blocks properly in reserve_compress_blocks.
--- fs/f2fs/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/file.c +1 -1
@@ -3792,7 +3792,7 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count, to_reserved = cluster_size - compr_blocks - reserved;/* for the case all blocks in cluster were reserved */ -if (to_reserved ==1 ) { +if (reserved && to_reserved ==1 ) { dn->ofs_in_node += cluster_size; goto next; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 481/826 f2fs: fix null-ptr-deref in f2fs_submit_page_bio()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ye Bin <[email protected]>
[ Upstream commit b7d0a97b28083084ebdd8e5c6bccd12e6ec18faa ]
There's issue as follows when concurrently installing the f2fs.ko module and mounting the f2fs file system:
KASAN: null-ptr-deref in range [0x0000000000000020-0x0000000000000027] RIP: 0010:__bio_alloc+0x2fb/0x6c0 [f2fs] Call Trace: <TASK> f2fs_submit_page_bio+0x126/0x8b0 [f2fs] __get_meta_page+0x1d4/0x920 [f2fs] get_checkpoint_version.constprop.0+0x2b/0x3c0 [f2fs] validate_checkpoint+0xac/0x290 [f2fs] f2fs_get_valid_checkpoint+0x207/0x950 [f2fs] f2fs_fill_super+0x1007/0x39b0 [f2fs] mount_bdev+0x183/0x250 legacy_get_tree+0xf4/0x1e0 vfs_get_tree+0x88/0x340 do_new_mount+0x283/0x5e0 path_mount+0x2b2/0x15b0 __x64_sys_mount+0x1fe/0x270 do_syscall_64+0x5f/0x170 entry_SYSCALL_64_after_hwframe+0x76/0x7e
Above issue happens as the biset of the f2fs file system is not initialized before register "f2fs_fs_type".
To address above issue just register "f2fs_fs_type" at the last in init_f2fs_fs(). Ensure that all f2fs file system resources are initialized.
--- fs/f2fs/super.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
fs/f2fs/super.c +6 -6
@@ -4991,9 +4991,6 @@ static int __init init_f2fs_fs(void) err =f2fs_init_shrinker ();if (err) goto free_sysfs; - err =register_filesystem (&f2fs_fs_type); -if (err) - goto free_shrinker;f2fs_create_root_stats (); err =f2fs_init_post_read_processing ();if (err)
@@ -5016,7 +5013,12 @@ static int __init init_f2fs_fs(void) err =f2fs_create_casefold_cache ();if (err) goto free_compress_cache; + err =register_filesystem (&f2fs_fs_type); +if (err) + goto free_casefold_cache;return 0 ; +free_casefold_cache: +f2fs_destroy_casefold_cache (); free_compress_cache:f2fs_destroy_compress_cache (); free_compress_mempool:
@@ -5031,8 +5033,6 @@ static int __init init_f2fs_fs(void)f2fs_destroy_post_read_processing (); free_root_stats:f2fs_destroy_root_stats (); -unregister_filesystem (&f2fs_fs_type); -free_shrinker:f2fs_exit_shrinker (); free_sysfs:f2fs_exit_sysfs ();
@@ -5056,6 +5056,7 @@ static int __init init_f2fs_fs(void) static void __exit exit_f2fs_fs(void) { +unregister_filesystem (&f2fs_fs_type);f2fs_destroy_casefold_cache ();f2fs_destroy_compress_cache ();f2fs_destroy_compress_mempool ();
@@ -5064,7 +5065,6 @@ static void __exit exit_f2fs_fs(void)f2fs_destroy_iostat_processing ();f2fs_destroy_post_read_processing ();f2fs_destroy_root_stats (); -unregister_filesystem (&f2fs_fs_type);f2fs_exit_shrinker ();f2fs_exit_sysfs ();f2fs_destroy_garbage_collection_cache ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 482/826 mailbox, remoteproc: k3-m4+: fix compile testing
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 9c12b96ee244b9679629ac430c375a720bfec04b ]
The k3-m4 remoteproc driver was merged with incorrect dependencies. Despite multiple people trying to fix this, the version 6.12-rc2 remains broken and causes a build failure with CONFIG_TI_SCI_PROTOCOL=m when the driver is built-in.
arm-linux-gnueabi-ld: drivers/remoteproc/ti_k3_m4_remoteproc.o: in function `k3_m4_rproc_probe':
ti_k3_m4_remoteproc.c:(.text.k3_m4_rproc_probe+0x76): undefined reference to `devm_ti_sci_get_by_phandle'
Fix the dependency again to make it work in all configurations. The 'select OMAP2PLUS_MBOX' no longer matches what the other drivers dependencies. The link failure can be avoided with a simple 'depends do, so turn that into the same 'depends' to ensure we get no circular on TI_SCI_PROTOCOL', but the extra COMPILE_TEST alternative is what we use elsehwere. On the other hand, building for OMAP2PLUS makes no sense since the hardware only exists on K3.
--- drivers/remoteproc/Kconfig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/remoteproc/Kconfig +3 -3
@@ -341,9 +341,9 @@ config TI_K3_DSP_REMOTEPROC config TI_K3_M4_REMOTEPROC tristate "TI K3 M4 remoteproc support" - depends on ARCH_OMAP2PLUS || ARCH_K3 - select MAILBOX - select OMAP2PLUS_MBOX + depends on ARCH_K3 || COMPILE_TEST + depends on TI_SCI_PROTOCOL || (COMPILE_TEST && TI_SCI_PROTOCOL=n) + depends on OMAP2PLUS_MBOX help Say m here to support TI's M4 remote processor subsystems on various TI K3 family of SoCs through the remote processor
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 483/826 f2fs: fix to account dirty data in __get_secs_required()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 1acd73edbbfef2c3c5b43cba4006a7797eca7050 ]
It will trigger system panic w/ testcase in [1]:
------------[ cut here ]------------ kernel BUG at fs/f2fs/segment.c:2752! RIP: 0010:new_curseg+0xc81/0x2110 Call Trace: f2fs_allocate_data_block+0x1c91/0x4540 do_write_page+0x163/0xdf0 f2fs_outplace_write_data+0x1aa/0x340 f2fs_do_write_data_page+0x797/0x2280 f2fs_write_single_data_page+0x16cd/0x2190 f2fs_write_cache_pages+0x994/0x1c80 f2fs_write_data_pages+0x9cc/0xea0 do_writepages+0x194/0x7a0 filemap_fdatawrite_wbc+0x12b/0x1a0 __filemap_fdatawrite_range+0xbb/0xf0 file_write_and_wait_range+0xa1/0x110 f2fs_do_sync_file+0x26f/0x1c50 f2fs_sync_file+0x12b/0x1d0 vfs_fsync_range+0xfa/0x230 do_fsync+0x3d/0x80 __x64_sys_fsync+0x37/0x50 x64_sys_call+0x1e88/0x20d0 do_syscall_64+0x4b/0x110 entry_SYSCALL_64_after_hwframe+0x76/0x7e
The root cause is if checkpoint_disabling and lfs_mode are both on, it will trigger OPU for all overwritten data, it may cost more free segment than expected, so f2fs must account those data correctly to calculate cosumed free segments later, and return ENOSPC earlier to avoid run out of free segment during block allocation.
[1] https://lore.kernel.org/fstests/[email protected]/
--- fs/f2fs/segment.h | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-)
fs/f2fs/segment.h +25 -10
@@ -559,18 +559,21 @@ static inline int reserved_sections(struct f2fs_sb_info *sbi) }static inline bool has_curseg_enough_space (struct f2fs_sb_info *sbi, -unsigned int node_blocks,unsigned int dent_blocks) +unsigned int node_blocks,unsigned int data_blocks, +unsigned int dent_blocks) { -unsigned segno, left_blocks; +unsigned int segno, left_blocks, blocks;int i; -/* check current node sections in the worst case. */ -for (i =CURSEG_HOT_NODE ; i <=CURSEG_COLD_NODE ; i++) { +/* check current data/node sections in the worst case. */ +for (i =CURSEG_HOT_DATA ; i <NR_PERSISTENT_LOG ; i++) { segno =CURSEG_I (sbi, i)->segno; left_blocks =CAP_BLKS_PER_SEC (sbi) -get_ckpt_valid_blocks (sbi, segno, true); -if (node_blocks > left_blocks) + + blocks = i <=CURSEG_COLD_DATA ? data_blocks : node_blocks; +if (blocks > left_blocks)return false; }
@@ -584,8 +587,9 @@ static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi, }/* -* calculate needed sections for dirty node/dentry -* and call has_curseg_enough_space +* calculate needed sections for dirty node/dentry and call +* has_curseg_enough_space, please note that, it needs to account +* dirty data as well in lfs mode when checkpoint is disabled. */ static inline void __get_secs_required (struct f2fs_sb_info *sbi,unsigned int *lower_p,unsigned int *upper_p,bool *curseg_p)
@@ -594,19 +598,30 @@ static inline void __get_secs_required(struct f2fs_sb_info *sbi,get_pages (sbi,F2FS_DIRTY_DENTS ) +get_pages (sbi,F2FS_DIRTY_IMETA );unsigned int total_dent_blocks =get_pages (sbi,F2FS_DIRTY_DENTS ); +unsigned int total_data_blocks =0 ;unsigned int node_secs = total_node_blocks /CAP_BLKS_PER_SEC (sbi);unsigned int dent_secs = total_dent_blocks /CAP_BLKS_PER_SEC (sbi); +unsigned int data_secs =0 ;unsigned int node_blocks = total_node_blocks %CAP_BLKS_PER_SEC (sbi);unsigned int dent_blocks = total_dent_blocks %CAP_BLKS_PER_SEC (sbi); +unsigned int data_blocks =0 ; + +if (f2fs_lfs_mode (sbi) && +unlikely (is_sbi_flag_set (sbi,SBI_CP_DISABLED ))) { + total_data_blocks =get_pages (sbi,F2FS_DIRTY_DATA ); + data_secs = total_data_blocks /CAP_BLKS_PER_SEC (sbi); + data_blocks = total_data_blocks %CAP_BLKS_PER_SEC (sbi); + }if (lower_p) - *lower_p = node_secs + dent_secs; + *lower_p = node_secs + dent_secs + data_secs;if (upper_p) *upper_p = node_secs + dent_secs + - (node_blocks ?1 :0 ) + (dent_blocks ?1 :0 ); + (node_blocks ?1 :0 ) + (dent_blocks ?1 :0 ) + + (data_blocks ?1 :0 );if (curseg_p) *curseg_p =has_curseg_enough_space (sbi, - node_blocks, dent_blocks); + node_blocks, data_blocks, dent_blocks); } static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 484/826 perf dso: Fix symtab_type for kmod compression
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Veronika Molnarova <[email protected]>
[ Upstream commit 05a62936e6b14c005db3b0c9c7d8b93d825dd9ca ]
During the rework of the dso structure in patch ee756ef7491eafd an increment was forgotten for the symtab_type in case the data for the kernel module are compressed. This affects the probing of the kernel modules, which fails if the data are not already cached.
Increment the value of the symtab_type to its compressed variant so the data could be recovered successfully.
--- tools/perf/util/machine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/machine.c +1 -1
@@ -1343,7 +1343,7 @@ static int maps__set_module_path(struct maps *maps, const char *path, struct kmo* we need to update the symtab_type if needed. */ if (m->comp &&is_kmod_dso (dso)) { -dso__set_symtab_type (dso,dso__symtab_type (dso)); +dso__set_symtab_type (dso,dso__symtab_type (dso)+1 );dso__set_comp (dso, m->comp); }map__put (map);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 485/826 perf disasm: Fix capstone memory leak
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 1280f012e06e1555de47e3c3a9be898d8cbda5fb ]
The insn argument passed to cs_disasm needs freeing. To support accurately having count, add an additional free_count variable.
--- tools/perf/util/disasm.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
tools/perf/util/disasm.c +7 -4
@@ -1627,12 +1627,12 @@ static int symbol__disassemble_capstone(char *filename, struct symbol *sym,u64 start =map__rip_2objdump (map, sym->start);u64 len;u64 offset; -int i, count; +int i, count, free_count;bool is_64bit = false;bool needs_cs_close = false;u8 *buf =NULL ;csh handle; -cs_insn *insn; +cs_insn *insn =NULL ;char disasm_buf[512 ];struct disasm_line *dl;
@@ -1664,7 +1664,7 @@ static int symbol__disassemble_capstone(char *filename, struct symbol *sym, needs_cs_close = true; - count =cs_disasm (handle, buf, len, start, len, &insn); + free_count = count =cs_disasm (handle, buf, len, start, len, &insn);for (i =0 , offset =0 ; i < count; i++) {int printed;
@@ -1702,8 +1702,11 @@ static int symbol__disassemble_capstone(char *filename, struct symbol *sym, } out: -if (needs_cs_close) +if (needs_cs_close) {cs_close (&handle); +if (free_count >0 ) +cs_free (insn, free_count); + }free (buf);return count <0 ? count :0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 486/826 perf probe: Fix libdw memory leak
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 4585038b8e186252141ef86e9f0d8e97f11dce8d ]
Add missing dwarf_cfi_end to free memory associated with probe_finder cfi_eh which is allocated and owned via a call to dwarf_getcfi_elf. Confusingly cfi_dbg shouldn't be freed as its memory is owned by the passed in debuginfo struct. Add comments to highlight this.
This addresses leak sanitizer issues seen in:tools/perf/tests/shell/test_uprobe_from_different_cu.sh
--- tools/perf/util/probe-finder.c | 4 ++++ tools/perf/util/probe-finder.h | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-)
tools/perf/util/probe-finder.c +4 -0
@@ -1379,6 +1379,10 @@ int debuginfo__find_trace_events(struct debuginfo *dbg,if (ret >=0 && tf.pf.skip_empty_arg) ret =fill_empty_trace_arg (pev, tf.tevs, tf.ntevs); +#if _ELFUTILS_PREREQ (0 ,142 ) +dwarf_cfi_end (tf.pf.cfi_eh); +#endif +if (ret <0 || tf.ntevs ==0 ) {for (i =0 ; i < tf.ntevs; i++)clear_probe_trace_event (&tf.tevs[i]);
tools/perf/util/probe-finder.h +2 -2
@@ -64,9 +64,9 @@ struct probe_finder {/* For variable searching */ #if _ELFUTILS_PREREQ (0 ,142 ) -/* Call Frame Information from .eh_frame */ +/* Call Frame Information from .eh_frame. Owned by this struct. */ Dwarf_CFI *cfi_eh; -/* Call Frame Information from .debug_frame */ +/* Call Frame Information from .debug_frame. Not owned. */ Dwarf_CFI *cfi_dbg;#endif Dwarf_Op *fb_ops;/* Frame base attribute */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 487/826 perf probe: Correct demangled symbols in C++ program
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leo Yan <[email protected]>
[ Upstream commit 314909f13cc12d47c468602c37dace512d225eeb ]
An issue can be observed when probe C++ demangled symbol with steps:
# nm test_cpp_mangle | grep print_data
0000000000000c94 t _GLOBAL__sub_I__Z10print_datai
0000000000000afc T _Z10print_datai
0000000000000b38 T _Z10print_dataR5Point # perf probe -x /home/niayan01/test_cpp_mangle -F --demangle
...
print_data(Point&)
print_data(int)
... # perf --debug verbose=3 probe -x test_cpp_mangle --add "test=print_data(int)"
probe-definition(0): test=print_data(int)
symbol:print_data(int) file:(null) line:0 offset:0 return:0 lazy:(null)
0 arguments
Open Debuginfo file: /home/niayan01/test_cpp_mangle
Try to find probe point from debuginfo.
Symbol print_data(int) address found : afc
Matched function: print_data [2ccf]
Probe point found: print_data+0
Found 1 probe_trace_events.
Opening /sys/kernel/tracing//uprobe_events write=1
Opening /sys/kernel/tracing//README write=0
Writing event: p:probe_test_cpp_mangle/test /home/niayan01/test_cpp_mangle:0xb38
...When tried to probe symbol "print_data(int)", the log shows:
Symbol print_data(int) address found : afc
The found address is 0xafc - which is right with verifying the output result from nm. Afterwards when write event, the command uses offset 0xb38 in the last log, which is a wrong address.
The dwarf_diename() gets a common function name, in above case, it returns string "print_data". As a result, the tool parses the offset based on the common name. This leads to probe at the wrong symbol "print_data(Point&)".
To fix the issue, use the die_get_linkage_name() function to retrieve the distinct linkage name - this is the mangled name for the C++ case. Based on this unique name, the tool can get a correct offset for probing. Based on DWARF doc, it is possible the linkage name is missed in the DIE, it rolls back to use dwarf_diename().
After:
# perf --debug verbose=3 probe -x test_cpp_mangle --add "test=print_data(int)"
probe-definition(0): test=print_data(int)
symbol:print_data(int) file:(null) line:0 offset:0 return:0 lazy:(null)
0 arguments
Open Debuginfo file: /home/niayan01/test_cpp_mangle
Try to find probe point from debuginfo.
Symbol print_data(int) address found : afc
Matched function: print_data [2d06]
Probe point found: print_data+0
Found 1 probe_trace_events.
Opening /sys/kernel/tracing//uprobe_events write=1
Opening /sys/kernel/tracing//README write=0
Writing event: p:probe_test_cpp_mangle/test /home/niayan01/test_cpp_mangle:0xafc
Added new event:
probe_test_cpp_mangle:test (on print_data(int) in /home/niayan01/test_cpp_mangle)You can now use it in all perf tools, such as:
perf record -e probe_test_cpp_mangle:test -aR sleep 1
# perf --debug verbose=3 probe -x test_cpp_mangle --add "test2=print_data(Point&)"
probe-definition(0): test2=print_data(Point&)
symbol:print_data(Point&) file:(null) line:0 offset:0 return:0 lazy:(null)
0 arguments
Open Debuginfo file: /home/niayan01/test_cpp_mangle
Try to find probe point from debuginfo.
Symbol print_data(Point&) address found : b38
Matched function: print_data [2ccf]
Probe point found: print_data+0
Found 1 probe_trace_events.
Opening /sys/kernel/tracing//uprobe_events write=1
Parsing probe_events: p:probe_test_cpp_mangle/test /home/niayan01/test_cpp_mangle:0x0000000000000afc
Group:probe_test_cpp_mangle Event:test probe:p
Opening /sys/kernel/tracing//README write=0
Writing event: p:probe_test_cpp_mangle/test2 /home/niayan01/test_cpp_mangle:0xb38
Added new event:
probe_test_cpp_mangle:test2 (on print_data(Point&) in /home/niayan01/test_cpp_mangle)You can now use it in all perf tools, such as:
perf record -e probe_test_cpp_mangle:test2 -aR sleep 1
--- tools/perf/util/probe-finder.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
tools/perf/util/probe-finder.c +15 -2
@@ -1587,8 +1587,21 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, u64 addr,/* Find a corresponding function (name, baseline and baseaddr) */ if (die_find_realfunc (&cudie, (Dwarf_Addr )addr, &spdie)) { -/* Get function entry information */ - func = basefunc =dwarf_diename (&spdie); +/* +* Get function entry information. +* +* As described in the document DWARF Debugging Information +* Format Version 5, section 2.22 Linkage Names, "mangled names, +* are used in various ways, ... to distinguish multiple +* entities that have the same name". +* +* Firstly try to get distinct linkage name, if fail then +* rollback to get associated name in DIE. +*/ + func = basefunc =die_get_linkage_name (&spdie); +if (!func) + func = basefunc =dwarf_diename (&spdie); +if (!func ||die_entrypc (&spdie, &baseaddr) !=0 ||dwarf_decl_line (&spdie, &baseline) !=0 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 488/826 rust: kernel: fix THIS_MODULE header path in ThisModule doc comment
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yutaro Ohno <[email protected]>
[ Upstream commit 8b55dc8610acf816a66373be53ca6e3bbe2d313a ]
The doc comment for ThisModule incorrectly states the C header file for THIS_MODULE as include/linux/export.h, while the correct path is include/linux/init.h. This is because THIS_MODULE was moved in commit 5b20755b7780 ("init: move THIS_MODULE from <linux/export.h> to <linux/init.h>").
Update the doc comment for ThisModule to reflect the correct header file path for THIS_MODULE.
--- rust/kernel/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
rust/kernel/lib.rs +1 -1
@@ -83,7 +83,7 @@ pub trait Module: Sized + Sync + Send {/// Equivalent to `THIS_MODULE` in the C API. /// -/// C header: [`include/linux/export.h`](srctree/include/linux/export.h) +/// C header: [`include/linux/init.h`](srctree/include/linux/init.h) pub struct ThisModule (*mut bindings::module );// SAFETY: `THIS_MODULE` may be used from all threads within a module.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 489/826 rust: macros: fix documentation of the paste! macro
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
[ Upstream commit 15541c9263ce34ff95a06bc68f45d9bc5c990bcd ]
One of the example in this section uses a curious mix of the constant and function declaration syntaxes; fix it.
--- rust/macros/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
rust/macros/lib.rs +1 -1
@@ -359,7 +359,7 @@ pub fn pinned_drop(args: TokenStream, input: TokenStream) -> TokenStream {/// macro_rules! pub_no_prefix { /// ($prefix:ident, $($newname:ident),+) => { /// kernel::macros::paste! { -/// $(pub(crate) const fn [<$newname:lower:span>]: u32 = [<$prefix $newname:span>];)+ +/// $(pub(crate) const fn [<$newname:lower:span>]() -> u32 { [<$prefix $newname:span>] })+ /// } /// }; /// }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 490/826 PCI: cpqphp: Fix PCIBIOS_* return value confusion
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit e2226dbc4a4919d9c8bd9293299b532090bdf020 ]
Code in and related to PCI_RefinedAccessConfig() has three types of return type confusion:
- PCI_RefinedAccessConfig() tests pci_bus_read_config_dword() return value against -1.
- PCI_RefinedAccessConfig() returns both -1 and PCIBIOS_* return codes.
- Callers of PCI_RefinedAccessConfig() only test for -1.
Make PCI_RefinedAccessConfig() return PCIBIOS_* codes consistently and adapt callers accordingly.
--- drivers/pci/hotplug/cpqphp_pci.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/pci/hotplug/cpqphp_pci.c +10 -5
@@ -135,11 +135,13 @@ int cpqhp_unconfigure_device(struct pci_func *func)static int PCI_RefinedAccessConfig (struct pci_bus *bus,unsigned int devfn,u8 offset,u32 *value) {u32 vendID =0 ; +int ret; -if (pci_bus_read_config_dword (bus, devfn,PCI_VENDOR_ID , &vendID) ==-1 ) -return -1 ; + ret =pci_bus_read_config_dword (bus, devfn,PCI_VENDOR_ID , &vendID); +if (ret !=PCIBIOS_SUCCESSFUL ) +return PCIBIOS_DEVICE_NOT_FOUND ;if (PCI_POSSIBLE_ERROR (vendID)) -return -1 ; +return PCIBIOS_DEVICE_NOT_FOUND ;return pci_bus_read_config_dword (bus, devfn, offset, value); }
@@ -202,13 +204,15 @@ static int PCI_ScanBusForNonBridge(struct controller *ctrl, u8 bus_num, u8 *dev_ {u16 tdevice;u32 work; +int ret;u8 tbus; ctrl->pci_bus->number = bus_num;for (tdevice =0 ; tdevice <0xFF ; tdevice++) {/* Scan for access first */ -if (PCI_RefinedAccessConfig (ctrl->pci_bus, tdevice,0x08 , &work) ==-1 ) + ret =PCI_RefinedAccessConfig (ctrl->pci_bus, tdevice,0x08 , &work); +if (ret)continue ;dbg ("Looking for nonbridge bus_num %d dev_num %d\n" , bus_num, tdevice);/* Yep we got one. Not a bridge ? */
@@ -220,7 +224,8 @@ static int PCI_ScanBusForNonBridge(struct controller *ctrl, u8 bus_num, u8 *dev_ }for (tdevice =0 ; tdevice <0xFF ; tdevice++) {/* Scan for access first */ -if (PCI_RefinedAccessConfig (ctrl->pci_bus, tdevice,0x08 , &work) ==-1 ) + ret =PCI_RefinedAccessConfig (ctrl->pci_bus, tdevice,0x08 , &work); +if (ret)continue ;dbg ("Looking for bridge bus_num %d dev_num %d\n" , bus_num, tdevice);/* Yep we got one. bridge ? */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 491/826 rust: block: fix formatting of `kernel::block::mq::request` module
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Francesco Zardi <[email protected]>
[ Upstream commit 28e848386b92645f93b9f2fdba5882c3ca7fb3e2 ]
Fix several issues with rustdoc formatting for the kernel::block::mq::Request module, in particular:
- An ordered list not rendering correctly, fixed by using numbers prefixes instead of letters.
- Code snippets formatted as regular text, fixed by wrapping the code with back-ticks.
- References to types missing intra-doc links, fixed by wrapping the types with [square brackets].
[ Added an extra intra-doc link. Took the chance to add some periods
for consistency. Reworded slightly. - Miguel ]
--- rust/kernel/block/mq/request.rs | 67 +++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 29 deletions(-)
rust/kernel/block/mq/request.rs +38 -29
@@ -16,50 +16,55 @@ sync::atomic::{AtomicU64, Ordering}, }; -/// A wrapper around a blk-mq `struct request`. This represents an IO request. +/// A wrapper around a blk-mq [`struct request`]. This represents an IO request. /// /// # Implementation details /// /// There are four states for a request that the Rust bindings care about: /// -/// A) Request is owned by block layer (refcount 0) -/// B) Request is owned by driver but with zero `ARef`s in existence -/// (refcount 1) -/// C) Request is owned by driver with exactly one `ARef` in existence -/// (refcount 2) -/// D) Request is owned by driver with more than one `ARef` in existence -/// (refcount > 2) +/// 1. Request is owned by block layer (refcount 0). +/// 2. Request is owned by driver but with zero [`ARef`]s in existence +/// (refcount 1). +/// 3. Request is owned by driver with exactly one [`ARef`] in existence +/// (refcount 2). +/// 4. Request is owned by driver with more than one [`ARef`] in existence +/// (refcount > 2). /// /// -/// We need to track A and B to ensure we fail tag to request conversions for +/// We need to track 1 and 2 to ensure we fail tag to request conversions for /// requests that are not owned by the driver. /// -/// We need to track C and D to ensure that it is safe to end the request and hand +/// We need to track 3 and 4 to ensure that it is safe to end the request and hand /// back ownership to the block layer. /// /// The states are tracked through the private `refcount` field of /// `RequestDataWrapper`. This structure lives in the private data area of the C -/// `struct request`. +/// [`struct request`]. /// /// # Invariants /// -/// * `self.0` is a valid `struct request` created by the C portion of the kernel. +/// * `self.0` is a valid [`struct request`] created by the C portion of the +/// kernel. /// * The private data area associated with this request must be an initialized /// and valid `RequestDataWrapper<T>`. /// * `self` is reference counted by atomic modification of -/// self.wrapper_ref().refcount(). +/// `self.wrapper_ref().refcount()`. +/// +/// [`struct request`]: srctree/include/linux/blk-mq.h /// #[repr(transparent)] pub struct Request <T :Operations >(Opaque <bindings::request >,PhantomData <T >);impl <T :Operations >Request <T > { -/// Create an `ARef<Request>` from a `struct request` pointer. +/// Create an [`ARef<Request>`] from a [`struct request`] pointer. /// /// # Safety /// /// * The caller must own a refcount on `ptr` that is transferred to the -/// returned `ARef`. -/// * The type invariants for `Request` must hold for the pointee of `ptr`. +/// returned [`ARef`]. +/// * The type invariants for [`Request`] must hold for the pointee of `ptr`. +/// +/// [`struct request`]: srctree/include/linux/blk-mq.h pub (crate )unsafe fn aref_from_raw (ptr: *mut bindings::request ) ->ARef <Self > {// INVARIANT: By the safety requirements of this function, invariants are upheld. // SAFETY: By the safety requirement of this function, we own a
@@ -84,12 +89,14 @@ pub(crate) unsafe fn start_unchecked(this: &ARef<Self>) { }/// Try to take exclusive ownership of `this` by dropping the refcount to 0. -/// This fails if `this` is not the only `ARef` pointing to the underlying -/// `Request`. +/// This fails if `this` is not the only [`ARef`] pointing to the underlying +/// [`Request`]. /// -/// If the operation is successful, `Ok` is returned with a pointer to the -/// C `struct request`. If the operation fails, `this` is returned in the -/// `Err` variant. +/// If the operation is successful, [`Ok`] is returned with a pointer to the +/// C [`struct request`]. If the operation fails, `this` is returned in the +/// [`Err`] variant. +/// +/// [`struct request`]: srctree/include/linux/blk-mq.h fn try_set_end(this: ARef<Self>) -> Result<*mut bindings::request, ARef<Self>> { // We can race with `TagSet::tag_to_rq` if let Err(_old) = this.wrapper_ref().refcount().compare_exchange(
@@ -109,7 +116,7 @@ fn try_set_end(this: ARef<Self>) -> Result<*mut bindings::request, ARef<Self>> {/// Notify the block layer that the request has been completed without errors. /// -/// This function will return `Err` if `this` is not the only `ARef` +/// This function will return [`Err`] if `this` is not the only [`ARef`] /// referencing the request. pub fn end_ok (this:ARef <Self >) ->Result <(),ARef <Self >> {let request_ptr =Self ::try_set_end (this)?;
@@ -123,13 +130,13 @@ pub fn end_ok(this: ARef<Self>) -> Result<(), ARef<Self>> {Ok (()) } -/// Return a pointer to the `RequestDataWrapper` stored in the private area +/// Return a pointer to the [`RequestDataWrapper`] stored in the private area /// of the request structure. /// /// # Safety /// /// - `this` must point to a valid allocation of size at least size of -/// `Self` plus size of `RequestDataWrapper`. +/// [`Self`] plus size of [`RequestDataWrapper`]. pub (crate )unsafe fn wrapper_ptr (this: *mut Self ) ->NonNull <RequestDataWrapper > {let request_ptr = this.cast ::<bindings::request >();// SAFETY: By safety requirements for this function, `this` is a
@@ -141,7 +148,7 @@ pub(crate) unsafe fn wrapper_ptr(this: *mut Self) -> NonNull<RequestDataWrapper>unsafe {NonNull ::new_unchecked (wrapper_ptr) } } -/// Return a reference to the `RequestDataWrapper` stored in the private +/// Return a reference to the [`RequestDataWrapper`] stored in the private /// area of the request structure. pub (crate )fn wrapper_ref (&self) -> &RequestDataWrapper {// SAFETY: By type invariant, `self.0` is a valid allocation. Further,
@@ -152,13 +159,15 @@ pub(crate) fn wrapper_ref(&self) -> &RequestDataWrapper { } } -/// A wrapper around data stored in the private area of the C `struct request`. +/// A wrapper around data stored in the private area of the C [`struct request`]. +/// +/// [`struct request`]: srctree/include/linux/blk-mq.h pub (crate )struct RequestDataWrapper {/// The Rust request refcount has the following states: /// /// - 0: The request is owned by C block layer. -/// - 1: The request is owned by Rust abstractions but there are no ARef references to it. -/// - 2+: There are `ARef` references to the request. +/// - 1: The request is owned by Rust abstractions but there are no [`ARef`] references to it. +/// - 2+: There are [`ARef`] references to the request. refcount:AtomicU64 , }
@@ -204,7 +213,7 @@ fn atomic_relaxed_op_return(target: &AtomicU64, op: impl Fn(u64) -> u64) -> u64 }/// Store the result of `op(target.load)` in `target` if `target.load() != -/// pred`, returning true if the target was updated. +/// pred`, returning [`true`] if the target was updated. fn atomic_relaxed_op_unless (target: &AtomicU64 , op:impl Fn (u64 ) ->u64 , pred:u64 ) ->bool { target .fetch_update (Ordering ::Relaxed ,Ordering ::Relaxed , |x| {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 492/826 perf disasm: Use disasm_line__free() to properly free disasm_line
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Huafei <[email protected]>
[ Upstream commit b4e0e9a1e30059f4523c9b6a1f8045ad89b5db8a ]
The structure disasm_line contains members that require dynamically allocated memory and need to be freed correctly using disasm_line__free().
This patch fixes the incorrect release insymbol__disassemble_capstone().
--- tools/perf/util/disasm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/disasm.c +1 -1
@@ -1720,7 +1720,7 @@ static int symbol__disassemble_capstone(char *filename, struct symbol *sym,*/ list_for_each_entry_safe (dl, tmp, ¬es->src->source, al.node) {list_del (&dl->al.node); -free (dl); +disasm_line__free (dl); } } count =-1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 493/826 perf disasm: Fix not cleaning up disasm_line in symbol__disassemble_raw()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Huafei <[email protected]>
[ Upstream commit 150dab31d5609f896fbfaa06b442ca314da79858 ]
In symbol__disassemble_raw(), the created disasm_line should be discarded before returning an error. When creating disasm_line fails, break the loop and then release the created lines.
--- tools/perf/util/disasm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/disasm.c +1 -1
@@ -1785,7 +1785,7 @@ static int symbol__disassemble_raw(char *filename, struct symbol *sym,sprintf (args->line,"%x" , line[i]); dl =disasm_line__new (args);if (dl ==NULL ) - goto err; +break ;annotation_line__add (&dl->al, ¬es->src->source); offset +=4 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 494/826 virtiofs: use pages instead of pointer for kernel direct IO
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Tao <[email protected]>
[ Upstream commit 41748675c0bf252b3c5f600a95830f0936d366c1 ]
When trying to insert a 10MB kernel module kept in a virtio-fs with cache disabled, the following warning was reported:
------------[ cut here ]------------ WARNING: CPU: 1 PID: 404 at mm/page_alloc.c:4551 ...... Modules linked in: CPU: 1 PID: 404 Comm: insmod Not tainted 6.9.0-rc5+ #123 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) ...... RIP: 0010:__alloc_pages+0x2bf/0x380 ...... Call Trace: <TASK> ? __warn+0x8e/0x150 ? __alloc_pages+0x2bf/0x380 __kmalloc_large_node+0x86/0x160 __kmalloc+0x33c/0x480 virtio_fs_enqueue_req+0x240/0x6d0 virtio_fs_wake_pending_and_unlock+0x7f/0x190 queue_request_and_unlock+0x55/0x60 fuse_simple_request+0x152/0x2b0 fuse_direct_io+0x5d2/0x8c0 fuse_file_read_iter+0x121/0x160 __kernel_read+0x151/0x2d0 kernel_read+0x45/0x50 kernel_read_file+0x1a9/0x2a0 init_module_from_file+0x6a/0xe0 idempotent_init_module+0x175/0x230 __x64_sys_finit_module+0x5d/0xb0 x64_sys_call+0x1c3/0x9e0 do_syscall_64+0x3d/0xc0 entry_SYSCALL_64_after_hwframe+0x4b/0x53 ...... </TASK> ---[ end trace 0000000000000000 ]---
The warning is triggered as follows:
1) syscall finit_module() handles the module insertion and it invokes kernel_read_file() to read the content of the module first.
2) kernel_read_file() allocates a 10MB buffer by using vmalloc() and passes it to kernel_read(). kernel_read() constructs a kvec iter by using iov_iter_kvec() and passes it to fuse_file_read_iter().
3) virtio-fs disables the cache, so fuse_file_read_iter() invokes fuse_direct_io(). As for now, the maximal read size for kvec iter is only limited by fc->max_read. For virtio-fs, max_read is UINT_MAX, so fuse_direct_io() doesn't split the 10MB buffer. It saves the address and the size of the 10MB-sized buffer in out_args[0] of a fuse request and passes the fuse request to virtio_fs_wake_pending_and_unlock().
4) virtio_fs_wake_pending_and_unlock() uses virtio_fs_enqueue_req() to queue the request. Because virtiofs need DMA-able address, so virtio_fs_enqueue_req() uses kmalloc() to allocate a bounce buffer for all fuse args, copies these args into the bounce buffer and passed the physical address of the bounce buffer to virtiofsd. The total length of these fuse args for the passed fuse request is about 10MB, so copy_args_to_argbuf() invokes kmalloc() with a 10MB size parameter and it triggers the warning in __alloc_pages():
if (WARN_ON_ONCE_GFP(order > MAX_PAGE_ORDER, gfp)) return NULL;
5) virtio_fs_enqueue_req() will retry the memory allocation in a kworker, but it won't help, because kmalloc() will always return NULL due to the abnormal size and finit_module() will hang forever.
A feasible solution is to limit the value of max_read for virtio-fs, so the length passed to kmalloc() will be limited. However it will affect the maximal read size for normal read. And for virtio-fs write initiated from kernel, it has the similar problem but now there is no way to limit fc->max_write in kernel.
So instead of limiting both the values of max_read and max_write in kernel, introducing use_pages_for_kvec_io in fuse_conn and setting it as true in virtiofs. When use_pages_for_kvec_io is enabled, fuse will use pages instead of pointer to pass the KVEC_IO data.
After switching to pages for KVEC_IO data, these pages will be used for DMA through virtio-fs. If these pages are backed by vmalloc(), {flush|invalidate}_kernel_vmap_range() are necessary to flush or invalidate the cache before the DMA operation. So add two new fields in fuse_args_pages to record the base address of vmalloc area and the condition indicating whether invalidation is needed. Perform the flush in fuse_get_user_pages() for write operations and the invalidation in fuse_release_user_pages() for read operations.
It may seem necessary to introduce another field in fuse_conn to indicate that these KVEC_IO pages are used for DMA, However, considering that virtio-fs is currently the only user of use_pages_for_kvec_io, just reuse use_pages_for_kvec_io to indicate that these pages will be used for DMA.
--- fs/fuse/file.c | 62 +++++++++++++++++++++++++++++++-------------- fs/fuse/fuse_i.h | 6 +++++ fs/fuse/virtio_fs.c | 1 + 3 files changed, 50 insertions(+), 19 deletions(-)
fs/fuse/file.c +43 -19
@@ -645,7 +645,7 @@ void fuse_read_args_fill(struct fuse_io_args *ia, struct file *file, loff_t pos, args->out_args[0 ].size = count; } -static void fuse_release_user_pages (struct fuse_args_pages *ap, +static void fuse_release_user_pages (struct fuse_args_pages *ap,ssize_t nres,bool should_dirty) {unsigned int i;
@@ -656,6 +656,9 @@ static void fuse_release_user_pages(struct fuse_args_pages *ap,if (ap->args.is_pinned)unpin_user_page (ap->pages[i]); } + +if (nres >0 && ap->args.invalidate_vmap) +invalidate_kernel_vmap_range (ap->args.vmap_base, nres); }static void fuse_io_release (struct kref *kref)
@@ -754,25 +757,29 @@ static void fuse_aio_complete_req(struct fuse_mount *fm, struct fuse_args *args,struct fuse_io_args *ia =container_of (args,typeof (*ia), ap.args);struct fuse_io_priv *io = ia->io;ssize_t pos =-1 ; - -fuse_release_user_pages (&ia->ap, io->should_dirty); +size_t nres;if (err) {/* Nothing */ }else if (io->write) {if (ia->write.out.size > ia->write.in.size) { err = -EIO ; - }else if (ia->write.in.size != ia->write.out.size) { - pos = ia->write.in.offset - io->offset + - ia->write.out.size; + }else { + nres = ia->write.out.size; +if (ia->write.in.size != ia->write.out.size) + pos = ia->write.in.offset - io->offset + + ia->write.out.size; } }else {u32 outsize = args->out_args[0 ].size; + nres = outsize;if (ia->read.in.size != outsize) pos = ia->read.in.offset - io->offset + outsize; } +fuse_release_user_pages (&ia->ap, err ?: nres, io->should_dirty); +fuse_aio_complete (io, err, pos);fuse_io_free (ia); }
@@ -1468,24 +1475,37 @@ static inline size_t fuse_get_frag_size(const struct iov_iter *ii,static int fuse_get_user_pages (struct fuse_args_pages *ap,struct iov_iter *ii,size_t *nbytesp,int write, -unsigned int max_pages) +unsigned int max_pages, +bool use_pages_for_kvec_io) { +bool flush_or_invalidate = false;size_t nbytes =0 ;/* # bytes already packed in req */ ssize_t ret =0 ; -/* Special case for kernel I/O: can copy directly into the buffer */ +/* Special case for kernel I/O: can copy directly into the buffer. +* However if the implementation of fuse_conn requires pages instead of +* pointer (e.g., virtio-fs), use iov_iter_extract_pages() instead. +*/ if (iov_iter_is_kvec (ii)) { -unsigned long user_addr =fuse_get_user_addr (ii); -size_t frag_size =fuse_get_frag_size (ii, *nbytesp); +void *user_addr = (void *)fuse_get_user_addr (ii); -if (write) - ap->args.in_args[1 ].value = (void *) user_addr; -else - ap->args.out_args[0 ].value = (void *) user_addr; +if (!use_pages_for_kvec_io) { +size_t frag_size =fuse_get_frag_size (ii, *nbytesp); -iov_iter_advance (ii, frag_size); - *nbytesp = frag_size; -return 0 ; +if (write) + ap->args.in_args[1 ].value = user_addr; +else + ap->args.out_args[0 ].value = user_addr; + +iov_iter_advance (ii, frag_size); + *nbytesp = frag_size; +return 0 ; + } + +if (is_vmalloc_addr (user_addr)) { + ap->args.vmap_base = user_addr; + flush_or_invalidate = true; + } }while (nbytes < *nbytesp && ap->num_pages < max_pages) {
@@ -1514,6 +1534,10 @@ static int fuse_get_user_pages(struct fuse_args_pages *ap, struct iov_iter *ii, (PAGE_SIZE - ret) & (PAGE_SIZE -1 ); } +if (write && flush_or_invalidate) +flush_kernel_vmap_range (ap->args.vmap_base, nbytes); + + ap->args.invalidate_vmap = !write && flush_or_invalidate; ap->args.is_pinned =iov_iter_extract_will_pin (ii); ap->args.user_pages = true;if (write)
@@ -1582,7 +1606,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,size_t nbytes =min (count, nmax); err =fuse_get_user_pages (&ia->ap, iter, &nbytes, write, - max_pages); + max_pages, fc->use_pages_for_kvec_io);if (err && !nbytes)break ;
@@ -1596,7 +1620,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter, }if (!io->async || nres <0 ) { -fuse_release_user_pages (&ia->ap, io->should_dirty); +fuse_release_user_pages (&ia->ap, nres, io->should_dirty);fuse_io_free (ia); } ia =NULL ;
fs/fuse/fuse_i.h +6 -0
@@ -309,9 +309,12 @@ struct fuse_args { bool may_block:1; bool is_ext:1; bool is_pinned:1; + bool invalidate_vmap:1;struct fuse_in_arg in_args[3 ];struct fuse_arg out_args[2 ];void (*end)(struct fuse_mount *fm,struct fuse_args *args,int error); +/* Used for kvec iter backed by vmalloc address */ +void *vmap_base; };struct fuse_args_pages {
@@ -857,6 +860,9 @@ struct fuse_conn {/** Passthrough support for read/write IO */ unsigned int passthrough:1; +/* Use pages instead of pointer for kernel I/O */ + unsigned int use_pages_for_kvec_io:1; +/** Maximum stack depth for passthrough backing files */ int max_stack_depth;
fs/fuse/virtio_fs.c +1 -0
@@ -1691,6 +1691,7 @@ static int virtio_fs_get_tree(struct fs_context *fsc) fc->delete_stale = true; fc->auto_submounts = true; fc->sync_fs = true; + fc->use_pages_for_kvec_io = true;/* Tell FUSE to split requests that exceed the virtqueue's size */ fc->max_pages_limit = min_t(unsigned int, fc->max_pages_limit,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 495/826 perf ftrace latency: Fix unit on histogram first entry when using --use-nsec
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit 064d569e20e82c065b1dec9d20c29c7087bb1a00 ]
The use_nsec arg wasn't being taken into account when printing the first histogram entry, fix it:
root@number:~# perf ftrace latency --use-nsec -T switch_mm_irqs_off -a sleep 2
# DURATION | COUNT | GRAPH |
0 - 1 us | 0 | |
1 - 2 ns | 0 | |
2 - 4 ns | 0 | |
4 - 8 ns | 0 | |
8 - 16 ns | 0 | |
16 - 32 ns | 0 | |
32 - 64 ns | 125 | |
64 - 128 ns | 335 | |
128 - 256 ns | 2155 | #### |
256 - 512 ns | 9996 | ################### |
512 - 1024 ns | 4958 | ######### |
1 - 2 us | 4636 | ######### |
2 - 4 us | 1053 | ## |
4 - 8 us | 15 | |
8 - 16 us | 1 | |
16 - 32 us | 0 | |
32 - 64 us | 0 | |
64 - 128 us | 0 | |
128 - 256 us | 0 | |
256 - 512 us | 0 | |
512 - 1024 us | 0 | |
1 - ... ms | 0 | |
root@number:~#After:
root@number:~# perf ftrace latency --use-nsec -T switch_mm_irqs_off -a sleep 2
# DURATION | COUNT | GRAPH |
0 - 1 ns | 0 | |
1 - 2 ns | 0 | |
2 - 4 ns | 0 | |
4 - 8 ns | 0 | |
8 - 16 ns | 0 | |
16 - 32 ns | 0 | |
32 - 64 ns | 19 | |
64 - 128 ns | 94 | |
128 - 256 ns | 2191 | #### |
256 - 512 ns | 9719 | #################### |
512 - 1024 ns | 5330 | ########### |
1 - 2 us | 4104 | ######## |
2 - 4 us | 807 | # |
4 - 8 us | 9 | |
8 - 16 us | 0 | |
16 - 32 us | 0 | |
32 - 64 us | 0 | |
64 - 128 us | 0 | |
128 - 256 us | 0 | |
256 - 512 us | 0 | |
512 - 1024 us | 0 | |
1 - ... ms | 0 | |
root@number:~#--- tools/perf/builtin-ftrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-ftrace.c +1 -1
@@ -815,7 +815,7 @@ static void display_histogram(int buckets[], bool use_nsec) bar_len = buckets[0 ] * bar_total / total;printf (" %4d - %-4d %s | %10d | %.*s%*s |\n" , -0 ,1 ,"us" , buckets[0 ], bar_len, bar, bar_total - bar_len,"" ); +0 ,1 , use_nsec ?"ns" :"us" , buckets[0 ], bar_len, bar, bar_total - bar_len,"" );for (i =1 ; i <NUM_BUCKET -1 ; i++) {int start = (1 << (i -1 ));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 496/826 i3c: master: Remove i3c_dev_disable_ibi_locked(olddev) on device hotjoin
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit 36faa04ce3d9c962b4b29d285ad07ca29e2988e4 ]
When a new device hotjoins, a new dynamic address is assigned. i3c_master_add_i3c_dev_locked() identifies that the device was previously attached to the bus and locates the olddev.
i3c_master_add_i3c_dev_locked()
{
...
olddev = i3c_master_search_i3c_dev_duplicate(newdev);
...
if (olddev) {
...
i3c_dev_disable_ibi_locked(olddev);
^^^^^^
The olddev should not receive any commands on the i3c bus as it
does not exist and has been assigned a new address. This will
result in NACK or timeout. So remove it.
}
i3c_dev_free_ibi_locked(olddev);
^^^^^^^^
This function internally calls i3c_dev_disable_ibi_locked() function
causing to send DISEC command with old Address.
The olddev should not receive any commands on the i3c bus as it
does not exist and has been assigned a new address. This will
result in NACK or timeout. So, update the olddev->ibi->enabled
flag to false to avoid DISEC with OldAddr.
}Include part of Ravindra Yashvant Shinde's work:
https://lore.kernel.org/linux-i3c/[email protected]/T/#u
--- drivers/i3c/master.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/i3c/master.c +9 -4
@@ -2051,11 +2051,16 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master, ibireq.max_payload_len = olddev->ibi->max_payload_len; ibireq.num_slots = olddev->ibi->num_slots; -if (olddev->ibi->enabled) { +if (olddev->ibi->enabled) enable_ibi = true; -i3c_dev_disable_ibi_locked (olddev); - } - +/* +* The olddev should not receive any commands on the +* i3c bus as it does not exist and has been assigned +* a new address. This will result in NACK or timeout. +* So, update the olddev->ibi->enabled flag to false +* to avoid DISEC with OldAddr. +*/ + olddev->ibi->enabled = false;i3c_dev_free_ibi_locked (olddev); }mutex_unlock (&olddev->ibi_lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 497/826 f2fs: fix the wrong f2fs_bug_on condition in f2fs_do_replace_block
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: LongPing Wei <[email protected]>
[ Upstream commit c3af1f13476ec23fd99c98d060a89be28c1e8871 ]
This f2fs_bug_on was introduced by commit 2c1905042c8c ("f2fs: check segment type in __f2fs_replace_block") when there were only 6 curseg types. After commit d0b9e42ab615 ("f2fs: introduce inmem curseg") was introduced, the condition should be changed to checking curseg->seg_type.
--- fs/f2fs/segment.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/segment.c +1 -1
@@ -3977,8 +3977,8 @@ void f2fs_do_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, } } -f2fs_bug_on (sbi, !IS_DATASEG (type)); curseg =CURSEG_I (sbi, type); +f2fs_bug_on (sbi, !IS_DATASEG (curseg->seg_type));mutex_lock (&curseg->curseg_mutex);down_write (&sit_i->sentry_lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 498/826 f2fs: check curseg->inited before write_sum_page in change_curseg
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yongpeng Yang <[email protected]>
[ Upstream commit 43563069e1c1df417d2eed6eca8a22fc6b04691d ]
In the __f2fs_init_atgc_curseg->get_atssr_segment calling, curseg->segno is NULL_SEGNO, indicating that there is no summary block that needs to be written.
--- fs/f2fs/segment.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/f2fs/segment.c +2 -1
@@ -2926,7 +2926,8 @@ static int change_curseg(struct f2fs_sb_info *sbi, int type)struct f2fs_summary_block *sum_node;struct page *sum_page; -write_sum_page (sbi, curseg->sum_blk,GET_SUM_BLOCK (sbi, curseg->segno)); +if (curseg->inited) +write_sum_page (sbi, curseg->sum_blk,GET_SUM_BLOCK (sbi, curseg->segno));__set_test_and_inuse (sbi, new_segno);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 499/826 f2fs: Fix not used variable index
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zeng Heng <[email protected]>
[ Upstream commit 0c3a38a4b442893f8baca72e44a2a27d52d6cc75 ]
Fix the following compilation warning:fs/f2fs/data.c:2391:10: warning: variable ‘index’ set but not used [-Wunused-but-set-variable]
2391 | pgoff_t index;
Only define and set the variable index when the CONFIG_F2FS_FS_COMPRESSION is enabled.
--- fs/f2fs/data.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/f2fs/data.c +2 -2
@@ -2385,10 +2385,10 @@ static int f2fs_mpage_readpages(struct inode *inode, .nr_cpages = 0, };pgoff_t nc_cluster_idx =NULL_CLUSTER ; +pgoff_t index;#endif unsigned nr_pages = rac ?readahead_count (rac) :1 ;unsigned max_nr_pages = nr_pages; -pgoff_t index;int ret =0 ; map.m_pblk =0 ;
@@ -2406,9 +2406,9 @@ static int f2fs_mpage_readpages(struct inode *inode,prefetchw (&folio->flags); } +#ifdef CONFIG_F2FS_FS_COMPRESSION index =folio_index (folio); -#ifdef CONFIG_F2FS_FS_COMPRESSION if (!f2fs_compressed_file (inode)) goto read_single_page;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 500/826 f2fs: fix to avoid potential deadlock in f2fs_record_stop_reason()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit f10a890308a7cd8794e21f646f09827c6cb4bf5d ]
syzbot reports deadlock issue of f2fs as below:
======================================================
WARNING: possible circular locking dependency detected 6.12.0-rc3-syzkaller-00087-gc964ced77262 #0 Not tainted
------------------------------------------------------
kswapd0/79 is trying to acquire lock:ffff888011824088 (&sbi->sb_lock){++++}-{3:3}, at: f2fs_down_write fs/f2fs/f2fs.h:2199 [inline] ffff888011824088 (&sbi->sb_lock){++++}-{3:3}, at: f2fs_record_stop_reason+0x52/0x1d0 fs/f2fs/super.c:4068
but task is already holding lock:ffff88804bd92610 (sb_internal#2){.+.+}-{0:0}, at: f2fs_evict_inode+0x662/0x15c0 fs/f2fs/inode.c:842
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (sb_internal#2){.+.+}-{0:0}:
lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5825
percpu_down_read include/linux/percpu-rwsem.h:51 [inline]
__sb_start_write include/linux/fs.h:1716 [inline]
sb_start_intwrite+0x4d/0x1c0 include/linux/fs.h:1899
f2fs_evict_inode+0x662/0x15c0 fs/f2fs/inode.c:842
evict+0x4e8/0x9b0 fs/inode.c:725
f2fs_evict_inode+0x1a4/0x15c0 fs/f2fs/inode.c:807
evict+0x4e8/0x9b0 fs/inode.c:725
dispose_list fs/inode.c:774 [inline]
prune_icache_sb+0x239/0x2f0 fs/inode.c:963
super_cache_scan+0x38c/0x4b0 fs/super.c:223
do_shrink_slab+0x701/0x1160 mm/shrinker.c:435
shrink_slab+0x1093/0x14d0 mm/shrinker.c:662
shrink_one+0x43b/0x850 mm/vmscan.c:4818
shrink_many mm/vmscan.c:4879 [inline]
lru_gen_shrink_node mm/vmscan.c:4957 [inline]
shrink_node+0x3799/0x3de0 mm/vmscan.c:5937
kswapd_shrink_node mm/vmscan.c:6765 [inline]
balance_pgdat mm/vmscan.c:6957 [inline]
kswapd+0x1ca3/0x3700 mm/vmscan.c:7226
kthread+0x2f0/0x390 kernel/kthread.c:389
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244-> #1 (fs_reclaim){+.+.}-{0:0}:
lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5825
__fs_reclaim_acquire mm/page_alloc.c:3834 [inline]
fs_reclaim_acquire+0x88/0x130 mm/page_alloc.c:3848
might_alloc include/linux/sched/mm.h:318 [inline]
prepare_alloc_pages+0x147/0x5b0 mm/page_alloc.c:4493
__alloc_pages_noprof+0x16f/0x710 mm/page_alloc.c:4722
alloc_pages_mpol_noprof+0x3e8/0x680 mm/mempolicy.c:2265
alloc_pages_noprof mm/mempolicy.c:2345 [inline]
folio_alloc_noprof+0x128/0x180 mm/mempolicy.c:2352
filemap_alloc_folio_noprof+0xdf/0x500 mm/filemap.c:1010
do_read_cache_folio+0x2eb/0x850 mm/filemap.c:3787
read_mapping_folio include/linux/pagemap.h:1011 [inline]
f2fs_commit_super+0x3c0/0x7d0 fs/f2fs/super.c:4032
f2fs_record_stop_reason+0x13b/0x1d0 fs/f2fs/super.c:4079
f2fs_handle_critical_error+0x2ac/0x5c0 fs/f2fs/super.c:4174
f2fs_write_inode+0x35f/0x4d0 fs/f2fs/inode.c:785
write_inode fs/fs-writeback.c:1503 [inline]
__writeback_single_inode+0x711/0x10d0 fs/fs-writeback.c:1723
writeback_single_inode+0x1f3/0x660 fs/fs-writeback.c:1779
sync_inode_metadata+0xc4/0x120 fs/fs-writeback.c:2849
f2fs_release_file+0xa8/0x100 fs/f2fs/file.c:1941
__fput+0x23f/0x880 fs/file_table.c:431
task_work_run+0x24f/0x310 kernel/task_work.c:228
resume_user_mode_work include/linux/resume_user_mode.h:50 [inline]
exit_to_user_mode_loop kernel/entry/common.c:114 [inline]
exit_to_user_mode_prepare include/linux/entry-common.h:328 [inline]
__syscall_exit_to_user_mode_work kernel/entry/common.c:207 [inline]
syscall_exit_to_user_mode+0x168/0x370 kernel/entry/common.c:218
do_syscall_64+0x100/0x230 arch/x86/entry/common.c:89
entry_SYSCALL_64_after_hwframe+0x77/0x7f-> #0 (&sbi->sb_lock){++++}-{3:3}:
check_prev_add kernel/locking/lockdep.c:3161 [inline]
check_prevs_add kernel/locking/lockdep.c:3280 [inline]
validate_chain+0x18ef/0x5920 kernel/locking/lockdep.c:3904
__lock_acquire+0x1384/0x2050 kernel/locking/lockdep.c:5202
lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5825
down_write+0x99/0x220 kernel/locking/rwsem.c:1577
f2fs_down_write fs/f2fs/f2fs.h:2199 [inline]
f2fs_record_stop_reason+0x52/0x1d0 fs/f2fs/super.c:4068
f2fs_handle_critical_error+0x2ac/0x5c0 fs/f2fs/super.c:4174
f2fs_evict_inode+0xa61/0x15c0 fs/f2fs/inode.c:883
evict+0x4e8/0x9b0 fs/inode.c:725
f2fs_evict_inode+0x1a4/0x15c0 fs/f2fs/inode.c:807
evict+0x4e8/0x9b0 fs/inode.c:725
dispose_list fs/inode.c:774 [inline]
prune_icache_sb+0x239/0x2f0 fs/inode.c:963
super_cache_scan+0x38c/0x4b0 fs/super.c:223
do_shrink_slab+0x701/0x1160 mm/shrinker.c:435
shrink_slab+0x1093/0x14d0 mm/shrinker.c:662
shrink_one+0x43b/0x850 mm/vmscan.c:4818
shrink_many mm/vmscan.c:4879 [inline]
lru_gen_shrink_node mm/vmscan.c:4957 [inline]
shrink_node+0x3799/0x3de0 mm/vmscan.c:5937
kswapd_shrink_node mm/vmscan.c:6765 [inline]
balance_pgdat mm/vmscan.c:6957 [inline]
kswapd+0x1ca3/0x3700 mm/vmscan.c:7226
kthread+0x2f0/0x390 kernel/kthread.c:389
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244other info that might help us debug this:
Chain exists of: &sbi->sb_lock --> fs_reclaim --> sb_internal#2 Possible unsafe locking scenario:
CPU0 CPU1
---- ----
rlock(sb_internal#2);
lock(fs_reclaim);
lock(sb_internal#2); lock(&sbi->sb_lock);
Root cause is there will be potential deadlock in between below tasks:
Thread A Kswapd
- f2fs_ioc_commit_atomic_write
- mnt_want_write_file -- down_read lock A
- balance_pgdat
- __fs_reclaim_acquire -- lock B
- shrink_node
- prune_icache_sb
- dispose_list
- f2fs_evict_inode
- sb_start_intwrite -- down_read lock A
- f2fs_do_sync_file
- f2fs_write_inode
- f2fs_handle_critical_error
- f2fs_record_stop_reason
- f2fs_commit_super
- read_mapping_folio
- filemap_alloc_folio_noprof
- fs_reclaim_acquire -- lock B
Both threads try to acquire read lock of lock A, then its upcoming write lock grabber will trigger deadlock.
Let's always create an asynchronous task in f2fs_handle_critical_error() rather than calling f2fs_record_stop_reason() synchronously to avoid this potential deadlock issue.
--- fs/f2fs/checkpoint.c | 2 +- fs/f2fs/f2fs.h | 3 +-- fs/f2fs/super.c | 13 +++++++------ 3 files changed, 9 insertions(+), 9 deletions(-)
fs/f2fs/checkpoint.c +1 -1
@@ -32,7 +32,7 @@ void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io,f2fs_build_fault_attr (sbi,0 ,0 );if (!end_io)f2fs_flush_merged_writes (sbi); -f2fs_handle_critical_error (sbi, reason, end_io); +f2fs_handle_critical_error (sbi, reason); }/*
fs/f2fs/f2fs.h +1 -2
@@ -3632,8 +3632,7 @@ int f2fs_quota_sync(struct super_block *sb, int type);loff_t max_file_blocks (struct inode *inode);void f2fs_quota_off_umount (struct super_block *sb);void f2fs_save_errors (struct f2fs_sb_info *sbi,unsigned char flag); -void f2fs_handle_critical_error (struct f2fs_sb_info *sbi,unsigned char reason, -bool irq_context); +void f2fs_handle_critical_error (struct f2fs_sb_info *sbi,unsigned char reason);void f2fs_handle_error (struct f2fs_sb_info *sbi,unsigned char error);void f2fs_handle_error_async (struct f2fs_sb_info *sbi,unsigned char error);int f2fs_commit_super (struct f2fs_sb_info *sbi,bool recover);
fs/f2fs/super.c +7 -6
@@ -4155,8 +4155,7 @@ static bool system_going_down(void) || system_state == SYSTEM_RESTART; } -void f2fs_handle_critical_error (struct f2fs_sb_info *sbi,unsigned char reason, -bool irq_context) +void f2fs_handle_critical_error (struct f2fs_sb_info *sbi,unsigned char reason) {struct super_block *sb = sbi->sb;bool shutdown = reason ==STOP_CP_REASON_SHUTDOWN ;
@@ -4168,10 +4167,12 @@ void f2fs_handle_critical_error(struct f2fs_sb_info *sbi, unsigned char reason,if (!f2fs_hw_is_readonly (sbi)) {save_stop_reason (sbi, reason); -if (irq_context && !shutdown) -schedule_work (&sbi->s_error_work); -else -f2fs_record_stop_reason (sbi); +/* +* always create an asynchronous task to record stop_reason +* in order to avoid potential deadlock when running into +* f2fs_record_stop_reason() synchronously. +*/ +schedule_work (&sbi->s_error_work); }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 501/826 f2fs: fix to avoid use GC_AT when setting gc_mode as GC_URGENT_LOW or GC_URGENT_MID
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiguo Niu <[email protected]>
[ Upstream commit 296b8cb34e65fa93382cf919be5a056f719c9a26 ]
If gc_mode is set to GC_URGENT_LOW or GC_URGENT_MID, cost benefit GC approach should be used, but if ATGC is enabled at the same time, Age-threshold approach will be selected, which can only do amount of GC and it is much less than the numbers of CB approach.
some traces:
f2fs_gc-254:48-396 [007] ..... 2311600.684028: f2fs_gc_begin: dev = (254,48), gc_type = Background GC, no_background_GC = 0, nr_free_secs = 0, nodes = 1053, dents = 2, imeta = 18, free_sec:44898, free_seg:44898, rsv_seg:239, prefree_seg:0 f2fs_gc-254:48-396 [007] ..... 2311600.684527: f2fs_get_victim: dev = (254,48), type = No TYPE, policy = (Background GC, LFS-mode, Age-threshold), victim = 10, cost = 4294364975, ofs_unit = 1, pre_victim_secno = -1, prefree = 0, free = 44898 f2fs_gc-254:48-396 [007] ..... 2311600.714835: f2fs_gc_end: dev = (254,48), ret = 0, seg_freed = 0, sec_freed = 0, nodes = 1562, dents = 2, imeta = 18, free_sec:44898, free_seg:44898, rsv_seg:239, prefree_seg:0 f2fs_gc-254:48-396 [007] ..... 2311600.714843: f2fs_background_gc: dev = (254,48), wait_ms = 50, prefree = 0, free = 44898 f2fs_gc-254:48-396 [007] ..... 2311600.771785: f2fs_gc_begin: dev = (254,48), gc_type = Background GC, no_background_GC = 0, nr_free_secs = 0, nodes = 1562, dents = 2, imeta = 18, free_sec:44898, free_seg:44898, rsv_seg:239, prefree_seg: f2fs_gc-254:48-396 [007] ..... 2311600.772275: f2fs_gc_end: dev = (254,48), ret = -61, seg_freed = 0, sec_freed = 0, nodes = 1562, dents = 2, imeta = 18, free_sec:44898, free_seg:44898, rsv_seg:239, prefree_seg:0
--- Documentation/ABI/testing/sysfs-fs-f2fs | 7 +++++-- fs/f2fs/gc.c | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-)
Documentation/ABI/testing/sysfs-fs-f2fs +5 -2
@@ -311,10 +311,13 @@ Description: Do background GC aggressively when set. Set to 0 by default. GC approach and turns SSR mode on. gc urgent low(2): lowers the bar of checking I/O idling in order to process outstanding discard commands and GC a - little bit aggressively. uses cost benefit GC approach. + little bit aggressively. always uses cost benefit GC approach, + and will override age-threshold GC approach if ATGC is enabled + at the same time. gc urgent mid(3): does GC forcibly in a period of given gc_urgent_sleep_time and executes a mid level of I/O idling check. - uses cost benefit GC approach. + always uses cost benefit GC approach, and will override + age-threshold GC approach if ATGC is enabled at the same time. What: /sys/fs/f2fs/<disk>/gc_urgent_sleep_time Date: August 2017
fs/f2fs/gc.c +2 -0
@@ -257,6 +257,8 @@ static int select_gc_type(struct f2fs_sb_info *sbi, int gc_type)switch (sbi->gc_mode) {case GC_IDLE_CB : +case GC_URGENT_LOW : +case GC_URGENT_MID : gc_mode =GC_CB ;break ;case GC_IDLE_GREEDY :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 502/826 PCI: qcom: Enable MSI interrupts together with Link up if Global IRQ is supported
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manivannan Sadhasivam <[email protected]>
[ Upstream commit ba4a2e2317b9faeca9193ed6d3193ddc3cf2aba3 ]
Currently, if 'Global IRQ' is supported by the platform, only the Link up interrupt is enabled in the PARF_INT_ALL_MASK register. This masks MSIs on some platforms. The MSI bits in PARF_INT_ALL_MASK register are enabled by default in the hardware, but commit 4581403f6792 ("PCI: qcom: Enumerate endpoints based on Link up event in 'global_irq' interrupt") disabled them and enabled only the Link up interrupt. While MSI continued to work on the SM8450 platform that was used to test the offending commit, on other platforms like SM8250, X1E80100, MSIs are getting masked. And they require enabling the MSI interrupt bits in the register to unmask (enable) the MSIs.
Even though the MSI interrupt enable bits in PARF_INT_ALL_MASK are described as 'diagnostic' interrupts in the internal documentation, disabling them masks MSI on these platforms. Due to this, MSIs were not reported to be received these platforms while supporting 'Global IRQ'.
So, enable the MSI interrupts along with the Link up interrupt in the PARF_INT_ALL_MASK register if 'Global IRQ' is supported. This ensures that the MSIs continue to work and also the driver is able to catch the Link up interrupt for enumerating endpoint devices.
--- drivers/pci/controller/dwc/pcie-qcom.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/pci/controller/dwc/pcie-qcom.c +3 -1
@@ -133,6 +133,7 @@/* PARF_INT_ALL_{STATUS/CLEAR/MASK} register fields */ #define PARF_INT_ALL_LINK_UP BIT(13) +#define PARF_INT_MSI_DEV_0_7 GENMASK(30, 23)/* PARF_NO_SNOOP_OVERIDE register fields */ #define WR_NO_SNOOP_OVERIDE_EN BIT(1)
@@ -1716,7 +1717,8 @@ static int qcom_pcie_probe(struct platform_device *pdev) goto err_host_deinit; } -writel_relaxed (PARF_INT_ALL_LINK_UP , pcie->parf +PARF_INT_ALL_MASK ); +writel_relaxed (PARF_INT_ALL_LINK_UP |PARF_INT_MSI_DEV_0_7 , + pcie->parf +PARF_INT_ALL_MASK ); }qcom_pcie_icc_opp_update (pcie);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 503/826 PCI: qcom-ep: Move controller cleanups to qcom_pcie_perst_deassert()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manivannan Sadhasivam <[email protected]>
[ Upstream commit 7d7cf89b119af433354f865fc01017b9f8aa411a ]
Currently, the endpoint cleanup function dw_pcie_ep_cleanup() and EPF deinit notify function pci_epc_deinit_notify() are called during the execution of qcom_pcie_perst_assert() i.e., when the host has asserted PERST#. But quickly after this step, refclk will also be disabled by the host.
All of the Qcom endpoint SoCs supported as of now depend on the refclk from the host for keeping the controller operational. Due to this limitation, any access to the hardware registers in the absence of refclk will result in a whole endpoint crash. Unfortunately, most of the controller cleanups require accessing the hardware registers (like eDMA cleanup performed in dw_pcie_ep_cleanup(), powering down MHI EPF etc...). So these cleanup functions are currently causing the crash in the endpoint SoC once host asserts PERST#.
One way to address this issue is by generating the refclk in the endpoint itself and not depending on the host. But that is not always possible as some of the endpoint designs do require the endpoint to consume refclk from the host (as I was told by the Qcom engineers).
Thus, fix this crash by moving the controller cleanups to the start of the qcom_pcie_perst_deassert() function. qcom_pcie_perst_deassert() is called whenever the host has deasserted PERST# and it is guaranteed that the refclk would be active at this point. So at the start of this function (after enabling resources), the controller cleanup can be performed. Once finished, rest of the code execution for PERST# deassert can continue as usual.
--- drivers/pci/controller/dwc/pcie-qcom-ep.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/pci/controller/dwc/pcie-qcom-ep.c +4 -2
@@ -396,6 +396,10 @@ static int qcom_pcie_perst_deassert(struct dw_pcie *pci)return ret; } +/* Perform cleanup that requires refclk */ +pci_epc_deinit_notify (pci->ep.epc); +dw_pcie_ep_cleanup (&pci->ep); +/* Assert WAKE# to RC to indicate device is ready */ gpiod_set_value_cansleep (pcie_ep->wake,1 );usleep_range (WAKE_DELAY_US ,WAKE_DELAY_US +500 );
@@ -540,8 +544,6 @@ static void qcom_pcie_perst_assert(struct dw_pcie *pci) {struct qcom_pcie_ep *pcie_ep =to_pcie_ep (pci); -pci_epc_deinit_notify (pci->ep.epc); -dw_pcie_ep_cleanup (&pci->ep);qcom_pcie_disable_resources (pcie_ep); pcie_ep->link_status =QCOM_PCIE_EP_LINK_DISABLED ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 504/826 PCI: tegra194: Move controller cleanups to pex_ep_event_pex_rst_deassert()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manivannan Sadhasivam <[email protected]>
[ Upstream commit 40e2125381dc11379112485e3eefdd25c6df5375 ]
Currently, the endpoint cleanup function dw_pcie_ep_cleanup() and EPF deinit notify function pci_epc_deinit_notify() are called during the execution of pex_ep_event_pex_rst_assert() i.e., when the host has asserted PERST#. But quickly after this step, refclk will also be disabled by the host.
All of the tegra194 endpoint SoCs supported as of now depend on the refclk from the host for keeping the controller operational. Due to this limitation, any access to the hardware registers in the absence of refclk will result in a whole endpoint crash. Unfortunately, most of the controller cleanups require accessing the hardware registers (like eDMA cleanup performed in dw_pcie_ep_cleanup(), etc...). So these cleanup functions can cause the crash in the endpoint SoC once host asserts PERST#.
One way to address this issue is by generating the refclk in the endpoint itself and not depending on the host. But that is not always possible as some of the endpoint designs do require the endpoint to consume refclk from the host.
Thus, fix this crash by moving the controller cleanups to the start of the pex_ep_event_pex_rst_deassert() function. This function is called whenever the host has deasserted PERST# and it is guaranteed that the refclk would be active at this point. So at the start of this function (after enabling resources) the controller cleanup can be performed. Once finished, rest of the code execution for PERST# deassert can continue as usual.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +4 -3
@@ -1704,9 +1704,6 @@ static void pex_ep_event_pex_rst_assert(struct tegra_pcie_dw *pcie)if (ret)dev_err (pcie->dev,"Failed to go Detect state: %d\n" , ret); -pci_epc_deinit_notify (pcie->pci.ep.epc); -dw_pcie_ep_cleanup (&pcie->pci.ep); -reset_control_assert (pcie->core_rst);tegra_pcie_disable_phy (pcie);
@@ -1785,6 +1782,10 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie) goto fail_phy; } +/* Perform cleanup that requires refclk */ +pci_epc_deinit_notify (pcie->pci.ep.epc); +dw_pcie_ep_cleanup (&pcie->pci.ep); +/* Clear any stale interrupt statuses */ appl_writel (pcie,0xFFFFFFFF ,APPL_INTR_STATUS_L0 );appl_writel (pcie,0xFFFFFFFF ,APPL_INTR_STATUS_L1_0_0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 505/826 PCI: j721e: Deassert PERST# after a delay of PCIE_T_PVPERL_MS milliseconds
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Siddharth Vadapalli <[email protected]>
[ Upstream commit 22a9120479a40a56c13c5e473a0100fad2e017c0 ]
According to Section 2.2 of the PCI Express Card Electromechanical Specification (Revision 5.1), in order to ensure that the power and the reference clock are stable, PERST# has to be deasserted after a delay of 100 milliseconds (TPVPERL).
Currently, it is being assumed that the power is already stable, which is not necessarily true.
Hence, change the delay to PCIE_T_PVPERL_MS to guarantee that power and reference clock are stable.
--- drivers/pci/controller/cadence/pci-j721e.c | 26 ++++++++++------------ 1 file changed, 12 insertions(+), 14 deletions(-)
drivers/pci/controller/cadence/pci-j721e.c +12 -14
@@ -572,15 +572,14 @@ static int j721e_pcie_probe(struct platform_device *pdev) pcie->refclk = clk;/* -* The "Power Sequencing and Reset Signal Timings" table of the -* PCI Express Card Electromechanical Specification, Revision -* 5.1, Section 2.9.2, Symbol "T_PERST-CLK", indicates PERST# -* should be deasserted after minimum of 100us once REFCLK is -* stable. The REFCLK to the connector in RC mode is selected -* while enabling the PHY. So deassert PERST# after 100 us. +* Section 2.2 of the PCI Express Card Electromechanical +* Specification (Revision 5.1) mandates that the deassertion +* of the PERST# signal should be delayed by 100 ms (TPVPERL). +* This shall ensure that the power and the reference clock +* are stable. */ if (gpiod) { -fsleep (PCIE_T_PERST_CLK_US ); +msleep (PCIE_T_PVPERL_MS );gpiod_set_value_cansleep (gpiod,1 ); }
@@ -671,15 +670,14 @@ static int j721e_pcie_resume_noirq(struct device *dev)return ret;/* -* The "Power Sequencing and Reset Signal Timings" table of the -* PCI Express Card Electromechanical Specification, Revision -* 5.1, Section 2.9.2, Symbol "T_PERST-CLK", indicates PERST# -* should be deasserted after minimum of 100us once REFCLK is -* stable. The REFCLK to the connector in RC mode is selected -* while enabling the PHY. So deassert PERST# after 100 us. +* Section 2.2 of the PCI Express Card Electromechanical +* Specification (Revision 5.1) mandates that the deassertion +* of the PERST# signal should be delayed by 100 ms (TPVPERL). +* This shall ensure that the power and the reference clock +* are stable. */ if (pcie->reset_gpio) { -fsleep (PCIE_T_PERST_CLK_US ); +msleep (PCIE_T_PVPERL_MS );gpiod_set_value_cansleep (pcie->reset_gpio,1 ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 506/826 perf build: Add missing cflags when building with custom libtraceevent
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yicong Yang <[email protected]>
[ Upstream commit d5a0a4ab4af4c27de097b78d6f1b7e7f7e31908f ]
When building with custom libtraceevent, below errors occur:
$ make -C tools/perf NO_LIBPYTHON=1 PKG_CONFIG_PATH=<custom libtraceevent>
In file included from util/session.h:5,
from builtin-buildid-list.c:17:
util/trace-event.h:153:10: fatal error: traceevent/event-parse.h: No such file or directory
153 | #include <traceevent/event-parse.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
<snip similar errors of missing headers>This is because the include path is missed in the cflags. Add it.
--- tools/perf/Makefile.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/Makefile.config +1 -1
@@ -1194,7 +1194,7 @@ endif ifneq ($(NO_LIBTRACEEVENT),1) $(call feature_check,libtraceevent) ifeq ($(feature-libtraceevent), 1) - CFLAGS += -DHAVE_LIBTRACEEVENT + CFLAGS += -DHAVE_LIBTRACEEVENT $(shell $(PKG_CONFIG) --cflags libtraceevent) LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libtraceevent) EXTLIBS += $(shell $(PKG_CONFIG) --libs-only-l libtraceevent) LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent).0.0
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 507/826 f2fs: fix race in concurrent f2fs_stop_gc_thread
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Long Li <[email protected]>
[ Upstream commit 7b0033dbc48340a1c1c3f12448ba17d6587ca092 ]
In my test case, concurrent calls to f2fs shutdown report the following stack trace:
Oops: general protection fault, probably for non-canonical address 0xc6cfff63bb5513fc: 0000 [#1] PREEMPT SMP PTI CPU: 0 UID: 0 PID: 678 Comm: f2fs_rep_shutdo Not tainted 6.12.0-rc5-next-20241029-g6fb2fa9805c5-dirty #85 Call Trace: <TASK> ? show_regs+0x8b/0xa0 ? __die_body+0x26/0xa0 ? die_addr+0x54/0x90 ? exc_general_protection+0x24b/0x5c0 ? asm_exc_general_protection+0x26/0x30 ? kthread_stop+0x46/0x390 f2fs_stop_gc_thread+0x6c/0x110 f2fs_do_shutdown+0x309/0x3a0 f2fs_ioc_shutdown+0x150/0x1c0 __f2fs_ioctl+0xffd/0x2ac0 f2fs_ioctl+0x76/0xe0 vfs_ioctl+0x23/0x60 __x64_sys_ioctl+0xce/0xf0 x64_sys_call+0x2b1b/0x4540 do_syscall_64+0xa7/0x240 entry_SYSCALL_64_after_hwframe+0x76/0x7e
The root cause is a race condition in f2fs_stop_gc_thread() called from different f2fs shutdown paths:
[CPU0] [CPU1]
---------------------- -----------------------
f2fs_stop_gc_thread f2fs_stop_gc_thread
gc_th = sbi->gc_thread
gc_th = sbi->gc_thread
kfree(gc_th)
sbi->gc_thread = NULL
< gc_th != NULL >
kthread_stop(gc_th->f2fs_gc_task) //UAFThe commit c7f114d864ac ("f2fs: fix to avoid use-after-free in f2fs_stop_gc_thread()") attempted to fix this issue by using a read semaphore to prevent races between shutdown and remount threads, but it fails to prevent all race conditions.
Fix it by converting to write lock of s_umount in f2fs_do_shutdown().
--- fs/f2fs/file.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/f2fs/file.c +6 -3
@@ -2343,9 +2343,12 @@ int f2fs_do_shutdown(struct f2fs_sb_info *sbi, unsigned int flag,if (readonly) goto out; -/* grab sb->s_umount to avoid racing w/ remount() */ +/* +* grab sb->s_umount to avoid racing w/ remount() and other shutdown +* paths. +*/ if (need_lock) -down_read (&sbi->sb->s_umount); +down_write (&sbi->sb->s_umount);f2fs_stop_gc_thread (sbi);f2fs_stop_discard_thread (sbi);
@@ -2354,7 +2357,7 @@ int f2fs_do_shutdown(struct f2fs_sb_info *sbi, unsigned int flag,clear_opt (sbi,DISCARD );if (need_lock) -up_read (&sbi->sb->s_umount); +up_write (&sbi->sb->s_umount);f2fs_update_time (sbi,REQ_TIME ); out:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 508/826 f2fs: fix to map blocks correctly for direct write
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 5dd00ebda337b9295e7027691fa70540da369ff2 ]
f2fs_map_blocks() supports to map continuous holes or preallocated address, we should avoid setting F2FS_MAP_MAPPED for these cases only, otherwise, it may fail f2fs_iomap_begin(), and make direct write fallbacking to use buffered IO and flush, result in performance regression.
--- fs/f2fs/data.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/f2fs/data.c +2 -1
@@ -1676,7 +1676,8 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)/* reserved delalloc block should be mapped for fiemap. */ if (blkaddr ==NEW_ADDR ) map->m_flags |=F2FS_MAP_DELALLOC ; -if (flag !=F2FS_GET_BLOCK_DIO || !is_hole) +/* DIO READ and hole case, should not map the blocks. */ +if (!(flag ==F2FS_GET_BLOCK_DIO && is_hole && !map->m_may_create)) map->m_flags |=F2FS_MAP_MAPPED ; map->m_pblk = blkaddr;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 509/826 f2fs: fix to avoid forcing direct write to use buffered IO on inline_data inode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 26e6f59d0bbaac76fa3413462d780bd2b5f9f653 ]
Jinsu Lee reported a performance regression issue, after commit 5c8764f8679e ("f2fs: fix to force buffered IO on inline_data inode"), we forced direct write to use buffered IO on inline_data inode, it will cause performace regression due to memory copy and data flush.
It's fine to not force direct write to use buffered IO, as it can convert inline inode before committing direct write IO.
--- fs/f2fs/file.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/f2fs/file.c +5 -1
@@ -863,7 +863,11 @@ static bool f2fs_force_buffered_io(struct inode *inode, int rw)return true;if (f2fs_compressed_file (inode))return true; -if (f2fs_has_inline_data (inode)) +/* +* only force direct read to use buffered IO, for direct write, +* it expects inline data conversion before committing IO. +*/ +if (f2fs_has_inline_data (inode) && rw ==READ )return true;/* disallow direct IO if any of devices has unaligned blksize */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 510/826 perf trace: avoid garbage when not printing a trace events arguments
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Peterson <[email protected]>
[ Upstream commit 5fb8e56542a3cf469fdf25d77f50e21cbff3ae7e ]
trace__fprintf_tp_fields may not print any tracepoint arguments. E.g., if the argument values are all zero. Previously, this would result in a totally uninitialized buffer being passed to fprintf, which could lead to garbage on the console. Fix the problem by passing the number of initialized bytes fprintf.
--- tools/perf/builtin-trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-trace.c +1 -1
@@ -3087,7 +3087,7 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel, printed +=syscall_arg_fmt__scnprintf_val (arg, bf + printed, size - printed, &syscall_arg, val); } -return printed +fprintf (trace->output,"%s" , bf); +return printed +fprintf (trace->output,"%.*s" , (int )printed, bf); } static int trace__event_handler(struct trace *trace, struct evsel *evsel,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 511/826 m68k: mcfgpio: Fix incorrect register offset for CONFIG_M5441x
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jean-Michel Hautbois <[email protected]>
[ Upstream commit f212140962c93cd5da43283a18e31681540fc23d ]
Fix a typo in the CONFIG_M5441x preprocessor condition, where the GPIO register offset was incorrectly set to 8 instead of 0. This prevented proper GPIO configuration for m5441x targets.
--- arch/m68k/include/asm/mcfgpio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/m68k/include/asm/mcfgpio.h +1 -1
@@ -136,7 +136,7 @@ static inline void gpio_free(unsigned gpio)* read-modify-write as well as those controlled by the EPORT and GPIO modules. */ #define MCFGPIO_SCR_START 40 -#elif defined(CONFIGM5441x) +#elif defined(CONFIG_M5441x)/* The m5441x EPORT doesn't have its own GPIO port, uses PORT C */ #define MCFGPIO_SCR_START 0#else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 512/826 m68k: coldfire/device.c: only build FEC when HW macros are defined
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antonio Quartulli <[email protected]>
[ Upstream commit 63a24cf8cc330e5a68ebd2e20ae200096974c475 ]
When CONFIG_FEC is set (due to COMPILE_TEST) along with CONFIG_M54xx, coldfire/device.c has compile errors due to missing MCFEC_* and MCF_IRQ_FEC_* symbols.
Make the whole FEC blocks dependent on having the HW macros defined, rather than on CONFIG_FEC itself.
This fix is very similar to commit e6e1e7b19fa1 ("m68k: coldfire/device.c: only build for MCF_EDMA when h/w macros are defined")
To: Greg Ungerer <[email protected]>
To: Geert Uytterhoeven <[email protected]>
--- arch/m68k/coldfire/device.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/m68k/coldfire/device.c +4 -4
@@ -93,7 +93,7 @@ static struct platform_device mcf_uart = { .dev.platform_data = mcf_uart_platform_data, }; -#if IS_ENABLED (CONFIG_FEC ) +#ifdef MCFFEC_BASE0 #ifdef CONFIG_M5441x#define FEC_NAME "enet-fec"
@@ -145,6 +145,7 @@ static struct platform_device mcf_fec0 = { .platform_data = FEC_PDATA, } }; +#endif /* MCFFEC_BASE0 */ #ifdef MCFFEC_BASE1 static struct resource mcf_fec1_resources[] = {
@@ -182,7 +183,6 @@ static struct platform_device mcf_fec1 = { } };#endif /* MCFFEC_BASE1 */ -#endif /* CONFIG_FEC */ #if IS_ENABLED (CONFIG_SPI_COLDFIRE_QSPI )/*
@@ -624,12 +624,12 @@ static struct platform_device mcf_flexcan0 = {static struct platform_device *mcf_devices[]__initdata = { &mcf_uart, -#if IS_ENABLED(CONFIG_FEC) +#ifdef MCFFEC_BASE0 &mcf_fec0, +#endif #ifdef MCFFEC_BASE1 &mcf_fec1, #endif -#endif #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) &mcf_qspi, #endif
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 513/826 svcrdma: Address an integer overflow
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 3c63d8946e578663b868cb9912dac616ea68bfd0 ]
Dan Carpenter reports:
Quoted 20 lines
Commit
78147ca8b4a9("svcrdma: Add a "parsed chunk list" data structure") from Jun 22, 2020 (linux-next), leads to the following Smatch static checker warning:
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c:498xdr_check_write_chunk()
warn: potential user controlled sizeof overflow 'segcount * 4 * 4'
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c488 static bool xdr_check_write_chunk(struct svc_rdma_recv_ctxt *rctxt) 489 { 490 u32 segcount; 491 __be32 *p; 492 493 if (xdr_stream_decode_u32(&rctxt->rc_stream, &segcount)) ^^^^^^^^ 494 return false; 495 496 /* A bogus segcount causes this buffer overflow check to fail. */ 497 p = xdr_inline_decode(&rctxt->rc_stream,
Quoted 6 lines
--> 498 segcount *
rpcrdma_segment_maxsz*sizeof(*p));segcount is an untrusted u32. On 32bit systems anything >=
SIZE_MAX/ 16 will have an integer overflow and some those values will be accepted byxdr_inline_decode().
--- net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +7 -1
@@ -493,7 +493,13 @@ static bool xdr_check_write_chunk(struct svc_rdma_recv_ctxt *rctxt)if (xdr_stream_decode_u32 (&rctxt->rc_stream, &segcount))return false; -/* A bogus segcount causes this buffer overflow check to fail. */ +/* Before trusting the segcount value enough to use it in +* a computation, perform a simple range check. This is an +* arbitrary but sensible limit (ie, not architectural). +*/ +if (unlikely (segcount >RPCSVC_MAXPAGES )) +return false; + p =xdr_inline_decode (&rctxt->rc_stream, segcount * rpcrdma_segment_maxsz *sizeof (*p));return p !=NULL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 514/826 nfsd: drop inode parameter from nfsd4_change_attribute()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
[ Upstream commit f67eef8da0e8c54709fefdecd16ad8d70f0c9d20 ]
The inode that nfs4_open_delegation() passes to this function is wrong, which throws off the result. The inode will end up getting a directory-style change attr instead of a regular-file-style one.
Fix up nfs4_delegation_stat() to fetch STATX_MODE, and then drop the inode parameter from nfsd4_change_attribute(), since it's no longer needed.
--- fs/nfsd/nfs4state.c | 5 ++--- fs/nfsd/nfs4xdr.c | 2 +- fs/nfsd/nfsfh.c | 20 ++++++++++++-------- fs/nfsd/nfsfh.h | 3 +-- 4 files changed, 16 insertions(+), 14 deletions(-)
fs/nfsd/nfs4state.c +2 -3
@@ -5957,7 +5957,7 @@ nfs4_delegation_stat(struct nfs4_delegation *dp, struct svc_fh *currentfh, path.dentry =file_dentry (nf->nf_file); rc =vfs_getattr (&path, stat, - (STATX_SIZE |STATX_CTIME |STATX_CHANGE_COOKIE ), + (STATX_MODE |STATX_SIZE |STATX_CTIME |STATX_CHANGE_COOKIE ),AT_STATX_SYNC_AS_STAT );nfsd_file_put (nf);
@@ -6041,8 +6041,7 @@ nfs4_open_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp, } open->op_delegate_type =NFS4_OPEN_DELEGATE_WRITE ; dp->dl_cb_fattr.ncf_cur_fsize = stat.size; - dp->dl_cb_fattr.ncf_initial_cinfo = -nfsd4_change_attribute (&stat,d_inode (currentfh->fh_dentry)); + dp->dl_cb_fattr.ncf_initial_cinfo =nfsd4_change_attribute (&stat);trace_nfsd_deleg_write (&dp->dl_stid.sc_stateid); }else { open->op_delegate_type =NFS4_OPEN_DELEGATE_READ ;
fs/nfsd/nfs4xdr.c +1 -1
@@ -3040,7 +3040,7 @@ static __be32 nfsd4_encode_fattr4_change(struct xdr_stream *xdr,return nfs_ok; } - c =nfsd4_change_attribute (&args->stat,d_inode (args->dentry)); + c =nfsd4_change_attribute (&args->stat);return nfsd4_encode_changeid4 (xdr, c); }
fs/nfsd/nfsfh.c +12 -8
@@ -667,20 +667,18 @@ fh_update(struct svc_fh *fhp)__be32 __must_check fh_fill_pre_attrs (struct svc_fh *fhp) {bool v4 = (fhp->fh_maxsize ==NFS4_FHSIZE ); -struct inode *inode;struct kstat stat;__be32 err;if (fhp->fh_no_wcc || fhp->fh_pre_saved)return nfs_ok; - inode =d_inode (fhp->fh_dentry); err =fh_getattr (fhp, &stat);if (err)return err;if (v4) - fhp->fh_pre_change =nfsd4_change_attribute (&stat, inode); + fhp->fh_pre_change =nfsd4_change_attribute (&stat); fhp->fh_pre_mtime = stat.mtime; fhp->fh_pre_ctime = stat.ctime;
@@ -697,7 +695,6 @@ __be32 __must_check fh_fill_pre_attrs(struct svc_fh *fhp)__be32 fh_fill_post_attrs (struct svc_fh *fhp) {bool v4 = (fhp->fh_maxsize ==NFS4_FHSIZE ); -struct inode *inode =d_inode (fhp->fh_dentry);__be32 err;if (fhp->fh_no_wcc)
@@ -713,7 +710,7 @@ __be32 fh_fill_post_attrs(struct svc_fh *fhp) fhp->fh_post_saved = true;if (v4) fhp->fh_post_change = -nfsd4_change_attribute (&fhp->fh_post_attr, inode); +nfsd4_change_attribute (&fhp->fh_post_attr);return nfs_ok; }
@@ -804,7 +801,14 @@ enum fsid_source fsid_source(const struct svc_fh *fhp)return FSIDSOURCE_DEV ; } -/* +/** +* nfsd4_change_attribute - Generate an NFSv4 change_attribute value +* @stat: inode attributes +* +* Caller must fill in @stat before calling, typically by invoking +* vfs_getattr() with STATX_MODE, STATX_CTIME, and STATX_CHANGE_COOKIE. +* Returns an unsigned 64-bit changeid4 value (RFC 8881 Section 3.2). +* * We could use i_version alone as the change attribute. However, i_version * can go backwards on a regular file after an unclean shutdown. On its own * that doesn't necessarily cause a problem, but if i_version goes backwards
@@ -821,13 +825,13 @@ enum fsid_source fsid_source(const struct svc_fh *fhp)* assume that the new change attr is always logged to stable storage in some * fashion before the results can be seen. */ -u64 nfsd4_change_attribute (const struct kstat *stat,const struct inode *inode) +u64 nfsd4_change_attribute (const struct kstat *stat) {u64 chattr;if (stat->result_mask &STATX_CHANGE_COOKIE ) { chattr = stat->change_cookie; -if (S_ISREG (inode->i_mode) && +if (S_ISREG (stat->mode) && !(stat->attributes &STATX_ATTR_CHANGE_MONOTONIC )) { chattr += (u64 )stat->ctime.tv_sec <<30 ; chattr += stat->ctime.tv_nsec;
fs/nfsd/nfsfh.h +1 -2
@@ -297,8 +297,7 @@ static inline void fh_clear_pre_post_attrs(struct svc_fh *fhp) fhp->fh_pre_saved = false; } -u64 nfsd4_change_attribute (const struct kstat *stat, -const struct inode *inode); +u64 nfsd4_change_attribute (const struct kstat *stat);__be32 __must_check fh_fill_pre_attrs (struct svc_fh *fhp);__be32 fh_fill_post_attrs (struct svc_fh *fhp);__be32 __must_check fh_fill_both_attrs (struct svc_fh *fhp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 515/826 perf list: Fix topic and pmu_name argument order
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jean-Philippe Romain <[email protected]>
[ Upstream commit d99b3125726aade4f5ec4aae04805134ab4b0abd ]
Fix function definitions to match header file declaration. Fix two callers to pass the arguments in the right order.
On Intel Tigerlake, before:
```
$ perf list -j|grep "\"Topic\""|sort|uniq
"Topic": "cache",
"Topic": "cpu",
"Topic": "floating point",
"Topic": "frontend",
"Topic": "memory",
"Topic": "other",
"Topic": "pfm icl",
"Topic": "pfm ix86arch",
"Topic": "pfm perf_raw",
"Topic": "pipeline",
"Topic": "tool",
"Topic": "uncore interconnect",
"Topic": "uncore memory",
"Topic": "uncore other",
"Topic": "virtual memory",
$ perf list -j|grep "\"Unit\""|sort|uniq
"Unit": "cache",
"Unit": "cpu",
"Unit": "cstate_core",
"Unit": "cstate_pkg",
"Unit": "i915",
"Unit": "icl",
"Unit": "intel_bts",
"Unit": "intel_pt",
"Unit": "ix86arch",
"Unit": "msr",
"Unit": "perf_raw",
"Unit": "power",
"Unit": "tool",
"Unit": "uncore_arb",
"Unit": "uncore_clock",
"Unit": "uncore_imc_free_running_0",
"Unit": "uncore_imc_free_running_1",
```After:
```
$ perf list -j|grep "\"Topic\""|sort|uniq
"Topic": "cache",
"Topic": "floating point",
"Topic": "frontend",
"Topic": "memory",
"Topic": "other",
"Topic": "pfm icl",
"Topic": "pfm ix86arch",
"Topic": "pfm perf_raw",
"Topic": "pipeline",
"Topic": "tool",
"Topic": "uncore interconnect",
"Topic": "uncore memory",
"Topic": "uncore other",
"Topic": "virtual memory",
$ perf list -j|grep "\"Unit\""|sort|uniq
"Unit": "cpu",
"Unit": "cstate_core",
"Unit": "cstate_pkg",
"Unit": "i915",
"Unit": "icl",
"Unit": "intel_bts",
"Unit": "intel_pt",
"Unit": "ix86arch",
"Unit": "msr",
"Unit": "perf_raw",
"Unit": "power",
"Unit": "tool",
"Unit": "uncore_arb",
"Unit": "uncore_clock",
"Unit": "uncore_imc_free_running_0",
"Unit": "uncore_imc_free_running_1",
```--- tools/perf/builtin-list.c | 4 ++-- tools/perf/util/pfm.c | 4 ++-- tools/perf/util/pmus.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-)
tools/perf/builtin-list.c +2 -2
@@ -112,7 +112,7 @@ static void wordwrap(FILE *fp, const char *s, int start, int max, int corr) } } -static void default_print_event(void *ps, const char *pmu_name, const char *topic, +static void default_print_event(void *ps, const char *topic, const char *pmu_name, const char *event_name, const char *event_alias, const char *scale_unit __maybe_unused, bool deprecated, const char *event_type_desc,
@@ -353,7 +353,7 @@ static void fix_escape_fprintf(FILE *fp, struct strbuf *buf, const char *fmt, ..fputs (buf->buf, fp); } -static void json_print_event(void *ps, const char *pmu_name, const char *topic, +static void json_print_event(void *ps, const char *topic, const char *pmu_name, const char *event_name, const char *event_alias, const char *scale_unit, bool deprecated, const char *event_type_desc,
tools/perf/util/pfm.c +2 -2
@@ -233,7 +233,7 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state, }if (is_libpfm_event_supported (name, cpus, threads)) { - print_cb->print_event(print_state, pinfo->name, topic, + print_cb->print_event(print_state, topic, pinfo->name, name, info->equiv, /*scale_unit=*/NULL, /*deprecated=*/NULL, "PFM event",
@@ -267,8 +267,8 @@ print_libpfm_event(const struct print_callbacks *print_cb, void *print_state,continue ; print_cb->print_event(print_state, - pinfo->name, topic, + pinfo->name, name, /*alias=*/NULL, /*scale_unit=*/NULL, /*deprecated=*/NULL, "PFM event",
tools/perf/util/pmus.c +1 -1
@@ -494,8 +494,8 @@ void perf_pmus__print_pmu_events(const struct print_callbacks *print_cb, void *p goto free; print_cb->print_event(print_state, - aliases[j].pmu_name, aliases[j].topic, + aliases[j].pmu_name, aliases[j].name, aliases[j].alias, aliases[j].scale_unit,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 516/826 perf trace: Fix tracing itself, creating feedback loops
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Howard Chu <[email protected]>
[ Upstream commit fe4f9b4124967ffb75d66994520831231b779550 ]
There exists a pids_filtered map in augmented_raw_syscalls.bpf.c that ceases to provide functionality after the BPF skeleton migration done in:
5e6da6be3082f77b ("perf trace: Migrate BPF augmentation to use a skeleton")
Before the migration, pid_filtered map works, courtesy of Arnaldo Carvalho de Melo <[email protected]>:
⬢ [acme@toolbox perf-tools]$ git log --oneline -5
6f769c3458b6cf2d (HEAD) perf tests trace+probe_vfs_getname.sh: Accept quotes surrounding the filename 7777ac3dfe29f55d perf test trace+probe_vfs_getname.sh: Remove stray \ before /
33d9c5062113a4bd perf script python: Add stub for PMU symbol to the python binding
e59fea47f83e8a9a perf symbols: Fix DSO kernel load and symbol process to correctly map DSO to its long_name, type and adjust_symbols 878460e8d0ff84a0 perf build: Remove -Wno-unused-but-set-variable from the flex flags when building with clang < 13.0.0
root@x1:/home/acme/git/perf-tools# perf trace -e /tmp/augmented_raw_syscalls.o -e write* --max-events=30 &
[1] 180632
root@x1:/home/acme/git/perf-tools# 0.000 ( 0.051 ms): NetworkManager/1127 write(fd: 3, buf: 0x7ffeb508ef70, count: 8) = 8
0.115 ( 0.010 ms): NetworkManager/1127 write(fd: 3, buf: 0x7ffeb508ef70, count: 8) = 8
0.916 ( 0.068 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 246) = 246
1.699 ( 0.047 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 121) = 121
2.167 ( 0.041 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 121) = 121
2.739 ( 0.042 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 121) = 121
3.138 ( 0.027 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 121) = 121
3.477 ( 0.027 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 121) = 121
3.738 ( 0.023 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 121) = 121
3.946 ( 0.024 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 121) = 121
4.195 ( 0.024 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 121) = 121
4.212 ( 0.026 ms): NetworkManager/1127 write(fd: 3, buf: 0x7ffeb508ef70, count: 8) = 8
4.285 ( 0.006 ms): NetworkManager/1127 write(fd: 3, buf: 0x7ffeb508ef70, count: 8) = 8
4.445 ( 0.018 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 260) = 260
4.508 ( 0.009 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 124) = 124
4.592 ( 0.010 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 116) = 116
4.666 ( 0.009 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 130) = 130
4.715 ( 0.010 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 95) = 95
4.765 ( 0.007 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 102) = 102
4.815 ( 0.009 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 79) = 79
4.890 ( 0.008 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 57) = 57
4.937 ( 0.007 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 89) = 89
5.009 ( 0.010 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 112) = 112
5.059 ( 0.010 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 112) = 112
5.116 ( 0.007 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 79) = 79
5.152 ( 0.009 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 33) = 33
5.215 ( 0.008 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 37) = 37
5.293 ( 0.010 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 128) = 128
5.339 ( 0.009 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 89) = 89
5.384 ( 0.008 ms): sudo/156867 write(fd: 8, buf: 0x55cb4cd2f650, count: 100) = 100[1]+ Done perf trace -e /tmp/augmented_raw_syscalls.o -e write* --max-events=30 root@x1:/home/acme/git/perf-tools#
No events for the 'perf trace' (pid 180632), i.e. no feedback loop.
If we leave it running:
root@x1:/home/acme/git/perf-tools# perf trace -e /tmp/augmented_raw_syscalls.o -e landlock_add_rule & [1] 181068 root@x1:/home/acme/git/perf-tools#
And then look at what maps it sets up:
root@x1:/home/acme/git/perf-tools# bpftool map | grep pids_filtered -A3
1190: hash name pids_filtered flags 0x0
key 4B value 1B max_entries 64 memlock 7264B
btf_id 1613
pids perf(181068)
root@x1:/home/acme/git/perf-tools#And ask for dumping its contents:
We see that we are _also_ setting it to filter those:
root@x1:/home/acme/git/perf-tools# bpftool map dump id 1190
[{
"key": 181068,
"value": 1
},{
"key": 156801,
"value": 1
}
]Now testing the migration commit:
perf $ git log
commit 5e6da6be3082f77be06894a1a94d52a90b4007dc (HEAD)
Author: Ian Rogers <[email protected]>
Date: Thu Aug 10 11:48:51 2023 -0700
perf trace: Migrate BPF augmentation to use a skeleton
perf $ ./perf trace -e write --max-events=10 & echo #!
[1] 1808653
perf $
0.000 ( 0.010 ms): :1808671/1808671 write(fd: 1, buf: 0x6003f5b26fc0, count: 11) = 11
0.162 ( ): perf/1808653 write(fd: 2, buf: 0x7fffc2174e50, count: 11) ...
0.174 ( ): perf/1808653 write(fd: 2, buf: 0x74ce21804563, count: 1) ...
0.184 ( ): perf/1808653 write(fd: 2, buf: 0x57b936589052, count: 5)The feedback loop is there.
Keep it running, look into the bpf map:
perf $ bpftool map | grep pids_filtered
10675: hash name pids_filtered flags 0x0
perf $ bpftool map dump id 10675
[]
The map is empty.
Now, this commit:
64917f4df048a064 ("perf trace: Use heuristic when deciding if a syscall tracepoint "const char *" field is really a string")
Temporarily fixed the feedback loop for perf trace -e write, that's because before using the heuristic, write is hooked to sys_enter_openat:
perf $ git log
commit 83a0943b1870944612a8aa0049f910826ebfd4f7 (HEAD)
Author: Arnaldo Carvalho de Melo <[email protected]>
Date: Thu Aug 17 12:11:51 2023 -0300
perf trace: Use the augmented_raw_syscall BPF skel only for tracing syscalls
perf $ ./perf trace -e write --max-events=10 -v 2>&1 | grep Reusing Reusing "openat" BPF sys_enter augmenter for "write"
And after the heuristic fix, it's unaugmented:
perf $ git log
commit 64917f4df048a0649ea7901c2321f020e71e6f24 (HEAD)
Author: Arnaldo Carvalho de Melo <[email protected]>
Date: Thu Aug 17 15:14:21 2023 -0300
perf trace: Use heuristic when deciding if a syscall tracepoint "const char *" field is really a string
perf $ ./perf trace -e write --max-events=10 -v 2>&1 | grep Reusing perf $
After using the heuristic, write is hooked to syscall_unaugmented, which returns 1.
SEC("tp/raw_syscalls/sys_enter")
int syscall_unaugmented(struct syscall_enter_args *args)
{
return 1;
}If the BPF program returns 1, the tracepoint filter will filter it (since the tracepoint filter for perf is correctly set), but before the heuristic, when it was hooked to a sys_enter_openat(), which is a BPF program that calls bpf_perf_event_output() and writes to the buffer, it didn't get filtered, thus creating feedback loop. So switching write to unaugmented accidentally fixed the problem.
But some syscalls are not so lucky, for example newfstatat:
perf $ ./perf trace -e newfstatat --max-events=100 & echo #!
[1] 2166948
457.718 ( ): perf/2166948 newfstatat(dfd: CWD, filename: "/proc/self/ns/mnt", statbuf: 0x7fff0132a9f0) ... 457.749 ( ): perf/2166948 newfstatat(dfd: CWD, filename: "/proc/2166950/ns/mnt", statbuf: 0x7fff0132aa80) ... 457.962 ( ): perf/2166948 newfstatat(dfd: CWD, filename: "/proc/self/ns/mnt", statbuf: 0x7fff0132a9f0) ...
Currently, write is augmented by the new BTF general augmenter (which calls bpf_perf_event_output()). The problem, which luckily got fixed, resurfaced, and that’s how it was discovered.
--- tools/perf/builtin-trace.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/builtin-trace.c +3 -0
@@ -4326,6 +4326,9 @@ static int trace__run(struct trace *trace, int argc, const char **argv) sizeof(__u32), BPF_ANY); } } + +if (trace->skel) + trace->filter_pids.map = trace->skel->maps.pids_filtered;#endif err =trace__set_filter_pids (trace);if (err <0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 517/826 perf trace: Do not lose last events in a race
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Peterson <[email protected]>
[ Upstream commit 3fd7c36973a250e17a4ee305a31545a9426021f4 ]
If a perf trace event selector specifies a maximum number of events to output (i.e., "/nr=N/" syntax), the event printing handler, trace__event_handler, disables the event selector after the maximum number events are printed.
Furthermore, trace__event_handler checked if the event selector was disabled before doing any work. This avoided exceeding the maximum number of events to print if more events were in the buffer before the selector was disabled.
However, the event selector can be disabled for reasons other than exceeding the maximum number of events. In particular, when the traced subprocess exits, the main loop disables all event selectors. This meant the last events of a traced subprocess might be lost to the printing handler's short-circuiting logic.
This nondeterministic problem could be seen by running the following many times:
$ perf trace -e syscalls:sys_enter_exit_group true
trace__event_handler should simply check for exceeding the maximum number of events to print rather than the state of the event selector.
--- tools/perf/builtin-trace.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
tools/perf/builtin-trace.c +2 -7
@@ -3096,13 +3096,8 @@ static int trace__event_handler(struct trace *trace, struct evsel *evsel, {struct thread *thread;int callchain_ret =0 ; -/* -* Check if we called perf_evsel__disable(evsel) due to, for instance, -* this event's max_events having been hit and this is an entry coming -* from the ring buffer that we should discard, since the max events -* have already been considered/printed. -*/ -if (evsel->disabled) + +if (evsel->nr_events_printed >= evsel->max_events)return 0 ; thread =machine__findnew_thread (trace->host, sample->pid, sample->tid);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 518/826 perf trace: Avoid garbage when not printing a syscalls arguments
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Peterson <[email protected]>
[ Upstream commit 1302e352b26f34991b619b5d0b621b76d20a3883 ]
syscall__scnprintf_args may not place anything in the output buffer (e.g., because the arguments are all zero). If that happened in trace__fprintf_sys_enter, its fprintf would receive an unitialized buffer leading to garbage output.
Fix the problem by passing the (possibly zero) bounds of the argument buffer to the output fprintf.
--- tools/perf/builtin-trace.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/perf/builtin-trace.c +3 -2
@@ -2702,6 +2702,7 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,char msg[1024 ];void *args, *augmented_args =NULL ;int augmented_args_size; +size_t printed =0 ;if (sc ==NULL )return -1 ;
@@ -2717,8 +2718,8 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel, args =perf_evsel__sc_tp_ptr (evsel, args, sample); augmented_args =syscall__augmented_args (sc, sample, &augmented_args_size, trace->raw_augmented_syscalls_args_size); -syscall__scnprintf_args (sc, msg,sizeof (msg), args, augmented_args, augmented_args_size, trace, thread); -fprintf (trace->output,"%s" , msg); + printed +=syscall__scnprintf_args (sc, msg,sizeof (msg), args, augmented_args, augmented_args_size, trace, thread); +fprintf (trace->output,"%.*s" , (int )printed, msg); err =0 ; out_put:thread__put (thread);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 519/826 remoteproc: qcom: pas: Remove subdevs on the error path of adsp_probe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Hattori <[email protected]>
[ Upstream commit 587b67cf62a91b10a47f41c20ed8ad71db375334 ]
Current implementation of adsp_probe() in qcom_q6v5_pas.c does not remove the subdevs of adsp on the error path. Fix this bug by calling qcom_remove_{ssr,sysmon,pdm,smd,glink}_subdev(), qcom_q6v5_deinit(), and adsp_unassign_memory_region() appropriately.
--- drivers/remoteproc/qcom_q6v5_pas.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
drivers/remoteproc/qcom_q6v5_pas.c +15 -5
@@ -759,16 +759,16 @@ static int adsp_probe(struct platform_device *pdev) ret =adsp_init_clock (adsp);if (ret) - goto free_rproc; + goto unassign_mem; ret =adsp_init_regulator (adsp);if (ret) - goto free_rproc; + goto unassign_mem; ret =adsp_pds_attach (&pdev->dev, adsp->proxy_pds, desc->proxy_pd_names);if (ret <0 ) - goto free_rproc; + goto unassign_mem; adsp->proxy_pd_count = ret; ret = qcom_q6v5_init(&adsp->q6v5, pdev, rproc, desc->crash_reason_smem, desc->load_state,
@@ -784,18 +784,28 @@ static int adsp_probe(struct platform_device *pdev) desc->ssctl_id);if (IS_ERR (adsp->sysmon)) { ret =PTR_ERR (adsp->sysmon); - goto detach_proxy_pds; + goto deinit_remove_pdm_smd_glink; }qcom_add_ssr_subdev (rproc, &adsp->ssr_subdev, desc->ssr_name); ret =rproc_add (rproc);if (ret) - goto detach_proxy_pds; + goto remove_ssr_sysmon;return 0 ; +remove_ssr_sysmon: +qcom_remove_ssr_subdev (rproc, &adsp->ssr_subdev); +qcom_remove_sysmon_subdev (adsp->sysmon); +deinit_remove_pdm_smd_glink: +qcom_remove_pdm_subdev (rproc, &adsp->pdm_subdev); +qcom_remove_smd_subdev (rproc, &adsp->smd_subdev); +qcom_remove_glink_subdev (rproc, &adsp->glink_subdev); +qcom_q6v5_deinit (&adsp->q6v5); detach_proxy_pds:adsp_pds_detach (adsp, adsp->proxy_pds, adsp->proxy_pd_count); +unassign_mem: +adsp_unassign_memory_region (adsp); free_rproc:device_init_wakeup (adsp->dev, false);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 520/826 remoteproc: qcom: adsp: Remove subdevs on the error path of adsp_probe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Hattori <[email protected]>
[ Upstream commit fe80d3205e91e36e67f4d3d6c326793298d15766 ]
Current implementation of adsp_probe() in qcom_q6v5_adsp.c and does not remove the subdevs of adsp on the error path. Fix this bug by calling qcom_remove_{ssr,sysmon,pdm,smd,glink}_subdev(), and qcom_q6v5_deinit() appropriately.
--- drivers/remoteproc/qcom_q6v5_adsp.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/remoteproc/qcom_q6v5_adsp.c +9 -2
@@ -734,15 +734,22 @@ static int adsp_probe(struct platform_device *pdev) desc->ssctl_id);if (IS_ERR (adsp->sysmon)) { ret =PTR_ERR (adsp->sysmon); - goto disable_pm; + goto deinit_remove_glink_pdm_ssr; } ret =rproc_add (rproc);if (ret) - goto disable_pm; + goto remove_sysmon;return 0 ; +remove_sysmon: +qcom_remove_sysmon_subdev (adsp->sysmon); +deinit_remove_glink_pdm_ssr: +qcom_q6v5_deinit (&adsp->q6v5); +qcom_remove_glink_subdev (rproc, &adsp->glink_subdev); +qcom_remove_pdm_subdev (rproc, &adsp->pdm_subdev); +qcom_remove_ssr_subdev (rproc, &adsp->ssr_subdev); disable_pm:qcom_rproc_pds_detach (adsp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 521/826 remoteproc: qcom: pas: add minidump_id to SM8350 resources
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit e8983156d54f59f57e648ecd44f01c16572da842 ]
Specify minidump_id for the SM8350 DSPs. It was omitted for in the original commit e8b4e9a21af7 ("remoteproc: qcom: pas: Add SM8350 PAS remoteprocs").
--- drivers/remoteproc/qcom_q6v5_pas.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/remoteproc/qcom_q6v5_pas.c +2 -0
@@ -917,6 +917,7 @@ static const struct adsp_data sm8250_adsp_resource = { .crash_reason_smem = 423, .firmware_name = "adsp.mdt", .pas_id = 1, + .minidump_id = 5, .auto_boot = true, .proxy_pd_names = (char *[]){"lcx" ,
@@ -1134,6 +1135,7 @@ static const struct adsp_data sm8350_cdsp_resource = { .crash_reason_smem = 601, .firmware_name = "cdsp.mdt", .pas_id = 18, + .minidump_id = 7, .auto_boot = true, .proxy_pd_names = (char *[]){"cx" ,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 522/826 rpmsg: glink: use only lower 16-bits of param2 for CMD_OPEN name length
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Marek <[email protected]>
[ Upstream commit 06c59d97f63c1b8af521fa5aef8a716fb988b285 ]
The name len field of the CMD_OPEN packet is only 16-bits and the upper 16-bits of "param2" are a different "prio" field, which can be nonzero in certain situations, and CMD_OPEN packets can be unexpectedly dropped because of this.
Fix this by masking out the upper 16 bits of param2.
--- drivers/rpmsg/qcom_glink_native.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/rpmsg/qcom_glink_native.c +2 -1
@@ -1204,7 +1204,8 @@ void qcom_glink_native_rx(struct qcom_glink *glink) ret =qcom_glink_rx_open_ack (glink, param1);break ;case GLINK_CMD_OPEN : - ret =qcom_glink_rx_defer (glink, param2); +/* upper 16 bits of param2 are the "prio" field */ + ret =qcom_glink_rx_defer (glink, param2 &0xffff );break ;case GLINK_CMD_TX_DATA :case GLINK_CMD_TX_DATA_CONT :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 523/826 remoteproc: qcom_q6v5_mss: Re-order writes to the IMEM region
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sibi Sankar <[email protected]>
[ Upstream commit 7b22b7719fc17d5979a991c918c868ab041be5c8 ]
Any write access to the IMEM region when the Q6 is setting up XPU protection on it will result in a XPU violation. Fix this by ensuring IMEM writes related to the MBA post-mortem logs happen before the Q6 is brought out of reset.
--- drivers/remoteproc/qcom_q6v5_mss.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/remoteproc/qcom_q6v5_mss.c +3 -3
@@ -1162,6 +1162,9 @@ static int q6v5_mba_load(struct q6v5 *qproc) goto disable_active_clks; } +if (qproc->has_mba_logs) +qcom_pil_info_store ("mba" , qproc->mba_phys,MBA_LOG_SIZE ); +writel (qproc->mba_phys, qproc->rmb_base +RMB_MBA_IMAGE_REG );if (qproc->dp_size) {writel (qproc->mba_phys +SZ_1M , qproc->rmb_base +RMB_PMI_CODE_START_REG );
@@ -1172,9 +1175,6 @@ static int q6v5_mba_load(struct q6v5 *qproc)if (ret) goto reclaim_mba; -if (qproc->has_mba_logs) -qcom_pil_info_store ("mba" , qproc->mba_phys,MBA_LOG_SIZE ); - ret =q6v5_rmb_mba_wait (qproc,0 ,5000 );if (ret == -ETIMEDOUT ) {dev_err (qproc->dev,"MBA boot timed out\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 524/826 PCI: endpoint: epf-mhi: Avoid NULL dereference if DT lacks mmio
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhongqiu Han <[email protected]>
[ Upstream commit 5089b3d874e9933d9842e90410d3af1520494757 ]
If platform_get_resource_byname() fails and returns NULL because DT lacks an 'mmio' property for the MHI endpoint, dereferencing res->start will cause a NULL pointer access. Add a check to prevent it.
--- drivers/pci/endpoint/functions/pci-epf-mhi.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/pci/endpoint/functions/pci-epf-mhi.c +6 -0
@@ -867,12 +867,18 @@ static int pci_epf_mhi_bind(struct pci_epf *epf) {struct pci_epf_mhi *epf_mhi =epf_get_drvdata (epf);struct pci_epc *epc = epf->epc; +struct device *dev = &epf->dev;struct platform_device *pdev =to_platform_device (epc->dev.parent);struct resource *res;int ret;/* Get MMIO base address from Endpoint controller */ res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"mmio" ); +if (!res) { +dev_err (dev,"Failed to get \"mmio\" resource\n" ); +return -ENODEV ; + } + epf_mhi->mmio_phys = res->start; epf_mhi->mmio_size =resource_size (res);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 525/826 NFSD: Prevent NULL dereference in nfsd4_process_cb_update()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 1e02c641c3a43c88cecc08402000418e15578d38 ]
@ses is initialized to NULL. If __nfsd4_find_backchannel() finds no available backchannel session, setup_callback_client() will try to dereference @ses and segfault.
--- fs/nfsd/nfs4callback.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfsd/nfs4callback.c +2 -0
@@ -1461,6 +1461,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb) ses = c->cn_session; }spin_unlock (&clp->cl_lock); +if (!c) +return ; err =setup_callback_client (clp, &conn, ses);if (err) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 526/826 NFSD: Cap the number of bytes copied by nfs4_reset_recoverydir()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit f64ea4af43161bb86ffc77e6aeb5bcf5c3229df0 ]
It's only current caller already length-checks the string, but let's be safe.
--- fs/nfsd/nfs4recover.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/nfsd/nfs4recover.c +2 -1
@@ -659,7 +659,8 @@ nfs4_reset_recoverydir(char *recdir)return status; status = -ENOTDIR ;if (d_is_dir (path.dentry)) { -strcpy (user_recovery_dirname, recdir); +strscpy (user_recovery_dirname, recdir, +sizeof (user_recovery_dirname)); status =0 ; }path_put (&path);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 527/826 nfsd: release svc_expkey/svc_export with rcu_work
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Erkun <[email protected]>
[ Upstream commit f8c989a0c89a75d30f899a7cabdc14d72522bb8d ]
The last reference for cache_head can be reduced to zero in c_show and e_show(using rcu_read_lock and rcu_read_unlock). Consequently, svc_export_put and expkey_put will be invoked, leading to two issues:
1. The svc_export_put will directly free ex_uuid. However, e_show/c_show will access ex_uuid after cache_put, which can trigger a use-after-free issue, shown below.
==================================================================
BUG: KASAN: slab-use-after-free in svc_export_show+0x362/0x430 [nfsd]
Read of size 1 at addr ff11000010fdc120 by task cat/870
CPU: 1 UID: 0 PID: 870 Comm: cat Not tainted 6.12.0-rc3+ #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
1.16.1-2.fc37 04/01/2014
Call Trace:
<TASK>
dump_stack_lvl+0x53/0x70
print_address_description.constprop.0+0x2c/0x3a0
print_report+0xb9/0x280
kasan_report+0xae/0xe0
svc_export_show+0x362/0x430 [nfsd]
c_show+0x161/0x390 [sunrpc]
seq_read_iter+0x589/0x770
seq_read+0x1e5/0x270
proc_reg_read+0xe1/0x140
vfs_read+0x125/0x530
ksys_read+0xc1/0x160
do_syscall_64+0x5f/0x170
entry_SYSCALL_64_after_hwframe+0x76/0x7e
Allocated by task 830:
kasan_save_stack+0x20/0x40
kasan_save_track+0x14/0x30
__kasan_kmalloc+0x8f/0xa0
__kmalloc_node_track_caller_noprof+0x1bc/0x400
kmemdup_noprof+0x22/0x50
svc_export_parse+0x8a9/0xb80 [nfsd]
cache_do_downcall+0x71/0xa0 [sunrpc]
cache_write_procfs+0x8e/0xd0 [sunrpc]
proc_reg_write+0xe1/0x140
vfs_write+0x1a5/0x6d0
ksys_write+0xc1/0x160
do_syscall_64+0x5f/0x170
entry_SYSCALL_64_after_hwframe+0x76/0x7e
Freed by task 868:
kasan_save_stack+0x20/0x40
kasan_save_track+0x14/0x30
kasan_save_free_info+0x3b/0x60
__kasan_slab_free+0x37/0x50
kfree+0xf3/0x3e0
svc_export_put+0x87/0xb0 [nfsd]
cache_purge+0x17f/0x1f0 [sunrpc]
nfsd_destroy_serv+0x226/0x2d0 [nfsd]
nfsd_svc+0x125/0x1e0 [nfsd]
write_threads+0x16a/0x2a0 [nfsd]
nfsctl_transaction_write+0x74/0xa0 [nfsd]
vfs_write+0x1a5/0x6d0
ksys_write+0xc1/0x160
do_syscall_64+0x5f/0x170
entry_SYSCALL_64_after_hwframe+0x76/0x7e2. We cannot sleep while using rcu_read_lock/rcu_read_unlock. However, svc_export_put/expkey_put will call path_put, which subsequently triggers a sleeping operation due to the following dput.
=============================
WARNING: suspicious RCU usage
5.10.0-dirty #141 Not tainted
-----------------------------
...
Call Trace: dump_stack+0x9a/0xd0 ___might_sleep+0x231/0x240 dput+0x39/0x600 path_put+0x1b/0x30 svc_export_put+0x17/0x80 e_show+0x1c9/0x200 seq_read_iter+0x63f/0x7c0 seq_read+0x226/0x2d0 vfs_read+0x113/0x2c0 ksys_read+0xc9/0x170 do_syscall_64+0x33/0x40 entry_SYSCALL_64_after_hwframe+0x67/0xd1
Fix these issues by using rcu_work to help release svc_expkey/svc_export. This approach allows for an asynchronous context to invoke path_put and also facilitates the freeing of uuid/exp/key after an RCU grace period.
--- fs/nfsd/export.c | 31 +++++++++++++++++++++++++------ fs/nfsd/export.h | 4 ++-- 2 files changed, 27 insertions(+), 8 deletions(-)
fs/nfsd/export.c +25 -6
@@ -40,15 +40,24 @@#define EXPKEY_HASHMAX (1 << EXPKEY_HASHBITS)#define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1) -static void expkey_put (struct kref *ref) +static void expkey_put_work (struct work_struct *work) { - struct svc_expkey *key = container_of(ref, struct svc_expkey, h.ref); +struct svc_expkey *key = + container_of(to_rcu_work(work), struct svc_expkey, ek_rcu_work);if (test_bit (CACHE_VALID , &key->h.flags) && !test_bit (CACHE_NEGATIVE , &key->h.flags))path_put (&key->ek_path);auth_domain_put (key->ek_client); -kfree_rcu (key, ek_rcu); +kfree (key); +} + +static void expkey_put (struct kref *ref) +{ + struct svc_expkey *key = container_of(ref, struct svc_expkey, h.ref); + +INIT_RCU_WORK (&key->ek_rcu_work, expkey_put_work); +queue_rcu_work (system_wq, &key->ek_rcu_work); }static int expkey_upcall (struct cache_detail *cd,struct cache_head *h)
@@ -355,16 +364,26 @@ static void export_stats_destroy(struct export_stats *stats) EXP_STATS_COUNTERS_NUM); } -static void svc_export_put (struct kref *ref) +static void svc_export_put_work (struct work_struct *work) { - struct svc_export *exp = container_of(ref, struct svc_export, h.ref); +struct svc_export *exp = + container_of(to_rcu_work(work), struct svc_export, ex_rcu_work); +path_put (&exp->ex_path);auth_domain_put (exp->ex_client);nfsd4_fslocs_free (&exp->ex_fslocs);export_stats_destroy (exp->ex_stats);kfree (exp->ex_stats);kfree (exp->ex_uuid); -kfree_rcu (exp, ex_rcu); +kfree (exp); +} + +static void svc_export_put (struct kref *ref) +{ + struct svc_export *exp = container_of(ref, struct svc_export, h.ref); + +INIT_RCU_WORK (&exp->ex_rcu_work, svc_export_put_work); +queue_rcu_work (system_wq, &exp->ex_rcu_work); }static int svc_export_upcall (struct cache_detail *cd,struct cache_head *h)
fs/nfsd/export.h +2 -2
@@ -75,7 +75,7 @@ struct svc_export {u32 ex_layout_types;struct nfsd4_deviceid_map *ex_devid_map;struct cache_detail *cd; -struct rcu_head ex_rcu; +struct rcu_work ex_rcu_work;unsigned long ex_xprtsec_modes;struct export_stats *ex_stats; };
@@ -92,7 +92,7 @@ struct svc_expkey {u32 ek_fsid[6 ];struct path ek_path; -struct rcu_head ek_rcu; +struct rcu_work ek_rcu_work; };#define EX_ISSYNC (exp) (!((exp)->ex_flags & NFSEXP_ASYNC))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 528/826 svcrdma: fix miss destroy percpu_counter in svc_rdma_proc_init()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ye Bin <[email protected]>
[ Upstream commit ce89e742a4c12b20f09a43fec1b21db33f2166cd ]
There's issue as follows:
RPC: Registered rdma transport module.
RPC: Registered rdma backchannel transport module.
RPC: Unregistered rdma transport module.
RPC: Unregistered rdma backchannel transport module.
BUG: unable to handle page fault for address: fffffbfff80c609a PGD 123fee067 P4D 123fee067 PUD 123fea067 PMD 10c624067 PTE 0 Oops: Oops: 0000 [#1] PREEMPT SMP KASAN NOPTI RIP: 0010:percpu_counter_destroy_many+0xf7/0x2a0 Call Trace: <TASK> __die+0x1f/0x70 page_fault_oops+0x2cd/0x860 spurious_kernel_fault+0x36/0x450 do_kern_addr_fault+0xca/0x100 exc_page_fault+0x128/0x150 asm_exc_page_fault+0x26/0x30 percpu_counter_destroy_many+0xf7/0x2a0 mmdrop+0x209/0x350 finish_task_switch.isra.0+0x481/0x840 schedule_tail+0xe/0xd0 ret_from_fork+0x23/0x80 ret_from_fork_asm+0x1a/0x30 </TASK>
If register_sysctl() return NULL, then svc_rdma_proc_cleanup() will not destroy the percpu counters which init in svc_rdma_proc_init(). If CONFIG_HOTPLUG_CPU is enabled, residual nodes may be in the 'percpu_counters' list. The above issue may occur once the module is removed. If the CONFIG_HOTPLUG_CPU configuration is not enabled, memory leakage occurs.
To solve above issue just destroy all percpu counters when register_sysctl() return NULL.
--- net/sunrpc/xprtrdma/svc_rdma.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
net/sunrpc/xprtrdma/svc_rdma.c +14 -5
@@ -233,25 +233,34 @@ static int svc_rdma_proc_init(void) rc =percpu_counter_init (&svcrdma_stat_read,0 ,GFP_KERNEL );if (rc) - goto out_err; + goto err; rc =percpu_counter_init (&svcrdma_stat_recv,0 ,GFP_KERNEL );if (rc) - goto out_err; + goto err_read; rc =percpu_counter_init (&svcrdma_stat_sq_starve,0 ,GFP_KERNEL );if (rc) - goto out_err; + goto err_recv; rc =percpu_counter_init (&svcrdma_stat_write,0 ,GFP_KERNEL );if (rc) - goto out_err; + goto err_sq; svcrdma_table_header =register_sysctl ("sunrpc/svc_rdma" , svcrdma_parm_table); +if (!svcrdma_table_header) + goto err_write; +return 0 ; -out_err: +err_write: + rc = -ENOMEM ; +percpu_counter_destroy (&svcrdma_stat_write); +err_sq:percpu_counter_destroy (&svcrdma_stat_sq_starve); +err_recv:percpu_counter_destroy (&svcrdma_stat_recv); +err_read:percpu_counter_destroy (&svcrdma_stat_read); +err:return rc; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 529/826 NFSD: Fix nfsd4_shutdown_copy()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 62a8642ba00aa8ceb0a02ade942f5ec52e877c95 ]
nfsd4_shutdown_copy() is just this:
while ((copy = nfsd4_get_copy(clp)) != NULL) nfsd4_stop_copy(copy);
nfsd4_get_copy() bumps @copy's reference count, preventing nfsd4_stop_copy() from releasing @copy.
A while loop like this usually works by removing the first element of the list, but neither nfsd4_get_copy() nor nfsd4_stop_copy() alters the async_copies list.
Best I can tell, then, is that nfsd4_shutdown_copy() continues to loop until other threads manage to remove all the items from this list. The spinning loop blocks shutdown until these items are gone.
Possibly the reason we haven't seen this issue in the field is because client_has_state() prevents __destroy_client() from calling nfsd4_shutdown_copy() if there are any items on this list. In a subsequent patch I plan to remove that restriction.
--- fs/nfsd/nfs4proc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/nfsd/nfs4proc.c +5 -2
@@ -1292,7 +1292,7 @@ static void nfsd4_stop_copy(struct nfsd4_copy *copy)nfs4_put_copy (copy); } -static struct nfsd4_copy *nfsd4_get_copy (struct nfs4_client *clp) +static struct nfsd4_copy *nfsd4_unhash_copy (struct nfs4_client *clp) {struct nfsd4_copy *copy =NULL ;
@@ -1301,6 +1301,9 @@ static struct nfsd4_copy *nfsd4_get_copy(struct nfs4_client *clp) copy = list_first_entry(&clp->async_copies, struct nfsd4_copy, copies);refcount_inc (©->refcount); + copy->cp_clp =NULL ; +if (!list_empty (©->copies)) +list_del_init (©->copies); }spin_unlock (&clp->async_lock);return copy;
@@ -1310,7 +1313,7 @@ void nfsd4_shutdown_copy(struct nfs4_client *clp) {struct nfsd4_copy *copy; -while ((copy =nfsd4_get_copy (clp)) !=NULL ) +while ((copy =nfsd4_unhash_copy (clp)) !=NULL )nfsd4_stop_copy (copy); }#ifdef CONFIG_NFSD_V4_2_INTER_SSC
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 530/826 nfs_common: must not hold RCU while calling nfsd_file_put_local
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
[ Upstream commit c840b8e1f039e90f97ca55525667eb961422f86c ]
Move holding the RCU from nfs_to_nfsd_file_put_local to nfs_to_nfsd_net_put. It is the call to nfs_to->nfsd_serv_put that requires the RCU anyway (the puts for nfsd_file and netns were combined to avoid an extra indirect reference but that micro-optimization isn't possible now).
This fixes xfstests generic/013 and it triggering:
"Voluntary context switch within RCU read-side critical section!"
[ 143.545738] Call Trace: [ 143.546206] <TASK> [ 143.546625] ? show_regs+0x6d/0x80 [ 143.547267] ? __warn+0x91/0x140 [ 143.547951] ? rcu_note_context_switch+0x496/0x5d0 [ 143.548856] ? report_bug+0x193/0x1a0 [ 143.549557] ? handle_bug+0x63/0xa0 [ 143.550214] ? exc_invalid_op+0x1d/0x80 [ 143.550938] ? asm_exc_invalid_op+0x1f/0x30 [ 143.551736] ? rcu_note_context_switch+0x496/0x5d0 [ 143.552634] ? wakeup_preempt+0x62/0x70 [ 143.553358] __schedule+0xaa/0x1380 [ 143.554025] ? _raw_spin_unlock_irqrestore+0x12/0x40 [ 143.554958] ? try_to_wake_up+0x1fe/0x6b0 [ 143.555715] ? wake_up_process+0x19/0x20 [ 143.556452] schedule+0x2e/0x120 [ 143.557066] schedule_preempt_disabled+0x19/0x30 [ 143.557933] rwsem_down_read_slowpath+0x24d/0x4a0 [ 143.558818] ? xfs_efi_item_format+0x50/0xc0 [xfs] [ 143.559894] down_read+0x4e/0xb0 [ 143.560519] xlog_cil_commit+0x1b2/0xbc0 [xfs] [ 143.561460] ? _raw_spin_unlock+0x12/0x30 [ 143.562212] ? xfs_inode_item_precommit+0xc7/0x220 [xfs] [ 143.563309] ? xfs_trans_run_precommits+0x69/0xd0 [xfs] [ 143.564394] __xfs_trans_commit+0xb5/0x330 [xfs] [ 143.565367] xfs_trans_roll+0x48/0xc0 [xfs] [ 143.566262] xfs_defer_trans_roll+0x57/0x100 [xfs] [ 143.567278] xfs_defer_finish_noroll+0x27a/0x490 [xfs] [ 143.568342] xfs_defer_finish+0x1a/0x80 [xfs] [ 143.569267] xfs_bunmapi_range+0x4d/0xb0 [xfs] [ 143.570208] xfs_itruncate_extents_flags+0x13d/0x230 [xfs] [ 143.571353] xfs_free_eofblocks+0x12e/0x190 [xfs] [ 143.572359] xfs_file_release+0x12d/0x140 [xfs] [ 143.573324] __fput+0xe8/0x2d0 [ 143.573922] __fput_sync+0x1d/0x30 [ 143.574574] nfsd_filp_close+0x33/0x60 [nfsd] [ 143.575430] nfsd_file_free+0x96/0x150 [nfsd] [ 143.576274] nfsd_file_put+0xf7/0x1a0 [nfsd] [ 143.577104] nfsd_file_put_local+0x18/0x30 [nfsd] [ 143.578070] nfs_close_local_fh+0x101/0x110 [nfs_localio] [ 143.579079] __put_nfs_open_context+0xc9/0x180 [nfs] [ 143.580031] nfs_file_clear_open_context+0x4a/0x60 [nfs] [ 143.581038] nfs_file_release+0x3e/0x60 [nfs] [ 143.581879] __fput+0xe8/0x2d0 [ 143.582464] __fput_sync+0x1d/0x30 [ 143.583108] __x64_sys_close+0x41/0x80 [ 143.583823] x64_sys_call+0x189a/0x20d0 [ 143.584552] do_syscall_64+0x64/0x170 [ 143.585240] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 143.586185] RIP: 0033:0x7f3c5153efd7
--- fs/nfs_common/nfslocalio.c | 8 +++----- fs/nfsd/filecache.c | 14 +++++++------- fs/nfsd/filecache.h | 2 +- include/linux/nfslocalio.h | 18 +++++++++++++++--- 4 files changed, 26 insertions(+), 16 deletions(-)
fs/nfs_common/nfslocalio.c +3 -5
@@ -155,11 +155,9 @@ struct nfsd_file *nfs_open_local_fh(nfs_uuid_t *uuid,/* We have an implied reference to net thanks to nfsd_serv_try_get */ localio = nfs_to->nfsd_open_local_fh (net, uuid->dom, rpc_clnt, cred, nfs_fh, fmode); -if (IS_ERR (localio)) { -rcu_read_lock (); - nfs_to->nfsd_serv_put (net); -rcu_read_unlock (); - } +if (IS_ERR (localio)) +nfs_to_nfsd_net_put (net); +return localio; }EXPORT_SYMBOL_GPL (nfs_open_local_fh);
fs/nfsd/filecache.c +7 -7
@@ -391,19 +391,19 @@ nfsd_file_put(struct nfsd_file *nf) }/** -* nfsd_file_put_local - put the reference to nfsd_file and local nfsd_serv -* @nf: nfsd_file of which to put the references +* nfsd_file_put_local - put nfsd_file reference and arm nfsd_serv_put in caller +* @nf: nfsd_file of which to put the reference * -* First put the reference of the nfsd_file and then put the -* reference to the associated nn->nfsd_serv. +* First save the associated net to return to caller, then put +* the reference of the nfsd_file. */ -void -nfsd_file_put_local (struct nfsd_file *nf)__must_hold (rcu) +struct net * +nfsd_file_put_local (struct nfsd_file *nf) {struct net *net = nf->nf_net;nfsd_file_put (nf); -nfsd_serv_put (net); +return net; }/**
fs/nfsd/filecache.h +1 -1
@@ -55,7 +55,7 @@ void nfsd_file_cache_shutdown(void);int nfsd_file_cache_start_net (struct net *net);void nfsd_file_cache_shutdown_net (struct net *net);void nfsd_file_put (struct nfsd_file *nf); -void nfsd_file_put_local (struct nfsd_file *nf); +struct net *nfsd_file_put_local (struct nfsd_file *nf);struct nfsd_file *nfsd_file_get (struct nfsd_file *nf);struct file *nfsd_file_file (struct nfsd_file *nf);void nfsd_file_close_inode_sync (struct inode *inode);
include/linux/nfslocalio.h +15 -3
@@ -55,7 +55,7 @@ struct nfsd_localio_operations { const struct cred *, const struct nfs_fh *, const fmode_t); -void (*nfsd_file_put_local)(struct nfsd_file *); +struct net *(*nfsd_file_put_local)(struct nfsd_file *);struct file *(*nfsd_file_file)(struct nfsd_file *); }____cacheline_aligned ;
@@ -66,7 +66,7 @@ struct nfsd_file *nfs_open_local_fh(nfs_uuid_t *, struct rpc_clnt *, const struct cred *, const struct nfs_fh *, const fmode_t); -static inline void nfs_to_nfsd_file_put_local (struct nfsd_file *localio) +static inline void nfs_to_nfsd_net_put (struct net *net) {/* * Once reference to nfsd_serv is dropped, NFSD could be
@@ -74,10 +74,22 @@ static inline void nfs_to_nfsd_file_put_local(struct nfsd_file *localio)* by always taking RCU. */ rcu_read_lock (); - nfs_to->nfsd_file_put_local (localio); + nfs_to->nfsd_serv_put (net); rcu_read_unlock(); } +static inline void nfs_to_nfsd_file_put_local (struct nfsd_file *localio) +{ +/* +* Must not hold RCU otherwise nfsd_file_put() can easily trigger: +* "Voluntary context switch within RCU read-side critical section!" +* by scheduling deep in underlying filesystem (e.g. XFS). +*/ +struct net *net = nfs_to->nfsd_file_put_local (localio); + +nfs_to_nfsd_net_put (net); +} +#else /* CONFIG_NFS_LOCALIO */ static inline void nfsd_localio_ops_init (void ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 531/826 f2fs: fix to do cast in F2FS_{BLK_TO_BYTES, BTYES_TO_BLK} to avoid overflow
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 3273d8ad947dea925a65a78ca29e5351c960c801 ]
It missed to cast variable to unsigned long long type before bit shift, which will cause overflow, fix it.
--- fs/f2fs/super.c | 2 +- include/linux/f2fs_fs.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
fs/f2fs/super.c +1 -1
@@ -3322,7 +3322,7 @@ loff_t max_file_blocks(struct inode *inode)* fit within U32_MAX + 1 data units. */ - result =min (result,F2FS_BYTES_TO_BLK (((loff_t )U32_MAX +1 ) *4096 )); + result =umin (result,F2FS_BYTES_TO_BLK (((loff_t )U32_MAX +1 ) *4096 ));return result; }
include/linux/f2fs_fs.h +3 -3
@@ -24,10 +24,10 @@#define NEW_ADDR ((block_t)-1)/* used as block_t addresses */ #define COMPRESS_ADDR ((block_t)-2)/* used as compressed data flag */ -#define F2FS_BYTES_TO_BLK (bytes) ((bytes) >> F2FS_BLKSIZE_BITS) -#define F2FS_BLK_TO_BYTES (blk) ((blk) << F2FS_BLKSIZE_BITS) +#define F2FS_BYTES_TO_BLK (bytes) ((unsigned long long)(bytes) >> F2FS_BLKSIZE_BITS) +#define F2FS_BLK_TO_BYTES (blk) ((unsigned long long)(blk) << F2FS_BLKSIZE_BITS)#define F2FS_BLK_END_BYTES (blk) (F2FS_BLK_TO_BYTES(blk + 1) - 1) -#define F2FS_BLK_ALIGN (x) (F2FS_BYTES_TO_BLK((x) + F2FS_BLKSIZE - 1)) +#define F2FS_BLK_ALIGN (x) (F2FS_BYTES_TO_BLK((x) + F2FS_BLKSIZE - 1))/* 0, 1(node nid), 2(meta nid) are reserved node id */ #define F2FS_RESERVED_NODE_NUM 3
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 532/826 perf bpf-filter: Return -ENOMEM directly when pfi allocation fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hao Ge <[email protected]>
[ Upstream commit bd077a53ad87cb111632e564cdfe8dfbe96786de ]
Directly return -ENOMEM when pfi allocation fails, instead of performing other operations on pfi.
--- tools/perf/util/bpf-filter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/bpf-filter.c +1 -1
@@ -375,7 +375,7 @@ static int create_idx_hash(struct evsel *evsel, struct perf_bpf_filter_entry *en pfi =zalloc (sizeof (*pfi));if (pfi ==NULL ) {pr_err ("Cannot save pinned filter index\n" ); - goto err; +return -ENOMEM ; } pfi->evsel = evsel;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 533/826 hwmon: (tps23861) Fix reporting of negative temperatures
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Murad Masimov <[email protected]>
[ Upstream commit de2bf507fabba9c0c678cf5ed54beb546f5ca29a ]
Negative temperatures are reported as large positive temperatures due to missing sign extension from unsigned int to long. Cast unsigned raw register values to signed before performing the calculations to fix the problem.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
Message-ID: <[email protected]>
--- drivers/hwmon/tps23861.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/tps23861.c +1 -1
@@ -132,7 +132,7 @@ static int tps23861_read_temp(struct tps23861_data *data, long *val)if (err <0 )return err; - *val = (regval *TEMPERATURE_LSB ) -20000 ; + *val = ((long )regval *TEMPERATURE_LSB ) -20000 ;return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 534/826 hwmon: (aquacomputer_d5next) Fix length of speed_input array
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksa Savic <[email protected]>
[ Upstream commit 998b5a78a9ce1cc4378e7281e4ea310e37596170 ]
Commit 120584c728a6 ("hwmon: (aquacomputer_d5next) Add support for Octo flow sensor") added support for reading Octo flow sensor, but didn't update the priv->speed_input array length. Since Octo has 8 fans, with the addition of the flow sensor the proper length for speed_input is 9.
Reported by Arne Schwabe on Github [1], who received a UBSAN warning.
Message-ID: <[email protected]>
--- drivers/hwmon/aquacomputer_d5next.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/aquacomputer_d5next.c +1 -1
@@ -597,7 +597,7 @@ struct aqc_data {/* Sensor values */ s32 temp_input[20 ];/* Max 4 physical and 16 virtual or 8 physical and 12 virtual */ -s32 speed_input[8 ]; +s32 speed_input[9 ];u32 speed_input_min[1 ];u32 speed_input_target[1 ];u32 speed_input_max[1 ];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 535/826 phy: airoha: Fix REG_CSR_2L_PLL_CMN_RESERVE0 config in airoha_pcie_phy_init_clk_out()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit 09a19fb75498985cbb598f1fa43a7d2416925c30 ]
Fix typo configuring REG_CSR_2L_PLL_CMN_RESERVE0 register in airoha_pcie_phy_init_clk_out routine.
--- drivers/phy/phy-airoha-pcie.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/phy/phy-airoha-pcie.c +1 -1
@@ -459,7 +459,7 @@ static void airoha_pcie_phy_init_clk_out(struct airoha_pcie_phy *pcie_phy)airoha_phy_csr_2l_clear_bits (pcie_phy,REG_CSR_2L_CLKTX1_OFFSET ,CSR_2L_PXP_CLKTX1_SR );airoha_phy_csr_2l_update_field (pcie_phy,REG_CSR_2L_PLL_CMN_RESERVE0 , -CSR_2L_PXP_PLL_RESERVE_MASK ,0xdd ); +CSR_2L_PXP_PLL_RESERVE_MASK ,0xd0d ); }static void airoha_pcie_phy_init_csr_2l (struct airoha_pcie_phy *pcie_phy)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 536/826 phy: airoha: Fix REG_PCIE_PMA_TX_RESET config in airoha_pcie_phy_init_csr_2l()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit f9c5d6369d3e8e36b7beb15e86b1ef0911ace85f ]
Fix typos configuring REG_PCIE_PMA_TX_RESET register in airoha_pcie_phy_init_csr_2l routine for lane0 and lane1
--- drivers/phy/phy-airoha-pcie.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/phy/phy-airoha-pcie.c +2 -2
@@ -471,9 +471,9 @@ static void airoha_pcie_phy_init_csr_2l(struct airoha_pcie_phy *pcie_phy)PCIE_SW_XFI_RXPCS_RST |PCIE_SW_REF_RST | PCIE_SW_RX_RST);airoha_phy_pma0_set_bits (pcie_phy,REG_PCIE_PMA_TX_RESET , -PCIE_TX_TOP_RST |REG_PCIE_PMA_TX_RESET ); +PCIE_TX_TOP_RST |PCIE_TX_CAL_RST );airoha_phy_pma1_set_bits (pcie_phy,REG_PCIE_PMA_TX_RESET , -PCIE_TX_TOP_RST |REG_PCIE_PMA_TX_RESET ); +PCIE_TX_TOP_RST |PCIE_TX_CAL_RST ); }static void airoha_pcie_phy_init_rx (struct airoha_pcie_phy *pcie_phy)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 537/826 phy: airoha: Fix REG_CSR_2L_JCPLL_SDM_HREN config in airoha_pcie_phy_init_ssc_jcpll()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit 6fd016c965d241673a2e62afbf9eeb4bcbfbbe45 ]
Fix typo configuring REG_CSR_2L_JCPLL_SDM_HREN register in airoha_pcie_phy_init_ssc_jcpll routine.
--- drivers/phy/phy-airoha-pcie.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/phy/phy-airoha-pcie.c +1 -1
@@ -802,7 +802,7 @@ static void airoha_pcie_phy_init_ssc_jcpll(struct airoha_pcie_phy *pcie_phy)airoha_phy_csr_2l_set_bits (pcie_phy,REG_CSR_2L_JCPLL_SDM_IFM ,CSR_2L_PXP_JCPLL_SDM_IFM );airoha_phy_csr_2l_set_bits (pcie_phy,REG_CSR_2L_JCPLL_SDM_HREN , -REG_CSR_2L_JCPLL_SDM_HREN ); +CSR_2L_PXP_JCPLL_SDM_HREN );airoha_phy_csr_2l_clear_bits (pcie_phy,REG_CSR_2L_JCPLL_RST_DLY ,CSR_2L_PXP_JCPLL_SDM_DI_EN ); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 538/826 phy: airoha: Fix REG_CSR_2L_RX{0,1}_REV0 definitions
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit e56272f2bb8314eb13b0eb0a4e8055831c700255 ]
Fix the following register definitions for REG_CSR_2L_RX{0,1}_REV0 registers:
- CSR_2L_PXP_VOS_PNINV
- CSR_2L_PXP_FE_GAIN_NORMAL_MODE
- CSR_2L_PXP_FE_GAIN_TRAIN_MODE
--- drivers/phy/phy-airoha-pcie-regs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/phy/phy-airoha-pcie-regs.h +3 -3
@@ -197,9 +197,9 @@#define CSR_2L_PXP_TX1_MULTLANE_EN BIT(0)#define REG_CSR_2L_RX0_REV0 0x00fc -#define CSR_2L_PXP_VOS_PNINV GENMASK(3, 2) -#define CSR_2L_PXP_FE_GAIN_NORMAL_MODE GENMASK(6, 4) -#define CSR_2L_PXP_FE_GAIN_TRAIN_MODE GENMASK(10, 8) +#define CSR_2L_PXP_VOS_PNINV GENMASK(19, 18) +#define CSR_2L_PXP_FE_GAIN_NORMAL_MODE GENMASK(22, 20) +#define CSR_2L_PXP_FE_GAIN_TRAIN_MODE GENMASK(26, 24)#define REG_CSR_2L_RX0_PHYCK_DIV 0x0100#define CSR_2L_PXP_RX0_PHYCK_SEL GENMASK(9, 8)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 539/826 vdpa/mlx5: Fix suboptimal range on iotlb iteration
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Si-Wei Liu <[email protected]>
[ Upstream commit 35025963326e44d8bced3eecd42d2f040f4f0024 ]
The starting iova address to iterate iotlb map entry within a range was set to an irrelevant value when passing to the itree_next() iterator, although luckily it doesn't affect the outcome of finding out the granule of the smallest iotlb map size. Fix the code to make it consistent with the following for-loop.
Message-Id: <[email protected]>
--- drivers/vdpa/mlx5/core/mr.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/vdpa/mlx5/core/mr.c +1 -3
@@ -368,7 +368,6 @@ static int map_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mrunsigned long lgcd =0 ;int log_entity_size;unsigned long size; -u64 start =0 ;int err;struct page *pg;unsigned int nsg;
@@ -379,10 +378,9 @@ static int map_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mrstruct device *dma = mvdev->vdev.dma_dev;for (map =vhost_iotlb_itree_first (iotlb, mr->start, mr->end -1 ); - map; map =vhost_iotlb_itree_next (map, start, mr->end -1 )) { + map; map =vhost_iotlb_itree_next (map, mr->start, mr->end -1 )) { size =maplen (map, mr); lgcd =gcd (lgcd, size); - start += size; } log_entity_size =ilog2 (lgcd);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 540/826 vfio/mlx5: Fix an unwind issue in mlx5vf_add_migration_pages()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yishai Hadas <[email protected]>
[ Upstream commit 22e87bf3f77c18f5982c19ffe2732ef0c7a25f16 ]
Fix an unwind issue in mlx5vf_add_migration_pages().
If a set of pages is allocated but fails to be added to the SG table, they need to be freed to prevent a memory leak.
Any pages successfully added to the SG table will be freed as part of mlx5vf_free_data_buffer().
--- drivers/vfio/pci/mlx5/cmd.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/vfio/pci/mlx5/cmd.c +5 -1
@@ -423,6 +423,7 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,unsigned long filled;unsigned int to_fill;int ret; +int i; to_fill = min_t(unsigned int, npages, PAGE_SIZE / sizeof(*page_list)); page_list =kvzalloc (to_fill *sizeof (*page_list),GFP_KERNEL_ACCOUNT );
@@ -443,7 +444,7 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf, GFP_KERNEL_ACCOUNT);if (ret) - goto err; + goto err_append; buf->allocated_length += filled *PAGE_SIZE ;/* clean input for another bulk allocation */ memset (page_list,0 , filled *sizeof (*page_list));
@@ -454,6 +455,9 @@ static int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,kvfree (page_list);return 0 ; +err_append: +for (i = filled -1 ; i >=0 ; i--) +__free_page (page_list[i]); err:kvfree (page_list);return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 541/826 vfio/mlx5: Fix unwind flows in mlx5vf_pci_save/resume_device_data()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yishai Hadas <[email protected]>
[ Upstream commit cb04444c243c001fc27f275e84792ff1c2b96867 ]
Fix unwind flows in mlx5vf_pci_save_device_data() and mlx5vf_pci_resume_device_data() to avoid freeing the migf pointer at the 'end' label, as this will be handled by fput(migf->filp) through mlx5vf_release_file().
To ensure mlx5vf_release_file() functions correctly, move the initialization of migf fields (such as migf->lock) to occur before any potential unwind flow, as these fields may be accessed within mlx5vf_release_file().
--- drivers/vfio/pci/mlx5/main.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-)
drivers/vfio/pci/mlx5/main.c +17 -18
@@ -640,14 +640,11 @@ mlx5vf_pci_save_device_data(struct mlx5vf_pci_core_device *mvdev, bool track) O_RDONLY);if (IS_ERR (migf->filp)) { ret =PTR_ERR (migf->filp); - goto end; +kfree (migf); +return ERR_PTR (ret); } migf->mvdev = mvdev; - ret =mlx5vf_cmd_alloc_pd (migf); -if (ret) - goto out_free; -stream_open (migf->filp->f_inode, migf->filp);mutex_init (&migf->lock);init_waitqueue_head (&migf->poll_wait);
@@ -663,6 +660,11 @@ mlx5vf_pci_save_device_data(struct mlx5vf_pci_core_device *mvdev, bool track)INIT_LIST_HEAD (&migf->buf_list);INIT_LIST_HEAD (&migf->avail_list);spin_lock_init (&migf->list_lock); + + ret =mlx5vf_cmd_alloc_pd (migf); +if (ret) + goto out; + ret =mlx5vf_cmd_query_vhca_migration_state (mvdev, &length, &full_size,0 );if (ret) goto out_pd;
@@ -692,10 +694,8 @@ mlx5vf_pci_save_device_data(struct mlx5vf_pci_core_device *mvdev, bool track)mlx5vf_free_data_buffer (buf); out_pd:mlx5fv_cmd_clean_migf_resources (migf); -out_free: +out:fput (migf->filp); -end: -kfree (migf);return ERR_PTR (ret); }
@@ -1016,13 +1016,19 @@ mlx5vf_pci_resume_device_data(struct mlx5vf_pci_core_device *mvdev) O_WRONLY);if (IS_ERR (migf->filp)) { ret =PTR_ERR (migf->filp); - goto end; +kfree (migf); +return ERR_PTR (ret); } +stream_open (migf->filp->f_inode, migf->filp); +mutex_init (&migf->lock); +INIT_LIST_HEAD (&migf->buf_list); +INIT_LIST_HEAD (&migf->avail_list); +spin_lock_init (&migf->list_lock); migf->mvdev = mvdev; ret =mlx5vf_cmd_alloc_pd (migf);if (ret) - goto out_free; + goto out; buf =mlx5vf_alloc_data_buffer (migf,0 ,DMA_TO_DEVICE );if (IS_ERR (buf)) {
@@ -1041,20 +1047,13 @@ mlx5vf_pci_resume_device_data(struct mlx5vf_pci_core_device *mvdev) migf->buf_header[0 ] = buf; migf->load_state =MLX5_VF_LOAD_STATE_READ_HEADER ; -stream_open (migf->filp->f_inode, migf->filp); -mutex_init (&migf->lock); -INIT_LIST_HEAD (&migf->buf_list); -INIT_LIST_HEAD (&migf->avail_list); -spin_lock_init (&migf->list_lock);return migf; out_buf:mlx5vf_free_data_buffer (migf->buf[0 ]); out_pd:mlx5vf_cmd_dealloc_pd (migf); -out_free: +out:fput (migf->filp); -end: -kfree (migf);return ERR_PTR (ret); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 542/826 selftests/mount_setattr: Fix failures on 64K PAGE_SIZE kernels
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
[ Upstream commit f13242a46438e690067a4bf47068fde4d5719947 ]
Currently the mount_setattr_test fails on machines with a 64K PAGE_SIZE, with errors such as:
# RUN mount_setattr_idmapped.invalid_fd_negative ...
mkfs.ext4: No space left on device while writing out and closing file system
# mount_setattr_test.c:1055:invalid_fd_negative:Expected system("mkfs.ext4 -q /mnt/C/ext4.img") (256) == 0 (0) # invalid_fd_negative: Test terminated by assertion
# FAIL mount_setattr_idmapped.invalid_fd_negative
not ok 12 mount_setattr_idmapped.invalid_fd_negative
The code creates a 100,000 byte tmpfs:
ASSERT_EQ(mount("testing", "/mnt", "tmpfs", MS_NOATIME | MS_NODEV,
"size=100000,mode=700"), 0);And then a little later creates a 2MB ext4 filesystem in that tmpfs:
ASSERT_EQ(ftruncate(img_fd, 1024 * 2048), 0);
ASSERT_EQ(system("mkfs.ext4 -q /mnt/C/ext4.img"), 0);At first glance it seems like that should never work, after all 2MB is larger than 100,000 bytes. However the filesystem image doesn't actually occupy 2MB on "disk" (actually RAM, due to tmpfs). On 4K kernels the ext4.img uses ~84KB of actual space (according to du), which just fits.
However on 64K PAGE_SIZE kernels the ext4.img takes at least 256KB, which is too large to fit in the tmpfs, hence the errors.
It seems fraught to rely on the ext4.img taking less space on disk than the allocated size, so instead create the tmpfs with a size of 2MB. With that all 21 tests pass on 64K PAGE_SIZE kernels.
--- tools/testing/selftests/mount_setattr/mount_setattr_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/mount_setattr/mount_setattr_test.c +1 -1
@@ -1026,7 +1026,7 @@ FIXTURE_SETUP(mount_setattr_idmapped) "size=100000,mode=700"), 0);ASSERT_EQ (mount ("testing" ,"/mnt" ,"tmpfs" ,MS_NOATIME |MS_NODEV , -"size=100000,mode=700" ),0 ); +"size=2m,mode=700" ),0 );ASSERT_EQ (mkdir ("/mnt/A" ,0777 ),0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 543/826 gpio: zevio: Add missed label initialisation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 5bbed54ba66925ebca19092d0750630f943d7bf2 ]
Initialise the GPIO chip label correctly as it was done by of_mm_gpiochip_add_data() before the below mentioned change.
--- drivers/gpio/gpio-zevio.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpio/gpio-zevio.c +6 -0
@@ -11,6 +11,7 @@#include <linux/io.h> #include <linux/mod_devicetable.h> #include <linux/platform_device.h> +#include <linux/property.h> #include <linux/slab.h> #include <linux/spinlock.h>
@@ -169,6 +170,7 @@ static const struct gpio_chip zevio_gpio_chip = {/* Initialization */ static int zevio_gpio_probe (struct platform_device *pdev) { +struct device *dev = &pdev->dev;struct zevio_gpio *controller;int status, i;
@@ -180,6 +182,10 @@ static int zevio_gpio_probe(struct platform_device *pdev) controller->chip = zevio_gpio_chip; controller->chip.parent = &pdev->dev; + controller->chip.label =devm_kasprintf (dev,GFP_KERNEL ,"%pfw" ,dev_fwnode (dev)); +if (!controller->chip.label) +return -ENOMEM ; + controller->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (controller->regs)) return dev_err_probe(&pdev->dev, PTR_ERR(controller->regs),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 544/826 vfio/pci: Properly hide first-in-list PCIe extended capability
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avihai Horon <[email protected]>
[ Upstream commit fe4bf8d0b6716a423b16495d55b35d3fe515905d ]
There are cases where a PCIe extended capability should be hidden from the user. For example, an unknown capability (i.e., capability with ID greater than PCI_EXT_CAP_ID_MAX) or a capability that is intentionally chosen to be hidden from the user.
Hiding a capability is done by virtualizing and modifying the 'Next Capability Offset' field of the previous capability so it points to the capability after the one that should be hidden.
The special case where the first capability in the list should be hidden is handled differently because there is no previous capability that can be modified. In this case, the capability ID and version are zeroed while leaving the next pointer intact. This hides the capability and leaves an anchor for the rest of the capability list.
However, today, hiding the first capability in the list is not done properly if the capability is unknown, as struct vfio_pci_core_device->pci_config_map is set to the capability ID during initialization but the capability ID is not properly checked later when used in vfio_config_do_rw(). This leads to the following warning [1] and to an out-of-bounds access to ecap_perms array.
Fix it by checking cap_id in vfio_config_do_rw(), and if it is greater than PCI_EXT_CAP_ID_MAX, use an alternative struct perm_bits for direct read only access instead of the ecap_perms array.
Note that this is safe since the above is the only case where cap_id can exceed PCI_EXT_CAP_ID_MAX (except for the special capabilities, which are already checked before).
[1]
WARNING: CPU: 118 PID: 5329 at drivers/vfio/pci/vfio_pci_config.c:1900 vfio_pci_config_rw+0x395/0x430 [vfio_pci_core] CPU: 118 UID: 0 PID: 5329 Comm: simx-qemu-syste Not tainted 6.12.0+ #1 (snip) Call Trace: <TASK> ? show_regs+0x69/0x80 ? __warn+0x8d/0x140 ? vfio_pci_config_rw+0x395/0x430 [vfio_pci_core] ? report_bug+0x18f/0x1a0 ? handle_bug+0x63/0xa0 ? exc_invalid_op+0x19/0x70 ? asm_exc_invalid_op+0x1b/0x20 ? vfio_pci_config_rw+0x395/0x430 [vfio_pci_core] ? vfio_pci_config_rw+0x244/0x430 [vfio_pci_core] vfio_pci_rw+0x101/0x1b0 [vfio_pci_core] vfio_pci_core_read+0x1d/0x30 [vfio_pci_core] vfio_device_fops_read+0x27/0x40 [vfio] vfs_read+0xbd/0x340 ? vfio_device_fops_unl_ioctl+0xbb/0x740 [vfio] ? __rseq_handle_notify_resume+0xa4/0x4b0 __x64_sys_pread64+0x96/0xc0 x64_sys_call+0x1c3d/0x20d0 do_syscall_64+0x4d/0x120 entry_SYSCALL_64_after_hwframe+0x76/0x7e
--- drivers/vfio/pci/vfio_pci_config.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/vfio/pci/vfio_pci_config.c +14 -2
@@ -313,6 +313,10 @@ static int vfio_virt_config_read(struct vfio_pci_core_device *vdev, int pos,return count; } +static struct perm_bits direct_ro_perms = { + .readfn = vfio_direct_config_read, +}; +/* Default capability regions to read-only, no-virtualization */ static struct perm_bits cap_perms[PCI_CAP_ID_MAX +1 ] = { [0 ...PCI_CAP_ID_MAX ] = { .readfn = vfio_direct_config_read }
@@ -1897,9 +1901,17 @@ static ssize_t vfio_config_do_rw(struct vfio_pci_core_device *vdev, char __user cap_start = *ppos; }else {if (*ppos >=PCI_CFG_SPACE_SIZE ) { -WARN_ON (cap_id >PCI_EXT_CAP_ID_MAX ); +/* +* We can get a cap_id that exceeds PCI_EXT_CAP_ID_MAX +* if we're hiding an unknown capability at the start +* of the extended capability list. Use default, ro +* access, which will virtualize the id and next values. +*/ +if (cap_id >PCI_EXT_CAP_ID_MAX ) + perm = &direct_ro_perms; +else + perm = &ecap_perms[cap_id]; - perm = &ecap_perms[cap_id]; cap_start =vfio_find_cap_start (vdev, *ppos); }else {WARN_ON (cap_id >PCI_CAP_ID_MAX );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 545/826 fs_parser: update mount_api doc to match function signature
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit c66f759832a83cb273ba5a55c66dcc99384efa74 ]
Add the missing 'name' parameter to the mount_api documentation for fs_validate_description().
--- Documentation/filesystems/mount_api.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Documentation/filesystems/mount_api.rst +2 -1
@@ -770,7 +770,8 @@ process the parameters it is given. * :: - bool fs_validate_description(const struct fs_parameter_description *desc); + bool fs_validate_description(const char *name, + const struct fs_parameter_description *desc); This performs some validation checks on a parameter description. It returns true if the description is good and false if it is not. It will
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 546/826 LoongArch: Fix build failure with GCC 15 (-std=gnu23)
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tiezhu Yang <[email protected]>
[ Upstream commit 947d5d036c788156f09e83e7f16322ffe8124384 ]
Whenever I try to build the kernel with upcoming GCC 15 which defaults to -std=gnu23 I get a build failure:
CC arch/loongarch/vdso/vgetcpu.o
In file included from ./include/uapi/linux/posix_types.h:5,
from ./include/uapi/linux/types.h:14,
from ./include/linux/types.h:6,
from ./include/linux/kasan-checks.h:5,
from ./include/asm-generic/rwonce.h:26,
from ./arch/loongarch/include/generated/asm/rwonce.h:1,
from ./include/linux/compiler.h:317,
from ./include/asm-generic/bug.h:5,
from ./arch/loongarch/include/asm/bug.h:60,
from ./include/linux/bug.h:5,
from ./include/linux/mmdebug.h:5,
from ./include/linux/mm.h:6,
from ./arch/loongarch/include/asm/vdso.h:10,
from arch/loongarch/vdso/vgetcpu.c:6:
./include/linux/stddef.h:11:9: error: expected identifier before 'false'
11 | false = 0,
| ^~~~~
./include/linux/types.h:35:33: error: two or more data types in declaration specifiers
35 | typedef _Bool bool;
| ^~~~
./include/linux/types.h:35:1: warning: useless type name in empty declaration
35 | typedef _Bool bool;
| ^~~~~~~The kernel builds explicitly with -std=gnu11 in top Makefile, but arch/loongarch/vdso does not use KBUILD_CFLAGS from the rest of the kernel, just add -std=gnu11 flag to arch/loongarch/vdso/Makefile.
By the way, commit e8c07082a810 ("Kbuild: move to -std=gnu11") did a similar change for arch/arm64/kernel/vdso32/Makefile.
--- arch/loongarch/vdso/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/loongarch/vdso/Makefile +1 -1
@@ -19,7 +19,7 @@ ccflags-vdso := \ cflags-vdso := $(ccflags-vdso) \ -isystem $(shell $(CC) -print-file-name=include) \ $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \ - -O2 -g -fno-strict-aliasing -fno-common -fno-builtin \ + -std=gnu11 -O2 -g -fno-strict-aliasing -fno-common -fno-builtin \ -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \ $(call cc-option, -fno-asynchronous-unwind-tables) \ $(call cc-option, -fno-stack-protector)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 547/826 LoongArch: BPF: Sign-extend return values
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tiezhu Yang <[email protected]>
[ Upstream commit 73c359d1d356cf10236ccd358bd55edab33e9424 ]
(1) Description of Problem:
When testing BPF JIT with the latest compiler toolchains on LoongArch, there exist some strange failed test cases, dmesg shows something like this:
# dmesg -t | grep FAIL | head -1 ... ret -3 != -3 (0xfffffffd != 0xfffffffd)FAIL ...
(2) Steps to Reproduce:
# echo 1 > /proc/sys/net/core/bpf_jit_enable # modprobe test_bpf
(3) Additional Info:
There are no failed test cases compiled with the lower version of GCC such as 13.3.0, while the problems only appear with higher version of GCC such as 14.2.0.
This is because the problems were hidden by the lower version of GCC due to redundant sign extension instructions generated by compiler, but with optimization of higher version of GCC, the sign extension instructions have been removed.
(4) Root Cause Analysis:
The LoongArch architecture does not expose sub-registers, and hold all 32-bit values in a sign-extended format. While BPF, on the other hand, exposes sub-registers, and use zero-extension (similar to arm64/x86).
This has led to some subtle bugs, where a BPF JITted program has not sign-extended the a0 register (return value in LoongArch land), passed the return value up the kernel, for example:
| int from_bpf(void);
|
| long foo(void)
| {
| return from_bpf();
| }Here, a0 would be 0xffffffff instead of the expected 0xffffffffffffffff.
Internally, the LoongArch JIT uses a5 as a dedicated register for BPF return values. That is to say, the LoongArch BPF uses a5 for BPF return values, which are zero-extended, whereas the LoongArch ABI uses a0 which is sign-extended.
(5) Final Solution:
Keep a5 zero-extended, but explicitly sign-extend a0 (which is used outside BPF land). Because libbpf currently defines the return value of an ebpf program as a 32-bit unsigned integer, just use addi.w to extend bit 31 into bits 63 through 32 of a5 to a0. This is similar to commit 2f1b0d3d7331 ("riscv, bpf: Sign-extend return values").
--- arch/loongarch/net/bpf_jit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/loongarch/net/bpf_jit.c +1 -1
@@ -179,7 +179,7 @@ static void __build_epilogue(struct jit_ctx *ctx, bool is_tail_call)if (!is_tail_call) {/* Set return value */ -move_reg (ctx,LOONGARCH_GPR_A0 , regmap[BPF_REG_0 ]); +emit_insn (ctx, addiw,LOONGARCH_GPR_A0 , regmap[BPF_REG_0 ],0 );/* Return to the caller */ emit_insn (ctx, jirl,LOONGARCH_GPR_RA ,LOONGARCH_GPR_ZERO ,0 ); }else {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 548/826 power: supply: core: Remove might_sleep() from power_supply_put()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
[ Upstream commit f6da4553ff24a5d1c959c9627c965323adc3d307 ]
The put_device() call in power_supply_put() may call power_supply_dev_release(). The latter function does not sleep so power_supply_put() doesn't sleep either. Hence, remove the might_sleep() call from power_supply_put(). This patch suppresses false positive complaints about calling a sleeping function from atomic context if power_supply_put() is called from atomic context.
--- drivers/power/supply/power_supply_core.c | 2 -- 1 file changed, 2 deletions(-)
drivers/power/supply/power_supply_core.c +0 -2
@@ -484,8 +484,6 @@ EXPORT_SYMBOL_GPL(power_supply_get_by_name);*/ void power_supply_put (struct power_supply *psy) { -might_sleep (); -atomic_dec (&psy->use_cnt);put_device (&psy->dev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 549/826 power: supply: bq27xxx: Fix registers of bq27426
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Barnabás Czémán <[email protected]>
[ Upstream commit 34f99d3b706a519e556841f405c224ca708b1f54 ]
Correct bq27426 registers, according to technical reference manual it does not have Design Capacity register so it is not register compatible with bq27421.
--- drivers/power/supply/bq27xxx_battery.c | 37 ++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-)
drivers/power/supply/bq27xxx_battery.c +35 -2
@@ -449,9 +449,29 @@ static u8 [BQ27XXX_REG_AP ] =0x18 ,BQ27XXX_DM_REG_ROWS , }, + bq27426_regs[BQ27XXX_REG_MAX ] = { + [BQ27XXX_REG_CTRL ] =0x00 , + [BQ27XXX_REG_TEMP ] =0x02 , + [BQ27XXX_REG_INT_TEMP ] =0x1e , + [BQ27XXX_REG_VOLT ] =0x04 , + [BQ27XXX_REG_AI ] =0x10 , + [BQ27XXX_REG_FLAGS ] =0x06 , + [BQ27XXX_REG_TTE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTF ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTES ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTECP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_NAC ] =0x08 , + [BQ27XXX_REG_RC ] =0x0c , + [BQ27XXX_REG_FCC ] =0x0e , + [BQ27XXX_REG_CYCT ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_SOC ] =0x1c , + [BQ27XXX_REG_DCAP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AP ] =0x18 , +BQ27XXX_DM_REG_ROWS , + }, #define bq27411_regs bq27421_regs #define bq27425_regs bq27421_regs -#define bq27426_regs bq27421_regs #define bq27441_regs bq27421_regs #define bq27621_regs bq27421_regs bq27z561_regs[BQ27XXX_REG_MAX ] = {
@@ -769,10 +789,23 @@ static enum power_supply_property bq27421_props[] = { };#define bq27411_props bq27421_props#define bq27425_props bq27421_props -#define bq27426_props bq27421_props#define bq27441_props bq27421_props#define bq27621_props bq27421_props +static enum power_supply_property bq27426_props[] = { +POWER_SUPPLY_PROP_STATUS , +POWER_SUPPLY_PROP_PRESENT , +POWER_SUPPLY_PROP_VOLTAGE_NOW , +POWER_SUPPLY_PROP_CURRENT_NOW , +POWER_SUPPLY_PROP_CAPACITY , +POWER_SUPPLY_PROP_CAPACITY_LEVEL , +POWER_SUPPLY_PROP_TEMP , +POWER_SUPPLY_PROP_TECHNOLOGY , +POWER_SUPPLY_PROP_CHARGE_FULL , +POWER_SUPPLY_PROP_CHARGE_NOW , +POWER_SUPPLY_PROP_MANUFACTURER , +}; +static enum power_supply_property bq27z561_props[] = {POWER_SUPPLY_PROP_STATUS ,POWER_SUPPLY_PROP_PRESENT ,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 550/826 power: supply: rt9471: Fix wrong WDT function regfield declaration
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChiYuan Huang <[email protected]>
[ Upstream commit d10ff07dd2b933e3864c592ca932996b07bbf22a ]
Fix F_WDT and F_WDT_RST wrong regfield declaration.
--- drivers/power/supply/rt9471.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/power/supply/rt9471.c +2 -2
@@ -153,8 +153,8 @@ struct rt9471_chip { };static const struct reg_field rt9471_reg_fields[F_MAX_FIELDS ] = { - [F_WDT ] =REG_FIELD (RT9471_REG_TOP ,0 ,0 ), - [F_WDT_RST ] =REG_FIELD (RT9471_REG_TOP ,1 ,1 ), + [F_WDT ] =REG_FIELD (RT9471_REG_TOP ,0 ,1 ), + [F_WDT_RST ] =REG_FIELD (RT9471_REG_TOP ,2 ,2 ), [F_CHG_EN ] =REG_FIELD (RT9471_REG_FUNC ,0 ,0 ), [F_HZ ] =REG_FIELD (RT9471_REG_FUNC ,5 ,5 ), [F_BATFET_DIS ] =REG_FIELD (RT9471_REG_FUNC ,7 ,7 ),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 551/826 power: supply: rt9471: Use IC status regfield to report real charger status
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChiYuan Huang <[email protected]>
[ Upstream commit c46a9ee5c6210682611d3d4276436c23a95e1996 ]
Use IC status regfield to rewrite the 'get_staus' function. The original one cannot cover some special scenario like as charger OTG or JEITA case.
--- drivers/power/supply/rt9471.c | 48 ++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 17 deletions(-)
drivers/power/supply/rt9471.c +31 -17
@@ -139,6 +139,19 @@ enum { RT9471_PORTSTAT_DCP, }; +enum { +RT9471_ICSTAT_SLEEP =0 , +RT9471_ICSTAT_VBUSRDY , +RT9471_ICSTAT_TRICKLECHG , +RT9471_ICSTAT_PRECHG , +RT9471_ICSTAT_FASTCHG , +RT9471_ICSTAT_IEOC , +RT9471_ICSTAT_BGCHG , +RT9471_ICSTAT_CHGDONE , +RT9471_ICSTAT_CHGFAULT , +RT9471_ICSTAT_OTG =15 , +}; +struct rt9471_chip {struct device *dev;struct regmap *regmap;
@@ -255,31 +268,32 @@ static int rt9471_get_ieoc(struct rt9471_chip *chip, int *microamp)static int rt9471_get_status (struct rt9471_chip *chip,int *status) { -unsigned int chg_ready, chg_done, fault_stat; +unsigned int ic_stat;int ret; - ret =regmap_field_read (chip->rm_fields[F_ST_CHG_RDY ], &chg_ready); -if (ret) -return ret; - - ret =regmap_field_read (chip->rm_fields[F_ST_CHG_DONE ], &chg_done); + ret =regmap_field_read (chip->rm_fields[F_IC_STAT ], &ic_stat);if (ret)return ret; - ret =regmap_read (chip->regmap,RT9471_REG_STAT1 , &fault_stat); -if (ret) -return ret; - - fault_stat &=RT9471_CHGFAULT_MASK ; - -if (chg_ready && chg_done) - *status =POWER_SUPPLY_STATUS_FULL ; -else if (chg_ready && fault_stat) +switch (ic_stat) { +case RT9471_ICSTAT_VBUSRDY : +case RT9471_ICSTAT_CHGFAULT : *status =POWER_SUPPLY_STATUS_NOT_CHARGING ; -else if (chg_ready && !fault_stat) +break ; + case RT9471_ICSTAT_TRICKLECHG ... RT9471_ICSTAT_BGCHG: *status =POWER_SUPPLY_STATUS_CHARGING ; -else +break ; +case RT9471_ICSTAT_CHGDONE : + *status =POWER_SUPPLY_STATUS_FULL ; +break ; +case RT9471_ICSTAT_SLEEP : +case RT9471_ICSTAT_OTG : *status =POWER_SUPPLY_STATUS_DISCHARGING ; +break ; +default : + *status =POWER_SUPPLY_STATUS_UNKNOWN ; +break ; + }return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 552/826 fs/ntfs3: Equivalent transition from page to folio
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Komarov <[email protected]>
[ Upstream commit 045fff619312fb013540c80cff18aab3c33048ab ]
If using the proposed function folio_zero_range(), should one switch from 'start + end' to 'start + length,' or use folio_zero_segment()
--- fs/ntfs3/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ntfs3/file.c +1 -1
@@ -222,7 +222,7 @@ static int ntfs_extend_initialized_size(struct file *file,if (err) goto out; -folio_zero_range (folio, zerofrom,folio_size (folio)); +folio_zero_range (folio, zerofrom,folio_size (folio) - zerofrom); err =ntfs_write_end (file, mapping, pos, len, len, folio,NULL );if (err <0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 553/826 power: reset: ep93xx: add AUXILIARY_BUS dependency
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit b6d445f6724deda3fd87fa33358009d947a64c5d ]
This fails to link when compile-testing and the auxiliary bus is not built-in:
x86_64-linux-ld: drivers/power/reset/ep93xx-restart.o: in function `ep93xx_reboot_driver_init':
ep93xx-restart.c:(.init.text+0x11): undefined reference to `__auxiliary_driver_register'
x86_64-linux-ld: drivers/power/reset/ep93xx-restart.o: in function `ep93xx_reboot_driver_exit':
ep93xx-restart.c:(.exit.text+0x8): undefined reference to `auxiliary_driver_unregister'
Add the appropriate dependency.
--- drivers/power/reset/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/power/reset/Kconfig +1 -0
@@ -79,6 +79,7 @@ config POWER_RESET_EP93XX bool "Cirrus EP93XX reset driver" if COMPILE_TEST depends on MFD_SYSCON default ARCH_EP93XX + select AUXILIARY_BUS help This driver provides restart support for Cirrus EP93XX SoC.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 554/826 net: usb: lan78xx: Fix double free issue with interrupt buffer allocation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
[ Upstream commit 03819abbeb11117dcbba40bfe322b88c0c88a6b6 ]
In lan78xx_probe(), the buffer buf was being freed twice: once implicitly through usb_free_urb(dev->urb_intr) with the URB_FREE_BUFFER flag and again explicitly by kfree(buf). This caused a double free issue.
To resolve this, reordered kmalloc() and usb_alloc_urb() calls to simplify the initialization sequence and removed the redundant kfree(buf). Now, buf is allocated after usb_alloc_urb(), ensuring it is correctly managed by usb_fill_int_urb() and freed by usb_free_urb() as intended.
--- drivers/net/usb/lan78xx.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-)
drivers/net/usb/lan78xx.c +14 -15
@@ -4414,29 +4414,30 @@ static int lan78xx_probe(struct usb_interface *intf, period = ep_intr->desc.bInterval; maxp =usb_maxpacket (dev->udev, dev->pipe_intr); - buf =kmalloc (maxp,GFP_KERNEL ); -if (!buf) { + + dev->urb_intr =usb_alloc_urb (0 ,GFP_KERNEL ); +if (!dev->urb_intr) { ret = -ENOMEM ; goto out5; } - dev->urb_intr =usb_alloc_urb (0 ,GFP_KERNEL ); -if (!dev->urb_intr) { + buf =kmalloc (maxp,GFP_KERNEL ); +if (!buf) { ret = -ENOMEM ; - goto out6; - }else { -usb_fill_int_urb (dev->urb_intr, dev->udev, - dev->pipe_intr, buf, maxp, - intr_complete, dev, period); - dev->urb_intr->transfer_flags |=URB_FREE_BUFFER ; + goto free_urbs; } +usb_fill_int_urb (dev->urb_intr, dev->udev, + dev->pipe_intr, buf, maxp, + intr_complete, dev, period); + dev->urb_intr->transfer_flags |=URB_FREE_BUFFER ; + dev->maxpacket =usb_maxpacket (dev->udev, dev->pipe_out);/* Reject broken descriptors. */ if (dev->maxpacket ==0 ) { ret = -ENODEV ; - goto out6; + goto free_urbs; }/* driver requires remote-wakeup capability during autosuspend. */
@@ -4444,7 +4445,7 @@ static int lan78xx_probe(struct usb_interface *intf, ret =lan78xx_phy_init (dev);if (ret <0 ) - goto out7; + goto free_urbs; ret =register_netdev (netdev);if (ret !=0 ) {
@@ -4466,10 +4467,8 @@ static int lan78xx_probe(struct usb_interface *intf, out8:phy_disconnect (netdev->phydev); -out7: +free_urbs:usb_free_urb (dev->urb_intr); -out6: -kfree (buf); out5:lan78xx_unbind (dev, intf); out4:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 555/826 net: usb: lan78xx: Fix memory leak on device unplug by freeing PHY device
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
[ Upstream commit ae7370e61c5d8f5bcefc2d4fca724bd4e9bbf789 ]
Add calls to phy_device_free after fixed_phy_unregister to fix a memory leak that occurs when the device is unplugged. This ensures proper cleanup of pseudo fixed-link PHYs.
--- drivers/net/usb/lan78xx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/usb/lan78xx.c +4 -1
@@ -2380,6 +2380,7 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)if (dev->chipid ==ID_REV_CHIP_ID_7801_ ) {if (phy_is_pseudo_fixed_link (phydev)) {fixed_phy_unregister (phydev); +phy_device_free (phydev); }else {phy_unregister_fixup_for_uid (PHY_KSZ9031RNX ,0xfffffff0 );
@@ -4246,8 +4247,10 @@ static void lan78xx_disconnect(struct usb_interface *intf)phy_disconnect (net->phydev); -if (phy_is_pseudo_fixed_link (phydev)) +if (phy_is_pseudo_fixed_link (phydev)) {fixed_phy_unregister (phydev); +phy_device_free (phydev); + }usb_scuttle_anchored_urbs (&dev->deferred);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 556/826 tg3: Set coherent DMA mask bits to 31 for BCM57766 chipsets
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavan Chebbi <[email protected]>
[ Upstream commit 614f4d166eeeb9bd709b0ad29552f691c0f45776 ]
The hardware on Broadcom 1G chipsets have a known limitation where they cannot handle DMA addresses that cross over 4GB. When such an address is encountered, the hardware sets the address overflow error bit in the DMA status register and triggers a reset.
However, BCM57766 hardware is setting the overflow bit and triggering a reset in some cases when there is no actual underlying address overflow. The hardware team analyzed the issue and concluded that it is happening when the status block update has an address with higher (b16 to b31) bits as 0xffff following a previous update that had lowest bits as 0xffff.
To work around this bug in the BCM57766 hardware, set the coherent dma mask from the current 64b to 31b. This will ensure that upper bits of the status block DMA address are always at most 0x7fff, thus avoiding the improper overflow check described above. This work around is intended for only status block and ring memories and has no effect on TX and RX buffers as they do not require coherent memory.
--- drivers/net/ethernet/broadcom/tg3.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/broadcom/tg3.c +3 -0
@@ -17801,6 +17801,9 @@ static int tg3_init_one(struct pci_dev *pdev, }else persist_dma_mask = dma_mask =DMA_BIT_MASK (64 ); +if (tg3_asic_rev (tp) ==ASIC_REV_57766 ) + persist_dma_mask =DMA_BIT_MASK (31 ); +/* Configure DMA attributes. */ if (dma_mask >DMA_BIT_MASK (32 )) { err =dma_set_mask (&pdev->dev, dma_mask);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 557/826 net: usb: lan78xx: Fix refcounting and autosuspend on invalid WoL configuration
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksij Rempel <[email protected]>
[ Upstream commit e863ff806f72098bccaf8fa89c80d9ad6187c3b0 ]
Validate Wake-on-LAN (WoL) options in lan78xx_set_wol before calling usb_autopm_get_interface. This prevents USB autopm refcounting issues and ensures the adapter can properly enter autosuspend when invalid WoL options are provided.
--- drivers/net/usb/lan78xx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/usb/lan78xx.c +3 -3
@@ -1652,13 +1652,13 @@ static int lan78xx_set_wol(struct net_device *netdev,struct lan78xx_priv *pdata = (struct lan78xx_priv *)(dev->data[0 ]);int ret; +if (wol->wolopts & ~WAKE_ALL ) +return -EINVAL ; + ret =usb_autopm_get_interface (dev->intf);if (ret <0 )return ret; -if (wol->wolopts & ~WAKE_ALL ) -return -EINVAL ; - pdata->wol = wol->wolopts;device_set_wakeup_enable (&dev->udev->dev, (bool )wol->wolopts);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 558/826 net: microchip: vcap: Add typegroup table terminators in kunit tests
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit f164b296638d1eb1fb1c537e93ab5c8b49966546 ]
VCAP API unit tests fail randomly with errors such as
# vcap_api_iterator_init_test: EXPECTATION FAILED at drivers/net/ethernet/microchip/vcap/vcap_api_kunit.c:387 Expected 134 + 7 == iter.offset, but
134 + 7 == 141 (0x8d)
iter.offset == 17214 (0x433e)
# vcap_api_iterator_init_test: EXPECTATION FAILED at drivers/net/ethernet/microchip/vcap/vcap_api_kunit.c:388
Expected 5 == iter.reg_idx, but
iter.reg_idx == 702 (0x2be)
# vcap_api_iterator_init_test: EXPECTATION FAILED at drivers/net/ethernet/microchip/vcap/vcap_api_kunit.c:389
Expected 11 == iter.reg_bitpos, but
iter.reg_bitpos == 15 (0xf) # vcap_api_iterator_init_test: pass:0 fail:1 skip:0 total:1
Comments in the code state that "A typegroup table ends with an all-zero terminator". Add the missing terminators.
Some of the typegroups did have a terminator of ".offset = 0, .width = 0, .value = 0,". Replace those terminators with "{ }" (no trailing ',') for consistency and to excplicitly state "this is a terminator".
--- .../ethernet/microchip/vcap/vcap_api_kunit.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/net/ethernet/microchip/vcap/vcap_api_kunit.c +10 -7
@@ -366,12 +366,13 @@ static void vcap_api_iterator_init_test(struct kunit *test)struct vcap_typegroup typegroups[] = { { .offset =0 , .width =2 , .value =2 , }, { .offset =156 , .width =1 , .value =0 , }, - { .offset =0 , .width =0 , .value =0 , }, + { } };struct vcap_typegroup typegroups2[] = { { .offset =0 , .width =3 , .value =4 , }, { .offset =49 , .width =2 , .value =0 , }, { .offset =98 , .width =2 , .value =0 , }, + { } };vcap_iter_init (&iter,52 , typegroups,86 );
@@ -399,6 +400,7 @@ static void vcap_api_iterator_next_test(struct kunit *test) { .offset = 147, .width = 3, .value = 0, }, { .offset = 196, .width = 2, .value = 0, }, { .offset = 245, .width = 1, .value = 0, }, + { } }; int idx;
@@ -433,7 +435,7 @@ static void vcap_api_encode_typegroups_test(struct kunit *test) { .offset = 147, .width = 3, .value = 5, }, { .offset = 196, .width = 2, .value = 2, }, { .offset = 245, .width = 5, .value = 27, }, - { .offset = 0, .width = 0, .value = 0, }, + { } }; vcap_encode_typegroups(stream, 49, typegroups, false);
@@ -463,6 +465,7 @@ static void vcap_api_encode_bit_test(struct kunit *test) { .offset = 147, .width = 3, .value = 5, }, { .offset = 196, .width = 2, .value = 2, }, { .offset = 245, .width = 1, .value = 0, }, + { } }; vcap_iter_init(&iter, 49, typegroups, 44);
@@ -489,7 +492,7 @@ static void vcap_api_encode_field_test(struct kunit *test) { .offset = 147, .width = 3, .value = 5, }, { .offset = 196, .width = 2, .value = 2, }, { .offset = 245, .width = 5, .value = 27, }, - { .offset = 0, .width = 0, .value = 0, }, + { } }; struct vcap_field rf = { .type = VCAP_FIELD_U32,
@@ -538,7 +541,7 @@ static void vcap_api_encode_short_field_test(struct kunit *test) { .offset = 0, .width = 3, .value = 7, }, { .offset = 21, .width = 2, .value = 3, }, { .offset = 42, .width = 1, .value = 1, }, - { .offset = 0, .width = 0, .value = 0, }, + { } }; struct vcap_field rf = { .type = VCAP_FIELD_U32,
@@ -608,7 +611,7 @@ static void vcap_api_encode_keyfield_test(struct kunit *test)struct vcap_typegroup tgt[] = { { .offset =0 , .width =2 , .value =2 , }, { .offset =156 , .width =1 , .value =1 , }, - { .offset =0 , .width =0 , .value =0 , }, + { } };vcap_test_api_init (&admin);
@@ -671,7 +674,7 @@ static void vcap_api_encode_max_keyfield_test(struct kunit *test)struct vcap_typegroup tgt[] = { { .offset =0 , .width =2 , .value =2 , }, { .offset =156 , .width =1 , .value =1 , }, - { .offset =0 , .width =0 , .value =0 , }, + { } };u32 keyres[] = {0x928e8a84 ,
@@ -732,7 +735,7 @@ static void vcap_api_encode_actionfield_test(struct kunit *test) { .offset = 0, .width = 2, .value = 2, }, { .offset = 21, .width = 1, .value = 1, }, { .offset = 42, .width = 1, .value = 0, }, - { .offset = 0, .width = 0, .value = 0, }, + { } }; vcap_encode_actionfield(&rule, &caf, &rf, tgt);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 559/826 netlink: fix false positive warning in extack during dumps
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 3bf39fa849ab8ed52abb6715922e6102d3df9f97 ]
Commit under fixes extended extack reporting to dumps. It works under normal conditions, because extack errors are usually reported during ->start() or the first ->dump(), it's quite rare that the dump starts okay but fails later. If the dump does fail later, however, the input skb will already have the initiating message pulled, so checking if bad attr falls within skb->data will fail.
Switch the check to using nlh, which is always valid.
syzbot found a way to hit that scenario by filling up the receive queue. In this case we initiate a dump but don't call ->dump() until there is read space for an skb.
WARNING: CPU: 1 PID: 5845 at net/netlink/af_netlink.c:2210 netlink_ack_tlv_fill+0x1a8/0x560 net/netlink/af_netlink.c:2209 RIP: 0010:netlink_ack_tlv_fill+0x1a8/0x560 net/netlink/af_netlink.c:2209 Call Trace: <TASK> netlink_dump_done+0x513/0x970 net/netlink/af_netlink.c:2250 netlink_dump+0x91f/0xe10 net/netlink/af_netlink.c:2351 netlink_recvmsg+0x6bb/0x11d0 net/netlink/af_netlink.c:1983 sock_recvmsg_nosec net/socket.c:1051 [inline] sock_recvmsg+0x22f/0x280 net/socket.c:1073 __sys_recvfrom+0x246/0x3d0 net/socket.c:2267 __do_sys_recvfrom net/socket.c:2285 [inline] __se_sys_recvfrom net/socket.c:2281 [inline] __x64_sys_recvfrom+0xde/0x100 net/socket.c:2281 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7ff37dd17a79
--- net/netlink/af_netlink.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
net/netlink/af_netlink.c +11 -10
@@ -2176,9 +2176,14 @@ netlink_ack_tlv_len(struct netlink_sock *nlk, int err,return tlvlen; } +static bool nlmsg_check_in_payload (const struct nlmsghdr *nlh,const void *addr) +{ +return !WARN_ON (addr <nlmsg_data (nlh) || + addr - (const void *) nlh >= nlh->nlmsg_len); +} +static void -netlink_ack_tlv_fill (struct sk_buff *in_skb,struct sk_buff *skb, -const struct nlmsghdr *nlh,int err, +netlink_ack_tlv_fill (struct sk_buff *skb,const struct nlmsghdr *nlh,int err,const struct netlink_ext_ack *extack) {if (extack->_msg)
@@ -2190,9 +2195,7 @@ netlink_ack_tlv_fill(struct sk_buff *in_skb, struct sk_buff *skb,if (!err)return ; -if (extack->bad_attr && - !WARN_ON ((u8 *)extack->bad_attr < in_skb->data || - (u8 *)extack->bad_attr >= in_skb->data + in_skb->len)) +if (extack->bad_attr &&nlmsg_check_in_payload (nlh, extack->bad_attr))WARN_ON (nla_put_u32 (skb,NLMSGERR_ATTR_OFFS , (u8 *)extack->bad_attr - (const u8 *)nlh));if (extack->policy)
@@ -2201,9 +2204,7 @@ netlink_ack_tlv_fill(struct sk_buff *in_skb, struct sk_buff *skb,if (extack->miss_type)WARN_ON (nla_put_u32 (skb,NLMSGERR_ATTR_MISS_TYPE , extack->miss_type)); -if (extack->miss_nest && - !WARN_ON ((u8 *)extack->miss_nest < in_skb->data || - (u8 *)extack->miss_nest > in_skb->data + in_skb->len)) +if (extack->miss_nest &&nlmsg_check_in_payload (nlh, extack->miss_nest))WARN_ON (nla_put_u32 (skb,NLMSGERR_ATTR_MISS_NEST , (u8 *)extack->miss_nest - (const u8 *)nlh)); }
@@ -2232,7 +2233,7 @@ static int netlink_dump_done(struct netlink_sock *nlk, struct sk_buff *skb,if (extack_len) { nlh->nlmsg_flags |=NLM_F_ACK_TLVS ;if (skb_tailroom (skb) >= extack_len) { -netlink_ack_tlv_fill (cb->skb, skb, cb->nlh, +netlink_ack_tlv_fill (skb, cb->nlh, nlk->dump_done_errno, extack);nlmsg_end (skb, nlh); }
@@ -2491,7 +2492,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err, }if (tlvlen) -netlink_ack_tlv_fill (in_skb, skb, nlh, err, extack); +netlink_ack_tlv_fill (skb, nlh, err, extack);nlmsg_end (skb, rep);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 560/826 exfat: fix file being changed by unaligned direct write
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuezhang Mo <[email protected]>
[ Upstream commit 2e94e5bb94a3e641a25716a560bf474225fda83c ]
Unaligned direct writes are invalid and should return an error without making any changes, rather than extending ->valid_size and then returning an error. Therefore, alignment checking is required before extending ->valid_size.
--- fs/exfat/file.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
fs/exfat/file.c +10 -0
@@ -584,6 +584,16 @@ static ssize_t exfat_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)if (ret <0 ) goto unlock; +if (iocb->ki_flags &IOCB_DIRECT ) { +unsigned long align = pos |iov_iter_alignment (iter); + +if (!IS_ALIGNED (align,i_blocksize (inode)) && + !IS_ALIGNED (align,bdev_logical_block_size (inode->i_sb->s_bdev))) { + ret = -EINVAL ; + goto unlock; + } + } +if (pos > valid_size) { ret =exfat_extend_valid_size (file, pos);if (ret <0 && ret != -ENOSPC ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 561/826 net/l2tp: fix warning in l2tp_exit_net found by syzbot
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Chapman <[email protected]>
[ Upstream commit 5d066766c5f1252f98ff859265bcd1a5b52ac46c ]
In l2tp's net exit handler, we check that an IDR is empty before destroying it:
WARN_ON_ONCE(!idr_is_empty(&pn->l2tp_tunnel_idr)); idr_destroy(&pn->l2tp_tunnel_idr);
By forcing memory allocation failures in idr_alloc_32, syzbot is able to provoke a condition where idr_is_empty returns false despite there being no items in the IDR. This turns out to be because the radix tree of the IDR contains only internal radix-tree nodes and it is this that causes idr_is_empty to return false. The internal nodes are cleaned by idr_destroy.
Use idr_for_each to check that the IDR is empty instead of idr_is_empty to avoid the problem.
--- net/l2tp/l2tp_core.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-)
net/l2tp/l2tp_core.c +19 -3
@@ -1870,15 +1870,31 @@ static __net_exit void l2tp_pre_exit_net(struct net *net) } } +static int l2tp_idr_item_unexpected (int id,void *p,void *data) +{ +const char *idr_name = data; + +pr_err ("l2tp: %s IDR not empty at net %d exit\n" , idr_name, id); +WARN_ON_ONCE (1 ); +return 1 ; +} + static __net_exit void l2tp_exit_net(struct net *net) {struct l2tp_net *pn =l2tp_pernet (net); -WARN_ON_ONCE (!idr_is_empty (&pn->l2tp_v2_session_idr)); +/* Our per-net IDRs should be empty. Check that is so, to +* help catch cleanup races or refcnt leaks. +*/ +idr_for_each (&pn->l2tp_v2_session_idr, l2tp_idr_item_unexpected, +"v2_session" ); +idr_for_each (&pn->l2tp_v3_session_idr, l2tp_idr_item_unexpected, +"v3_session" ); +idr_for_each (&pn->l2tp_tunnel_idr, l2tp_idr_item_unexpected, +"tunnel" ); +idr_destroy (&pn->l2tp_v2_session_idr); -WARN_ON_ONCE (!idr_is_empty (&pn->l2tp_v3_session_idr));idr_destroy (&pn->l2tp_v3_session_idr); -WARN_ON_ONCE (!idr_is_empty (&pn->l2tp_tunnel_idr));idr_destroy (&pn->l2tp_tunnel_idr); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 562/826 s390/iucv: MSG_PEEK causes memory leak in iucv_sock_destruct()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sidraya Jayagond <[email protected]>
[ Upstream commit ebaf81317e42aa990ad20b113cfe3a7b20d4e937 ]
Passing MSG_PEEK flag to skb_recv_datagram() increments skb refcount (skb->users) and iucv_sock_recvmsg() does not decrement skb refcount at exit.
This results in skb memory leak in skb_queue_purge() and WARN_ON in iucv_sock_destruct() during socket close. To fix this decrease skb refcount by one if MSG_PEEK is set in order to prevent memory leak and WARN_ON.
WARNING: CPU: 2 PID: 6292 at net/iucv/af_iucv.c:286 iucv_sock_destruct+0x144/0x1a0 [af_iucv]
CPU: 2 PID: 6292 Comm: afiucv_test_msg Kdump: loaded Tainted: G W 6.10.0-rc7 #1
Hardware name: IBM 3931 A01 704 (z/VM 7.3.0)
Call Trace:
[<001587c682c4aa98>] iucv_sock_destruct+0x148/0x1a0 [af_iucv]
[<001587c682c4a9d0>] iucv_sock_destruct+0x80/0x1a0 [af_iucv]
[<001587c704117a32>] __sk_destruct+0x52/0x550
[<001587c704104a54>] __sock_release+0xa4/0x230
[<001587c704104c0c>] sock_close+0x2c/0x40
[<001587c702c5f5a8>] __fput+0x2e8/0x970
[<001587c7024148c4>] task_work_run+0x1c4/0x2c0
[<001587c7023b0716>] do_exit+0x996/0x1050
[<001587c7023b13aa>] do_group_exit+0x13a/0x360
[<001587c7023b1626>] __s390x_sys_exit_group+0x56/0x60
[<001587c7022bccca>] do_syscall+0x27a/0x380
[<001587c7049a6a0c>] __do_syscall+0x9c/0x160
[<001587c7049ce8a8>] system_call+0x70/0x98
Last Breaking-Event-Address:
[<001587c682c4a9d4>] iucv_sock_destruct+0x84/0x1a0 [af_iucv]--- net/iucv/af_iucv.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-)
net/iucv/af_iucv.c +17 -9
@@ -1236,7 +1236,9 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg,return -EOPNOTSUPP ;/* receive/dequeue next skb: -* the function understands MSG_PEEK and, thus, does not dequeue skb */ +* the function understands MSG_PEEK and, thus, does not dequeue skb +* only refcount is increased. +*/ skb =skb_recv_datagram (sk, flags, &err);if (!skb) {if (sk->sk_shutdown &RCV_SHUTDOWN )
@@ -1252,9 +1254,8 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg, cskb = skb;if (skb_copy_datagram_msg (cskb, offset, msg, copied)) { -if (!(flags &MSG_PEEK )) -skb_queue_head (&sk->sk_receive_queue, skb); -return -EFAULT ; + err = -EFAULT ; + goto err_out; }/* SOCK_SEQPACKET: set MSG_TRUNC if recv buf size is too small */
@@ -1271,11 +1272,8 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg, err =put_cmsg (msg,SOL_IUCV ,SCM_IUCV_TRGCLS ,sizeof (IUCV_SKB_CB (skb)->class), (void *)&IUCV_SKB_CB (skb)->class); -if (err) { -if (!(flags &MSG_PEEK )) -skb_queue_head (&sk->sk_receive_queue, skb); -return err; - } +if (err) + goto err_out;/* Mark read part of skb as used */ if (!(flags &MSG_PEEK )) {
@@ -1331,8 +1329,18 @@ static int iucv_sock_recvmsg(struct socket *sock, struct msghdr *msg,/* SOCK_SEQPACKET: return real length if MSG_TRUNC is set */ if (sk->sk_type ==SOCK_SEQPACKET && (flags &MSG_TRUNC )) copied = rlen; +if (flags &MSG_PEEK ) +skb_unref (skb);return copied; + +err_out: +if (!(flags &MSG_PEEK )) +skb_queue_head (&sk->sk_receive_queue, skb); +else +skb_unref (skb); + +return err; }static inline __poll_t iucv_accept_poll (struct sock *parent)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 563/826 rtase: Refactor the rtase_check_mac_version_valid() function
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Lai <[email protected]>
[ Upstream commit a1f8609ff1f658e410f78d800ca947d57e51996a ]
Different hardware requires different configurations, but this distinction was not made previously. Additionally, the error message was not clear enough. Therefore, this patch will address the issues mentioned above.
--- drivers/net/ethernet/realtek/rtase/rtase.h | 7 ++++- .../net/ethernet/realtek/rtase/rtase_main.c | 28 +++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-)
drivers/net/ethernet/realtek/rtase/rtase.h +6 -1
@@ -9,7 +9,10 @@#ifndef RTASE_H #define RTASE_H -#define RTASE_HW_VER_MASK 0x7C800000 +#define RTASE_HW_VER_MASK 0x7C800000 +#define RTASE_HW_VER_906X_7XA 0x00800000 +#define RTASE_HW_VER_906X_7XC 0x04000000 +#define RTASE_HW_VER_907XD_V1 0x04800000#define RTASE_RX_DMA_BURST_256 4#define RTASE_TX_DMA_BURST_UNLIMITED 7
@@ -327,6 +330,8 @@ struct rtase_private {u16 int_nums;u16 tx_int_mit;u16 rx_int_mit; + +u32 hw_ver; };#define RTASE_LSO_64K 64000
drivers/net/ethernet/realtek/rtase/rtase_main.c +16 -12
@@ -1972,20 +1972,21 @@ static void rtase_init_software_variable(struct pci_dev *pdev, tp->dev->max_mtu =RTASE_MAX_JUMBO_SIZE ; } -static bool rtase_check_mac_version_valid (struct rtase_private *tp) +static int rtase_check_mac_version_valid (struct rtase_private *tp) { -u32 hw_ver =rtase_r32 (tp,RTASE_TX_CONFIG_0 ) &RTASE_HW_VER_MASK ; -bool known_ver = false; +int ret = -ENODEV ; -switch (hw_ver) { -case 0x00800000 : -case 0x04000000 : -case 0x04800000 : - known_ver = true; + tp->hw_ver =rtase_r32 (tp,RTASE_TX_CONFIG_0 ) &RTASE_HW_VER_MASK ; + +switch (tp->hw_ver) { +case RTASE_HW_VER_906X_7XA : +case RTASE_HW_VER_906X_7XC : +case RTASE_HW_VER_907XD_V1 : + ret =0 ;break ; } -return known_ver; +return ret; } static int rtase_init_board(struct pci_dev *pdev, struct net_device **dev_out,
@@ -2105,9 +2106,12 @@ static int rtase_init_one(struct pci_dev *pdev, tp->pdev = pdev;/* identify chip attached to board */ -if (!rtase_check_mac_version_valid (tp)) -return dev_err_probe (&pdev->dev, -ENODEV , -"unknown chip version, contact rtase maintainers (see MAINTAINERS file)\n" ); + ret =rtase_check_mac_version_valid (tp); +if (ret !=0 ) { +dev_err (&pdev->dev, +"unknown chip version: 0x%08x, contact rtase maintainers (see MAINTAINERS file)\n" , + tp->hw_ver); + }rtase_init_software_variable (pdev, tp);rtase_init_hardware (tp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 564/826 rtase: Correct the speed for RTL907XD-V1
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Lai <[email protected]>
[ Upstream commit c1fc14c4df801fe2d9ec3160b52fa63569ce164c ]
Previously, the reported speed was uniformly set to SPEED_5000, but the RTL907XD-V1 actually operates at a speed of SPEED_10000. Therefore, this patch makes the necessary correction.
--- drivers/net/ethernet/realtek/rtase/rtase_main.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/net/ethernet/realtek/rtase/rtase_main.c +12 -1
@@ -1714,10 +1714,21 @@ static int rtase_get_settings(struct net_device *dev, struct ethtool_link_ksettings *cmd) {u32 supported =SUPPORTED_MII | SUPPORTED_Pause | SUPPORTED_Asym_Pause; +const struct rtase_private *tp =netdev_priv (dev);ethtool_convert_legacy_u32_to_link_mode (cmd->link_modes.supported, supported); - cmd->base.speed =SPEED_5000 ; + +switch (tp->hw_ver) { +case RTASE_HW_VER_906X_7XA : +case RTASE_HW_VER_906X_7XC : + cmd->base.speed =SPEED_5000 ; +break ; +case RTASE_HW_VER_907XD_V1 : + cmd->base.speed =SPEED_10000 ; +break ; + } + cmd->base.duplex =DUPLEX_FULL ; cmd->base.port =PORT_MII ; cmd->base.autoneg =AUTONEG_DISABLE ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 565/826 rtase: Corrects error handling of the rtase_check_mac_version_valid()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Lai <[email protected]>
[ Upstream commit a01cfcfda5cc787552b344cbc92f9c363c81ad4f ]
Previously, when the hardware version ID was determined to be invalid, only an error message was printed without any further handling. Therefore, this patch makes the necessary corrections to address this.
--- drivers/net/ethernet/realtek/rtase/rtase_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/realtek/rtase/rtase_main.c +2 -0
@@ -2122,6 +2122,7 @@ static int rtase_init_one(struct pci_dev *pdev,dev_err (&pdev->dev,"unknown chip version: 0x%08x, contact rtase maintainers (see MAINTAINERS file)\n" , tp->hw_ver); + goto err_out_release_board; }rtase_init_software_variable (pdev, tp);
@@ -2196,6 +2197,7 @@ static int rtase_init_one(struct pci_dev *pdev,netif_napi_del (&ivec->napi); } +err_out_release_board:rtase_release_board (pdev, dev, ioaddr);return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 566/826 net/ipv6: delete temporary address if mngtmpaddr is removed or unmanaged
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hangbin Liu <[email protected]>
[ Upstream commit 00b5b7aab9e422d00d5a9d03d7e0760a76b5d57f ]
RFC8981 section 3.4 says that existing temporary addresses must have their lifetimes adjusted so that no temporary addresses should ever remain "valid" or "preferred" longer than the incoming SLAAC Prefix Information. This would strongly imply in Linux's case that if the "mngtmpaddr" address is deleted or un-flagged as such, its corresponding temporary addresses must be cleared out right away.
But now the temporary address is renewed even after ‘mngtmpaddr’ is removed or becomes unmanaged as manage_tempaddrs() set temporary addresses prefered/valid time to 0, and later in addrconf_verify_rtnl() all checkings failed to remove the addresses. Fix this by deleting the temporary address directly for these situations.
--- net/ipv6/addrconf.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-)
net/ipv6/addrconf.c +29 -12
@@ -2570,6 +2570,24 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev)return idev; } +static void delete_tempaddrs (struct inet6_dev *idev, +struct inet6_ifaddr *ifp) +{ +struct inet6_ifaddr *ift, *tmp; + +write_lock_bh (&idev->lock); +list_for_each_entry_safe (ift, tmp, &idev->tempaddr_list, tmp_list) { +if (ift->ifpub != ifp) +continue ; + +in6_ifa_hold (ift); +write_unlock_bh (&idev->lock); +ipv6_del_addr (ift); +write_lock_bh (&idev->lock); + } +write_unlock_bh (&idev->lock); +} + static void manage_tempaddrs(struct inet6_dev *idev, struct inet6_ifaddr *ifp, __u32 valid_lft, __u32 prefered_lft,
@@ -3124,11 +3142,12 @@ static int inet6_addr_del(struct net *net, int ifindex, u32 ifa_flags,in6_ifa_hold (ifp);read_unlock_bh (&idev->lock); -if (!(ifp->flags &IFA_F_TEMPORARY ) && - (ifa_flags &IFA_F_MANAGETEMPADDR )) -manage_tempaddrs (idev, ifp,0 ,0 , false, - jiffies);ipv6_del_addr (ifp); + +if (!(ifp->flags &IFA_F_TEMPORARY ) && + (ifp->flags &IFA_F_MANAGETEMPADDR )) +delete_tempaddrs (idev, ifp); +addrconf_verify_rtnl (net);if (ipv6_addr_is_multicast (pfx)) { ipv6_mc_config(net->ipv6.mc_autojoin_sk,
@@ -4952,14 +4971,12 @@ static int inet6_addr_modify(struct net *net, struct inet6_ifaddr *ifp, }if (was_managetempaddr || ifp->flags &IFA_F_MANAGETEMPADDR ) { -if (was_managetempaddr && - !(ifp->flags &IFA_F_MANAGETEMPADDR )) { - cfg->valid_lft =0 ; - cfg->preferred_lft =0 ; - } -manage_tempaddrs (ifp->idev, ifp, cfg->valid_lft, - cfg->preferred_lft, !was_managetempaddr, - jiffies); +if (was_managetempaddr && !(ifp->flags &IFA_F_MANAGETEMPADDR )) +delete_tempaddrs (ifp->idev, ifp); +else +manage_tempaddrs (ifp->idev, ifp, cfg->valid_lft, + cfg->preferred_lft, !was_managetempaddr, + jiffies); }addrconf_verify_rtnl (net);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 567/826 net: mdio-ipq4019: add missing error check
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rosen Penev <[email protected]>
[ Upstream commit 9cc8d0ecdd2aad42e377e971e3bb114339df609e ]
If an optional resource is found but fails to remap, return on failure. Avoids any potential problems when using the iomapped resource as the assumption is that it's available.
--- drivers/net/mdio/mdio-ipq4019.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/mdio/mdio-ipq4019.c +4 -1
@@ -352,8 +352,11 @@ static int ipq4019_mdio_probe(struct platform_device *pdev)/* The platform resource is provided on the chipset IPQ5018 */ /* This resource is optional */ res =platform_get_resource (pdev,IORESOURCE_MEM ,1 ); -if (res) +if (res) { priv->eth_ldo_rdy =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (priv->eth_ldo_rdy)) +return PTR_ERR (priv->eth_ldo_rdy); + } bus->name ="ipq4019_mdio" ; bus->read = ipq4019_mdio_read_c22;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 568/826 marvell: pxa168_eth: fix call balance of pep->clk handling routines
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vitalii Mordan <[email protected]>
[ Upstream commit b032ae57d4fe2b2445e3bc190db6fcaa8c102f68 ]
If the clock pep->clk was not enabled in pxa168_eth_probe, it should not be disabled in any path.
Conversely, if it was enabled in pxa168_eth_probe, it must be disabled in all error paths to ensure proper cleanup.
Use the devm_clk_get_enabled helper function to ensure proper call balance for pep->clk.
Found by Linux Verification Center (linuxtesting.org) with Klever.
--- drivers/net/ethernet/marvell/pxa168_eth.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
drivers/net/ethernet/marvell/pxa168_eth.c +4 -10
@@ -1394,18 +1394,15 @@ static int pxa168_eth_probe(struct platform_device *pdev)printk (KERN_NOTICE "PXA168 10/100 Ethernet Driver\n" ); - clk =devm_clk_get (&pdev->dev,NULL ); + clk =devm_clk_get_enabled (&pdev->dev,NULL );if (IS_ERR (clk)) { -dev_err (&pdev->dev,"Fast Ethernet failed to get clock\n" ); +dev_err (&pdev->dev,"Fast Ethernet failed to get and enable clock\n" );return -ENODEV ; } -clk_prepare_enable (clk); dev =alloc_etherdev (sizeof (struct pxa168_eth_private )); -if (!dev) { - err = -ENOMEM ; - goto err_clk; - } +if (!dev) +return -ENOMEM ;platform_set_drvdata (pdev, dev); pep =netdev_priv (dev);
@@ -1523,8 +1520,6 @@ static int pxa168_eth_probe(struct platform_device *pdev)mdiobus_free (pep->smi_bus); err_netdev:free_netdev (dev); -err_clk: -clk_disable_unprepare (clk);return err; }
@@ -1542,7 +1537,6 @@ static void pxa168_eth_remove(struct platform_device *pdev)if (dev->phydev)phy_disconnect (dev->phydev); -clk_disable_unprepare (pep->clk);mdiobus_unregister (pep->smi_bus);mdiobus_free (pep->smi_bus);unregister_netdev (dev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 569/826 net: stmmac: dwmac-socfpga: Set RX watchdog interrupt as broken
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Chevallier <[email protected]>
[ Upstream commit 407618d66dba55e7db1278872e8be106808bbe91 ]
On DWMAC3 and later, there's a RX Watchdog interrupt that's used for interrupt coalescing. It's known to be buggy on some platforms, and dwmac-socfpga appears to be one of them. Changing the interrupt coalescing from ethtool doesn't appear to have any effect here.
Without disabling RIWT (Received Interrupt Watchdog Timer, I believe...), we observe latencies while receiving traffic that amount to around ~0.4ms. This was discovered with NTP but can be easily reproduced with a simple ping. Without this patch :
64 bytes from 192.168.5.2: icmp_seq=1 ttl=64 time=0.657 ms
With this patch :
64 bytes from 192.168.5.2: icmp_seq=1 ttl=64 time=0.254 ms
--- drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c +2 -0
@@ -486,6 +486,8 @@ static int socfpga_dwmac_probe(struct platform_device *pdev) plat_dat->pcs_exit = socfpga_dwmac_pcs_exit; plat_dat->select_pcs = socfpga_dwmac_select_pcs; + plat_dat->riwt_off =1 ; + ret =stmmac_dvr_probe (&pdev->dev, plat_dat, &stmmac_res);if (ret)return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 570/826 octeontx2-af: RPM: Fix mismatch in lmac type
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hariprasad Kelam <[email protected]>
[ Upstream commit 7ebbbb23ea5b6d051509cb11399afac5042c9266 ]
Due to a bug in the previous patch, there is a mismatch between the lmac type reported by the driver and the actual hardware configuration.
--- drivers/net/ethernet/marvell/octeontx2/af/rpm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/marvell/octeontx2/af/rpm.c +1 -1
@@ -467,7 +467,7 @@ u8 rpm_get_lmac_type(void *rpmd, int lmac_id)int err; req =FIELD_SET (CMDREG_ID ,CGX_CMD_GET_LINK_STS , req); - err =cgx_fwi_cmd_generic (req, &resp, rpm,0 ); + err =cgx_fwi_cmd_generic (req, &resp, rpm, lmac_id);if (!err)return FIELD_GET (RESP_LINKSTAT_LMAC_TYPE , resp);return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 571/826 octeontx2-af: RPM: Fix low network performance
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hariprasad Kelam <[email protected]>
[ Upstream commit d1e8884e050c1255a9ceb477f5ff926ee9214a23 ]
Low network performance is observed even on RPMs with larger FIFO lengths.
The cn10kb silicon has three RPM blocks with the following FIFO sizes:
--------------------
| RPM0 | 256KB |
| RPM1 | 256KB |
| RPM2 | 128KB |
--------------------The current design stores the FIFO length in a common structure for all RPMs (mac_ops). As a result, the FIFO length of the last RPM is applied to all RPMs, leading to reduced network performance.
This patch resolved the problem by storing the fifo length in per MAC structure (cgx).
--- drivers/net/ethernet/marvell/octeontx2/af/cgx.c | 9 +++++++-- drivers/net/ethernet/marvell/octeontx2/af/cgx.h | 1 + drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h | 5 ++++- drivers/net/ethernet/marvell/octeontx2/af/rpm.c | 6 +++--- drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c | 9 ++++----- 5 files changed, 19 insertions(+), 11 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/cgx.c +7 -2
@@ -112,6 +112,11 @@ struct mac_ops *get_mac_ops(void *cgxd)return ((struct cgx *)cgxd)->mac_ops; } +u32 cgx_get_fifo_len (void *cgxd) +{ +return ((struct cgx *)cgxd)->fifo_len; +} +void cgx_write (struct cgx *cgx,u64 lmac,u64 offset,u64 val) { writeq(val, cgx->reg_base + (lmac << cgx->mac_ops->lmac_offset) +
@@ -501,7 +506,7 @@ static u32 cgx_get_lmac_fifo_len(void *cgxd, int lmac_id)u8 num_lmacs;u32 fifo_len; - fifo_len = cgx->mac_ops->fifo_len; + fifo_len = cgx->fifo_len; num_lmacs = cgx->mac_ops->get_nr_lmacs (cgx);switch (num_lmacs) {
@@ -1764,7 +1769,7 @@ static void cgx_populate_features(struct cgx *cgx)u64 cfg; cfg =cgx_read (cgx,0 ,CGX_CONST ); - cgx->mac_ops->fifo_len =FIELD_GET (CGX_CONST_RXFIFO_SIZE , cfg); + cgx->fifo_len =FIELD_GET (CGX_CONST_RXFIFO_SIZE , cfg); cgx->max_lmac_per_mac =FIELD_GET (CGX_CONST_MAX_LMACS , cfg);if (is_dev_rpm (cgx))
drivers/net/ethernet/marvell/octeontx2/af/cgx.h +1 -0
@@ -185,4 +185,5 @@ int cgx_lmac_get_pfc_frm_cfg(void *cgxd, int lmac_id, u8 *tx_pause,int verify_lmac_fc_cfg (void *cgxd,int lmac_id,u8 tx_pause,u8 rx_pause,int pfvf_idx);int cgx_lmac_reset (void *cgxd,int lmac_id,u8 pf_req_flr); +u32 cgx_get_fifo_len (void *cgxd);#endif /* CGX_H */
drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h +4 -1
@@ -72,7 +72,6 @@ struct mac_ops {u8 irq_offset;u8 int_ena_bit;u8 lmac_fwi; -u32 fifo_len;bool non_contiguous_serdes_lane;/* RPM & CGX differs in number of Receive/transmit stats */ u8 rx_stats_cnt;
@@ -142,6 +141,10 @@ struct cgx {u8 lmac_count;/* number of LMACs per MAC could be 4 or 8 */ u8 max_lmac_per_mac; +/* length of fifo varies depending on the number +* of LMACS +*/ +u32 fifo_len;#define MAX_LMAC_COUNT 8struct lmac *lmac_idmap[MAX_LMAC_COUNT ];struct work_struct cgx_cmd_work;
drivers/net/ethernet/marvell/octeontx2/af/rpm.c +3 -3
@@ -480,7 +480,7 @@ u32 rpm_get_lmac_fifo_len(void *rpmd, int lmac_id)u8 num_lmacs;u32 fifo_len; - fifo_len = rpm->mac_ops->fifo_len; + fifo_len = rpm->fifo_len; num_lmacs = rpm->mac_ops->get_nr_lmacs (rpm);switch (num_lmacs) {
@@ -533,9 +533,9 @@ u32 rpm2_get_lmac_fifo_len(void *rpmd, int lmac_id)*/ max_lmac = (rpm_read (rpm,0 ,CGX_CONST ) >>24 ) &0xFF ;if (max_lmac >4 ) - fifo_len = rpm->mac_ops->fifo_len /2 ; + fifo_len = rpm->fifo_len /2 ;else - fifo_len = rpm->mac_ops->fifo_len; + fifo_len = rpm->fifo_len;if (lmac_id <4 ) { num_lmacs =hweight8 (lmac_info &0xF );
drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c +4 -5
@@ -923,13 +923,12 @@ int rvu_mbox_handler_cgx_features_get(struct rvu *rvu,u32 rvu_cgx_get_fifolen (struct rvu *rvu) { -struct mac_ops *mac_ops; -u32 fifo_len; +void *cgxd =rvu_first_cgx_pdata (rvu); - mac_ops =get_mac_ops (rvu_first_cgx_pdata (rvu)); - fifo_len = mac_ops ? mac_ops->fifo_len :0 ; +if (!cgxd) +return 0 ; -return fifo_len; +return cgx_get_fifo_len (cgxd); }u32 rvu_cgx_get_lmac_fifolen (struct rvu *rvu,int cgx,int lmac)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 572/826 octeontx2-af: RPM: fix stale RSFEC counters
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hariprasad Kelam <[email protected]>
[ Upstream commit 07cd1eb166a3fa7244afa74d48bd13c9df7c559d ]
The earlier patch sets the 'Stats control register' for RPM receive/transmit statistics instead of RSFEC statistics, causing the driver to return stale FEC counters.
--- drivers/net/ethernet/marvell/octeontx2/af/rpm.c | 13 +++++++++---- drivers/net/ethernet/marvell/octeontx2/af/rpm.h | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rpm.c +9 -4
@@ -699,6 +699,10 @@ int rpm_get_fec_stats(void *rpmd, int lmac_id, struct cgx_fec_stats_rsp *rsp)if (rpm->lmac_idmap[lmac_id]->link_info.fec ==OTX2_FEC_NONE )return 0 ; +/* latched registers FCFECX_CW_HI/RSFEC_STAT_FAST_DATA_HI_CDC are common +* for all counters. Acquire lock to ensure serialized reads +*/ +mutex_lock (&rpm->lock);if (rpm->lmac_idmap[lmac_id]->link_info.fec ==OTX2_FEC_BASER ) { val_lo =rpm_read (rpm, lmac_id,RPMX_MTI_FCFECX_VL0_CCW_LO ); val_hi =rpm_read (rpm, lmac_id,RPMX_MTI_FCFECX_CW_HI );
@@ -725,20 +729,21 @@ int rpm_get_fec_stats(void *rpmd, int lmac_id, struct cgx_fec_stats_rsp *rsp) } }else {/* enable RS-FEC capture */ - cfg =rpm_read (rpm,0 ,RPMX_MTI_STAT_STATN_CONTROL ); + cfg =rpm_read (rpm,0 ,RPMX_MTI_RSFEC_STAT_STATN_CONTROL ); cfg |=RPMX_RSFEC_RX_CAPTURE |BIT (lmac_id); -rpm_write (rpm,0 ,RPMX_MTI_STAT_STATN_CONTROL , cfg); +rpm_write (rpm,0 ,RPMX_MTI_RSFEC_STAT_STATN_CONTROL , cfg); val_lo =rpm_read (rpm,0 ,RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2 ); - val_hi =rpm_read (rpm,0 ,RPMX_MTI_STAT_DATA_HI_CDC ); + val_hi =rpm_read (rpm,0 ,RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC ); rsp->fec_corr_blks = (val_hi <<32 | val_lo); val_lo =rpm_read (rpm,0 ,RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3 ); - val_hi =rpm_read (rpm,0 ,RPMX_MTI_STAT_DATA_HI_CDC ); + val_hi =rpm_read (rpm,0 ,RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC ); rsp->fec_uncorr_blks = (val_hi <<32 | val_lo); } +mutex_unlock (&rpm->lock);return 0 ; }
drivers/net/ethernet/marvell/octeontx2/af/rpm.h +3 -1
@@ -84,9 +84,11 @@/* FEC stats */ #define RPMX_MTI_STAT_STATN_CONTROL 0x10018#define RPMX_MTI_STAT_DATA_HI_CDC 0x10038 -#define RPMX_RSFEC_RX_CAPTURE BIT_ULL(27) +#define RPMX_RSFEC_RX_CAPTURE BIT_ULL(28)#define RPMX_CMD_CLEAR_RX BIT_ULL(30)#define RPMX_CMD_CLEAR_TX BIT_ULL(31) +#define RPMX_MTI_RSFEC_STAT_STATN_CONTROL 0x40018 +#define RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC 0x40000#define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2 0x40050#define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3 0x40058#define RPMX_MTI_FCFECX_VL0_CCW_LO 0x38618
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 573/826 octeontx2-af: RPM: fix stale FCFEC counters
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hariprasad Kelam <[email protected]>
[ Upstream commit 6fc2164108462b913a1290fa2c44054c70b060ef ]
The corrected words register(FCFECX_VL0_CCW_LO)/Uncorrected words register (FCFECX_VL0_NCCW_LO) of FCFEC counter has different LMAC offset which needs to be accessed differently.
--- .../net/ethernet/marvell/octeontx2/af/rpm.c | 24 +++++++++---------- .../net/ethernet/marvell/octeontx2/af/rpm.h | 10 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rpm.c +12 -12
@@ -704,27 +704,27 @@ int rpm_get_fec_stats(void *rpmd, int lmac_id, struct cgx_fec_stats_rsp *rsp)*/ mutex_lock (&rpm->lock);if (rpm->lmac_idmap[lmac_id]->link_info.fec ==OTX2_FEC_BASER ) { - val_lo =rpm_read (rpm, lmac_id,RPMX_MTI_FCFECX_VL0_CCW_LO ); - val_hi =rpm_read (rpm, lmac_id,RPMX_MTI_FCFECX_CW_HI ); + val_lo =rpm_read (rpm,0 ,RPMX_MTI_FCFECX_VL0_CCW_LO (lmac_id)); + val_hi =rpm_read (rpm,0 ,RPMX_MTI_FCFECX_CW_HI (lmac_id)); rsp->fec_corr_blks = (val_hi <<16 | val_lo); - val_lo =rpm_read (rpm, lmac_id,RPMX_MTI_FCFECX_VL0_NCCW_LO ); - val_hi =rpm_read (rpm, lmac_id,RPMX_MTI_FCFECX_CW_HI ); + val_lo =rpm_read (rpm,0 ,RPMX_MTI_FCFECX_VL0_NCCW_LO (lmac_id)); + val_hi =rpm_read (rpm,0 ,RPMX_MTI_FCFECX_CW_HI (lmac_id)); rsp->fec_uncorr_blks = (val_hi <<16 | val_lo);/* 50G uses 2 Physical serdes lines */ if (rpm->lmac_idmap[lmac_id]->link_info.lmac_type_id ==LMAC_MODE_50G_R ) { - val_lo =rpm_read (rpm, lmac_id, -RPMX_MTI_FCFECX_VL1_CCW_LO ); - val_hi =rpm_read (rpm, lmac_id, -RPMX_MTI_FCFECX_CW_HI ); + val_lo =rpm_read (rpm,0 , +RPMX_MTI_FCFECX_VL1_CCW_LO (lmac_id)); + val_hi =rpm_read (rpm,0 , +RPMX_MTI_FCFECX_CW_HI (lmac_id)); rsp->fec_corr_blks += (val_hi <<16 | val_lo); - val_lo =rpm_read (rpm, lmac_id, -RPMX_MTI_FCFECX_VL1_NCCW_LO ); - val_hi =rpm_read (rpm, lmac_id, -RPMX_MTI_FCFECX_CW_HI ); + val_lo =rpm_read (rpm,0 , +RPMX_MTI_FCFECX_VL1_NCCW_LO (lmac_id)); + val_hi =rpm_read (rpm,0 , +RPMX_MTI_FCFECX_CW_HI (lmac_id)); rsp->fec_uncorr_blks += (val_hi <<16 | val_lo); } }else {
drivers/net/ethernet/marvell/octeontx2/af/rpm.h +5 -5
@@ -91,11 +91,11 @@#define RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC 0x40000#define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2 0x40050#define RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3 0x40058 -#define RPMX_MTI_FCFECX_VL0_CCW_LO 0x38618 -#define RPMX_MTI_FCFECX_VL0_NCCW_LO 0x38620 -#define RPMX_MTI_FCFECX_VL1_CCW_LO 0x38628 -#define RPMX_MTI_FCFECX_VL1_NCCW_LO 0x38630 -#define RPMX_MTI_FCFECX_CW_HI 0x38638 +#define RPMX_MTI_FCFECX_VL0_CCW_LO (a) (0x38618 + ((a) * 0x40)) +#define RPMX_MTI_FCFECX_VL0_NCCW_LO (a) (0x38620 + ((a) * 0x40)) +#define RPMX_MTI_FCFECX_VL1_CCW_LO (a) (0x38628 + ((a) * 0x40)) +#define RPMX_MTI_FCFECX_VL1_NCCW_LO (a) (0x38630 + ((a) * 0x40)) +#define RPMX_MTI_FCFECX_CW_HI (a) (0x38638 + ((a) * 0x40))/* CN10KB CSR Declaration */ #define RPM2_CMRX_SW_INT 0x1b0
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 574/826 octeontx2-af: Quiesce traffic before NIX block reset
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hariprasad Kelam <[email protected]>
[ Upstream commit 762ca6eed026346d9d41ed5ac633083c4f1e5071 ]
During initialization, the AF driver resets all blocks. The RPM (MAC) block and NIX block operate on a credit-based model. When the NIX block resets during active traffic flow, it doesn't release credits to the RPM block. This causes the RPM FIFO to overflow, leading to receive traffic struck.
To address this issue, the patch introduces the following changes:
1. Stop receiving traffic at the MAC level during AF driver initialization.
2. Perform an X2P reset (prevents RXFIFO of all LMACS from pushing data)
3. Reset the NIX block.
4. Clear the X2P reset and re-enable receiving traffic.
--- .../net/ethernet/marvell/octeontx2/af/cgx.c | 61 +++++++++++++++++++ .../net/ethernet/marvell/octeontx2/af/cgx.h | 4 ++ .../marvell/octeontx2/af/lmac_common.h | 2 + .../net/ethernet/marvell/octeontx2/af/rpm.c | 42 +++++++++++++ .../net/ethernet/marvell/octeontx2/af/rpm.h | 4 ++ .../net/ethernet/marvell/octeontx2/af/rvu.c | 1 + .../net/ethernet/marvell/octeontx2/af/rvu.h | 1 + .../ethernet/marvell/octeontx2/af/rvu_cgx.c | 36 +++++++++-- 8 files changed, 145 insertions(+), 6 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/cgx.c +61 -0
@@ -214,6 +214,24 @@ u8 cgx_lmac_get_p2x(int cgx_id, int lmac_id)return (cfg &CMR_P2X_SEL_MASK ) >>CMR_P2X_SEL_SHIFT ; } +static u8 cgx_get_nix_resetbit (struct cgx *cgx) +{ +int first_lmac; +u8 p2x; + +/* non 98XX silicons supports only NIX0 block */ +if (cgx->pdev->subsystem_device !=PCI_SUBSYS_DEVID_98XX ) +return CGX_NIX0_RESET ; + + first_lmac =find_first_bit (&cgx->lmac_bmap, cgx->max_lmac_per_mac); + p2x =cgx_lmac_get_p2x (cgx->cgx_id, first_lmac); + +if (p2x ==CMR_P2X_SEL_NIX1 ) +return CGX_NIX1_RESET ; +else +return CGX_NIX0_RESET ; +} +/* Ensure the required lock for event queue(where asynchronous events are * posted) is acquired before calling this API. Else an asynchronous event(with * latest link status) can reach the destination before this function returns
@@ -1724,6 +1742,8 @@ static int cgx_lmac_init(struct cgx *cgx) lmac->lmac_type = cgx->mac_ops->get_lmac_type (cgx, lmac->lmac_id); } +/* Start X2P reset on given MAC block */ + cgx->mac_ops->mac_x2p_reset (cgx, true);return cgx_lmac_verify_fwi_version (cgx); err_bitmap_free:
@@ -1789,6 +1809,45 @@ static u8 cgx_get_rxid_mapoffset(struct cgx *cgx)return 0x60 ; } +static void cgx_x2p_reset (void *cgxd,bool enable) +{ +struct cgx *cgx = cgxd; +int lmac_id; +u64 cfg; + +if (enable) { +for_each_set_bit (lmac_id, &cgx->lmac_bmap, cgx->max_lmac_per_mac) + cgx->mac_ops->mac_enadis_rx (cgx, lmac_id, false); + +usleep_range (1000 ,2000 ); + + cfg =cgx_read (cgx,0 ,CGXX_CMR_GLOBAL_CONFIG ); + cfg |=cgx_get_nix_resetbit (cgx) |CGX_NSCI_DROP ; +cgx_write (cgx,0 ,CGXX_CMR_GLOBAL_CONFIG , cfg); + }else { + cfg =cgx_read (cgx,0 ,CGXX_CMR_GLOBAL_CONFIG ); + cfg &= ~(cgx_get_nix_resetbit (cgx) |CGX_NSCI_DROP ); +cgx_write (cgx,0 ,CGXX_CMR_GLOBAL_CONFIG , cfg); + } +} + +static int cgx_enadis_rx (void *cgxd,int lmac_id,bool enable) +{ +struct cgx *cgx = cgxd; +u64 cfg; + +if (!is_lmac_valid (cgx, lmac_id)) +return -ENODEV ; + + cfg =cgx_read (cgx, lmac_id,CGXX_CMRX_CFG ); +if (enable) + cfg |=DATA_PKT_RX_EN ; +else + cfg &= ~DATA_PKT_RX_EN ; +cgx_write (cgx, lmac_id,CGXX_CMRX_CFG , cfg); +return 0 ; +} +static struct mac_ops cgx_mac_ops = { .name ="cgx" , .csr_offset =0 ,
@@ -1820,6 +1879,8 @@ static struct mac_ops cgx_mac_ops = { .mac_get_pfc_frm_cfg = cgx_lmac_get_pfc_frm_cfg, .mac_reset = cgx_lmac_reset, .mac_stats_reset = cgx_stats_reset, + .mac_x2p_reset = cgx_x2p_reset, + .mac_enadis_rx = cgx_enadis_rx, };static int cgx_probe (struct pci_dev *pdev,const struct pci_device_id *id)
drivers/net/ethernet/marvell/octeontx2/af/cgx.h +4 -0
@@ -32,6 +32,10 @@#define CGX_LMAC_TYPE_MASK 0xF#define CGXX_CMRX_INT 0x040#define FW_CGX_INT BIT_ULL(1) +#define CGXX_CMR_GLOBAL_CONFIG 0x08 +#define CGX_NIX0_RESET BIT_ULL(2) +#define CGX_NIX1_RESET BIT_ULL(3) +#define CGX_NSCI_DROP BIT_ULL(9)#define CGXX_CMRX_INT_ENA_W1S 0x058#define CGXX_CMRX_RX_ID_MAP 0x060#define CGXX_CMRX_RX_STAT0 0x070
drivers/net/ethernet/marvell/octeontx2/af/lmac_common.h +2 -0
@@ -132,6 +132,8 @@ struct mac_ops {int (*get_fec_stats)(void *cgxd,int lmac_id,struct cgx_fec_stats_rsp *rsp);int (*mac_stats_reset)(void *cgxd,int lmac_id); +void (*mac_x2p_reset)(void *cgxd,bool enable); +int (*mac_enadis_rx)(void *cgxd,int lmac_id,bool enable); };struct cgx {
drivers/net/ethernet/marvell/octeontx2/af/rpm.c +42 -0
57 lines not on this page · raw message
drivers/net/ethernet/marvell/octeontx2/af/rpm.h +4 -0
@@ -17,6 +17,8 @@/* Registers */ #define RPMX_CMRX_CFG 0x00 +#define RPMX_CMR_GLOBAL_CFG 0x08 +#define RPM_NIX0_RESET BIT_ULL(3)#define RPMX_RX_TS_PREPEND BIT_ULL(22)#define RPMX_TX_PTP_1S_SUPPORT BIT_ULL(17)#define RPMX_CMRX_RX_ID_MAP 0x80
@@ -139,4 +141,6 @@ bool is_dev_rpm2(void *rpmd);int rpm_get_fec_stats (void *cgxd,int lmac_id,struct cgx_fec_stats_rsp *rsp);int rpm_lmac_reset (void *rpmd,int lmac_id,u8 pf_req_flr);int rpm_stats_reset (void *rpmd,int lmac_id); +void rpm_x2p_reset (void *rpmd,bool enable); +int rpm_enadis_rx (void *rpmd,int lmac_id,bool enable);#endif /* RPM_H */
drivers/net/ethernet/marvell/octeontx2/af/rvu.c +1 -0
@@ -1162,6 +1162,7 @@ static int rvu_setup_hw_resources(struct rvu *rvu) }rvu_program_channels (rvu); +cgx_start_linkup (rvu); err =rvu_mcs_init (rvu);if (err) {
drivers/net/ethernet/marvell/octeontx2/af/rvu.h +1 -0
@@ -997,6 +997,7 @@ int rvu_cgx_prio_flow_ctrl_cfg(struct rvu *rvu, u16 pcifunc, u8 tx_pause, u8 rx_int rvu_cgx_cfg_pause_frm (struct rvu *rvu,u16 pcifunc,u8 tx_pause,u8 rx_pause);void rvu_mac_reset (struct rvu *rvu,u16 pcifunc);u32 rvu_cgx_get_lmac_fifolen (struct rvu *rvu,int cgx,int lmac); +void cgx_start_linkup (struct rvu *rvu);int npc_get_nixlf_mcam_index (struct npc_mcam *mcam,u16 pcifunc,int nixlf,int type); bool is_mcam_entry_enabled(struct rvu *rvu, struct npc_mcam *mcam, int blkaddr,
drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c +30 -6
@@ -349,6 +349,7 @@ static void rvu_cgx_wq_destroy(struct rvu *rvu)int rvu_cgx_init (struct rvu *rvu) { +struct mac_ops *mac_ops;int cgx, err;void *cgxd;
@@ -375,6 +376,15 @@ int rvu_cgx_init(struct rvu *rvu)if (err)return err; +/* Clear X2P reset on all MAC blocks */ +for (cgx =0 ; cgx < rvu->cgx_cnt_max; cgx++) { + cgxd =rvu_cgx_pdata (cgx, rvu); +if (!cgxd) +continue ; + mac_ops =get_mac_ops (cgxd); + mac_ops->mac_x2p_reset (cgxd, false); + } +/* Register for CGX events */ err =cgx_lmac_event_handler_init (rvu);if (err)
@@ -382,10 +392,26 @@ int rvu_cgx_init(struct rvu *rvu)mutex_init (&rvu->cgx_cfg_lock); -/* Ensure event handler registration is completed, before -* we turn on the links -*/ -mb (); +return 0 ; +} + +void cgx_start_linkup (struct rvu *rvu) +{ +unsigned long lmac_bmap; +struct mac_ops *mac_ops; +int cgx, lmac, err; +void *cgxd; + +/* Enable receive on all LMACS */ +for (cgx =0 ; cgx <= rvu->cgx_cnt_max; cgx++) { + cgxd =rvu_cgx_pdata (cgx, rvu); +if (!cgxd) +continue ; + mac_ops =get_mac_ops (cgxd); + lmac_bmap =cgx_get_lmac_bmap (cgxd); +for_each_set_bit (lmac, &lmac_bmap, rvu->hw->lmac_per_cgx) + mac_ops->mac_enadis_rx (cgxd, lmac, true); + }/* Do link up for all CGX ports */ for (cgx =0 ; cgx <= rvu->cgx_cnt_max; cgx++) {
@@ -398,8 +424,6 @@ int rvu_cgx_init(struct rvu *rvu)"Link up process failed to start on cgx %d\n" , cgx); } - -return 0 ; }int rvu_cgx_exit (struct rvu *rvu)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 575/826 spi: atmel-quadspi: Fix register name in verbose logging function
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Csókás, Bence <[email protected]>
[ Upstream commit 2ac40e6d0ccdd93031f8b1af61b0fe5cdd704923 ]
atmel_qspi_reg_name() is used for pretty-printing register offsets for verbose logging of register accesses. However, due to a typo (likely a copy-paste error), QSPI_RD's offset prints as "MR", the name of the previous register. Fix this typo.
--- drivers/spi/atmel-quadspi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/atmel-quadspi.c +1 -1
@@ -183,7 +183,7 @@ static const char *atmel_qspi_reg_name(u32 offset, char *tmp, size_t sz)case QSPI_MR :return "MR" ;case QSPI_RD : -return "MR" ; +return "RD" ;case QSPI_TD :return "TD" ;case QSPI_SR :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 576/826 net: hsr: fix hsr_init_sk() vs network/transport headers.
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 9cfb5e7f0ded2bfaabc270ceb5f91d13f0e805b9 ]
Following sequence in hsr_init_sk() is invalid :
skb_reset_mac_header(skb);
skb_reset_mac_len(skb);
skb_reset_network_header(skb);
skb_reset_transport_header(skb);It is invalid because skb_reset_mac_len() needs the correct network header, which should be after the mac header.
This patch moves the skb_reset_network_header() and skb_reset_transport_header() before
the call to dev_hard_header().
As a result skb->mac_len is no longer set to a value close to 65535.
--- net/hsr/hsr_device.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/hsr/hsr_device.c +2 -2
@@ -268,6 +268,8 @@ static struct sk_buff *hsr_init_skb(struct hsr_port *master) skb->dev = master->dev; skb->priority =TC_PRIO_CONTROL ; +skb_reset_network_header (skb); +skb_reset_transport_header (skb);if (dev_hard_header (skb, skb->dev,ETH_P_PRP , hsr->sup_multicast_addr, skb->dev->dev_addr, skb->len) <=0 )
@@ -275,8 +277,6 @@ static struct sk_buff *hsr_init_skb(struct hsr_port *master)skb_reset_mac_header (skb);skb_reset_mac_len (skb); -skb_reset_network_header (skb); -skb_reset_transport_header (skb);return skb; out:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 577/826 bnxt_en: Reserve rings after PCIe AER recovery if NIC interface is down
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Saravanan Vajravel <[email protected]>
[ Upstream commit 5311598f7f3293683cdc761df71ae3469327332c ]
After successful PCIe AER recovery, FW will reset all resource reservations. If it is IF_UP, the driver will call bnxt_open() and all resources will be reserved again. It it is IF_DOWN, we should call bnxt_reserve_rings() so that we can reserve resources including RoCE resources to allow RoCE to resume after AER. Without this patch, RoCE fails to resume in this IF_DOWN scenario.
Later, if it becomes IF_UP, bnxt_open() will see that resources have been reserved and will not reserve again.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +6 -2
@@ -16232,8 +16232,12 @@ static void bnxt_io_resume(struct pci_dev *pdev)rtnl_lock (); err =bnxt_hwrm_func_qcaps (bp); -if (!err &&netif_running (netdev)) - err =bnxt_open (netdev); +if (!err) { +if (netif_running (netdev)) + err =bnxt_open (netdev); +else + err =bnxt_reserve_rings (bp, true); + }if (!err)netif_device_attach (netdev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 578/826 bnxt_en: Set backplane link modes correctly for ethtool
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shravya KN <[email protected]>
[ Upstream commit 5007991670941c132fb3bc0484c009cf4bcea30f ]
Use the return value from bnxt_get_media() to determine the port and link modes. bnxt_get_media() returns the proper BNXT_MEDIA_KR when the PHY is backplane. This will correct the ethtool settings for backplane devices.
--- drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +7 -2
@@ -2838,19 +2838,24 @@ static int bnxt_get_link_ksettings(struct net_device *dev, } base->port =PORT_NONE ; -if (link_info->media_type ==PORT_PHY_QCFG_RESP_MEDIA_TYPE_TP ) { +if (media ==BNXT_MEDIA_TP ) { base->port =PORT_TP ;linkmode_set_bit (ETHTOOL_LINK_MODE_TP_BIT , lk_ksettings->link_modes.supported);linkmode_set_bit (ETHTOOL_LINK_MODE_TP_BIT , lk_ksettings->link_modes.advertising); + }else if (media ==BNXT_MEDIA_KR ) { +linkmode_set_bit (ETHTOOL_LINK_MODE_Backplane_BIT, + lk_ksettings->link_modes.supported); +linkmode_set_bit (ETHTOOL_LINK_MODE_Backplane_BIT, + lk_ksettings->link_modes.advertising); }else {linkmode_set_bit (ETHTOOL_LINK_MODE_FIBRE_BIT , lk_ksettings->link_modes.supported);linkmode_set_bit (ETHTOOL_LINK_MODE_FIBRE_BIT , lk_ksettings->link_modes.advertising); -if (link_info->media_type ==PORT_PHY_QCFG_RESP_MEDIA_TYPE_DAC ) +if (media ==BNXT_MEDIA_CR ) base->port =PORT_DA ;else base->port =PORT_FIBRE ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 579/826 bnxt_en: Fix queue start to update vnic RSS table
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Somnath Kotur <[email protected]>
[ Upstream commit 5ac066b7b062ee753a14557ea11bdc62364c8090 ]
HWRM_RING_FREE followed by a HWRM_RING_ALLOC is not guaranteed to have the same FW ring ID as before. So we must reinitialize the RSS table with the correct ring IDs. Otherwise, traffic may not resume properly if the restarted ring ID is stale. Since this feature is only supported on P5_PLUS chips, we call bnxt_vnic_set_rss_p5() to update the HW RSS table.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +7 -0
@@ -15231,6 +15231,13 @@ static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx)for (i =0 ; i <=BNXT_VNIC_NTUPLE ; i++) { vnic = &bp->vnic_info[i]; + + rc =bnxt_hwrm_vnic_set_rss_p5 (bp, vnic, true); +if (rc) { +netdev_err (bp->dev,"hwrm vnic %d set rss failure rc: %d\n" , + vnic->vnic_id, rc); +return rc; + } vnic->mru = bp->dev->mtu +ETH_HLEN +VLAN_HLEN ;bnxt_hwrm_vnic_update (bp, vnic,VNIC_UPDATE_REQ_ENABLES_MRU_VALID );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 580/826 bnxt_en: Fix receive ring space parameters when XDP is active
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shravya KN <[email protected]>
[ Upstream commit 3051a77a09dfe3022aa012071346937fdf059033 ]
The MTU setting at the time an XDP multi-buffer is attached determines whether the aggregation ring will be used and the rx_skb_func handler. This is done in bnxt_set_rx_skb_mode().
If the MTU is later changed, the aggregation ring setting may need to be changed and it may become out-of-sync with the settings initially done in bnxt_set_rx_skb_mode(). This may result in random memory corruption and crashes as the HW may DMA data larger than the allocated buffer size, such as:
BUG: kernel NULL pointer dereference, address: 00000000000003c0 PGD 0 P4D 0 Oops: 0000 [#1] PREEMPT SMP NOPTI CPU: 17 PID: 0 Comm: swapper/17 Kdump: loaded Tainted: G S OE 6.1.0-226bf9805506 #1 Hardware name: Wiwynn Delta Lake PVT BZA.02601.0150/Delta Lake-Class1, BIOS F0E_3A12 08/26/2021 RIP: 0010:bnxt_rx_pkt+0xe97/0x1ae0 [bnxt_en] Code: 8b 95 70 ff ff ff 4c 8b 9d 48 ff ff ff 66 41 89 87 b4 00 00 00 e9 0b f7 ff ff 0f b7 43 0a 49 8b 95 a8 04 00 00 25 ff 0f 00 00 <0f> b7 14 42 48 c1 e2 06 49 03 95 a0 04 00 00 0f b6 42 33f RSP: 0018:ffffa19f40cc0d18 EFLAGS: 00010202 RAX: 00000000000001e0 RBX: ffff8e2c805c6100 RCX: 00000000000007ff RDX: 0000000000000000 RSI: ffff8e2c271ab990 RDI: ffff8e2c84f12380 RBP: ffffa19f40cc0e48 R08: 000000000001000d R09: 974ea2fcddfa4cbf R10: 0000000000000000 R11: ffffa19f40cc0ff8 R12: ffff8e2c94b58980 R13: ffff8e2c952d6600 R14: 0000000000000016 R15: ffff8e2c271ab990 FS: 0000000000000000(0000) GS:ffff8e3b3f840000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000000003c0 CR3: 0000000e8580a004 CR4: 00000000007706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <IRQ> __bnxt_poll_work+0x1c2/0x3e0 [bnxt_en]
To address the issue, we now call bnxt_set_rx_skb_mode() within bnxt_change_mtu() to properly set the AGG rings configuration and update rx_skb_func based on the new MTU value. Additionally, BNXT_FLAG_NO_AGG_RINGS is cleared at the beginning of bnxt_set_rx_skb_mode() to make sure it gets set or cleared based on the current MTU.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +9 -1
@@ -4558,7 +4558,7 @@ int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)struct net_device *dev = bp->dev;if (page_mode) { - bp->flags &= ~BNXT_FLAG_AGG_RINGS ; + bp->flags &= ~(BNXT_FLAG_AGG_RINGS |BNXT_FLAG_NO_AGG_RINGS ); bp->flags |=BNXT_FLAG_RX_PAGE_MODE ;if (bp->xdp_prog->aux->xdp_has_frags)
@@ -14494,6 +14494,14 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu)bnxt_close_nic (bp, true, false);WRITE_ONCE (dev->mtu, new_mtu); + +/* MTU change may change the AGG ring settings if an XDP multi-buffer +* program is attached. We need to set the AGG rings settings and +* rx_skb_func accordingly. +*/ +if (READ_ONCE (bp->xdp_prog)) +bnxt_set_rx_skb_mode (bp, true); +bnxt_set_ring_params (bp);if (netif_running (dev))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 581/826 bnxt_en: Refactor bnxt_ptp_init()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Chan <[email protected]>
[ Upstream commit 1e9614cd956268e10a669c0593e7e54d03d0c087 ]
Instead of passing the 2nd parameter phc_cfg to bnxt_ptp_init(). Store it in bp->ptp_cfg so that the caller doesn't need to know what the value should be.
In the next patch, we'll need to call bnxt_ptp_init() in bnxt_resume() and this will make it easier.
Stable-dep-of: 3661c05c54e8 ("bnxt_en: Unregister PTP during PCI shutdown and suspend")
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 6 +++--- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 4 ++-- drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +3 -3
@@ -9053,7 +9053,6 @@ static int __bnxt_hwrm_ptp_qcfg(struct bnxt *bp)struct hwrm_port_mac_ptp_qcfg_output *resp;struct hwrm_port_mac_ptp_qcfg_input *req;struct bnxt_ptp_cfg *ptp = bp->ptp_cfg; -bool phc_cfg;u8 flags;int rc;
@@ -9100,8 +9099,9 @@ static int __bnxt_hwrm_ptp_qcfg(struct bnxt *bp) rc = -ENODEV ; goto exit; } - phc_cfg = (flags &PORT_MAC_PTP_QCFG_RESP_FLAGS_RTC_CONFIGURED ) !=0 ; - rc =bnxt_ptp_init (bp, phc_cfg); + ptp->rtc_configured = + (flags &PORT_MAC_PTP_QCFG_RESP_FLAGS_RTC_CONFIGURED ) !=0 ; + rc =bnxt_ptp_init (bp);if (rc)netdev_warn (bp->dev,"PTP initialization failed.\n" ); exit:
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c +2 -2
@@ -1024,7 +1024,7 @@ static void bnxt_ptp_free(struct bnxt *bp) } } -int bnxt_ptp_init (struct bnxt *bp,bool phc_cfg) +int bnxt_ptp_init (struct bnxt *bp) {struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;int rc;
@@ -1047,7 +1047,7 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)if (BNXT_PTP_USE_RTC (bp)) {bnxt_ptp_timecounter_init (bp, false); - rc =bnxt_ptp_init_rtc (bp, phc_cfg); + rc =bnxt_ptp_init_rtc (bp, ptp->rtc_configured);if (rc) goto out; }else {
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h +2 -1
@@ -133,6 +133,7 @@ struct bnxt_ptp_cfg { BNXT_PTP_MSG_PDELAY_REQ | \ BNXT_PTP_MSG_PDELAY_RESP) u8 tx_tstamp_en:1; + u8 rtc_configured:1;int rx_filter;u32 tstamp_filters;
@@ -180,6 +181,6 @@ void bnxt_tx_ts_cmp(struct bnxt *bp, struct bnxt_napi *bnapi, struct tx_ts_cmp *tscmp);void bnxt_ptp_rtc_timecounter_init (struct bnxt_ptp_cfg *ptp,u64 ns);int bnxt_ptp_init_rtc (struct bnxt *bp,bool phc_cfg); -int bnxt_ptp_init (struct bnxt *bp,bool phc_cfg); +int bnxt_ptp_init (struct bnxt *bp);void bnxt_ptp_clear (struct bnxt *bp);#endif
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 582/826 bnxt_en: Unregister PTP during PCI shutdown and suspend
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Chan <[email protected]>
[ Upstream commit 3661c05c54e8db7064aa96a0774654740974dffc ]
If we go through the PCI shutdown or suspend path, we shutdown the NIC but PTP remains registered. If the kernel continues to run for a little bit, the periodic PTP .do_aux_work() function may be called and it will read the PHC from the BAR register. Since the device has already been disabled, it will cause a PCIe completion timeout. Fix it by calling bnxt_ptp_clear() in the PCI shutdown/suspend handlers. bnxt_ptp_clear() will unregister from PTP and .do_aux_work() will be canceled.
In bnxt_resume(), we need to re-initialize PTP.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +6 -0
@@ -15999,6 +15999,7 @@ static void bnxt_shutdown(struct pci_dev *pdev)if (netif_running (dev))dev_close (dev); +bnxt_ptp_clear (bp);bnxt_clear_int_mode (bp);pci_disable_device (pdev);
@@ -16026,6 +16027,7 @@ static int bnxt_suspend(struct device *device) rc =bnxt_close (dev); }bnxt_hwrm_func_drv_unrgtr (bp); +bnxt_ptp_clear (bp);pci_disable_device (bp->pdev);bnxt_free_ctx_mem (bp);rtnl_unlock ();
@@ -16069,6 +16071,10 @@ static int bnxt_resume(struct device *device)if (bp->fw_crash_mem)bnxt_hwrm_crash_dump_mem_cfg (bp); +if (bnxt_ptp_init (bp)) { +kfree (bp->ptp_cfg); + bp->ptp_cfg =NULL ; + }bnxt_get_wol_settings (bp);if (netif_running (dev)) { rc =bnxt_open (dev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 583/826 Bluetooth: MGMT: Fix slab-use-after-free Read in set_powered_sync
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 0b882940665ca2849386ee459d4331aa2f8c4e7d ]
This fixes the following crash:
==================================================================
BUG: KASAN: slab-use-after-free in set_powered_sync+0x3a/0xc0 net/bluetooth/mgmt.c:1353 Read of size 8 at addr ffff888029b4dd18 by task kworker/u9:0/54 CPU: 1 UID: 0 PID: 54 Comm: kworker/u9:0 Not tainted 6.11.0-rc6-syzkaller-01155-gf723224742fc #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 08/06/2024 Workqueue: hci0 hci_cmd_sync_work Call Trace: <TASK> __dump_stack lib/dump_stack.c:93 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:119 print_address_description mm/kasan/report.c:377 [inline] print_report+0x169/0x550 mm/kasan/report.c:488 q kasan_report+0x143/0x180 mm/kasan/report.c:601 set_powered_sync+0x3a/0xc0 net/bluetooth/mgmt.c:1353 hci_cmd_sync_work+0x22b/0x400 net/bluetooth/hci_sync.c:328 process_one_work kernel/workqueue.c:3231 [inline] process_scheduled_works+0xa2c/0x1830 kernel/workqueue.c:3312 worker_thread+0x86d/0xd10 kernel/workqueue.c:3389 kthread+0x2f0/0x390 kernel/kthread.c:389 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 </TASK> Allocated by task 5247: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3f/0x80 mm/kasan/common.c:68 poison_kmalloc_redzone mm/kasan/common.c:370 [inline] __kasan_kmalloc+0x98/0xb0 mm/kasan/common.c:387 kasan_kmalloc include/linux/kasan.h:211 [inline] __kmalloc_cache_noprof+0x19c/0x2c0 mm/slub.c:4193 kmalloc_noprof include/linux/slab.h:681 [inline] kzalloc_noprof include/linux/slab.h:807 [inline] mgmt_pending_new+0x65/0x250 net/bluetooth/mgmt_util.c:269 mgmt_pending_add+0x36/0x120 net/bluetooth/mgmt_util.c:296 set_powered+0x3cd/0x5e0 net/bluetooth/mgmt.c:1394 hci_mgmt_cmd+0xc47/0x11d0 net/bluetooth/hci_sock.c:1712 hci_sock_sendmsg+0x7b8/0x11c0 net/bluetooth/hci_sock.c:1832 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x221/0x270 net/socket.c:745 sock_write_iter+0x2dd/0x400 net/socket.c:1160 new_sync_write fs/read_write.c:497 [inline] vfs_write+0xa72/0xc90 fs/read_write.c:590 ksys_write+0x1a0/0x2c0 fs/read_write.c:643 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 5246: kasan_save_stack mm/kasan/common.c:47 [inline] kasan_save_track+0x3f/0x80 mm/kasan/common.c:68 kasan_save_free_info+0x40/0x50 mm/kasan/generic.c:579 poison_slab_object+0xe0/0x150 mm/kasan/common.c:240 __kasan_slab_free+0x37/0x60 mm/kasan/common.c:256 kasan_slab_free include/linux/kasan.h:184 [inline] slab_free_hook mm/slub.c:2256 [inline] slab_free mm/slub.c:4477 [inline] kfree+0x149/0x360 mm/slub.c:4598 settings_rsp+0x2bc/0x390 net/bluetooth/mgmt.c:1443 mgmt_pending_foreach+0xd1/0x130 net/bluetooth/mgmt_util.c:259 __mgmt_power_off+0x112/0x420 net/bluetooth/mgmt.c:9455 hci_dev_close_sync+0x665/0x11a0 net/bluetooth/hci_sync.c:5191 hci_dev_do_close net/bluetooth/hci_core.c:483 [inline] hci_dev_close+0x112/0x210 net/bluetooth/hci_core.c:508 sock_do_ioctl+0x158/0x460 net/socket.c:1222 sock_ioctl+0x629/0x8e0 net/socket.c:1341 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl+0xfc/0x170 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83gv entry_SYSCALL_64_after_hwframe+0x77/0x7f
--- net/bluetooth/mgmt.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/bluetooth/mgmt.c +9 -2
@@ -1317,7 +1317,8 @@ static void mgmt_set_powered_complete(struct hci_dev *hdev, void *data, int err)struct mgmt_mode *cp;/* Make sure cmd still outstanding. */ -if (cmd !=pending_find (MGMT_OP_SET_POWERED , hdev)) +if (err == -ECANCELED || + cmd !=pending_find (MGMT_OP_SET_POWERED , hdev))return ; cp = cmd->param;
@@ -1350,7 +1351,13 @@ static void mgmt_set_powered_complete(struct hci_dev *hdev, void *data, int err)static int set_powered_sync (struct hci_dev *hdev,void *data) {struct mgmt_pending_cmd *cmd = data; -struct mgmt_mode *cp = cmd->param; +struct mgmt_mode *cp; + +/* Make sure cmd still outstanding. */ +if (cmd !=pending_find (MGMT_OP_SET_POWERED , hdev)) +return -ECANCELED ; + + cp = cmd->param;BT_DBG ("%s" , hdev->name);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 584/826 Bluetooth: MGMT: Fix possible deadlocks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit a66dfaf18fd61bb75ef8cee83db46b2aadf153d0 ]
This fixes possible deadlocks like the following caused by hci_cmd_sync_dequeue causing the destroy function to run:
INFO: task kworker/u19:0:143 blocked for more than 120 seconds.
Tainted: G W O 6.8.0-2024-03-19-intel-next-iLS-24ww14 #1
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
task:kworker/u19:0 state:D stack:0 pid:143 tgid:143 ppid:2 flags:0x00004000
Workqueue: hci0 hci_cmd_sync_work [bluetooth]
Call Trace:
<TASK>
__schedule+0x374/0xaf0
schedule+0x3c/0xf0
schedule_preempt_disabled+0x1c/0x30
__mutex_lock.constprop.0+0x3ef/0x7a0
__mutex_lock_slowpath+0x13/0x20
mutex_lock+0x3c/0x50
mgmt_set_connectable_complete+0xa4/0x150 [bluetooth]
? kfree+0x211/0x2a0
hci_cmd_sync_dequeue+0xae/0x130 [bluetooth]
? __pfx_cmd_complete_rsp+0x10/0x10 [bluetooth]
cmd_complete_rsp+0x26/0x80 [bluetooth]
mgmt_pending_foreach+0x4d/0x70 [bluetooth]
__mgmt_power_off+0x8d/0x180 [bluetooth]
? _raw_spin_unlock_irq+0x23/0x40
hci_dev_close_sync+0x445/0x5b0 [bluetooth]
hci_set_powered_sync+0x149/0x250 [bluetooth]
set_powered_sync+0x24/0x60 [bluetooth]
hci_cmd_sync_work+0x90/0x150 [bluetooth]
process_one_work+0x13e/0x300
worker_thread+0x2f7/0x420
? __pfx_worker_thread+0x10/0x10
kthread+0x107/0x140
? __pfx_kthread+0x10/0x10
ret_from_fork+0x3d/0x60
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1b/0x30
</TASK>--- net/bluetooth/mgmt.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
net/bluetooth/mgmt.c +18 -9
@@ -1517,7 +1517,8 @@ static void mgmt_set_discoverable_complete(struct hci_dev *hdev, void *data,bt_dev_dbg (hdev,"err %d" , err);/* Make sure cmd still outstanding. */ -if (cmd !=pending_find (MGMT_OP_SET_DISCOVERABLE , hdev)) +if (err == -ECANCELED || + cmd !=pending_find (MGMT_OP_SET_DISCOVERABLE , hdev))return ;hci_dev_lock (hdev);
@@ -1691,7 +1692,8 @@ static void mgmt_set_connectable_complete(struct hci_dev *hdev, void *data,bt_dev_dbg (hdev,"err %d" , err);/* Make sure cmd still outstanding. */ -if (cmd !=pending_find (MGMT_OP_SET_CONNECTABLE , hdev)) +if (err == -ECANCELED || + cmd !=pending_find (MGMT_OP_SET_CONNECTABLE , hdev))return ;hci_dev_lock (hdev);
@@ -1923,7 +1925,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err)bool changed;/* Make sure cmd still outstanding. */ -if (cmd !=pending_find (MGMT_OP_SET_SSP , hdev)) +if (err == -ECANCELED || cmd !=pending_find (MGMT_OP_SET_SSP , hdev))return ;if (err) {
@@ -3789,7 +3791,8 @@ static void set_name_complete(struct hci_dev *hdev, void *data, int err)bt_dev_dbg (hdev,"err %d" , err); -if (cmd !=pending_find (MGMT_OP_SET_LOCAL_NAME , hdev)) +if (err == -ECANCELED || + cmd !=pending_find (MGMT_OP_SET_LOCAL_NAME , hdev))return ;if (status) {
@@ -3964,7 +3967,8 @@ static void set_default_phy_complete(struct hci_dev *hdev, void *data, int err)struct sk_buff *skb = cmd->skb;u8 status =mgmt_status (err); -if (cmd !=pending_find (MGMT_OP_SET_PHY_CONFIGURATION , hdev)) +if (err == -ECANCELED || + cmd !=pending_find (MGMT_OP_SET_PHY_CONFIGURATION , hdev))return ;if (!status) {
@@ -5855,13 +5859,16 @@ static void start_discovery_complete(struct hci_dev *hdev, void *data, int err) {struct mgmt_pending_cmd *cmd = data; +bt_dev_dbg (hdev,"err %d" , err); + +if (err == -ECANCELED ) +return ; +if (cmd !=pending_find (MGMT_OP_START_DISCOVERY , hdev) && cmd !=pending_find (MGMT_OP_START_LIMITED_DISCOVERY , hdev) && cmd !=pending_find (MGMT_OP_START_SERVICE_DISCOVERY , hdev))return ; -bt_dev_dbg (hdev,"err %d" , err); -mgmt_cmd_complete (cmd->sk, cmd->index, cmd->opcode,mgmt_status (err), cmd->param,1 );mgmt_pending_remove (cmd);
@@ -6094,7 +6101,8 @@ static void stop_discovery_complete(struct hci_dev *hdev, void *data, int err) {struct mgmt_pending_cmd *cmd = data; -if (cmd !=pending_find (MGMT_OP_STOP_DISCOVERY , hdev)) +if (err == -ECANCELED || + cmd !=pending_find (MGMT_OP_STOP_DISCOVERY , hdev))return ;bt_dev_dbg (hdev,"err %d" , err);
@@ -8085,7 +8093,8 @@ static void read_local_oob_ext_data_complete(struct hci_dev *hdev, void *data,u8 status =mgmt_status (err);u16 eir_len; -if (cmd !=pending_find (MGMT_OP_READ_LOCAL_OOB_EXT_DATA , hdev)) +if (err == -ECANCELED || + cmd !=pending_find (MGMT_OP_READ_LOCAL_OOB_EXT_DATA , hdev))return ;if (!status) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 585/826 llc: Improve setsockopt() handling of malformed user input
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Luczaj <[email protected]>
[ Upstream commit 1465036b10be4b8b00eb31c879e86de633ad74c1 ]
copy_from_sockptr() is used incorrectly: return value is the number of bytes that could not be copied. Since it's deprecated, switch to copy_safe_from_sockptr().
Note: Keeping the optlen != sizeof(int) check as copy_safe_from_sockptr() by itself would also accept optlen > sizeof(int). Which would allow a more lenient handling of inputs.
--- net/llc/af_llc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/llc/af_llc.c +1 -1
@@ -1098,7 +1098,7 @@ static int llc_ui_setsockopt(struct socket *sock, int level, int optname,lock_sock (sk);if (unlikely (level !=SOL_LLC || optlen !=sizeof (int ))) goto out; - rc =copy_from_sockptr (&opt, optval,sizeof (opt)); + rc =copy_safe_from_sockptr (&opt,sizeof (opt), optval, optlen);if (rc) goto out; rc = -EINVAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 586/826 rxrpc: Improve setsockopt() handling of malformed user input
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Luczaj <[email protected]>
[ Upstream commit 02020056647017e70509bb58c3096448117099e1 ]
copy_from_sockptr() does not return negative value on error; instead, it reports the number of bytes that failed to copy. Since it's deprecated, switch to copy_safe_from_sockptr().
Note: Keeping the optlen != sizeof(unsigned int) check as copy_safe_from_sockptr() by itself would also accept
optlen > sizeof(unsigned int). Which would allow a more lenient handling of inputs.
--- net/rxrpc/af_rxrpc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/rxrpc/af_rxrpc.c +4 -3
@@ -707,9 +707,10 @@ static int rxrpc_setsockopt(struct socket *sock, int level, int optname, ret = -EISCONN ;if (rx->sk.sk_state !=RXRPC_UNBOUND ) goto error; - ret =copy_from_sockptr (&min_sec_level, optval, -sizeof (unsigned int )); -if (ret <0 ) + ret =copy_safe_from_sockptr (&min_sec_level, +sizeof (min_sec_level), + optval, optlen); +if (ret) goto error; ret = -EINVAL ;if (min_sec_level >RXRPC_SECURITY_MAX )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 587/826 tcp: Fix use-after-free of nreq in reqsk_timer_handler().
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit c31e72d021db2714df03df6c42855a1db592716c ]
The cited commit replaced inet_csk_reqsk_queue_drop_and_put() with __inet_csk_reqsk_queue_drop() and reqsk_put() in reqsk_timer_handler().
Then, oreq should be passed to reqsk_put() instead of req; otherwise use-after-free of nreq could happen when reqsk is migrated but the retry attempt failed (e.g. due to timeout).
Let's pass oreq to reqsk_put().
--- net/ipv4/inet_connection_sock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/inet_connection_sock.c +1 -1
@@ -1189,7 +1189,7 @@ static void reqsk_timer_handler(struct timer_list *t) drop:__inet_csk_reqsk_queue_drop (sk_listener, oreq, true); -reqsk_put (req); +reqsk_put (oreq); } static bool reqsk_queue_hash_req(struct request_sock *req,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 588/826 ip6mr: fix tables suspicious RCU usage
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit f1553c9894b4dbeb10a2ab15ab1aa113b3b4047c ]
Several places call ip6mr_get_table() with no RCU nor RTNL lock. Add RCU protection inside such helper and provide a lockless variant for the few callers that already acquired the relevant lock.
Note that some users additionally reference the table outside the RCU lock. That is actually safe as the table deletion can happen only after all table accesses are completed.
--- net/ipv6/ip6mr.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-)
net/ipv6/ip6mr.c +27 -11
@@ -125,7 +125,7 @@ static struct mr_table *ip6mr_mr_table_iter(struct net *net,return ret; } -static struct mr_table *ip6mr_get_table (struct net *net,u32 id) +static struct mr_table *__ip6mr_get_table (struct net *net,u32 id) {struct mr_table *mrt;
@@ -136,6 +136,16 @@ static struct mr_table *ip6mr_get_table(struct net *net, u32 id)return NULL ; } +static struct mr_table *ip6mr_get_table (struct net *net,u32 id) +{ +struct mr_table *mrt; + +rcu_read_lock (); + mrt =__ip6mr_get_table (net, id); +rcu_read_unlock (); +return mrt; +} +static int ip6mr_fib_lookup (struct net *net,struct flowi6 *flp6,struct mr_table **mrt) {
@@ -177,7 +187,7 @@ static int ip6mr_rule_action(struct fib_rule *rule, struct flowi *flp, arg->table =fib_rule_get_table (rule, arg); - mrt =ip6mr_get_table (rule->fr_net, arg->table); + mrt =__ip6mr_get_table (rule->fr_net, arg->table);if (!mrt)return -EAGAIN ; res->mrt = mrt;
@@ -304,6 +314,8 @@ static struct mr_table *ip6mr_get_table(struct net *net, u32 id)return net->ipv6.mrt6; } +#define __ip6mr_get_table ip6mr_get_table +static int ip6mr_fib_lookup (struct net *net,struct flowi6 *flp6,struct mr_table **mrt) {
@@ -382,7 +394,7 @@ static struct mr_table *ip6mr_new_table(struct net *net, u32 id) {struct mr_table *mrt; - mrt =ip6mr_get_table (net, id); + mrt =__ip6mr_get_table (net, id);if (mrt)return mrt;
@@ -411,13 +423,15 @@ static void *ip6mr_vif_seq_start(struct seq_file *seq, loff_t *pos)struct net *net =seq_file_net (seq);struct mr_table *mrt; - mrt =ip6mr_get_table (net,RT6_TABLE_DFLT ); -if (!mrt) +rcu_read_lock (); + mrt =__ip6mr_get_table (net,RT6_TABLE_DFLT ); +if (!mrt) { +rcu_read_unlock ();return ERR_PTR (-ENOENT ); + } iter->mrt = mrt; -rcu_read_lock ();return mr_vif_seq_start (seq, pos); }
@@ -2275,11 +2289,13 @@ int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,struct mfc6_cache *cache;struct rt6_info *rt =dst_rt6_info (skb_dst (skb)); - mrt =ip6mr_get_table (net,RT6_TABLE_DFLT ); -if (!mrt) +rcu_read_lock (); + mrt =__ip6mr_get_table (net,RT6_TABLE_DFLT ); +if (!mrt) { +rcu_read_unlock ();return -ENOENT ; + } -rcu_read_lock (); cache =ip6mr_cache_find (mrt, &rt->rt6i_src.addr, &rt->rt6i_dst.addr);if (!cache && skb->dev) {int vif =ip6mr_find_vif (mrt, skb->dev);
@@ -2559,7 +2575,7 @@ static int ip6mr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, grp =nla_get_in6_addr (tb[RTA_DST ]); tableid = tb[RTA_TABLE ] ?nla_get_u32 (tb[RTA_TABLE ]) :0 ; - mrt =ip6mr_get_table (net, tableid ?:RT_TABLE_DEFAULT ); + mrt =__ip6mr_get_table (net, tableid ?:RT_TABLE_DEFAULT );if (!mrt) {NL_SET_ERR_MSG_MOD (extack,"MR table does not exist" );return -ENOENT ;
@@ -2606,7 +2622,7 @@ static int ip6mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)if (filter.table_id) {struct mr_table *mrt; - mrt =ip6mr_get_table (sock_net (skb->sk), filter.table_id); + mrt =__ip6mr_get_table (sock_net (skb->sk), filter.table_id);if (!mrt) {if (rtnl_msg_family (cb->nlh) !=RTNL_FAMILY_IP6MR )return skb->len;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 589/826 ipmr: fix tables suspicious RCU usage
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit fc9c273d6daaa9866f349bbe8cae25c67764c456 ]
Similar to the previous patch, plumb the RCU lock inside the ipmr_get_table(), provided a lockless variant and apply the latter in the few spots were the lock is already held.
--- net/ipv4/ipmr.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-)
net/ipv4/ipmr.c +29 -13
@@ -137,7 +137,7 @@ static struct mr_table *ipmr_mr_table_iter(struct net *net,return ret; } -static struct mr_table *ipmr_get_table (struct net *net,u32 id) +static struct mr_table *__ipmr_get_table (struct net *net,u32 id) {struct mr_table *mrt;
@@ -148,6 +148,16 @@ static struct mr_table *ipmr_get_table(struct net *net, u32 id)return NULL ; } +static struct mr_table *ipmr_get_table (struct net *net,u32 id) +{ +struct mr_table *mrt; + +rcu_read_lock (); + mrt =__ipmr_get_table (net, id); +rcu_read_unlock (); +return mrt; +} +static int ipmr_fib_lookup (struct net *net,struct flowi4 *flp4,struct mr_table **mrt) {
@@ -189,7 +199,7 @@ static int ipmr_rule_action(struct fib_rule *rule, struct flowi *flp, arg->table =fib_rule_get_table (rule, arg); - mrt =ipmr_get_table (rule->fr_net, arg->table); + mrt =__ipmr_get_table (rule->fr_net, arg->table);if (!mrt)return -EAGAIN ; res->mrt = mrt;
@@ -315,6 +325,8 @@ static struct mr_table *ipmr_get_table(struct net *net, u32 id)return net->ipv4.mrt; } +#define __ipmr_get_table ipmr_get_table +static int ipmr_fib_lookup (struct net *net,struct flowi4 *flp4,struct mr_table **mrt) {
@@ -403,7 +415,7 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)if (id !=RT_TABLE_DEFAULT && id >=1000000000 )return ERR_PTR (-EINVAL ); - mrt =ipmr_get_table (net, id); + mrt =__ipmr_get_table (net, id);if (mrt)return mrt;
@@ -1374,7 +1386,7 @@ int ip_mroute_setsockopt(struct sock *sk, int optname, sockptr_t optval, goto out_unlock; } - mrt =ipmr_get_table (net,raw_sk (sk)->ipmr_table ? :RT_TABLE_DEFAULT ); + mrt =__ipmr_get_table (net,raw_sk (sk)->ipmr_table ? :RT_TABLE_DEFAULT );if (!mrt) { ret = -ENOENT ; goto out_unlock;
@@ -2262,11 +2274,13 @@ int ipmr_get_route(struct net *net, struct sk_buff *skb,struct mr_table *mrt;int err; - mrt =ipmr_get_table (net,RT_TABLE_DEFAULT ); -if (!mrt) +rcu_read_lock (); + mrt =__ipmr_get_table (net,RT_TABLE_DEFAULT ); +if (!mrt) { +rcu_read_unlock ();return -ENOENT ; + } -rcu_read_lock (); cache =ipmr_cache_find (mrt, saddr, daddr);if (!cache && skb->dev) {int vif =ipmr_find_vif (mrt, skb->dev);
@@ -2550,7 +2564,7 @@ static int ipmr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, grp = tb[RTA_DST ] ?nla_get_in_addr (tb[RTA_DST ]) :0 ; tableid = tb[RTA_TABLE ] ?nla_get_u32 (tb[RTA_TABLE ]) :0 ; - mrt =ipmr_get_table (net, tableid ? tableid :RT_TABLE_DEFAULT ); + mrt =__ipmr_get_table (net, tableid ? tableid :RT_TABLE_DEFAULT );if (!mrt) { err = -ENOENT ; goto errout_free;
@@ -2604,7 +2618,7 @@ static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)if (filter.table_id) {struct mr_table *mrt; - mrt =ipmr_get_table (sock_net (skb->sk), filter.table_id); + mrt =__ipmr_get_table (sock_net (skb->sk), filter.table_id);if (!mrt) {if (rtnl_msg_family (cb->nlh) !=RTNL_FAMILY_IPMR )return skb->len;
@@ -2712,7 +2726,7 @@ static int rtm_to_ipmr_mfcc(struct net *net, struct nlmsghdr *nlh,break ; } } - mrt =ipmr_get_table (net, tblid); + mrt =__ipmr_get_table (net, tblid);if (!mrt) { ret = -ENOENT ; goto out;
@@ -2920,13 +2934,15 @@ static void *ipmr_vif_seq_start(struct seq_file *seq, loff_t *pos)struct net *net =seq_file_net (seq);struct mr_table *mrt; - mrt =ipmr_get_table (net,RT_TABLE_DEFAULT ); -if (!mrt) +rcu_read_lock (); + mrt =__ipmr_get_table (net,RT_TABLE_DEFAULT ); +if (!mrt) { +rcu_read_unlock ();return ERR_PTR (-ENOENT ); + } iter->mrt = mrt; -rcu_read_lock ();return mr_vif_seq_start (seq, pos); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 590/826 iio: light: al3010: Fix an error handling path in al3010_probe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit a4b7064d34186cf4970fe0333c3b27346cf8f819 ]
If i2c_smbus_write_byte_data() fails in al3010_init(), al3010_set_pwr(false) is not called.
In order to avoid such a situation, move the devm_add_action_or_reset() witch calls al3010_set_pwr(false) right after a successful al3010_set_pwr(true).
--- drivers/iio/light/al3010.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/iio/light/al3010.c +5 -6
@@ -87,7 +87,12 @@ static int al3010_init(struct al3010_data *data)int ret; ret =al3010_set_pwr (data->client, true); +if (ret <0 ) +return ret; + ret =devm_add_action_or_reset (&data->client->dev, + al3010_set_pwr_off, + data);if (ret <0 )return ret;
@@ -190,12 +195,6 @@ static int al3010_probe(struct i2c_client *client)return ret; } - ret =devm_add_action_or_reset (&client->dev, - al3010_set_pwr_off, - data); -if (ret <0 ) -return ret; -return devm_iio_device_register (&client->dev, indio_dev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 591/826 usb: using mutex lock and supporting O_NONBLOCK flag in iowarrior_read()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeongjun Park <[email protected]>
[ Upstream commit 44feafbaa66ec86232b123bb8437a6a262442025 ]
iowarrior_read() uses the iowarrior dev structure, but does not use any lock on the structure. This can cause various bugs including data-races, so it is more appropriate to use a mutex lock to safely protect the iowarrior dev structure. When using a mutex lock, you should split the branch to prevent blocking when the O_NONBLOCK flag is set.
In addition, it is unnecessary to check for NULL on the iowarrior dev structure obtained by reading file->private_data. Therefore, it is better to remove the check.
--- drivers/usb/misc/iowarrior.c | 46 ++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 10 deletions(-)
drivers/usb/misc/iowarrior.c +36 -10
@@ -277,28 +277,45 @@ static ssize_t iowarrior_read(struct file *file, char __user *buffer,struct iowarrior *dev;int read_idx;int offset; +int retval; dev = file->private_data; +if (file->f_flags &O_NONBLOCK ) { + retval =mutex_trylock (&dev->mutex); +if (!retval) +return -EAGAIN ; + }else { + retval =mutex_lock_interruptible (&dev->mutex); +if (retval) +return -ERESTARTSYS ; + } +/* verify that the device wasn't unplugged */ -if (!dev || !dev->present) -return -ENODEV ; +if (!dev->present) { + retval = -ENODEV ; + goto exit; + }dev_dbg (&dev->interface->dev,"minor %d, count = %zd\n" , dev->minor, count);/* read count must be packet size (+ time stamp) */ if ((count != dev->report_size) - && (count != (dev->report_size +1 ))) -return -EINVAL ; + && (count != (dev->report_size +1 ))) { + retval = -EINVAL ; + goto exit; + }/* repeat until no buffer overrun in callback handler occur */ do { atomic_set(&dev->overflow_flag, 0); if ((read_idx = read_index(dev)) == -1) { /* queue empty */ - if (file->f_flags & O_NONBLOCK) - return -EAGAIN; + if (file->f_flags & O_NONBLOCK) { + retval = -EAGAIN; + goto exit; + } else { //next line will return when there is either new data, or the device is unplugged int r = wait_event_interruptible(dev->read_wait,
@@ -309,28 +326,37 @@ static ssize_t iowarrior_read(struct file *file, char __user *buffer, -1));if (r) {//we were interrupted by a signal -return -ERESTART ; + retval = -ERESTART ; + goto exit; }if (!dev->present) {//The device was unplugged -return -ENODEV ; + retval = -ENODEV ; + goto exit; }if (read_idx ==-1 ) {// Can this happen ??? -return 0 ; + retval =0 ; + goto exit; } } } offset = read_idx * (dev->report_size +1 );if (copy_to_user (buffer, dev->read_queue + offset, count)) { -return -EFAULT ; + retval = -EFAULT ; + goto exit; } }while (atomic_read (&dev->overflow_flag)); read_idx = ++read_idx ==MAX_INTERRUPT_BUFFER ?0 : read_idx;atomic_set (&dev->read_idx, read_idx); +mutex_unlock (&dev->mutex);return count; + +exit: +mutex_unlock (&dev->mutex); +return retval; }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 592/826 usb: yurex: make waiting on yurex_write interruptible
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
[ Upstream commit e0aa9614ab0fd35b404e4b16ebe879f9fc152591 ]
The IO yurex_write() needs to wait for in order to have a device ready for writing again can take a long time time. Consequently the sleep is done in an interruptible state. Therefore others waiting for yurex_write() itself to finish should use mutex_lock_interruptible.
Rule: add
--- drivers/usb/misc/iowarrior.c | 4 ---- drivers/usb/misc/yurex.c | 5 ++++- 2 files changed, 4 insertions(+), 5 deletions(-)
drivers/usb/misc/iowarrior.c +0 -4
@@ -911,7 +911,6 @@ static int iowarrior_probe(struct usb_interface *interface,static void iowarrior_disconnect (struct usb_interface *interface) {struct iowarrior *dev =usb_get_intfdata (interface); -int minor = dev->minor;usb_deregister_dev (interface, &iowarrior_class);
@@ -935,9 +934,6 @@ static void iowarrior_disconnect(struct usb_interface *interface)mutex_unlock (&dev->mutex);iowarrior_delete (dev); } - -dev_info (&interface->dev,"I/O-Warror #%d now disconnected\n" , - minor -IOWARRIOR_MINOR_BASE ); }/* usb specific object needed to register this driver with the usb subsystem */
drivers/usb/misc/yurex.c +4 -1
@@ -441,7 +441,10 @@ static ssize_t yurex_write(struct file *file, const char __user *user_buffer,if (count ==0 ) goto error; -mutex_lock (&dev->io_mutex); + retval =mutex_lock_interruptible (&dev->io_mutex); +if (retval <0 ) +return -EINTR ; +if (dev->disconnected) {/* already disconnected */ mutex_unlock (&dev->io_mutex); retval = -ENODEV ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 593/826 USB: chaoskey: fail open after removal
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
[ Upstream commit 422dc0a4d12d0b80dd3aab3fe5943f665ba8f041 ]
chaoskey_open() takes the lock only to increase the counter of openings. That means that the mutual exclusion with chaoskey_disconnect() cannot prevent an increase of the counter and chaoskey_open() returning a success.
If that race is hit, chaoskey_disconnect() will happily free all resources associated with the device after it has dropped the lock, as it has read the counter as zero.
To prevent this race chaoskey_open() has to check the presence of the device under the lock. However, the current per device lock cannot be used, because it is a part of the data structure to be freed. Hence an additional global mutex is needed. The issue is as old as the driver.
Rule: add
--- drivers/usb/misc/chaoskey.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-)
drivers/usb/misc/chaoskey.c +24 -11
@@ -27,6 +27,8 @@ static struct usb_class_driver chaoskey_class;static int chaoskey_rng_read (struct hwrng *rng,void *data,size_t max,bool wait); +static DEFINE_MUTEX (chaoskey_list_lock); + #define usb_dbg(usb_if, format, arg...) \ dev_dbg(&(usb_if)->dev, format, ## arg)
@@ -230,6 +232,7 @@ static void chaoskey_disconnect(struct usb_interface *interface)if (dev->hwrng_registered)hwrng_unregister (&dev->hwrng); +mutex_lock (&chaoskey_list_lock);usb_deregister_dev (interface, &chaoskey_class);usb_set_intfdata (interface,NULL );
@@ -244,6 +247,7 @@ static void chaoskey_disconnect(struct usb_interface *interface) }else mutex_unlock (&dev->lock); +mutex_unlock (&chaoskey_list_lock);usb_dbg (interface,"disconnect done" ); }
@@ -251,6 +255,7 @@ static int chaoskey_open(struct inode *inode, struct file *file) {struct chaoskey *dev;struct usb_interface *interface; +int rv =0 ;/* get the interface from minor number and driver information */ interface =usb_find_interface (&chaoskey_driver,iminor (inode));
@@ -266,18 +271,23 @@ static int chaoskey_open(struct inode *inode, struct file *file) } file->private_data = dev; +mutex_lock (&chaoskey_list_lock);mutex_lock (&dev->lock); - ++dev->open; +if (dev->present) + ++dev->open; +else + rv = -ENODEV ;mutex_unlock (&dev->lock); +mutex_unlock (&chaoskey_list_lock); -usb_dbg (interface,"open success" ); -return 0 ; +return rv; }static int chaoskey_release (struct inode *inode,struct file *file) {struct chaoskey *dev = file->private_data;struct usb_interface *interface; +int rv =0 ;if (dev ==NULL )return -ENODEV ;
@@ -286,14 +296,15 @@ static int chaoskey_release(struct inode *inode, struct file *file)usb_dbg (interface,"release" ); +mutex_lock (&chaoskey_list_lock);mutex_lock (&dev->lock);usb_dbg (interface,"open count at release is %d" , dev->open);if (dev->open <=0 ) {usb_dbg (interface,"invalid open count (%d)" , dev->open); -mutex_unlock (&dev->lock); -return -ENODEV ; + rv = -ENODEV ; + goto bail; } --dev->open;
@@ -302,13 +313,15 @@ static int chaoskey_release(struct inode *inode, struct file *file)if (dev->open ==0 ) {mutex_unlock (&dev->lock);chaoskey_free (dev); - }else -mutex_unlock (&dev->lock); - }else -mutex_unlock (&dev->lock); - + goto destruction; + } + } +bail: +mutex_unlock (&dev->lock); +destruction: +mutex_lock (&chaoskey_list_lock);usb_dbg (interface,"release success" ); -return 0 ; +return rv; }static void chaos_read_callback (struct urb *urb)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 594/826 USB: chaoskey: Fix possible deadlock chaoskey_list_lock
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edward Adam Davis <[email protected]>
[ Upstream commit d73dc7b182be4238b75278bfae16afb4c5564a58 ]
[Syzbot reported two possible deadlocks]
The first possible deadlock is:
WARNING: possible recursive locking detected
6.12.0-rc1-syzkaller-00027-g4a9fe2a8ac53 #0 Not tainted
--------------------------------------------
syz-executor363/2651 is trying to acquire lock:ffffffff89b120e8 (chaoskey_list_lock){+.+.}-{3:3}, at: chaoskey_release+0x15d/0x2c0 drivers/usb/misc/chaoskey.c:322
but task is already holding lock:ffffffff89b120e8 (chaoskey_list_lock){+.+.}-{3:3}, at: chaoskey_release+0x7f/0x2c0 drivers/usb/misc/chaoskey.c:299
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
---- lock(chaoskey_list_lock);
lock(chaoskey_list_lock);
*** DEADLOCK ***
The second possible deadlock is:
WARNING: possible circular locking dependency detected 6.12.0-rc1-syzkaller-00027-g4a9fe2a8ac53 #0 Not tainted
------------------------------------------------------
kworker/0:2/804 is trying to acquire lock:ffffffff899dadb0 (minor_rwsem){++++}-{3:3}, at: usb_deregister_dev+0x7c/0x1e0 drivers/usb/core/file.c:186
but task is already holding lock:ffffffff89b120e8 (chaoskey_list_lock){+.+.}-{3:3}, at: chaoskey_disconnect+0xa8/0x2a0 drivers/usb/misc/chaoskey.c:235
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (chaoskey_list_lock){+.+.}-{3:3}:
__mutex_lock_common kernel/locking/mutex.c:608 [inline]
__mutex_lock+0x175/0x9c0 kernel/locking/mutex.c:752
chaoskey_open+0xdd/0x220 drivers/usb/misc/chaoskey.c:274
usb_open+0x186/0x220 drivers/usb/core/file.c:47
chrdev_open+0x237/0x6a0 fs/char_dev.c:414
do_dentry_open+0x6cb/0x1390 fs/open.c:958
vfs_open+0x82/0x3f0 fs/open.c:1088
do_open fs/namei.c:3774 [inline]
path_openat+0x1e6a/0x2d60 fs/namei.c:3933
do_filp_open+0x1dc/0x430 fs/namei.c:3960
do_sys_openat2+0x17a/0x1e0 fs/open.c:1415
do_sys_open fs/open.c:1430 [inline]
__do_sys_openat fs/open.c:1446 [inline]
__se_sys_openat fs/open.c:1441 [inline]
__x64_sys_openat+0x175/0x210 fs/open.c:1441
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7f-> #0 (minor_rwsem){++++}-{3:3}:
check_prev_add kernel/locking/lockdep.c:3161 [inline]
check_prevs_add kernel/locking/lockdep.c:3280 [inline]
validate_chain kernel/locking/lockdep.c:3904 [inline]
__lock_acquire+0x250b/0x3ce0 kernel/locking/lockdep.c:5202
lock_acquire.part.0+0x11b/0x380 kernel/locking/lockdep.c:5825
down_write+0x93/0x200 kernel/locking/rwsem.c:1577
usb_deregister_dev+0x7c/0x1e0 drivers/usb/core/file.c:186
chaoskey_disconnect+0xb7/0x2a0 drivers/usb/misc/chaoskey.c:236
usb_unbind_interface+0x1e8/0x970 drivers/usb/core/driver.c:461
device_remove drivers/base/dd.c:569 [inline]
device_remove+0x122/0x170 drivers/base/dd.c:561
__device_release_driver drivers/base/dd.c:1273 [inline]
device_release_driver_internal+0x44a/0x610 drivers/base/dd.c:1296
bus_remove_device+0x22f/0x420 drivers/base/bus.c:576
device_del+0x396/0x9f0 drivers/base/core.c:3864
usb_disable_device+0x36c/0x7f0 drivers/usb/core/message.c:1418
usb_disconnect+0x2e1/0x920 drivers/usb/core/hub.c:2304
hub_port_connect drivers/usb/core/hub.c:5361 [inline]
hub_port_connect_change drivers/usb/core/hub.c:5661 [inline]
port_event drivers/usb/core/hub.c:5821 [inline]
hub_event+0x1bed/0x4f40 drivers/usb/core/hub.c:5903
process_one_work+0x9c5/0x1ba0 kernel/workqueue.c:3229
process_scheduled_works kernel/workqueue.c:3310 [inline]
worker_thread+0x6c8/0xf00 kernel/workqueue.c:3391
kthread+0x2c1/0x3a0 kernel/kthread.c:389
ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244other info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(chaoskey_list_lock);
lock(minor_rwsem);
lock(chaoskey_list_lock); lock(minor_rwsem);
*** DEADLOCK ***
[Analysis]
The first is AA lock, it because wrong logic, it need a unlock. The second is AB lock, it needs to rearrange the order of lock usage.
--- drivers/usb/misc/chaoskey.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/misc/chaoskey.c +2 -2
@@ -232,10 +232,10 @@ static void chaoskey_disconnect(struct usb_interface *interface)if (dev->hwrng_registered)hwrng_unregister (&dev->hwrng); -mutex_lock (&chaoskey_list_lock);usb_deregister_dev (interface, &chaoskey_class);usb_set_intfdata (interface,NULL ); +mutex_lock (&chaoskey_list_lock);mutex_lock (&dev->lock); dev->present = false;
@@ -319,7 +319,7 @@ static int chaoskey_release(struct inode *inode, struct file *file) bail:mutex_unlock (&dev->lock); destruction: -mutex_lock (&chaoskey_list_lock); +mutex_unlock (&chaoskey_list_lock);usb_dbg (interface,"release success" );return rv; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 595/826 misc: apds990x: Fix missing pm_runtime_disable()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 3c5d8b819d27012264edd17e6ae7fffda382fe44 ]
The pm_runtime_disable() is missing in probe error path, so add it to fix it.
--- drivers/misc/apds990x.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/misc/apds990x.c +7 -5
@@ -1147,7 +1147,7 @@ static int apds990x_probe(struct i2c_client *client) err = chip->pdata->setup_resources ();if (err) { err = -EINVAL ; - goto fail3; + goto fail4; } }
@@ -1155,7 +1155,7 @@ static int apds990x_probe(struct i2c_client *client) apds990x_attribute_group);if (err <0 ) {dev_err (&chip->client->dev,"Sysfs registration failed\n" ); - goto fail4; + goto fail5; } err = request_threaded_irq(client->irq, NULL,
@@ -1166,15 +1166,17 @@ static int apds990x_probe(struct i2c_client *client)if (err) {dev_err (&client->dev,"could not get IRQ %d\n" , client->irq); - goto fail5; + goto fail6; }return err; -fail5: +fail6:sysfs_remove_group (&chip->client->dev.kobj, &apds990x_attribute_group[0 ]); -fail4: +fail5:if (chip->pdata && chip->pdata->release_resources) chip->pdata->release_resources (); +fail4: +pm_runtime_disable (&client->dev); fail3:regulator_bulk_disable (ARRAY_SIZE (chip->regs), chip->regs); fail2:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 596/826 devres: Fix page faults when tracing devres from unloaded modules
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keita Morisaki <[email protected]>
[ Upstream commit 765399553714e934a219d698953d435f4f99caa7 ]
The devres ftrace event logs the name of the devres node, which is often a function name (e.g., "devm_work_drop") stringified by macros like devm_add_action. Currently, ftrace stores this name as a string literal address, which can become invalid when the module containing the string is unloaded. This results in page faults when ftrace tries to access the name.
This behavior is problematic because the devres ftrace event is designed to trace resource management throughout a device driver's lifecycle, including during module unload. The event should be available even after the module is unloaded to properly diagnose resource issues.
Fix the issue by copying the devres node name into the ftrace ring buffer using __assign_str(), instead of storing just the address. This ensures that ftrace can always access the name, even if the module is unloaded.
This change increases the memory usage for each of the ftrace entry by 12-16 bytes assuming the average devres node name is 20 bytes long, depending on the size of const char *.
Note that this change does not affect anything unless all of following conditions are met.
- CONFIG_DEBUG_DEVRES is enabled
- ftrace tracing is enabled
- The devres event is enabled in ftrace tracing
--- drivers/base/trace.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/base/trace.h +3 -3
@@ -24,18 +24,18 @@ DECLARE_EVENT_CLASS(devres, __field(struct device *, dev) __field(const char *, op) __field(void *, node) - __field(const char *, name) + __string(name, name) __field(size_t, size) ),TP_fast_assign ( __assign_str(devname); __entry->op = op; __entry->node = node; - __entry->name = name; +__assign_str (name); __entry->size = size; ),TP_printk ("%s %3s %p %s (%zu bytes)" ,__get_str (devname), - __entry->op, __entry->node, __entry->name, __entry->size) + __entry->op, __entry->node,__get_str (name), __entry->size) ); DEFINE_EVENT(devres, devres_log,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 597/826 usb: gadget: uvc: wake pump everytime we update the free list
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Grzeschik <[email protected]>
[ Upstream commit adc292d54de9db2e6b8ecb7f81f278bbbaf713e9 ]
Since the req_free list will updated if enqueuing one request was not possible it will be added back to the free list. With every available free request in the queue it is a valid case for the pump worker to use it and continue the pending bufferdata into requests for the req_ready list.
--- drivers/usb/gadget/function/uvc_video.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/gadget/function/uvc_video.c +4 -0
@@ -480,6 +480,10 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req)* up later. */ list_add_tail (&to_queue->list, &video->req_free); +/* +* There is a new free request - wake up the pump. +*/ +queue_work (video->async_wq, &video->pump); }spin_unlock_irqrestore (&video->req_lock, flags);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 598/826 interconnect: qcom: icc-rpmh: probe defer incase of missing QoS clock dependency
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raviteja Laggyshetty <[email protected]>
[ Upstream commit 05123e3299dd6aa02508469b303262338c2a661c ]
Return -EPROBE_DEFER from interconnect provider incase probe defer is received from devm_clk_bulk_get_all(). This would help in reattempting the inteconnect driver probe, once the required QoS clocks are available.
--- drivers/interconnect/qcom/icc-rpmh.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/interconnect/qcom/icc-rpmh.c +3 -0
@@ -311,6 +311,9 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev) } qp->num_clks =devm_clk_bulk_get_all (qp->dev, &qp->clks); +if (qp->num_clks == -EPROBE_DEFER ) +return dev_err_probe (dev, qp->num_clks,"Failed to get QoS clocks\n" ); +if (qp->num_clks <0 || (!qp->num_clks && desc->qos_clks_required)) {dev_info (dev,"Skipping QoS, failed to get clk: %d\n" , qp->num_clks); goto skip_qos_config;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 599/826 iio: backend: fix wrong pointer passed to IS_ERR()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Yingliang <[email protected]>
[ Upstream commit fa4076314480bcb2bb32051027735b1cde07eea2 ]
It should be fwnode_back passed to IS_ERR().
--- drivers/iio/industrialio-backend.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/industrialio-backend.c +2 -2
@@ -737,8 +737,8 @@ static struct iio_backend *__devm_iio_backend_fwnode_get(struct device *dev, con } fwnode_back =fwnode_find_reference (fwnode,"io-backends" , index); -if (IS_ERR (fwnode)) -return dev_err_cast_probe (dev, fwnode, +if (IS_ERR (fwnode_back)) +return dev_err_cast_probe (dev, fwnode_back,"Cannot get Firmware reference\n" );guard (mutex)(&iio_back_lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 600/826 iio: adc: ad4000: fix reading unsigned data
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lechner <[email protected]>
[ Upstream commit 62dd96ac9cdf2814f41cfc55ecaf22a28aad6ccb ]
Fix reading unsigned data from the AD4000 ADC via the _raw sysfs attribute by ensuring that *val is set before returning from ad4000_single_conversion(). This was not being set in any code path and was causing the attribute to return a random value.
--- drivers/iio/adc/ad4000.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iio/adc/ad4000.c +2 -0
@@ -344,6 +344,8 @@ static int ad4000_single_conversion(struct iio_dev *indio_dev,if (chan->scan_type.sign =='s' ) *val =sign_extend32 (sample, chan->scan_type.realbits -1 ); +else + *val = sample;return IIO_VAL_INT ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 601/826 iio: adc: ad4000: Check for error code from devm_mutex_init() call
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 8ebfd09255219ae55f8a101f6aeb0f64dd780d88 ]
Even if it's not critical, the avoidance of checking the error code from devm_mutex_init() call today diminishes the point of using devm variant of it. Tomorrow it may even leak something. Add the missed check.
--- drivers/iio/adc/ad4000.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iio/adc/ad4000.c +3 -1
@@ -639,7 +639,9 @@ static int ad4000_probe(struct spi_device *spi) indio_dev->name = chip->dev_name; indio_dev->num_channels =1 ; -devm_mutex_init (dev, &st->lock); + ret =devm_mutex_init (dev, &st->lock); +if (ret) +return ret; st->gain_milli =1000 ;if (chip->has_hardware_gain) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 602/826 iio: adc: pac1921: Check for error code from devm_mutex_init() call
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 869aa5e847696bcda8966be9d03de2560226bcc3 ]
Even if it's not critical, the avoidance of checking the error code from devm_mutex_init() call today diminishes the point of using devm variant of it. Tomorrow it may even leak something. Add the missed check.
--- drivers/iio/adc/pac1921.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iio/adc/pac1921.c +3 -1
@@ -1171,7 +1171,9 @@ static int pac1921_probe(struct i2c_client *client)return dev_err_probe (dev, (int )PTR_ERR (priv->regmap),"Cannot initialize register map\n" ); -devm_mutex_init (dev, &priv->lock); + ret =devm_mutex_init (dev, &priv->lock); +if (ret) +return ret; priv->dv_gain =PAC1921_DEFAULT_DV_GAIN ; priv->di_gain =PAC1921_DEFAULT_DI_GAIN ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 603/826 iio: accel: adxl380: fix raw sample read
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antoniu Miclaus <[email protected]>
[ Upstream commit bfa335f18d91c52fa0f8ba3e4d49afebbd9ee792 ]
The adxl380_read_chn function returns either a negative value in case an error occurs or the actual sample.
Check only for negative values after a channel is read.
--- drivers/iio/accel/adxl380.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/accel/adxl380.c +1 -1
@@ -1181,7 +1181,7 @@ static int adxl380_read_raw(struct iio_dev *indio_dev, ret =adxl380_read_chn (st, chan->address);iio_device_release_direct_mode (indio_dev); -if (ret) +if (ret <0 )return ret; *val = sign_extend32(ret >> chan->scan_type.shift,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 604/826 phy: realtek: usb: fix NULL deref in rtk_usb2phy_probe
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit 04e3e9188291a183b27306ddb833722c0d083d6a ]
In rtk_usb2phy_probe() devm_kzalloc() may return NULL but this returned value is not checked.
--- drivers/phy/realtek/phy-rtk-usb2.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/phy/realtek/phy-rtk-usb2.c +2 -0
@@ -1023,6 +1023,8 @@ static int rtk_usb2phy_probe(struct platform_device *pdev) rtk_phy->dev = &pdev->dev; rtk_phy->phy_cfg =devm_kzalloc (dev,sizeof (*phy_cfg),GFP_KERNEL ); +if (!rtk_phy->phy_cfg) +return -ENOMEM ;memcpy (rtk_phy->phy_cfg, phy_cfg,sizeof (*phy_cfg));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 605/826 phy: realtek: usb: fix NULL deref in rtk_usb3phy_probe
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit bf373d2919d98f3d1fe1b19a0304f72fe74386d9 ]
In rtk_usb3phy_probe() devm_kzalloc() may return NULL but this returned value is not checked.
--- drivers/phy/realtek/phy-rtk-usb3.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/phy/realtek/phy-rtk-usb3.c +2 -0
@@ -577,6 +577,8 @@ static int rtk_usb3phy_probe(struct platform_device *pdev) rtk_phy->dev = &pdev->dev; rtk_phy->phy_cfg =devm_kzalloc (dev,sizeof (*phy_cfg),GFP_KERNEL ); +if (!rtk_phy->phy_cfg) +return -ENOMEM ;memcpy (rtk_phy->phy_cfg, phy_cfg,sizeof (*phy_cfg));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 606/826 counter: stm32-timer-cnt: Add check for clk_enable()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 842c3755a6bfbfcafa4a1438078d2485a9eb1d87 ]
Add check for the return value of clk_enable() in order to catch the potential exception.
--- drivers/counter/stm32-timer-cnt.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/counter/stm32-timer-cnt.c +13 -3
@@ -214,11 +214,17 @@ static int stm32_count_enable_write(struct counter_device *counter, {struct stm32_timer_cnt *const priv =counter_priv (counter);u32 cr1; +int ret;if (enable) {regmap_read (priv->regmap,TIM_CR1 , &cr1); -if (!(cr1 &TIM_CR1_CEN )) -clk_enable (priv->clk); +if (!(cr1 &TIM_CR1_CEN )) { + ret =clk_enable (priv->clk); +if (ret) { +dev_err (counter->parent,"Cannot enable clock %d\n" , ret); +return ret; + } + }regmap_update_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN ,TIM_CR1_CEN );
@@ -816,7 +822,11 @@ static int __maybe_unused stm32_timer_cnt_resume(struct device *dev)return ret;if (priv->enabled) { -clk_enable (priv->clk); + ret =clk_enable (priv->clk); +if (ret) { +dev_err (dev,"Cannot enable clock %d\n" , ret); +return ret; + }/* Restore registers that may have been lost */ regmap_write (priv->regmap,TIM_SMCR , priv->bak.smcr);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 607/826 counter: ti-ecap-capture: Add check for clk_enable()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 1437d9f1c56fce9c24e566508bce1d218dd5497a ]
Add check for the return value of clk_enable() in order to catch the potential exception.
--- drivers/counter/ti-ecap-capture.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/counter/ti-ecap-capture.c +6 -1
@@ -574,8 +574,13 @@ static int ecap_cnt_resume(struct device *dev) {struct counter_device *counter_dev =dev_get_drvdata (dev);struct ecap_cnt_dev *ecap_dev =counter_priv (counter_dev); +int ret; -clk_enable (ecap_dev->clk); + ret =clk_enable (ecap_dev->clk); +if (ret) { +dev_err (dev,"Cannot enable clock %d\n" , ret); +return ret; + }ecap_cnt_capture_set_evmode (counter_dev, ecap_dev->pm_ctx.ev_mode);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 608/826 bus: mhi: host: Switch trace_mhi_gen_tre fields to native endian
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carl Vanderlip <[email protected]>
[ Upstream commit 23388a1b305e8aac714fafd5fdc72a580586bd0c ]
Each of the __field() macros were triggering sparse warnings similar to:
trace.h:87:1: sparse: sparse: cast to restricted __le64 trace.h:87:1: sparse: sparse: restricted __le64 degrades to integer trace.h:87:1: sparse: sparse: restricted __le64 degrades to integer
Change each little endian type to its similarly sized native integer. Convert inputs into native endian.
--- drivers/bus/mhi/host/trace.h | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
drivers/bus/mhi/host/trace.h +13 -12
@@ -9,6 +9,7 @@#if !defined(_TRACE_EVENT_MHI_HOST_H) || defined(TRACE_HEADER_MULTI_READ )#define _TRACE_EVENT_MHI_HOST_H +#include <linux/byteorder/generic.h> #include <linux/tracepoint.h> #include <linux/trace_seq.h> #include "../common.h"
@@ -97,18 +98,18 @@ TRACE_EVENT(mhi_gen_tre, __string(name, mhi_cntrl->mhi_dev->name) __field(int, ch_num) __field(void *, wp) - __field(__le64, tre_ptr) - __field(__le32, dword0) - __field(__le32, dword1) + __field(uint64_t, tre_ptr) + __field(uint32_t, dword0) + __field(uint32_t, dword1) ),TP_fast_assign ( __assign_str(name); __entry->ch_num = mhi_chan->chan; __entry->wp = mhi_tre; - __entry->tre_ptr = mhi_tre->ptr; - __entry->dword0 = mhi_tre->dword[0 ]; - __entry->dword1 = mhi_tre->dword[1 ]; + __entry->tre_ptr =le64_to_cpu (mhi_tre->ptr); + __entry->dword0 =le32_to_cpu (mhi_tre->dword[0 ]); + __entry->dword1 =le32_to_cpu (mhi_tre->dword[1 ]); ), TP_printk("%s: Chan: %d TRE: 0x%p TRE buf: 0x%llx DWORD0: 0x%08x DWORD1: 0x%08x\n",
@@ -176,19 +177,19 @@ DECLARE_EVENT_CLASS(mhi_process_event_ring,TP_STRUCT__entry ( __string(name, mhi_cntrl->mhi_dev->name) - __field(__le32, dword0) - __field(__le32, dword1) + __field(uint32_t, dword0) + __field(uint32_t, dword1) __field(int, state) - __field(__le64, ptr) + __field(uint64_t, ptr) __field(void *, rp) ),TP_fast_assign ( __assign_str(name); __entry->rp = rp; - __entry->ptr = rp->ptr; - __entry->dword0 = rp->dword[0 ]; - __entry->dword1 = rp->dword[1 ]; + __entry->ptr =le64_to_cpu (rp->ptr); + __entry->dword0 =le32_to_cpu (rp->dword[0 ]); + __entry->dword1 =le32_to_cpu (rp->dword[1 ]); __entry->state =MHI_TRE_GET_EV_STATE (rp); ),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 609/826 usb: typec: fix potential array underflow in ucsi_ccg_sync_control()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit e56aac6e5a25630645607b6856d4b2a17b2311a5 ]
The "command" variable can be controlled by the user via debugfs. The worry is that if con_index is zero then "&uc->ucsi->connector[con_index
- 1]" would be an array underflow.
--- drivers/usb/typec/ucsi/ucsi_ccg.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/typec/ucsi/ucsi_ccg.c +5 -0
@@ -644,6 +644,10 @@ static int ucsi_ccg_sync_control(struct ucsi *ucsi, u64 command) uc->has_multiple_dp) { con_index = (uc->last_cmd_sent >>16 ) &UCSI_CMD_CONNECTOR_MASK ; +if (con_index ==0 ) { + ret = -EINVAL ; + goto unlock; + } con = &uc->ucsi->connector[con_index -1 ];ucsi_ccg_update_set_new_cam_cmd (uc, con, &command); }
@@ -651,6 +655,7 @@ static int ucsi_ccg_sync_control(struct ucsi *ucsi, u64 command) ret =ucsi_sync_control_common (ucsi, command);pm_runtime_put_sync (uc->dev); +unlock:mutex_unlock (&uc->lock);return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 610/826 firmware_loader: Fix possible resource leak in fw_log_firmware_info()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gaosheng Cui <[email protected]>
[ Upstream commit 369a9c046c2fdfe037f05b43b84c386bdbccc103 ]
The alg instance should be released under the exception path, otherwise there may be resource leak here.
To mitigate this, free the alg instance with crypto_free_shash when kmalloc fails.
--- drivers/base/firmware_loader/main.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/base/firmware_loader/main.c +2 -3
@@ -829,19 +829,18 @@ static void fw_log_firmware_info(const struct firmware *fw, const char *name, st shash->tfm = alg;if (crypto_shash_digest (shash, fw->data, fw->size, sha256buf) <0 ) - goto out_shash; + goto out_free;for (int i =0 ; i <SHA256_DIGEST_SIZE ; i++)sprintf (&outbuf[i *2 ],"%02x" , sha256buf[i]); outbuf[SHA256_BLOCK_SIZE ] =0 ;dev_dbg (device,"Loaded FW: %s, sha256: %s\n" , name, outbuf); -out_shash: -crypto_free_shash (alg); out_free:kfree (shash);kfree (outbuf);kfree (sha256buf); +crypto_free_shash (alg); }#else static void fw_log_firmware_info(const struct firmware *fw, const char *name,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 611/826 ALSA: hda/realtek: Update ALC256 depop procedure
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
[ Upstream commit cc3d0b5dd989d3238d456f9fd385946379a9c13d ]
Old procedure has a chance to meet Headphone no output.
--- sound/pci/hda/patch_realtek.c | 42 ++++++++++++++++------------------- 1 file changed, 19 insertions(+), 23 deletions(-)
sound/pci/hda/patch_realtek.c +19 -23
@@ -3613,25 +3613,22 @@ static void alc256_init(struct hda_codec *codec) hp_pin_sense =snd_hda_jack_detect (codec, hp_pin); -if (hp_pin_sense) +if (hp_pin_sense) {msleep (2 ); +alc_update_coefex_idx (codec,0x57 ,0x04 ,0x0007 ,0x1 );/* Low power */ -alc_update_coefex_idx (codec,0x57 ,0x04 ,0x0007 ,0x1 );/* Low power */ - -snd_hda_codec_write (codec, hp_pin,0 , -AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_MUTE ); - -if (hp_pin_sense || spec->ultra_low_power) -msleep (85 ); - -snd_hda_codec_write (codec, hp_pin,0 , +snd_hda_codec_write (codec, hp_pin,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,PIN_OUT ); -if (hp_pin_sense || spec->ultra_low_power) -msleep (100 ); +msleep (75 ); + +snd_hda_codec_write (codec, hp_pin,0 , +AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_UNMUTE ); +msleep (75 ); +alc_update_coefex_idx (codec,0x57 ,0x04 ,0x0007 ,0x4 );/* Hight power */ + }alc_update_coef_idx (codec,0x46 ,3 <<12 ,0 ); -alc_update_coefex_idx (codec,0x57 ,0x04 ,0x0007 ,0x4 );/* Hight power */ alc_update_coefex_idx (codec,0x53 ,0x02 ,0x8000 ,1 <<15 );/* Clear bit */ alc_update_coefex_idx (codec,0x53 ,0x02 ,0x8000 ,0 <<15 );/*
@@ -3655,29 +3652,28 @@ static void alc256_shutup(struct hda_codec *codec)alc_update_coefex_idx (codec,0x57 ,0x04 ,0x0007 ,0x1 );/* Low power */ hp_pin_sense =snd_hda_jack_detect (codec, hp_pin); -if (hp_pin_sense) +if (hp_pin_sense) {msleep (2 ); -snd_hda_codec_write (codec, hp_pin,0 , +snd_hda_codec_write (codec, hp_pin,0 ,AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_MUTE ); -if (hp_pin_sense || spec->ultra_low_power) -msleep (85 ); +msleep (75 );/* 3k pull low control for Headset jack. */ /* NOTE: call this before clearing the pin, otherwise codec stalls */ /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly * when booting with headset plugged. So skip setting it for the codec alc257 */ -if (spec->en_3kpull_low) -alc_update_coef_idx (codec,0x46 ,0 ,3 <<12 ); +if (spec->en_3kpull_low) +alc_update_coef_idx (codec,0x46 ,0 ,3 <<12 ); -if (!spec->no_shutup_pins) -snd_hda_codec_write (codec, hp_pin,0 , +if (!spec->no_shutup_pins) +snd_hda_codec_write (codec, hp_pin,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,0x0 ); -if (hp_pin_sense || spec->ultra_low_power) -msleep (100 ); +msleep (75 ); + }alc_auto_setup_eapd (codec, false);alc_shutup_pins (codec);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 612/826 drm/radeon: Fix spurious unplug event on radeon HDMI
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven 'Steve' Kendall <[email protected]>
[ Upstream commit 7037bb04265ef05c6ffad56d884b0df76f57b095 ]
On several HP models (tested on HP 3125 and HP Probook 455 G2), spurious unplug events are emitted upon login on Chrome OS. This is likely due to the way Chrome OS restarts graphics upon login, so it's possible it's an issue on other distributions but not as common, though I haven't reproduced the issue elsewhere.
Use logic from an earlier version of the merged change (see link below) which iterates over connectors and finds matching encoders, rather than the other way around. Also fixes an issue with screen mirroring on Chrome OS. I've deployed this patch on Fedora and did not observe any regression on these devices.
--- drivers/gpu/drm/radeon/radeon_audio.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/radeon/radeon_audio.c +8 -4
@@ -760,16 +760,20 @@ static int radeon_audio_component_get_eld(struct device *kdev, int port,if (!rdev->audio.enabled || !rdev->mode_info.mode_config_initialized)return 0 ; -list_for_each_entry (encoder, &rdev_to_drm (rdev)->mode_config.encoder_list, head) { +list_for_each_entry (connector, &dev->mode_config.connector_list, head) { +const struct drm_connector_helper_funcs *connector_funcs = + connector->helper_private; + encoder = connector_funcs->best_encoder (connector); + +if (!encoder) +continue ; +if (!radeon_encoder_is_digital (encoder))continue ; radeon_encoder =to_radeon_encoder (encoder); dig = radeon_encoder->enc_priv;if (!dig->pin || dig->pin->id != port)continue ; - connector =radeon_get_connector_for_encoder (encoder); -if (!connector) -continue ; *enabled = true; ret =drm_eld_size (connector->eld);memcpy (buf, connector->eld,min (max_bytes, ret));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 613/826 drm/amd/display: Fix null check for pipe_ctx->plane_state in dcn20_program_pipe
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zicheng Qu <[email protected]>
[ Upstream commit 6a057072ddd127255350357dd880903e8fa23f36 ]
This commit addresses a null pointer dereference issue in dcn20_program_pipe(). Previously, commit 8e4ed3cf1642 ("drm/amd/display:
Add null check for pipe_ctx->plane_state in dcn20_program_pipe") partially fixed the null pointer dereference issue. However, in dcn20_update_dchubp_dpp(), the variable pipe_ctx is passed in, and plane_state is accessed again through pipe_ctx. Multiple if statements directly call attributes of plane_state, leading to potential null pointer dereference issues. This patch adds necessary null checks to ensure stability.
--- drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c +3 -3
@@ -1923,9 +1923,9 @@ static void dcn20_program_pipe( dc->res_pool->hubbub, pipe_ctx->plane_res.hubp->inst, pipe_ctx->hubp_regs.det_size); } -if (pipe_ctx->update_flags.raw || - (pipe_ctx->plane_state && pipe_ctx->plane_state->update_flags.raw) || - pipe_ctx->stream->update_flags.raw) +if (pipe_ctx->plane_state && (pipe_ctx->update_flags.raw || + pipe_ctx->plane_state->update_flags.raw || + pipe_ctx->stream->update_flags.raw))dcn20_update_dchubp_dpp (dc, pipe_ctx, context); if (pipe_ctx->plane_state && (pipe_ctx->update_flags.bits.enable ||
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 614/826 drm/amd/display: Fix null check for pipe_ctx->plane_state in hwss_setup_dpp
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zicheng Qu <[email protected]>
[ Upstream commit 2bc96c95070571c6c824e0d4c7783bee25a37876 ]
This commit addresses a null pointer dereference issue in hwss_setup_dpp(). The issue could occur when pipe_ctx->plane_state is null. The fix adds a check to ensure pipe_ctx->plane_state is not null before accessing. This prevents a null pointer dereference.
--- drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +3 -0
@@ -881,6 +881,9 @@ void hwss_setup_dpp(union block_sequence_params *params)struct dpp *dpp = pipe_ctx->plane_res.dpp;struct dc_plane_state *plane_state = pipe_ctx->plane_state; +if (!plane_state) +return ; +if (dpp && dpp->funcs->dpp_setup) {// program the input csc dpp->funcs->dpp_setup(dpp,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 615/826 ASoC: imx-audmix: Add NULL check in imx_audmix_probe
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit e038f43edaf0083f6aa7c9415d86cf28dfd152f9 ]
devm_kasprintf() can return a NULL pointer on failure,but this returned value in imx_audmix_probe() is not checked. Add NULL check in imx_audmix_probe(), to handle kernel NULL pointer dereference error.
--- sound/soc/fsl/imx-audmix.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/fsl/imx-audmix.c +3 -0
@@ -275,6 +275,9 @@ static int imx_audmix_probe(struct platform_device *pdev)/* Add AUDMIX Backend */ be_name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"audmix-%d" , i); +if (!be_name) +return -ENOMEM ; + priv->dai[num_dai + i].cpus = &dlc[1 ]; priv->dai[num_dai + i].codecs = &snd_soc_dummy_dlc;
Signature · 1 line
2.43.0