6.6.7-rc1 review
Subsystems (7)
Greg Kroah-Hartman
maintainerPATCH 147/244 highmem: fix a memory copy problem in memcpy_from_folio
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
commit 73424d00dc63ba681856e06cfb0a5abbdb62e2b5 upstream.
Clang static checker complains that value stored to 'from' is never read. And memcpy_from_folio() only copy the last chunk memory from folio to destination. Use 'to += chunk' to replace 'from += chunk' to fix this typo problem.
--- include/linux/highmem.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/highmem.h +1 -1
@@ -454,7 +454,7 @@ static inline void memcpy_from_folio(char *to, struct folio *folio,memcpy (to, from, chunk);kunmap_local (from); - from += chunk; + to += chunk; offset += chunk; len -= chunk; }while (len >0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 148/244 nilfs2: fix missing error check for sb_set_blocksize call
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
commit d61d0ab573649789bf9eb909c89a1a193b2e3d10 upstream.
When mounting a filesystem image with a block size larger than the page size, nilfs2 repeatedly outputs long error messages with stack traces to the kernel log, such as the following:
getblk(): invalid block size 8192 requested
logical block size: 512
...
Call Trace: dump_stack_lvl+0x92/0xd4 dump_stack+0xd/0x10 bdev_getblk+0x33a/0x354 __breadahead+0x11/0x80 nilfs_search_super_root+0xe2/0x704 [nilfs2] load_nilfs+0x72/0x504 [nilfs2] nilfs_mount+0x30f/0x518 [nilfs2] legacy_get_tree+0x1b/0x40 vfs_get_tree+0x18/0xc4 path_mount+0x786/0xa88 __ia32_sys_mount+0x147/0x1a8 __do_fast_syscall_32+0x56/0xc8 do_fast_syscall_32+0x29/0x58 do_SYSENTER_32+0x15/0x18 entry_SYSENTER_32+0x98/0xf1 ...
This overloads the system logger. And to make matters worse, it sometimes crashes the kernel with a memory access violation.
This is because the return value of the sb_set_blocksize() call, which should be checked for errors, is not checked.
The latter issue is due to out-of-buffer memory being accessed based on a large block size that caused sb_set_blocksize() to fail for buffers read with the initial minimum block size that remained unupdated in the super_block structure.
Since nilfs2 mkfs tool does not accept block sizes larger than the system page size, this has been overlooked. However, it is possible to create this situation by intentionally modifying the tool or by passing a filesystem image created on a system with a large page size to a system with a smaller page size and mounting it.
Fix this issue by inserting the expected error handling for the call to sb_set_blocksize().
--- fs/nilfs2/the_nilfs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/nilfs2/the_nilfs.c +5 -1
@@ -716,7 +716,11 @@ int init_nilfs(struct the_nilfs *nilfs, goto failed_sbh; }nilfs_release_super_block (nilfs); -sb_set_blocksize (sb, blocksize); +if (!sb_set_blocksize (sb, blocksize)) { +nilfs_err (sb,"bad blocksize %d" , blocksize); + err = -EINVAL ; + goto out; + } err =nilfs_load_super_block (nilfs, sb, blocksize, &sbp);if (err)
Greg Kroah-Hartman
maintainerPATCH 149/244 nilfs2: prevent WARNING in nilfs_sufile_set_segment_usage()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
commit 675abf8df1353e0e3bde314993e0796c524cfbf0 upstream.
If nilfs2 reads a disk image with corrupted segment usage metadata, and its segment usage information is marked as an error for the segment at the write location, nilfs_sufile_set_segment_usage() can trigger WARN_ONs during log writing.
Segments newly allocated for writing with nilfs_sufile_alloc() will not have this error flag set, but this unexpected situation will occur if the segment indexed by either nilfs->ns_segnum or nilfs->ns_nextnum (active segment) was marked in error.
Fix this issue by inserting a sanity check to treat it as a file system corruption.
Since error returns are not allowed during the execution phase where nilfs_sufile_set_segment_usage() is used, this inserts the sanity check into nilfs_sufile_mark_dirty() which pre-reads the buffer containing the segment usage record to be updated and sets it up in a dirty state for writing.
In addition, nilfs_sufile_set_segment_usage() is also called when canceling log writing and undoing segment usage update, so in order to avoid issuing the same kernel warning in that case, in case of cancellation, avoid checking the error flag in nilfs_sufile_set_segment_usage().
--- fs/nilfs2/sufile.c | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-)
fs/nilfs2/sufile.c +35 -7
@@ -501,15 +501,38 @@ int nilfs_sufile_mark_dirty(struct inodedown_write (&NILFS_MDT (sufile)->mi_sem); ret =nilfs_sufile_get_segment_usage_block (sufile, segnum,0 , &bh); -if (!ret) { -mark_buffer_dirty (bh); -nilfs_mdt_mark_dirty (sufile); - kaddr =kmap_atomic (bh->b_page); - su =nilfs_sufile_block_get_segment_usage (sufile, segnum, bh, kaddr); +if (ret) + goto out_sem; + + kaddr =kmap_atomic (bh->b_page); + su =nilfs_sufile_block_get_segment_usage (sufile, segnum, bh, kaddr); +if (unlikely (nilfs_segment_usage_error (su))) { +struct the_nilfs *nilfs = sufile->i_sb->s_fs_info; + +kunmap_atomic (kaddr); +brelse (bh); +if (nilfs_segment_is_active (nilfs, segnum)) { +nilfs_error (sufile->i_sb, +"active segment %llu is erroneous" , + (unsigned long long )segnum); + }else { +/* +* Segments marked erroneous are never allocated by +* nilfs_sufile_alloc(); only active segments, ie, +* the segments indexed by ns_segnum or ns_nextnum, +* can be erroneous here. +*/ +WARN_ON_ONCE (1 ); + } + ret = -EIO ; + }else {nilfs_segment_usage_set_dirty (su);kunmap_atomic (kaddr); +mark_buffer_dirty (bh); +nilfs_mdt_mark_dirty (sufile);brelse (bh); } +out_sem:up_write (&NILFS_MDT (sufile)->mi_sem);return ret; }
@@ -536,9 +559,14 @@ int nilfs_sufile_set_segment_usage(struc kaddr =kmap_atomic (bh->b_page); su =nilfs_sufile_block_get_segment_usage (sufile, segnum, bh, kaddr); -WARN_ON (nilfs_segment_usage_error (su)); -if (modtime) +if (modtime) { +/* +* Check segusage error and set su_lastmod only when updating +* this entry with a valid timestamp, not for cancellation. +*/ +WARN_ON_ONCE (nilfs_segment_usage_error (su)); su->su_lastmod =cpu_to_le64 (modtime); + } su->su_nblocks =cpu_to_le32 (nblocks);kunmap_atomic (kaddr);
Greg Kroah-Hartman
maintainerPATCH 150/244 lib/group_cpus.c: avoid acquiring cpu hotplug lock in group_cpus_evenly
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
commit 0263f92fadbb9d294d5971ac57743f882c93b2b3 upstream.
group_cpus_evenly() could be part of storage driver's error handler, such as nvme driver, when may happen during CPU hotplug, in which storage queue has to drain its pending IOs because all CPUs associated with the queue are offline and the queue is becoming inactive. And handling IO needs error handler to provide forward progress.
Then deadlock is caused:
1) inside CPU hotplug handler, CPU hotplug lock is held, and blk-mq's handler is waiting for inflight IO
2) error handler is waiting for CPU hotplug lock
3) inflight IO can't be completed in blk-mq's CPU hotplug handler because error handling can't provide forward progress.
Solve the deadlock by not holding CPU hotplug lock in group_cpus_evenly(), in which two stage spreads are taken: 1) the 1st stage is over all present CPUs; 2) the end stage is over all other CPUs.
Turns out the two stage spread just needs consistent 'cpu_present_mask', and remove the CPU hotplug lock by storing it into one local cache. This way doesn't change correctness, because all CPUs are still covered.
--- lib/group_cpus.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
lib/group_cpus.c +16 -6
@@ -366,13 +366,25 @@ struct cpumask *group_cpus_evenly(unsignif (!masks) goto fail_node_to_cpumask; -/* Stabilize the cpumasks */ -cpus_read_lock ();build_node_to_cpumask (node_to_cpumask); +/* +* Make a local cache of 'cpu_present_mask', so the two stages +* spread can observe consistent 'cpu_present_mask' without holding +* cpu hotplug lock, then we can reduce deadlock risk with cpu +* hotplug code. +* +* Here CPU hotplug may happen when reading `cpu_present_mask`, and +* we can live with the case because it only affects that hotplug +* CPU is handled in the 1st or 2nd stage, and either way is correct +* from API user viewpoint since 2-stage spread is sort of +* optimization. +*/ +cpumask_copy (npresmsk,data_race (cpu_present_mask)); +/* grouping present CPUs first */ ret =__group_cpus_evenly (curgrp, numgrps, node_to_cpumask, - cpu_present_mask, nmsk, masks); + npresmsk, nmsk, masks);if (ret <0 ) goto fail_build_affinity; nr_present = ret;
@@ -387,15 +399,13 @@ struct cpumask *group_cpus_evenly(unsign curgrp =0 ; else curgrp = nr_present; -cpumask_andnot (npresmsk, cpu_possible_mask, cpu_present_mask); +cpumask_andnot (npresmsk, cpu_possible_mask, npresmsk); ret =__group_cpus_evenly (curgrp, numgrps, node_to_cpumask, npresmsk, nmsk, masks);if (ret >=0 ) nr_others = ret; fail_build_affinity: -cpus_read_unlock (); -if (ret >=0 )WARN_ON (nr_present + nr_others < numgrps);
Greg Kroah-Hartman
maintainerPATCH 151/244 cgroup_freezer: cgroup_freezing: Check if not frozen
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tim Van Patten <[email protected]>
commit cff5f49d433fcd0063c8be7dd08fa5bf190c6c37 upstream.
__thaw_task() was recently updated to warn if the task being thawed was part of a freezer cgroup that is still currently freezing:
void __thaw_task(struct task_struct *p)
{
...
if (WARN_ON_ONCE(freezing(p)))
goto unlock;This has exposed a bug in cgroup1 freezing where when CGROUP_FROZEN is asserted, the CGROUP_FREEZING bits are not also cleared at the same time. Meaning, when a cgroup is marked FROZEN it continues to be marked FREEZING as well. This causes the WARNING to trigger, because cgroup_freezing() thinks the cgroup is still freezing.
There are two ways to fix this:
1. Whenever FROZEN is set, clear FREEZING for the cgroup and all children cgroups.
2. Update cgroup_freezing() to also verify that FROZEN is not set.
This patch implements option (2), since it's smaller and more straightforward.
--- kernel/cgroup/legacy_freezer.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
kernel/cgroup/legacy_freezer.c +7 -1
@@ -66,9 +66,15 @@ static struct freezer *parent_freezer(stbool cgroup_freezing (struct task_struct *task) {bool ret; +unsigned int state;rcu_read_lock (); - ret =task_freezer (task)->state &CGROUP_FREEZING ; +/* Check if the cgroup is still FREEZING, but not FROZEN. The extra +* !FROZEN check is required, because the FREEZING bit is not cleared +* when the state FROZEN is reached. +*/ + state =task_freezer (task)->state; + ret = (state &CGROUP_FREEZING ) && !(state &CGROUP_FROZEN );rcu_read_unlock ();return ret;
Greg Kroah-Hartman
maintainerPATCH 152/244 checkstack: fix printed address
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit ee34db3f271cea4d4252048617919c2caafe698b upstream.
All addresses printed by checkstack have an extra incorrect 0 appended at the end.
This was introduced with commit 677f1410e058 ("scripts/checkstack.pl: don't display $dre as different entity"): since then the address is taken from the line which contains the function name, instead of the line which contains stack consumption. E.g. on s390:
0000000000100a30 <do_one_initcall>:
...
100a44: e3 f0 ff 70 ff 71 lay %r15,-144(%r15)
So the used regex which matches spaces and hexadecimal numbers to extract an address now matches a different substring. Subsequently replacing spaces with 0 appends a zero at the and, instead of replacing leading spaces.
Fix this by using the proper regex, and simplify the code a bit.
--- scripts/checkstack.pl | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
scripts/checkstack.pl +2 -6
@@ -139,15 +139,11 @@ $total_size = 0; while (my $line = <STDIN>) { if ($line =~ m/$funcre/) { $func = $1; - next if $line !~ m/^($xs*)/; + next if $line !~ m/^($x*)/; if ($total_size > $min_stack) { push @stack, "$intro$total_size\n"; } - - $addr = $1; - $addr =~ s/ /0/g; - $addr = "0x$addr"; - + $addr = "0x$1"; $intro = "$addr $func [$file]:"; my $padlen = 56 - length($intro); while ($padlen > 0) {
Greg Kroah-Hartman
maintainerPATCH 153/244 tracing: Always update snapshot buffer size
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Google) <[email protected]>
commit 7be76461f302ec05cbd62b90b2a05c64299ca01f upstream.
It use to be that only the top level instance had a snapshot buffer (for latency tracers like wakeup and irqsoff). The update of the ring buffer size would check if the instance was the top level and if so, it would also update the snapshot buffer as it needs to be the same as the main buffer.
Now that lower level instances also has a snapshot buffer, they too need to update their snapshot buffer sizes when the main buffer is changed, otherwise the following can be triggered:
# cd /sys/kernel/tracing # echo 1500 > buffer_size_kb # mkdir instances/foo # echo irqsoff > instances/foo/current_tracer # echo 1000 > instances/foo/buffer_size_kb
Produces:
WARNING: CPU: 2 PID: 856 at kernel/trace/trace.c:1938 update_max_tr_single.part.0+0x27d/0x320
Which is:
ret = ring_buffer_swap_cpu(tr->max_buffer.buffer, tr->array_buffer.buffer, cpu);
if (ret == -EBUSY) {
[..]
}
WARN_ON_ONCE(ret && ret != -EAGAIN && ret != -EBUSY); <== hereThat's because ring_buffer_swap_cpu() has:
int ret = -EINVAL; [..] /* At least make sure the two buffers are somewhat the same */ if (cpu_buffer_a->nr_pages != cpu_buffer_b->nr_pages) goto out; [..] out: return ret;
}
Instead, update all instances' snapshot buffer sizes when their main buffer size is updated.
--- kernel/trace/trace.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
kernel/trace/trace.c +1 -2
@@ -6399,8 +6399,7 @@ static int __tracing_resize_ring_buffer(return ret;#ifdef CONFIG_TRACER_MAX_TRACE -if (!(tr->flags &TRACE_ARRAY_FL_GLOBAL ) || - !tr->current_trace->use_max_tr) +if (!tr->current_trace->use_max_tr) goto out; ret =ring_buffer_resize (tr->max_buffer.buffer, size, cpu);
Greg Kroah-Hartman
maintainerPATCH 154/244 tracing: Stop current tracer when resizing buffer
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Google) <[email protected]>
commit d78ab792705c7be1b91243b2544d1a79406a2ad7 upstream.
When the ring buffer is being resized, it can cause side effects to the running tracer. For instance, there's a race with irqsoff tracer that swaps individual per cpu buffers between the main buffer and the snapshot buffer. The resize operation modifies the main buffer and then the snapshot buffer. If a swap happens in between those two operations it will break the tracer.
Simply stop the running tracer before resizing the buffers and enable it again when finished.
--- kernel/trace/trace.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
kernel/trace/trace.c +7 -3
@@ -6394,9 +6394,12 @@ static int __tracing_resize_ring_buffer(if (!tr->array_buffer.buffer)return 0 ; +/* Do not allow tracing while resizng ring buffer */ +tracing_stop_tr (tr); + ret =ring_buffer_resize (tr->array_buffer.buffer, size, cpu);if (ret <0 ) -return ret; + goto out_start;#ifdef CONFIG_TRACER_MAX_TRACE if (!tr->current_trace->use_max_tr)
@@ -6424,7 +6427,7 @@ static int __tracing_resize_ring_buffer(WARN_ON (1 ); tracing_disabled =1 ; } -return ret; + goto out_start; }update_buffer_entries (&tr->max_buffer, cpu);
@@ -6433,7 +6436,8 @@ static int __tracing_resize_ring_buffer(#endif /* CONFIG_TRACER_MAX_TRACE */ update_buffer_entries (&tr->array_buffer, cpu); - + out_start: +tracing_start_tr (tr);return ret; }
Greg Kroah-Hartman
maintainerPATCH 155/244 tracing: Disable snapshot buffer when stopping instance tracers
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Google) <[email protected]>
commit b538bf7d0ec11ca49f536dfda742a5f6db90a798 upstream.
It use to be that only the top level instance had a snapshot buffer (for latency tracers like wakeup and irqsoff). When stopping a tracer in an instance would not disable the snapshot buffer. This could have some unintended consequences if the irqsoff tracer is enabled.
Consolidate the tracing_start/stop() with tracing_start/stop_tr() so that all instances behave the same. The tracing_start/stop() functions will just call their respective tracing_start/stop_tr() with the global_array passed in.
--- kernel/trace/trace.c | 110 +++++++++++++++------------------------------------ 1 file changed, 34 insertions(+), 76 deletions(-)
kernel/trace/trace.c +34 -76
@@ -2359,13 +2359,7 @@ int is_tracing_stopped(void)return global_trace.stop_count; } -/** -* tracing_start - quick start of the tracer -* -* If tracing is enabled but was stopped by tracing_stop, -* this will start the tracer back up. -*/ -void tracing_start (void ) +static void tracing_start_tr (struct trace_array *tr) {struct trace_buffer *buffer;unsigned long flags;
@@ -2373,119 +2367,83 @@ void tracing_start(void)if (tracing_disabled)return ; -raw_spin_lock_irqsave (&global_trace.start_lock, flags); -if (--global_trace.stop_count) { -if (global_trace.stop_count <0 ) { +raw_spin_lock_irqsave (&tr->start_lock, flags); +if (--tr->stop_count) { +if (WARN_ON_ONCE (tr->stop_count <0 )) {/* Someone screwed up their debugging */ -WARN_ON_ONCE (1 ); - global_trace.stop_count =0 ; + tr->stop_count =0 ; } goto out; }/* Prevent the buffers from switching */ -arch_spin_lock (&global_trace.max_lock); +arch_spin_lock (&tr->max_lock); - buffer = global_trace.array_buffer.buffer; + buffer = tr->array_buffer.buffer;if (buffer)ring_buffer_record_enable (buffer);#ifdef CONFIG_TRACER_MAX_TRACE - buffer = global_trace.max_buffer.buffer; + buffer = tr->max_buffer.buffer;if (buffer)ring_buffer_record_enable (buffer);#endif -arch_spin_unlock (&global_trace.max_lock); - - out: -raw_spin_unlock_irqrestore (&global_trace.start_lock, flags); -} - -static void tracing_start_tr (struct trace_array *tr) -{ -struct trace_buffer *buffer; -unsigned long flags; - -if (tracing_disabled) -return ; - -/* If global, we need to also start the max tracer */ -if (tr->flags &TRACE_ARRAY_FL_GLOBAL ) -return tracing_start (); - -raw_spin_lock_irqsave (&tr->start_lock, flags); - -if (--tr->stop_count) { -if (tr->stop_count <0 ) { -/* Someone screwed up their debugging */ -WARN_ON_ONCE (1 ); - tr->stop_count =0 ; - } - goto out; - } - - buffer = tr->array_buffer.buffer; -if (buffer) -ring_buffer_record_enable (buffer); +arch_spin_unlock (&tr->max_lock); out:raw_spin_unlock_irqrestore (&tr->start_lock, flags); }/** -* tracing_stop - quick stop of the tracer +* tracing_start - quick start of the tracer * -* Light weight way to stop tracing. Use in conjunction with -* tracing_start. +* If tracing is enabled but was stopped by tracing_stop, +* this will start the tracer back up. */ -void tracing_stop (void ) +void tracing_start (void ) + +{ +return tracing_start_tr (&global_trace); +} + +static void tracing_stop_tr (struct trace_array *tr) {struct trace_buffer *buffer;unsigned long flags; -raw_spin_lock_irqsave (&global_trace.start_lock, flags); -if (global_trace.stop_count++) +raw_spin_lock_irqsave (&tr->start_lock, flags); +if (tr->stop_count++) goto out;/* Prevent the buffers from switching */ -arch_spin_lock (&global_trace.max_lock); +arch_spin_lock (&tr->max_lock); - buffer = global_trace.array_buffer.buffer; + buffer = tr->array_buffer.buffer;if (buffer)ring_buffer_record_disable (buffer);#ifdef CONFIG_TRACER_MAX_TRACE - buffer = global_trace.max_buffer.buffer; + buffer = tr->max_buffer.buffer;if (buffer)ring_buffer_record_disable (buffer);#endif -arch_spin_unlock (&global_trace.max_lock); +arch_spin_unlock (&tr->max_lock); out: -raw_spin_unlock_irqrestore (&global_trace.start_lock, flags); +raw_spin_unlock_irqrestore (&tr->start_lock, flags); } -static void tracing_stop_tr (struct trace_array *tr) +/** +* tracing_stop - quick stop of the tracer +* +* Light weight way to stop tracing. Use in conjunction with +* tracing_start. +*/ +void tracing_stop (void ) { -struct trace_buffer *buffer; -unsigned long flags; - -/* If global, we need to also stop the max tracer */ -if (tr->flags &TRACE_ARRAY_FL_GLOBAL ) -return tracing_stop (); - -raw_spin_lock_irqsave (&tr->start_lock, flags); -if (tr->stop_count++) - goto out; - - buffer = tr->array_buffer.buffer; -if (buffer) -ring_buffer_record_disable (buffer); - - out: -raw_spin_unlock_irqrestore (&tr->start_lock, flags); +return tracing_stop_tr (&global_trace); }static int trace_save_cmdline (struct task_struct *tsk)
Greg Kroah-Hartman
maintainerPATCH 156/244 tracing: Fix incomplete locking when disabling buffered events
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Pavlu <[email protected]>
commit 7fed14f7ac9cf5e38c693836fe4a874720141845 upstream.
The following warning appears when using buffered events:
[ 203.556451] WARNING: CPU: 53 PID: 10220 at kernel/trace/ring_buffer.c:3912 ring_buffer_discard_commit+0x2eb/0x420 [...] [ 203.670690] CPU: 53 PID: 10220 Comm: stress-ng-sysin Tainted: G E 6.7.0-rc2-default #4 56e6d0fcf5581e6e51eaaecbdaec2a2338c80f3a [ 203.670704] Hardware name: Intel Corp. GROVEPORT/GROVEPORT, BIOS GVPRCRB1.86B.0016.D04.1705030402 05/03/2017 [ 203.670709] RIP: 0010:ring_buffer_discard_commit+0x2eb/0x420 [ 203.735721] Code: 4c 8b 4a 50 48 8b 42 48 49 39 c1 0f 84 b3 00 00 00 49 83 e8 01 75 b1 48 8b 42 10 f0 ff 40 08 0f 0b e9 fc fe ff ff f0 ff 47 08 <0f> 0b e9 77 fd ff ff 48 8b 42 10 f0 ff 40 08 0f 0b e9 f5 fe ff ff [ 203.735734] RSP: 0018:ffffb4ae4f7b7d80 EFLAGS: 00010202 [ 203.735745] RAX: 0000000000000000 RBX: ffffb4ae4f7b7de0 RCX: ffff8ac10662c000 [ 203.735754] RDX: ffff8ac0c750be00 RSI: ffff8ac10662c000 RDI: ffff8ac0c004d400 [ 203.781832] RBP: ffff8ac0c039cea0 R08: 0000000000000000 R09: 0000000000000000 [ 203.781839] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 [ 203.781842] R13: ffff8ac10662c000 R14: ffff8ac0c004d400 R15: ffff8ac10662c008 [ 203.781846] FS: 00007f4cd8a67740(0000) GS:ffff8ad798880000(0000) knlGS:0000000000000000 [ 203.781851] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 203.781855] CR2: 0000559766a74028 CR3: 00000001804c4000 CR4: 00000000001506f0 [ 203.781862] Call Trace: [ 203.781870] <TASK> [ 203.851949] trace_event_buffer_commit+0x1ea/0x250 [ 203.851967] trace_event_raw_event_sys_enter+0x83/0xe0 [ 203.851983] syscall_trace_enter.isra.0+0x182/0x1a0 [ 203.851990] do_syscall_64+0x3a/0xe0 [ 203.852075] entry_SYSCALL_64_after_hwframe+0x6e/0x76 [ 203.852090] RIP: 0033:0x7f4cd870fa77 [ 203.982920] Code: 00 b8 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 66 90 b8 89 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d e9 43 0e 00 f7 d8 64 89 01 48 [ 203.982932] RSP: 002b:00007fff99717dd8 EFLAGS: 00000246 ORIG_RAX: 0000000000000089 [ 203.982942] RAX: ffffffffffffffda RBX: 0000558ea1d7b6f0 RCX: 00007f4cd870fa77 [ 203.982948] RDX: 0000000000000000 RSI: 00007fff99717de0 RDI: 0000558ea1d7b6f0 [ 203.982957] RBP: 00007fff99717de0 R08: 00007fff997180e0 R09: 00007fff997180e0 [ 203.982962] R10: 00007fff997180e0 R11: 0000000000000246 R12: 00007fff99717f40 [ 204.049239] R13: 00007fff99718590 R14: 0000558e9f2127a8 R15: 00007fff997180b0 [ 204.049256] </TASK>
For instance, it can be triggered by running these two commands in parallel:
$ while true; do
echo hist:key=id.syscall:val=hitcount > \
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/trigger;
done
$ stress-ng --sysinfo $(nproc)The warning indicates that the current ring_buffer_per_cpu is not in the committing state. It happens because the active ring_buffer_event doesn't actually come from the ring_buffer_per_cpu but is allocated from trace_buffered_event.
The bug is in function trace_buffered_event_disable() where the following normally happens:
* The code invokes disable_trace_buffered_event() via smp_call_function_many() and follows it by synchronize_rcu(). This increments the per-CPU variable trace_buffered_event_cnt on each target CPU and grants trace_buffered_event_disable() the exclusive access to the per-CPU variable trace_buffered_event.
* Maintenance is performed on trace_buffered_event, all per-CPU event buffers get freed.
* The code invokes enable_trace_buffered_event() via smp_call_function_many(). This decrements trace_buffered_event_cnt and releases the access to trace_buffered_event.
A problem is that smp_call_function_many() runs a given function on all target CPUs except on the current one. The following can then occur:
* Task X executing trace_buffered_event_disable() runs on CPU 0.
* The control reaches synchronize_rcu() and the task gets rescheduled on another CPU 1.
* The RCU synchronization finishes. At this point, trace_buffered_event_disable() has the exclusive access to all trace_buffered_event variables except trace_buffered_event[CPU0] because trace_buffered_event_cnt[CPU0] is never incremented and if the buffer is currently unused, remains set to 0.
* A different task Y is scheduled on CPU 0 and hits a trace event. The code in trace_event_buffer_lock_reserve() sees that trace_buffered_event_cnt[CPU0] is set to 0 and decides the use the buffer provided by trace_buffered_event[CPU0].
* Task X continues its execution in trace_buffered_event_disable(). The code incorrectly frees the event buffer pointed by trace_buffered_event[CPU0] and resets the variable to NULL.
* Task Y writes event data to the now freed buffer and later detects the created inconsistency.
The issue is observable since commit dea499781a11 ("tracing: Fix warning in trace_buffered_event_disable()") which moved the call of trace_buffered_event_disable() in __ftrace_event_enable_disable() earlier, prior to invoking call->class->reg(.. TRACE_REG_UNREGISTER ..). The underlying problem in trace_buffered_event_disable() is however present since the original implementation in commit 0fc1b09ff1ff ("tracing: Use temp buffer when filtering events").
Fix the problem by replacing the two smp_call_function_many() calls with on_each_cpu_mask() which invokes a given callback on all CPUs.
--- kernel/trace/trace.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
kernel/trace/trace.c +4 -8
@@ -2779,11 +2779,9 @@ void trace_buffered_event_disable(void)if (--trace_buffered_event_ref)return ; -preempt_disable ();/* For each CPU, set the buffer as used. */ -smp_call_function_many (tracing_buffer_mask, - disable_trace_buffered_event,NULL ,1 ); -preempt_enable (); +on_each_cpu_mask (tracing_buffer_mask, disable_trace_buffered_event, +NULL , true);/* Wait for all current users to finish */ synchronize_rcu ();
@@ -2798,11 +2796,9 @@ void trace_buffered_event_disable(void)*/ smp_wmb (); -preempt_disable ();/* Do the work on each cpu */ -smp_call_function_many (tracing_buffer_mask, - enable_trace_buffered_event,NULL ,1 ); -preempt_enable (); +on_each_cpu_mask (tracing_buffer_mask, enable_trace_buffered_event,NULL , + true); }static struct trace_buffer *temp_buffer;
Greg Kroah-Hartman
maintainerPATCH 157/244 tracing: Fix a possible race when disabling buffered events
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Pavlu <[email protected]>
commit c0591b1cccf708a47bc465c62436d669a4213323 upstream.
Function trace_buffered_event_disable() is responsible for freeing pages backing buffered events and this process can run concurrently with trace_event_buffer_lock_reserve().
The following race is currently possible:
* Function trace_buffered_event_disable() is called on CPU 0. It increments trace_buffered_event_cnt on each CPU and waits via synchronize_rcu() for each user of trace_buffered_event to complete.
* After synchronize_rcu() is finished, function trace_buffered_event_disable() has the exclusive access to trace_buffered_event. All counters trace_buffered_event_cnt are at 1 and all pointers trace_buffered_event are still valid.
* At this point, on a different CPU 1, the execution reaches trace_event_buffer_lock_reserve(). The function calls preempt_disable_notrace() and only now enters an RCU read-side critical section. The function proceeds and reads a still valid pointer from trace_buffered_event[CPU1] into the local variable "entry". However, it doesn't yet read trace_buffered_event_cnt[CPU1] which happens later.
* Function trace_buffered_event_disable() continues. It frees trace_buffered_event[CPU1] and decrements trace_buffered_event_cnt[CPU1] back to 0.
* Function trace_event_buffer_lock_reserve() continues. It reads and increments trace_buffered_event_cnt[CPU1] from 0 to 1. This makes it believe that it can use the "entry" that it already obtained but the pointer is now invalid and any access results in a use-after-free.
Fix the problem by making a second synchronize_rcu() call after all trace_buffered_event values are set to NULL. This waits on all potential users in trace_event_buffer_lock_reserve() that still read a previous pointer from trace_buffered_event.
--- kernel/trace/trace.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
kernel/trace/trace.c +8 -4
@@ -2790,13 +2790,17 @@ void trace_buffered_event_disable(void)free_page ((unsigned long )per_cpu (trace_buffered_event, cpu));per_cpu (trace_buffered_event, cpu) =NULL ; } +/* -* Make sure trace_buffered_event is NULL before clearing -* trace_buffered_event_cnt. +* Wait for all CPUs that potentially started checking if they can use +* their event buffer only after the previous synchronize_rcu() call and +* they still read a valid pointer from trace_buffered_event. It must be +* ensured they don't see cleared trace_buffered_event_cnt else they +* could wrongly decide to use the pointed-to buffer which is now freed. */ -smp_wmb (); +synchronize_rcu (); -/* Do the work on each cpu */ +/* For each CPU, relinquish the buffer */ on_each_cpu_mask (tracing_buffer_mask, enable_trace_buffered_event,NULL , true); }
Greg Kroah-Hartman
maintainerPATCH 158/244 leds: trigger: netdev: fix RTNL handling to prevent potential deadlock
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
commit fe2b1226656afae56702d1d84c6900f6b67df297 upstream.
When working on LED support for r8169 I got the following lockdep warning. Easiest way to prevent this scenario seems to be to take the RTNL lock before the trigger_data lock in set_device_name().
======================================================
WARNING: possible circular locking dependency detected
6.7.0-rc2-next-20231124+ #2 Not tainted
------------------------------------------------------
bash/383 is trying to acquire lock:ffff888103aa1c68 (&trigger_data->lock){+.+.}-{3:3}, at: netdev_trig_notify+0xec/0x190 [ledtrig_netdev]
but task is already holding lock:ffffffff8cddf808 (rtnl_mutex){+.+.}-{3:3}, at: rtnl_lock+0x12/0x20
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (rtnl_mutex){+.+.}-{3:3}:
__mutex_lock+0x9b/0xb50
mutex_lock_nested+0x16/0x20
rtnl_lock+0x12/0x20
set_device_name+0xa9/0x120 [ledtrig_netdev]
netdev_trig_activate+0x1a1/0x230 [ledtrig_netdev]
led_trigger_set+0x172/0x2c0
led_trigger_write+0xf1/0x140
sysfs_kf_bin_write+0x5d/0x80
kernfs_fop_write_iter+0x15d/0x210
vfs_write+0x1f0/0x510
ksys_write+0x6c/0xf0
__x64_sys_write+0x14/0x20
do_syscall_64+0x3f/0xf0
entry_SYSCALL_64_after_hwframe+0x6c/0x74-> #0 (&trigger_data->lock){+.+.}-{3:3}:
__lock_acquire+0x1459/0x25a0
lock_acquire+0xc8/0x2d0
__mutex_lock+0x9b/0xb50
mutex_lock_nested+0x16/0x20
netdev_trig_notify+0xec/0x190 [ledtrig_netdev]
call_netdevice_register_net_notifiers+0x5a/0x100
register_netdevice_notifier+0x85/0x120
netdev_trig_activate+0x1d4/0x230 [ledtrig_netdev]
led_trigger_set+0x172/0x2c0
led_trigger_write+0xf1/0x140
sysfs_kf_bin_write+0x5d/0x80
kernfs_fop_write_iter+0x15d/0x210
vfs_write+0x1f0/0x510
ksys_write+0x6c/0xf0
__x64_sys_write+0x14/0x20
do_syscall_64+0x3f/0xf0
entry_SYSCALL_64_after_hwframe+0x6c/0x74other info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(rtnl_mutex);
lock(&trigger_data->lock);
lock(rtnl_mutex); lock(&trigger_data->lock);
*** DEADLOCK ***
8 locks held by bash/383:
#0: ffff888103ff33f0 (sb_writers#3){.+.+}-{0:0}, at: ksys_write+0x6c/0xf0
#1: ffff888103aa1e88 (&of->mutex){+.+.}-{3:3}, at: kernfs_fop_write_iter+0x114/0x210 #2: ffff8881036f1890 (kn->active#82){.+.+}-{0:0}, at: kernfs_fop_write_iter+0x11d/0x210 #3: ffff888108e2c358 (&led_cdev->led_access){+.+.}-{3:3}, at: led_trigger_write+0x30/0x140 #4: ffffffff8cdd9e10 (triggers_list_lock){++++}-{3:3}, at: led_trigger_write+0x75/0x140 #5: ffff888108e2c270 (&led_cdev->trigger_lock){++++}-{3:3}, at: led_trigger_write+0xe3/0x140 #6: ffffffff8cdde3d0 (pernet_ops_rwsem){++++}-{3:3}, at: register_netdevice_notifier+0x1c/0x120 #7: ffffffff8cddf808 (rtnl_mutex){+.+.}-{3:3}, at: rtnl_lock+0x12/0x20
stack backtrace: CPU: 0 PID: 383 Comm: bash Not tainted 6.7.0-rc2-next-20231124+ #2 Hardware name: Default string Default string/Default string, BIOS ADLN.M6.SODIMM.ZB.CY.015 08/08/2023 Call Trace: <TASK> dump_stack_lvl+0x5c/0xd0 dump_stack+0x10/0x20 print_circular_bug+0x2dd/0x410 check_noncircular+0x131/0x150 __lock_acquire+0x1459/0x25a0 lock_acquire+0xc8/0x2d0 ? netdev_trig_notify+0xec/0x190 [ledtrig_netdev] __mutex_lock+0x9b/0xb50 ? netdev_trig_notify+0xec/0x190 [ledtrig_netdev] ? __this_cpu_preempt_check+0x13/0x20 ? netdev_trig_notify+0xec/0x190 [ledtrig_netdev] ? __cancel_work_timer+0x11c/0x1b0 ? __mutex_lock+0x123/0xb50 mutex_lock_nested+0x16/0x20 ? mutex_lock_nested+0x16/0x20 netdev_trig_notify+0xec/0x190 [ledtrig_netdev] call_netdevice_register_net_notifiers+0x5a/0x100 register_netdevice_notifier+0x85/0x120 netdev_trig_activate+0x1d4/0x230 [ledtrig_netdev] led_trigger_set+0x172/0x2c0 ? preempt_count_add+0x49/0xc0 led_trigger_write+0xf1/0x140 sysfs_kf_bin_write+0x5d/0x80 kernfs_fop_write_iter+0x15d/0x210 vfs_write+0x1f0/0x510 ksys_write+0x6c/0xf0 __x64_sys_write+0x14/0x20 do_syscall_64+0x3f/0xf0 entry_SYSCALL_64_after_hwframe+0x6c/0x74 RIP: 0033:0x7f269055d034 Code: c7 00 16 00 00 00 b8 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 80 3d 35 c3 0d 00 00 74 13 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 c3 0f 1f 00 48 83 ec 28 48 89 54 24 18 48 RSP: 002b:00007ffddb7ef748 EFLAGS: 00000202 ORIG_RAX: 0000000000000001 RAX: ffffffffffffffda RBX: 0000000000000007 RCX: 00007f269055d034 RDX: 0000000000000007 RSI: 000055bf5f4af3c0 RDI: 0000000000000001 RBP: 000055bf5f4af3c0 R08: 0000000000000073 R09: 0000000000000001 R10: 0000000000000000 R11: 0000000000000202 R12: 0000000000000007 R13: 00007f26906325c0 R14: 00007f269062ff20 R15: 0000000000000000 </TASK>
--- drivers/leds/trigger/ledtrig-netdev.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/leds/trigger/ledtrig-netdev.c +7 -4
@@ -226,6 +226,11 @@ static int set_device_name(struct led_netdev_data *trigger_data,cancel_delayed_work_sync (&trigger_data->work); +/* +* Take RTNL lock before trigger_data lock to prevent potential +* deadlock with netdev notifier registration. +*/ +rtnl_lock ();mutex_lock (&trigger_data->lock);if (trigger_data->net_dev) {
@@ -245,16 +250,14 @@ static int set_device_name(struct led_netdev_data *trigger_data, trigger_data->carrier_link_up = false; trigger_data->link_speed =SPEED_UNKNOWN ; trigger_data->duplex =DUPLEX_UNKNOWN ; -if (trigger_data->net_dev !=NULL ) { -rtnl_lock (); +if (trigger_data->net_dev)get_device_state (trigger_data); -rtnl_unlock (); - } trigger_data->last_activity =0 ;set_baseline_state (trigger_data);mutex_unlock (&trigger_data->lock); +rtnl_unlock ();return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 159/244 nfp: flower: fix for take a mutex lock in soft irq context and rcu lock
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Zhou <[email protected]>
commit 0ad722bd9ee3a9bdfca9613148645e4c9b7f26cf upstream.
The neighbour event callback call the function nfp_tun_write_neigh, this function will take a mutex lock and it is in soft irq context, change the work queue to process the neighbour event.
Move the nfp_tun_write_neigh function out of range rcu_read_lock/unlock() in function nfp_tunnel_request_route_v4 and nfp_tunnel_request_route_v6.
--- .../netronome/nfp/flower/tunnel_conf.c | 127 +++++++++++++----- 1 file changed, 95 insertions(+), 32 deletions(-)
drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c +95 -32
@@ -160,6 +160,18 @@ struct nfp_tun_mac_addr_offload {u8 addr[ETH_ALEN ]; }; +/** +* struct nfp_neigh_update_work - update neighbour information to nfp +* @work: Work queue for writing neigh to the nfp +* @n: neighbour entry +* @app: Back pointer to app +*/ +struct nfp_neigh_update_work { +struct work_struct work; +struct neighbour *n; +struct nfp_app *app; +}; +enum nfp_flower_mac_offload_cmd {NFP_TUNNEL_MAC_OFFLOAD_ADD =0 ,NFP_TUNNEL_MAC_OFFLOAD_DEL =1 ,
@@ -607,38 +619,30 @@ nfp_tun_write_neigh(struct net_device *netdev, struct nfp_app *app,nfp_flower_cmsg_warn (app,"Neighbour configuration failed.\n" ); } -static int -nfp_tun_neigh_event_handler (struct notifier_block *nb,unsigned long event, -void *ptr) +static void +nfp_tun_release_neigh_update_work (struct nfp_neigh_update_work *update_work) { -struct nfp_flower_priv *app_priv; -struct netevent_redirect *redir; -struct neighbour *n; +neigh_release (update_work->n); +kfree (update_work); +} + +static void nfp_tun_neigh_update (struct work_struct *work) +{ +struct nfp_neigh_update_work *update_work;struct nfp_app *app; +struct neighbour *n;bool neigh_invalid;int err; -switch (event) { -case NETEVENT_REDIRECT : - redir = (struct netevent_redirect *)ptr; - n = redir->neigh; -break ; -case NETEVENT_NEIGH_UPDATE : - n = (struct neighbour *)ptr; -break ; -default : -return NOTIFY_DONE ; - } - - neigh_invalid = !(n->nud_state &NUD_VALID ) || n->dead; - - app_priv = container_of(nb, struct nfp_flower_priv, tun.neigh_nb); - app = app_priv->app; + update_work = container_of(work, struct nfp_neigh_update_work, work); + app = update_work->app; + n = update_work->n;if (!nfp_flower_get_port_id_from_netdev (app, n->dev)) -return NOTIFY_DONE ; + goto out;#if IS_ENABLED (CONFIG_INET ) + neigh_invalid = !(n->nud_state &NUD_VALID ) || n->dead;if (n->tbl->family ==AF_INET6 ) {#if IS_ENABLED (CONFIG_IPV6 )struct flowi6 flow6 = {};
@@ -655,13 +659,11 @@ nfp_tun_neigh_event_handler(struct notifier_block *nb, unsigned long event, dst =ip6_dst_lookup_flow (dev_net (n->dev),NULL , &flow6,NULL );if (IS_ERR (dst)) -return NOTIFY_DONE ; + goto out; dst_release(dst); }nfp_tun_write_neigh (n->dev, app, &flow6, n, true, false); -#else -return NOTIFY_DONE ;#endif /* CONFIG_IPV6 */ }else {struct flowi4 flow4 = {};
@@ -678,17 +680,71 @@ nfp_tun_neigh_event_handler(struct notifier_block *nb, unsigned long event, rt =ip_route_output_key (dev_net (n->dev), &flow4); err =PTR_ERR_OR_ZERO (rt);if (err) -return NOTIFY_DONE ; + goto out; ip_rt_put(rt); }nfp_tun_write_neigh (n->dev, app, &flow4, n, false, false); } -#else -return NOTIFY_DONE ;#endif /* CONFIG_INET */ +out: +nfp_tun_release_neigh_update_work (update_work); +} -return NOTIFY_OK ; +static struct nfp_neigh_update_work * +nfp_tun_alloc_neigh_update_work (struct nfp_app *app,struct neighbour *n) +{ +struct nfp_neigh_update_work *update_work; + + update_work =kzalloc (sizeof (*update_work),GFP_ATOMIC ); +if (!update_work) +return NULL ; + +INIT_WORK (&update_work->work, nfp_tun_neigh_update); +neigh_hold (n); + update_work->n = n; + update_work->app = app; + +return update_work; +} + +static int +nfp_tun_neigh_event_handler (struct notifier_block *nb,unsigned long event, +void *ptr) +{ +struct nfp_neigh_update_work *update_work; +struct nfp_flower_priv *app_priv; +struct netevent_redirect *redir; +struct neighbour *n; +struct nfp_app *app; + +switch (event) { +case NETEVENT_REDIRECT : + redir = (struct netevent_redirect *)ptr; + n = redir->neigh; +break ; +case NETEVENT_NEIGH_UPDATE : + n = (struct neighbour *)ptr; +break ; +default : +return NOTIFY_DONE ; + } +#if IS_ENABLED (CONFIG_IPV6 ) +if (n->tbl != ipv6_stub->nd_tbl && n->tbl != &arp_tbl) +#else +if (n->tbl != &arp_tbl) +#endif +return NOTIFY_DONE ; + + app_priv = container_of(nb, struct nfp_flower_priv, tun.neigh_nb); + app = app_priv->app; + update_work =nfp_tun_alloc_neigh_update_work (app, n); +if (!update_work) +return NOTIFY_DONE ; + +queue_work (system_highpri_wq, &update_work->work); + + return NOTIFY_DONE; }void nfp_tunnel_request_route_v4 (struct nfp_app *app,struct sk_buff *skb)
@@ -706,6 +762,7 @@ void nfp_tunnel_request_route_v4(struct nfp_app *app, struct sk_buff *skb) netdev =nfp_app_dev_get (app,be32_to_cpu (payload->ingress_port),NULL );if (!netdev) goto fail_rcu_unlock; +dev_hold (netdev); flow.daddr = payload->ipv4_addr; flow.flowi4_proto =IPPROTO_UDP ;
@@ -725,13 +782,16 @@ void nfp_tunnel_request_route_v4(struct nfp_app *app, struct sk_buff *skb)ip_rt_put (rt);if (!n) goto fail_rcu_unlock; +rcu_read_unlock (); +nfp_tun_write_neigh (n->dev, app, &flow, n, false, true);neigh_release (n); -rcu_read_unlock (); +dev_put (netdev);return ; fail_rcu_unlock:rcu_read_unlock (); +dev_put (netdev);nfp_flower_cmsg_warn (app,"Requested route not found.\n" ); }
@@ -749,6 +809,7 @@ void nfp_tunnel_request_route_v6(struct nfp_app *app, struct sk_buff *skb) netdev =nfp_app_dev_get (app,be32_to_cpu (payload->ingress_port),NULL );if (!netdev) goto fail_rcu_unlock; +dev_hold (netdev); flow.daddr = payload->ipv6_addr; flow.flowi6_proto =IPPROTO_UDP ;
@@ -766,14 +827,16 @@ void nfp_tunnel_request_route_v6(struct nfp_app *app, struct sk_buff *skb)dst_release (dst);if (!n) goto fail_rcu_unlock; +rcu_read_unlock ();nfp_tun_write_neigh (n->dev, app, &flow, n, true, true);neigh_release (n); -rcu_read_unlock (); +dev_put (netdev);return ; fail_rcu_unlock:rcu_read_unlock (); +dev_put (netdev);nfp_flower_cmsg_warn (app,"Requested IPv6 route not found.\n" ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 160/244 packet: Move reference count in packet_sock to atomic_long_t
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
commit db3fadacaf0c817b222090290d06ca2a338422d0 upstream.
In some potential instances the reference count on struct packet_sock could be saturated and cause overflows which gets the kernel a bit confused. To prevent this, move to a 64-bit atomic reference count on 64-bit architectures to prevent the possibility of this type to overflow.
Because we can not handle saturation, using refcount_t is not possible in this place. Maybe someday in the future if it changes it could be used. Also, instead of using plain atomic64_t, use atomic_long_t instead. 32-bit machines tend to be memory-limited (i.e. anything that increases a reference uses so much memory that you can't actually get to 2**32 references). 32-bit architectures also tend to have serious problems with 64-bit atomics. Hence, atomic_long_t is the more natural solution.
--- net/packet/af_packet.c | 16 ++++++++-------- net/packet/internal.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-)
net/packet/af_packet.c +8 -8
@@ -4300,7 +4300,7 @@ static void packet_mm_open(struct vm_arestruct sock *sk = sock->sk;if (sk) -atomic_inc (&pkt_sk (sk)->mapped); +atomic_long_inc (&pkt_sk (sk)->mapped); }static void packet_mm_close (struct vm_area_struct *vma)
@@ -4310,7 +4310,7 @@ static void packet_mm_close(struct vm_arstruct sock *sk = sock->sk;if (sk) -atomic_dec (&pkt_sk (sk)->mapped); +atomic_long_dec (&pkt_sk (sk)->mapped); }static const struct vm_operations_struct packet_mmap_ops = {
@@ -4405,7 +4405,7 @@ static int packet_set_ring(struct sock * err = -EBUSY ;if (!closing) { -if (atomic_read (&po->mapped)) +if (atomic_long_read (&po->mapped)) goto out;if (packet_read_pending (rb)) goto out;
@@ -4508,7 +4508,7 @@ static int packet_set_ring(struct sock * err = -EBUSY ;mutex_lock (&po->pg_vec_lock); -if (closing ||atomic_read (&po->mapped) ==0 ) { +if (closing ||atomic_long_read (&po->mapped) ==0 ) { err =0 ;spin_lock_bh (&rb_queue->lock);swap (rb->pg_vec, pg_vec);
@@ -4526,9 +4526,9 @@ static int packet_set_ring(struct sock * po->prot_hook.func = (po->rx_ring.pg_vec) ? tpacket_rcv : packet_rcv;skb_queue_purge (rb_queue); -if (atomic_read (&po->mapped)) -pr_err ("packet_mmap: vma is busy: %d\n" , -atomic_read (&po->mapped)); +if (atomic_long_read (&po->mapped)) +pr_err ("packet_mmap: vma is busy: %ld\n" , +atomic_long_read (&po->mapped)); }mutex_unlock (&po->pg_vec_lock);
@@ -4606,7 +4606,7 @@ static int packet_mmap(struct file *file } } -atomic_inc (&po->mapped); +atomic_long_inc (&po->mapped); vma->vm_ops = &packet_mmap_ops; err =0 ;
net/packet/internal.h +1 -1
@@ -122,7 +122,7 @@ struct packet_sock {__be16 num;struct packet_rollover *rollover;struct packet_mclist *mclist; -atomic_t mapped; +atomic_long_t mapped;enum tpacket_versions tp_version;unsigned int tp_hdrlen;unsigned int tp_reserve;
Greg Kroah-Hartman
maintainerPATCH 161/244 r8169: fix rtl8125b PAUSE frames blasting when suspended
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: ChunHao Lin <[email protected]>
commit 4b0768b6556af56ee9b7cf4e68452a2b6289ae45 upstream.
When FIFO reaches near full state, device will issue pause frame. If pause slot is enabled(set to 1), in this time, device will issue pause frame only once. But if pause slot is disabled(set to 0), device will keep sending pause frames until FIFO reaches near empty state.
When pause slot is disabled, if there is no one to handle receive packets, device FIFO will reach near full state and keep sending pause frames. That will impact entire local area network.
This issue can be reproduced in Chromebox (not Chromebook) in developer mode running a test image (and v5.10 kernel):
1) ping -f $CHROMEBOX (from workstation on same local network)
2) run "powerd_dbus_suspend" from command line on the $CHROMEBOX
3) ping $ROUTER (wait until ping fails from workstation)
Takes about ~20-30 seconds after step 2 for the local network to stop working.
Fix this issue by enabling pause slot to only send pause frame once when FIFO reaches near full state.
--- drivers/net/ethernet/realtek/r8169_main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/ethernet/realtek/r8169_main.c +6 -1
@@ -196,6 +196,7 @@ enum rtl_registers {/* No threshold before first PCI xfer */ #define RX_FIFO_THRESH (7 << RXCFG_FIFO_SHIFT)#define RX_EARLY_OFF (1 << 11) +#define RX_PAUSE_SLOT_ON (1 << 11)/* 8125b and later */ #define RXCFG_DMA_SHIFT 8/* Unlimited maximum PCI burst. */ #define RX_DMA_BURST (7 << RXCFG_DMA_SHIFT)
@@ -2306,9 +2307,13 @@ static void rtl_init_rxcfg(struct rtl816 case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_53:RTL_W32 (tp, RxConfig,RX128_INT_EN |RX_MULTI_EN |RX_DMA_BURST |RX_EARLY_OFF );break ; - case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_63: +case RTL_GIGA_MAC_VER_61 :RTL_W32 (tp, RxConfig,RX_FETCH_DFLT_8125 |RX_DMA_BURST );break ; +case RTL_GIGA_MAC_VER_63 : +RTL_W32 (tp, RxConfig,RX_FETCH_DFLT_8125 |RX_DMA_BURST | +RX_PAUSE_SLOT_ON ); +break ;default :RTL_W32 (tp, RxConfig,RX128_INT_EN |RX_DMA_BURST );break ;
Greg Kroah-Hartman
maintainerPATCH 162/244 regmap: fix bogus error on regcache_sync success
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias Reichl <[email protected]>
commit fea88064445a59584460f7f67d102b6e5fc1ca1d upstream.
Since commit 0ec7731655de ("regmap: Ensure range selector registers are updated after cache sync") opening pcm512x based soundcards fail with EINVAL and dmesg shows sync cache and pm_runtime_get errors:
[ 228.794676] pcm512x 1-004c: Failed to sync cache: -22 [ 228.794740] pcm512x 1-004c: ASoC: error at snd_soc_pcm_component_pm_runtime_get on pcm512x.1-004c: -22
This is caused by the cache check result leaking out into the regcache_sync return value.
Fix this by making the check local-only, as the comment above the regcache_read call states a non-zero return value means there's nothing to do so the return value should not be altered.
--- drivers/base/regmap/regcache.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/base/regmap/regcache.c +1 -2
@@ -410,8 +410,7 @@ out: rb_entry(node, struct regmap_range_node, node);/* If there's nothing in the cache there's nothing to sync */ - ret =regcache_read (map, this->selector_reg, &i); -if (ret !=0 ) +if (regcache_read (map, this->selector_reg, &i) !=0 )continue ; ret =_regmap_write (map, this->selector_reg, i);
Greg Kroah-Hartman
maintainerPATCH 163/244 platform/surface: aggregator: fix recv_buf() return value
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Francesco Dolcini <[email protected]>
commit c8820c92caf0770bec976b01fa9e82bb993c5865 upstream.
Serdev recv_buf() callback is supposed to return the amount of bytes consumed, therefore an int in between 0 and count.
Do not return negative number in case of issue, when ssam_controller_receive_buf() returns ESHUTDOWN just returns 0, e.g. no bytes consumed, this keep the exact same behavior as it was before.
This fixes a potential WARN in serdev-ttyport.c:ttyport_receive_buf().
--- drivers/platform/surface/aggregator/core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/platform/surface/aggregator/core.c +4 -1
@@ -231,9 +231,12 @@ static int ssam_receive_buf(struct serde size_t n) {struct ssam_controller *ctrl; +int ret; ctrl =serdev_device_get_drvdata (dev); -return ssam_controller_receive_buf (ctrl, buf, n); + ret =ssam_controller_receive_buf (ctrl, buf, n); + +return ret <0 ?0 : ret; }static void ssam_write_wakeup (struct serdev_device *dev)
Greg Kroah-Hartman
maintainerPATCH 164/244 workqueue: Make sure that wq_unbound_cpumask is never empty
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit 4a6c5607d4502ccd1b15b57d57f17d12b6f257a7 upstream.
During boot, depending on how the housekeeping and workqueue.unbound_cpus masks are set, wq_unbound_cpumask can end up empty. Since 8639ecebc9b1 ("workqueue: Implement non-strict affinity scope for unbound workqueues"), this may end up feeding -1 as a CPU number into scheduler leading to oopses.
BUG: unable to handle page fault for address: ffffffff8305e9c0 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page ... Call Trace: <TASK> select_idle_sibling+0x79/0xaf0 select_task_rq_fair+0x1cb/0x7b0 try_to_wake_up+0x29c/0x5c0 wake_up_process+0x19/0x20 kick_pool+0x5e/0xb0 __queue_work+0x119/0x430 queue_work_on+0x29/0x30 ...
An empty wq_unbound_cpumask is a clear misconfiguration and already disallowed once system is booted up. Let's warn on and ignore unbound_cpumask restrictions which lead to no unbound cpus. While at it, also remove now unncessary empty check on wq_unbound_cpumask in wq_select_unbound_cpu().
--- kernel/workqueue.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-)
kernel/workqueue.c +15 -7
@@ -1684,9 +1684,6 @@ static int wq_select_unbound_cpu(int cpu)pr_warn_once ("workqueue: round-robin CPU selection forced, expect performance impact\n" ); } -if (cpumask_empty (wq_unbound_cpumask)) -return cpu; - new_cpu =__this_cpu_read (wq_rr_cpu_last); new_cpu =cpumask_next_and (new_cpu, wq_unbound_cpumask, cpu_online_mask);if (unlikely (new_cpu >= nr_cpu_ids)) {
@@ -6515,6 +6512,17 @@ static inline void wq_watchdog_init(void) { }#endif /* CONFIG_WQ_WATCHDOG */ +static void __init restrict_unbound_cpumask (const char *name,const struct cpumask *mask) +{ +if (!cpumask_intersects (wq_unbound_cpumask, mask)) { +pr_warn ("workqueue: Restricting unbound_cpumask (%*pb) with %s (%*pb) leaves no CPU, ignoring\n" , +cpumask_pr_args (wq_unbound_cpumask), name,cpumask_pr_args (mask)); +return ; + } + +cpumask_and (wq_unbound_cpumask, wq_unbound_cpumask, mask); +} +/** * workqueue_init_early - early init for workqueue subsystem *
@@ -6534,11 +6542,11 @@ void __init workqueue_init_early(void)BUILD_BUG_ON (__alignof__(struct pool_workqueue ) < __alignof__(long long ));BUG_ON (!alloc_cpumask_var (&wq_unbound_cpumask,GFP_KERNEL )); -cpumask_copy (wq_unbound_cpumask,housekeeping_cpumask (HK_TYPE_WQ )); -cpumask_and (wq_unbound_cpumask, wq_unbound_cpumask,housekeeping_cpumask (HK_TYPE_DOMAIN )); - +cpumask_copy (wq_unbound_cpumask, cpu_possible_mask); +restrict_unbound_cpumask ("HK_TYPE_WQ" ,housekeeping_cpumask (HK_TYPE_WQ )); +restrict_unbound_cpumask ("HK_TYPE_DOMAIN" ,housekeeping_cpumask (HK_TYPE_DOMAIN ));if (!cpumask_empty (&wq_cmdline_cpumask)) -cpumask_and (wq_unbound_cpumask, wq_unbound_cpumask, &wq_cmdline_cpumask); +restrict_unbound_cpumask ("workqueue.unbound_cpus" , &wq_cmdline_cpumask); pwq_cache =KMEM_CACHE (pool_workqueue,SLAB_PANIC );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 165/244 hugetlb: fix null-ptr-deref in hugetlb_vma_lock_write
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Kravetz <[email protected]>
commit 187da0f8250aa94bd96266096aef6f694e0b4cd2 upstream.
The routine __vma_private_lock tests for the existence of a reserve map associated with a private hugetlb mapping. A pointer to the reserve map is in vma->vm_private_data. __vma_private_lock was checking the pointer for NULL. However, it is possible that the low bits of the pointer could be used as flags. In such instances, vm_private_data is not NULL and not a valid pointer. This results in the null-ptr-deref reported by syzbot:
general protection fault, probably for non-canonical address 0xdffffc000000001d: 0000 [#1] PREEMPT SMP KASAN KASAN: null-ptr-deref in range [0x00000000000000e8-0x00000000000000ef] CPU: 0 PID: 5048 Comm: syz-executor139 Not tainted 6.6.0-rc7-syzkaller-00142-g88 8cf78c29e2 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 1 0/09/2023 RIP: 0010:__lock_acquire+0x109/0x5de0 kernel/locking/lockdep.c:5004 ... Call Trace: <TASK> lock_acquire kernel/locking/lockdep.c:5753 [inline] lock_acquire+0x1ae/0x510 kernel/locking/lockdep.c:5718 down_write+0x93/0x200 kernel/locking/rwsem.c:1573 hugetlb_vma_lock_write mm/hugetlb.c:300 [inline] hugetlb_vma_lock_write+0xae/0x100 mm/hugetlb.c:291 __hugetlb_zap_begin+0x1e9/0x2b0 mm/hugetlb.c:5447 hugetlb_zap_begin include/linux/hugetlb.h:258 [inline] unmap_vmas+0x2f4/0x470 mm/memory.c:1733 exit_mmap+0x1ad/0xa60 mm/mmap.c:3230 __mmput+0x12a/0x4d0 kernel/fork.c:1349 mmput+0x62/0x70 kernel/fork.c:1371 exit_mm kernel/exit.c:567 [inline] do_exit+0x9ad/0x2a20 kernel/exit.c:861 __do_sys_exit kernel/exit.c:991 [inline] __se_sys_exit kernel/exit.c:989 [inline] __x64_sys_exit+0x42/0x50 kernel/exit.c:989 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x38/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
Mask off low bit flags before checking for NULL pointer. In addition, the reserve map only 'belongs' to the OWNER (parent in parent/child relationships) so also check for the OWNER flag.
--- include/linux/hugetlb.h | 5 +---- mm/hugetlb.c | 7 +++++++ 2 files changed, 8 insertions(+), 4 deletions(-)
include/linux/hugetlb.h +1 -4
@@ -1265,10 +1265,7 @@ static inline bool __vma_shareable_lock(return (vma->vm_flags &VM_MAYSHARE ) && vma->vm_private_data; } -static inline bool __vma_private_lock (struct vm_area_struct *vma) -{ -return (!(vma->vm_flags &VM_MAYSHARE )) && vma->vm_private_data; -} +bool __vma_private_lock (struct vm_area_struct *vma);/* * Safe version of huge_pte_offset() to check the locks. See comments
mm/hugetlb.c +7 -0
@@ -1189,6 +1189,13 @@ static int is_vma_resv_set(struct vm_arereturn (get_vma_private_data (vma) & flag) !=0 ; } +bool __vma_private_lock (struct vm_area_struct *vma) +{ +return !(vma->vm_flags &VM_MAYSHARE ) && +get_vma_private_data (vma) & ~HPAGE_RESV_MASK && +is_vma_resv_set (vma,HPAGE_RESV_OWNER ); +} +void hugetlb_dup_vma_private (struct vm_area_struct *vma) {VM_BUG_ON_VMA (!is_vm_hugetlb_page (vma), vma);
Greg Kroah-Hartman
maintainerPATCH 166/244 drivers/base/cpu: crash data showing should depends on KEXEC_CORE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baoquan He <[email protected]>
commit 4e9e2e4c65136dfd32dd0afe555961433d1cf906 upstream.
After commit 88a6f8994421 ("crash: memory and CPU hotplug sysfs attributes"), on x86_64, if only below kernel configs related to kdump are set, compiling error are triggered.
----CONFIG_CRASH_CORE=yCONFIG_KEXEC_CORE=yCONFIG_CRASH_DUMP=yCONFIG_CRASH_HOTPLUG=y
------
------------------------------------------------------drivers/base/cpu.c: In function `crash_hotplug_show':drivers/base/cpu.c:309:40: error: implicit declaration of function crash_hotplug_cpu_support'; did you mean crash_hotplug_show'? [-Werror=implicit-function-declaration]
309 | return sysfs_emit(buf, "%d\n", crash_hotplug_cpu_support());
| ^~~~~~~~~~~~~~~~~~~~~~~~~
| crash_hotplug_showcc1: some warnings being treated as errors
------------------------------------------------------
CONFIG_KEXEC is used to enable kexec_load interface, the crash_notes/crash_notes_size/crash_hotplug showing depends on CONFIG_KEXEC is incorrect. It should depend on KEXEC_CORE instead.
Fix it now.
--- drivers/base/cpu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/base/cpu.c +3 -3
@@ -144,7 +144,7 @@ static DEVICE_ATTR(release, S_IWUSR, NULL, cpu_release_store);#endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */ #endif /* CONFIG_HOTPLUG_CPU */ -#ifdef CONFIG_KEXEC +#ifdef CONFIG_KEXEC_CORE #include <linux/kexec.h> static ssize_t crash_notes_show(struct device *dev,
@@ -189,14 +189,14 @@ static const struct attribute_group crash_note_cpu_attr_group = {#endif static const struct attribute_group *common_cpu_attr_groups[] = { -#ifdef CONFIG_KEXEC +#ifdef CONFIG_KEXEC_CORE &crash_note_cpu_attr_group, #endifNULL };static const struct attribute_group *hotplugable_cpu_attr_groups[] = { -#ifdef CONFIG_KEXEC +#ifdef CONFIG_KEXEC_CORE &crash_note_cpu_attr_group, #endifNULL
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 167/244 mm/memory_hotplug: add missing mem_hotplug_lock
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sumanth Korikkar <[email protected]>
commit 001002e73712cdf6b8d9a103648cda3040ad7647 upstream.
Quoted 1 line
From
Documentation/core-api/memory-hotplug.rst:
When adding/removing/onlining/offlining memory or adding/removing heterogeneous/device memory, we should always hold the mem_hotplug_lock in write mode to serialise memory hotplug (e.g. access to global/zone variables).
mhp_(de)init_memmap_on_memory() functions can change zone stats and struct page content, but they are currently called w/o the mem_hotplug_lock.
When memory block is being offlined and when kmemleak goes through each populated zone, the following theoretical race conditions could occur:
CPU 0: | CPU 1:memory_offline() |
-> offline_pages() |
-> mem_hotplug_begin() | ... | -> mem_hotplug_done() | | kmemleak_scan() | -> get_online_mems() | ...
-> mhp_deinit_memmap_on_memory() |
[not protected by mem_hotplug_begin/done()]|
Marks memory section as offline, | Retrieves zone_start_pfn
poisons vmemmap struct pages and updates | and struct page members.
the zone related data |
| ...
| -> put_online_mems()
Fix this by ensuring mem_hotplug_lock is taken before performing mhp_init_memmap_on_memory(). Also ensure that mhp_deinit_memmap_on_memory() holds the lock.
online/offline_pages() are currently only called from memory_block_online/offline(), so it is safe to move the locking there.
--- drivers/base/memory.c | 18 +++++++++++++++--- mm/memory_hotplug.c | 13 ++++++------- 2 files changed, 21 insertions(+), 10 deletions(-)
drivers/base/memory.c +15 -3
@@ -180,6 +180,9 @@ static inline unsigned long memblk_nr_po }#endif +/* +* Must acquire mem_hotplug_lock in write mode. +*/ static int memory_block_online (struct memory_block *mem) {unsigned long start_pfn =section_nr_to_pfn (mem->start_section_nr);
@@ -204,10 +207,11 @@ static int memory_block_online(struct meif (mem->altmap) nr_vmemmap_pages = mem->altmap->free; +mem_hotplug_begin ();if (nr_vmemmap_pages) { ret =mhp_init_memmap_on_memory (start_pfn, nr_vmemmap_pages, zone);if (ret) -return ret; + goto out; } ret = online_pages(start_pfn + nr_vmemmap_pages,
@@ -215,7 +219,7 @@ static int memory_block_online(struct meif (ret) {if (nr_vmemmap_pages)mhp_deinit_memmap_on_memory (start_pfn, nr_vmemmap_pages); -return ret; + goto out; }/*
@@ -227,9 +231,14 @@ static int memory_block_online(struct me nr_vmemmap_pages); mem->zone = zone; +out: +mem_hotplug_done ();return ret; } +/* +* Must acquire mem_hotplug_lock in write mode. +*/ static int memory_block_offline (struct memory_block *mem) {unsigned long start_pfn =section_nr_to_pfn (mem->start_section_nr);
@@ -247,6 +256,7 @@ static int memory_block_offline(struct mif (mem->altmap) nr_vmemmap_pages = mem->altmap->free; +mem_hotplug_begin ();if (nr_vmemmap_pages)adjust_present_page_count (pfn_to_page (start_pfn), mem->group, -nr_vmemmap_pages);
@@ -258,13 +268,15 @@ static int memory_block_offline(struct mif (nr_vmemmap_pages)adjust_present_page_count (pfn_to_page (start_pfn), mem->group, nr_vmemmap_pages); -return ret; + goto out; }if (nr_vmemmap_pages)mhp_deinit_memmap_on_memory (start_pfn, nr_vmemmap_pages); mem->zone =NULL ; +out: +mem_hotplug_done ();return ret; }
mm/memory_hotplug.c +6 -7
@@ -1129,6 +1129,9 @@ void mhp_deinit_memmap_on_memory(unsignekasan_remove_zero_shadow (__va (PFN_PHYS (pfn)),PFN_PHYS (nr_pages)); } +/* +* Must be called with mem_hotplug_lock in write mode. +*/ int __ref online_pages (unsigned long pfn,unsigned long nr_pages,struct zone *zone,struct memory_group *group) {
@@ -1149,7 +1152,6 @@ int __ref online_pages(unsigned long pfn !IS_ALIGNED(pfn + nr_pages, PAGES_PER_SECTION)))return -EINVAL ; -mem_hotplug_begin ();/* associate pfn range with the zone */ move_pfn_range_to_zone (zone, pfn, nr_pages,NULL ,MIGRATE_ISOLATE );
@@ -1208,7 +1210,6 @@ int __ref online_pages(unsigned long pfnwriteback_set_ratelimit ();memory_notify (MEM_ONLINE , &arg); -mem_hotplug_done ();return 0 ; failed_addition:
@@ -1217,7 +1218,6 @@ failed_addition: (((unsigned long long) pfn + nr_pages) << PAGE_SHIFT) - 1);memory_notify (MEM_CANCEL_ONLINE , &arg);remove_pfn_range_from_zone (zone, pfn, nr_pages); -mem_hotplug_done ();return ret; }
@@ -1863,6 +1863,9 @@ static int count_system_ram_pages_cb(unsreturn 0 ; } +/* +* Must be called with mem_hotplug_lock in write mode. +*/ int __ref offline_pages (unsigned long start_pfn,unsigned long nr_pages,struct zone *zone,struct memory_group *group) {
@@ -1885,8 +1888,6 @@ int __ref offline_pages(unsigned long st !IS_ALIGNED(start_pfn + nr_pages, PAGES_PER_SECTION)))return -EINVAL ; -mem_hotplug_begin (); -/* * Don't allow to offline memory blocks that contain holes. * Consequently, memory blocks with holes can never get onlined
@@ -2027,7 +2028,6 @@ int __ref offline_pages(unsigned long stmemory_notify (MEM_OFFLINE , &arg);remove_pfn_range_from_zone (zone, start_pfn, nr_pages); -mem_hotplug_done ();return 0 ; failed_removal_isolated:
@@ -2042,7 +2042,6 @@ failed_removal: (unsigned long long ) start_pfn <<PAGE_SHIFT , ((unsigned long long ) end_pfn <<PAGE_SHIFT ) -1 , reason); -mem_hotplug_done ();return ret; }
Greg Kroah-Hartman
maintainerPATCH 168/244 mm: fix oops when filemap_map_pmd() without prealloc_pte
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugh Dickins <[email protected]>
commit 9aa1345d66b8132745ffb99b348b1492088da9e2 upstream.
syzbot reports oops in lockdep's __lock_acquire(), called from __pte_offset_map_lock() called from filemap_map_pages(); or when I run the repro, the oops comes in pmd_install(), called from filemap_map_pmd() called from filemap_map_pages(), just before the __pte_offset_map_lock().
The problem is that filemap_map_pmd() has been assuming that when it finds pmd_none(), a page table has already been prepared in prealloc_pte; and indeed do_fault_around() has been careful to preallocate one there, when it finds pmd_none(): but what if *pmd became none in between?
My 6.6 mods in mm/khugepaged.c, avoiding mmap_lock for write, have made it easy for *pmd to be cleared while servicing a page fault; but even before those, a huge *pmd might be zapped while a fault is serviced.
The difference in symptomatic stack traces comes from the "memory model" in use: pmd_install() uses pmd_populate() uses page_to_pfn(): in some models that is strict, and will oops on the NULL prealloc_pte; in other models, it will construct a bogus value to be populated into *pmd, then __pte_offset_map_lock() oops when trying to access split ptlock pointer (or some other symptom in normal case of ptlock embedded not pointer).
--- mm/filemap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/filemap.c +1 -1
@@ -3422,7 +3422,7 @@ static bool filemap_map_pmd(struct vm_fa } } -if (pmd_none (*vmf->pmd)) +if (pmd_none (*vmf->pmd) && vmf->prealloc_pte)pmd_install (mm, vmf->pmd, &vmf->prealloc_pte);return false;
Greg Kroah-Hartman
maintainerPATCH 169/244 mm/memory_hotplug: fix error handling in add_memory_resource()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sumanth Korikkar <[email protected]>
commit f42ce5f087eb69e47294ababd2e7e6f88a82d308 upstream.
In add_memory_resource(), creation of memory block devices occurs after successful call to arch_add_memory(). However, creation of memory block devices could fail. In that case, arch_remove_memory() is called to perform necessary cleanup.
Currently with or without altmap support, arch_remove_memory() is always passed with altmap set to NULL during error handling. This leads to freeing of struct pages using free_pages(), eventhough the allocation might have been performed with altmap support via altmap_alloc_block_buf().
Fix the error handling by passing altmap in arch_remove_memory(). This ensures the following:
* When altmap is disabled, deallocation of the struct pages array occurs via free_pages().
* When altmap is enabled, deallocation occurs via vmem_altmap_free().
--- mm/memory_hotplug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/memory_hotplug.c +1 -1
@@ -1458,7 +1458,7 @@ int __ref add_memory_resource(int nid, s/* create memory block devices after memory was added */ ret =create_memory_block_devices (start, size, params.altmap, group);if (ret) { -arch_remove_memory (start, size,NULL ); +arch_remove_memory (start, size, params.altmap); goto error_free; }
Greg Kroah-Hartman
maintainerPATCH 170/244 powercap: DTPM: Fix missing cpufreq_cpu_put() calls
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukasz Luba <[email protected]>
commit bdefd9913bdd453991ef756b6f7176e8ad80d786 upstream.
The policy returned by cpufreq_cpu_get() has to be released with the help of cpufreq_cpu_put() to balance its kobject reference counter properly.
Add the missing calls to cpufreq_cpu_put() in the code.
--- drivers/powercap/dtpm_cpu.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/powercap/dtpm_cpu.c +13 -4
@@ -140,6 +140,8 @@ static void pd_release(struct dtpm *dtpmif (policy) {for_each_cpu (dtpm_cpu->cpu, policy->related_cpus)per_cpu (dtpm_per_cpu, dtpm_cpu->cpu) =NULL ; + +cpufreq_cpu_put (policy); }kfree (dtpm_cpu);
@@ -191,12 +193,16 @@ static int __dtpm_cpu_setup(int cpu, strreturn 0 ; pd =em_cpu_get (cpu); -if (!pd ||em_is_artificial (pd)) -return -EINVAL ; +if (!pd ||em_is_artificial (pd)) { + ret = -EINVAL ; + goto release_policy; + } dtpm_cpu =kzalloc (sizeof (*dtpm_cpu),GFP_KERNEL ); -if (!dtpm_cpu) -return -ENOMEM ; +if (!dtpm_cpu) { + ret = -ENOMEM ; + goto release_policy; + }dtpm_init (&dtpm_cpu->dtpm, &dtpm_ops); dtpm_cpu->cpu = cpu;
@@ -216,6 +222,7 @@ static int __dtpm_cpu_setup(int cpu, strif (ret) goto out_dtpm_unregister; +cpufreq_cpu_put (policy);return 0 ; out_dtpm_unregister:
@@ -227,6 +234,8 @@ out_kfree_dtpm_cpu:per_cpu (dtpm_per_cpu, cpu) =NULL ;kfree (dtpm_cpu); +release_policy: +cpufreq_cpu_put (policy);return ret; }
Greg Kroah-Hartman
maintainerPATCH 171/244 md/raid6: use valid sector values to determine if an I/O should wait on the reshape
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Jeffery <[email protected]>
commit c467e97f079f0019870c314996fae952cc768e82 upstream.
During a reshape or a RAID6 array such as expanding by adding an additional disk, I/Os to the region of the array which have not yet been reshaped can stall indefinitely. This is from errors in the stripe_ahead_of_reshape function causing md to think the I/O is to a region in the actively undergoing the reshape.
stripe_ahead_of_reshape fails to account for the q disk having a sector value of 0. By not excluding the q disk from the for loop, raid6 will always generate a min_sector value of 0, causing a return value which stalls.
The function's max_sector calculation also uses min() when it should use max(), causing the max_sector value to always be 0. During a backwards rebuild this can cause the opposite problem where it allows I/O to advance when it should wait.
Fixing these errors will allow safe I/O to advance in a timely manner and delay only I/O which is unsafe due to stripes in the middle of undergoing the reshape.
--- drivers/md/raid5.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/md/raid5.c +2 -2
@@ -5892,11 +5892,11 @@ static bool stripe_ahead_of_reshape(struint dd_idx;for (dd_idx =0 ; dd_idx < sh->disks; dd_idx++) { -if (dd_idx == sh->pd_idx) +if (dd_idx == sh->pd_idx || dd_idx == sh->qd_idx)continue ; min_sector =min (min_sector, sh->dev[dd_idx].sector); - max_sector =min (max_sector, sh->dev[dd_idx].sector); + max_sector =max (max_sector, sh->dev[dd_idx].sector); }spin_lock_irq (&conf->device_lock);
Greg Kroah-Hartman
maintainerPATCH 172/244 drm/atomic-helpers: Invoke end_fb_access while owning plane state
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
commit e0f04e41e8eedd4e5a1275f2318df7e1841855f2 upstream.
Invoke drm_plane_helper_funcs.end_fb_access before drm_atomic_helper_commit_hw_done(). The latter function hands over ownership of the plane state to the following commit, which might free it. Releasing resources in end_fb_access then operates on undefined state. This bug has been observed with non-blocking commits when they are being queued up quickly.
Here is an example stack trace from the bug report. The plane state has been free'd already, so the pages for drm_gem_fb_vunmap() are gone.
Unable to handle kernel paging request at virtual address 0000000100000049 [...] drm_gem_fb_vunmap+0x18/0x74 drm_gem_end_shadow_fb_access+0x1c/0x2c drm_atomic_helper_cleanup_planes+0x58/0xd8 drm_atomic_helper_commit_tail+0x90/0xa0 commit_tail+0x15c/0x188 commit_work+0x14/0x20
Fix this by running end_fb_access immediately after updating all planes in drm_atomic_helper_commit_planes(). The existing clean-up helper drm_atomic_helper_cleanup_planes() now only handles cleanup_fb.
For aborted commits, roll back from drm_atomic_helper_prepare_planes() in the new helper drm_atomic_helper_unprepare_planes(). This case is different from regular cleanup, as we have to release the new state; regular cleanup releases the old state. The new helper also invokes cleanup_fb for all planes.
The changes mostly involve DRM's atomic helpers. Only two drivers, i915 and nouveau, implement their own commit function. Update them to invoke drm_atomic_helper_unprepare_planes(). Drivers with custom commit_tail function do not require changes.
v4:
* fix documentation (kernel test robot)
v3:
* add drm_atomic_helper_unprepare_planes() for rolling back
* use correct state for end_fb_access
v2:
* fix test in drm_atomic_helper_cleanup_planes()
--- drivers/gpu/drm/drm_atomic_helper.c | 78 ++++++++++++++++++--------- drivers/gpu/drm/i915/display/intel_display.c | 2 drivers/gpu/drm/nouveau/dispnv50/disp.c | 2 include/drm/drm_atomic_helper.h | 2 4 files changed, 56 insertions(+), 28 deletions(-)
drivers/gpu/drm/drm_atomic_helper.c +52 -26
@@ -2012,7 +2012,7 @@ int drm_atomic_helper_commit(struct drm_return ret;drm_atomic_helper_async_commit (dev, state); -drm_atomic_helper_cleanup_planes (dev, state); +drm_atomic_helper_unprepare_planes (dev, state);return 0 ; }
@@ -2072,7 +2072,7 @@ int drm_atomic_helper_commit(struct drm_return 0 ; err: -drm_atomic_helper_cleanup_planes (dev, state); +drm_atomic_helper_unprepare_planes (dev, state);return ret; }EXPORT_SYMBOL (drm_atomic_helper_commit);
@@ -2650,6 +2650,39 @@ fail_prepare_fb: }EXPORT_SYMBOL (drm_atomic_helper_prepare_planes); +/** +* drm_atomic_helper_unprepare_planes - release plane resources on aborts +* @dev: DRM device +* @state: atomic state object with old state structures +* +* This function cleans up plane state, specifically framebuffers, from the +* atomic state. It undoes the effects of drm_atomic_helper_prepare_planes() +* when aborting an atomic commit. For cleaning up after a successful commit +* use drm_atomic_helper_cleanup_planes(). +*/ +void drm_atomic_helper_unprepare_planes (struct drm_device *dev, +struct drm_atomic_state *state) +{ +struct drm_plane *plane; +struct drm_plane_state *new_plane_state; +int i; + +for_each_new_plane_in_state (state, plane, new_plane_state, i) { +const struct drm_plane_helper_funcs *funcs = plane->helper_private; + +if (funcs->end_fb_access) + funcs->end_fb_access (plane, new_plane_state); + } + +for_each_new_plane_in_state (state, plane, new_plane_state, i) { +const struct drm_plane_helper_funcs *funcs = plane->helper_private; + +if (funcs->cleanup_fb) + funcs->cleanup_fb (plane, new_plane_state); + } +} +EXPORT_SYMBOL (drm_atomic_helper_unprepare_planes); +static bool plane_crtc_active (const struct drm_plane_state *state) {return state->crtc && state->crtc->state->active;
@@ -2784,6 +2817,17 @@ void drm_atomic_helper_commit_planes(str funcs->atomic_flush (crtc, old_state); } + +/* +* Signal end of framebuffer access here before hw_done. After hw_done, +* a later commit might have already released the plane state. +*/ +for_each_old_plane_in_state (old_state, plane, old_plane_state, i) { +const struct drm_plane_helper_funcs *funcs = plane->helper_private; + +if (funcs->end_fb_access) + funcs->end_fb_access (plane, old_plane_state); + } }EXPORT_SYMBOL (drm_atomic_helper_commit_planes);
@@ -2911,40 +2955,22 @@ EXPORT_SYMBOL(drm_atomic_helper_disable_* configuration. Hence the old configuration must be perserved in @old_state to * be able to call this function. * -* This function must also be called on the new state when the atomic update -* fails at any point after calling drm_atomic_helper_prepare_planes(). +* This function may not be called on the new state when the atomic update +* fails at any point after calling drm_atomic_helper_prepare_planes(). Use +* drm_atomic_helper_unprepare_planes() in this case. */ void drm_atomic_helper_cleanup_planes (struct drm_device *dev,struct drm_atomic_state *old_state) {struct drm_plane *plane; -struct drm_plane_state *old_plane_state, *new_plane_state; +struct drm_plane_state *old_plane_state;int i; -for_each_oldnew_plane_in_state (old_state, plane, old_plane_state, new_plane_state, i) { +for_each_old_plane_in_state (old_state, plane, old_plane_state, i) {const struct drm_plane_helper_funcs *funcs = plane->helper_private; -if (funcs->end_fb_access) - funcs->end_fb_access (plane, new_plane_state); - } - -for_each_oldnew_plane_in_state (old_state, plane, old_plane_state, new_plane_state, i) { -const struct drm_plane_helper_funcs *funcs; -struct drm_plane_state *plane_state; - -/* -* This might be called before swapping when commit is aborted, -* in which case we have to cleanup the new state. -*/ -if (old_plane_state == plane->state) - plane_state = new_plane_state; -else - plane_state = old_plane_state; - - funcs = plane->helper_private; -if (funcs->cleanup_fb) - funcs->cleanup_fb (plane, plane_state); + funcs->cleanup_fb (plane, old_plane_state); } }EXPORT_SYMBOL (drm_atomic_helper_cleanup_planes);
drivers/gpu/drm/i915/display/intel_display.c +1 -1
@@ -7279,7 +7279,7 @@ int intel_atomic_commit(struct drm_devicfor_each_new_intel_crtc_in_state (state, crtc, new_crtc_state, i)intel_color_cleanup_commit (new_crtc_state); -drm_atomic_helper_cleanup_planes (dev, &state->base); +drm_atomic_helper_unprepare_planes (dev, &state->base);intel_runtime_pm_put (&dev_priv->runtime_pm, state->wakeref);return ret; }
drivers/gpu/drm/nouveau/dispnv50/disp.c +1 -1
@@ -2310,7 +2310,7 @@ nv50_disp_atomic_commit(struct drm_devic err_cleanup:if (ret) -drm_atomic_helper_cleanup_planes (dev, state); +drm_atomic_helper_unprepare_planes (dev, state); done:pm_runtime_put_autosuspend (dev->dev);return ret;
include/drm/drm_atomic_helper.h +2 -0
@@ -97,6 +97,8 @@ void drm_atomic_helper_commit_modeset_enint drm_atomic_helper_prepare_planes (struct drm_device *dev,struct drm_atomic_state *state); +void drm_atomic_helper_unprepare_planes (struct drm_device *dev, +struct drm_atomic_state *state);#define DRM_PLANE_COMMIT_ACTIVE_ONLY BIT(0)#define DRM_PLANE_COMMIT_NO_DISABLE_AFTER_MODESET BIT(1)
Greg Kroah-Hartman
maintainerPATCH 173/244 drm/i915/mst: Fix .mode_valid_ctx() return values
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ville Syrjälä <[email protected]>
commit 7cf82b25dd91d7f330d9df2de868caca14289ba1 upstream.
.mode_valid_ctx() returns an errno, not the mode status. Fix the code to do the right thing.
--- drivers/gpu/drm/i915/display/intel_dp_mst.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/display/intel_dp_mst.c +8 -4
@@ -988,11 +988,15 @@ intel_dp_mst_mode_valid_ctx(struct drm_c* Big joiner configuration needs DSC for TGL which is not true for * XE_LPD where uncompressed joiner is supported. */ -if (DISPLAY_VER (dev_priv) <13 && bigjoiner && !dsc) -return MODE_CLOCK_HIGH ; +if (DISPLAY_VER (dev_priv) <13 && bigjoiner && !dsc) { + *status =MODE_CLOCK_HIGH ; +return 0 ; + } -if (mode_rate > max_rate && !dsc) -return MODE_CLOCK_HIGH ; +if (mode_rate > max_rate && !dsc) { + *status =MODE_CLOCK_HIGH ; +return 0 ; + } *status =intel_mode_valid_max_plane_size (dev_priv, mode, false);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 174/244 drm/i915/mst: Reject modes that require the bigjoiner
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ville Syrjälä <[email protected]>
commit dd7eb65c493615fda7d459501c3d4a46e00ea5ba upstream.
We have no bigjoiner support in the MST code, so .mode_valid() pretending otherwise is just going to result black screens for users. Reject any mode that needs the joiner.
--- drivers/gpu/drm/i915/display/intel_dp_mst.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/i915/display/intel_dp_mst.c +4 -0
@@ -955,6 +955,10 @@ intel_dp_mst_mode_valid_ctx(struct drm_cif (intel_dp_need_bigjoiner (intel_dp, mode->hdisplay, target_clock)) { bigjoiner = true; max_dotclk *=2 ; + +/* TODO: add support for bigjoiner */ + *status =MODE_CLOCK_HIGH ; +return 0 ; } if (DISPLAY_VER(dev_priv) >= 10 &&
Greg Kroah-Hartman
maintainerPATCH 175/244 drm/i915: Skip some timing checks on BXT/GLK DSI transcoders
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ville Syrjälä <[email protected]>
commit 20c2dbff342aec13bf93c2f6c951da198916a455 upstream.
Apparently some BXT/GLK systems have DSI panels whose timings don't agree with the normal cpu transcoder hblank>=32 limitation. This is perhaps fine as there are no specific hblank/etc. limits listed for the BXT/GLK DSI transcoders.
Move those checks out from the global intel_mode_valid() into into connector specific .mode_valid() hooks, skipping BXT/GLK DSI connectors. We'll leave the basic [hv]display/[hv]total checks in intel_mode_valid() as those seem like sensible upper limits regardless of the transcoder used.
--- drivers/gpu/drm/i915/display/icl_dsi.c | 7 +++++++ drivers/gpu/drm/i915/display/intel_crt.c | 5 +++++ drivers/gpu/drm/i915/display/intel_display.c | 10 ++++++++++ drivers/gpu/drm/i915/display/intel_display.h | 3 +++ drivers/gpu/drm/i915/display/intel_dp.c | 4 ++++ drivers/gpu/drm/i915/display/intel_dp_mst.c | 4 ++++ drivers/gpu/drm/i915/display/intel_dvo.c | 6 ++++++ drivers/gpu/drm/i915/display/intel_hdmi.c | 4 ++++ drivers/gpu/drm/i915/display/intel_lvds.c | 5 +++++ drivers/gpu/drm/i915/display/intel_sdvo.c | 8 +++++++- drivers/gpu/drm/i915/display/intel_tv.c | 8 +++++++- drivers/gpu/drm/i915/display/vlv_dsi.c | 18 +++++++++++++++++- 12 files changed, 79 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/display/icl_dsi.c +7 -0
@@ -1440,6 +1440,13 @@ static void gen11_dsi_post_disable(strucstatic enum drm_mode_status gen11_dsi_mode_valid (struct drm_connector *connector,struct drm_display_mode *mode) { +struct drm_i915_private *i915 =to_i915 (connector->dev); +enum drm_mode_status status; + + status =intel_cpu_transcoder_mode_valid (i915, mode); +if (status !=MODE_OK ) +return status; +/* FIXME: DSC? */ return intel_dsi_mode_valid (connector, mode); }
drivers/gpu/drm/i915/display/intel_crt.c +5 -0
@@ -348,8 +348,13 @@ intel_crt_mode_valid(struct drm_connectostruct drm_device *dev = connector->dev;struct drm_i915_private *dev_priv =to_i915 (dev);int max_dotclk = dev_priv->max_dotclk_freq; +enum drm_mode_status status;int max_clock; + status =intel_cpu_transcoder_mode_valid (dev_priv, mode); +if (status !=MODE_OK ) +return status; +if (mode->flags &DRM_MODE_FLAG_DBLSCAN )return MODE_NO_DBLESCAN ;
drivers/gpu/drm/i915/display/intel_display.c +10 -0
@@ -7660,6 +7660,16 @@ enum drm_mode_status intel_mode_valid(st mode->vtotal > vtotal_max)return MODE_V_ILLEGAL ; +return MODE_OK ; +} + +enum drm_mode_status intel_cpu_transcoder_mode_valid (struct drm_i915_private *dev_priv, +const struct drm_display_mode *mode) +{ +/* +* Additional transcoder timing limits, +* excluding BXT/GLK DSI transcoders. +*/ if (DISPLAY_VER (dev_priv) >=5 ) {if (mode->hdisplay <64 || mode->htotal - mode->hdisplay <32 )
drivers/gpu/drm/i915/display/intel_display.h +3 -0
@@ -405,6 +405,9 @@ enum drm_mode_status intel_mode_valid_max_plane_size(struct drm_i915_private *dev_priv, const struct drm_display_mode *mode, bool bigjoiner); +enum drm_mode_status +intel_cpu_transcoder_mode_valid (struct drm_i915_private *i915, +const struct drm_display_mode *mode);enum phy intel_port_to_phy (struct drm_i915_private *i915,enum port port);bool is_trans_port_sync_mode (const struct intel_crtc_state *state);bool is_trans_port_sync_master (const struct intel_crtc_state *state);
drivers/gpu/drm/i915/display/intel_dp.c +4 -0
@@ -1127,6 +1127,10 @@ intel_dp_mode_valid(struct drm_connectorenum drm_mode_status status;bool dsc = false, bigjoiner = false; + status =intel_cpu_transcoder_mode_valid (dev_priv, mode); +if (status !=MODE_OK ) +return status; +if (mode->flags &DRM_MODE_FLAG_DBLCLK )return MODE_H_ILLEGAL ;
drivers/gpu/drm/i915/display/intel_dp_mst.c +4 -0
@@ -921,6 +921,10 @@ intel_dp_mst_mode_valid_ctx(struct drm_creturn 0 ; } + *status =intel_cpu_transcoder_mode_valid (dev_priv, mode); +if (*status !=MODE_OK ) +return 0 ; +if (mode->flags &DRM_MODE_FLAG_DBLSCAN ) { *status =MODE_NO_DBLESCAN ;return 0 ;
drivers/gpu/drm/i915/display/intel_dvo.c +6 -0
@@ -217,11 +217,17 @@ intel_dvo_mode_valid(struct drm_connecto struct drm_display_mode *mode) {struct intel_connector *connector =to_intel_connector (_connector); +struct drm_i915_private *i915 =to_i915 (connector->base.dev);struct intel_dvo *intel_dvo =intel_attached_dvo (connector);const struct drm_display_mode *fixed_mode =intel_panel_fixed_mode (connector, mode);int max_dotclk =to_i915 (connector->base.dev)->max_dotclk_freq;int target_clock = mode->clock; +enum drm_mode_status status; + + status =intel_cpu_transcoder_mode_valid (i915, mode); +if (status !=MODE_OK ) +return status;if (mode->flags &DRM_MODE_FLAG_DBLSCAN )return MODE_NO_DBLESCAN ;
drivers/gpu/drm/i915/display/intel_hdmi.c +4 -0
@@ -1986,6 +1986,10 @@ intel_hdmi_mode_valid(struct drm_connectbool ycbcr_420_only;enum intel_output_format sink_format; + status =intel_cpu_transcoder_mode_valid (dev_priv, mode); +if (status !=MODE_OK ) +return status; +if ((mode->flags &DRM_MODE_FLAG_3D_MASK ) ==DRM_MODE_FLAG_3D_FRAME_PACKING ) clock *=2 ;
drivers/gpu/drm/i915/display/intel_lvds.c +5 -0
@@ -389,11 +389,16 @@ intel_lvds_mode_valid(struct drm_connect struct drm_display_mode *mode) {struct intel_connector *connector =to_intel_connector (_connector); +struct drm_i915_private *i915 =to_i915 (connector->base.dev);const struct drm_display_mode *fixed_mode =intel_panel_fixed_mode (connector, mode);int max_pixclk =to_i915 (connector->base.dev)->max_dotclk_freq;enum drm_mode_status status; + status =intel_cpu_transcoder_mode_valid (i915, mode); +if (status !=MODE_OK ) +return status; +if (mode->flags &DRM_MODE_FLAG_DBLSCAN )return MODE_NO_DBLESCAN ;
drivers/gpu/drm/i915/display/intel_sdvo.c +7 -1
@@ -1906,13 +1906,19 @@ static enum drm_mode_status intel_sdvo_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) { + struct drm_i915_private *i915 = to_i915(connector->dev);struct intel_sdvo *intel_sdvo =intel_attached_sdvo (to_intel_connector (connector));struct intel_sdvo_connector *intel_sdvo_connector =to_intel_sdvo_connector (connector); -int max_dotclk =to_i915 (connector->dev)->max_dotclk_freq;bool has_hdmi_sink =intel_has_hdmi_sink (intel_sdvo_connector, connector->state); +int max_dotclk = i915->max_dotclk_freq; +enum drm_mode_status status;int clock = mode->clock; + status =intel_cpu_transcoder_mode_valid (i915, mode); +if (status !=MODE_OK ) +return status; +if (mode->flags &DRM_MODE_FLAG_DBLSCAN )return MODE_NO_DBLESCAN ;
drivers/gpu/drm/i915/display/intel_tv.c +7 -1
@@ -958,8 +958,14 @@ static enum drm_mode_status intel_tv_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) { + struct drm_i915_private *i915 = to_i915(connector->dev);const struct tv_mode *tv_mode =intel_tv_mode_find (connector->state); -int max_dotclk =to_i915 (connector->dev)->max_dotclk_freq; +int max_dotclk = i915->max_dotclk_freq; +enum drm_mode_status status; + + status =intel_cpu_transcoder_mode_valid (i915, mode); +if (status !=MODE_OK ) +return status;if (mode->flags &DRM_MODE_FLAG_DBLSCAN )return MODE_NO_DBLESCAN ;
drivers/gpu/drm/i915/display/vlv_dsi.c +17 -1
@@ -1540,9 +1540,25 @@ static const struct drm_encoder_funcs in .destroy = intel_dsi_encoder_destroy, }; +static enum drm_mode_status vlv_dsi_mode_valid (struct drm_connector *connector, +struct drm_display_mode *mode) +{ +struct drm_i915_private *i915 =to_i915 (connector->dev); + +if (IS_VALLEYVIEW (i915) ||IS_CHERRYVIEW (i915)) { +enum drm_mode_status status; + + status =intel_cpu_transcoder_mode_valid (i915, mode); +if (status !=MODE_OK ) +return status; + } + +return intel_dsi_mode_valid (connector, mode); +} +static const struct drm_connector_helper_funcs intel_dsi_connector_helper_funcs = { .get_modes = intel_dsi_get_modes, - .mode_valid = intel_dsi_mode_valid, + .mode_valid = vlv_dsi_mode_valid, .atomic_check = intel_digital_connector_atomic_check, };
Greg Kroah-Hartman
maintainerPATCH 176/244 arm64: dts: mt7986: change cooling trips
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Wunderlich <[email protected]>
commit 1fcda8ceb014aafd56f10b33e0077c93b5dd45d1 upstream.
Add Critical and hot trips for emergency system shutdown and limiting system load.
Change passive trip to active to make sure fan is activated on the lowest trip.
--- arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts | 10 +++---- arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 20 ++++++++++++--- 2 files changed, 21 insertions(+), 9 deletions(-)
arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts +5 -5
@@ -150,16 +150,16 @@ trip = <&cpu_trip_active_high>; }; - cpu-active-low { + cpu-active-med { /* active: set fan to cooling level 1 */ cooling-device = <&fan 1 1>; - trip = <&cpu_trip_active_low>; + trip = <&cpu_trip_active_med>; }; - cpu-passive { - /* passive: set fan to cooling level 0 */ + cpu-active-low { + /* active: set fan to cooling level 0 */ cooling-device = <&fan 0 0>; - trip = <&cpu_trip_passive>; + trip = <&cpu_trip_active_low>; }; }; };
arch/arm64/boot/dts/mediatek/mt7986a.dtsi +16 -4
@@ -610,22 +610,34 @@ thermal-sensors = <&thermal 0>; trips { + cpu_trip_crit: crit { + temperature = <125000>; + hysteresis = <2000>; + type = "critical"; + }; + + cpu_trip_hot: hot { + temperature = <120000>; + hysteresis = <2000>; + type = "hot"; + }; + cpu_trip_active_high: active-high { temperature = <115000>; hysteresis = <2000>; type = "active"; }; - cpu_trip_active_low: active-low { + cpu_trip_active_med: active-med { temperature = <85000>; hysteresis = <2000>; type = "active"; }; - cpu_trip_passive: passive { - temperature = <40000>; + cpu_trip_active_low: active-low { + temperature = <60000>; hysteresis = <2000>; - type = "passive"; + type = "active"; }; }; };
Greg Kroah-Hartman
maintainerPATCH 177/244 arm64: dts: mt7986: define 3W max power to both SFP on BPI-R3
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Wunderlich <[email protected]>
commit 6413cbc17f89b3a160f3a6f3fad1232b1678fe40 upstream.
All SFP power supplies are connected to the system VDD33 which is 3v3/8A. Set 3A per SFP slot to allow SFPs work which need more power than the default 1W.
--- arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts +2 -0
@@ -126,6 +126,7 @@ sfp1: sfp-1 { compatible = "sff,sfp"; i2c-bus = <&i2c_sfp1>; los-gpios = <&pio 46 GPIO_ACTIVE_HIGH>; + maximum-power-milliwatt = <3000>; mod-def0-gpios = <&pio 49 GPIO_ACTIVE_LOW>; tx-disable-gpios = <&pio 20 GPIO_ACTIVE_HIGH>; tx-fault-gpios = <&pio 7 GPIO_ACTIVE_HIGH>;
@@ -137,6 +138,7 @@ sfp2: sfp-2 { i2c-bus = <&i2c_sfp2>; los-gpios = <&pio 31 GPIO_ACTIVE_HIGH>; mod-def0-gpios = <&pio 47 GPIO_ACTIVE_LOW>; + maximum-power-milliwatt = <3000>; tx-disable-gpios = <&pio 15 GPIO_ACTIVE_HIGH>; tx-fault-gpios = <&pio 48 GPIO_ACTIVE_HIGH>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/244 arm64: dts: mt7986: fix emmc hs400 mode without uboot initialization
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Woudstra <[email protected]>
commit 8dfe51c3f6ef31502fca3e2da8cd250ebbe4b8f2 upstream.
Eric reports errors on emmc with hs400 mode when booting linux on bpi-r3 without uboot [1]. Booting with uboot does not show this because clocks seem to be initialized by uboot.
Fix this by adding assigned-clocks and assigned-clock-parents like it's done in uboot [2].
[1] https://forum.banana-pi.org/t/bpi-r3-kernel-fails-setting-emmc-clock-to-416m-depends-on-u-boot/15170
[2] https://github.com/u-boot/u-boot/blob/master/arch/arm/dts/mt7986.dtsi#L287
--- arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm64/boot/dts/mediatek/mt7986a.dtsi +4 -0
@@ -374,6 +374,10 @@ mmc0: mmc@11230000 { reg = <0 0x11230000 0 0x1000>, <0 0x11c20000 0 0x1000>; interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>; + assigned-clocks = <&topckgen CLK_TOP_EMMC_416M_SEL>, + <&topckgen CLK_TOP_EMMC_250M_SEL>; + assigned-clock-parents = <&apmixedsys CLK_APMIXED_MPLL>, + <&topckgen CLK_TOP_NET1PLL_D5_D2>; clocks = <&topckgen CLK_TOP_EMMC_416M_SEL>, <&infracfg CLK_INFRA_MSDC_HCK_CK>, <&infracfg CLK_INFRA_MSDC_CK>,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/244 arm64: dts: mediatek: mt7622: fix memory node warning check
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eugen Hristev <[email protected]>
commit 8e6ecbfd44b5542a7598c1c5fc9c6dcb5d367f2a upstream.
dtbs_check throws a warning at the memory node:
Warning (unit_address_vs_reg): /memory: node has a reg or ranges property, but no unit name
fix by adding the address into the node name.
--- arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts | 2 +- arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +1 -1
@@ -73,7 +73,7 @@ }; }; - memory { + memory@40000000 { reg = <0 0x40000000 0 0x40000000>; };
arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts +1 -1
@@ -55,7 +55,7 @@ }; }; - memory { + memory@40000000 { reg = <0 0x40000000 0 0x20000000>; };
Greg Kroah-Hartman
maintainerPATCH 180/244 arm64: dts: mediatek: mt8183-kukui-jacuzzi: fix dsi unnecessary cells properties
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eugen Hristev <[email protected]>
commit 74543b303a9abfe4fa253d1fa215281baa05ff3a upstream.
dtbs_check throws a warning at the dsi node:
Warning (avoid_unnecessary_addr_size): /soc/dsi@14014000: unnecessary #address-cells/#size-cells without "ranges" or child "reg" property
Other DTS have a panel child node with a reg, so the parent dtsi must have the address-cells and size-cells, however this specific DT has the panel removed, but not the cells, hence the warning above.
If panel is deleted then the cells must also be deleted since they are tied together, as the child node in this DT does not have a reg.
--- arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi +2 -0
@@ -91,6 +91,8 @@ &dsi0 { status = "okay"; + /delete-property/#size-cells; + /delete-property/#address-cells; /delete-node/panel@0; ports { port {
Greg Kroah-Hartman
maintainerPATCH 181/244 arm64: dts: mediatek: cherry: Fix interrupt cells for MT6360 on I2C7
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
commit 5943b8f7449df9881b273db07bdde1e7120dccf0 upstream.
Change interrupt cells to 2 to suppress interrupts_property warning.
--- arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi +1 -1
@@ -362,7 +362,7 @@ pinctrl-0 = <&i2c7_pins>; pmic@34 { - #interrupt-cells = <1>; + #interrupt-cells = <2>; compatible = "mediatek,mt6360"; reg = <0x34>; interrupt-controller;
Greg Kroah-Hartman
maintainerPATCH 182/244 arm64: dts: mediatek: mt8173-evb: Fix regulator-fixed node names
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
commit 24165c5dad7ba7c7624d05575a5e0cc851396c71 upstream.
Fix a unit_address_vs_reg warning for the USB VBUS fixed regulators by renaming the regulator nodes from regulator@{0,1} to regulator-usb-p0 and regulator-usb-p1.
--- arch/arm64/boot/dts/mediatek/mt8173-evb.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt8173-evb.dts +2 -2
@@ -44,7 +44,7 @@ id-gpio = <&pio 16 GPIO_ACTIVE_HIGH>; }; - usb_p1_vbus: regulator@0 { + usb_p1_vbus: regulator-usb-p1 { compatible = "regulator-fixed"; regulator-name = "usb_vbus"; regulator-min-microvolt = <5000000>;
@@ -53,7 +53,7 @@ enable-active-high; }; - usb_p0_vbus: regulator@1 { + usb_p0_vbus: regulator-usb-p0 { compatible = "regulator-fixed"; regulator-name = "vbus"; regulator-min-microvolt = <5000000>;
Greg Kroah-Hartman
maintainerPATCH 183/244 arm64: dts: mediatek: mt8195: Fix PM suspend/resume with venc clocks
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
commit 61b94d54421a1f3670ddd5396ec70afe833e9405 upstream.
Before suspending the LARBs we're making sure that any operation is
done: this never happens because we are unexpectedly unclocking the LARB20 before executing the suspend handler for the MediaTek Smart Multimedia Interface (SMI) and the cause of this is incorrect clocks on this LARB.
Fix this issue by changing the Local Arbiter 20 (used by the video encoder secondary core) apb clock to CLK_VENC_CORE1_VENC; furthermore, in order to make sure that both the PM resume and video encoder operation is stable, add the CLK_VENC(_CORE1)_LARB clock to the VENC (main core) and VENC_CORE1 power domains, as this IP cannot communicate with the rest of the system (the AP) without local arbiter clocks being operational.
--- arch/arm64/boot/dts/mediatek/mt8195.dtsi | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt8195.dtsi +5 -1
@@ -627,6 +627,8 @@ power-domain@MT8195_POWER_DOMAIN_VENC_CORE1 { reg = <MT8195_POWER_DOMAIN_VENC_CORE1>; + clocks = <&vencsys_core1 CLK_VENC_CORE1_LARB>; + clock-names = "venc1-larb"; mediatek,infracfg = <&infracfg_ao>; #power-domain-cells = <0>; };
@@ -689,6 +691,8 @@ power-domain@MT8195_POWER_DOMAIN_VENC { reg = <MT8195_POWER_DOMAIN_VENC>; + clocks = <&vencsys CLK_VENC_LARB>; + clock-names = "venc0-larb"; mediatek,infracfg = <&infracfg_ao>; #power-domain-cells = <0>; };
@@ -2665,7 +2669,7 @@ reg = <0 0x1b010000 0 0x1000>; mediatek,larb-id = <20>; mediatek,smi = <&smi_common_vpp>; - clocks = <&vencsys_core1 CLK_VENC_CORE1_LARB>, + clocks = <&vencsys_core1 CLK_VENC_CORE1_VENC>, <&vencsys_core1 CLK_VENC_CORE1_GALS>, <&vppsys0 CLK_VPP0_GALS_VDO0_VDO1_VENCSYS_CORE1>; clock-names = "apb", "smi", "gals";
Greg Kroah-Hartman
maintainerPATCH 184/244 arm64: dts: mediatek: mt8183: Fix unit address for scp reserved memory
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
commit 19cba9a6c071db57888dc6b2ec1d9bf8996ea681 upstream.
The reserved memory for scp had node name "scp_mem_region" and also without unit-address: change the name to "memory@(address)". This fixes a unit_address_vs_reg warning.
--- arch/arm64/boot/dts/mediatek/mt8183-evb.dts | 2 +- arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/mediatek/mt8183-evb.dts +1 -1
@@ -31,7 +31,7 @@ #address-cells = <2>; #size-cells = <2>; ranges; - scp_mem_reserved: scp_mem_region { + scp_mem_reserved: memory@50000000 { compatible = "shared-dma-pool"; reg = <0 0x50000000 0 0x2900000>; no-map;
arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +1 -1
@@ -108,7 +108,7 @@ #size-cells = <2>; ranges; - scp_mem_reserved: scp_mem_region { + scp_mem_reserved: memory@50000000 { compatible = "shared-dma-pool"; reg = <0 0x50000000 0 0x2900000>; no-map;
Greg Kroah-Hartman
maintainerPATCH 185/244 arm64: dts: mediatek: mt8183: Move thermal-zones to the root node
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
commit 5a60d63439694590cd5ab1f998fc917ff7ba1c1d upstream.
The thermal zones are not a soc bus device: move it to the root node to solve simple_bus_reg warnings.
--- arch/arm64/boot/dts/mediatek/mt8183.dtsi | 242 +++++++++++++++---------------- 1 file changed, 121 insertions(+), 121 deletions(-)
arch/arm64/boot/dts/mediatek/mt8183.dtsi +121 -121
@@ -1210,127 +1210,6 @@ nvmem-cell-names = "calibration-data"; }; - thermal_zones: thermal-zones { - cpu_thermal: cpu-thermal { - polling-delay-passive = <100>; - polling-delay = <500>; - thermal-sensors = <&thermal 0>; - sustainable-power = <5000>; - - trips { - threshold: trip-point0 { - temperature = <68000>; - hysteresis = <2000>; - type = "passive"; - }; - - target: trip-point1 { - temperature = <80000>; - hysteresis = <2000>; - type = "passive"; - }; - - cpu_crit: cpu-crit { - temperature = <115000>; - hysteresis = <2000>; - type = "critical"; - }; - }; - - cooling-maps { - map0 { - trip = <&target>; - cooling-device = <&cpu0 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu1 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu2 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu3 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>; - contribution = <3072>; - }; - map1 { - trip = <&target>; - cooling-device = <&cpu4 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu5 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu6 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu7 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>; - contribution = <1024>; - }; - }; - }; - - /* The tzts1 ~ tzts6 don't need to polling */ - /* The tzts1 ~ tzts6 don't need to thermal throttle */ - - tzts1: tzts1 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 1>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tzts2: tzts2 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 2>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tzts3: tzts3 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 3>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tzts4: tzts4 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 4>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tzts5: tzts5 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 5>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tztsABB: tztsABB { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 6>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - }; - pwm0: pwm@1100e000 { compatible = "mediatek,mt8183-disp-pwm"; reg = <0 0x1100e000 0 0x1000>;
@@ -2105,4 +1984,125 @@ power-domains = <&spm MT8183_POWER_DOMAIN_CAM>; }; }; + + thermal_zones: thermal-zones { + cpu_thermal: cpu-thermal { + polling-delay-passive = <100>; + polling-delay = <500>; + thermal-sensors = <&thermal 0>; + sustainable-power = <5000>; + + trips { + threshold: trip-point0 { + temperature = <68000>; + hysteresis = <2000>; + type = "passive"; + }; + + target: trip-point1 { + temperature = <80000>; + hysteresis = <2000>; + type = "passive"; + }; + + cpu_crit: cpu-crit { + temperature = <115000>; + hysteresis = <2000>; + type = "critical"; + }; + }; + + cooling-maps { + map0 { + trip = <&target>; + cooling-device = <&cpu0 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu1 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu2 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu3 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>; + contribution = <3072>; + }; + map1 { + trip = <&target>; + cooling-device = <&cpu4 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu5 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu6 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu7 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>; + contribution = <1024>; + }; + }; + }; + + /* The tzts1 ~ tzts6 don't need to polling */ + /* The tzts1 ~ tzts6 don't need to thermal throttle */ + + tzts1: tzts1 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 1>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts2: tzts2 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 2>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts3: tzts3 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 3>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts4: tzts4 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 4>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts5: tzts5 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 5>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tztsABB: tztsABB { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 6>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + }; };
Greg Kroah-Hartman
maintainerPATCH 186/244 arm64: dts: mediatek: mt8183-evb: Fix unit_address_vs_reg warning on ntc
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
commit 9dea1c724fc36643e83216c1f5a26613412150db upstream.
The NTC is defined as ntc@0 but it doesn't need any address at all. Fix the unit_address_vs_reg warning by dropping the unit address: since the node name has to be generic also fully rename it from ntc@0 to thermal-sensor.
--- arch/arm64/boot/dts/mediatek/mt8183-evb.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt8183-evb.dts +1 -1
@@ -38,7 +38,7 @@ }; }; - ntc@0 { + thermal-sensor { compatible = "murata,ncp03wf104"; pullup-uv = <1800000>; pullup-ohm = <390000>;
Greg Kroah-Hartman
maintainerPATCH 187/244 arm64: dts: mediatek: mt8186: fix clock names for power domains
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eugen Hristev <[email protected]>
commit 9adf7580f6d498a5839e02fa1d1535e934364602 upstream.
Clocks for each power domain are split into big categories: pd clocks and subsys clocks.
According to the binding, all clocks which have a dash '-' in their name are treated as subsys clocks, and must be placed at the end of the list. The other clocks which are pd clocks must come first.
Fixed the naming and the placing of all clocks in the power domains. For the avoidance of doubt, prefixed all subsys clocks with the 'subsys' prefix. The binding does not enforce strict clock names, the driver uses them in bulk, only making a difference for pd clocks vs subsys clocks.
The above problem appears to be trivial, however, it leads to incorrect power up and power down sequence of the power domains, because some clocks will be mistakenly taken for subsys clocks and viceversa. One consequence is the fact that if the DIS power domain goes power down and power back up during the boot process, when it comes back up, there are still transactions left on the bus which makes the display inoperable.
Some of the clocks for the DIS power domain were wrongly using '_' instead of '-', which again made these clocks being treated as pd clocks instead of subsys clocks.
--- arch/arm64/boot/dts/mediatek/mt8186.dtsi | 42 +++++++++++++++--------- 1 file changed, 27 insertions(+), 15 deletions(-)
arch/arm64/boot/dts/mediatek/mt8186.dtsi +27 -15
@@ -924,7 +924,8 @@ power-domain@MT8186_POWER_DOMAIN_CSIRX_TOP { reg = <MT8186_POWER_DOMAIN_CSIRX_TOP>; clocks = <&topckgen CLK_TOP_SENINF>, <&topckgen CLK_TOP_SENINF1>; - clock-names = "csirx_top0", "csirx_top1"; + clock-names = "subsys-csirx-top0", + "subsys-csirx-top1"; #power-domain-cells = <0>; };
@@ -942,7 +943,8 @@ power-domain@MT8186_POWER_DOMAIN_ADSP_AO { reg = <MT8186_POWER_DOMAIN_ADSP_AO>; clocks = <&topckgen CLK_TOP_AUDIODSP>, <&topckgen CLK_TOP_ADSP_BUS>; - clock-names = "audioadsp", "adsp_bus"; + clock-names = "audioadsp", + "subsys-adsp-bus"; #address-cells = <1>; #size-cells = <0>; #power-domain-cells = <1>;
@@ -975,8 +977,11 @@ power-domain@MT8186_POWER_DOMAIN_DIS { <&mmsys CLK_MM_SMI_COMMON>, <&mmsys CLK_MM_SMI_GALS>, <&mmsys CLK_MM_SMI_IOMMU>; - clock-names = "disp", "mdp", "smi_infra", "smi_common", - "smi_gals", "smi_iommu"; + clock-names = "disp", "mdp", + "subsys-smi-infra", + "subsys-smi-common", + "subsys-smi-gals", + "subsys-smi-iommu"; mediatek,infracfg = <&infracfg_ao>; #address-cells = <1>; #size-cells = <0>;
@@ -993,15 +998,17 @@ power-domain@MT8186_POWER_DOMAIN_VDEC { power-domain@MT8186_POWER_DOMAIN_CAM { reg = <MT8186_POWER_DOMAIN_CAM>; - clocks = <&topckgen CLK_TOP_CAM>, - <&topckgen CLK_TOP_SENINF>, + clocks = <&topckgen CLK_TOP_SENINF>, <&topckgen CLK_TOP_SENINF1>, <&topckgen CLK_TOP_SENINF2>, <&topckgen CLK_TOP_SENINF3>, + <&camsys CLK_CAM2MM_GALS>, <&topckgen CLK_TOP_CAMTM>, - <&camsys CLK_CAM2MM_GALS>; - clock-names = "cam-top", "cam0", "cam1", "cam2", - "cam3", "cam-tm", "gals"; + <&topckgen CLK_TOP_CAM>; + clock-names = "cam0", "cam1", "cam2", + "cam3", "gals", + "subsys-cam-tm", + "subsys-cam-top"; mediatek,infracfg = <&infracfg_ao>; #address-cells = <1>; #size-cells = <0>;
@@ -1020,9 +1027,9 @@ power-domain@MT8186_POWER_DOMAIN_CAM_RAWA { power-domain@MT8186_POWER_DOMAIN_IMG { reg = <MT8186_POWER_DOMAIN_IMG>; - clocks = <&topckgen CLK_TOP_IMG1>, - <&imgsys1 CLK_IMG1_GALS_IMG1>; - clock-names = "img-top", "gals"; + clocks = <&imgsys1 CLK_IMG1_GALS_IMG1>, + <&topckgen CLK_TOP_IMG1>; + clock-names = "gals", "subsys-img-top"; mediatek,infracfg = <&infracfg_ao>; #address-cells = <1>; #size-cells = <0>;
@@ -1041,8 +1048,11 @@ power-domain@MT8186_POWER_DOMAIN_IPE { <&ipesys CLK_IPE_LARB20>, <&ipesys CLK_IPE_SMI_SUBCOM>, <&ipesys CLK_IPE_GALS_IPE>; - clock-names = "ipe-top", "ipe-larb0", "ipe-larb1", - "ipe-smi", "ipe-gals"; + clock-names = "subsys-ipe-top", + "subsys-ipe-larb0", + "subsys-ipe-larb1", + "subsys-ipe-smi", + "subsys-ipe-gals"; mediatek,infracfg = <&infracfg_ao>; #power-domain-cells = <0>; };
@@ -1061,7 +1071,9 @@ power-domain@MT8186_POWER_DOMAIN_WPE { clocks = <&topckgen CLK_TOP_WPE>, <&wpesys CLK_WPE_SMI_LARB8_CK_EN>, <&wpesys CLK_WPE_SMI_LARB8_PCLK_EN>; - clock-names = "wpe0", "larb-ck", "larb-pclk"; + clock-names = "wpe0", + "subsys-larb-ck", + "subsys-larb-pclk"; mediatek,infracfg = <&infracfg_ao>; #power-domain-cells = <0>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 188/244 arm64: dts: mediatek: mt8186: Change gpu speedbin nvmem cell name
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
commit 59fa1e51ba54e1f513985a8177969b62973f7fd5 upstream.
MT8186's GPU speedbin value must be interpreted, or the value will not be meaningful.
Use the correct "gpu-speedbin" nvmem cell name for the GPU speedbin to allow triggering the cell info fixup handler, hence feeding the right speedbin number to the users.
--- arch/arm64/boot/dts/mediatek/mt8186.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt8186.dtsi +1 -1
@@ -1668,7 +1668,7 @@ #address-cells = <1>; #size-cells = <1>; - gpu_speedbin: gpu-speed-bin@59c { + gpu_speedbin: gpu-speedbin@59c { reg = <0x59c 0x4>; bits = <0 3>; };
Greg Kroah-Hartman
maintainerPATCH 189/244 coresight: etm4x: Remove bogous __exit annotation for some functions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit 348ddab81f7b0983d9fb158df910254f08d3f887 ]
etm4_platform_driver (which lives in ".data" contains a reference to etm4_remove_platform_dev(). So the latter must not be marked with __exit which results in the function being discarded for a build with CONFIG_CORESIGHT_SOURCE_ETM4X=y which in turn makes the remove pointer contain invalid data.
etm4x_amba_driver referencing etm4_remove_amba() has the same issue.
Drop the __exit annotations for the two affected functions and a third one that is called by the other two.
For reasons I don't understand this isn't catched by building with CONFIG_DEBUG_SECTION_MISMATCH=y.
--- drivers/hwtracing/coresight/coresight-etm4x-core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x-core.c +3 -3
@@ -2224,7 +2224,7 @@ static void clear_etmdrvdata(void *info)per_cpu (delayed_probe, cpu) =NULL ; } -static void __exit etm4_remove_dev(struct etmv4_drvdata *drvdata) +static void etm4_remove_dev (struct etmv4_drvdata *drvdata) {bool had_delayed_probe;/*
@@ -2253,7 +2253,7 @@ static void __exit etm4_remove_dev(struct etmv4_drvdata *drvdata) } } -static void __exit etm4_remove_amba(struct amba_device *adev) +static void etm4_remove_amba (struct amba_device *adev) {struct etmv4_drvdata *drvdata =dev_get_drvdata (&adev->dev);
@@ -2261,7 +2261,7 @@ static void __exit etm4_remove_amba(struct amba_device *adev)etm4_remove_dev (drvdata); } -static int __exit etm4_remove_platform_dev(struct platform_device *pdev) +static int etm4_remove_platform_dev (struct platform_device *pdev) {struct etmv4_drvdata *drvdata =dev_get_drvdata (&pdev->dev);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 190/244 coresight: Fix crash when Perf and sysfs modes are used concurrently
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 287e82cf69aa264a52bc37591bd0eb407e20f85c ]
Partially revert the change in commit 6148652807ba ("coresight: Enable and disable helper devices adjacent to the path") which changed the bare call from source_ops(csdev)->enable() to coresight_enable_source() for Perf sessions. It was missed that coresight_enable_source() is specifically for the sysfs interface, rather than being a generic call. This interferes with the sysfs reference counting to cause the following crash:
$ perf record -e cs_etm/@tmc_etr0/ -C 0 & $ echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink $ echo 1 > /sys/bus/coresight/devices/etm0/enable_source $ echo 0 > /sys/bus/coresight/devices/etm0/enable_source
Unable to handle kernel NULL pointer dereference at virtual address 00000000000001d0 Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP ... Call trace: etm4_disable+0x54/0x150 [coresight_etm4x] coresight_disable_source+0x6c/0x98 [coresight] coresight_disable+0x74/0x1c0 [coresight] enable_source_store+0x88/0xa0 [coresight] dev_attr_store+0x20/0x40 sysfs_kf_write+0x4c/0x68 kernfs_fop_write_iter+0x120/0x1b8 vfs_write+0x2dc/0x3b0 ksys_write+0x70/0x108 __arm64_sys_write+0x24/0x38 invoke_syscall+0x50/0x128 el0_svc_common.constprop.0+0x104/0x130 do_el0_svc+0x40/0xb8 el0_svc+0x2c/0xb8 el0t_64_sync_handler+0xc0/0xc8 el0t_64_sync+0x1a4/0x1a8 Code: d53cd042 91002000 b9402a81 b8626800 (f940ead5) ---[ end trace 0000000000000000 ]---
This commit linked below also fixes the issue, but has unlocked updates to the mode which could potentially race. So until we come up with a more complete solution that takes all locking and interaction between both modes into account, just revert back to the old behavior for Perf.
--- drivers/hwtracing/coresight/coresight-etm-perf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hwtracing/coresight/coresight-etm-perf.c +2 -2
@@ -493,7 +493,7 @@ static void etm_event_start(struct perf_event *event, int flags) goto fail_end_stop;/* Finally enable the tracer */ -if (coresight_enable_source (csdev,CS_MODE_PERF , event)) +if (source_ops (csdev)->enable (csdev, event,CS_MODE_PERF )) goto fail_disable_path;/*
@@ -587,7 +587,7 @@ static void etm_event_stop(struct perf_event *event, int mode)return ;/* stop tracer */ -coresight_disable_source (csdev, event); +source_ops (csdev)->disable (csdev, event);/* tell the core */ event->hw.state =PERF_HES_STOPPED ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 191/244 hwtracing: hisi_ptt: Add dummy callback pmu::read()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junhao He <[email protected]>
[ Upstream commit 55e0a2fb0cb5ab7c9c99c1ad4d3e6954de8b73a0 ]
When start trace with perf option "-C $cpu" and immediately stop it with SIGTERM or others, the perf core will invoke pmu::read() while the driver doesn't implement it. Add a dummy pmu::read() to avoid any issues.
--- drivers/hwtracing/ptt/hisi_ptt.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/hwtracing/ptt/hisi_ptt.c +5 -0
@@ -1178,6 +1178,10 @@ static void hisi_ptt_pmu_del(struct perf_event *event, int flags)hisi_ptt_pmu_stop (event,PERF_EF_UPDATE ); } +static void hisi_ptt_pmu_read (struct perf_event *event) +{ +} +static void hisi_ptt_remove_cpuhp_instance (void *hotplug_node) {cpuhp_state_remove_instance_nocalls (hisi_ptt_pmu_online, hotplug_node);
@@ -1221,6 +1225,7 @@ static int hisi_ptt_register_pmu(struct hisi_ptt *hisi_ptt) .stop = hisi_ptt_pmu_stop, .add = hisi_ptt_pmu_add, .del = hisi_ptt_pmu_del, + .read = hisi_ptt_pmu_read, }; reg =readl (hisi_ptt->iobase +HISI_PTT_LOCATION );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 192/244 coresight: ultrasoc-smb: Fix sleep while close preempt in enable_smb
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junhao He <[email protected]>
[ Upstream commit b8411287aef4a994eff0c68f5597910c4194dfe3 ]
When we to enable the SMB by perf, the perf sched will call perf_ctx_lock() to close system preempt in event_function_call(). But SMB::enable_smb() use mutex to lock the critical section, which may sleep.
BUG: sleeping function called from invalid context at kernel/locking/mutex.c:580 in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 153023, name: perf preempt_count: 2, expected: 0 RCU nest depth: 0, expected: 0 INFO: lockdep is turned off. irq event stamp: 0 hardirqs last enabled at (0): [<0000000000000000>] 0x0 hardirqs last disabled at (0): [<ffffa2983f5c5f40>] copy_process+0xae8/0x2b48 softirqs last enabled at (0): [<ffffa2983f5c5f40>] copy_process+0xae8/0x2b48 softirqs last disabled at (0): [<0000000000000000>] 0x0 CPU: 2 PID: 153023 Comm: perf Kdump: loaded Tainted: G W O 6.5.0-rc4+ #1 Call trace: ... __mutex_lock+0xbc/0xa70 mutex_lock_nested+0x34/0x48 smb_update_buffer+0x58/0x360 [ultrasoc_smb] etm_event_stop+0x204/0x2d8 [coresight] etm_event_del+0x1c/0x30 [coresight] event_sched_out+0x17c/0x3b8 group_sched_out.part.0+0x5c/0x208 __perf_event_disable+0x15c/0x210 event_function+0xe0/0x230 remote_function+0xb4/0xe8 generic_exec_single+0x160/0x268 smp_call_function_single+0x20c/0x2a0 event_function_call+0x20c/0x220 _perf_event_disable+0x5c/0x90 perf_event_for_each_child+0x58/0xc0 _perf_ioctl+0x34c/0x1250 perf_ioctl+0x64/0x98 ...
Use spinlock to replace mutex to control driver data access to one at a time. The function copy_to_user() may sleep, it cannot be in a spinlock context, so we can't simply replace it in smb_read(). But we can ensure that only one user gets the SMB device fd by smb_open(), so remove the locks from smb_read() and buffer synchronization is guaranteed by the user.
--- drivers/hwtracing/coresight/ultrasoc-smb.c | 35 +++++++++------------- drivers/hwtracing/coresight/ultrasoc-smb.h | 6 ++-- 2 files changed, 17 insertions(+), 24 deletions(-)
drivers/hwtracing/coresight/ultrasoc-smb.c +14 -21
@@ -99,7 +99,7 @@ static int smb_open(struct inode *inode, struct file *file) struct smb_drv_data, miscdev);int ret =0 ; -mutex_lock (&drvdata->mutex); +spin_lock (&drvdata->spinlock);if (drvdata->reading) { ret = -EBUSY ;
@@ -115,7 +115,7 @@ static int smb_open(struct inode *inode, struct file *file) drvdata->reading = true; out: -mutex_unlock (&drvdata->mutex); +spin_unlock (&drvdata->spinlock);return ret; }
@@ -132,10 +132,8 @@ static ssize_t smb_read(struct file *file, char __user *data, size_t len,if (!len)return 0 ; -mutex_lock (&drvdata->mutex); -if (!sdb->data_size) - goto out; +return 0 ; to_copy =min (sdb->data_size, len);
@@ -145,20 +143,15 @@ static ssize_t smb_read(struct file *file, char __user *data, size_t len,if (copy_to_user (data, sdb->buf_base + sdb->buf_rdptr, to_copy)) {dev_dbg (dev,"Failed to copy data to user\n" ); - to_copy = -EFAULT ; - goto out; +return -EFAULT ; } *ppos += to_copy; -smb_update_read_ptr (drvdata, to_copy); - -dev_dbg (dev,"%zu bytes copied\n" , to_copy); -out:if (!sdb->data_size)smb_reset_buffer (drvdata); -mutex_unlock (&drvdata->mutex); +dev_dbg (dev,"%zu bytes copied\n" , to_copy);return to_copy; }
@@ -167,9 +160,9 @@ static int smb_release(struct inode *inode, struct file *file)struct smb_drv_data *drvdata =container_of (file->private_data, struct smb_drv_data, miscdev); -mutex_lock (&drvdata->mutex); +spin_lock (&drvdata->spinlock); drvdata->reading = false; -mutex_unlock (&drvdata->mutex); +spin_unlock (&drvdata->spinlock);return 0 ; }
@@ -262,7 +255,7 @@ static int smb_enable(struct coresight_device *csdev, enum cs_mode mode,struct smb_drv_data *drvdata =dev_get_drvdata (csdev->dev.parent);int ret =0 ; -mutex_lock (&drvdata->mutex); +spin_lock (&drvdata->spinlock);/* Do nothing, the trace data is reading by other interface now */ if (drvdata->reading) {
@@ -294,7 +287,7 @@ static int smb_enable(struct coresight_device *csdev, enum cs_mode mode,dev_dbg (&csdev->dev,"Ultrasoc SMB enabled\n" ); out: -mutex_unlock (&drvdata->mutex); +spin_unlock (&drvdata->spinlock);return ret; }
@@ -304,7 +297,7 @@ static int smb_disable(struct coresight_device *csdev)struct smb_drv_data *drvdata =dev_get_drvdata (csdev->dev.parent);int ret =0 ; -mutex_lock (&drvdata->mutex); +spin_lock (&drvdata->spinlock);if (drvdata->reading) { ret = -EBUSY ;
@@ -327,7 +320,7 @@ static int smb_disable(struct coresight_device *csdev)dev_dbg (&csdev->dev,"Ultrasoc SMB disabled\n" ); out: -mutex_unlock (&drvdata->mutex); +spin_unlock (&drvdata->spinlock);return ret; }
@@ -408,7 +401,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,if (!buf)return 0 ; -mutex_lock (&drvdata->mutex); +spin_lock (&drvdata->spinlock);/* Don't do anything if another tracer is using this sink. */ if (atomic_read (&csdev->refcnt) !=1 )
@@ -432,7 +425,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,if (!buf->snapshot && lost)perf_aux_output_flag (handle,PERF_AUX_FLAG_TRUNCATED ); out: -mutex_unlock (&drvdata->mutex); +spin_unlock (&drvdata->spinlock);return data_size; }
@@ -590,7 +583,7 @@ static int smb_probe(struct platform_device *pdev)return ret; } -mutex_init (&drvdata->mutex); +spin_lock_init (&drvdata->spinlock); drvdata->pid =-1 ; ret =smb_register_sink (pdev, drvdata);
drivers/hwtracing/coresight/ultrasoc-smb.h +3 -3
@@ -8,7 +8,7 @@#define _ULTRASOC_SMB_H#include <linux/miscdevice.h> -#include <linux/mutex.h> +#include <linux/spinlock.h> /* Offset of SMB global registers */ #define SMB_GLB_CFG_REG 0x00
@@ -105,7 +105,7 @@ struct smb_data_buffer {* @csdev: Component vitals needed by the framework. * @sdb: Data buffer for SMB. * @miscdev: Specifics to handle "/dev/xyz.smb" entry. -* @mutex: Control data access to one at a time. +* @spinlock: Control data access to one at a time. * @reading: Synchronise user space access to SMB buffer. * @pid: Process ID of the process being monitored by the * session that is using this component.
@@ -116,7 +116,7 @@ struct smb_drv_data {struct coresight_device *csdev;struct smb_data_buffer sdb;struct miscdevice miscdev; -struct mutex mutex; +spinlock_t spinlock;bool reading;pid_t pid;enum cs_mode mode;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 193/244 coresight: ultrasoc-smb: Config SMB buffer before register sink
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junhao He <[email protected]>
[ Upstream commit 830a7f54db102c889a3fe1c0a225f369ac05f07f ]
The SMB dirver register the enable/disable sysfs interface in function smb_register_sink(), however the buffer depends on the following configuration to work well. So it'll be possible for user to access an unreset one.
Move the config buffer operation to before register_sink(). Ignore the return value, if smb_config_inport() fails. That will cause the hardwares disable trace path to fail, should not affect SMB driver remove. So we make smb_remove() return success,
--- drivers/hwtracing/coresight/ultrasoc-smb.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-)
drivers/hwtracing/coresight/ultrasoc-smb.c +8 -13
@@ -583,37 +583,32 @@ static int smb_probe(struct platform_device *pdev)return ret; } + ret =smb_config_inport (dev, true); +if (ret) +return ret; + +platform_set_drvdata (pdev, drvdata);spin_lock_init (&drvdata->spinlock); drvdata->pid =-1 ; ret =smb_register_sink (pdev, drvdata);if (ret) { +smb_config_inport (&pdev->dev, false);dev_err (dev,"Failed to register SMB sink\n" );return ret; } - ret =smb_config_inport (dev, true); -if (ret) { -smb_unregister_sink (drvdata); -return ret; - } - -platform_set_drvdata (pdev, drvdata); -return 0 ; }static int smb_remove (struct platform_device *pdev) {struct smb_drv_data *drvdata =platform_get_drvdata (pdev); -int ret; - - ret =smb_config_inport (&pdev->dev, false); -if (ret) -return ret;smb_unregister_sink (drvdata); +smb_config_inport (&pdev->dev, false); +return 0 ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 194/244 coresight: ultrasoc-smb: Fix uninitialized before use buf_hw_base
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junhao He <[email protected]>
[ Upstream commit 862c135bde8bc185e8aae2110374175e6a1b6ed5 ]
In smb_reset_buffer, the sdb->buf_hw_base variable is uninitialized before use, which initializes it in smb_init_data_buffer. And the SMB regiester are set in smb_config_inport.
So move the call after smb_config_inport.
--- drivers/hwtracing/coresight/ultrasoc-smb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwtracing/coresight/ultrasoc-smb.c +1 -1
@@ -477,7 +477,6 @@ static int smb_init_data_buffer(struct platform_device *pdev,static void smb_init_hw (struct smb_drv_data *drvdata) {smb_disable_hw (drvdata); -smb_reset_buffer (drvdata);writel (SMB_LB_CFG_LO_DEFAULT , drvdata->base +SMB_LB_CFG_LO_REG );writel (SMB_LB_CFG_HI_DEFAULT , drvdata->base +SMB_LB_CFG_HI_REG );
@@ -587,6 +586,7 @@ static int smb_probe(struct platform_device *pdev)if (ret)return ret; +smb_reset_buffer (drvdata);platform_set_drvdata (pdev, drvdata);spin_lock_init (&drvdata->spinlock); drvdata->pid =-1 ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 195/244 misc: mei: client.c: return negative error code in mei_cl_write
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit 8f06aee8089cf42fd99a20184501bd1347ce61b9 ]
mei_msg_hdr_init() return negative error code, rets should be 'PTR_ERR(mei_hdr)' rather than '-PTR_ERR(mei_hdr)'.
--- drivers/misc/mei/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/mei/client.c +1 -1
@@ -2011,7 +2011,7 @@ ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, unsigned long time mei_hdr =mei_msg_hdr_init (cb);if (IS_ERR (mei_hdr)) { - rets = -PTR_ERR (mei_hdr); + rets =PTR_ERR (mei_hdr); mei_hdr =NULL ; goto err; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 196/244 misc: mei: client.c: fix problem of return -EOVERFLOW in mei_cl_write
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit ee6236027218f8531916f1c5caa5dc330379f287 ]
Clang static analyzer complains that value stored to 'rets' is never read.Let 'buf_len = -EOVERFLOW' to make sure we can return '-EOVERFLOW'.
--- drivers/misc/mei/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/mei/client.c +1 -1
@@ -2032,7 +2032,7 @@ ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, unsigned long time hbuf_slots =mei_hbuf_empty_slots (dev);if (hbuf_slots <0 ) { - rets = -EOVERFLOW ; + buf_len = -EOVERFLOW ; goto out; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 197/244 perf vendor events arm64: AmpereOne: Add missing DefaultMetricgroupName fields
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilkka Koskinen <[email protected]>
[ Upstream commit 90fe70d4e23cb57253d2668a171d5695c332deb7 ]
AmpereOne metrics were missing DefaultMetricgroupName from metrics with "Default" in group name resulting perf to segfault. Add the missing field to address the issue.
--- tools/perf/pmu-events/arch/arm64/ampere/ampereone/metrics.json | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/pmu-events/arch/arm64/ampere/ampereone/metrics.json +2 -0
@@ -231,6 +231,7 @@ "MetricName": "slots_lost_misspeculation_fraction", "MetricExpr": "100 * ((OP_SPEC - OP_RETIRED) / (CPU_CYCLES * #slots))", "BriefDescription": "Fraction of slots lost due to misspeculation", + "DefaultMetricgroupName": "TopdownL1", "MetricGroup": "Default;TopdownL1", "ScaleUnit": "1percent of slots" },
@@ -238,6 +239,7 @@ "MetricName": "retired_fraction", "MetricExpr": "100 * (OP_RETIRED / (CPU_CYCLES * #slots))", "BriefDescription": "Fraction of slots retiring, useful work", + "DefaultMetricgroupName": "TopdownL1", "MetricGroup": "Default;TopdownL1", "ScaleUnit": "1percent of slots" },
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 198/244 LoongArch: BPF: Dont sign extend memory load operand
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hengqi Chen <[email protected]>
[ Upstream commit fe5757553bf9ebe45ae8ecab5922f6937c8d8dfc ]
The cgrp_local_storage test triggers a kernel panic like:
# ./test_progs -t cgrp_local_storage Can't find bpf_testmod.ko kernel module: -2 WARNING! Selftests relying on bpf_testmod.ko will be skipped. [ 550.930632] CPU 1 Unable to handle kernel paging request at virtual address 0000000000000080, era == ffff80000200be34, ra == ffff80000200be00 [ 550.931781] Oops[#1]: [ 550.931966] CPU: 1 PID: 1303 Comm: test_progs Not tainted 6.7.0-rc2-loong-devel-g2f56bb0d2327 #35 a896aca3f4164f09cc346f89f2e09832e07be5f6 [ 550.932215] Hardware name: QEMU QEMU Virtual Machine, BIOS unknown 2/2/2022 [ 550.932403] pc ffff80000200be34 ra ffff80000200be00 tp 9000000108350000 sp 9000000108353dc0 [ 550.932545] a0 0000000000000000 a1 0000000000000517 a2 0000000000000118 a3 00007ffffbb15558 [ 550.932682] a4 00007ffffbb15620 a5 90000001004e7700 a6 0000000000000021 a7 0000000000000118 [ 550.932824] t0 ffff80000200bdc0 t1 0000000000000517 t2 0000000000000517 t3 00007ffff1c06ee0 [ 550.932961] t4 0000555578ae04d0 t5 fffffffffffffff8 t6 0000000000000004 t7 0000000000000020 [ 550.933097] t8 0000000000000040 u0 00000000000007b8 s9 9000000108353e00 s0 90000001004e7700 [ 550.933241] s1 9000000004005000 s2 0000000000000001 s3 0000000000000000 s4 0000555555eb2ec8 [ 550.933379] s5 00007ffffbb15bb8 s6 00007ffff1dafd60 s7 000055555663f610 s8 00007ffff1db0050 [ 550.933520] ra: ffff80000200be00 bpf_prog_98f1b9e767be2a84_on_enter+0x40/0x200 [ 550.933911] ERA: ffff80000200be34 bpf_prog_98f1b9e767be2a84_on_enter+0x74/0x200 [ 550.934105] CRMD: 000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE) [ 550.934596] PRMD: 00000004 (PPLV0 +PIE -PWE) [ 550.934712] EUEN: 00000003 (+FPE +SXE -ASXE -BTE) [ 550.934836] ECFG: 00071c1c (LIE=2-4,10-12 VS=7) [ 550.934976] ESTAT: 00010000 [PIL] (IS= ECode=1 EsubCode=0) [ 550.935097] BADV: 0000000000000080 [ 550.935181] PRID: 0014c010 (Loongson-64bit, Loongson-3A5000) [ 550.935291] Modules linked in: [ 550.935391] Process test_progs (pid: 1303, threadinfo=000000006c3b1c41, task=0000000061f84a55) [ 550.935643] Stack : 00007ffffbb15bb8 0000555555eb2ec8 0000000000000000 0000000000000001 [ 550.935844] 9000000004005000 ffff80001b864000 00007ffffbb15450 90000000029aa034 [ 550.935990] 0000000000000000 9000000108353ec0 0000000000000118 d07d9dfb09721a09 [ 550.936175] 0000000000000001 0000000000000000 9000000108353ec0 0000000000000118 [ 550.936314] 9000000101d46ad0 900000000290abf0 000055555663f610 0000000000000000 [ 550.936479] 0000000000000003 9000000108353ec0 00007ffffbb15450 90000000029d7288 [ 550.936635] 00007ffff1dafd60 000055555663f610 0000000000000000 0000000000000003 [ 550.936779] 9000000108353ec0 90000000035dd1f0 00007ffff1dafd58 9000000002841c5c [ 550.936939] 0000000000000119 0000555555eea5a8 00007ffff1d78780 00007ffffbb153e0 [ 550.937083] ffffffffffffffda 00007ffffbb15518 0000000000000040 00007ffffbb15558 [ 550.937224] ... [ 550.937299] Call Trace: [ 550.937521] [<ffff80000200be34>] bpf_prog_98f1b9e767be2a84_on_enter+0x74/0x200 [ 550.937910] [<90000000029aa034>] bpf_trace_run2+0x90/0x154 [ 550.938105] [<900000000290abf0>] syscall_trace_enter.isra.0+0x1cc/0x200 [ 550.938224] [<90000000035dd1f0>] do_syscall+0x48/0x94 [ 550.938319] [<9000000002841c5c>] handle_syscall+0xbc/0x158 [ 550.938477] [ 550.938607] Code: 580009ae 50016000 262402e4 <28c20085> 14092084 03a00084 16000024 03240084 00150006 [ 550.938851] [ 550.939021] ---[ end trace 0000000000000000 ]---
Further investigation shows that this panic is triggered by memory load operations:
ptr = bpf_cgrp_storage_get(&map_a, task->cgroups->dfl_cgrp, 0,
BPF_LOCAL_STORAGE_GET_F_CREATE);
The expression task->cgroups->dfl_cgrp involves two memory load. Since the field offset fits in imm12 or imm14, we use ldd or ldptrd instructions. But both instructions have the side effect that it will signed-extended the imm operand. Finally, we got the wrong addresses and panics is inevitable.
Use a generic ldxd instruction to avoid this kind of issues.
With this change, we have:
# ./test_progs -t cgrp_local_storage Can't find bpf_testmod.ko kernel module: -2 WARNING! Selftests relying on bpf_testmod.ko will be skipped. test_cgrp_local_storage:PASS:join_cgroup /cgrp_local_storage 0 nsec #48/1 cgrp_local_storage/tp_btf:OK test_attach_cgroup:PASS:skel_open 0 nsec test_attach_cgroup:PASS:prog_attach 0 nsec test_attach_cgroup:PASS:prog_attach 0 nsec libbpf: prog 'update_cookie_tracing': failed to attach: ERROR: strerror_r(-524)=22 test_attach_cgroup:FAIL:prog_attach unexpected error: -524 #48/2 cgrp_local_storage/attach_cgroup:FAIL test_recursion:PASS:skel_open_and_load 0 nsec libbpf: prog 'on_lookup': failed to attach: ERROR: strerror_r(-524)=22 libbpf: prog 'on_lookup': failed to auto-attach: -524 test_recursion:FAIL:skel_attach unexpected error: -524 (errno 524) #48/3 cgrp_local_storage/recursion:FAIL #48/4 cgrp_local_storage/negative:OK #48/5 cgrp_local_storage/cgroup_iter_sleepable:OK test_yes_rcu_lock:PASS:skel_open 0 nsec test_yes_rcu_lock:PASS:skel_load 0 nsec libbpf: prog 'yes_rcu_lock': failed to attach: ERROR: strerror_r(-524)=22 libbpf: prog 'yes_rcu_lock': failed to auto-attach: -524 test_yes_rcu_lock:FAIL:skel_attach unexpected error: -524 (errno 524) #48/6 cgrp_local_storage/yes_rcu_lock:FAIL #48/7 cgrp_local_storage/no_rcu_lock:OK #48 cgrp_local_storage:FAIL
All error logs:
test_cgrp_local_storage:PASS:join_cgroup /cgrp_local_storage 0 nsec test_attach_cgroup:PASS:skel_open 0 nsec test_attach_cgroup:PASS:prog_attach 0 nsec test_attach_cgroup:PASS:prog_attach 0 nsec
libbpf: prog 'update_cookie_tracing': failed to attach: ERROR: strerror_r(-524)=22 test_attach_cgroup:FAIL:prog_attach unexpected error: -524
#48/2 cgrp_local_storage/attach_cgroup:FAIL
test_recursion:PASS:skel_open_and_load 0 nsec
libbpf: prog 'on_lookup': failed to attach: ERROR: strerror_r(-524)=22
libbpf: prog 'on_lookup': failed to auto-attach: -524 test_recursion:FAIL:skel_attach unexpected error: -524 (errno 524)
#48/3 cgrp_local_storage/recursion:FAIL
test_yes_rcu_lock:PASS:skel_open 0 nsec test_yes_rcu_lock:PASS:skel_load 0 nsec
libbpf: prog 'yes_rcu_lock': failed to attach: ERROR: strerror_r(-524)=22
libbpf: prog 'yes_rcu_lock': failed to auto-attach: -524 test_yes_rcu_lock:FAIL:skel_attach unexpected error: -524 (errno 524)
#48/6 cgrp_local_storage/yes_rcu_lock:FAIL
#48 cgrp_local_storage:FAIL
Summary: 0/4 PASSED, 0 SKIPPED, 1 FAILED
No panics any more (The test still failed because lack of BPF trampoline which I am actively working on).
--- arch/loongarch/net/bpf_jit.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
arch/loongarch/net/bpf_jit.c +2 -8
@@ -907,14 +907,8 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext }break ;case BPF_DW : -if (is_signed_imm12 (off)) { -emit_insn (ctx, ldd, dst, src, off); - }else if (is_signed_imm14 (off)) { -emit_insn (ctx, ldptrd, dst, src, off); - }else { -move_imm (ctx, t1, off, is32); -emit_insn (ctx, ldxd, dst, src, t1); - } +move_imm (ctx, t1, off, is32); +emit_insn (ctx, ldxd, dst, src, t1);break ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 199/244 LoongArch: BPF: Dont sign extend function return value
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hengqi Chen <[email protected]>
[ Upstream commit 5d47ec2e6f4c64e30e392cfe9532df98c9beb106 ]
The cls_redirect test triggers a kernel panic like:
# ./test_progs -t cls_redirect Can't find bpf_testmod.ko kernel module: -2 WARNING! Selftests relying on bpf_testmod.ko will be skipped. [ 30.938489] CPU 3 Unable to handle kernel paging request at virtual address fffffffffd814de0, era == ffff800002009fb8, ra == ffff800002009f9c [ 30.939331] Oops[#1]: [ 30.939513] CPU: 3 PID: 1260 Comm: test_progs Not tainted 6.7.0-rc2-loong-devel-g2f56bb0d2327 #35 a896aca3f4164f09cc346f89f2e09832e07be5f6 [ 30.939732] Hardware name: QEMU QEMU Virtual Machine, BIOS unknown 2/2/2022 [ 30.939901] pc ffff800002009fb8 ra ffff800002009f9c tp 9000000104da4000 sp 9000000104da7ab0 [ 30.940038] a0 fffffffffd814de0 a1 9000000104da7a68 a2 0000000000000000 a3 9000000104da7c10 [ 30.940183] a4 9000000104da7c14 a5 0000000000000002 a6 0000000000000021 a7 00005555904d7f90 [ 30.940321] t0 0000000000000110 t1 0000000000000000 t2 fffffffffd814de0 t3 0004c4b400000000 [ 30.940456] t4 ffffffffffffffff t5 00000000c3f63600 t6 0000000000000000 t7 0000000000000000 [ 30.940590] t8 000000000006d803 u0 0000000000000020 s9 9000000104da7b10 s0 900000010504c200 [ 30.940727] s1 fffffffffd814de0 s2 900000010504c200 s3 9000000104da7c10 s4 9000000104da7ad0 [ 30.940866] s5 0000000000000000 s6 90000000030e65bc s7 9000000104da7b44 s8 90000000044f6fc0 [ 30.941015] ra: ffff800002009f9c bpf_prog_846803e5ae81417f_cls_redirect+0xa0/0x590 [ 30.941535] ERA: ffff800002009fb8 bpf_prog_846803e5ae81417f_cls_redirect+0xbc/0x590 [ 30.941696] CRMD: 000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE) [ 30.942224] PRMD: 00000004 (PPLV0 +PIE -PWE) [ 30.942330] EUEN: 00000003 (+FPE +SXE -ASXE -BTE) [ 30.942453] ECFG: 00071c1c (LIE=2-4,10-12 VS=7) [ 30.942612] ESTAT: 00010000 [PIL] (IS= ECode=1 EsubCode=0) [ 30.942764] BADV: fffffffffd814de0 [ 30.942854] PRID: 0014c010 (Loongson-64bit, Loongson-3A5000) [ 30.942974] Modules linked in: [ 30.943078] Process test_progs (pid: 1260, threadinfo=00000000ce303226, task=000000007d10bb76) [ 30.943306] Stack : 900000010a064000 90000000044f6fc0 9000000104da7b48 0000000000000000 [ 30.943495] 0000000000000000 9000000104da7c14 9000000104da7c10 900000010504c200 [ 30.943626] 0000000000000001 ffff80001b88c000 9000000104da7b70 90000000030e6668 [ 30.943785] 0000000000000000 9000000104da7b58 ffff80001b88c048 9000000003d05000 [ 30.943936] 900000000303ac88 0000000000000000 0000000000000000 9000000104da7b70 [ 30.944091] 0000000000000000 0000000000000001 0000000731eeab00 0000000000000000 [ 30.944245] ffff80001b88c000 0000000000000000 0000000000000000 54b99959429f83b8 [ 30.944402] ffff80001b88c000 90000000044f6fc0 9000000101d70000 ffff80001b88c000 [ 30.944538] 000000000000005a 900000010504c200 900000010a064000 900000010a067000 [ 30.944697] 9000000104da7d88 0000000000000000 9000000003d05000 90000000030e794c [ 30.944852] ... [ 30.944924] Call Trace: [ 30.945120] [<ffff800002009fb8>] bpf_prog_846803e5ae81417f_cls_redirect+0xbc/0x590 [ 30.945650] [<90000000030e6668>] bpf_test_run+0x1ec/0x2f8 [ 30.945958] [<90000000030e794c>] bpf_prog_test_run_skb+0x31c/0x684 [ 30.946065] [<90000000026d4f68>] __sys_bpf+0x678/0x2724 [ 30.946159] [<90000000026d7288>] sys_bpf+0x20/0x2c [ 30.946253] [<90000000032dd224>] do_syscall+0x7c/0x94 [ 30.946343] [<9000000002541c5c>] handle_syscall+0xbc/0x158 [ 30.946492] [ 30.946549] Code: 0015030e 5c0009c0 5001d000 <28c00304> 02c00484 29c00304 00150009 2a42d2e4 0280200d [ 30.946793] [ 30.946971] ---[ end trace 0000000000000000 ]--- [ 32.093225] Kernel panic - not syncing: Fatal exception in interrupt [ 32.093526] Kernel relocated by 0x2320000 [ 32.093630] .text @ 0x9000000002520000 [ 32.093725] .data @ 0x9000000003400000 [ 32.093792] .bss @ 0x9000000004413200 [ 34.971998] ---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---
This is because we signed-extend function return values. When subprog mode is enabled, we have:
cls_redirect()
-> get_global_metrics() returns pcpu ptr 0xfffffefffc00b480
The pointer returned is later signed-extended to 0xfffffffffc00b480 at BPF_JMP | BPF_EXIT. During BPF prog run, this triggers unhandled page fault and a kernel panic.
Drop the unnecessary signed-extension on return values like other architectures do.
With this change, we have:
# ./test_progs -t cls_redirect Can't find bpf_testmod.ko kernel module: -2 WARNING! Selftests relying on bpf_testmod.ko will be skipped. #51/1 cls_redirect/cls_redirect_inlined:OK #51/2 cls_redirect/IPv4 TCP accept unknown (no hops, flags: SYN):OK #51/3 cls_redirect/IPv6 TCP accept unknown (no hops, flags: SYN):OK #51/4 cls_redirect/IPv4 TCP accept unknown (no hops, flags: ACK):OK #51/5 cls_redirect/IPv6 TCP accept unknown (no hops, flags: ACK):OK #51/6 cls_redirect/IPv4 TCP forward unknown (one hop, flags: ACK):OK #51/7 cls_redirect/IPv6 TCP forward unknown (one hop, flags: ACK):OK #51/8 cls_redirect/IPv4 TCP accept known (one hop, flags: ACK):OK #51/9 cls_redirect/IPv6 TCP accept known (one hop, flags: ACK):OK #51/10 cls_redirect/IPv4 UDP accept unknown (no hops, flags: none):OK #51/11 cls_redirect/IPv6 UDP accept unknown (no hops, flags: none):OK #51/12 cls_redirect/IPv4 UDP forward unknown (one hop, flags: none):OK #51/13 cls_redirect/IPv6 UDP forward unknown (one hop, flags: none):OK #51/14 cls_redirect/IPv4 UDP accept known (one hop, flags: none):OK #51/15 cls_redirect/IPv6 UDP accept known (one hop, flags: none):OK #51/16 cls_redirect/cls_redirect_subprogs:OK #51/17 cls_redirect/IPv4 TCP accept unknown (no hops, flags: SYN):OK #51/18 cls_redirect/IPv6 TCP accept unknown (no hops, flags: SYN):OK #51/19 cls_redirect/IPv4 TCP accept unknown (no hops, flags: ACK):OK #51/20 cls_redirect/IPv6 TCP accept unknown (no hops, flags: ACK):OK #51/21 cls_redirect/IPv4 TCP forward unknown (one hop, flags: ACK):OK #51/22 cls_redirect/IPv6 TCP forward unknown (one hop, flags: ACK):OK #51/23 cls_redirect/IPv4 TCP accept known (one hop, flags: ACK):OK #51/24 cls_redirect/IPv6 TCP accept known (one hop, flags: ACK):OK #51/25 cls_redirect/IPv4 UDP accept unknown (no hops, flags: none):OK #51/26 cls_redirect/IPv6 UDP accept unknown (no hops, flags: none):OK #51/27 cls_redirect/IPv4 UDP forward unknown (one hop, flags: none):OK #51/28 cls_redirect/IPv6 UDP forward unknown (one hop, flags: none):OK #51/29 cls_redirect/IPv4 UDP accept known (one hop, flags: none):OK #51/30 cls_redirect/IPv6 UDP accept known (one hop, flags: none):OK #51/31 cls_redirect/cls_redirect_dynptr:OK #51/32 cls_redirect/IPv4 TCP accept unknown (no hops, flags: SYN):OK #51/33 cls_redirect/IPv6 TCP accept unknown (no hops, flags: SYN):OK #51/34 cls_redirect/IPv4 TCP accept unknown (no hops, flags: ACK):OK #51/35 cls_redirect/IPv6 TCP accept unknown (no hops, flags: ACK):OK #51/36 cls_redirect/IPv4 TCP forward unknown (one hop, flags: ACK):OK #51/37 cls_redirect/IPv6 TCP forward unknown (one hop, flags: ACK):OK #51/38 cls_redirect/IPv4 TCP accept known (one hop, flags: ACK):OK #51/39 cls_redirect/IPv6 TCP accept known (one hop, flags: ACK):OK #51/40 cls_redirect/IPv4 UDP accept unknown (no hops, flags: none):OK #51/41 cls_redirect/IPv6 UDP accept unknown (no hops, flags: none):OK #51/42 cls_redirect/IPv4 UDP forward unknown (one hop, flags: none):OK #51/43 cls_redirect/IPv6 UDP forward unknown (one hop, flags: none):OK #51/44 cls_redirect/IPv4 UDP accept known (one hop, flags: none):OK #51/45 cls_redirect/IPv6 UDP accept known (one hop, flags: none):OK #51 cls_redirect:OK Summary: 1/45 PASSED, 0 SKIPPED, 0 FAILED
--- arch/loongarch/net/bpf_jit.c | 2 -- 1 file changed, 2 deletions(-)
arch/loongarch/net/bpf_jit.c +0 -2
@@ -855,8 +855,6 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext/* function return */ case BPF_JMP |BPF_EXIT : -emit_sext_32 (ctx, regmap[BPF_REG_0 ], true); -if (i == ctx->prog->len -1 )break ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 200/244 parisc: Reduce size of the bug_table on 64-bit kernel by half
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
[ Upstream commit 43266838515d30dc0c45d5c7e6e7edacee6cce92 ]
Enable GENERIC_BUG_RELATIVE_POINTERS which will store 32-bit relative offsets to the bug address and the source file name instead of 64-bit absolute addresses. This effectively reduces the size of the bug_table[] array by half on 64-bit kernels.
Stable-dep-of: 487635756198 ("parisc: Fix asm operand number out of range build error in bug table")
--- arch/parisc/Kconfig | 7 +++++-- arch/parisc/include/asm/bug.h | 34 +++++++++++++++++----------------- 2 files changed, 22 insertions(+), 19 deletions(-)
arch/parisc/Kconfig +5 -2
@@ -113,9 +113,12 @@ config ARCH_HAS_ILOG2_U64 default n config GENERIC_BUG - bool - default y + def_bool y depends on BUG + select GENERIC_BUG_RELATIVE_POINTERS if 64BIT + +config GENERIC_BUG_RELATIVE_POINTERS + bool config GENERIC_HWEIGHT bool
arch/parisc/include/asm/bug.h +17 -17
@@ -17,26 +17,27 @@#define PARISC_BUG_BREAK_ASM "break 0x1f, 0x1fff"#define PARISC_BUG_BREAK_INSN 0x03ffe01f/* PARISC_BUG_BREAK_ASM */ -#if defined(CONFIG_64BIT ) -#define ASM_WORD_INSN ".dword\t" +#ifdef CONFIG_GENERIC_BUG_RELATIVE_POINTERS +# define __BUG_REL (val) ".word " __stringify(val) " - ."#else -#define ASM_WORD_INSN ".word\t" +# define __BUG_REL (val) ".word " __stringify(val)#endif +#ifdef CONFIG_DEBUG_BUGVERBOSE #define BUG () \ do { \ asm volatile("\n" \ "1:\t" PARISC_BUG_BREAK_ASM "\n" \ "\t.pushsection __bug_table,\"a\"\n" \ - "\t.align %4\n" \ - "2:\t" ASM_WORD_INSN "1b, %c0\n" \ + "\t.align 4\n" \ + "2:\t" __BUG_REL(1b) "\n" \ + "\t" __BUG_REL(%c0) "\n" \ "\t.short %1, %2\n" \ - "\t.blockz %3-2*%4-2*2\n" \ + "\t.blockz %3-2*4-2*2\n" \ "\t.popsection" \ : : "i" (__FILE__), "i" (__LINE__), \ - "i" (0), "i" (sizeof(struct bug_entry)), \ - "i" (sizeof(long)) ); \ + "i" (0), "i" (sizeof(struct bug_entry)) ); \ unreachable(); \ } while(0)
@@ -54,15 +55,15 @@ asmvolatile ("\n" \"1:\t" PARISC_BUG_BREAK_ASM "\n" \"\t.pushsection __bug_table,\"a\"\n" \ -"\t.align %4\n" \ -"2:\t" ASM_WORD_INSN "1b, %c0\n" \ +"\t.align 4\n" \ + "2:\t" __BUG_REL(1b) "\n" \ + "\t" __BUG_REL(%c0) "\n" \"\t.short %1, %2\n" \ -"\t.blockz %3-2*%4-2*2\n" \ +"\t.blockz %3-2*4-2*2\n" \"\t.popsection" \ : : "i" (__FILE__), "i" (__LINE__), \"i" (BUGFLAG_WARNING |(flags)), \ -"i" (sizeof (struct bug_entry )), \ -"i" (sizeof (long )) ); \ + "i" (sizeof(struct bug_entry)) ); \ } while(0) #else#define __WARN_FLAGS (flags) \
@@ -71,13 +72,12 @@"1:\t" PARISC_BUG_BREAK_ASM "\n" \"\t.pushsection __bug_table,\"a\"\n" \"\t.align %2\n" \ -"2:\t" ASM_WORD_INSN "1b\n" \ + "2:\t" __BUG_REL(1b) "\n" \"\t.short %0\n" \ -"\t.blockz %1-%2-2\n" \ +"\t.blockz %1-4-2\n" \"\t.popsection" \ : : "i" (BUGFLAG_WARNING|(flags)), \ -"i" (sizeof (struct bug_entry )), \ - "i" (sizeof(long)) ); \ + "i" (sizeof(struct bug_entry)) ); \ } while(0)#endif
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 201/244 parisc: Fix asm operand number out of range build error in bug table
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
[ Upstream commit 487635756198cad563feb47539c6a37ea57f1dae ]
Build is broken if CONFIG_DEBUG_BUGVERBOSE=n.
Fix it be using the correct asm operand number.
--- arch/parisc/include/asm/bug.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/parisc/include/asm/bug.h +1 -1
@@ -71,7 +71,7 @@ asmvolatile ("\n" \"1:\t" PARISC_BUG_BREAK_ASM "\n" \"\t.pushsection __bug_table,\"a\"\n" \ -"\t.align %2\n" \ +"\t.align 4\n" \ "2:\t" __BUG_REL(1b) "\n" \"\t.short %0\n" \"\t.blockz %1-4-2\n" \
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 202/244 arm64: dts: mediatek: add missing space before {
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit a9c740c57f977deb41bc53c02d0dae3d0e2f191a ]
Add missing whitespace between node name/label and opening {.
Stable-dep-of: 8980c30141d3 ("arm64: dts: mt8183: kukui: Fix underscores in node names")
--- arch/arm64/boot/dts/mediatek/mt8183-evb.dts | 48 +++++++++---------- .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 12 ++--- .../boot/dts/mediatek/mt8183-pumpkin.dts | 12 ++--- 3 files changed, 36 insertions(+), 36 deletions(-)
arch/arm64/boot/dts/mediatek/mt8183-evb.dts +24 -24
@@ -155,8 +155,8 @@ &mt6358_vsram_gpu_reg { }; &pio { - i2c_pins_0: i2c0{ - pins_i2c{ + i2c_pins_0: i2c0 { + pins_i2c { pinmux = <PINMUX_GPIO82__FUNC_SDA0>, <PINMUX_GPIO83__FUNC_SCL0>; mediatek,pull-up-adv = <3>;
@@ -164,8 +164,8 @@ pins_i2c{ }; }; - i2c_pins_1: i2c1{ - pins_i2c{ + i2c_pins_1: i2c1 { + pins_i2c { pinmux = <PINMUX_GPIO81__FUNC_SDA1>, <PINMUX_GPIO84__FUNC_SCL1>; mediatek,pull-up-adv = <3>;
@@ -173,8 +173,8 @@ pins_i2c{ }; }; - i2c_pins_2: i2c2{ - pins_i2c{ + i2c_pins_2: i2c2 { + pins_i2c { pinmux = <PINMUX_GPIO103__FUNC_SCL2>, <PINMUX_GPIO104__FUNC_SDA2>; mediatek,pull-up-adv = <3>;
@@ -182,8 +182,8 @@ pins_i2c{ }; }; - i2c_pins_3: i2c3{ - pins_i2c{ + i2c_pins_3: i2c3 { + pins_i2c { pinmux = <PINMUX_GPIO50__FUNC_SCL3>, <PINMUX_GPIO51__FUNC_SDA3>; mediatek,pull-up-adv = <3>;
@@ -191,8 +191,8 @@ pins_i2c{ }; }; - i2c_pins_4: i2c4{ - pins_i2c{ + i2c_pins_4: i2c4 { + pins_i2c { pinmux = <PINMUX_GPIO105__FUNC_SCL4>, <PINMUX_GPIO106__FUNC_SDA4>; mediatek,pull-up-adv = <3>;
@@ -200,8 +200,8 @@ pins_i2c{ }; }; - i2c_pins_5: i2c5{ - pins_i2c{ + i2c_pins_5: i2c5 { + pins_i2c { pinmux = <PINMUX_GPIO48__FUNC_SCL5>, <PINMUX_GPIO49__FUNC_SDA5>; mediatek,pull-up-adv = <3>;
@@ -209,8 +209,8 @@ pins_i2c{ }; }; - spi_pins_0: spi0{ - pins_spi{ + spi_pins_0: spi0 { + pins_spi { pinmux = <PINMUX_GPIO85__FUNC_SPI0_MI>, <PINMUX_GPIO86__FUNC_SPI0_CSB>, <PINMUX_GPIO87__FUNC_SPI0_MO>,
@@ -324,8 +324,8 @@ pins_clk { }; }; - spi_pins_1: spi1{ - pins_spi{ + spi_pins_1: spi1 { + pins_spi { pinmux = <PINMUX_GPIO161__FUNC_SPI1_A_MI>, <PINMUX_GPIO162__FUNC_SPI1_A_CSB>, <PINMUX_GPIO163__FUNC_SPI1_A_MO>,
@@ -334,8 +334,8 @@ pins_spi{ }; }; - spi_pins_2: spi2{ - pins_spi{ + spi_pins_2: spi2 { + pins_spi { pinmux = <PINMUX_GPIO0__FUNC_SPI2_CSB>, <PINMUX_GPIO1__FUNC_SPI2_MO>, <PINMUX_GPIO2__FUNC_SPI2_CLK>,
@@ -344,8 +344,8 @@ pins_spi{ }; }; - spi_pins_3: spi3{ - pins_spi{ + spi_pins_3: spi3 { + pins_spi { pinmux = <PINMUX_GPIO21__FUNC_SPI3_MI>, <PINMUX_GPIO22__FUNC_SPI3_CSB>, <PINMUX_GPIO23__FUNC_SPI3_MO>,
@@ -354,8 +354,8 @@ pins_spi{ }; }; - spi_pins_4: spi4{ - pins_spi{ + spi_pins_4: spi4 { + pins_spi { pinmux = <PINMUX_GPIO17__FUNC_SPI4_MI>, <PINMUX_GPIO18__FUNC_SPI4_CSB>, <PINMUX_GPIO19__FUNC_SPI4_MO>,
@@ -364,8 +364,8 @@ pins_spi{ }; }; - spi_pins_5: spi5{ - pins_spi{ + spi_pins_5: spi5 { + pins_spi { pinmux = <PINMUX_GPIO13__FUNC_SPI5_MI>, <PINMUX_GPIO14__FUNC_SPI5_CSB>, <PINMUX_GPIO15__FUNC_SPI5_MO>,
arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +6 -6
@@ -692,7 +692,7 @@ pins_scp_uart { }; spi0_pins: spi0 { - pins_spi{ + pins_spi { pinmux = <PINMUX_GPIO85__FUNC_SPI0_MI>, <PINMUX_GPIO86__FUNC_GPIO86>, <PINMUX_GPIO87__FUNC_SPI0_MO>,
@@ -702,7 +702,7 @@ pins_spi{ }; spi1_pins: spi1 { - pins_spi{ + pins_spi { pinmux = <PINMUX_GPIO161__FUNC_SPI1_A_MI>, <PINMUX_GPIO162__FUNC_SPI1_A_CSB>, <PINMUX_GPIO163__FUNC_SPI1_A_MO>,
@@ -712,7 +712,7 @@ pins_spi{ }; spi2_pins: spi2 { - pins_spi{ + pins_spi { pinmux = <PINMUX_GPIO0__FUNC_SPI2_CSB>, <PINMUX_GPIO1__FUNC_SPI2_MO>, <PINMUX_GPIO2__FUNC_SPI2_CLK>;
@@ -725,7 +725,7 @@ pins_spi_mi { }; spi3_pins: spi3 { - pins_spi{ + pins_spi { pinmux = <PINMUX_GPIO21__FUNC_SPI3_MI>, <PINMUX_GPIO22__FUNC_SPI3_CSB>, <PINMUX_GPIO23__FUNC_SPI3_MO>,
@@ -735,7 +735,7 @@ pins_spi{ }; spi4_pins: spi4 { - pins_spi{ + pins_spi { pinmux = <PINMUX_GPIO17__FUNC_SPI4_MI>, <PINMUX_GPIO18__FUNC_SPI4_CSB>, <PINMUX_GPIO19__FUNC_SPI4_MO>,
@@ -745,7 +745,7 @@ pins_spi{ }; spi5_pins: spi5 { - pins_spi{ + pins_spi { pinmux = <PINMUX_GPIO13__FUNC_SPI5_MI>, <PINMUX_GPIO14__FUNC_SPI5_CSB>, <PINMUX_GPIO15__FUNC_SPI5_MO>,
arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts +6 -6
@@ -193,7 +193,7 @@ &mt6358_vsram_gpu_reg { &pio { i2c_pins_0: i2c0 { - pins_i2c{ + pins_i2c { pinmux = <PINMUX_GPIO82__FUNC_SDA0>, <PINMUX_GPIO83__FUNC_SCL0>; mediatek,pull-up-adv = <3>;
@@ -202,7 +202,7 @@ pins_i2c{ }; i2c_pins_1: i2c1 { - pins_i2c{ + pins_i2c { pinmux = <PINMUX_GPIO81__FUNC_SDA1>, <PINMUX_GPIO84__FUNC_SCL1>; mediatek,pull-up-adv = <3>;
@@ -211,7 +211,7 @@ pins_i2c{ }; i2c_pins_2: i2c2 { - pins_i2c{ + pins_i2c { pinmux = <PINMUX_GPIO103__FUNC_SCL2>, <PINMUX_GPIO104__FUNC_SDA2>; mediatek,pull-up-adv = <3>;
@@ -220,7 +220,7 @@ pins_i2c{ }; i2c_pins_3: i2c3 { - pins_i2c{ + pins_i2c { pinmux = <PINMUX_GPIO50__FUNC_SCL3>, <PINMUX_GPIO51__FUNC_SDA3>; mediatek,pull-up-adv = <3>;
@@ -229,7 +229,7 @@ pins_i2c{ }; i2c_pins_4: i2c4 { - pins_i2c{ + pins_i2c { pinmux = <PINMUX_GPIO105__FUNC_SCL4>, <PINMUX_GPIO106__FUNC_SDA4>; mediatek,pull-up-adv = <3>;
@@ -238,7 +238,7 @@ pins_i2c{ }; i2c_pins_5: i2c5 { - pins_i2c{ + pins_i2c { pinmux = <PINMUX_GPIO48__FUNC_SCL5>, <PINMUX_GPIO49__FUNC_SDA5>; mediatek,pull-up-adv = <3>;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 203/244 arm64: dts: mt8183: kukui: Fix underscores in node names
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hsin-Yi Wang <[email protected]>
[ Upstream commit 8980c30141d3986beab815d85762b9c67196ed72 ]
Replace underscores with hyphens in pinctrl node names both for consistency and to adhere to the bindings.
--- .../dts/mediatek/mt8183-kukui-jacuzzi.dtsi | 6 +- .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 94 +++++++++---------- 2 files changed, 50 insertions(+), 50 deletions(-)
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi +3 -3
@@ -443,20 +443,20 @@ pins2 { }; touchscreen_pins: touchscreen-pins { - touch_int_odl { + touch-int-odl { pinmux = <PINMUX_GPIO155__FUNC_GPIO155>; input-enable; bias-pull-up; }; - touch_rst_l { + touch-rst-l { pinmux = <PINMUX_GPIO156__FUNC_GPIO156>; output-high; }; }; trackpad_pins: trackpad-pins { - trackpad_int { + trackpad-int { pinmux = <PINMUX_GPIO7__FUNC_GPIO7>; input-enable; bias-disable; /* pulled externally */
arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +47 -47
344 lines not on this page · raw message
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 204/244 drm/amdgpu: disable MCBP by default
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiadong Zhu <[email protected]>
[ Upstream commit d6a57588666301acd9d42d3b00d74240964f07f6 ]
Disable MCBP(mid command buffer preemption) by default as old Mesa hangs with it. We shall not enable the feature that breaks old usermode driver.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +0 -4
@@ -3478,10 +3478,6 @@ static void amdgpu_device_set_mcbp(struct amdgpu_device *adev) adev->gfx.mcbp = true; else if (amdgpu_mcbp == 0) adev->gfx.mcbp = false; - else if ((adev->ip_versions[GC_HWIP][0] >= IP_VERSION(9, 0, 0)) && - (adev->ip_versions[GC_HWIP][0] < IP_VERSION(10, 0, 0)) && - adev->gfx.num_gfx_rings) - adev->gfx.mcbp = true; if (amdgpu_sriov_vf(adev)) adev->gfx.mcbp = true;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 205/244 perf: Fix perf_event_validate_size()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
[ Upstream commit 382c27f4ed28f803b1f1473ac2d8db0afc795a1b ]
Budimir noted that perf_event_validate_size() only checks the size of the newly added event, even though the sizes of all existing events can also change due to not all events having the same read_format.
When we attach the new event, perf_group_attach(), we do re-compute the size for all events.
--- kernel/events/core.c | 61 +++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 23 deletions(-)
kernel/events/core.c +38 -23
@@ -1814,31 +1814,34 @@ static inline void perf_event__state_init(struct perf_event *event)PERF_EVENT_STATE_INACTIVE ; } -static void __perf_event_read_size (struct perf_event *event,int nr_siblings) +static int __perf_event_read_size (u64 read_format,int nr_siblings) {int entry =sizeof (u64);/* value */ int size =0 ;int nr =1 ; -if (event->attr.read_format &PERF_FORMAT_TOTAL_TIME_ENABLED ) +if (read_format &PERF_FORMAT_TOTAL_TIME_ENABLED ) size +=sizeof (u64); -if (event->attr.read_format &PERF_FORMAT_TOTAL_TIME_RUNNING ) +if (read_format &PERF_FORMAT_TOTAL_TIME_RUNNING ) size +=sizeof (u64); -if (event->attr.read_format &PERF_FORMAT_ID ) +if (read_format &PERF_FORMAT_ID ) entry +=sizeof (u64); -if (event->attr.read_format &PERF_FORMAT_LOST ) +if (read_format &PERF_FORMAT_LOST ) entry +=sizeof (u64); -if (event->attr.read_format &PERF_FORMAT_GROUP ) { +if (read_format &PERF_FORMAT_GROUP ) { nr += nr_siblings; size +=sizeof (u64); } - size += entry * nr; - event->read_size = size; +/* +* Since perf_event_validate_size() limits this to 16k and inhibits +* adding more siblings, this will never overflow. +*/ +return size + nr * entry; }static void __perf_event_header_size (struct perf_event *event,u64 sample_type)
@@ -1888,8 +1891,9 @@ static void __perf_event_header_size(struct perf_event *event, u64 sample_type)*/ static void perf_event__header_size (struct perf_event *event) { -__perf_event_read_size (event, - event->group_leader->nr_siblings); + event->read_size = +__perf_event_read_size (event->attr.read_format, + event->group_leader->nr_siblings);__perf_event_header_size (event, event->attr.sample_type); }
@@ -1920,24 +1924,35 @@ static void perf_event__id_header_size(struct perf_event *event) event->id_header_size = size; } +/* +* Check that adding an event to the group does not result in anybody +* overflowing the 64k event limit imposed by the output buffer. +* +* Specifically, check that the read_size for the event does not exceed 16k, +* read_size being the one term that grows with groups size. Since read_size +* depends on per-event read_format, also (re)check the existing events. +* +* This leaves 48k for the constant size fields and things like callchains, +* branch stacks and register sets. +*/ static bool perf_event_validate_size (struct perf_event *event) { -/* -* The values computed here will be over-written when we actually -* attach the event. -*/ -__perf_event_read_size (event, event->group_leader->nr_siblings +1 ); -__perf_event_header_size (event, event->attr.sample_type & ~PERF_SAMPLE_READ ); -perf_event__id_header_size (event); +struct perf_event *sibling, *group_leader = event->group_leader; -/* -* Sum the lot; should not exceed the 64k limit we have on records. -* Conservative limit to allow for callchains and other variable fields. -*/ -if (event->read_size + event->header_size + - event->id_header_size +sizeof (struct perf_event_header ) >=16 *1024 ) +if (__perf_event_read_size (event->attr.read_format, + group_leader->nr_siblings +1 ) >16 *1024 )return false; +if (__perf_event_read_size (group_leader->attr.read_format, + group_leader->nr_siblings +1 ) >16 *1024 ) +return false; + +for_each_sibling_event (sibling, group_leader) { +if (__perf_event_read_size (sibling->attr.read_format, + group_leader->nr_siblings +1 ) >16 *1024 ) +return false; + } +return true; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 206/244 x86/sev: Fix kernel crash due to late update to read-only ghcb_version
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ashwin Dayanand Kamat <[email protected]>
[ Upstream commit 27d25348d42161837be08fc63b04a2559d2e781c ]
A write-access violation page fault kernel crash was observed while running cpuhotplug LTP testcases on SEV-ES enabled systems. The crash was observed during hotplug, after the CPU was offlined and the process was migrated to different CPU. setup_ghcb() is called again which tries to update ghcb_version in sev_es_negotiate_protocol(). Ideally this is a read_only variable which is initialised during booting.
Trying to write it results in a pagefault:
BUG: unable to handle page fault for address: ffffffffba556e70 #PF: supervisor write access in kernel mode #PF: error_code(0x0003) - permissions violation [ ...] Call Trace: <TASK> ? __die_body.cold+0x1a/0x1f ? __die+0x2a/0x35 ? page_fault_oops+0x10c/0x270 ? setup_ghcb+0x71/0x100 ? __x86_return_thunk+0x5/0x6 ? search_exception_tables+0x60/0x70 ? __x86_return_thunk+0x5/0x6 ? fixup_exception+0x27/0x320 ? kernelmode_fixup_or_oops+0xa2/0x120 ? __bad_area_nosemaphore+0x16a/0x1b0 ? kernel_exc_vmm_communication+0x60/0xb0 ? bad_area_nosemaphore+0x16/0x20 ? do_kern_addr_fault+0x7a/0x90 ? exc_page_fault+0xbd/0x160 ? asm_exc_page_fault+0x27/0x30 ? setup_ghcb+0x71/0x100 ? setup_ghcb+0xe/0x100 cpu_init_exception_handling+0x1b9/0x1f0
The fix is to call sev_es_negotiate_protocol() only in the BSP boot phase, and it only needs to be done once in any case.
[ mingo: Refined the changelog. ]
--- arch/x86/kernel/sev.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
arch/x86/kernel/sev.c +7 -4
@@ -1234,10 +1234,6 @@ void setup_ghcb(void)if (!cc_platform_has (CC_ATTR_GUEST_STATE_ENCRYPT ))return ; -/* First make sure the hypervisor talks a supported protocol. */ -if (!sev_es_negotiate_protocol ()) -sev_es_terminate (SEV_TERM_SET_GEN ,GHCB_SEV_ES_GEN_REQ ); -/* * Check whether the runtime #VC exception handler is active. It uses * the per-CPU GHCB page which is set up by sev_es_init_vc_handling().
@@ -1254,6 +1250,13 @@ void setup_ghcb(void)return ; } +/* +* Make sure the hypervisor talks a supported protocol. +* This gets called only in the BSP boot phase. +*/ +if (!sev_es_negotiate_protocol ()) +sev_es_terminate (SEV_TERM_SET_GEN ,GHCB_SEV_ES_GEN_REQ ); +/* * Clear the boot_ghcb. The first exception comes in before the bss * section is cleared.
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 207/244 gpiolib: sysfs: Fix error handling on failed export
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boerge Struempfel <[email protected]>
[ Upstream commit 95dd1e34ff5bbee93a28ff3947eceaf6de811b1a ]
If gpio_set_transitory() fails, we should free the GPIO again. Most notably, the flag FLAG_REQUESTED has previously been set in gpiod_request_commit(), and should be reset on failure.
To my knowledge, this does not affect any current users, since the gpio_set_transitory() mainly returns 0 and -ENOTSUPP, which is converted to 0. However the gpio_set_transitory() function calles the .set_config() function of the corresponding GPIO chip and there are some GPIO drivers in which some (unlikely) branches return other values like -EPROBE_DEFER, and -EINVAL. In these cases, the above mentioned FLAG_REQUESTED would not be reset, which results in the pin being blocked until the next reboot.
--- drivers/gpio/gpiolib-sysfs.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/gpio/gpiolib-sysfs.c +9 -6
@@ -474,14 +474,17 @@ static ssize_t export_store(const struct class *class, goto done; status =gpiod_set_transitory (desc, false); -if (!status) { - status =gpiod_export (desc, true); -if (status <0 ) -gpiod_free (desc); -else -set_bit (FLAG_SYSFS , &desc->flags); +if (status) { +gpiod_free (desc); + goto done; } + status =gpiod_export (desc, true); +if (status <0 ) +gpiod_free (desc); +else +set_bit (FLAG_SYSFS , &desc->flags); + done:if (status)pr_debug ("%s: status %d\n" , __func__, status);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 208/244 ASoC: ops: add correct range check for limiting volume
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit fb9ad24485087e0f00d84bee7a5914640b2b9024 upstream.
Volume can have ranges that start with negative values, ex: -84dB to +40dB. Apply correct range check in snd_soc_limit_volume before setting the platform_max. Without this patch, for example setting a 0dB limit on a volume range of -84dB to +40dB would fail.
--- sound/soc/soc-ops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/soc-ops.c +1 -1
@@ -661,7 +661,7 @@ int snd_soc_limit_volume(struct snd_soc_ kctl =snd_soc_card_get_kcontrol (card, name);if (kctl) {struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; -if (max <= mc->max) { +if (max <= mc->max - mc->min) { mc->platform_max = max; ret =0 ; }
Greg Kroah-Hartman
maintainerPATCH 209/244 kprobes: consistent rcu api usage for kretprobe holder
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: JP Kobryn <[email protected]>
commit d839a656d0f3caca9f96e9bf912fd394ac6a11bc upstream.
It seems that the pointer-to-kretprobe "rp" within the kretprobe_holder is RCU-managed, based on the (non-rethook) implementation of get_kretprobe(). The thought behind this patch is to make use of the RCU API where possible when accessing this pointer so that the needed barriers are always in place and to self-document the code.
The __rcu annotation to "rp" allows for sparse RCU checking. Plain writes done to the "rp" pointer are changed to make use of the RCU macro for assignment. For the single read, the implementation of get_kretprobe() is simplified by making use of an RCU macro which accomplishes the same, but note that the log warning text will be more generic.
I did find that there is a difference in assembly generated between the usage of the RCU macros vs without. For example, on arm64, when using rcu_assign_pointer(), the corresponding store instruction is a store-release (STLR) which has an implicit barrier. When normal assignment is done, a regular store (STR) is found. In the macro case, this seems to be a result of rcu_assign_pointer() using smp_store_release() when the value to write is not NULL.
--- include/linux/kprobes.h | 7 ++----- kernel/kprobes.c | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-)
include/linux/kprobes.h +2 -5
@@ -140,7 +140,7 @@ static inline bool kprobe_ftrace(struct* */ struct kretprobe_holder { -struct kretprobe *rp; +struct kretprobe __rcu *rp;refcount_t ref; };
@@ -248,10 +248,7 @@ unsigned long kretprobe_trampoline_handl static nokprobe_inline struct kretprobe *get_kretprobe(struct kretprobe_instance *ri) { -RCU_LOCKDEP_WARN (!rcu_read_lock_any_held (), -"Kretprobe is accessed from instance under preemptive context" ); - -return READ_ONCE (ri->rph->rp); +return rcu_dereference_check (ri->rph->rp,rcu_read_lock_any_held ()); }static nokprobe_inline unsigned long get_kretprobe_retaddr (struct kretprobe_instance *ri)
kernel/kprobes.c +2 -2
@@ -2253,7 +2253,7 @@ int register_kretprobe(struct kretprobeif (!rp->rph)return -ENOMEM ; - rp->rph->rp = rp; +rcu_assign_pointer (rp->rph->rp, rp);for (i =0 ; i < rp->maxactive; i++) { inst =kzalloc (struct_size (inst, data, rp->data_size),GFP_KERNEL );if (inst ==NULL ) {
@@ -2313,7 +2313,7 @@ void unregister_kretprobes(struct kretpr#ifdef CONFIG_KRETPROBE_ON_RETHOOK rethook_free (rps[i]->rh);#else - rps[i]->rph->rp =NULL ; +rcu_assign_pointer (rps[i]->rph->rp,NULL );#endif }mutex_unlock (&kprobe_mutex);
Greg Kroah-Hartman
maintainerPATCH 210/244 usb: gadget: f_hid: fix report descriptor allocation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Aladyshev <[email protected]>
commit 61890dc28f7d9e9aac8a9471302613824c22fae4 upstream.
The commit 89ff3dfac604 ("usb: gadget: f_hid: fix f_hidg lifetime vs cdev") has introduced a bug that leads to hid device corruption after the replug operation.
Reverse device managed memory allocation for the report descriptor to fix the issue.
Tested:
This change was tested on the AMD EthanolX CRB server with the BMC based on the OpenBMC distribution. The BMC provides KVM functionality via the USB gadget device:
- before: KVM page refresh results in a broken USB device,
- after: KVM page refresh works without any issues.
--- drivers/usb/gadget/function/f_hid.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/usb/gadget/function/f_hid.c +4 -3
@@ -92,6 +92,7 @@ static void hidg_release(struct device * { struct f_hidg *hidg = container_of(dev, struct f_hidg, dev); +kfree (hidg->report_desc);kfree (hidg->set_report_buf);kfree (hidg); }
@@ -1287,9 +1288,9 @@ static struct usb_function *hidg_alloc(s hidg->report_length = opts->report_length; hidg->report_desc_length = opts->report_desc_length;if (opts->report_desc) { - hidg->report_desc =devm_kmemdup (&hidg->dev, opts->report_desc, - opts->report_desc_length, -GFP_KERNEL ); + hidg->report_desc =kmemdup (opts->report_desc, + opts->report_desc_length, +GFP_KERNEL );if (!hidg->report_desc) { ret = -ENOMEM ; goto err_put_device;
Greg Kroah-Hartman
maintainerPATCH 211/244 nvmem: Do not expect fixed layouts to grab a layout driver
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miquel Raynal <[email protected]>
commit b7c1e53751cb3990153084f31c41f25fde3b629c upstream.
Two series lived in parallel for some time, which led to this situation:
- The nvmem-layout container is used for dynamic layouts
- We now expect fixed layouts to also use the nvmem-layout container but this does not require any additional driver, the support is built-in the nvmem core.
Ensure we don't refuse to probe for wrong reasons.
--- drivers/nvmem/core.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/nvmem/core.c +6 -0
@@ -796,6 +796,12 @@ static struct nvmem_layout *nvmem_layout_get(struct nvmem_device *nvmem)if (!layout_np)return NULL ; +/* Fixed layouts don't have a matching driver */ +if (of_device_is_compatible (layout_np,"fixed-layout" )) { +of_node_put (layout_np); +return NULL ; + } +/* * In case the nvmem device was built-in while the layout was built as a * module, we shall manually request the layout driver loading otherwise
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 212/244 serial: 8250_dw: Add ACPI ID for Granite Rapids-D UART
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit e92fad024929c79460403acf946bc9c09ce5c3a9 upstream.
Granite Rapids-D has an additional UART that is enumerated via ACPI. Add ACPI ID for it.
--- drivers/tty/serial/8250/8250_dw.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/8250/8250_dw.c +1 -0
@@ -798,6 +798,7 @@ static const struct acpi_device_id dw825 { "INT33C5", (kernel_ulong_t)&dw8250_dw_apb }, { "INT3434", (kernel_ulong_t)&dw8250_dw_apb }, { "INT3435", (kernel_ulong_t)&dw8250_dw_apb }, + { "INTC10EE", (kernel_ulong_t)&dw8250_dw_apb }, { }, };MODULE_DEVICE_TABLE (acpi, dw8250_acpi_match);
Greg Kroah-Hartman
maintainerPATCH 213/244 serial: ma35d1: Validate console index before assignment
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andi Shyti <[email protected]>
commit f0b9d97a77fa8f18400450713358303a435ab688 upstream.
The console is immediately assigned to the ma35d1 port without checking its index. This oversight can lead to out-of-bounds errors when the index falls outside the valid '0' to MA35_UART_NR range. Such scenario trigges ran error like the following:
UBSAN: array-index-out-of-bounds in drivers/tty/serial/ma35d1_serial.c:555:51 index -1 is out of range for type 'uart_ma35d1_port [17]
Check the index before using it and bail out with a warning.
--- drivers/tty/serial/ma35d1_serial.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/tty/serial/ma35d1_serial.c +9 -1
@@ -552,11 +552,19 @@ static void ma35d1serial_console_putchar*/ static void ma35d1serial_console_write (struct console *co,const char *s,u32 count) { -struct uart_ma35d1_port *up = &ma35d1serial_ports[co->index]; +struct uart_ma35d1_port *up;unsigned long flags;int locked =1 ;u32 ier; +if ((co->index <0 ) || (co->index >=MA35_UART_NR )) { +pr_warn ("Failed to write on ononsole port %x, out of range\n" , + co->index); +return ; + } + + up = &ma35d1serial_ports[co->index]; +if (up->port.sysrq) locked =0 ;else if (oops_in_progress)
Greg Kroah-Hartman
maintainerPATCH 214/244 parport: Add support for Brainboxes IX/UC/PX parallel cards
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cameron Williams <[email protected]>
commit 1a031f6edc460e9562098bdedc3918da07c30a6e upstream.
Adds support for Intashield IX-500/IX-550, UC-146/UC-157, PX-146/PX-157, PX-203 and PX-475 (LPT port)
--- drivers/parport/parport_pc.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/parport/parport_pc.c +21 -0
@@ -2658,6 +2658,8 @@ enum parport_pc_pci_cards { asix_ax99100, quatech_sppxp100, wch_ch382l, + brainboxes_uc146, + brainboxes_px203, };
@@ -2737,6 +2739,8 @@ static struct parport_pc_pci { /* asix_ax99100 */ { 1, { { 0, 1 }, } }, /* quatech_sppxp100 */ { 1, { { 0, 1 }, } }, /* wch_ch382l */ { 1, { { 2, -1 }, } }, + /* brainboxes_uc146 */ { 1, { { 3, -1 }, } }, + /* brainboxes_px203 */ { 1, { { 0, -1 }, } }, }; static const struct pci_device_id parport_pc_pci_tbl[] = {
@@ -2833,6 +2837,23 @@ static const struct pci_device_id parpor PCI_ANY_ID, PCI_ANY_ID, 0, 0, quatech_sppxp100 }, /* WCH CH382L PCI-E single parallel port card */ { 0x1c00, 0x3050, 0x1c00, 0x3050, 0, 0, wch_ch382l }, +/* Brainboxes IX-500/550 */ + { PCI_VENDOR_ID_INTASHIELD, 0x402a, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, oxsemi_pcie_pport }, +/* Brainboxes UC-146/UC-157 */ + { PCI_VENDOR_ID_INTASHIELD, 0x0be1, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc146 }, + { PCI_VENDOR_ID_INTASHIELD, 0x0be2, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_uc146 }, +/* Brainboxes PX-146/PX-257 */ + { PCI_VENDOR_ID_INTASHIELD, 0x401c, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, oxsemi_pcie_pport }, +/* Brainboxes PX-203 */ + { PCI_VENDOR_ID_INTASHIELD, 0x4007, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_px203 }, +/* Brainboxes PX-475 */ + { PCI_VENDOR_ID_INTASHIELD, 0x401f, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, oxsemi_pcie_pport }, { 0, } /* terminate list */ };MODULE_DEVICE_TABLE (pci, parport_pc_pci_tbl);
Greg Kroah-Hartman
maintainerPATCH 215/244 cifs: Fix non-availability of dedup breaking generic/304
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
commit 691a41d8da4b34fe72f09393505f55f28a8f34ec upstream.
Deduplication isn't supported on cifs, but cifs doesn't reject it, instead treating it as extent duplication/cloning. This can cause generic/304 to go silly and run for hours on end.
Fix cifs to indicate EOPNOTSUPP if REMAP_FILE_DEDUP is set in ->remap_file_range().
Note that it's unclear whether or not commit b073a08016a1 is meant to cause cifs to return an error if REMAP_FILE_DEDUP.
--- fs/smb/client/cifsfs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/smb/client/cifsfs.c +3 -1
@@ -1208,7 +1208,9 @@ static loff_t cifs_remap_file_range(struunsigned int xid;int rc; -if (remap_flags & ~(REMAP_FILE_DEDUP |REMAP_FILE_ADVISORY )) +if (remap_flags &REMAP_FILE_DEDUP ) +return -EOPNOTSUPP ; +if (remap_flags & ~REMAP_FILE_ADVISORY )return -EINVAL ;cifs_dbg (FYI ,"clone range\n" );
Greg Kroah-Hartman
maintainerPATCH 216/244 Revert "xhci: Loosen RPM as default policy to cover for AMD xHC 1.1"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit 24be0b3c40594a14b65141ced486ae327398faf8 upstream.
This reverts commit 4baf1218150985ee3ab0a27220456a1f027ea0ac.
Enabling runtime pm as default for all AMD xHC 1.1 controllers caused regression. An initial attempt to fix those was done in commit a5d6264b638e ("xhci: Enable RPM on controllers that support low-power states") but new issues are still seen.
Revert this to get those AMD xHC 1.1 systems working
This patch went to stable an needs to be reverted from there as well.
--- drivers/usb/host/xhci-pci.c | 2 -- 1 file changed, 2 deletions(-)
drivers/usb/host/xhci-pci.c +0 -2
@@ -535,8 +535,6 @@ static void xhci_pci_quirks(struct devic/* xHC spec requires PCI devices to support D3hot and D3cold */ if (xhci->hci_version >=0x120 ) xhci->quirks |=XHCI_DEFAULT_PM_RUNTIME_ALLOW ; -else if (pdev->vendor ==PCI_VENDOR_ID_AMD && xhci->hci_version >=0x110 ) - xhci->quirks |=XHCI_DEFAULT_PM_RUNTIME_ALLOW ;if (xhci->quirks &XHCI_RESET_ON_RESUME ) xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
Greg Kroah-Hartman
maintainerPATCH 217/244 smb: client: fix potential NULL deref in parse_dfs_referrals()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
commit 92414333eb375ed64f4ae92d34d579e826936480 upstream.
If server returned no data for FSCTL_DFS_GET_REFERRALS, @dfs_rsp will remain NULL and then parse_dfs_referrals() will dereference it.
Fix this by returning -EIO when no output data is returned.
Besides, we can't fix it in SMB2_ioctl() as some FSCTLs are allowed to return no data as per MS-SMB2 2.2.32.
--- fs/smb/client/smb2ops.c | 2 ++ 1 file changed, 2 insertions(+)
fs/smb/client/smb2ops.c +2 -0
@@ -2834,6 +2834,8 @@ smb2_get_dfs_refer(const unsigned int xiusleep_range (512 ,2048 ); }while (++retry_count <5 ); +if (!rc && !dfs_rsp) + rc = -EIO ;if (rc) {if (!is_retryable_error (rc) && rc != -ENOENT && rc != -EOPNOTSUPP )cifs_tcon_dbg (VFS ,"%s: ioctl error: rc=%d\n" , __func__, rc);
Greg Kroah-Hartman
maintainerPATCH 218/244 usb: typec: class: fix typec_altmode_put_partner to put plugs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: RD Babiera <[email protected]>
commit b17b7fe6dd5c6ff74b38b0758ca799cdbb79e26e upstream.
When typec_altmode_put_partner is called by a plug altmode upon release, the port altmode the plug belongs to will not remove its reference to the plug. The check to see if the altmode being released evaluates against the released altmode's partner instead of the calling altmode itself, so change adev in typec_altmode_put_partner to properly refer to the altmode being released.
typec_altmode_set_partner is not run for port altmodes, so also add a check in typec_altmode_release to prevent typec_altmode_put_partner() calls on port altmode release.
--- drivers/usb/typec/class.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/usb/typec/class.c +3 -2
@@ -266,7 +266,7 @@ static void typec_altmode_put_partner(stif (!partner)return ; - adev = &partner->adev; + adev = &altmode->adev;if (is_typec_plug (adev->dev.parent)) {struct typec_plug *plug =to_typec_plug (adev->dev.parent);
@@ -496,7 +496,8 @@ static void typec_altmode_release(struct {struct altmode *alt =to_altmode (to_typec_altmode (dev)); -typec_altmode_put_partner (alt); +if (!is_typec_port (dev->parent)) +typec_altmode_put_partner (alt);altmode_id_remove (alt->adev.dev.parent, alt->id);kfree (alt);
Greg Kroah-Hartman
maintainerPATCH 219/244 ARM: PL011: Fix DMA support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 58ac1b3799799069d53f5bf95c093f2fe8dd3cc5 upstream.
Since there is no guarantee that the memory returned by dma_alloc_coherent() is associated with a 'struct page', using the architecture specific phys_to_page() is wrong, but using virt_to_page() would be as well.
Stop using sg lists altogether and just use the *_single() functions instead. This also simplifies the code a bit since the scatterlists in this driver always have only one entry anyway.
https://lore.kernel.org/lkml/[email protected]/
Use consistent names for dma buffers
gc: Add a commit log from the initial thread:
https://lore.kernel.org/lkml/[email protected]/
Use consistent names for dma buffers
--- drivers/tty/serial/amba-pl011.c | 112 +++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 58 deletions(-)
drivers/tty/serial/amba-pl011.c +54 -58
@@ -218,17 +218,18 @@ static struct vendor_data vendor_st = {/* Deals with DMA transactions */ -struct pl011_sgbuf { -struct scatterlist sg; -char *buf; +struct pl011_dmabuf { +dma_addr_t dma; +size_t len; +char *buf; };struct pl011_dmarx_data {struct dma_chan *chan;struct completion complete;bool use_buf_b; -struct pl011_sgbuf sgbuf_a; -struct pl011_sgbuf sgbuf_b; +struct pl011_dmabuf dbuf_a; +struct pl011_dmabuf dbuf_b;dma_cookie_t cookie;bool running;struct timer_list timer;
@@ -241,7 +242,8 @@ struct pl011_dmarx_data {struct pl011_dmatx_data {struct dma_chan *chan; -struct scatterlist sg; +dma_addr_t dma; +size_t len;char *buf;bool queued; };
@@ -366,32 +368,24 @@ static int pl011_fifo_to_tty(struct uart#define PL011_DMA_BUFFER_SIZE PAGE_SIZE -static int pl011_sgbuf_init (struct dma_chan *chan,struct pl011_sgbuf *sg, +static int pl011_dmabuf_init (struct dma_chan *chan,struct pl011_dmabuf *db,enum dma_data_direction dir) { -dma_addr_t dma_addr; - - sg->buf =dma_alloc_coherent (chan->device->dev, -PL011_DMA_BUFFER_SIZE , &dma_addr,GFP_KERNEL ); -if (!sg->buf) + db->buf =dma_alloc_coherent (chan->device->dev,PL011_DMA_BUFFER_SIZE , + &db->dma,GFP_KERNEL ); +if (!db->buf)return -ENOMEM ; - -sg_init_table (&sg->sg,1 ); -sg_set_page (&sg->sg,phys_to_page (dma_addr), -PL011_DMA_BUFFER_SIZE ,offset_in_page (dma_addr)); -sg_dma_address (&sg->sg) = dma_addr; -sg_dma_len (&sg->sg) =PL011_DMA_BUFFER_SIZE ; + db->len =PL011_DMA_BUFFER_SIZE ;return 0 ; } -static void pl011_sgbuf_free (struct dma_chan *chan,struct pl011_sgbuf *sg, +static void pl011_dmabuf_free (struct dma_chan *chan,struct pl011_dmabuf *db,enum dma_data_direction dir) { -if (sg->buf) { +if (db->buf) {dma_free_coherent (chan->device->dev, -PL011_DMA_BUFFER_SIZE , sg->buf, -sg_dma_address (&sg->sg)); +PL011_DMA_BUFFER_SIZE , db->buf, db->dma); } }
@@ -552,8 +546,8 @@ static void pl011_dma_tx_callback(void *spin_lock_irqsave (&uap->port.lock, flags);if (uap->dmatx.queued) -dma_unmap_sg (dmatx->chan->device->dev, &dmatx->sg,1 , -DMA_TO_DEVICE ); +dma_unmap_single (dmatx->chan->device->dev, dmatx->dma, + dmatx->len,DMA_TO_DEVICE ); dmacr = uap->dmacr; uap->dmacr = dmacr & ~UART011_TXDMAE ;
@@ -639,18 +633,19 @@ static int pl011_dma_tx_refill(struct uamemcpy (&dmatx->buf[first], &xmit->buf[0 ], second); } - dmatx->sg.length = count; - -if (dma_map_sg (dma_dev->dev, &dmatx->sg,1 ,DMA_TO_DEVICE ) !=1 ) { + dmatx->len = count; + dmatx->dma =dma_map_single (dma_dev->dev, dmatx->buf, count, +DMA_TO_DEVICE ); +if (dmatx->dma ==DMA_MAPPING_ERROR ) { uap->dmatx.queued = false;dev_dbg (uap->port.dev,"unable to map TX DMA\n" );return -EBUSY ; } - desc =dmaengine_prep_slave_sg (chan, &dmatx->sg,1 ,DMA_MEM_TO_DEV , + desc =dmaengine_prep_slave_single (chan, dmatx->dma, dmatx->len,DMA_MEM_TO_DEV ,DMA_PREP_INTERRUPT |DMA_CTRL_ACK );if (!desc) { -dma_unmap_sg (dma_dev->dev, &dmatx->sg,1 ,DMA_TO_DEVICE ); +dma_unmap_single (dma_dev->dev, dmatx->dma, dmatx->len,DMA_TO_DEVICE ); uap->dmatx.queued = false;/* * If DMA cannot be used right now, we complete this
@@ -813,8 +808,8 @@ __acquires(&uap->port.lock)dmaengine_terminate_async (uap->dmatx.chan);if (uap->dmatx.queued) { -dma_unmap_sg (uap->dmatx.chan->device->dev, &uap->dmatx.sg,1 , -DMA_TO_DEVICE ); +dma_unmap_single (uap->dmatx.chan->device->dev, uap->dmatx.dma, + uap->dmatx.len,DMA_TO_DEVICE ); uap->dmatx.queued = false; uap->dmacr &= ~UART011_TXDMAE ;pl011_write (uap->dmacr, uap,REG_DMACR );
@@ -828,15 +823,15 @@ static int pl011_dma_rx_trigger_dma(strustruct dma_chan *rxchan = uap->dmarx.chan;struct pl011_dmarx_data *dmarx = &uap->dmarx;struct dma_async_tx_descriptor *desc; -struct pl011_sgbuf *sgbuf; +struct pl011_dmabuf *dbuf;if (!rxchan)return -EIO ;/* Start the RX DMA job */ - sgbuf = uap->dmarx.use_buf_b ? - &uap->dmarx.sgbuf_b : &uap->dmarx.sgbuf_a; - desc =dmaengine_prep_slave_sg (rxchan, &sgbuf->sg,1 , + dbuf = uap->dmarx.use_buf_b ? + &uap->dmarx.dbuf_b : &uap->dmarx.dbuf_a; + desc =dmaengine_prep_slave_single (rxchan, dbuf->dma, dbuf->len,DMA_DEV_TO_MEM ,DMA_PREP_INTERRUPT |DMA_CTRL_ACK );/*
@@ -876,8 +871,8 @@ static void pl011_dma_rx_chars(struct ua bool readfifo) {struct tty_port *port = &uap->port.state->port; -struct pl011_sgbuf *sgbuf = use_buf_b ? - &uap->dmarx.sgbuf_b : &uap->dmarx.sgbuf_a; +struct pl011_dmabuf *dbuf = use_buf_b ? + &uap->dmarx.dbuf_b : &uap->dmarx.dbuf_a;int dma_count =0 ;u32 fifotaken =0 ;/* only used for vdbg() */
@@ -886,7 +881,7 @@ static void pl011_dma_rx_chars(struct uaif (uap->dmarx.poll_rate) {/* The data can be taken by polling */ - dmataken = sgbuf->sg.length - dmarx->last_residue; + dmataken = dbuf->len - dmarx->last_residue;/* Recalculate the pending size */ if (pending >= dmataken) pending -= dmataken;
@@ -900,7 +895,7 @@ static void pl011_dma_rx_chars(struct ua* Note that tty_insert_flip_buf() tries to take as many chars * as it can. */ - dma_count =tty_insert_flip_string (port, sgbuf->buf + dmataken, + dma_count =tty_insert_flip_string (port, dbuf->buf + dmataken, pending); uap->port.icount.rx += dma_count;
@@ -911,7 +906,7 @@ static void pl011_dma_rx_chars(struct ua/* Reset the last_residue for Rx DMA poll */ if (uap->dmarx.poll_rate) - dmarx->last_residue = sgbuf->sg.length; + dmarx->last_residue = dbuf->len;/* * Only continue with trying to read the FIFO if all DMA chars have
@@ -946,8 +941,8 @@ static void pl011_dma_rx_irq(struct uart {struct pl011_dmarx_data *dmarx = &uap->dmarx;struct dma_chan *rxchan = dmarx->chan; -struct pl011_sgbuf *sgbuf = dmarx->use_buf_b ? - &dmarx->sgbuf_b : &dmarx->sgbuf_a; +struct pl011_dmabuf *dbuf = dmarx->use_buf_b ? + &dmarx->dbuf_b : &dmarx->dbuf_a;size_t pending;struct dma_tx_state state;enum dma_status dmastat;
@@ -969,7 +964,7 @@ static void pl011_dma_rx_irq(struct uartpl011_write (uap->dmacr, uap,REG_DMACR ); uap->dmarx.running = false; - pending = sgbuf->sg.length - state.residue; + pending = dbuf->len - state.residue;BUG_ON (pending >PL011_DMA_BUFFER_SIZE );/* Then we terminate the transfer - we now know our residue */ dmaengine_terminate_all (rxchan);
@@ -996,8 +991,8 @@ static void pl011_dma_rx_callback(void *struct pl011_dmarx_data *dmarx = &uap->dmarx;struct dma_chan *rxchan = dmarx->chan;bool lastbuf = dmarx->use_buf_b; -struct pl011_sgbuf *sgbuf = dmarx->use_buf_b ? - &dmarx->sgbuf_b : &dmarx->sgbuf_a; +struct pl011_dmabuf *dbuf = dmarx->use_buf_b ? + &dmarx->dbuf_b : &dmarx->dbuf_a;size_t pending;struct dma_tx_state state;int ret;
@@ -1015,7 +1010,7 @@ static void pl011_dma_rx_callback(void ** the DMA irq handler. So we check the residue here. */ rxchan->device->device_tx_status (rxchan, dmarx->cookie, &state); - pending = sgbuf->sg.length - state.residue; + pending = dbuf->len - state.residue;BUG_ON (pending >PL011_DMA_BUFFER_SIZE );/* Then we terminate the transfer - we now know our residue */ dmaengine_terminate_all (rxchan);
@@ -1067,16 +1062,16 @@ static void pl011_dma_rx_poll(struct timunsigned long flags;unsigned int dmataken =0 ;unsigned int size =0 ; -struct pl011_sgbuf *sgbuf; +struct pl011_dmabuf *dbuf;int dma_count;struct dma_tx_state state; - sgbuf = dmarx->use_buf_b ? &uap->dmarx.sgbuf_b : &uap->dmarx.sgbuf_a; + dbuf = dmarx->use_buf_b ? &uap->dmarx.dbuf_b : &uap->dmarx.dbuf_a; rxchan->device->device_tx_status (rxchan, dmarx->cookie, &state);if (likely (state.residue < dmarx->last_residue)) { - dmataken = sgbuf->sg.length - dmarx->last_residue; + dmataken = dbuf->len - dmarx->last_residue; size = dmarx->last_residue - state.residue; - dma_count =tty_insert_flip_string (port, sgbuf->buf + dmataken, + dma_count =tty_insert_flip_string (port, dbuf->buf + dmataken, size);if (dma_count == size) dmarx->last_residue = state.residue;
@@ -1123,7 +1118,7 @@ static void pl011_dma_startup(struct uarreturn ; } -sg_init_one (&uap->dmatx.sg, uap->dmatx.buf,PL011_DMA_BUFFER_SIZE ); + uap->dmatx.len =PL011_DMA_BUFFER_SIZE ;/* The DMA buffer is now the FIFO the TTY subsystem can use */ uap->port.fifosize =PL011_DMA_BUFFER_SIZE ;
@@ -1133,7 +1128,7 @@ static void pl011_dma_startup(struct uar goto skip_rx;/* Allocate and map DMA RX buffers */ - ret =pl011_sgbuf_init (uap->dmarx.chan, &uap->dmarx.sgbuf_a, + ret =pl011_dmabuf_init (uap->dmarx.chan, &uap->dmarx.dbuf_a,DMA_FROM_DEVICE );if (ret) { dev_err(uap->port.dev, "failed to init DMA %s: %d\n",
@@ -1141,12 +1136,12 @@ static void pl011_dma_startup(struct uar goto skip_rx; } - ret =pl011_sgbuf_init (uap->dmarx.chan, &uap->dmarx.sgbuf_b, + ret =pl011_dmabuf_init (uap->dmarx.chan, &uap->dmarx.dbuf_b,DMA_FROM_DEVICE );if (ret) {dev_err (uap->port.dev,"failed to init DMA %s: %d\n" ,"RX buffer B" , ret); -pl011_sgbuf_free (uap->dmarx.chan, &uap->dmarx.sgbuf_a, +pl011_dmabuf_free (uap->dmarx.chan, &uap->dmarx.dbuf_a,DMA_FROM_DEVICE ); goto skip_rx; }
@@ -1200,8 +1195,9 @@ static void pl011_dma_shutdown(struct ua/* In theory, this should already be done by pl011_dma_flush_buffer */ dmaengine_terminate_all (uap->dmatx.chan);if (uap->dmatx.queued) { -dma_unmap_sg (uap->dmatx.chan->device->dev, &uap->dmatx.sg,1 , -DMA_TO_DEVICE ); +dma_unmap_single (uap->dmatx.chan->device->dev, + uap->dmatx.dma, uap->dmatx.len, +DMA_TO_DEVICE ); uap->dmatx.queued = false; }
@@ -1212,8 +1208,8 @@ static void pl011_dma_shutdown(struct uaif (uap->using_rx_dma) {dmaengine_terminate_all (uap->dmarx.chan);/* Clean up the RX DMA */ -pl011_sgbuf_free (uap->dmarx.chan, &uap->dmarx.sgbuf_a,DMA_FROM_DEVICE ); -pl011_sgbuf_free (uap->dmarx.chan, &uap->dmarx.sgbuf_b,DMA_FROM_DEVICE ); +pl011_dmabuf_free (uap->dmarx.chan, &uap->dmarx.dbuf_a,DMA_FROM_DEVICE ); +pl011_dmabuf_free (uap->dmarx.chan, &uap->dmarx.dbuf_b,DMA_FROM_DEVICE );if (uap->dmarx.poll_rate)del_timer_sync (&uap->dmarx.timer); uap->using_rx_dma = false;
Greg Kroah-Hartman
maintainerPATCH 220/244 serial: sc16is7xx: address RX timeout interrupt errata
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Mack <[email protected]>
commit 08ce9a1b72e38cf44c300a44ac5858533eb3c860 upstream.
This device has a silicon bug that makes it report a timeout interrupt but no data in the FIFO.
The datasheet states the following in the errata section 18.1.4:
"If the host reads the receive FIFO at the same time as a time-out interrupt condition happens, the host might read 0xCC (time-out) in the Interrupt Indication Register (IIR), but bit 0 of the Line Status Register (LSR) is not set (means there is no data in the receive FIFO)."
The errata description seems to indicate it concerns only polled mode of operation when reading bit 0 of the LSR register. However, tests have shown and NXP has confirmed that the RXLVL register also yields 0 when the bug is triggered, and hence the IRQ driven implementation in this driver is equally affected.
This bug has hit us on production units and when it does, sc16is7xx_irq() would spin forever because sc16is7xx_port_irq() keeps seeing an interrupt in the IIR register that is not cleared because the driver does not call into sc16is7xx_handle_rx() unless the RXLVL register reports at least one byte in the FIFO.
Fix this by always reading one byte from the FIFO when this condition is detected in order to clear the interrupt. This approach was confirmed to be correct by NXP through their support channels.
Tested by: Hugo Villeneuve <[email protected]>
--- drivers/tty/serial/sc16is7xx.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/tty/serial/sc16is7xx.c +12 -0
@@ -767,6 +767,18 @@ static bool sc16is7xx_port_irq(struct sccase SC16IS7XX_IIR_RTOI_SRC :case SC16IS7XX_IIR_XOFFI_SRC : rxlen =sc16is7xx_port_read (port,SC16IS7XX_RXLVL_REG ); + +/* +* There is a silicon bug that makes the chip report a +* time-out interrupt but no data in the FIFO. This is +* described in errata section 18.1.4. +* +* When this happens, read one byte from the FIFO to +* clear the interrupt. +*/ +if (iir ==SC16IS7XX_IIR_RTOI_SRC && !rxlen) + rxlen =1 ; +if (rxlen)sc16is7xx_handle_rx (port, rxlen, iir);break ;
Greg Kroah-Hartman
maintainerPATCH 221/244 serial: 8250: 8250_omap: Clear UART_HAS_RHR_IT_DIS bit
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ronald Wahl <[email protected]>
commit 8973ab7a2441b286218f4a5c4c33680e2f139996 upstream.
This fixes commit 439c7183e5b9 ("serial: 8250: 8250_omap: Disable RX interrupt after DMA enable") which unfortunately set the UART_HAS_RHR_IT_DIS bit in the UART_OMAP_IER2 register and never cleared it.
--- drivers/tty/serial/8250/8250_omap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/tty/serial/8250/8250_omap.c +2 -2
@@ -914,7 +914,7 @@ static void __dma_rx_do_complete(structif (priv->habit &UART_HAS_RHR_IT_DIS ) { reg =serial_in (p,UART_OMAP_IER2 ); reg &= ~UART_OMAP_IER2_RHR_IT_DIS ; -serial_out (p,UART_OMAP_IER2 ,UART_OMAP_IER2_RHR_IT_DIS ); +serial_out (p,UART_OMAP_IER2 , reg); }dmaengine_tx_status (rxchan, cookie, &state);
@@ -1060,7 +1060,7 @@ static int omap_8250_rx_dma(struct uart_if (priv->habit &UART_HAS_RHR_IT_DIS ) { reg =serial_in (p,UART_OMAP_IER2 ); reg |=UART_OMAP_IER2_RHR_IT_DIS ; -serial_out (p,UART_OMAP_IER2 ,UART_OMAP_IER2_RHR_IT_DIS ); +serial_out (p,UART_OMAP_IER2 , reg); }dma_async_issue_pending (dma->rxchan);
Greg Kroah-Hartman
maintainerPATCH 222/244 serial: 8250: 8250_omap: Do not start RX DMA on THRI interrupt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ronald Wahl <[email protected]>
commit c6bb057418876cdfdd29a6f7b8cef54539ee8811 upstream.
Starting RX DMA on THRI interrupt is too early because TX may not have finished yet.
This change is inspired by commit 90b8596ac460 ("serial: 8250: Prevent starting up DMA Rx on THRI interrupt") and fixes DMA issues I had with an AM62 SoC that is using the 8250 OMAP variant.
--- drivers/tty/serial/8250/8250_omap.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/tty/serial/8250/8250_omap.c +6 -4
@@ -1282,10 +1282,12 @@ static int omap_8250_dma_handle_irq(stru status =serial_port_in (port,UART_LSR ); -if (priv->habit &UART_HAS_EFR2 ) -am654_8250_handle_rx_dma (up, iir, status); -else - status =omap_8250_handle_rx_dma (up, iir, status); +if ((iir &0x3f ) !=UART_IIR_THRI ) { +if (priv->habit &UART_HAS_EFR2 ) +am654_8250_handle_rx_dma (up, iir, status); +else + status =omap_8250_handle_rx_dma (up, iir, status); + }serial8250_modem_status (up);if (status &UART_LSR_THRE && up->dma->tx_err) {
Greg Kroah-Hartman
maintainerPATCH 223/244 serial: 8250_omap: Add earlycon support for the AM654 UART controller
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ronald Wahl <[email protected]>
commit 8e42c301ce64e0dcca547626eb486877d502d336 upstream.
Currently there is no support for earlycon on the AM654 UART controller. This commit adds it.
--- drivers/tty/serial/8250/8250_early.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/8250/8250_early.c +1 -0
@@ -189,5 +189,6 @@ static int __init early_omap8250_setup(sOF_EARLYCON_DECLARE (omap8250,"ti,omap2-uart" , early_omap8250_setup);OF_EARLYCON_DECLARE (omap8250,"ti,omap3-uart" , early_omap8250_setup);OF_EARLYCON_DECLARE (omap8250,"ti,omap4-uart" , early_omap8250_setup); +OF_EARLYCON_DECLARE (omap8250,"ti,am654-uart" , early_omap8250_setup);#endif
Greg Kroah-Hartman
maintainerPATCH 224/244 devcoredump: Send uevent once devcd is ready
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mukesh Ojha <[email protected]>
commit af54d778a03853801d681c98c0c2a6c316ef9ca7 upstream.
dev_coredumpm() creates a devcoredump device and adds it to the core kernel framework which eventually end up sending uevent to the user space and later creates a symbolic link to the failed device. An application running in userspace may be interested in this symbolic link to get the name of the failed device.
In a issue scenario, once uevent sent to the user space it start reading '/sys/class/devcoredump/devcdX/failing_device' to get the actual name of the device which might not been created and it is in its path of creation.
To fix this, suppress sending uevent till the failing device symbolic link gets created and send uevent once symbolic link is created successfully.
--- drivers/base/devcoredump.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/base/devcoredump.c +3 -0
@@ -362,6 +362,7 @@ void dev_coredumpm(struct device *dev, s devcd->devcd_dev.class = &devcd_class;mutex_lock (&devcd->mutex); +dev_set_uevent_suppress (&devcd->devcd_dev, true);if (device_add (&devcd->devcd_dev)) goto put_device;
@@ -376,6 +377,8 @@ void dev_coredumpm(struct device *dev, s "devcoredump"))dev_warn (dev,"devcoredump create_link failed\n" ); +dev_set_uevent_suppress (&devcd->devcd_dev, false); +kobject_uevent (&devcd->devcd_dev.kobj,KOBJ_ADD );INIT_DELAYED_WORK (&devcd->del_wk, devcd_del);schedule_delayed_work (&devcd->del_wk,DEVCD_TIMEOUT );mutex_unlock (&devcd->mutex);
Greg Kroah-Hartman
maintainerPATCH 225/244 x86/CPU/AMD: Check vendor in the AMD microcode callback
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Borislav Petkov (AMD) <[email protected]>
commit 9b8493dc43044376716d789d07699f17d538a7c4 upstream.
Commit in Fixes added an AMD-specific microcode callback. However, it didn't check the CPU vendor the kernel runs on explicitly.
The only reason the Zenbleed check in it didn't run on other x86 vendors hardware was pure coincidental luck:
if (!cpu_has_amd_erratum(c, amd_zenbleed))
return;
gives true on other vendors because they don't have those families and models.
However, with the removal of the cpu_has_amd_erratum() in
05f5f73936fa ("x86/CPU/AMD: Drop now unused CPU erratum checking function")
that coincidental condition is gone, leading to the zenbleed check getting executed on other vendors too.
Add the explicit vendor check for the whole callback as it should've been done in the first place.
--- arch/x86/kernel/cpu/amd.c | 3 +++ 1 file changed, 3 insertions(+)
arch/x86/kernel/cpu/amd.c +3 -0
@@ -1315,6 +1315,9 @@ static void zenbleed_check_cpu(void *unuvoid amd_check_microcode (void ) { +if (boot_cpu_data.x86_vendor !=X86_VENDOR_AMD ) +return ; +on_each_cpu (zenbleed_check_cpu,NULL ,1 ); }
Greg Kroah-Hartman
maintainerPATCH 226/244 powerpc/ftrace: Fix stack teardown in ftrace_no_trace
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naveen N Rao <[email protected]>
commit 4b3338aaa74d7d4ec5b6734dc298f0db94ec83d2 upstream.
Commit 41a506ef71eb ("powerpc/ftrace: Create a dummy stackframe to fix stack unwind") added use of a new stack frame on ftrace entry to fix stack unwind. However, the commit missed updating the offset used while tearing down the ftrace stack when ftrace is disabled. Fix the same.
In addition, the commit missed saving the correct stack pointer in pt_regs. Update the same.
--- arch/powerpc/kernel/trace/ftrace_entry.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/kernel/trace/ftrace_entry.S +2 -2
@@ -62,7 +62,7 @@ .endif /* Save previous stack pointer (r1) */ - addi r8, r1, SWITCH_FRAME_SIZE + addi r8, r1, SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE PPC_STL r8, GPR1(r1) .if \allregs == 1
@@ -182,7 +182,7 @@ ftrace_no_trace: mflr r3 mtctr r3 REST_GPR(3, r1) - addi r1, r1, SWITCH_FRAME_SIZE + addi r1, r1, SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE mtlr r0 bctr #endif
Greg Kroah-Hartman
maintainerPATCH 227/244 USB: gadget: core: adjust uevent timing on gadget unbind
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roy Luo <[email protected]>
commit 73ea73affe8622bdf292de898da869d441da6a9d upstream.
The KOBJ_CHANGE uevent is sent before gadget unbind is actually executed, resulting in inaccurate uevent emitted at incorrect timing (the uevent would have USB_UDC_DRIVER variable set while it would soon be removed).
Move the KOBJ_CHANGE uevent to the end of the unbind function so that uevent is sent only after the change has been made.
--- drivers/usb/gadget/udc/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/gadget/udc/core.c +2 -2
@@ -1635,8 +1635,6 @@ static void gadget_unbind_driver(structdev_dbg (&udc->dev,"unbinding gadget driver [%s]\n" , driver->function); -kobject_uevent (&udc->dev.kobj,KOBJ_CHANGE ); - udc->allow_connect = false;cancel_work_sync (&udc->vbus_work);mutex_lock (&udc->connect_lock);
@@ -1656,6 +1654,8 @@ static void gadget_unbind_driver(struct driver->is_bound = false; udc->driver =NULL ;mutex_unlock (&udc_lock); + +kobject_uevent (&udc->dev.kobj,KOBJ_CHANGE ); }/* ------------------------------------------------------------------------- */
Greg Kroah-Hartman
maintainerPATCH 228/244 cifs: Fix flushing, invalidation and file size with copy_file_range()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
commit 7b2404a886f8b91250c31855d287e632123e1746 upstream.
Fix a number of issues in the cifs filesystem implementation of the copy_file_range() syscall in cifs_file_copychunk_range().
Firstly, the invalidation of the destination range is handled incorrectly:
We shouldn't just invalidate the whole file as dirty data in the file may get lost and we can't just call truncate_inode_pages_range() to invalidate the destination range as that will erase parts of a partial folio at each end whilst invalidating and discarding all the folios in the middle. We need to force all the folios covering the range to be reloaded, but we mustn't lose dirty data in them that's not in the destination range.
Further, we shouldn't simply round out the range to PAGE_SIZE at each end as cifs should move to support multipage folios.
Secondly, there's an issue whereby a write may have extended the file locally, but not have been written back yet. This can leaves the local idea of the EOF at a later point than the server's EOF. If a copy request is issued, this will fail on the server with STATUS_INVALID_VIEW_SIZE (which gets translated to -EIO locally) if the copy source extends past the server's EOF.
Fix this by:
(0) Flush the source region (already done). The flush does nothing and the EOF isn't moved if the source region has no dirty data.
(1) Move the EOF to the end of the source region if it isn't already at least at this point. If we can't do this, for instance if the server doesn't support it, just flush the entire source file.
(2) Find the folio (if present) at each end of the range, flushing it and increasing the region-to-be-invalidated to cover those in their entirety.
(3) Fully discard all the folios covering the range as we want them to be reloaded.
(4) Then perform the copy.
Thirdly, set i_size after doing the copychunk_range operation as this value may be used by various things internally. stat() hides the issue because setting ->time to 0 causes cifs_getatr() to revalidate the attributes.
These were causing the generic/075 xfstest to fail.
--- fs/smb/client/cifsfs.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 3 deletions(-)
fs/smb/client/cifsfs.c +99 -3
@@ -1196,6 +1196,72 @@ const struct inode_operations cifs_symli .listxattr = cifs_listxattr, }; +/* +* Advance the EOF marker to after the source range. +*/ +static int cifs_precopy_set_eof (struct inode *src_inode,struct cifsInodeInfo *src_cifsi, +struct cifs_tcon *src_tcon, +unsigned int xid,loff_t src_end) +{ +struct cifsFileInfo *writeable_srcfile; +int rc = -EINVAL ; + + writeable_srcfile =find_writable_file (src_cifsi,FIND_WR_FSUID_ONLY ); +if (writeable_srcfile) { +if (src_tcon->ses->server->ops->set_file_size) + rc = src_tcon->ses->server->ops->set_file_size ( + xid, src_tcon, writeable_srcfile, + src_inode->i_size, true/* no need to set sparse */ ); +else + rc = -ENOSYS ; +cifsFileInfo_put (writeable_srcfile); +cifs_dbg (FYI ,"SetFSize for copychunk rc = %d\n" , rc); + } + +if (rc <0 ) + goto set_failed; + +netfs_resize_file (&src_cifsi->netfs, src_end); +fscache_resize_cookie (cifs_inode_cookie (src_inode), src_end); +return 0 ; + +set_failed: +return filemap_write_and_wait (src_inode->i_mapping); +} + +/* +* Flush out either the folio that overlaps the beginning of a range in which +* pos resides or the folio that overlaps the end of a range unless that folio +* is entirely within the range we're going to invalidate. We extend the flush +* bounds to encompass the folio. +*/ +static int cifs_flush_folio (struct inode *inode,loff_t pos,loff_t *_fstart,loff_t *_fend, +bool first) +{ +struct folio *folio; +unsigned long long fpos, fend; +pgoff_t index = pos /PAGE_SIZE ; +size_t size; +int rc =0 ; + + folio =filemap_get_folio (inode->i_mapping, index); +if (IS_ERR (folio)) +return 0 ; + + size =folio_size (folio); + fpos =folio_pos (folio); + fend = fpos + size -1 ; + *_fstart = min_t(unsigned long long, *_fstart, fpos); + *_fend = max_t(unsigned long long, *_fend, fend); +if ((first && pos == fpos) || (!first && pos == fend)) + goto out; + + rc =filemap_write_and_wait_range (inode->i_mapping, fpos, fend); +out: +folio_put (folio); +return rc; +} +static loff_t cifs_remap_file_range (struct file *src_file,loff_t off,struct file *dst_file,loff_t destoff,loff_t len,unsigned int remap_flags)
@@ -1265,10 +1331,12 @@ ssize_t cifs_file_copychunk_range(unsign {struct inode *src_inode =file_inode (src_file);struct inode *target_inode =file_inode (dst_file); +struct cifsInodeInfo *src_cifsi =CIFS_I (src_inode);struct cifsFileInfo *smb_file_src;struct cifsFileInfo *smb_file_target;struct cifs_tcon *src_tcon;struct cifs_tcon *target_tcon; +unsigned long long destend, fstart, fend;ssize_t rc;cifs_dbg (FYI ,"copychunk range\n" );
@@ -1308,13 +1376,41 @@ ssize_t cifs_file_copychunk_range(unsignif (rc) goto unlock; -/* should we flush first and last page first */ -truncate_inode_pages (&target_inode->i_data,0 ); +/* The server-side copy will fail if the source crosses the EOF marker. +* Advance the EOF marker after the flush above to the end of the range +* if it's short of that. +*/ +if (src_cifsi->server_eof < off + len) { + rc =cifs_precopy_set_eof (src_inode, src_cifsi, src_tcon, xid, off + len); +if (rc <0 ) + goto unlock; + } + + destend = destoff + len -1 ; + +/* Flush the folios at either end of the destination range to prevent +* accidental loss of dirty data outside of the range. +*/ + fstart = destoff; + fend = destend; + + rc =cifs_flush_folio (target_inode, destoff, &fstart, &fend, true); +if (rc) + goto unlock; + rc =cifs_flush_folio (target_inode, destend, &fstart, &fend, false); +if (rc) + goto unlock; + +/* Discard all the folios that overlap the destination region. */ +truncate_inode_pages_range (&target_inode->i_data, fstart, fend); rc =file_modified (dst_file); -if (!rc) +if (!rc) { rc = target_tcon->ses->server->ops->copychunk_range (xid, smb_file_src, smb_file_target, off, len, destoff); +if (rc >0 && destoff + rc >i_size_read (target_inode)) +truncate_setsize (target_inode, destoff + rc); + }file_accessed (src_file);
Greg Kroah-Hartman
maintainerPATCH 229/244 cifs: Fix flushing, invalidation and file size with FICLONE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
commit c54fc3a4f375663f2361a9cbb2955fb4ef912879 upstream.
Fix a number of issues in the cifs filesystem implementation of the FICLONE ioctl in cifs_remap_file_range(). This is analogous to the previously fixed bug in cifs_file_copychunk_range() and can share the helper functions.
Firstly, the invalidation of the destination range is handled incorrectly:
We shouldn't just invalidate the whole file as dirty data in the file may get lost and we can't just call truncate_inode_pages_range() to invalidate the destination range as that will erase parts of a partial folio at each end whilst invalidating and discarding all the folios in the middle. We need to force all the folios covering the range to be reloaded, but we mustn't lose dirty data in them that's not in the destination range.
Further, we shouldn't simply round out the range to PAGE_SIZE at each end as cifs should move to support multipage folios.
Secondly, there's an issue whereby a write may have extended the file locally, but not have been written back yet. This can leaves the local idea of the EOF at a later point than the server's EOF. If a clone request is issued, this will fail on the server with STATUS_INVALID_VIEW_SIZE (which gets translated to -EIO locally) if the clone source extends past the server's EOF.
Fix this by:
(0) Flush the source region (already done). The flush does nothing and the EOF isn't moved if the source region has no dirty data.
(1) Move the EOF to the end of the source region if it isn't already at least at this point. If we can't do this, for instance if the server doesn't support it, just flush the entire source file.
(2) Find the folio (if present) at each end of the range, flushing it and increasing the region-to-be-invalidated to cover those in their entirety.
(3) Fully discard all the folios covering the range as we want them to be reloaded.
(4) Then perform the extent duplication.
Thirdly, set i_size after doing the duplicate_extents operation as this value may be used by various things internally. stat() hides the issue because setting ->time to 0 causes cifs_getatr() to revalidate the attributes.
These were causing the cifs/001 xfstest to fail.
--- fs/smb/client/cifsfs.c | 68 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 11 deletions(-)
fs/smb/client/cifsfs.c +57 -11
@@ -1268,9 +1268,12 @@ static loff_t cifs_remap_file_range(stru {struct inode *src_inode =file_inode (src_file);struct inode *target_inode =file_inode (dst_file); +struct cifsInodeInfo *src_cifsi =CIFS_I (src_inode); +struct cifsInodeInfo *target_cifsi =CIFS_I (target_inode);struct cifsFileInfo *smb_file_src = src_file->private_data; -struct cifsFileInfo *smb_file_target; -struct cifs_tcon *target_tcon; +struct cifsFileInfo *smb_file_target = dst_file->private_data; +struct cifs_tcon *target_tcon, *src_tcon; +unsigned long long destend, fstart, fend, new_size;unsigned int xid;int rc;
@@ -1283,13 +1286,13 @@ static loff_t cifs_remap_file_range(stru xid =get_xid (); -if (!src_file->private_data || !dst_file->private_data) { +if (!smb_file_src || !smb_file_target) { rc = -EBADF ;cifs_dbg (VFS ,"missing cifsFileInfo on copy range src file\n" ); goto out; } - smb_file_target = dst_file->private_data; + src_tcon =tlink_tcon (smb_file_src->tlink); target_tcon =tlink_tcon (smb_file_target->tlink);/*
@@ -1302,20 +1305,63 @@ static loff_t cifs_remap_file_range(struif (len ==0 ) len = src_inode->i_size - off; -cifs_dbg (FYI ,"about to flush pages\n" ); -/* should we flush first and last page first */ -truncate_inode_pages_range (&target_inode->i_data, destoff, -PAGE_ALIGN (destoff + len)-1 ); +cifs_dbg (FYI ,"clone range\n" ); + +/* Flush the source buffer */ + rc =filemap_write_and_wait_range (src_inode->i_mapping, off, + off + len -1 ); +if (rc) + goto unlock; + +/* The server-side copy will fail if the source crosses the EOF marker. +* Advance the EOF marker after the flush above to the end of the range +* if it's short of that. +*/ +if (src_cifsi->netfs.remote_i_size < off + len) { + rc =cifs_precopy_set_eof (src_inode, src_cifsi, src_tcon, xid, off + len); +if (rc <0 ) + goto unlock; + } + + new_size = destoff + len; + destend = destoff + len -1 ; -if (target_tcon->ses->server->ops->duplicate_extents) +/* Flush the folios at either end of the destination range to prevent +* accidental loss of dirty data outside of the range. +*/ + fstart = destoff; + fend = destend; + + rc =cifs_flush_folio (target_inode, destoff, &fstart, &fend, true); +if (rc) + goto unlock; + rc =cifs_flush_folio (target_inode, destend, &fstart, &fend, false); +if (rc) + goto unlock; + +/* Discard all the folios that overlap the destination region. */ +cifs_dbg (FYI ,"about to discard pages %llx-%llx\n" , fstart, fend); +truncate_inode_pages_range (&target_inode->i_data, fstart, fend); + +fscache_invalidate (cifs_inode_cookie (target_inode),NULL , +i_size_read (target_inode),0 ); + + rc = -EOPNOTSUPP ; +if (target_tcon->ses->server->ops->duplicate_extents) { rc = target_tcon->ses->server->ops->duplicate_extents (xid, smb_file_src, smb_file_target, off, len, destoff); -else - rc = -EOPNOTSUPP ; +if (rc ==0 && new_size >i_size_read (target_inode)) { +truncate_setsize (target_inode, new_size); +netfs_resize_file (&target_cifsi->netfs, new_size); +fscache_resize_cookie (cifs_inode_cookie (target_inode), + new_size); + } + }/* force revalidate of size and timestamps of target file now that target is updated on the server */ CIFS_I (target_inode)->time =0 ; +unlock:/* although unlocking in the reverse order from locking is not strictly necessary here it is a little cleaner to be consistent */ unlock_two_nondirectories (src_inode, target_inode);
Greg Kroah-Hartman
maintainerPATCH 230/244 MIPS: kernel: Clear FPU states when setting up kernel threads
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Bogendoerfer <[email protected]>
commit a58a173444a68412bb08849bd81c679395f20ca0 upstream.
io_uring sets up the io worker kernel thread via a syscall out of an user space prrocess. This process might have used FPU and since copy_thread() didn't clear FPU states for kernel threads a BUG() is triggered for using FPU inside kernel. Move code around to always clear FPU state for user and kernel threads.
--- arch/mips/kernel/process.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
arch/mips/kernel/process.c +13 -12
@@ -121,6 +121,19 @@ int copy_thread(struct task_struct *p, c/* Put the stack after the struct pt_regs. */ childksp = (unsigned long ) childregs; p->thread.cp0_status = (read_c0_status () & ~(ST0_CU2 |ST0_CU1 )) |ST0_KERNEL_CUMASK ; + +/* +* New tasks lose permission to use the fpu. This accelerates context +* switching for most programs since they don't use the fpu. +*/ +clear_tsk_thread_flag (p,TIF_USEDFPU ); +clear_tsk_thread_flag (p,TIF_USEDMSA ); +clear_tsk_thread_flag (p,TIF_MSA_CTX_LIVE ); + +#ifdef CONFIG_MIPS_MT_FPAFF +clear_tsk_thread_flag (p,TIF_FPUBOUND ); +#endif /* CONFIG_MIPS_MT_FPAFF */ +if (unlikely (args->fn)) {/* kernel thread */ unsigned long status = p->thread.cp0_status;
@@ -149,20 +162,8 @@ int copy_thread(struct task_struct *p, c p->thread.reg29 = (unsigned long ) childregs; p->thread.reg31 = (unsigned long ) ret_from_fork; -/* -* New tasks lose permission to use the fpu. This accelerates context -* switching for most programs since they don't use the fpu. -*/ childregs->cp0_status &= ~(ST0_CU2 |ST0_CU1 ); -clear_tsk_thread_flag (p,TIF_USEDFPU ); -clear_tsk_thread_flag (p,TIF_USEDMSA ); -clear_tsk_thread_flag (p,TIF_MSA_CTX_LIVE ); - -#ifdef CONFIG_MIPS_MT_FPAFF -clear_tsk_thread_flag (p,TIF_FPUBOUND ); -#endif /* CONFIG_MIPS_MT_FPAFF */ -#ifdef CONFIG_MIPS_FP_SUPPORT atomic_set (&p->thread.bd_emu_frame,BD_EMUFRAME_NONE );#endif
Greg Kroah-Hartman
maintainerPATCH 231/244 KVM: s390/mm: Properly reset no-dat
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudio Imbrenda <[email protected]>
commit 27072b8e18a73ffeffb1c140939023915a35134b upstream.
When the CMMA state needs to be reset, the no-dat bit also needs to be reset. Failure to do so could cause issues in the guest, since the guest expects the bit to be cleared after a reset.
Message-ID: <[email protected]>
--- arch/s390/mm/pgtable.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/mm/pgtable.c +1 -1
@@ -756,7 +756,7 @@ void ptep_zap_unused(struct mm_struct *mpte_clear (mm, addr, ptep); }if (reset) -pgste_val (pgste) &= ~_PGSTE_GPS_USAGE_MASK; +pgste_val (pgste) &= ~(_PGSTE_GPS_USAGE_MASK | _PGSTE_GPS_NODAT);pgste_set_unlock (ptep, pgste);preempt_enable (); }
Greg Kroah-Hartman
maintainerPATCH 232/244 KVM: SVM: Update EFER software model on CR0 trap for SEV-ES
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit 4cdf351d3630a640ab6a05721ef055b9df62277f upstream.
In general, activating long mode involves setting the EFER_LME bit in the EFER register and then enabling the X86_CR0_PG bit in the CR0 register. At this point, the EFER_LMA bit will be set automatically by hardware.
In the case of SVM/SEV guests where writes to CR0 are intercepted, it's necessary for the host to set EFER_LMA on behalf of the guest since hardware does not see the actual CR0 write.
In the case of SEV-ES guests where writes to CR0 are trapped instead of intercepted, the hardware *does* see/record the write to CR0 before exiting and passing the value on to the host, so as part of enabling SEV-ES support commit f1c6366e3043 ("KVM: SVM: Add required changes to support intercepts under SEV-ES") dropped special handling of the EFER_LMA bit with the understanding that it would be set automatically.
However, since the guest never explicitly sets the EFER_LMA bit, the host never becomes aware that it has been set. This becomes problematic when userspace tries to get/set the EFER values via KVM_GET_SREGS/KVM_SET_SREGS, since the EFER contents tracked by the host will be missing the EFER_LMA bit, and when userspace attempts to pass the EFER value back via KVM_SET_SREGS it will fail a sanity check that asserts that EFER_LMA should always be set when X86_CR0_PG and EFER_LME are set.
Fix this by always inferring the value of EFER_LMA based on X86_CR0_PG and EFER_LME, regardless of whether or not SEV-ES is enabled.
Message-Id: <[email protected]>
[A two year old patch that was revived after we noticed the failure in
KVM_SET_SREGS and a similar patch was posted by Michael Roth. This is Sean's patch, but with Michael's more complete commit message. - Paolo]
--- arch/x86/kvm/svm/svm.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/x86/kvm/svm/svm.c +5 -3
@@ -1873,15 +1873,17 @@ void svm_set_cr0(struct kvm_vcpu *vcpu,bool old_paging =is_paging (vcpu);#ifdef CONFIG_X86_64 -if (vcpu->arch.efer &EFER_LME && !vcpu->arch.guest_state_protected) { +if (vcpu->arch.efer &EFER_LME ) {if (!is_paging (vcpu) && (cr0 &X86_CR0_PG )) { vcpu->arch.efer |=EFER_LMA ; - svm->vmcb->save.efer |=EFER_LMA |EFER_LME ; +if (!vcpu->arch.guest_state_protected) + svm->vmcb->save.efer |=EFER_LMA |EFER_LME ; }if (is_paging (vcpu) && !(cr0 &X86_CR0_PG )) { vcpu->arch.efer &= ~EFER_LMA ; - svm->vmcb->save.efer &= ~(EFER_LMA |EFER_LME ); +if (!vcpu->arch.guest_state_protected) + svm->vmcb->save.efer &= ~(EFER_LMA |EFER_LME ); } }#endif
Greg Kroah-Hartman
maintainerPATCH 233/244 perf list: Fix JSON segfault by setting the used skip_duplicate_pmus callback
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
commit b1693747487442984050eb0f462b83a3a8307525 upstream.
Json output didn't set the skip_duplicate_pmus callback yielding a segfault.
--- tools/perf/builtin-list.c | 6 ++++++ 1 file changed, 6 insertions(+)
tools/perf/builtin-list.c +6 -0
@@ -434,6 +434,11 @@ static void json_print_metric(void *ps __maybe_unused, const char *group,strbuf_release (&buf); } +static bool json_skip_duplicate_pmus (void *ps__maybe_unused ) +{ +return false; +} +static bool default_skip_duplicate_pmus (void *ps) {struct print_state *print_state = ps;
@@ -503,6 +508,7 @@ int cmd_list(int argc, const char **argv) .print_end = json_print_end, .print_event = json_print_event, .print_metric = json_print_metric, + .skip_duplicate_pmus = json_skip_duplicate_pmus, }; ps = &json_ps; }else {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 234/244 perf metrics: Avoid segv if default metricgroup isnt set
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
commit e2b005d6ec0e738df584190e21d2c7ada37266a0 upstream.
A metric is default by having "Default" within its groups. The default metricgroup name needn't be set and this can result in segv in default_metricgroup_cmp and perf_stat__print_shadow_stats_metricgroup that assume it has a value when there is a Default metric group. To avoid the segv initialize the value to "".
--- tools/perf/util/metricgroup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/metricgroup.c +1 -1
@@ -225,7 +225,7 @@ static struct metric *metric__new(const struct pmu_metric *pm, m->pmu = pm->pmu ?:"cpu" ; m->metric_name = pm->metric_name; - m->default_metricgroup_name = pm->default_metricgroup_name; + m->default_metricgroup_name = pm->default_metricgroup_name ?:"" ; m->modifier =NULL ;if (modifier) { m->modifier =strdup (modifier);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 235/244 MIPS: Loongson64: Reserve vgabios memory on boot
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
commit 8f7aa77a463f47c9e00592d02747a9fcf2271543 upstream.
vgabios is passed from firmware to kernel on Loongson64 systems. Sane firmware will keep this pointer in reserved memory space passed from the firmware but insane firmware keeps it in low memory before kernel entry that is not reserved.
Previously kernel won't try to allocate memory from low memory before kernel entry on boot, but after converting to memblock it will do that.
Fix by resversing those memory on early boot.
--- arch/mips/loongson64/init.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/mips/loongson64/init.c +5 -0
@@ -88,6 +88,11 @@ void __init szmem(unsigned int node)break ; } } + +/* Reserve vgabios if it comes from firmware */ +if (loongson_sysconf.vgabios_addr) +memblock_reserve (virt_to_phys ((void *)loongson_sysconf.vgabios_addr), +SZ_256K ); }#ifndef CONFIG_NUMA
Greg Kroah-Hartman
maintainerPATCH 236/244 MIPS: Loongson64: Handle more memory types passed from firmware
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
commit c7206e7bd214ebb3ca6fa474a4423662327d9beb upstream.
There are many types of revsered memory passed from firmware that should be reserved in memblock, and UMA memory passed from firmware that should be added to system memory for system to use.
Also for memblock there is no need to align those space into page, which actually cause problems.
Handle them properly to prevent memory corruption on some systems.
--- arch/mips/include/asm/mach-loongson64/boot_param.h | 6 ++- arch/mips/loongson64/init.c | 42 +++++++++++++-------- 2 files changed, 31 insertions(+), 17 deletions(-)
arch/mips/include/asm/mach-loongson64/boot_param.h +5 -1
@@ -14,7 +14,11 @@#define ADAPTER_ROM 8#define ACPI_TABLE 9#define SMBIOS_TABLE 10 -#define MAX_MEMORY_TYPE 11 +#define UMA_VIDEO_RAM 11 +#define VUMA_VIDEO_RAM 12 +#define MAX_MEMORY_TYPE 13 + +#define MEM_SIZE_IS_IN_BYTES (1 << 31)#define LOONGSON3_BOOT_MEM_MAP_MAX 128struct efi_memory_map_loongson {
arch/mips/loongson64/init.c +26 -16
61 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 237/244 MIPS: Loongson64: Enable DMA noncoherent support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
commit edc0378eee00200a5bedf1bb9f00ad390e0d1bd4 upstream.
There are some Loongson64 systems come with broken coherent DMA support, firmware will set a bit in boot_param and pass nocoherentio in cmdline.
However nonconherent support was missed out when spin off Loongson-2EF form Loongson64, and that boot_param change never made itself into upstream.
Support DMA noncoherent properly to get those systems working.
--- arch/mips/Kconfig | 2 ++ arch/mips/include/asm/mach-loongson64/boot_param.h | 3 ++- arch/mips/loongson64/env.c | 10 +++++++++- 3 files changed, 13 insertions(+), 2 deletions(-)
arch/mips/Kconfig +2 -0
@@ -482,6 +482,7 @@ config MACH_LOONGSON2EF config MACH_LOONGSON64 bool "Loongson 64-bit family of machines" + select ARCH_DMA_DEFAULT_COHERENT select ARCH_SPARSEMEM_ENABLE select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO
@@ -1273,6 +1274,7 @@ config CPU_LOONGSON64 select CPU_SUPPORTS_MSA select CPU_DIEI_BROKEN if !LOONGSON3_ENHANCEMENT select CPU_MIPSR2_IRQ_VI + select DMA_NONCOHERENT select WEAK_ORDERING select WEAK_REORDERING_BEYOND_LLSC select MIPS_ASID_BITS_VARIABLE
arch/mips/include/asm/mach-loongson64/boot_param.h +2 -1
@@ -121,7 +121,8 @@ struct irq_source_routing_table {u64 pci_io_start_addr;u64 pci_io_end_addr;u64 pci_config_addr; -u32 dma_mask_bits; +u16 dma_mask_bits; +u16 dma_noncoherent; } __packed;struct interface_info {
arch/mips/loongson64/env.c +9 -1
@@ -13,6 +13,8 @@* Copyright (C) 2009 Lemote Inc. * Author: Wu Zhangjin, [email protected] */ + +#include <linux/dma-map-ops.h> #include <linux/export.h> #include <linux/pci_ids.h> #include <asm/bootinfo.h>
@@ -147,8 +149,14 @@ void __init prom_lefi_init_env(void) loongson_sysconf.dma_mask_bits = eirq_source->dma_mask_bits;if (loongson_sysconf.dma_mask_bits <32 || - loongson_sysconf.dma_mask_bits >64 ) + loongson_sysconf.dma_mask_bits >64 ) { loongson_sysconf.dma_mask_bits =32 ; + dma_default_coherent = true; + }else { + dma_default_coherent = !eirq_source->dma_noncoherent; + } + +pr_info ("Firmware: Coherent DMA: %s\n" , dma_default_coherent ?"on" :"off" ); loongson_sysconf.restart_addr = boot_p->reset_system.ResetWarm; loongson_sysconf.poweroff_addr = boot_p->reset_system.Shutdown;
Greg Kroah-Hartman
maintainerPATCH 238/244 netfilter: nft_set_pipapo: skip inactive elements during set walk
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
commit 317eb9685095678f2c9f5a8189de698c5354316a upstream.
Otherwise set elements can be deactivated twice which will cause a crash.
--- net/netfilter/nft_set_pipapo.c | 3 +++ 1 file changed, 3 insertions(+)
net/netfilter/nft_set_pipapo.c +3 -0
@@ -2041,6 +2041,9 @@ static void nft_pipapo_walk(const struct e = f->mt[r].e; +if (!nft_set_elem_active (&e->ext, iter->genmask)) + goto cont; + elem.priv = e; iter->err = iter->fn (ctx, set, iter, &elem);
Greg Kroah-Hartman
maintainerPATCH 239/244 ASoC: qcom: sc8280xp: Limit speaker digital volumes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit 716d4e5373e9d1ae993485ab2e3b893bf7104fb1 upstream.
Limit the speaker digital gains to 0dB so that the users will not damage them. Currently there is a limit in UCM, but this does not stop the user form changing the digital gains from command line. So limit this in driver which makes the speakers more safer without active speaker protection in place.
--- sound/soc/qcom/sc8280xp.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
sound/soc/qcom/sc8280xp.c +17 -0
@@ -27,6 +27,23 @@ struct sc8280xp_snd_data {static int sc8280xp_snd_init (struct snd_soc_pcm_runtime *rtd) {struct sc8280xp_snd_data *data =snd_soc_card_get_drvdata (rtd->card); +struct snd_soc_dai *cpu_dai =asoc_rtd_to_cpu (rtd,0 ); +struct snd_soc_card *card = rtd->card; + +switch (cpu_dai->id) { +case WSA_CODEC_DMA_RX_0 : +case WSA_CODEC_DMA_RX_1 : +/* +* set limit of 0dB on Digital Volume for Speakers, +* this can prevent damage of speakers to some extent without +* active speaker protection +*/ +snd_soc_limit_volume (card,"WSA_RX0 Digital Volume" ,84 ); +snd_soc_limit_volume (card,"WSA_RX1 Digital Volume" ,84 ); +break ; +default : +break ; + }return qcom_snd_wcd_jack_setup (rtd, &data->jack, &data->jack_setup); }
Greg Kroah-Hartman
maintainerPATCH 240/244 gcc-plugins: randstruct: Update code comment in relayout_struct()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
commit d71f22365a9caca82d424f3a33445de46567e198 upstream.
Update code comment to clarify that the only element whose layout is not randomized is a proper C99 flexible-array member. This update is complementary to commit 1ee60356c2dc ("gcc-plugins: randstruct: Only warn about true flexible arrays")
--- scripts/gcc-plugins/randomize_layout_plugin.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
scripts/gcc-plugins/randomize_layout_plugin.c +1 -2
@@ -339,8 +339,7 @@ static int relayout_struct(tree type)/* * enforce that we don't randomize the layout of the last -* element of a struct if it's a 0 or 1-length array -* or a proper flexible array +* element of a struct if it's a proper flexible array */ if (is_flexible_array (newtree[num_fields -1 ])) { has_flexarray = true;
Greg Kroah-Hartman
maintainerPATCH 241/244 riscv: Kconfig: Add select ARM_AMBA to SOC_STARFIVE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jia Jie Ho <[email protected]>
commit 78a03b9f8e6b317f7c65738a3fc60e1e85106a64 upstream.
Selects ARM_AMBA platform support for StarFive SoCs required by spi and crypto dma engine.
--- arch/riscv/Kconfig.socs | 1 + 1 file changed, 1 insertion(+)
arch/riscv/Kconfig.socs +1 -0
@@ -29,6 +29,7 @@ config SOC_STARFIVE bool "StarFive SoCs" select PINCTRL select RESET_CONTROLLER + select ARM_AMBA help This enables support for StarFive SoC platform hardware.
Greg Kroah-Hartman
maintainerPATCH 242/244 drm/amdgpu: Fix refclk reporting for SMU v13.0.6
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lijo Lazar <[email protected]>
[ Upstream commit 6b7d211740da2c3a7656be8cbb36f32e6d9c6cbd ]
SMU v13.0.6 SOCs have 100MHz reference clock.
Stable-dep-of: 6fce23a4d8c5 ("drm/amdgpu: Restrict extended wait to PSP v13.0.6")
--- drivers/gpu/drm/amd/amdgpu/soc15.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/soc15.c +2 -1
@@ -325,7 +325,8 @@ static u32 soc15_get_xclk(struct amdgpu_device *adev)u32 reference_clock = adev->clock.spll.reference_freq;if (adev->ip_versions[MP1_HWIP ][0 ] ==IP_VERSION (12 ,0 ,0 ) || - adev->ip_versions[MP1_HWIP ][0 ] ==IP_VERSION (12 ,0 ,1 )) + adev->ip_versions[MP1_HWIP ][0 ] ==IP_VERSION (12 ,0 ,1 ) || + adev->ip_versions[MP1_HWIP ][0 ] ==IP_VERSION (13 ,0 ,6 ))return 10000 ;if (adev->ip_versions[MP1_HWIP ][0 ] ==IP_VERSION (10 ,0 ,0 ) || adev->ip_versions[MP1_HWIP ][0 ] ==IP_VERSION (10 ,0 ,1 ))
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 243/244 drm/amdgpu: update retry times for psp BL wait
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Asad Kamal <[email protected]>
[ Upstream commit d8c1925ba8cde2863297728a4c8fbf8fe766757a ]
Increase retry time for PSP BL wait, to compensate for longer time to set c2pmsg 35 ready bit during mode1 with RAS
Stable-dep-of: 6fce23a4d8c5 ("drm/amdgpu: Restrict extended wait to PSP v13.0.6")
--- drivers/gpu/drm/amd/amdgpu/psp_v13_0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/psp_v13_0.c +1 -1
@@ -168,7 +168,7 @@ static int psp_v13_0_wait_for_bootloader(struct psp_context *psp)* If there is an error in processing command, bits[7:0] will be set. * This is applicable for PSP v13.0.6 and newer. */ -for (retry_loop =0 ; retry_loop <10 ; retry_loop++) { +for (retry_loop =0 ; retry_loop <PSP_VMBX_POLLING_LIMIT ; retry_loop++) { ret =psp_wait_for ( psp,SOC15_REG_OFFSET (MP0 ,0 , regMP0_SMN_C2PMSG_35),0x80000000 ,0xffffffff , false);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 244/244 drm/amdgpu: Restrict extended wait to PSP v13.0.6
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lijo Lazar <[email protected]>
[ Upstream commit 6fce23a4d8c5f93bf80b7f122449fbb97f1e40dd ]
Only PSPv13.0.6 SOCs take a longer time to reach steady state. Other PSPv13 based SOCs don't need extended wait. Also, reduce PSPv13.0.6 wait time.
--- drivers/gpu/drm/amd/amdgpu/psp_v13_0.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/amdgpu/psp_v13_0.c +7 -3
@@ -60,7 +60,7 @@ MODULE_FIRMWARE("amdgpu/psp_14_0_0_ta.bin");#define GFX_CMD_USB_PD_USE_LFB 0x480/* Retry times for vmbx ready wait */ -#define PSP_VMBX_POLLING_LIMIT 20000 +#define PSP_VMBX_POLLING_LIMIT 3000/* VBIOS gfl defines */ #define MBOX_READY_MASK 0x80000000
@@ -161,14 +161,18 @@ static int psp_v13_0_wait_for_vmbx_ready(struct psp_context *psp)static int psp_v13_0_wait_for_bootloader (struct psp_context *psp) {struct amdgpu_device *adev = psp->adev; -int retry_loop, ret; +int retry_loop, retry_cnt, ret; + retry_cnt = + (adev->ip_versions[MP0_HWIP ][0 ] ==IP_VERSION (13 ,0 ,6 )) ? +PSP_VMBX_POLLING_LIMIT : +10 ;/* Wait for bootloader to signify that it is ready having bit 31 of * C2PMSG_35 set to 1. All other bits are expected to be cleared. * If there is an error in processing command, bits[7:0] will be set. * This is applicable for PSP v13.0.6 and newer. */ -for (retry_loop =0 ; retry_loop <PSP_VMBX_POLLING_LIMIT ; retry_loop++) { +for (retry_loop =0 ; retry_loop < retry_cnt; retry_loop++) { ret =psp_wait_for ( psp,SOC15_REG_OFFSET (MP0 ,0 , regMP0_SMN_C2PMSG_35),0x80000000 ,0xffffffff , false);
Signature · 1 line
2.42.0
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
6.6.7-rc1 tested.
Build successfully completed.
Boot successfully completed.
No dmesg regressions.
Video output normal.
Sound output normal.
Lenovo ThinkPad X1 Carbon Gen10(Intel i7-1260P(x86_64) arch linux)
[ 0.000000] Linux version 6.6.7-rc1rv
(takeshi@ThinkPadX1Gen10J0764) (gcc (GCC) 13.2.1 20230801, GNU ld (GNU Binutils) 2.41.0) #1 SMP PREEMPT_DYNAMIC Tue Dec 12 07:24:53 JST 2023
Thanks
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
No regressions found on WSL (x86 and arm64).
Built, booted, and reviewed dmesg.
Thank you.
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Successfully compiled and installed the kernel on my computer (Acer Aspire E15, Intel Core i3 Haswell). No noticeable regressions.
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Cheers,
Conor.
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 6.6.7-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-6.6.y
* git commit: 4970875239e5185c5957f2eadd5b4caf546f2bc0
* git describe: v6.6.6-245-g4970875239e5
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.6-245-g4970875239e5
## Test Regressions (compared to v6.6.5)
## Metric Regressions (compared to v6.6.5)
## Test Fixes (compared to v6.6.5)
## Metric Fixes (compared to v6.6.5)
## Test result summary
total: 154499, pass: 132659, fail: 2462, skip: 19242, xfail: 136
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 145 total, 144 passed, 1 failed
* arm64: 52 total, 49 passed, 3 failed
* i386: 41 total, 40 passed, 1 failed
* mips: 26 total, 26 passed, 0 failed
* parisc: 4 total, 4 passed, 0 failed
* powerpc: 36 total, 36 passed, 0 failed
* riscv: 25 total, 24 passed, 1 failed
* s390: 13 total, 13 passed, 0 failed
* sh: 10 total, 10 passed, 0 failed
* sparc: 8 total, 8 passed, 0 failed
* x86_64: 46 total, 45 passed, 1 failed
## Test suites summary
* boot
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-exec
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-filesystems-epoll
* kselftest-firmware
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-user_events
* kselftest-vDSO
* kselftest-vm
* kselftest-watchdog
* kselftest-x86
* kselftest-zram
* kunit
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* perf
* rcutorture
* v4l2-compliance
--
Linaro LKFT
https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
Build results:
total: 157 pass: 157 fail: 0 Qemu test results: total: 546 pass: 546 fail: 0
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Tested rc1 against the Fedora build system (aarch64, ppc64le, s390x, x86_64), and boot tested x86_64. No regressions noted.
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.6:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.6.7-rc1-g4970875239e5
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Hello,
Quoted 5 lines · On 2023-12-11T19:18:13+01:00 Greg Kroah-Hartman <[email protected]>…
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/awslabs/damon-tests/tree/next/corr
[2] 4970875239e5 ("Linux 6.6.7-rc1")
Thanks,
SJ
[...]
---
ok 1 selftests: damon: debugfs_attrs.sh
ok 2 selftests: damon: debugfs_schemes.sh
ok 3 selftests: damon: debugfs_target_ids.sh
ok 4 selftests: damon: debugfs_empty_targets.sh
ok 5 selftests: damon: debugfs_huge_count_read_write.sh
ok 6 selftests: damon: debugfs_duplicate_context_creation.sh
ok 7 selftests: damon: debugfs_rm_non_contexts.sh
ok 8 selftests: damon: sysfs.sh
ok 9 selftests: damon: sysfs_update_removed_scheme_dir.sh
ok 10 selftests: damon: reclaim.sh
ok 11 selftests: damon: lru_sort.sh
ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_arm64.sh
ok 12 selftests: damon-tests: build_i386_idle_flag.sh
ok 13 selftests: damon-tests: build_i386_highpte.sh
ok 14 selftests: damon-tests: build_nomemcg.sh
[33m
[92mPASS [39m
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.7 release. There are 244 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 13 Dec 2023 18:19:59 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.7-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
No regressions on my system:
[ 0.000000] Linux version 6.6.7-rc1+ (rbmarliere@debian) (Debian clang version 16.0.6 (19), GNU ld (GNU Binutils for Debian) 2.41.50.20231206) #12 SMP PREEMPT_DYNAMIC Wed Dec 13 11:37:51 -03 2023
Thanks!
- Ricardo