6.12.42-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainerPATCH 316/369 smb: client: remove separate empty_packet_queue
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit 24b6afc36db748467e853e166a385df07e443859 ]
There's no need to maintain two lists, we can just have a single list of receive buffers, which are free to use.
It just added unneeded complexity and resulted in ib_dma_unmap_single() not being called from recv_done() for empty keepalive packets.
--- fs/smb/client/cifs_debug.c | 6 ++-- fs/smb/client/smbdirect.c | 62 +++----------------------------------- fs/smb/client/smbdirect.h | 4 --- 3 files changed, 7 insertions(+), 65 deletions(-)
fs/smb/client/cifs_debug.c +2 -4
@@ -432,10 +432,8 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) server->smbd_conn->receive_credit_target);seq_printf (m,"\nPending send_pending: %x " ,atomic_read (&server->smbd_conn->send_pending)); -seq_printf (m,"\nReceive buffers count_receive_queue: %x " -"count_empty_packet_queue: %x" , - server->smbd_conn->count_receive_queue, - server->smbd_conn->count_empty_packet_queue); +seq_printf (m,"\nReceive buffers count_receive_queue: %x " , + server->smbd_conn->count_receive_queue); seq_printf(m, "\nMR responder_resources: %x " "max_frmr_depth: %x mr_type: %x", server->smbd_conn->responder_resources,
fs/smb/client/smbdirect.c +5 -57
122 lines not on this page · raw message
fs/smb/client/smbdirect.h +0 -4
@@ -110,10 +110,6 @@ struct smbd_connection {int count_receive_queue;spinlock_t receive_queue_lock; -struct list_head empty_packet_queue; -int count_empty_packet_queue; -spinlock_t empty_packet_queue_lock; -wait_queue_head_t wait_receive_queues;/* Reassembly queue */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 317/369 smb: client: make sure we call ib_dma_unmap_single() only if we called ib_dma_map_single already
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit 047682c370b6f18fec818b57b0ed8b501bdb79f8 ]
In case of failures either ib_dma_map_single() might not be called yet or ib_dma_unmap_single() was already called.
We should make sure put_receive_buffer() only calls ib_dma_unmap_single() if needed.
--- fs/smb/client/smbdirect.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
fs/smb/client/smbdirect.c +9 -2
@@ -1057,6 +1057,7 @@ static int smbd_post_recv(if (rc) {ib_dma_unmap_single (sc->ib.dev, response->sge.addr, response->sge.length,DMA_FROM_DEVICE ); + response->sge.length =0 ;smbd_disconnect_rdma_connection (info);log_rdma_recv (ERR ,"ib_post_recv failed rc=%d\n" , rc); }
@@ -1186,8 +1187,13 @@ static void put_receive_buffer(struct smbdirect_socket *sc = &info->socket;unsigned long flags; -ib_dma_unmap_single (sc->ib.dev, response->sge.addr, - response->sge.length,DMA_FROM_DEVICE ); +if (likely (response->sge.length !=0 )) { +ib_dma_unmap_single (sc->ib.dev, + response->sge.addr, + response->sge.length, +DMA_FROM_DEVICE ); + response->sge.length =0 ; + }spin_lock_irqsave (&info->receive_queue_lock, flags);list_add_tail (&response->list, &info->receive_queue);
@@ -1221,6 +1227,7 @@ static int allocate_receive_buffers(struct smbd_connection *info, int num_buf) goto allocate_failed; response->info = info; + response->sge.length =0 ;list_add_tail (&response->list, &info->receive_queue); info->count_receive_queue++; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 318/369 smb: client: let recv_done() cleanup before notifying the callers.
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit bdd7afc6dca5e0ebbb75583484aa6ea9e03fbb13 ]
We should call put_receive_buffer() before waking up the callers.
For the internal error case of response->type being unexpected, we now also call smbd_disconnect_rdma_connection() instead of not waking up the callers at all.
Note that the SMBD_TRANSFER_DATA case still has problems, which will be addressed in the next commit in order to make it easier to review this one.
--- fs/smb/client/smbdirect.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
fs/smb/client/smbdirect.c +8 -6
@@ -454,7 +454,6 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)if (wc->status !=IB_WC_SUCCESS || wc->opcode !=IB_WC_RECV ) {log_rdma_recv (INFO ,"wc->status=%d opcode=%d\n" , wc->status, wc->opcode); -smbd_disconnect_rdma_connection (info); goto error; }
@@ -471,8 +470,9 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) info->full_packet_received = true; info->negotiate_done =process_negotiation_response (response, wc->byte_len); +put_receive_buffer (info, response);complete (&info->negotiate_completion); -break ; +return ;/* SMBD data transfer packet */ case SMBD_TRANSFER_DATA :
@@ -529,14 +529,16 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) }return ; - -default : -log_rdma_recv (ERR , -"unexpected response type=%d\n" , response->type); } +/* +* This is an internal error! +*/ +log_rdma_recv (ERR ,"unexpected response type=%d\n" , response->type); +WARN_ON_ONCE (response->type !=SMBD_TRANSFER_DATA ); error:put_receive_buffer (info, response); +smbd_disconnect_rdma_connection (info); } static struct rdma_cm_id *smbd_create_id(
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 319/369 smb: client: let recv_done() avoid touching data_transfer after cleanup/move
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit 24eff17887cb45c25a427e662dda352973c5c171 ]
Calling enqueue_reassembly() and wake_up_interruptible(&info->wait_reassembly_queue) or put_receive_buffer() means the response/data_transfer pointer might get re-used by another thread, which means these should be
the last operations before calling return.
--- fs/smb/client/smbdirect.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-)
fs/smb/client/smbdirect.c +11 -14
@@ -479,10 +479,6 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) data_transfer =smbd_response_payload (response); data_length =le32_to_cpu (data_transfer->data_length); -/* -* If this is a packet with data playload place the data in -* reassembly queue and wake up the reading thread -*/ if (data_length) {if (info->full_packet_received) response->first_segment = true;
@@ -491,16 +487,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) info->full_packet_received = false; else info->full_packet_received = true; - -enqueue_reassembly ( - info, - response, - data_length); - }else -put_receive_buffer (info, response); - -if (data_length) -wake_up_interruptible (&info->wait_reassembly_queue); + }atomic_dec (&info->receive_credits); info->receive_credit_target =
@@ -528,6 +515,16 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc) info->keep_alive_requested =KEEP_ALIVE_PENDING ; } +/* +* If this is a packet with data playload place the data in +* reassembly queue and wake up the reading thread +*/ +if (data_length) { +enqueue_reassembly (info, response, data_length); +wake_up_interruptible (&info->wait_reassembly_queue); + }else +put_receive_buffer (info, response); +return ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 320/369 nvmet: exit debugfs after discovery subsystem exits
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohamed Khalfella <[email protected]>
[ Upstream commit 80f21806b8e34ae1e24c0fc6a0f0dfd9b055e130 ]
Commit 528589947c180 ("nvmet: initialize discovery subsys after debugfs is initialized") changed nvmet_init() to initialize nvme discovery after "nvmet" debugfs directory is initialized. The change broke nvmet_exit() because discovery subsystem now depends on debugfs. Debugfs should be destroyed after discovery subsystem. Fix nvmet_exit() to do that.
--- drivers/nvme/target/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/target/core.c +1 -1
@@ -1746,8 +1746,8 @@ static int __init nvmet_init(void) static void __exit nvmet_exit(void) {nvmet_exit_configfs (); -nvmet_exit_debugfs ();nvmet_exit_discovery (); +nvmet_exit_debugfs ();ida_destroy (&cntlid_ida);destroy_workqueue (nvmet_wq);destroy_workqueue (buffered_io_wq);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 321/369 pptp: fix pptp_xmit() error path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit ae633388cae349886f1a3cfb27aa092854b24c1b ]
I accidentally added a bug in pptp_xmit() that syzbot caught for us.
Only call ip_rt_put() if a route has been allocated.
BUG: unable to handle page fault for address: ffffffffffffffdb PGD df3b067 P4D df3b067 PUD df3d067 PMD 0 Oops: Oops: 0002 [#1] SMP KASAN PTI CPU: 1 UID: 0 PID: 6346 Comm: syz.0.336 Not tainted 6.16.0-next-20250804-syzkaller #0 PREEMPT(full) Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 07/12/2025 RIP: 0010:arch_atomic_add_return arch/x86/include/asm/atomic.h:85 [inline] RIP: 0010:raw_atomic_sub_return_release include/linux/atomic/atomic-arch-fallback.h:846 [inline] RIP: 0010:atomic_sub_return_release include/linux/atomic/atomic-instrumented.h:327 [inline] RIP: 0010:__rcuref_put include/linux/rcuref.h:109 [inline] RIP: 0010:rcuref_put+0x172/0x210 include/linux/rcuref.h:173 Call Trace: <TASK> dst_release+0x24/0x1b0 net/core/dst.c:167 ip_rt_put include/net/route.h:285 [inline] pptp_xmit+0x14b/0x1a90 drivers/net/ppp/pptp.c:267 __ppp_channel_push+0xf2/0x1c0 drivers/net/ppp/ppp_generic.c:2166 ppp_channel_push+0x123/0x660 drivers/net/ppp/ppp_generic.c:2198 ppp_write+0x2b0/0x400 drivers/net/ppp/ppp_generic.c:544 vfs_write+0x27b/0xb30 fs/read_write.c:684 ksys_write+0x145/0x250 fs/read_write.c:738 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f
--- drivers/net/ppp/pptp.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/ppp/pptp.c +4 -3
@@ -159,17 +159,17 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)int len;unsigned char *data;__u32 seq_recv; -struct rtable *rt =NULL ; +struct rtable *rt;struct net_device *tdev;struct iphdr *iph;int max_headroom;if (sk_pppox (po)->sk_state &PPPOX_DEAD ) - goto tx_error; + goto tx_drop; rt =pptp_route_output (po, &fl4);if (IS_ERR (rt)) - goto tx_error; + goto tx_drop; tdev = rt->dst.dev;
@@ -265,6 +265,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) tx_error:ip_rt_put (rt); +tx_drop:kfree_skb (skb);return 1 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 322/369 smb: client: return an error if rdma_connect does not return within 5 seconds
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Metzmacher <[email protected]>
[ Upstream commit 03537826f77f1c829d0593d211b38b9c876c1722 ]
This matches the timeout for tcp connections.
--- fs/smb/client/smbdirect.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/smb/client/smbdirect.c +4 -2
@@ -1636,8 +1636,10 @@ static struct smbd_connection *_smbd_get_connection( goto rdma_connect_failed; } -wait_event_interruptible ( - info->conn_wait, sc->status !=SMBDIRECT_SOCKET_CONNECTING ); +wait_event_interruptible_timeout ( + info->conn_wait, + sc->status !=SMBDIRECT_SOCKET_CONNECTING , +msecs_to_jiffies (RDMA_RESOLVE_TIMEOUT ));if (sc->status !=SMBDIRECT_SOCKET_CONNECTED ) {log_rdma_event (ERR ,"rdma_connect failed port=%d\n" , port);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 323/369 sunrpc: fix handling of server side tls alerts
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Olga Kornievskaia <[email protected]>
commit bee47cb026e762841f3faece47b51f985e215edb upstream.
Scott Mayhew discovered a security exploit in NFS over TLS in tls_alert_recv() due to its assumption it can read data from the msg iterator's kvec..
kTLS implementation splits TLS non-data record payload between the control message buffer (which includes the type such as TLS aler or TLS cipher change) and the rest of the payload (say TLS alert's level/description) which goes into the msg payload buffer.
This patch proposes to rework how control messages are setup and used by sock_recvmsg().
If no control message structure is setup, kTLS layer will read and process TLS data record types. As soon as it encounters a TLS control message, it would return an error. At that point, NFS can setup a kvec backed msg buffer and read in the control message such as a TLS alert. Msg iterator can advance the kvec pointer as a part of the copy process thus we need to revert the iterator before calling into the tls_alert_recv.
--- net/sunrpc/svcsock.c | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-)
net/sunrpc/svcsock.c +35 -8
@@ -257,20 +257,47 @@ svc_tcp_sock_process_cmsg(struct socket }static int -svc_tcp_sock_recv_cmsg (struct svc_sock *svsk,struct msghdr *msg) +svc_tcp_sock_recv_cmsg (struct socket *sock,unsigned int *msg_flags) {union {struct cmsghdr cmsg;u8 buf[CMSG_SPACE (sizeof (u8))]; } u; -struct socket *sock = svsk->sk_sock; +u8 alert[2 ]; +struct kvec alert_kvec = { + .iov_base = alert, + .iov_len =sizeof (alert), + }; +struct msghdr msg = { + .msg_flags = *msg_flags, + .msg_control = &u, + .msg_controllen =sizeof (u), + }; +int ret; + +iov_iter_kvec (&msg.msg_iter,ITER_DEST , &alert_kvec,1 , + alert_kvec.iov_len); + ret =sock_recvmsg (sock, &msg,MSG_DONTWAIT ); +if (ret >0 && +tls_get_record_type (sock->sk, &u.cmsg) ==TLS_RECORD_TYPE_ALERT ) { +iov_iter_revert (&msg.msg_iter, ret); + ret =svc_tcp_sock_process_cmsg (sock, &msg, &u.cmsg, -EAGAIN ); + } +return ret; +} + +static int +svc_tcp_sock_recvmsg (struct svc_sock *svsk,struct msghdr *msg) +{int ret; +struct socket *sock = svsk->sk_sock; - msg->msg_control = &u; - msg->msg_controllen =sizeof (u); ret =sock_recvmsg (sock, msg,MSG_DONTWAIT ); -if (unlikely (msg->msg_controllen !=sizeof (u))) - ret =svc_tcp_sock_process_cmsg (sock, msg, &u.cmsg, ret); +if (msg->msg_flags &MSG_CTRUNC ) { + msg->msg_flags &= ~(MSG_CTRUNC |MSG_EOR ); +if (ret ==0 || ret == -EIO ) + ret =svc_tcp_sock_recv_cmsg (sock, &msg->msg_flags); + }return ret; }
@@ -321,7 +348,7 @@ static ssize_t svc_tcp_read_msg(struct siov_iter_advance (&msg.msg_iter, seek); buflen -= seek; } - len =svc_tcp_sock_recv_cmsg (svsk, &msg); + len =svc_tcp_sock_recvmsg (svsk, &msg);if (len >0 )svc_flush_bvec (bvec, len, seek);
@@ -1019,7 +1046,7 @@ static ssize_t svc_tcp_read_marker(struc iov.iov_base = ((char *)&svsk->sk_marker) + svsk->sk_tcplen; iov.iov_len = want;iov_iter_kvec (&msg.msg_iter,ITER_DEST , &iov,1 , want); - len =svc_tcp_sock_recv_cmsg (svsk, &msg); + len =svc_tcp_sock_recvmsg (svsk, &msg);if (len <0 )return len; svsk->sk_tcplen += len;
Greg Kroah-Hartman
maintainerPATCH 324/369 perf/core: Dont leak AUX buffer refcount on allocation failure
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 5468c0fbccbb9d156522c50832244a8b722374fb upstream.
Failure of the AUX buffer allocation leaks the reference count.
Set the reference count to 1 only when the allocation succeeds.
--- kernel/events/core.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
kernel/events/core.c +4 -3
@@ -6713,9 +6713,7 @@ static int perf_mmap(struct file *file, goto unlock; } -atomic_set (&rb->aux_mmap_count,1 ); user_extra = nr_pages; - goto accounting; }
@@ -6817,8 +6815,10 @@ accounting: }else { ret =rb_alloc_aux (rb, event, vma->vm_pgoff, nr_pages, event->attr.aux_watermark, flags); -if (!ret) +if (!ret) { +atomic_set (&rb->aux_mmap_count,1 ); rb->aux_mmap_locked = extra; + } } unlock:
@@ -6828,6 +6828,7 @@ unlock:atomic_inc (&event->mmap_count); }else if (rb) { +/* AUX allocation failed */ atomic_dec (&rb->mmap_count); } aux_unlock:
Greg Kroah-Hartman
maintainerPATCH 325/369 perf/core: Exit early on perf_mmap() fail
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 07091aade394f690e7b655578140ef84d0e8d7b0 upstream.
When perf_mmap() fails to allocate a buffer, it still invokes the event_mapped() callback of the related event. On X86 this might increase the perf_rdpmc_allowed reference counter. But nothing undoes this as perf_mmap_close() is never called in this case, which causes another reference count leak.
Return early on failure to prevent that.
--- kernel/events/core.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/events/core.c +3 -0
@@ -6836,6 +6836,9 @@ aux_unlock:mutex_unlock (aux_mutex);mutex_unlock (&event->mmap_mutex); +if (ret) +return ret; +/* * Since pinned accounting is per vm we cannot allow fork() to copy our * vma.
Greg Kroah-Hartman
maintainerPATCH 326/369 perf/core: Prevent VMA split of buffer mappings
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit b024d7b56c77191cde544f838debb7f8451cd0d6 upstream.
The perf mmap code is careful about mmap()'ing the user page with the ringbuffer and additionally the auxiliary buffer, when the event supports it. Once the first mapping is established, subsequent mapping have to use the same offset and the same size in both cases. The reference counting for the ringbuffer and the auxiliary buffer depends on this being correct.
Though perf does not prevent that a related mapping is split via mmap(2), munmap(2) or mremap(2). A split of a VMA results in perf_mmap_open() calls, which take reference counts, but then the subsequent perf_mmap_close() calls are not longer fulfilling the offset and size checks. This leads to reference count leaks.
As perf already has the requirement for subsequent mappings to match the initial mapping, the obvious consequence is that VMA splits, caused by resizing of a mapping or partial unmapping, have to be prevented.
Implement the vm_operations_struct::may_split() callback and return unconditionally -EINVAL.
That ensures that the mapping offsets and sizes cannot be changed after the fact. Remapping to a different fixed address with the same size is still possible as it takes the references for the new mapping and drops those of the old mapping.
--- kernel/events/core.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
kernel/events/core.c +10 -0
@@ -6617,11 +6617,21 @@ out_put:ring_buffer_put (rb);/* could be last */ } +static int perf_mmap_may_split (struct vm_area_struct *vma,unsigned long addr) +{ +/* +* Forbid splitting perf mappings to prevent refcount leaks due to +* the resulting non-matching offsets and sizes. See open()/close(). +*/ +return -EINVAL ; +} +static const struct vm_operations_struct perf_mmap_vmops = { .open = perf_mmap_open, .close = perf_mmap_close,/* non mergeable */ .fault = perf_mmap_fault, .page_mkwrite = perf_mmap_fault, + .may_split = perf_mmap_may_split, };static int perf_mmap (struct file *file,struct vm_area_struct *vma)
Greg Kroah-Hartman
maintainerPATCH 327/369 selftests/perf_events: Add a mmap() correctness test
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Stoakes <[email protected]>
commit 084d2ac4030c5919e85bba1f4af26e33491469cb upstream.
Exercise various mmap(), munmap() and mremap() invocations, which might cause a perf buffer mapping to be split or truncated.
To avoid hard coding the perf event and having dependencies on architectures and configuration options, scan through event types in sysfs and try to open them. On success, try to mmap() and if that succeeds try to mmap() the AUX buffer.
In case that no AUX buffer supporting event is found, only test the base buffer mapping. If no mappable event is found or permissions are not sufficient, skip the tests.
Reserve a PROT_NONE region for both rb and aux tests to allow testing the case where mremap unmaps beyond the end of a mapped VMA to prevent it from unmapping unrelated mappings.
--- tools/testing/selftests/perf_events/.gitignore | 1 tools/testing/selftests/perf_events/Makefile | 2 tools/testing/selftests/perf_events/mmap.c | 236 +++++++++++++++++++++++++ 3 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/perf_events/mmap.c
tools/testing/selftests/perf_events/.gitignore +1 -0
@@ -2,3 +2,4 @@ sigtrap_threads remove_on_exec watermark_signal +mmap
tools/testing/selftests/perf_events/Makefile +1 -1
@@ -2,5 +2,5 @@ CFLAGS += -Wl,-no-as-needed -Wall $(KHDR_INCLUDES) LDFLAGS += -lpthread -TEST_GEN_PROGS := sigtrap_threads remove_on_exec watermark_signal +TEST_GEN_PROGS := sigtrap_threads remove_on_exec watermark_signal mmap include ../lib.mk
tools/testing/selftests/perf_events/mmap.c new file +236 -0
236 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 328/369 net/packet: fix a race in packet_set_ring() and packet_notifier()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Quang Le <[email protected]>
commit 01d3c8417b9c1b884a8a981a3b886da556512f36 upstream.
When packet_set_ring() releases po->bind_lock, another thread can run packet_notifier() and process an NETDEV_UP event.
This race and the fix are both similar to that of commit 15fe076edea7 ("net/packet: fix a race in packet_bind() and packet_notifier()").
There too the packet_notifier NETDEV_UP event managed to run while a po->bind_lock critical section had to be temporarily released. And the fix was similarly to temporarily set po->num to zero to keep the socket unhooked until the lock is retaken.
The po->bind_lock in packet_set_ring and packet_notifier precede the introduction of git history.
--- net/packet/af_packet.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/packet/af_packet.c +6 -6
@@ -4562,10 +4562,10 @@ static int packet_set_ring(struct sock *spin_lock (&po->bind_lock); was_running =packet_sock_flag (po,PACKET_SOCK_RUNNING ); num = po->num; -if (was_running) { -WRITE_ONCE (po->num,0 ); +WRITE_ONCE (po->num,0 ); +if (was_running)__unregister_prot_hook (sk, false); - } +spin_unlock (&po->bind_lock);synchronize_net ();
@@ -4597,10 +4597,10 @@ static int packet_set_ring(struct sock *mutex_unlock (&po->pg_vec_lock);spin_lock (&po->bind_lock); -if (was_running) { -WRITE_ONCE (po->num, num); +WRITE_ONCE (po->num, num); +if (was_running)register_prot_hook (sk); - } +spin_unlock (&po->bind_lock);if (pg_vec && (po->tp_version >TPACKET_V2 )) {/* Because we don't support block-based V3 on tx-ring */
Greg Kroah-Hartman
maintainerPATCH 329/369 vsock: Do not allow binding to VMADDR_PORT_ANY
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Budimir Markovic <[email protected]>
commit aba0c94f61ec05315fa7815d21aefa4c87f6a9f4 upstream.
It is possible for a vsock to autobind to VMADDR_PORT_ANY. This can cause a use-after-free when a connection is made to the bound socket. The socket returned by accept() also has port VMADDR_PORT_ANY but is not on the list of unbound sockets. Binding it will result in an extra refcount decrement similar to the one fixed in fcdd2242c023 (vsock: Keep the binding until socket destruction).
Modify the check in __vsock_bind_connectible() to also prevent binding to VMADDR_PORT_ANY.
--- net/vmw_vsock/af_vsock.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/vmw_vsock/af_vsock.c +2 -1
@@ -689,7 +689,8 @@ static int __vsock_bind_connectible(struunsigned int i;for (i =0 ; i <MAX_PORT_RETRIES ; i++) { -if (port <=LAST_RESERVED_PORT ) +if (port ==VMADDR_PORT_ANY || + port <=LAST_RESERVED_PORT ) port =LAST_RESERVED_PORT +1 ; new_addr.svm_port = port++;
Greg Kroah-Hartman
maintainerPATCH 330/369 accel/ivpu: Fix reset_engine debugfs file logic
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Kacprowski <[email protected]>
commit 541a137254c71822e7a3ebdf8309c5a37b7de465 upstream.
The current reset_engine implementation unconditionally resets all engines. Improve implementation to reset only the engine requested by the user space to allow more granular testing. Also use DEFINE_DEBUGFS_ATTRIBUTE() to simplify implementation.
Same changes applied to resume_engine debugfs file for consistency.
--- drivers/accel/ivpu/ivpu_debugfs.c | 42 +++++++------------------------------- 1 file changed, 8 insertions(+), 34 deletions(-)
drivers/accel/ivpu/ivpu_debugfs.c +8 -34
@@ -346,49 +346,23 @@ static const struct file_operations ivpu .write = ivpu_force_recovery_fn, }; -static ssize_t -ivpu_reset_engine_fn (struct file *file,const char __user *user_buf,size_t size,loff_t *pos) +static int ivpu_reset_engine_fn (void *data,u64 val) { -struct ivpu_device *vdev = file->private_data; +struct ivpu_device *vdev = (struct ivpu_device *)data; -if (!size) -return -EINVAL ; - -if (ivpu_jsm_reset_engine (vdev,DRM_IVPU_ENGINE_COMPUTE )) -return -ENODEV ; -if (ivpu_jsm_reset_engine (vdev,DRM_IVPU_ENGINE_COPY )) -return -ENODEV ; - -return size; +return ivpu_jsm_reset_engine (vdev, (u32 )val); } -static const struct file_operations ivpu_reset_engine_fops = { - .owner =THIS_MODULE , - .open = simple_open, - .write = ivpu_reset_engine_fn, -}; +DEFINE_DEBUGFS_ATTRIBUTE (ivpu_reset_engine_fops,NULL , ivpu_reset_engine_fn,"0x%02llx\n" ); -static ssize_t -ivpu_resume_engine_fn (struct file *file,const char __user *user_buf,size_t size,loff_t *pos) +static int ivpu_resume_engine_fn (void *data,u64 val) { -struct ivpu_device *vdev = file->private_data; +struct ivpu_device *vdev = (struct ivpu_device *)data; -if (!size) -return -EINVAL ; - -if (ivpu_jsm_hws_resume_engine (vdev,DRM_IVPU_ENGINE_COMPUTE )) -return -ENODEV ; -if (ivpu_jsm_hws_resume_engine (vdev,DRM_IVPU_ENGINE_COPY )) -return -ENODEV ; - -return size; +return ivpu_jsm_hws_resume_engine (vdev, (u32 )val); } -static const struct file_operations ivpu_resume_engine_fops = { - .owner =THIS_MODULE , - .open = simple_open, - .write = ivpu_resume_engine_fn, -}; +DEFINE_DEBUGFS_ATTRIBUTE (ivpu_resume_engine_fops,NULL , ivpu_resume_engine_fn,"0x%02llx\n" );static int dct_active_get (void *data,u64 *active_percent) {
Greg Kroah-Hartman
maintainerPATCH 331/369 Revert "bcache: remove heap-related macros and switch to generic min_heap"
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Wei Chiu <[email protected]>
commit 48fd7ebe00c1cdc782b42576548b25185902f64c upstream.
This reverts commit 866898efbb25bb44fd42848318e46db9e785973a.
The generic bottom-up min_heap implementation causes performance regression in invalidate_buckets_lru(), a hot path in bcache. Before the cache is fully populated, new_bucket_prio() often returns zero, leading to many equal comparisons. In such cases, bottom-up sift_down performs up to 2 * log2(n) comparisons, while the original top-down approach completes with just O() comparisons, resulting in a measurable performance gap.
The performance degradation is further worsened by the non-inlined min_heap API functions introduced in commit 92a8b224b833 ("lib/min_heap:
introduce non-inline versions of min heap API functions"), adding function call overhead to this critical path.
As reported by Robert, bcache now suffers from latency spikes, with P100 (max) latency increasing from 600 ms to 2.4 seconds every 5 minutes. These regressions degrade bcache's effectiveness as a low-latency cache layer and lead to frequent timeouts and application stalls in production environments.
This revert aims to restore bcache's original low-latency behavior.
--- drivers/md/bcache/alloc.c | 64 +++++---------------- drivers/md/bcache/bcache.h | 2 drivers/md/bcache/bset.c | 124 +++++++++++++++--------------------------- drivers/md/bcache/bset.h | 42 ++++++++------ drivers/md/bcache/btree.c | 69 +++++++++-------------- drivers/md/bcache/extents.c | 51 ++++++----------- drivers/md/bcache/movinggc.c | 41 +++---------- drivers/md/bcache/super.c | 3 - drivers/md/bcache/sysfs.c | 4 - drivers/md/bcache/util.h | 67 ++++++++++++++++++++++ drivers/md/bcache/writeback.c | 13 +--- 11 files changed, 217 insertions(+), 263 deletions(-)
drivers/md/bcache/alloc.c +17 -47
@@ -164,68 +164,40 @@ static void bch_invalidate_one_bucket(st* prio is worth 1/8th of what INITIAL_PRIO is worth. */ -static inline unsigned int new_bucket_prio (struct cache *ca,struct bucket *b) -{ -unsigned int min_prio = (INITIAL_PRIO - ca->set->min_prio) /8 ; - -return (b->prio - ca->set->min_prio + min_prio) *GC_SECTORS_USED (b); -} - -static inline bool new_bucket_max_cmp (const void *l,const void *r,void *args) -{ -struct bucket **lhs = (struct bucket **)l; -struct bucket **rhs = (struct bucket **)r; -struct cache *ca = args; - -return new_bucket_prio (ca, *lhs) >new_bucket_prio (ca, *rhs); -} - -static inline bool new_bucket_min_cmp (const void *l,const void *r,void *args) -{ -struct bucket **lhs = (struct bucket **)l; -struct bucket **rhs = (struct bucket **)r; -struct cache *ca = args; - -return new_bucket_prio (ca, *lhs) <new_bucket_prio (ca, *rhs); -} - -static inline void new_bucket_swap (void *l,void *r,void __always_unused *args) -{ -struct bucket **lhs = l, **rhs = r; +#define bucket_prio (b) \ +({ \ + unsigned int min_prio = (INITIAL_PRIO - ca->set->min_prio) / 8; \ + \ + (b->prio - ca->set->min_prio + min_prio) * GC_SECTORS_USED(b); \ +}) -swap (*lhs, *rhs); -} +#define bucket_max_cmp (l, r) (bucket_prio(l) < bucket_prio(r)) +#define bucket_min_cmp (l, r) (bucket_prio(l) > bucket_prio(r))static void invalidate_buckets_lru (struct cache *ca) {struct bucket *b; -const struct min_heap_callbacks bucket_max_cmp_callback = { - .less = new_bucket_max_cmp, - .swp = new_bucket_swap, - }; -const struct min_heap_callbacks bucket_min_cmp_callback = { - .less = new_bucket_min_cmp, - .swp = new_bucket_swap, - }; +ssize_t i; - ca->heap.nr =0 ; + ca->heap.used =0 ;for_each_bucket (b, ca) {if (!bch_can_invalidate_bucket (ca, b))continue ; -if (!min_heap_full (&ca->heap)) -min_heap_push (&ca->heap, &b, &bucket_max_cmp_callback, ca); -else if (!new_bucket_max_cmp (&b,min_heap_peek (&ca->heap), ca)) { +if (!heap_full (&ca->heap)) +heap_add (&ca->heap, b, bucket_max_cmp); +else if (bucket_max_cmp (b,heap_peek (&ca->heap))) { ca->heap.data[0 ] = b; -min_heap_sift_down (&ca->heap,0 , &bucket_max_cmp_callback, ca); +heap_sift (&ca->heap,0 , bucket_max_cmp); } } -min_heapify_all (&ca->heap, &bucket_min_cmp_callback, ca); +for (i = ca->heap.used /2 -1 ; i >=0 ; --i) +heap_sift (&ca->heap, i, bucket_min_cmp);while (!fifo_full (&ca->free_inc)) { -if (!ca->heap.nr) { +if (!heap_pop (&ca->heap, b, bucket_min_cmp)) {/* * We don't want to be calling invalidate_buckets() * multiple times when it can't do anything
@@ -234,8 +206,6 @@ static void invalidate_buckets_lru(strucwake_up_gc (ca->set);return ; } - b =min_heap_peek (&ca->heap)[0 ]; -min_heap_pop (&ca->heap, &bucket_min_cmp_callback, ca);bch_invalidate_one_bucket (ca, b); }
drivers/md/bcache/bcache.h +1 -1
@@ -458,7 +458,7 @@ struct cache {/* Allocation stuff: */ struct bucket *buckets; - DEFINE_MIN_HEAP(struct bucket *, cache_heap) heap; + DECLARE_HEAP(struct bucket *, heap);/* * If nonzero, we know we aren't going to find any buckets to invalidate
drivers/md/bcache/bset.c +45 -79
257 lines not on this page · raw message
drivers/md/bcache/bset.h +24 -18
72 lines not on this page · raw message
drivers/md/bcache/btree.c +29 -40
188 lines not on this page · raw message
drivers/md/bcache/extents.c +18 -33
105 lines not on this page · raw message
drivers/md/bcache/movinggc.c +10 -31
85 lines not on this page · raw message
drivers/md/bcache/super.c +2 -1
@@ -1912,7 +1912,8 @@ struct cache_set *bch_cache_set_alloc(stINIT_LIST_HEAD (&c->btree_cache_freed);INIT_LIST_HEAD (&c->data_buckets); - iter_size = ((meta_bucket_pages (sb) *PAGE_SECTORS ) / sb->block_size) * + iter_size =sizeof (struct btree_iter ) + + ((meta_bucket_pages (sb) *PAGE_SECTORS ) / sb->block_size) *sizeof (struct btree_iter_set ); c->devices =kcalloc (c->nr_uuids,sizeof (void *),GFP_KERNEL );
drivers/md/bcache/sysfs.c +1 -3
@@ -660,9 +660,7 @@ static unsigned int bch_root_usage(strucunsigned int bytes =0 ;struct bkey *k;struct btree *b; -struct btree_iter iter; - -min_heap_init (&iter.heap,NULL ,MAX_BSETS ); +struct btree_iter_stack iter; goto lock_root;
drivers/md/bcache/util.h +65 -2
88 lines not on this page · raw message
drivers/md/bcache/writeback.c +5 -8
@@ -908,16 +908,15 @@ static int bch_dirty_init_thread(void *astruct dirty_init_thrd_info *info = arg;struct bch_dirty_init_state *state = info->state;struct cache_set *c = state->c; -struct btree_iter iter; +struct btree_iter_stack iter;struct bkey *k, *p;int cur_idx, prev_idx, skip_nr; k = p =NULL ; prev_idx =0 ; -min_heap_init (&iter.heap,NULL ,MAX_BSETS ); -bch_btree_iter_init (&c->root->keys, &iter,NULL ); - k =bch_btree_iter_next_filter (&iter, &c->root->keys, bch_ptr_bad); +bch_btree_iter_stack_init (&c->root->keys, &iter,NULL ); + k =bch_btree_iter_next_filter (&iter.iter, &c->root->keys, bch_ptr_bad);BUG_ON (!k); p = k;
@@ -931,7 +930,7 @@ static int bch_dirty_init_thread(void *a skip_nr = cur_idx - prev_idx;while (skip_nr) { - k =bch_btree_iter_next_filter (&iter, + k =bch_btree_iter_next_filter (&iter.iter, &c->root->keys, bch_ptr_bad);if (k)
@@ -980,13 +979,11 @@ void bch_sectors_dirty_init(struct bcachint i;struct btree *b =NULL ;struct bkey *k =NULL ; -struct btree_iter iter; +struct btree_iter_stack iter;struct sectors_dirty_init op;struct cache_set *c = d->c;struct bch_dirty_init_state state; -min_heap_init (&iter.heap,NULL ,MAX_BSETS ); - retry_lock: b = c->root;rw_lock (0 , b, b->level);
Greg Kroah-Hartman
maintainerPATCH 332/369 ice/ptp: fix crosstimestamp reporting
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Nadezhdin <[email protected]>
commit a5a441ae283d54ec329aadc7426991dc32786d52 upstream.
Set use_nsecs=true as timestamp is reported in ns. Lack of this result in smaller timestamp error window which cause error during phc2sys execution on E825 NICs:
phc2sys[1768.256]: ioctl PTP_SYS_OFFSET_PRECISE: Invalid argument
This problem was introduced in the cited commit which omitted setting use_nsecs to true when converting the ice driver to use convert_base_to_cs().
Testing hints (ethX is PF netdev):
phc2sys -s ethX -c CLOCK_REALTIME -O 37 -m
phc2sys[1769.256]: CLOCK_REALTIME phc offset -5 s0 freq -0 delay 0
--- drivers/net/ethernet/intel/ice/ice_ptp.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/ice/ice_ptp.c +1 -0
@@ -2226,6 +2226,7 @@ ice_ptp_get_syncdevicetime(ktime_t *devi hh_ts = ((u64 )hh_ts_hi <<32 ) | hh_ts_lo; system->cycles = hh_ts; system->cs_id =CSID_X86_ART ; + system->use_nsecs = true;/* Read Device source clock time */ hh_ts_lo =rd32 (hw,GLTSYN_HHTIME_L (tmr_idx)); hh_ts_hi =rd32 (hw,GLTSYN_HHTIME_H (tmr_idx));
Greg Kroah-Hartman
maintainerPATCH 333/369 selftests/bpf: Add a test for arena range tree algorithm
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
commit e58358afa84e8e271a296459d35d1715c7572013 upstream.
Add a test that verifies specific behavior of arena range tree algorithm and adjust existing big_alloc1 test due to use of global data in arena.
--- tools/testing/selftests/bpf/progs/verifier_arena_large.c | 110 ++++++++++++++- 1 file changed, 108 insertions(+), 2 deletions(-)
tools/testing/selftests/bpf/progs/verifier_arena_large.c +108 -2
@@ -29,12 +29,12 @@ int big_alloc1(void *ctx)if (!page1)return 1 ; *page1 =1 ; - page2 =bpf_arena_alloc_pages (&arena, base +ARENA_SIZE -PAGE_SIZE , + page2 =bpf_arena_alloc_pages (&arena, base +ARENA_SIZE -PAGE_SIZE *2 ,1 ,NUMA_NO_NODE ,0 );if (!page2)return 2 ; *page2 =2 ; - no_page =bpf_arena_alloc_pages (&arena, base +ARENA_SIZE , + no_page =bpf_arena_alloc_pages (&arena, base +ARENA_SIZE -PAGE_SIZE ,1 ,NUMA_NO_NODE ,0 );if (no_page)return 3 ;
@@ -66,4 +66,110 @@ int big_alloc1(void *ctx)#endif return 0 ; } + +#if defined(__BPF_FEATURE_ADDR_SPACE_CAST) +#define PAGE_CNT 100 +__u8 __arena * __arena page[PAGE_CNT]; /* occupies the first page */ +__u8 __arena *base; + +/* +* Check that arena's range_tree algorithm allocates pages sequentially +* on the first pass and then fills in all gaps on the second pass. +*/ +__noinline int alloc_pages(int page_cnt, int pages_atonce, bool first_pass, +int max_idx,int step) +{ + __u8 __arena *pg; +int i, pg_idx; + +for (i =0 ; i < page_cnt; i++) { + pg =bpf_arena_alloc_pages (&arena,NULL , pages_atonce, +NUMA_NO_NODE ,0 ); +if (!pg) +return step; + pg_idx = (pg - base) /PAGE_SIZE ; +if (first_pass) { +/* Pages must be allocated sequentially */ +if (pg_idx != i) +return step +100 ; + }else { +/* Allocator must fill into gaps */ +if (pg_idx >= max_idx || (pg_idx &1 )) +return step +200 ; + } + *pg = pg_idx; + page[pg_idx] = pg; + cond_break; + } +return 0 ; +} + +//SEC("syscall") +//__success __retval(0) +int big_alloc2 (void *ctx) +{ + __u8 __arena *pg; +int i, err; + + base =bpf_arena_alloc_pages (&arena,NULL ,1 ,NUMA_NO_NODE ,0 ); +if (!base) +return 1 ; + bpf_arena_free_pages(&arena, (void __arena *)base, 1); + + err =alloc_pages (PAGE_CNT ,1 , true,PAGE_CNT ,2 ); +if (err) +return err; + +/* Clear all even pages */ +for (i =0 ; i <PAGE_CNT ; i +=2 ) { + pg = page[i]; +if (*pg != i) +return 3 ; + bpf_arena_free_pages(&arena, (void __arena *)pg, 1); + page[i] =NULL ; + cond_break; + } + +/* Allocate into freed gaps */ + err =alloc_pages (PAGE_CNT /2 ,1 , false,PAGE_CNT ,4 ); +if (err) +return err; + +/* Free pairs of pages */ +for (i =0 ; i <PAGE_CNT ; i +=4 ) { + pg = page[i]; +if (*pg != i) +return 5 ; + bpf_arena_free_pages(&arena, (void __arena *)pg, 2); + page[i] =NULL ; + page[i +1 ] =NULL ; + cond_break; + } + +/* Allocate 2 pages at a time into freed gaps */ + err =alloc_pages (PAGE_CNT /4 ,2 , false,PAGE_CNT ,6 ); +if (err) +return err; + +/* Check pages without freeing */ +for (i =0 ; i <PAGE_CNT ; i +=2 ) { + pg = page[i]; +if (*pg != i) +return 7 ; + cond_break; + } + + pg =bpf_arena_alloc_pages (&arena,NULL ,1 ,NUMA_NO_NODE ,0 ); + +if (!pg) +return 8 ; +/* +* The first PAGE_CNT pages are occupied. The new page +* must be above. +*/ +if ((pg - base) /PAGE_SIZE <PAGE_CNT ) +return 9 ; +return 0 ; +} +#endif char _license[] SEC("license") = "GPL";
Greg Kroah-Hartman
maintainerPATCH 334/369 selftests/bpf: Fix build error with llvm 19
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
commit 608e99f7869e3a6e028c7cba14a896c7797e8746 upstream.
llvm 19 fails to compile arena self test:
CLNG-BPF [test_progs] verifier_arena_large.bpf.oprogs/verifier_arena_large.c:90:24: error: unsupported signed division, please convert to unsigned div/mod.
90 | pg_idx = (pg - base) / PAGE_SIZE;
Though llvm <= 18 and llvm >= 20 don't have this issue, fix the test to avoid the build error.
--- tools/testing/selftests/bpf/progs/verifier_arena_large.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/progs/verifier_arena_large.c +1 -1
@@ -87,7 +87,7 @@ __noinline int alloc_pages(int page_cnt, NUMA_NO_NODE, 0);if (!pg)return step; - pg_idx = (pg - base) /PAGE_SIZE ; + pg_idx = (unsigned long ) (pg - base) /PAGE_SIZE ;if (first_pass) {/* Pages must be allocated sequentially */ if (pg_idx != i)
Greg Kroah-Hartman
maintainerPATCH 335/369 drm/i915/ddi: change intel_ddi_init_{dp, hdmi}_connector() return type
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit e1980a977686d46dbf45687f7750f1c50d1d6cf8 upstream.
The caller doesn't actually need the returned struct intel_connector; it's stored in the ->attached_connector of intel_dp and intel_hdmi. Switch to returning an int with 0 for success and negative errors codes to be able to indicate success even when we don't have a connector.
--- drivers/gpu/drm/i915/display/intel_ddi.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
drivers/gpu/drm/i915/display/intel_ddi.c +9 -11
@@ -4413,8 +4413,7 @@ static const struct drm_encoder_funcs in .late_register = intel_ddi_encoder_late_register, }; -static struct intel_connector * -intel_ddi_init_dp_connector (struct intel_digital_port *dig_port) +static int intel_ddi_init_dp_connector (struct intel_digital_port *dig_port) {struct drm_i915_private *i915 =to_i915 (dig_port->base.base.dev);struct intel_connector *connector;
@@ -4422,7 +4421,7 @@ intel_ddi_init_dp_connector(struct intel connector =intel_connector_alloc ();if (!connector) -return NULL ; +return -ENOMEM ; dig_port->dp.output_reg =DDI_BUF_CTL (port);if (DISPLAY_VER (i915) >=14 )
@@ -4437,7 +4436,7 @@ intel_ddi_init_dp_connector(struct intelif (!intel_dp_init_connector (dig_port, connector)) {kfree (connector); -return NULL ; +return -EINVAL ; }if (dig_port->base.type ==INTEL_OUTPUT_EDP ) {
@@ -4453,7 +4452,7 @@ intel_ddi_init_dp_connector(struct intel } } -return connector; +return 0 ; } static int intel_hdmi_reset_link(struct intel_encoder *encoder,
@@ -4623,20 +4622,19 @@ static bool bdw_digital_port_connected(sreturn intel_de_read (dev_priv,GEN8_DE_PORT_ISR ) & bit; } -static struct intel_connector * -intel_ddi_init_hdmi_connector (struct intel_digital_port *dig_port) +static int intel_ddi_init_hdmi_connector (struct intel_digital_port *dig_port) {struct intel_connector *connector;enum port port = dig_port->base.port; connector =intel_connector_alloc ();if (!connector) -return NULL ; +return -ENOMEM ; dig_port->hdmi.hdmi_reg =DDI_BUF_CTL (port);intel_hdmi_init_connector (dig_port, connector); -return connector; +return 0 ; }static bool intel_ddi_a_force_4_lanes (struct intel_digital_port *dig_port)
@@ -5185,7 +5183,7 @@ void intel_ddi_init(struct intel_displayintel_infoframe_init (dig_port);if (init_dp) { -if (!intel_ddi_init_dp_connector (dig_port)) +if (intel_ddi_init_dp_connector (dig_port)) goto err; dig_port->hpd_pulse = intel_dp_hpd_pulse;
@@ -5199,7 +5197,7 @@ void intel_ddi_init(struct intel_display* but leave it just in case we have some really bad VBTs... */ if (encoder->type !=INTEL_OUTPUT_EDP && init_hdmi) { -if (!intel_ddi_init_hdmi_connector (dig_port)) +if (intel_ddi_init_hdmi_connector (dig_port)) goto err; }
Greg Kroah-Hartman
maintainerPATCH 336/369 drm/i915/hdmi: propagate errors from intel_hdmi_init_connector()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit 7fb56536fa37e23bc291d31c10e575d500f4fda7 upstream.
Propagate errors from intel_hdmi_init_connector() to be able to handle them at callers. This is similar to intel_dp_init_connector().
--- drivers/gpu/drm/i915/display/intel_hdmi.c | 10 ++++++---- drivers/gpu/drm/i915/display/intel_hdmi.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-)
drivers/gpu/drm/i915/display/intel_hdmi.c +6 -4
@@ -3015,7 +3015,7 @@ void intel_infoframe_init(struct intel_d } } -void intel_hdmi_init_connector (struct intel_digital_port *dig_port, +bool intel_hdmi_init_connector (struct intel_digital_port *dig_port,struct intel_connector *intel_connector) {struct intel_display *display =to_intel_display (dig_port);
@@ -3033,17 +3033,17 @@ void intel_hdmi_init_connector(struct in intel_encoder->base.base.id, intel_encoder->base.name);if (DISPLAY_VER (display) <12 &&drm_WARN_ON (dev, port ==PORT_A )) -return ; +return false;if (drm_WARN (dev, dig_port->max_lanes <4 ,"Not enough lanes (%d) for HDMI on [ENCODER:%d:%s]\n" , dig_port->max_lanes, intel_encoder->base.base.id, intel_encoder->base.name)) -return ; +return false; ddc_pin =intel_hdmi_ddc_pin (intel_encoder);if (!ddc_pin) -return ; +return false; drm_connector_init_with_ddc(dev, connector, &intel_hdmi_connector_funcs,
@@ -3088,6 +3088,8 @@ void intel_hdmi_init_connector(struct in &conn_info);if (!intel_hdmi->cec_notifier)drm_dbg_kms (display->drm,"CEC notifier get failed\n" ); + +return true; }/*
drivers/gpu/drm/i915/display/intel_hdmi.h +1 -1
@@ -22,7 +22,7 @@ struct intel_encoder;struct intel_hdmi ;union hdmi_infoframe ; -void intel_hdmi_init_connector (struct intel_digital_port *dig_port, +bool intel_hdmi_init_connector (struct intel_digital_port *dig_port,struct intel_connector *intel_connector); bool intel_hdmi_compute_has_hdmi_sink(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state,
Greg Kroah-Hartman
maintainerPATCH 337/369 drm/i915/hdmi: add error handling in g4x_hdmi_init()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit 7603ba81225c815d2ceb4ad52f13e8df4b9d03cc upstream.
Handle encoder and connector init failures in g4x_hdmi_init(). This is similar to g4x_dp_init().
--- drivers/gpu/drm/i915/display/g4x_hdmi.c | 35 +++++++++++++++++++++----------- drivers/gpu/drm/i915/display/g4x_hdmi.h | 5 ++-- 2 files changed, 26 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/display/g4x_hdmi.c +23 -12
@@ -683,7 +683,7 @@ static bool assert_hdmi_port_valid(struc "Platform does not support HDMI %c\n", port_name(port)); } -void g4x_hdmi_init (struct drm_i915_private *dev_priv, +bool g4x_hdmi_init (struct drm_i915_private *dev_priv,i915_reg_t hdmi_reg,enum port port) {struct intel_display *display = &dev_priv->display;
@@ -693,10 +693,10 @@ void g4x_hdmi_init(struct drm_i915_privastruct intel_connector *intel_connector;if (!assert_port_valid (dev_priv, port)) -return ; +return false;if (!assert_hdmi_port_valid (dev_priv, port)) -return ; +return false; devdata =intel_bios_encoder_data_lookup (display, port);
@@ -707,15 +707,13 @@ void g4x_hdmi_init(struct drm_i915_priva dig_port =kzalloc (sizeof (*dig_port),GFP_KERNEL );if (!dig_port) -return ; +return false; dig_port->aux_ch =AUX_CH_NONE ; intel_connector =intel_connector_alloc (); -if (!intel_connector) { -kfree (dig_port); -return ; - } +if (!intel_connector) + goto err_connector_alloc; intel_encoder = &dig_port->base;
@@ -723,9 +721,10 @@ void g4x_hdmi_init(struct drm_i915_privamutex_init (&dig_port->hdcp_mutex); -drm_encoder_init (&dev_priv->drm, &intel_encoder->base, - &intel_hdmi_enc_funcs,DRM_MODE_ENCODER_TMDS , -"HDMI %c" ,port_name (port)); +if (drm_encoder_init (&dev_priv->drm, &intel_encoder->base, + &intel_hdmi_enc_funcs,DRM_MODE_ENCODER_TMDS , +"HDMI %c" ,port_name (port))) + goto err_encoder_init; intel_encoder->hotplug = intel_hdmi_hotplug; intel_encoder->compute_config = g4x_hdmi_compute_config;
@@ -788,5 +787,17 @@ void g4x_hdmi_init(struct drm_i915_privaintel_infoframe_init (dig_port); -intel_hdmi_init_connector (dig_port, intel_connector); +if (!intel_hdmi_init_connector (dig_port, intel_connector)) + goto err_init_connector; + +return true; + +err_init_connector: +drm_encoder_cleanup (&intel_encoder->base); +err_encoder_init: +kfree (intel_connector); +err_connector_alloc: +kfree (dig_port); + +return false; }
drivers/gpu/drm/i915/display/g4x_hdmi.h +3 -2
@@ -16,14 +16,15 @@ struct drm_connector;struct drm_i915_private ;#ifdef I915 -void g4x_hdmi_init (struct drm_i915_private *dev_priv, +bool g4x_hdmi_init (struct drm_i915_private *dev_priv,i915_reg_t hdmi_reg,enum port port);int g4x_hdmi_connector_atomic_check (struct drm_connector *connector,struct drm_atomic_state *state);#else -static inline void g4x_hdmi_init (struct drm_i915_private *dev_priv, +static inline bool g4x_hdmi_init (struct drm_i915_private *dev_priv,i915_reg_t hdmi_reg,int port) { +return false; }static inline int g4x_hdmi_connector_atomic_check (struct drm_connector *connector,struct drm_atomic_state *state)
Greg Kroah-Hartman
maintainerPATCH 338/369 drm/i915/ddi: gracefully handle errors from intel_ddi_init_hdmi_connector()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit 8ea07e294ea2d046e16fa98e37007edcd4b9525d upstream.
Errors from intel_ddi_init_hdmi_connector() can just mean "there's no HDMI" while we'll still want to continue with DP only. Handle the errors gracefully, but don't propagate. Clear the hdmi_reg which is used as a proxy to indicate the HDMI is initialized.
v2: Gracefully handle but do not propagate
--- drivers/gpu/drm/i915/display/intel_ddi.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/display/intel_ddi.c +10 -1
@@ -4632,7 +4632,16 @@ static int intel_ddi_init_hdmi_connectorreturn -ENOMEM ; dig_port->hdmi.hdmi_reg =DDI_BUF_CTL (port); -intel_hdmi_init_connector (dig_port, connector); + +if (!intel_hdmi_init_connector (dig_port, connector)) { +/* +* HDMI connector init failures may just mean conflicting DDC +* pins or not having enough lanes. Handle them gracefully, but +* don't fail the entire DDI init. +*/ + dig_port->hdmi.hdmi_reg =INVALID_MMIO_REG ; +kfree (connector); + }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 339/369 drm/i915/display: add intel_encoder_is_hdmi()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit efa43b751637c0e16a92e1787f1d8baaf56dafba upstream.
Similar to intel_encoder_is_dp() and friends.
--- drivers/gpu/drm/i915/display/intel_display_types.h | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/gpu/drm/i915/display/intel_display_types.h +13 -0
@@ -2075,6 +2075,19 @@ static inline bool intel_encoder_is_dp(s } } +static inline bool intel_encoder_is_hdmi (struct intel_encoder *encoder) +{ +switch (encoder->type) { +case INTEL_OUTPUT_HDMI : +return true; +case INTEL_OUTPUT_DDI : +/* See if the HDMI encoder is valid. */ +return i915_mmio_reg_valid (enc_to_intel_hdmi (encoder)->hdmi_reg); +default : +return false; + } +} +static inline struct intel_lspcon *enc_to_intel_lspcon (struct intel_encoder *encoder) {
Greg Kroah-Hartman
maintainerPATCH 340/369 drm/i915/ddi: only call shutdown hooks for valid encoders
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit 60a43ecbd59decb77b31c09a73f09e1d4f4d1c4c upstream.
DDI might be HDMI or DP only, leaving the other encoder uninitialized. Calling the shutdown hook on an uninitialized encoder may lead to a NULL pointer dereference. Check the encoder types (and thus validity via the DP output_reg or HDMI hdmi_reg checks) before calling the hooks.
--- drivers/gpu/drm/i915/display/intel_ddi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/display/intel_ddi.c +4 -2
@@ -4798,8 +4798,10 @@ static void intel_ddi_tc_encoder_suspendstatic void intel_ddi_encoder_shutdown (struct intel_encoder *encoder) { -intel_dp_encoder_shutdown (encoder); -intel_hdmi_encoder_shutdown (encoder); +if (intel_encoder_is_dp (encoder)) +intel_dp_encoder_shutdown (encoder); +if (intel_encoder_is_hdmi (encoder)) +intel_hdmi_encoder_shutdown (encoder); }static void intel_ddi_tc_encoder_shutdown_complete (struct intel_encoder *encoder)
Greg Kroah-Hartman
maintainerPATCH 341/369 ksmbd: fix null pointer dereference error in generate_encryptionkey
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit 9b493ab6f35178afd8d619800df9071992f715de upstream.
If client send two session setups with krb5 authenticate to ksmbd, null pointer dereference error in generate_encryptionkey could happen. sess->Preauth_HashValue is set to NULL if session is valid. So this patch skip generate encryption key if session is valid.
--- fs/smb/server/smb2pdu.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
fs/smb/server/smb2pdu.c +16 -2
@@ -1619,11 +1619,24 @@ static int krb5_authenticate(struct ksmb rsp->SecurityBufferLength =cpu_to_le16 (out_len); -if ((conn->sign || server_conf.enforced_signing) || +/* +* If session state is SMB2_SESSION_VALID, We can assume +* that it is reauthentication. And the user/password +* has been verified, so return it here. +*/ +if (sess->state ==SMB2_SESSION_VALID ) { +if (conn->binding) + goto binding_session; +return 0 ; + } + +if ((rsp->SessionFlags !=SMB2_SESSION_FLAG_IS_GUEST_LE && + (conn->sign || server_conf.enforced_signing)) || (req->SecurityMode &SMB2_NEGOTIATE_SIGNING_REQUIRED )) sess->sign = true; -if (smb3_encryption_negotiated (conn)) { +if (smb3_encryption_negotiated (conn) && + !(req->Flags &SMB2_SESSION_REQ_FLAG_BINDING )) { retval = conn->ops->generate_encryptionkey (conn, sess);if (retval) { ksmbd_debug(SMB,
@@ -1636,6 +1649,7 @@ static int krb5_authenticate(struct ksmb sess->sign = false; } +binding_session:if (conn->dialect >=SMB30_PROT_ID ) { chann =lookup_chann_list (sess, conn);if (!chann) {
Greg Kroah-Hartman
maintainerPATCH 342/369 ksmbd: fix Preauh_HashValue race condition
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit 44a3059c4c8cc635a1fb2afd692d0730ca1ba4b6 upstream.
If client send multiple session setup requests to ksmbd, Preauh_HashValue race condition could happen.
There is no need to free sess->Preauh_HashValue at session setup phase. It can be freed together with session at connection termination phase.
--- fs/smb/server/smb2pdu.c | 4 ---- 1 file changed, 4 deletions(-)
fs/smb/server/smb2pdu.c +0 -4
@@ -1845,8 +1845,6 @@ int smb2_sess_setup(struct ksmbd_work *wksmbd_conn_set_good (conn); sess->state =SMB2_SESSION_VALID ; } -kfree (sess->Preauth_HashValue); - sess->Preauth_HashValue =NULL ; }else if (conn->preferred_auth_mech ==KSMBD_AUTH_NTLMSSP ) {if (negblob->MessageType == NtLmNegotiate) { rc =ntlm_negotiate (work, negblob, negblob_len, rsp);
@@ -1873,8 +1871,6 @@ int smb2_sess_setup(struct ksmbd_work *wkfree (preauth_sess); } } -kfree (sess->Preauth_HashValue); - sess->Preauth_HashValue =NULL ; }else {pr_info_ratelimited ("Unknown NTLMSSP message type : 0x%x\n" ,le32_to_cpu (negblob->MessageType));
Greg Kroah-Hartman
maintainerPATCH 343/369 ksmbd: fix corrupted mtime and ctime in smb2_open
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit 4f8ff9486fd94b9d6a4932f2aefb9f2fc3bd0cf6 upstream.
If STATX_BASIC_STATS flags are not given as an argument to vfs_getattr, It can not get ctime and mtime in kstat.
This causes a problem showing mtime and ctime outdated from cifs.ko.
File: /xfstest.test/foo
Size: 4096 Blocks: 8 IO Block: 1048576 regular file
Device: 0,65 Inode: 2033391 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:cifs_t:s0
Access: 2025-07-23 22:15:30.136051900 +0100
Modify: 1970-01-01 01:00:00.000000000 +0100
Change: 1970-01-01 01:00:00.000000000 +0100
Birth: 2025-07-23 22:15:30.136051900 +0100
--- fs/smb/server/vfs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/smb/server/vfs.c +2 -1
@@ -563,7 +563,8 @@ int ksmbd_vfs_getattr(const struct path {int err; - err =vfs_getattr (path, stat,STATX_BTIME ,AT_STATX_SYNC_AS_STAT ); + err =vfs_getattr (path, stat,STATX_BASIC_STATS |STATX_BTIME , +AT_STATX_SYNC_AS_STAT );if (err)pr_err ("getattr failed, err %d\n" , err);return err;
Greg Kroah-Hartman
maintainerPATCH 344/369 ksmbd: limit repeated connections from clients with the same IP
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit e6bb9193974059ddbb0ce7763fa3882bd60d4dc3 upstream.
Repeated connections from clients with the same IP address may exhaust the max connections and prevent other normal client connections. This patch limit repeated connections from clients with the same IP.
--- fs/smb/server/connection.h | 1 + fs/smb/server/transport_tcp.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+)
fs/smb/server/connection.h +1 -0
@@ -46,6 +46,7 @@ struct ksmbd_conn {struct mutex srv_mutex;int status;unsigned int cli_cap; +__be32 inet_addr;char *request_buf;struct ksmbd_transport *transport;struct nls_table *local_nls;
fs/smb/server/transport_tcp.c +17 -0
@@ -87,6 +87,7 @@ static struct tcp_transport *alloc_transreturn NULL ; } + conn->inet_addr =inet_sk (client_sk->sk)->inet_daddr; conn->transport =KSMBD_TRANS (t);KSMBD_TRANS (t)->conn = conn;KSMBD_TRANS (t)->ops = &ksmbd_tcp_transport_ops;
@@ -230,6 +231,8 @@ static int ksmbd_kthread_fn(void *p) {struct socket *client_sk =NULL ;struct interface *iface = (struct interface *)p; +struct inet_sock *csk_inet; +struct ksmbd_conn *conn;int ret;while (!kthread_should_stop ()) {
@@ -248,6 +251,20 @@ static int ksmbd_kthread_fn(void *p)continue ; } +/* +* Limits repeated connections from clients with the same IP. +*/ + csk_inet =inet_sk (client_sk->sk); +down_read (&conn_list_lock); +list_for_each_entry (conn, &conn_list, conns_list) +if (csk_inet->inet_daddr == conn->inet_addr) { + ret = -EAGAIN ; +break ; + } +up_read (&conn_list_lock); +if (ret == -EAGAIN ) +continue ; +if (server_conf.max_connections &&atomic_inc_return (&active_num_conn) >= server_conf.max_connections) { pr_info_ratelimited("Limit the maximum number of connections(%u)\n",
Greg Kroah-Hartman
maintainerPATCH 345/369 smb: server: Fix extension string in ksmbd_extract_shortname()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thorsten Blum <[email protected]>
commit 8e7d178d06e8937454b6d2f2811fa6a15656a214 upstream.
In ksmbd_extract_shortname(), strscpy() is incorrectly called with the length of the source string (excluding the NUL terminator) rather than the size of the destination buffer. This results in "__" being copied to 'extension' rather than "___" (two underscores instead of three).
Use the destination buffer size instead to ensure that the string "___" (three underscores) is copied correctly.
--- fs/smb/server/smb_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/server/smb_common.c +1 -1
@@ -515,7 +515,7 @@ int ksmbd_extract_shortname(struct ksmbd p =strrchr (longname,'.' );if (p == longname) {/*name starts with a dot*/ -strscpy (extension,"___" ,strlen ("___" )); +strscpy (extension,"___" ,sizeof (extension)); }else {if (p) { p++;
Greg Kroah-Hartman
maintainerPATCH 346/369 USB: serial: option: add Foxconn T99W709
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Slark Xiao <[email protected]>
commit ad1244e1ce18f8c1a5ebad8074bfcf10eacb0311 upstream.
T99W709 is designed based on MTK T300(5G redcap) chip. There are 7 serial ports to be enumerated: AP_LOG, GNSS, AP_META, AT, MD_META, NPT, DBG. RSVD(5) for ADB port.
test evidence as below:
T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 7 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0489 ProdID=e15f Rev=00.01 S: Manufacturer=MediaTek Inc. S: Product=USB DATA CARD S: SerialNumber=355511220000399 C: #Ifs=10 Cfg#= 1 Atr=a0 MxPwr=500mA I: If#=0x0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim I: If#=0x1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim I: If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=usbfs I: If#=0x6 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x7 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x8 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x9 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -2346,6 +2346,8 @@ static const struct usb_device_id option .driver_info = RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe145, 0xff), /* Foxconn T99W651 RNDIS */ .driver_info = RSVD(5) | RSVD(6) }, + { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe15f, 0xff), /* Foxconn T99W709 */ + .driver_info = RSVD(5) }, { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe167, 0xff), /* Foxconn T99W640 MBIM */ .driver_info = RSVD(3) }, { USB_DEVICE(0x1508, 0x1001), /* Fibocom NL668 (IOT version) */
Greg Kroah-Hartman
maintainerPATCH 347/369 PCI/ASPM: Save parent L1SS config in pci_save_aspm_l1ss_state()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian-Hong Pan <[email protected]>
commit 1db806ec06b7c6e08e8af57088da067963ddf117 upstream.
After 17423360a27a ("PCI/ASPM: Save L1 PM Substates Capability for suspend/resume"), pci_save_aspm_l1ss_state(dev) saves the L1SS state for "dev", and pci_restore_aspm_l1ss_state(dev) restores the state for both "dev" and its parent.
The problem is that unless pci_save_state() has been used in some other path and has already saved the parent L1SS state, we will restore junk to the parent, which means the L1 Substates likely won't work correctly.
Save the L1SS config for both the device and its parent in pci_save_aspm_l1ss_state(). When restoring, we need both because L1SS must be enabled at the parent (the Downstream Port) before being enabled at the child (the Upstream Port).
[bhelgaas: parallel save/restore structure, simplify commit log, patch at
https://lore.kernel.org/r/20241212230340.GA3267194@bhelgaas]
--- drivers/pci/pcie/aspm.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-)
drivers/pci/pcie/aspm.c +28 -5
@@ -81,24 +81,47 @@ void pci_configure_aspm_l1ss(struct pci_void pci_save_aspm_l1ss_state (struct pci_dev *pdev) { +struct pci_dev *parent = pdev->bus->self;struct pci_cap_saved_state *save_state; -u16 l1ss = pdev->l1ss;u32 *cap;/* +* If this is a Downstream Port, we never restore the L1SS state +* directly; we only restore it when we restore the state of the +* Upstream Port below it. +*/ +if (pcie_downstream_port (pdev) || !parent) +return ; + +if (!pdev->l1ss || !parent->l1ss) +return ; + +/* * Save L1 substate configuration. The ASPM L0s/L1 configuration * in PCI_EXP_LNKCTL_ASPMC is saved by pci_save_pcie_state(). */ -if (!l1ss) + save_state =pci_find_saved_ext_cap (pdev,PCI_EXT_CAP_ID_L1SS ); +if (!save_state)return ; - save_state =pci_find_saved_ext_cap (pdev,PCI_EXT_CAP_ID_L1SS ); + cap = &save_state->cap.data[0 ]; +pci_read_config_dword (pdev, pdev->l1ss +PCI_L1SS_CTL2 , cap++); +pci_read_config_dword (pdev, pdev->l1ss +PCI_L1SS_CTL1 , cap++); + +if (parent->state_saved) +return ; + +/* +* Save parent's L1 substate configuration so we have it for +* pci_restore_aspm_l1ss_state(pdev) to restore. +*/ + save_state =pci_find_saved_ext_cap (parent,PCI_EXT_CAP_ID_L1SS );if (!save_state)return ; cap = &save_state->cap.data[0 ]; -pci_read_config_dword (pdev, l1ss +PCI_L1SS_CTL2 , cap++); -pci_read_config_dword (pdev, l1ss +PCI_L1SS_CTL1 , cap++); +pci_read_config_dword (parent, parent->l1ss +PCI_L1SS_CTL2 , cap++); +pci_read_config_dword (parent, parent->l1ss +PCI_L1SS_CTL1 , cap++); }void pci_restore_aspm_l1ss_state (struct pci_dev *pdev)
Greg Kroah-Hartman
maintainerPATCH 348/369 PCI/ASPM: Fix L1SS saving
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
commit 7507eb3e7bfac7c3baef8dd377fdf5871eefd42b upstream.
Commit 1db806ec06b7 ("PCI/ASPM: Save parent L1SS config in pci_save_aspm_l1ss_state()") aimed to perform L1SS config save for both the Upstream Port and its upstream bridge when handling an Upstream Port, which matches what the L1SS restore side does. However, parent->state_saved can be set true at an earlier time when the upstream bridge saved other parts of its state. Then later when attempting to save the L1SS config while handling the Upstream Port, parent->state_saved is true in pci_save_aspm_l1ss_state() resulting in early return and skipping saving bridge's L1SS config because it is assumed to be already saved. Later on restore, junk is written into L1SS config which causes issues with some devices.
Remove parent->state_saved check and unconditionally save L1SS config also for the upstream bridge from an Upstream Port which ought to be harmless from correctness point of view. With the Upstream Port check now present, saving the L1SS config more than once for the bridge is no longer a problem (unlike when the parent->state_saved check got introduced into the fix during its development).
Reported by: Rafael J. Wysocki <[email protected]>
--- drivers/pci/pcie/aspm.c | 3 --- 1 file changed, 3 deletions(-)
drivers/pci/pcie/aspm.c +0 -3
@@ -108,9 +108,6 @@ void pci_save_aspm_l1ss_state(struct pcipci_read_config_dword (pdev, pdev->l1ss +PCI_L1SS_CTL2 , cap++);pci_read_config_dword (pdev, pdev->l1ss +PCI_L1SS_CTL1 , cap++); -if (parent->state_saved) -return ; -/* * Save parent's L1 substate configuration so we have it for * pci_restore_aspm_l1ss_state(pdev) to restore.
Greg Kroah-Hartman
maintainerPATCH 349/369 Bluetooth: btusb: Add USB ID 3625:010b for TP-LINK Archer TX10UB Nano
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zenm Chen <[email protected]>
commit d9da920233ec85af8b9c87154f2721a7dc4623f5 upstream.
Add USB ID 3625:010b for TP-LINK Archer TX10UB Nano which is based on a Realtek RTL8851BU chip.
The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 9 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=3625 ProdID=010b Rev= 0.00
S: Manufacturer=Realtek
S: Product=802.11ax WLAN Adapter
S: SerialNumber=00e04c000001
C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=500mA
A: FirstIf#= 0 IfCount= 2 Cls=e0(wlcon) Sub=01 Prot=01
I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms
I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms
I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms
I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms
I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms
I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms
I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms
E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms
I:* If#= 2 Alt= 0 #EPs= 8 Cls=ff(vend.) Sub=ff Prot=ff Driver=rtl8851bu
E: Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=07(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=09(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=0a(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=0b(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=0c(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
--- drivers/bluetooth/btusb.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/bluetooth/btusb.c +4 -0
@@ -511,6 +511,10 @@ static const struct usb_device_id quirks { USB_DEVICE(0x13d3, 0x3549), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + /* Realtek 8851BU Bluetooth devices */ + { USB_DEVICE(0x3625, 0x010b), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, + /* Realtek 8852AE Bluetooth devices */ { USB_DEVICE(0x0bda, 0x2852), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH },
Greg Kroah-Hartman
maintainerPATCH 350/369 net: usbnet: Avoid potential RCU stall on LINK_CHANGE event
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Ernberg <[email protected]>
commit 0d9cfc9b8cb17dbc29a98792d36ec39a1cf1395f upstream.
The Gemalto Cinterion PLS83-W modem (cdc_ether) is emitting confusing link up and down events when the WWAN interface is activated on the modem-side.
Interrupt URBs will in consecutive polls grab:
* Link Connected
* Link Disconnected
* Link Connected
Where the last Connected is then a stable link state.
When the system is under load this may cause the unlink_urbs() work in __handle_link_change() to not complete before the next usbnet_link_change() call turns the carrier on again, allowing rx_submit() to queue new SKBs.
In that event the URB queue is filled faster than it can drain, ending up in a RCU stall:
rcu: INFO: rcu_sched detected expedited stalls on CPUs/tasks: { 0-.... } 33108 jiffies s: 201 root: 0x1/.
rcu: blocking rcu_node structures (internal RCU debug):
Sending NMI from CPU 1 to CPUs 0:
NMI backtrace for cpu 0
Call trace:
arch_local_irq_enable+0x4/0x8
local_bh_enable+0x18/0x20
__netdev_alloc_skb+0x18c/0x1cc
rx_submit+0x68/0x1f8 [usbnet]
rx_alloc_submit+0x4c/0x74 [usbnet]
usbnet_bh+0x1d8/0x218 [usbnet]
usbnet_bh_tasklet+0x10/0x18 [usbnet]
tasklet_action_common+0xa8/0x110
tasklet_action+0x2c/0x34
handle_softirqs+0x2cc/0x3a0
__do_softirq+0x10/0x18
____do_softirq+0xc/0x14
call_on_irq_stack+0x24/0x34
do_softirq_own_stack+0x18/0x20
__irq_exit_rcu+0xa8/0xb8
irq_exit_rcu+0xc/0x30
el1_interrupt+0x34/0x48
el1h_64_irq_handler+0x14/0x1c
el1h_64_irq+0x68/0x6c
_raw_spin_unlock_irqrestore+0x38/0x48
xhci_urb_dequeue+0x1ac/0x45c [xhci_hcd]
unlink1+0xd4/0xdc [usbcore]
usb_hcd_unlink_urb+0x70/0xb0 [usbcore]
usb_unlink_urb+0x24/0x44 [usbcore]
unlink_urbs.constprop.0.isra.0+0x64/0xa8 [usbnet]
__handle_link_change+0x34/0x70 [usbnet]
usbnet_deferred_kevent+0x1c0/0x320 [usbnet]
process_scheduled_works+0x2d0/0x48c
worker_thread+0x150/0x1dc
kthread+0xd8/0xe8
ret_from_fork+0x10/0x20Get around the problem by delaying the carrier on to the scheduled work.
This needs a new flag to keep track of the necessary action.
The carrier ok check cannot be removed as it remains required for the LINK_RESET event flow.
--- drivers/net/usb/usbnet.c | 11 ++++++++--- include/linux/usb/usbnet.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-)
drivers/net/usb/usbnet.c +8 -3
@@ -1122,6 +1122,9 @@ static void __handle_link_change(struct* tx queue is stopped by netcore after link becomes off */ }else { +if (test_and_clear_bit (EVENT_LINK_CARRIER_ON , &dev->flags)) +netif_carrier_on (dev->net); +/* submitting URBs for reading packets */ tasklet_schedule (&dev->bh); }
@@ -2009,10 +2012,12 @@ EXPORT_SYMBOL(usbnet_manage_power);void usbnet_link_change (struct usbnet *dev,bool link,bool need_reset) {/* update link after link is reseted */ -if (link && !need_reset) -netif_carrier_on (dev->net); -else +if (link && !need_reset) { +set_bit (EVENT_LINK_CARRIER_ON , &dev->flags); + }else { +clear_bit (EVENT_LINK_CARRIER_ON , &dev->flags);netif_carrier_off (dev->net); + }if (need_reset && link)usbnet_defer_kevent (dev,EVENT_LINK_RESET );
include/linux/usb/usbnet.h +1 -0
@@ -76,6 +76,7 @@ struct usbnet {# define EVENT_LINK_CHANGE 11# define EVENT_SET_RX_MODE 12# define EVENT_NO_IP_ALIGN 13 +# define EVENT_LINK_CARRIER_ON 14/* This one is special, as it indicates that the device is going away * there are cyclic dependencies between tasklet, timer and bh * that must be broken
Greg Kroah-Hartman
maintainerPATCH 351/369 net: usbnet: Fix the wrong netif_carrier_on() call
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ammar Faizi <[email protected]>
commit 8466d393700f9ccef68134d3349f4e0a087679b9 upstream.
The commit referenced in the Fixes tag causes usbnet to malfunction (identified via git bisect). Post-commit, my external RJ45 LAN cable fails to connect. Linus also reported the same issue after pulling that commit.
The code has a logic error: netif_carrier_on() is only called when the link is already on. Fix this by moving the netif_carrier_on() call outside the if-statement entirely. This ensures it is always called when EVENT_LINK_CARRIER_ON is set and properly clears it regardless of the link state.
--- drivers/net/usb/usbnet.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/usb/usbnet.c +3 -3
@@ -1113,6 +1113,9 @@ static void __handle_link_change(structif (!test_bit (EVENT_DEV_OPEN , &dev->flags))return ; +if (test_and_clear_bit (EVENT_LINK_CARRIER_ON , &dev->flags)) +netif_carrier_on (dev->net); +if (!netif_carrier_ok (dev->net)) {/* kill URBs for reading packets to save bus bandwidth */ unlink_urbs (dev, &dev->rxq);
@@ -1122,9 +1125,6 @@ static void __handle_link_change(struct* tx queue is stopped by netcore after link becomes off */ }else { -if (test_and_clear_bit (EVENT_LINK_CARRIER_ON , &dev->flags)) -netif_carrier_on (dev->net); -/* submitting URBs for reading packets */ tasklet_schedule (&dev->bh); }
Greg Kroah-Hartman
maintainerPATCH 352/369 x86/sev: Evict cache lines during SNP memory validation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Lendacky <[email protected]>
Commit 7b306dfa326f70114312b320d083b21fa9481e1e upstream.
An SNP cache coherency vulnerability requires a cache line eviction mitigation when validating memory after a page state change to private. The specific mitigation is to touch the first and last byte of each 4K page that is being validated. There is no need to perform the mitigation when performing a page state change to shared and rescinding validation.
CPUID bit Fn8000001F_EBX[31] defines the COHERENCY_SFW_NO CPUID bit that, when set, indicates that the software mitigation for this vulnerability is not needed.
Implement the mitigation and invoke it when validating memory (making it private) and the COHERENCY_SFW_NO bit is not set, indicating the SNP guest is vulnerable.
--- arch/x86/boot/cpuflags.c | 13 ++++++++++ arch/x86/coco/sev/shared.c | 46 +++++++++++++++++++++++++++++++++++++ arch/x86/include/asm/cpufeatures.h | 1 arch/x86/kernel/cpu/scattered.c | 1 4 files changed, 61 insertions(+)
arch/x86/boot/cpuflags.c +13 -0
@@ -115,5 +115,18 @@ void get_cpuflags(void)cpuid (0x80000001 , &ignored, &ignored, &cpu.flags[6 ], &cpu.flags[1 ]); } + +if (max_amd_level >=0x8000001f ) { +u32 ebx; + +/* +* The X86_FEATURE_COHERENCY_SFW_NO feature bit is in +* the virtualization flags entry (word 8) and set by +* scattered.c, so the bit needs to be explicitly set. +*/ +cpuid (0x8000001f , &ignored, &ebx, &ignored, &ignored); +if (ebx &BIT (31 )) +set_bit (X86_FEATURE_COHERENCY_SFW_NO , cpu.flags); + } } }
arch/x86/coco/sev/shared.c +46 -0
68 lines not on this page · raw message
arch/x86/include/asm/cpufeatures.h +1 -0
@@ -227,6 +227,7 @@#define X86_FEATURE_FLEXPRIORITY ( 8*32+ 1)/* "flexpriority" Intel FlexPriority */ #define X86_FEATURE_EPT ( 8*32+ 2)/* "ept" Intel Extended Page Table */ #define X86_FEATURE_VPID ( 8*32+ 3)/* "vpid" Intel Virtual Processor ID */ +#define X86_FEATURE_COHERENCY_SFW_NO ( 8*32+ 4)/* SNP cache coherency software work around not needed */ #define X86_FEATURE_VMMCALL ( 8*32+15)/* "vmmcall" Prefer VMMCALL to VMCALL */ #define X86_FEATURE_XENPV ( 8*32+16)/* Xen paravirtual guest */
arch/x86/kernel/cpu/scattered.c +1 -0
@@ -47,6 +47,7 @@ static const struct cpuid_bit cpuid_bits { X86_FEATURE_PROC_FEEDBACK, CPUID_EDX, 11, 0x80000007, 0 }, { X86_FEATURE_FAST_CPPC, CPUID_EDX, 15, 0x80000007, 0 }, { X86_FEATURE_MBA, CPUID_EBX, 6, 0x80000008, 0 }, + { X86_FEATURE_COHERENCY_SFW_NO, CPUID_EBX, 31, 0x8000001f, 0 }, { X86_FEATURE_SMBA, CPUID_EBX, 2, 0x80000020, 0 }, { X86_FEATURE_BMEC, CPUID_EBX, 3, 0x80000020, 0 }, { X86_FEATURE_TSA_SQ_NO, CPUID_ECX, 1, 0x80000021, 0 },
Greg Kroah-Hartman
maintainerPATCH 353/369 ALSA: intel_hdmi: Fix off-by-one error in __hdmi_lpe_audio_probe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thorsten Blum <[email protected]>
commit 8cbe564974248ee980562be02f2b1912769562c7 upstream.
In __hdmi_lpe_audio_probe(), strscpy() is incorrectly called with the length of the source string (excluding the NUL terminator) rather than the size of the destination buffer. This results in one character less being copied from 'card->shortname' to 'pcm->name'.
Use the destination buffer size instead to ensure the card name is copied correctly.
--- sound/x86/intel_hdmi_audio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/x86/intel_hdmi_audio.c +1 -1
@@ -1767,7 +1767,7 @@ static int __hdmi_lpe_audio_probe(struct/* setup private data which can be retrieved when required */ pcm->private_data = ctx; pcm->info_flags =0 ; -strscpy (pcm->name, card->shortname,strlen (card->shortname)); +strscpy (pcm->name, card->shortname,sizeof (pcm->name));/* setup the ops for playback */ snd_pcm_set_ops (pcm,SNDRV_PCM_STREAM_PLAYBACK , &had_pcm_ops);
Greg Kroah-Hartman
maintainerPATCH 354/369 ALSA: scarlett2: Add retry on -EPROTO from scarlett2_usb_tx()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
commit 8a15ca0ca51399b652b1bbb23b590b220cf03d62 upstream.
During communication with Focusrite Scarlett Gen 2/3/4 USB audio interfaces, -EPROTO is sometimes returned from scarlett2_usb_tx(), snd_usb_ctl_msg() which can cause initialisation and control operations to fail intermittently.
This patch adds up to 5 retries in scarlett2_usb(), with a delay starting at 5ms and doubling each time. This follows the same approach as the fix for usb_set_interface() in endpoint.c (commit f406005e162b ("ALSA: usb-audio: Add retry on -EPROTO from usb_set_interface()")), which resolved similar -EPROTO issues during device initialisation, and is the same approach as in fcp.c:fcp_usb().
--- sound/usb/mixer_scarlett2.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/usb/mixer_scarlett2.c +7 -0
@@ -2329,6 +2329,8 @@ static int scarlett2_usb(struct scarlett2_usb_packet *req, *resp =NULL ;size_t req_buf_size =struct_size (req, data, req_size);size_t resp_buf_size =struct_size (resp, data, resp_size); +int retries =0 ; +const int max_retries =5 ;int err; req =kmalloc (req_buf_size,GFP_KERNEL );
@@ -2352,10 +2354,15 @@ static int scarlett2_usb(if (req_size)memcpy (req->data, req_data, req_size); +retry: err =scarlett2_usb_tx (dev, private->bInterfaceNumber, req, req_buf_size);if (err != req_buf_size) { +if (err == -EPROTO && ++retries <= max_retries) { +msleep (5 * (1 << (retries -1 ))); + goto retry; + } usb_audio_err( mixer->chip, "%s USB request result cmd %x was %d\n",
Greg Kroah-Hartman
maintainerPATCH 355/369 ALSA: hda/realtek - Fix mute LED for HP Victus 16-r1xxx
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edip Hazuri <[email protected]>
commit bd7814a4c0fd883894bdf9fe5eda24c9df826e4c upstream.
The mute led on this laptop is using ALC245 but requires a quirk to work This patch enables the existing quirk for the device.
Tested on Victus 16-r1xxx Laptop. The LED behaviour works as intended.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10788,6 +10788,7 @@ static const struct hda_quirk alc269_fixSND_PCI_QUIRK (0x103c ,0x8c91 ,"HP EliteBook 660" ,ALC236_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8c96 ,"HP" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ),SND_PCI_QUIRK (0x103c ,0x8c97 ,"HP ZBook" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ), +SND_PCI_QUIRK (0x103c ,0x8c99 ,"HP Victus 16-r1xxx (MB 8C99)" ,ALC245_FIXUP_HP_MUTE_LED_COEFBIT ),SND_PCI_QUIRK (0x103c ,0x8c9c ,"HP Victus 16-s1xxx (MB 8C9C)" ,ALC245_FIXUP_HP_MUTE_LED_COEFBIT ),SND_PCI_QUIRK (0x103c ,0x8ca1 ,"HP ZBook Power" ,ALC236_FIXUP_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
Greg Kroah-Hartman
maintainerPATCH 356/369 ALSA: hda/realtek - Fix mute LED for HP Victus 16-s0xxx
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edip Hazuri <[email protected]>
commit 956048a3cd9d2575032e2c7ca62803677357ae18 upstream.
The mute led on this laptop is using ALC245 but requires a quirk to work This patch enables the existing quirk for the device.
Tested on Victus 16-S0063NT Laptop. The LED behaviour works as intended.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10736,6 +10736,7 @@ static const struct hda_quirk alc269_fixSND_PCI_QUIRK (0x103c ,0x8bbe ,"HP Victus 16-r0xxx (MB 8BBE)" ,ALC245_FIXUP_HP_MUTE_LED_COEFBIT ),SND_PCI_QUIRK (0x103c ,0x8bc8 ,"HP Victus 15-fa1xxx" ,ALC245_FIXUP_HP_MUTE_LED_COEFBIT ),SND_PCI_QUIRK (0x103c ,0x8bcd ,"HP Omen 16-xd0xxx" ,ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT ), +SND_PCI_QUIRK (0x103c ,0x8bd4 ,"HP Victus 16-s0xxx (MB 8BD4)" ,ALC245_FIXUP_HP_MUTE_LED_COEFBIT ),SND_PCI_QUIRK (0x103c ,0x8bdd ,"HP Envy 17" ,ALC287_FIXUP_CS35L41_I2C_2 ),SND_PCI_QUIRK (0x103c ,0x8bde ,"HP Envy 17" ,ALC287_FIXUP_CS35L41_I2C_2 ), SND_PCI_QUIRK(0x103c, 0x8bdf, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
Greg Kroah-Hartman
maintainerPATCH 357/369 ALSA: hda/realtek - Fix mute LED for HP Victus 16-d1xxx (MB 8A26)
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edip Hazuri <[email protected]>
commit a9dec0963187d05725369156a5e0e14cd3487bfb upstream.
My friend have Victus 16-d1xxx with board ID 8A26, the existing quirk for Victus 16-d1xxx wasn't working because of different board ID
Tested on Victus 16-d1015nt Laptop. The LED behaviour works as intended.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -10678,6 +10678,7 @@ static const struct hda_quirk alc269_fixSND_PCI_QUIRK (0x103c ,0x8a0f ,"HP Pavilion 14-ec1xxx" ,ALC287_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8a20 ,"HP Laptop 15s-fq5xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x8a25 ,"HP Victus 16-d1xxx (MB 8A25)" ,ALC245_FIXUP_HP_MUTE_LED_COEFBIT ), +SND_PCI_QUIRK (0x103c ,0x8a26 ,"HP Victus 16-d1xxx (MB 8A26)" ,ALC245_FIXUP_HP_MUTE_LED_COEFBIT ),SND_PCI_QUIRK (0x103c ,0x8a28 ,"HP Envy 13" ,ALC287_FIXUP_CS35L41_I2C_2 ),SND_PCI_QUIRK (0x103c ,0x8a29 ,"HP Envy 15" ,ALC287_FIXUP_CS35L41_I2C_2 ), SND_PCI_QUIRK(0x103c, 0x8a2a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
Greg Kroah-Hartman
maintainerPATCH 358/369 platform/x86/intel/pmt: fix a crashlog NULL pointer access
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael J. Ruhl <[email protected]>
commit 54d5cd4719c5e87f33d271c9ac2e393147d934f8 upstream.
Usage of the intel_pmt_read() for binary sysfs, requires a pcidev. The current use of the endpoint value is only valid for telemetry endpoint usage.
Without the ep, the crashlog usage causes the following NULL pointer exception:
BUG: kernel NULL pointer dereference, address: 0000000000000000 Oops: Oops: 0000 [#1] SMP NOPTI RIP: 0010:intel_pmt_read+0x3b/0x70 [pmt_class] Code: Call Trace: <TASK> ? sysfs_kf_bin_read+0xc0/0xe0 kernfs_fop_read_iter+0xac/0x1a0 vfs_read+0x26d/0x350 ksys_read+0x6b/0xe0 __x64_sys_read+0x1d/0x30 x64_sys_call+0x1bc8/0x1d70 do_syscall_64+0x6d/0x110
Augment struct intel_pmt_entry with a pointer to the pcidev to avoid the NULL pointer exception.
--- drivers/platform/x86/intel/pmt/class.c | 3 ++- drivers/platform/x86/intel/pmt/class.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/platform/x86/intel/pmt/class.c +2 -1
@@ -97,7 +97,7 @@ intel_pmt_read(struct file *filp, structif (count > entry->size - off) count = entry->size - off; - count =pmt_telem_read_mmio (entry->ep->pcidev, entry->cb, entry->header.guid, buf, + count =pmt_telem_read_mmio (entry->pcidev, entry->cb, entry->header.guid, buf, entry->base, off, count);return count;
@@ -252,6 +252,7 @@ static int intel_pmt_populate_entry(strureturn -EINVAL ; } + entry->pcidev = pci_dev; entry->guid = header->guid; entry->size = header->size; entry->cb = ivdev->priv_data;
drivers/platform/x86/intel/pmt/class.h +1 -0
@@ -39,6 +39,7 @@ struct intel_pmt_header {struct intel_pmt_entry {struct telem_endpoint *ep; +struct pci_dev *pcidev;struct intel_pmt_header header;struct bin_attribute pmt_bin_attr;struct kobject *kobj;
Greg Kroah-Hartman
maintainerPATCH 359/369 x86/fpu: Delay instruction pointer fixup until after warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Hansen <[email protected]>
commit 1cec9ac2d071cfd2da562241aab0ef701355762a upstream.
Right now, if XRSTOR fails a console message like this is be printed:
Bad FPU state detected at restore_fpregs_from_fpstate+0x9a/0x170, reinitializing FPU registers.
However, the text location (...+0x9a in this case) is the instruction *AFTER* the XRSTOR. The highlighted instruction in the "Code:" dump also points one instruction late.
The reason is that the "fixup" moves RIP up to pass the bad XRSTOR and keep on running after returning from the #GP handler. But it does this fixup before warning.
The resulting warning output is nonsensical because it looks like the non-FPU-related instruction is #GP'ing.
Do not fix up RIP until after printing the warning. Do this by using the more generic and standard ex_handler_default().
--- arch/x86/mm/extable.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/x86/mm/extable.c +2 -3
@@ -122,13 +122,12 @@ static bool ex_handler_sgx(const structstatic bool ex_handler_fprestore (const struct exception_table_entry *fixup,struct pt_regs *regs) { - regs->ip =ex_fixup_addr (fixup); -WARN_ONCE (1 ,"Bad FPU state detected at %pB, reinitializing FPU registers." , (void *)instruction_pointer (regs));fpu_reset_from_exception_fixup (); -return true; + +return ex_handler_default (fixup, regs); }/*
Greg Kroah-Hartman
maintainerPATCH 360/369 s390/mm: Remove possible false-positive warning in pte_free_defer()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerald Schaefer <[email protected]>
commit 5647f61ad9171e8f025558ed6dc5702c56a33ba3 upstream.
Commit 8211dad627981 ("s390: add pte_free_defer() for pgtables sharing page") added a warning to pte_free_defer(), on our request. It was meant to warn if this would ever be reached for KVM guest mappings, because the page table would be freed w/o a gmap_unlink(). THP mappings are not allowed for KVM guests on s390, so this should never happen.
However, it is possible that the warning is triggered in a valid case as false-positive.
s390_enable_sie() takes the mmap_lock, marks all VMAs as VM_NOHUGEPAGE and splits possibly existing THP guest mappings. mm->context.has_pgste is set to 1 before that, to prevent races with the mm_has_pgste() check in MADV_HUGEPAGE.
khugepaged drops the mmap_lock for file mappings and might run in parallel, before a vma is marked VM_NOHUGEPAGE, but after mm->context.has_pgste was set to 1. If it finds file mappings to collapse, it will eventually call pte_free_defer(). This will trigger the warning, but it is a valid case because gmap is not yet set up, and the THP mappings will be split again.
Therefore, remove the warning and the comment.
--- arch/s390/mm/pgalloc.c | 5 ----- 1 file changed, 5 deletions(-)
arch/s390/mm/pgalloc.c +0 -5
@@ -219,11 +219,6 @@ void pte_free_defer(struct mm_struct *mmstruct ptdesc *ptdesc =virt_to_ptdesc (pgtable); call_rcu(&ptdesc->pt_rcu_head, pte_free_now); -/* -* THPs are not allowed for KVM guests. Warn if pgste ever reaches here. -* Turn to the generic pte_free_defer() version once gmap is removed. -*/ - WARN_ON_ONCE(mm_has_pgste(mm)); }#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
Greg Kroah-Hartman
maintainerPATCH 361/369 MIPS: mm: tlb-r4k: Uniquify TLB entries on init
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
commit 35ad7e181541aa5757f9f316768d3e64403ec843 upstream.
Hardware or bootloader will initialize TLB entries to any value, which may collide with kernel's UNIQUE_ENTRYHI value. On MIPS microAptiv/M5150 family of cores this will trigger machine check exception and cause boot failure. On M5150 simulation this could happen 7 times out of 1000 boots.
Replace local_flush_tlb_all() with r4k_tlb_uniquify() which probes each TLB ENTRIHI unique value for collisions before it's written, and in case of collision try a different ASID.
--- arch/mips/mm/tlb-r4k.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-)
arch/mips/mm/tlb-r4k.c +55 -1
@@ -508,6 +508,60 @@ static int __init set_ntlb(char *str)__setup ("ntlb=" , set_ntlb); +/* Initialise all TLB entries with unique values */ +static void r4k_tlb_uniquify (void ) +{ +int entry =num_wired_entries (); + +htw_stop (); +write_c0_entrylo0 (0 ); +write_c0_entrylo1 (0 ); + +while (entry < current_cpu_data.tlbsize) { +unsigned long asid_mask =cpu_asid_mask (¤t_cpu_data); +unsigned long asid =0 ; +int idx; + +/* Skip wired MMID to make ginvt_mmid work */ +if (cpu_has_mmid) + asid =MMID_KERNEL_WIRED +1 ; + +/* Check for match before using UNIQUE_ENTRYHI */ +do { +if (cpu_has_mmid) { +write_c0_memorymapid (asid); +write_c0_entryhi (UNIQUE_ENTRYHI (entry)); + }else { +write_c0_entryhi (UNIQUE_ENTRYHI (entry) | asid); + } +mtc0_tlbw_hazard (); +tlb_probe (); +tlb_probe_hazard (); + idx =read_c0_index (); +/* No match or match is on current entry */ +if (idx <0 || idx == entry) +break ; +/* +* If we hit a match, we need to try again with +* a different ASID. +*/ + asid++; + }while (asid < asid_mask); + +if (idx >=0 && idx != entry) +panic ("Unable to uniquify TLB entry %d" , idx); + +write_c0_index (entry); +mtc0_tlbw_hazard (); +tlb_write_indexed (); + entry++; + } + +tlbw_use_hazard (); +htw_start (); +flush_micro_tlb (); +} +/* * Configure TLB (for init or after a CPU has been powered off). */
@@ -547,7 +601,7 @@ static void r4k_tlb_configure(void) temp_tlb_entry = current_cpu_data.tlbsize -1 ;/* From this point on the ARC firmware is dead. */ -local_flush_tlb_all (); +r4k_tlb_uniquify ();/* Did I tell you that ARC SUCKS? */ }
Greg Kroah-Hartman
maintainerPATCH 362/369 mm/hmm: move pmd_to_hmm_pfn_flags() to the respective #ifdeffery
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit 188cb385bbf04d486df3e52f28c47b3961f5f0c0 upstream.
When pmd_to_hmm_pfn_flags() is unused, it prevents kernel builds with clang, make W=1 and CONFIG_TRANSPARENT_HUGEPAGE=n:
mm/hmm.c:186:29: warning: unused function 'pmd_to_hmm_pfn_flags' [-Wunused-function]
Fix this by moving the function to the respective existing ifdeffery for its the only user.
See also:
6863f5643dd7 ("kbuild: allow Clang to find unused static inline functions for W=1 build")
--- mm/hmm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/hmm.c +1 -1
@@ -173,6 +173,7 @@ static inline unsigned long hmm_pfn_flagreturn order <<HMM_PFN_ORDER_SHIFT ; } +#ifdef CONFIG_TRANSPARENT_HUGEPAGE static inline unsigned long pmd_to_hmm_pfn_flags (struct hmm_range *range,pmd_t pmd) {
@@ -183,7 +184,6 @@ static inline unsigned long pmd_to_hmm_phmm_pfn_flags_order (PMD_SHIFT -PAGE_SHIFT ); } -#ifdef CONFIG_TRANSPARENT_HUGEPAGE static int hmm_vma_handle_pmd (struct mm_walk *walk,unsigned long addr,unsigned long end,unsigned long hmm_pfns[],pmd_t pmd)
Greg Kroah-Hartman
maintainerPATCH 363/369 mm: swap: correctly use maxpages in swapon syscall to avoid potential deadloop
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kemeng Shi <[email protected]>
commit 255116c5b0fa2145ede28c2f7b248df5e73834d1 upstream.
We use maxpages from read_swap_header() to initialize swap_info_struct, however the maxpages might be reduced in setup_swap_extents() and the si->max is assigned with the reduced maxpages from the setup_swap_extents().
Obviously, this could lead to memory waste as we allocated memory based on larger maxpages, besides, this could lead to a potential deadloop as following:
1) When calling setup_clusters() with larger maxpages, unavailable pages within range [si->max, larger maxpages) are not accounted with inc_cluster_info_page(). As a result, these pages are assumed available but can not be allocated. The cluster contains these pages can be moved to frag_clusters list after it's all available pages were allocated.
2) When the cluster mentioned in 1) is the only cluster in frag_clusters list, cluster_alloc_swap_entry() assume order 0 allocation will never failed and will enter a deadloop by keep trying to allocate page from the only cluster in frag_clusters which contains no actually available page.
Call setup_swap_extents() to get the final maxpages before swap_info_struct initialization to fix the issue.
After this change, span will include badblocks and will become large value which I think is correct value:
In summary, there are two kinds of swapfile_activate operations.
1. Filesystem style: Treat all blocks logical continuity and find usable physical extents in logical range. In this way, si->pages will be actual usable physical blocks and span will be "1 + highest_block - lowest_block".
2. Block device style: Treat all blocks physically continue and only one single extent is added. In this way, si->pages will be si->max and span will be "si->pages - 1". Actually, si->pages and si->max is only used in block device style and span value is set with si->pages. As a result, span value in block device style will become a larger value as you mentioned.
I think larger value is correct based on:
1. Span value in filesystem style is "1 + highest_block - lowest_block" which is the range cover all possible phisical blocks including the badblocks.
2. For block device style, si->pages is the actual usable block number and is already in pr_info. The original span value before this patch is also refer to usable block number which is redundant in pr_info.
--- mm/swapfile.c | 53 ++++++++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 27 deletions(-)
mm/swapfile.c +26 -27
@@ -3237,43 +3237,30 @@ static unsigned long read_swap_header(st#define SWAP_CLUSTER_COLS \ max_t(unsigned int, SWAP_CLUSTER_INFO_COLS, SWAP_CLUSTER_SPACE_COLS) -static int setup_swap_map_and_extents (struct swap_info_struct *si, -union swap_header *swap_header, -unsigned char *swap_map, -unsigned long maxpages, -sector_t *span) +static int setup_swap_map (struct swap_info_struct *si, +union swap_header *swap_header, +unsigned char *swap_map, +unsigned long maxpages) { -unsigned int nr_good_pages;unsigned long i; -int nr_extents; - - nr_good_pages = maxpages -1 ;/* omit header page */ + swap_map[0 ] =SWAP_MAP_BAD ;/* omit header page */ for (i =0 ; i < swap_header->info.nr_badpages; i++) {unsigned int page_nr = swap_header->info.badpages[i];if (page_nr ==0 || page_nr > swap_header->info.last_page)return -EINVAL ;if (page_nr < maxpages) { swap_map[page_nr] =SWAP_MAP_BAD ; - nr_good_pages--; + si->pages--; } } -if (nr_good_pages) { - swap_map[0 ] =SWAP_MAP_BAD ; - si->max = maxpages; - si->pages = nr_good_pages; - nr_extents =setup_swap_extents (si, span); -if (nr_extents <0 ) -return nr_extents; - nr_good_pages = si->pages; - } -if (!nr_good_pages) { +if (!si->pages) {pr_warn ("Empty swap-file\n" );return -EINVAL ; } -return nr_extents; +return 0 ; } static struct swap_cluster_info *setup_clusters(struct swap_info_struct *si,
@@ -3318,7 +3305,7 @@ static struct swap_cluster_info *setup_c* Mark unusable pages as unavailable. The clusters aren't * marked free yet, so no list operations are involved yet. * -* See setup_swap_map_and_extents(): header page, bad pages, +* See setup_swap_map(): header page, bad pages, * and the EOF part of the last cluster. */ inc_cluster_info_page (si, cluster_info,0 );
@@ -3456,6 +3443,21 @@ SYSCALL_DEFINE2(swapon, const char __use goto bad_swap_unlock_inode; } + si->max = maxpages; + si->pages = maxpages -1 ; + nr_extents =setup_swap_extents (si, &span); +if (nr_extents <0 ) { + error = nr_extents; + goto bad_swap_unlock_inode; + } +if (si->pages != si->max -1 ) { +pr_err ("swap:%u != (max:%u - 1)\n" , si->pages, si->max); + error = -EINVAL ; + goto bad_swap_unlock_inode; + } + + maxpages = si->max; +/* OK, set up the swap map and apply the bad block list */ swap_map =vzalloc (maxpages);if (!swap_map) {
@@ -3467,12 +3469,9 @@ SYSCALL_DEFINE2(swapon, const char __useif (error) goto bad_swap_unlock_inode; - nr_extents =setup_swap_map_and_extents (si, swap_header, swap_map, - maxpages, &span); -if (unlikely (nr_extents <0 )) { - error = nr_extents; + error =setup_swap_map (si, swap_header, swap_map, maxpages); +if (error) goto bad_swap_unlock_inode; - }/* * Use kvmalloc_array instead of bitmap_zalloc as the allocation order might
Greg Kroah-Hartman
maintainerPATCH 364/369 mm: swap: fix potential buffer overflow in setup_clusters()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kemeng Shi <[email protected]>
commit 152c1339dc13ad46f1b136e8693de15980750835 upstream.
In setup_swap_map(), we only ensure badpages are in range (0, last_page]. As maxpages might be < last_page, setup_clusters() will encounter a buffer overflow when a badpage is >= maxpages.
Only call inc_cluster_info_page() for badpage which is < maxpages to fix the issue.
--- mm/swapfile.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
mm/swapfile.c +7 -3
@@ -3309,9 +3309,13 @@ static struct swap_cluster_info *setup_c* and the EOF part of the last cluster. */ inc_cluster_info_page (si, cluster_info,0 ); -for (i =0 ; i < swap_header->info.nr_badpages; i++) -inc_cluster_info_page (si, cluster_info, - swap_header->info.badpages[i]); +for (i =0 ; i < swap_header->info.nr_badpages; i++) { +unsigned int page_nr = swap_header->info.badpages[i]; + +if (page_nr >= maxpages) +continue ; +inc_cluster_info_page (si, cluster_info, page_nr); + }for (i = maxpages; i <round_up (maxpages,SWAPFILE_CLUSTER ); i++)inc_cluster_info_page (si, cluster_info, i);
Greg Kroah-Hartman
maintainerPATCH 365/369 perf/arm-ni: Set initial IRQ affinity
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robin Murphy <[email protected]>
commit c872d7c837382517c51a76dfdcf550332cfab231 upstream.
While we do request our IRQs with the right flags to stop their affinity changing unexpectedly, we forgot to actually set it to start with. Oops.
--- drivers/perf/arm-ni.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/perf/arm-ni.c +2 -0
@@ -545,6 +545,8 @@ static int arm_ni_init_cd(struct arm_nireturn err; cd->cpu =cpumask_local_spread (0 ,dev_to_node (ni->dev)); +irq_set_affinity (cd->irq,cpumask_of (cd->cpu)); + cd->pmu = (struct pmu ) { .module =THIS_MODULE , .parent = ni->dev,
Greg Kroah-Hartman
maintainerPATCH 366/369 media: ti: j721e-csi2rx: fix list_del corruption
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Julien Massot <[email protected]>
commit ae42c6fe531425ef2f47e82f96851427d24bbf6b upstream.
If ti_csi2rx_start_dma() fails in ti_csi2rx_dma_callback(), the buffer is marked done with VB2_BUF_STATE_ERROR but is not removed from the DMA queue. This causes the same buffer to be retried in the next iteration, resulting in a double list_del() and eventual list corruption.
Fix this by removing the buffer from the queue before calling vb2_buffer_done() on error.
This resolves a crash due to list_del corruption:
[ 37.811243] j721e-csi2rx 30102000.ticsi2rx: Failed to queue the next buffer for DMA [ 37.832187] slab kmalloc-2k start ffff00000255b000 pointer offset 1064 size 2048 [ 37.839761] list_del corruption. next->prev should be ffff00000255bc28, but was ffff00000255d428. (next=ffff00000255b428) [ 37.850799] ------------[ cut here ]------------ [ 37.855424] kernel BUG at lib/list_debug.c:65! [ 37.859876] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP [ 37.866061] Modules linked in: i2c_dev usb_f_rndis u_ether libcomposite dwc3 udc_core usb_common aes_ce_blk aes_ce_cipher ghash_ce gf128mul sha1_ce cpufreq_dt dwc3_am62 phy_gmii_sel sa2ul [ 37.882830] CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.16.0-rc3+ #28 VOLUNTARY [ 37.890851] Hardware name: Bosch STLA-GSRV2-B0 (DT) [ 37.895737] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 37.902703] pc : __list_del_entry_valid_or_report+0xdc/0x114 [ 37.908390] lr : __list_del_entry_valid_or_report+0xdc/0x114 [ 37.914059] sp : ffff800080003db0 [ 37.917375] x29: ffff800080003db0 x28: 0000000000000007 x27: ffff800080e50000 [ 37.924521] x26: 0000000000000000 x25: ffff0000016abb50 x24: dead000000000122 [ 37.931666] x23: ffff0000016abb78 x22: ffff0000016ab080 x21: ffff800080003de0 [ 37.938810] x20: ffff00000255bc00 x19: ffff00000255b800 x18: 000000000000000a [ 37.945956] x17: 20747562202c3832 x16: 6362353532303030 x15: 0720072007200720 [ 37.953101] x14: 0720072007200720 x13: 0720072007200720 x12: 00000000ffffffea [ 37.960248] x11: ffff800080003b18 x10: 00000000ffffefff x9 : ffff800080f5b568 [ 37.967396] x8 : ffff800080f5b5c0 x7 : 0000000000017fe8 x6 : c0000000ffffefff [ 37.974542] x5 : ffff00000fea6688 x4 : 0000000000000000 x3 : 0000000000000000 [ 37.981686] x2 : 0000000000000000 x1 : ffff800080ef2b40 x0 : 000000000000006d [ 37.988832] Call trace: [ 37.991281] __list_del_entry_valid_or_report+0xdc/0x114 (P) [ 37.996959] ti_csi2rx_dma_callback+0x84/0x1c4 [ 38.001419] udma_vchan_complete+0x1e0/0x344 [ 38.005705] tasklet_action_common+0x118/0x310 [ 38.010163] tasklet_action+0x30/0x3c [ 38.013832] handle_softirqs+0x10c/0x2e0 [ 38.017761] __do_softirq+0x14/0x20 [ 38.021256] ____do_softirq+0x10/0x20 [ 38.024931] call_on_irq_stack+0x24/0x60 [ 38.028873] do_softirq_own_stack+0x1c/0x40 [ 38.033064] __irq_exit_rcu+0x130/0x15c [ 38.036909] irq_exit_rcu+0x10/0x20 [ 38.040403] el1_interrupt+0x38/0x60 [ 38.043987] el1h_64_irq_handler+0x18/0x24 [ 38.048091] el1h_64_irq+0x6c/0x70 [ 38.051501] default_idle_call+0x34/0xe0 (P) [ 38.055783] do_idle+0x1f8/0x250 [ 38.059021] cpu_startup_entry+0x34/0x3c [ 38.062951] rest_init+0xb4/0xc0 [ 38.066186] console_on_rootfs+0x0/0x6c [ 38.070031] __primary_switched+0x88/0x90 [ 38.074059] Code: b00037e0 91378000 f9400462 97e9bf49 (d4210000) [ 38.080168] ---[ end trace 0000000000000000 ]--- [ 38.084795] Kernel panic - not syncing: Oops - BUG: Fatal exception in interrupt [ 38.092197] SMP: stopping secondary CPUs [ 38.096139] Kernel Offset: disabled [ 38.099631] CPU features: 0x0000,00002000,02000801,0400420b [ 38.105202] Memory Limit: none [ 38.108260] ---[ end Kernel panic - not syncing: Oops - BUG: Fatal exception in interrupt ]---
--- drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c | 1 + 1 file changed, 1 insertion(+)
drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c +1 -0
@@ -619,6 +619,7 @@ static void ti_csi2rx_dma_callback(voidif (ti_csi2rx_start_dma (csi, buf)) {dev_err (csi->dev,"Failed to queue the next buffer for DMA\n" ); +list_del (&buf->list);vb2_buffer_done (&buf->vb.vb2_buf,VB2_BUF_STATE_ERROR ); }else {list_move_tail (&buf->list, &dma->submitted);
Greg Kroah-Hartman
maintainerPATCH 367/369 HID: apple: validate feature-report field count to prevent NULL pointer dereference
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qasim Ijaz <[email protected]>
commit 1bb3363da862e0464ec050eea2fb5472a36ad86b upstream.
A malicious HID device with quirk APPLE_MAGIC_BACKLIGHT can trigger a NULL pointer dereference whilst the power feature-report is toggled and sent to the device in apple_magic_backlight_report_set(). The power feature-report is expected to have two data fields, but if the descriptor declares one field then accessing field[1] and dereferencing it in apple_magic_backlight_report_set() becomes invalid
since field[1] will be NULL.
An example of a minimal descriptor which can cause the crash is something like the following where the report with ID 3 (power report) only references a single 1-byte field. When hid core parses the descriptor it will encounter the final feature tag, allocate a hid_report (all members of field[] will be zeroed out), create field structure and populate it, increasing the maxfield to 1. The subsequent field[1] access and dereference causes the crash.
Usage Page (Vendor Defined 0xFF00)
Usage (0x0F)
Collection (Application)
Report ID (1)
Usage (0x01)
Logical Minimum (0)
Logical Maximum (255)
Report Size (8)
Report Count (1)
Feature (Data,Var,Abs)
Usage (0x02)
Logical Maximum (32767)
Report Size (16)
Report Count (1)
Feature (Data,Var,Abs)
Report ID (3)
Usage (0x03)
Logical Minimum (0)
Logical Maximum (1)
Report Size (8)
Report Count (1)
Feature (Data,Var,Abs)
End Collection
Here we see the KASAN splat when the kernel dereferences the NULL pointer and crashes:
[ 15.164723] Oops: general protection fault, probably for non-canonical address 0xdffffc0000000006: 0000 [#1] SMP KASAN NOPTI [ 15.165691] KASAN: null-ptr-deref in range [0x0000000000000030-0x0000000000000037] [ 15.165691] CPU: 0 UID: 0 PID: 10 Comm: kworker/0:1 Not tainted 6.15.0 #31 PREEMPT(voluntary) [ 15.165691] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-debian-1.16.2-1 04/01/2014 [ 15.165691] RIP: 0010:apple_magic_backlight_report_set+0xbf/0x210 [ 15.165691] Call Trace: [ 15.165691] <TASK> [ 15.165691] apple_probe+0x571/0xa20 [ 15.165691] hid_device_probe+0x2e2/0x6f0 [ 15.165691] really_probe+0x1ca/0x5c0 [ 15.165691] __driver_probe_device+0x24f/0x310 [ 15.165691] driver_probe_device+0x4a/0xd0 [ 15.165691] __device_attach_driver+0x169/0x220 [ 15.165691] bus_for_each_drv+0x118/0x1b0 [ 15.165691] __device_attach+0x1d5/0x380 [ 15.165691] device_initial_probe+0x12/0x20 [ 15.165691] bus_probe_device+0x13d/0x180 [ 15.165691] device_add+0xd87/0x1510 [...]
To fix this issue we should validate the number of fields that the backlight and power reports have and if they do not have the required number of fields then bail.
--- drivers/hid/hid-apple.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/hid/hid-apple.c +2 -1
@@ -890,7 +890,8 @@ static int apple_magic_backlight_init(st backlight->brightness = report_enum->report_id_hash[APPLE_MAGIC_REPORT_ID_BRIGHTNESS ]; backlight->power = report_enum->report_id_hash[APPLE_MAGIC_REPORT_ID_POWER ]; -if (!backlight->brightness || !backlight->power) +if (!backlight->brightness || backlight->brightness->maxfield <2 || + !backlight->power || backlight->power->maxfield <2 )return -ENODEV ; backlight->cdev.name =":white:" LED_FUNCTION_KBD_BACKLIGHT ;
Greg Kroah-Hartman
maintainerPATCH 368/369 USB: gadget: f_hid: Fix memory leak in hidg_bind error path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuhao Jiang <[email protected]>
commit 62783c30d78aecf9810dae46fd4d11420ad38b74 upstream.
In hidg_bind(), if alloc_workqueue() fails after usb_assign_descriptors() has successfully allocated the USB descriptors, the current error handling does not call usb_free_all_descriptors() to free the allocated descriptors, resulting in a memory leak.
Restructure the error handling by adding proper cleanup labels:
- fail_free_all: cleans up workqueue and descriptors
- fail_free_descs: cleans up descriptors only
- fail: original cleanup for earlier failures
This ensures that allocated resources are properly freed in reverse order of their allocation, preventing the memory leak when alloc_workqueue() fails.
--- drivers/usb/gadget/function/f_hid.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/usb/gadget/function/f_hid.c +4 -3
@@ -1275,18 +1275,19 @@ static int hidg_bind(struct usb_configurif (!hidg->workqueue) { status = -ENOMEM ; - goto fail; + goto fail_free_descs; }/* create char device */ cdev_init (&hidg->cdev, &f_hidg_fops); status =cdev_device_add (&hidg->cdev, &hidg->dev);if (status) - goto fail_free_descs; + goto fail_free_all;return 0 ; -fail_free_descs: +fail_free_all:destroy_workqueue (hidg->workqueue); +fail_free_descs:usb_free_all_descriptors (f); fail:ERROR (f->config->cdev,"hidg_bind FAILED\n" );
Greg Kroah-Hartman
maintainerPATCH 369/369 usb: gadget : fix use-after-free in composite_dev_cleanup()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tao Xue <[email protected]>
commit 151c0aa896c47a4459e07fee7d4843f44c1bb18e upstream.
1. In func configfs_composite_bind() -> composite_os_desc_req_prepare():
if kmalloc fails, the pointer cdev->os_desc_req will be freed but not set to NULL. Then it will return a failure to the upper-level function.
2. in func configfs_composite_bind() -> composite_dev_cleanup():
it will checks whether cdev->os_desc_req is NULL. If it is not NULL, it will attempt to use it.This will lead to a use-after-free issue.
BUG: KASAN: use-after-free in composite_dev_cleanup+0xf4/0x2c0 Read of size 8 at addr 0000004827837a00 by task init/1 CPU: 10 PID: 1 Comm: init Tainted: G O 5.10.97-oh #1 kasan_report+0x188/0x1cc __asan_load8+0xb4/0xbc composite_dev_cleanup+0xf4/0x2c0 configfs_composite_bind+0x210/0x7ac udc_bind_to_driver+0xb4/0x1ec usb_gadget_probe_driver+0xec/0x21c gadget_dev_desc_UDC_store+0x264/0x27c
--- drivers/usb/gadget/composite.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/gadget/composite.c +5 -0
@@ -2489,6 +2489,11 @@ int composite_os_desc_req_prepare(structif (!cdev->os_desc_req->buf) { ret = -ENOMEM ;usb_ep_free_request (ep0, cdev->os_desc_req); +/* +* Set os_desc_req to NULL so that composite_dev_cleanup() +* will not try to free it again. +*/ + cdev->os_desc_req =NULL ; goto end; } cdev->os_desc_req->context = cdev;
# Librecast Test Results
010/010 [ OK ] libmld
120/120 [ OK ] liblibrecast
CPU/kernel: Linux auntie 6.12.42-rc1-g3566c7a6291d #37 SMP PREEMPT_DYNAMIC Tue Aug 12 18:54:43 -00 2025 x86_64 AMD Ryzen 9 9950X 16-Core Processor AuthenticAMD GNU/Linux
Hi!
Quoted 7 lines
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +0000. Anything received after that time might be too late.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.12.y
Best regards,
Pavel
Signature · 2 lines
In cooperation with DENX Software Engineering GmbH, HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +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.12.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.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
Am 12.08.2025 um 19:24 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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.
Builds, boots and works on my 2-socket Ivy Bridge Xeon E5-2697 v2 server. Built with GCC 14.2 on Debian Trixie. No dmesg oddities or regressions found. I did not see any of the Python warning messages here which I did see in the 6.1.148-rc1 build.
Beste Grüße,
Peter Schneider
Signature · 8 lines
Climb the mountain not to plant your flag, but to embrace the challenge, enjoy the air and behold the view. Climb it so you can see the world, not so the world can see you. -- David McCullough Jr. OpenPGP: 0xA3828BD796CCE11A8CADE8866E3A92C92C3FF244 Download: https://www.peters-netzplatz.de/download/pschneider1968_pub.asc https://keys.mailvelope.com/pks/lookup?op=get&[email protected] https://keys.mailvelope.com/pks/lookup?op=get&[email protected]
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +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.12.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
Builds successfully. Boots and works on qemu and Dell XPS 15 9520 w/ Intel Core i7-12600H
Thanks,
Brett
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +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.12.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.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 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +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.12.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.12:
10 builds: 10 pass, 0 fail
28 boots: 28 pass, 0 fail
120 tests: 120 pass, 0 failLinux version: 6.12.42-rc1-g3566c7a6291d
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra186-p3509-0000+p3636-0001, tegra194-p2972-0000,
tegra194-p3509-0000+p3668-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +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.12.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +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.12.42-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.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.12.42-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git commit: 3566c7a6291d9602f9f443a3e97340103197f811
* git describe: v6.12.41-370-g3566c7a6291d
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.12.y/build/v6.12.41-370-g3566c7a6291d
## Test Regressions (compared to v6.12.40-118-g487cdbecb4dc)
## Metric Regressions (compared to v6.12.40-118-g487cdbecb4dc)
## Test Fixes (compared to v6.12.40-118-g487cdbecb4dc)
## Metric Fixes (compared to v6.12.40-118-g487cdbecb4dc)
## Test result summary
total: 308371, pass: 287741, fail: 6222, skip: 13991, xfail: 417
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 139 total, 137 passed, 2 failed
* arm64: 57 total, 56 passed, 1 failed
* i386: 18 total, 18 passed, 0 failed
* mips: 34 total, 33 passed, 1 failed
* parisc: 4 total, 4 passed, 0 failed
* powerpc: 40 total, 40 passed, 0 failed
* riscv: 25 total, 22 passed, 3 failed
* s390: 22 total, 21 passed, 1 failed
* sh: 5 total, 5 passed, 0 failed
* sparc: 4 total, 3 passed, 1 failed
* x86_64: 49 total, 48 passed, 1 failed
## Test suites summary
* boot
* commands
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-efivarfs
* kselftest-exec
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-kcmp
* kselftest-kvm
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-mincore
* kselftest-mm
* kselftest-mqueue
* kselftest-net
* kselftest-net-mptcp
* kselftest-openat2
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-tc-testing
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user_events
* kselftest-vDSO
* kselftest-x86
* kunit
* kvm-unit-tests
* lava
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-build-clang
* log-parser-build-gcc
* log-parser-test
* ltp-capability
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-hugetlb
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* modules
* perf
* rcutorture
* rt-tests-cyclicdeadline
* rt-tests-pi-stress
* rt-tests-pmqtest
* rt-tests-rt-migrate-test
* rt-tests-signaltest
--
Linaro LKFT
https://lkft.linaro.org
Quoted 8 lines · On Tue, 12 Aug 2025 19:24:57 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +0000. Anything received after that time might be too late.
Boot-tested under QEMU for Rust x86_64, arm64 and riscv64; built-tested for loongarch64:
Thanks!
Cheers,
Miguel
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.42 release. There are 369 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 Thu, 14 Aug 2025 17:27:11 +0000. Anything received after that time might be too late.
No problems seen on x86_64 and aarch64 with our testing.
Thanks,
Harshit