6.19.10-rc1 review
Subsystems (7)
Greg Kroah-Hartman
maintainerPATCH 149/220 net/smc: fix NULL dereference and UAF in smc_tcp_syn_recv_sock()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiayuan Chen <[email protected]>
[ Upstream commit 6d5e4538364b9ceb1ac2941a4deb86650afb3538 ]
Syzkaller reported a panic in smc_tcp_syn_recv_sock() [1].
smc_tcp_syn_recv_sock() is called in the TCP receive path (softirq) via icsk_af_ops->syn_recv_sock on the clcsock (TCP listening socket). It reads sk_user_data to get the smc_sock pointer. However, when the SMC listen socket is being closed concurrently, smc_close_active() sets clcsock->sk_user_data to NULL under sk_callback_lock, and then the smc_sock itself can be freed via sock_put() in smc_release().
This leads to two issues:
1) NULL pointer dereference: sk_user_data is NULL when accessed.
2) Use-after-free: sk_user_data is read as non-NULL, but the smc_sock is freed before its fields (e.g., queued_smc_hs, ori_af_ops) are accessed.
The race window looks like this (the syzkaller crash [1] triggers via the SYN cookie path: tcp_get_cookie_sock() -> smc_tcp_syn_recv_sock(), but the normal tcp_check_req() path has the same race):
CPU A (softirq) CPU B (process ctx)
tcp_v4_rcv()
TCP_NEW_SYN_RECV:
sk = req->rsk_listener
sock_hold(sk)
/* No lock on listener */
smc_close_active():
write_lock_bh(cb_lock)
sk_user_data = NULL
write_unlock_bh(cb_lock)
...
smc_clcsock_release()
sock_put(smc->sk) x2
-> smc_sock freed!
tcp_check_req()
smc_tcp_syn_recv_sock():
smc = user_data(sk)
-> NULL or dangling
smc->queued_smc_hs
-> crash!Note that the clcsock and smc_sock are two independent objects with separate refcounts. TCP stack holds a reference on the clcsock, which keeps it alive, but this does NOT prevent the smc_sock from being freed.
Fix this by using RCU and refcount_inc_not_zero() to safely access smc_sock. Since smc_tcp_syn_recv_sock() is called in the TCP three-way handshake path, taking read_lock_bh on sk_callback_lock is too heavy and would not survive a SYN flood attack. Using rcu_read_lock() is much more lightweight.
- Set SOCK_RCU_FREE on the SMC listen socket so that smc_sock freeing is deferred until after the RCU grace period. This guarantees the memory is still valid when accessed inside rcu_read_lock().
- Use rcu_read_lock() to protect reading sk_user_data.
- Use refcount_inc_not_zero(&smc->sk.sk_refcnt) to pin the smc_sock. If the refcount has already reached zero (close path completed), it returns false and we bail out safely.
Note: smc_hs_congested() has a similar lockless read of sk_user_data without rcu_read_lock(), but it only checks for NULL and accesses the global smc_hs_wq, never dereferencing any smc_sock field, so it is not affected.
Reproducer was verified with mdelay injection and smc_run, the issue no longer occurs with this patch applied.
[1] https://syzkaller.appspot.com/bug?extid=827ae2bfb3a3529333e9
--- net/smc/af_smc.c | 23 +++++++++++++++++------ net/smc/smc.h | 5 +++++ net/smc/smc_close.c | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-)
net/smc/af_smc.c +17 -6
@@ -131,7 +131,14 @@ static struct sock *smc_tcp_syn_recv_sock(const struct sock *sk,struct smc_sock *smc;struct sock *child; - smc =smc_clcsock_user_data (sk); +rcu_read_lock (); + smc =smc_clcsock_user_data_rcu (sk); +if (!smc || !refcount_inc_not_zero (&smc->sk.sk_refcnt)) { +rcu_read_unlock (); + smc =NULL ; + goto drop; + } +rcu_read_unlock ();if (READ_ONCE (sk->sk_ack_backlog) +atomic_read (&smc->queued_smc_hs) > sk->sk_max_ack_backlog)
@@ -153,11 +160,14 @@ static struct sock *smc_tcp_syn_recv_sock(const struct sock *sk,if (inet_csk (child)->icsk_af_ops ==inet_csk (sk)->icsk_af_ops)inet_csk (child)->icsk_af_ops = smc->ori_af_ops; } +sock_put (&smc->sk);return child; drop:dst_release (dst);tcp_listendrop (sk); +if (smc) +sock_put (&smc->sk);return NULL ; }
@@ -254,7 +264,7 @@ static void smc_fback_restore_callbacks(struct smc_sock *smc)struct sock *clcsk = smc->clcsock->sk;write_lock_bh (&clcsk->sk_callback_lock); - clcsk->sk_user_data =NULL ; +rcu_assign_sk_user_data (clcsk,NULL );smc_clcsock_restore_cb (&clcsk->sk_state_change, &smc->clcsk_state_change);smc_clcsock_restore_cb (&clcsk->sk_data_ready, &smc->clcsk_data_ready);
@@ -902,7 +912,7 @@ static void smc_fback_replace_callbacks(struct smc_sock *smc)struct sock *clcsk = smc->clcsock->sk;write_lock_bh (&clcsk->sk_callback_lock); - clcsk->sk_user_data = (void *)((uintptr_t )smc |SK_USER_DATA_NOCOPY ); +__rcu_assign_sk_user_data_with_flags (clcsk, smc,SK_USER_DATA_NOCOPY );smc_clcsock_replace_cb (&clcsk->sk_state_change, smc_fback_state_change, &smc->clcsk_state_change);
@@ -2665,8 +2675,8 @@ int smc_listen(struct socket *sock, int backlog)* smc-specific sk_data_ready function */ write_lock_bh (&smc->clcsock->sk->sk_callback_lock); - smc->clcsock->sk->sk_user_data = - (void *)((uintptr_t )smc |SK_USER_DATA_NOCOPY ); +__rcu_assign_sk_user_data_with_flags (smc->clcsock->sk, smc, +SK_USER_DATA_NOCOPY );smc_clcsock_replace_cb (&smc->clcsock->sk->sk_data_ready, smc_clcsock_data_ready, &smc->clcsk_data_ready);write_unlock_bh (&smc->clcsock->sk->sk_callback_lock);
@@ -2687,10 +2697,11 @@ int smc_listen(struct socket *sock, int backlog)write_lock_bh (&smc->clcsock->sk->sk_callback_lock);smc_clcsock_restore_cb (&smc->clcsock->sk->sk_data_ready, &smc->clcsk_data_ready); - smc->clcsock->sk->sk_user_data =NULL ; +rcu_assign_sk_user_data (smc->clcsock->sk,NULL );write_unlock_bh (&smc->clcsock->sk->sk_callback_lock); goto out; } +sock_set_flag (sk,SOCK_RCU_FREE ); sk->sk_max_ack_backlog = backlog; sk->sk_ack_backlog =0 ; sk->sk_state =SMC_LISTEN ;
net/smc/smc.h +5 -0
@@ -346,6 +346,11 @@ static inline struct smc_sock *smc_clcsock_user_data(const struct sock *clcsk) ((uintptr_t )clcsk->sk_user_data & ~SK_USER_DATA_NOCOPY ); } +static inline struct smc_sock *smc_clcsock_user_data_rcu (const struct sock *clcsk) +{ +return (struct smc_sock *)rcu_dereference_sk_user_data (clcsk); +} +/* save target_cb in saved_cb, and replace target_cb with new_cb */ static inline void smc_clcsock_replace_cb(void (**target_cb)(struct sock *), void (*new_cb)(struct sock *),
net/smc/smc_close.c +1 -1
@@ -218,7 +218,7 @@ int smc_close_active(struct smc_sock *smc)write_lock_bh (&smc->clcsock->sk->sk_callback_lock);smc_clcsock_restore_cb (&smc->clcsock->sk->sk_data_ready, &smc->clcsk_data_ready); - smc->clcsock->sk->sk_user_data =NULL ; +rcu_assign_sk_user_data (smc->clcsock->sk,NULL );write_unlock_bh (&smc->clcsock->sk->sk_callback_lock); rc =kernel_sock_shutdown (smc->clcsock,SHUT_RDWR ); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 150/220 net/sched: teql: Fix double-free in teql_master_xmit
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jamal Hadi Salim <[email protected]>
[ Upstream commit 66360460cab63c248ca5b1070a01c0c29133b960 ]
Whenever a TEQL devices has a lockless Qdisc as root, qdisc_reset should be called using the seq_lock to avoid racing with the datapath. Failure to do so may cause crashes like the following:
[ 238.028993][ T318] BUG: KASAN: double-free in skb_release_data (net/core/skbuff.c:1139) [ 238.029328][ T318] Free of addr ffff88810c67ec00 by task poc_teql_uaf_ke/318 [ 238.029749][ T318] [ 238.029900][ T318] CPU: 3 UID: 0 PID: 318 Comm: poc_teql_ke Not tainted 7.0.0-rc3-00149-ge5b31d988a41 #704 PREEMPT(full) [ 238.029906][ T318] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 238.029910][ T318] Call Trace: [ 238.029913][ T318] <TASK> [ 238.029916][ T318] dump_stack_lvl (lib/dump_stack.c:122) [ 238.029928][ T318] print_report (mm/kasan/report.c:379 mm/kasan/report.c:482) [ 238.029940][ T318] ? skb_release_data (net/core/skbuff.c:1139) [ 238.029944][ T318] ? srso_alias_return_thunk (arch/x86/lib/retpoline.S:221) ... [ 238.029957][ T318] ? skb_release_data (net/core/skbuff.c:1139) [ 238.029969][ T318] kasan_report_invalid_free (mm/kasan/report.c:221 mm/kasan/report.c:563) [ 238.029979][ T318] ? skb_release_data (net/core/skbuff.c:1139) [ 238.029989][ T318] check_slab_allocation (mm/kasan/common.c:231) [ 238.029995][ T318] kmem_cache_free (mm/slub.c:2637 (discriminator 1) mm/slub.c:6168 (discriminator 1) mm/slub.c:6298 (discriminator 1)) [ 238.030004][ T318] skb_release_data (net/core/skbuff.c:1139) ... [ 238.030025][ T318] sk_skb_reason_drop (net/core/skbuff.c:1256) [ 238.030032][ T318] pfifo_fast_reset (./include/linux/ptr_ring.h:171 ./include/linux/ptr_ring.h:309 ./include/linux/skb_array.h:98 net/sched/sch_generic.c:827) [ 238.030039][ T318] ? srso_alias_return_thunk (arch/x86/lib/retpoline.S:221) ... [ 238.030054][ T318] qdisc_reset (net/sched/sch_generic.c:1034) [ 238.030062][ T318] teql_destroy (./include/linux/spinlock.h:395 net/sched/sch_teql.c:157) [ 238.030071][ T318] __qdisc_destroy (./include/net/pkt_sched.h:328 net/sched/sch_generic.c:1077) [ 238.030077][ T318] qdisc_graft (net/sched/sch_api.c:1062 net/sched/sch_api.c:1053 net/sched/sch_api.c:1159) [ 238.030089][ T318] ? __pfx_qdisc_graft (net/sched/sch_api.c:1091) [ 238.030095][ T318] ? srso_alias_return_thunk (arch/x86/lib/retpoline.S:221) [ 238.030102][ T318] ? srso_alias_return_thunk (arch/x86/lib/retpoline.S:221) [ 238.030106][ T318] ? srso_alias_return_thunk (arch/x86/lib/retpoline.S:221) [ 238.030114][ T318] tc_get_qdisc (net/sched/sch_api.c:1529 net/sched/sch_api.c:1556) ... [ 238.072958][ T318] Allocated by task 303 on cpu 5 at 238.026275s: [ 238.073392][ T318] kasan_save_stack (mm/kasan/common.c:58) [ 238.073884][ T318] kasan_save_track (mm/kasan/common.c:64 (discriminator 5) mm/kasan/common.c:79 (discriminator 5)) [ 238.074230][ T318] __kasan_slab_alloc (mm/kasan/common.c:369) [ 238.074578][ T318] kmem_cache_alloc_node_noprof (./include/linux/kasan.h:253 mm/slub.c:4542 mm/slub.c:4869 mm/slub.c:4921) [ 238.076091][ T318] kmalloc_reserve (net/core/skbuff.c:616 (discriminator 107)) [ 238.076450][ T318] __alloc_skb (net/core/skbuff.c:713) [ 238.076834][ T318] alloc_skb_with_frags (./include/linux/skbuff.h:1383 net/core/skbuff.c:6763) [ 238.077178][ T318] sock_alloc_send_pskb (net/core/sock.c:2997) [ 238.077520][ T318] packet_sendmsg (net/packet/af_packet.c:2926 net/packet/af_packet.c:3019 net/packet/af_packet.c:3108) [ 238.081469][ T318] [ 238.081870][ T318] Freed by task 299 on cpu 1 at 238.028496s: [ 238.082761][ T318] kasan_save_stack (mm/kasan/common.c:58) [ 238.083481][ T318] kasan_save_track (mm/kasan/common.c:64 (discriminator 5) mm/kasan/common.c:79 (discriminator 5)) [ 238.085348][ T318] kasan_save_free_info (mm/kasan/generic.c:587 (discriminator 1)) [ 238.085900][ T318] __kasan_slab_free (mm/kasan/common.c:287) [ 238.086439][ T318] kmem_cache_free (mm/slub.c:6168 (discriminator 3) mm/slub.c:6298 (discriminator 3)) [ 238.087007][ T318] skb_release_data (net/core/skbuff.c:1139) [ 238.087491][ T318] consume_skb (net/core/skbuff.c:1451) [ 238.087757][ T318] teql_master_xmit (net/sched/sch_teql.c:358) [ 238.088116][ T318] dev_hard_start_xmit (./include/linux/netdevice.h:5324 ./include/linux/netdevice.h:5333 net/core/dev.c:3871 net/core/dev.c:3887) [ 238.088468][ T318] sch_direct_xmit (net/sched/sch_generic.c:347) [ 238.088820][ T318] __qdisc_run (net/sched/sch_generic.c:420 (discriminator 1)) [ 238.089166][ T318] __dev_queue_xmit (./include/net/sch_generic.h:229 ./include/net/pkt_sched.h:121 ./include/net/pkt_sched.h:117 net/core/dev.c:4196 net/core/dev.c:4802)
Workflow to reproduce:
1. Initialize a TEQL topology (dummy0 and ifb0 as slaves, teql0 up).
2. Start multiple sender workers continuously transmitting packets through teql0 to drive teql_master_xmit().
3. In parallel, repeatedly delete and re-add the root qdisc on dummy0 and ifb0 via RTNETLINK, forcing frequent teardown and reset activity (teql_destroy() / qdisc_reset()).
4. After running both workloads concurrently for several iterations, KASAN reports slab-use-after-free or double-free in the skb free path.
Fix this by moving dev_reset_queue to sch_generic.h and calling it, instead of qdisc_reset, in teql_destroy since it handles both the lock and lockless cases correctly for root qdiscs.
--- include/net/sch_generic.h | 28 ++++++++++++++++++++++++++++ net/sched/sch_generic.c | 27 --------------------------- net/sched/sch_teql.c | 7 ++----- 3 files changed, 30 insertions(+), 32 deletions(-)
include/net/sch_generic.h +28 -0
@@ -716,6 +716,34 @@ void qdisc_destroy(struct Qdisc *qdisc);void qdisc_put (struct Qdisc *qdisc);void qdisc_put_unlocked (struct Qdisc *qdisc);void qdisc_tree_reduce_backlog (struct Qdisc *qdisc,int n,int len); + +static inline void dev_reset_queue (struct net_device *dev, +struct netdev_queue *dev_queue, +void *_unused) +{ +struct Qdisc *qdisc; +bool nolock; + + qdisc =rtnl_dereference (dev_queue->qdisc_sleeping); +if (!qdisc) +return ; + + nolock = qdisc->flags &TCQ_F_NOLOCK ; + +if (nolock) +spin_lock_bh (&qdisc->seqlock); +spin_lock_bh (qdisc_lock (qdisc)); + +qdisc_reset (qdisc); + +spin_unlock_bh (qdisc_lock (qdisc)); +if (nolock) { +clear_bit (__QDISC_STATE_MISSED, &qdisc->state); +clear_bit (__QDISC_STATE_DRAINING, &qdisc->state); +spin_unlock_bh (&qdisc->seqlock); + } +} +#ifdef CONFIG_NET_SCHED int qdisc_offload_dump_helper (struct Qdisc *q,enum tc_setup_type type,void *type_data);
net/sched/sch_generic.c +0 -27
@@ -1290,33 +1290,6 @@ static void dev_deactivate_queue(struct net_device *dev, } } -static void dev_reset_queue (struct net_device *dev, -struct netdev_queue *dev_queue, -void *_unused) -{ -struct Qdisc *qdisc; -bool nolock; - - qdisc =rtnl_dereference (dev_queue->qdisc_sleeping); -if (!qdisc) -return ; - - nolock = qdisc->flags &TCQ_F_NOLOCK ; - -if (nolock) -spin_lock_bh (&qdisc->seqlock); -spin_lock_bh (qdisc_lock (qdisc)); - -qdisc_reset (qdisc); - -spin_unlock_bh (qdisc_lock (qdisc)); -if (nolock) { -clear_bit (__QDISC_STATE_MISSED, &qdisc->state); -clear_bit (__QDISC_STATE_DRAINING, &qdisc->state); -spin_unlock_bh (&qdisc->seqlock); - } -} -static bool some_qdisc_is_busy (struct net_device *dev) {unsigned int i;
net/sched/sch_teql.c +2 -5
@@ -146,15 +146,12 @@ teql_destroy(struct Qdisc *sch) master->slaves =NEXT_SLAVE (q);if (q == master->slaves) {struct netdev_queue *txq; -spinlock_t *root_lock; txq =netdev_get_tx_queue (master->dev,0 ); master->slaves =NULL ; - root_lock =qdisc_root_sleeping_lock (rtnl_dereference (txq->qdisc)); -spin_lock_bh (root_lock); -qdisc_reset (rtnl_dereference (txq->qdisc)); -spin_unlock_bh (root_lock); +dev_reset_queue (master->dev, + txq,NULL ); } }skb_queue_purge (&dat->q);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 151/220 net: airoha: Remove airoha_dev_stop() in airoha_remove()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit d4a533ad249e9fbdc2d0633f2ddd60a5b3a9a4ca ]
Do not run airoha_dev_stop routine explicitly in airoha_remove() since ndo_stop() callback is already executed by unregister_netdev() in __dev_close_many routine if necessary and, doing so, we will end up causing an underflow in the qdma users atomic counters. Rely on networking subsystem to stop the device removing the airoha_eth module.
--- drivers/net/ethernet/airoha/airoha_eth.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/ethernet/airoha/airoha_eth.c +0 -1
@@ -3080,7 +3080,6 @@ static void airoha_remove(struct platform_device *pdev)if (!port)continue ; -airoha_dev_stop (port->dev);unregister_netdev (port->dev);airoha_metadata_dst_free (port); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 152/220 net: usb: cdc_ncm: add ndpoffset to NDP16 nframes bounds check
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tobi Gaertner <[email protected]>
[ Upstream commit 2aa8a4fa8d5b7d0e1ebcec100e1a4d80a1f4b21a ]
cdc_ncm_rx_verify_ndp16() validates that the NDP header and its DPE entries fit within the skb. The first check correctly accounts for ndpoffset:
if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp16)) > skb_in->len)
but the second check omits it:
if ((sizeof(struct usb_cdc_ncm_ndp16) +
ret * (sizeof(struct usb_cdc_ncm_dpe16))) > skb_in->len)
This validates the DPE array size against the total skb length as if the NDP were at offset 0, rather than at ndpoffset. When the NDP is placed near the end of the NTB (large wNdpIndex), the DPE entries can extend past the skb data buffer even though the check passes. cdc_ncm_rx_fixup() then reads out-of-bounds memory when iterating the DPE array.
Add ndpoffset to the nframes bounds check and use struct_size_t() to express the NDP-plus-DPE-array size more clearly.
--- drivers/net/usb/cdc_ncm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/usb/cdc_ncm.c +3 -2
@@ -1656,6 +1656,7 @@ int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset)struct usbnet *dev =netdev_priv (skb_in->dev);struct usb_cdc_ncm_ndp16 *ndp16;int ret = -EINVAL ; +size_t ndp_len;if ((ndpoffset +sizeof (struct usb_cdc_ncm_ndp16 )) > skb_in->len) { netif_dbg(dev, rx_err, dev->net, "invalid NDP offset <%u>\n",
@@ -1675,8 +1676,8 @@ int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset) sizeof(struct usb_cdc_ncm_dpe16)); ret--;/* we process NDP entries except for the last one */ -if ((sizeof (struct usb_cdc_ncm_ndp16 ) + - ret * (sizeof (struct usb_cdc_ncm_dpe16 ))) > skb_in->len) { + ndp_len = struct_size_t(struct usb_cdc_ncm_ndp16, dpe16, ret); +if (ndpoffset + ndp_len > skb_in->len) {netif_dbg (dev, rx_err, dev->net,"Invalid nframes = %d\n" , ret); ret = -EINVAL ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 153/220 net: usb: cdc_ncm: add ndpoffset to NDP32 nframes bounds check
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tobi Gaertner <[email protected]>
[ Upstream commit 77914255155e68a20aa41175edeecf8121dac391 ]
The same bounds-check bug fixed for NDP16 in the previous patch also exists in cdc_ncm_rx_verify_ndp32(). The DPE array size is validated against the total skb length without accounting for ndpoffset, allowing out-of-bounds reads when the NDP32 is placed near the end of the NTB.
Add ndpoffset to the nframes bounds check and use struct_size_t() to express the NDP-plus-DPE-array size more clearly.
Compile-tested only.
--- drivers/net/usb/cdc_ncm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/usb/cdc_ncm.c +3 -2
@@ -1693,6 +1693,7 @@ int cdc_ncm_rx_verify_ndp32(struct sk_buff *skb_in, int ndpoffset)struct usbnet *dev =netdev_priv (skb_in->dev);struct usb_cdc_ncm_ndp32 *ndp32;int ret = -EINVAL ; +size_t ndp_len;if ((ndpoffset +sizeof (struct usb_cdc_ncm_ndp32 )) > skb_in->len) { netif_dbg(dev, rx_err, dev->net, "invalid NDP offset <%u>\n",
@@ -1712,8 +1713,8 @@ int cdc_ncm_rx_verify_ndp32(struct sk_buff *skb_in, int ndpoffset) sizeof(struct usb_cdc_ncm_dpe32)); ret--;/* we process NDP entries except for the last one */ -if ((sizeof (struct usb_cdc_ncm_ndp32 ) + - ret * (sizeof (struct usb_cdc_ncm_dpe32 ))) > skb_in->len) { + ndp_len = struct_size_t(struct usb_cdc_ncm_ndp32, dpe32, ret); +if (ndpoffset + ndp_len > skb_in->len) {netif_dbg (dev, rx_err, dev->net,"Invalid nframes = %d\n" , ret); ret = -EINVAL ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 154/220 clsact: Fix use-after-free in init/destroy rollback asymmetry
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit a0671125d4f55e1e98d9bde8a0b671941987e208 ]
Fix a use-after-free in the clsact qdisc upon init/destroy rollback asymmetry. The latter is achieved by first fully initializing a clsact instance, and then in a second step having a replacement failure for the new clsact qdisc instance. clsact_init() initializes ingress first and then takes care of the egress part. This can fail midway, for example, via tcf_block_get_ext(). Upon failure, the kernel will trigger the clsact_destroy() callback.
Commit 1cb6f0bae504 ("bpf: Fix too early release of tcx_entry") details the way how the transition is happening. If tcf_block_get_ext on the q->ingress_block ends up failing, we took the tcx_miniq_inc reference count on the ingress side, but not yet on the egress side. clsact_destroy() tests whether the {ingress,egress}_entry was non-NULL. However, even in midway failure on the replacement, both are in fact non-NULL with a valid egress_entry from the previous clsact instance.
What we really need to test for is whether the qdisc instance-specific ingress or egress side previously got initialized. This adds a small helper for checking the miniq initialization called mini_qdisc_pair_inited, and utilizes that upon clsact_destroy() in order to fix the use-after-free scenario. Convert the ingress_destroy() side as well so both are consistent to each other.
--- include/net/sch_generic.h | 5 +++++ net/sched/sch_ingress.c | 14 ++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-)
include/net/sch_generic.h +5 -0
@@ -1457,6 +1457,11 @@ void mini_qdisc_pair_init(struct mini_Qdisc_pair *miniqp, struct Qdisc *qdisc,void mini_qdisc_pair_block_init (struct mini_Qdisc_pair *miniqp,struct tcf_block *block); +static inline bool mini_qdisc_pair_inited (struct mini_Qdisc_pair *miniqp) +{ +return !!miniqp->p_miniq; +} +void mq_change_real_num_tx (struct Qdisc *sch,unsigned int new_real_tx);int sch_frag_xmit_hook (struct sk_buff *skb,int (*xmit)(struct sk_buff *skb));
net/sched/sch_ingress.c +8 -6
@@ -113,14 +113,15 @@ static void ingress_destroy(struct Qdisc *sch) {struct ingress_sched_data *q =qdisc_priv (sch);struct net_device *dev =qdisc_dev (sch); -struct bpf_mprog_entry *entry =rtnl_dereference (dev->tcx_ingress); +struct bpf_mprog_entry *entry;if (sch->parent !=TC_H_INGRESS )return ;tcf_block_put_ext (q->block, sch, &q->block_info); -if (entry) { +if (mini_qdisc_pair_inited (&q->miniqp)) { + entry =rtnl_dereference (dev->tcx_ingress);tcx_miniq_dec (entry);if (!tcx_entry_is_active (entry)) {tcx_entry_update (dev,NULL , true);
@@ -290,10 +291,9 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt,static void clsact_destroy (struct Qdisc *sch) { +struct bpf_mprog_entry *ingress_entry, *egress_entry;struct clsact_sched_data *q =qdisc_priv (sch);struct net_device *dev =qdisc_dev (sch); -struct bpf_mprog_entry *ingress_entry =rtnl_dereference (dev->tcx_ingress); -struct bpf_mprog_entry *egress_entry =rtnl_dereference (dev->tcx_egress);if (sch->parent !=TC_H_CLSACT )return ;
@@ -301,7 +301,8 @@ static void clsact_destroy(struct Qdisc *sch)tcf_block_put_ext (q->ingress_block, sch, &q->ingress_block_info);tcf_block_put_ext (q->egress_block, sch, &q->egress_block_info); -if (ingress_entry) { +if (mini_qdisc_pair_inited (&q->miniqp_ingress)) { + ingress_entry =rtnl_dereference (dev->tcx_ingress);tcx_miniq_dec (ingress_entry);if (!tcx_entry_is_active (ingress_entry)) {tcx_entry_update (dev,NULL , true);
@@ -309,7 +310,8 @@ static void clsact_destroy(struct Qdisc *sch) } } -if (egress_entry) { +if (mini_qdisc_pair_inited (&q->miniqp_egress)) { + egress_entry =rtnl_dereference (dev->tcx_egress);tcx_miniq_dec (egress_entry);if (!tcx_entry_is_active (egress_entry)) {tcx_entry_update (dev,NULL , false);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 155/220 net: usb: aqc111: Do not perform PM inside suspend callback
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikola Z. Ivanov <[email protected]>
[ Upstream commit 069c8f5aebe4d5224cf62acc7d4b3486091c658a ]
syzbot reports "task hung in rpm_resume"
This is caused by aqc111_suspend calling
the PM variant of its write_cmd routine.
The simplified call trace looks like this:
rpm_suspend()
usb_suspend_both() - here udev->dev.power.runtime_status == RPM_SUSPENDING
aqc111_suspend() - called for the usb device interface
aqc111_write32_cmd()
usb_autopm_get_interface()
pm_runtime_resume_and_get()
rpm_resume() - here we call rpm_resume() on our parent
rpm_resume() - Here we wait for a status change that will never happen.
At this point we block another task which holds rtnl_lock and locks up the whole networking stack.
Fix this by replacing the write_cmd calls with their _nopm variants
--- drivers/net/usb/aqc111.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/usb/aqc111.c +6 -6
@@ -1400,14 +1400,14 @@ static int aqc111_suspend(struct usb_interface *intf, pm_message_t message)aqc111_write16_cmd_nopm (dev,AQ_ACCESS_MAC ,SFR_MEDIUM_STATUS_MODE ,2 , ®16); -aqc111_write_cmd (dev,AQ_WOL_CFG ,0 ,0 , -WOL_CFG_SIZE , &wol_cfg); -aqc111_write32_cmd (dev,AQ_PHY_OPS ,0 ,0 , - &aqc111_data->phy_cfg); +aqc111_write_cmd_nopm (dev,AQ_WOL_CFG ,0 ,0 , +WOL_CFG_SIZE , &wol_cfg); +aqc111_write32_cmd_nopm (dev,AQ_PHY_OPS ,0 ,0 , + &aqc111_data->phy_cfg); }else { aqc111_data->phy_cfg |=AQ_LOW_POWER ; -aqc111_write32_cmd (dev,AQ_PHY_OPS ,0 ,0 , - &aqc111_data->phy_cfg); +aqc111_write32_cmd_nopm (dev,AQ_PHY_OPS ,0 ,0 , + &aqc111_data->phy_cfg);/* Disable RX path */ aqc111_read16_cmd_nopm(dev, AQ_ACCESS_MAC,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 156/220 ACPICA: Update the format of Arg3 of _DSM
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Saket Dumbre <[email protected]>
[ Upstream commit ab93d7eee94205430fc3b0532557cb0494bf2faf ]
To get rid of type incompatibility warnings in Linux.
--- drivers/acpi/acpica/acpredef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/acpi/acpica/acpredef.h +1 -1
@@ -450,7 +450,7 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = { {{"_DSM" ,METHOD_4ARGS (ACPI_TYPE_BUFFER ,ACPI_TYPE_INTEGER ,ACPI_TYPE_INTEGER , -ACPI_TYPE_ANY |ACPI_TYPE_PACKAGE ) | +ACPI_TYPE_PACKAGE |ACPI_TYPE_ANY ) |ARG_COUNT_IS_MINIMUM , METHOD_RETURNS(ACPI_RTYPE_ALL)}}, /* Must return a value, but it can be of any type */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 157/220 igc: fix missing update of skb->tail in igc_xmit_frame()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kohei Enju <[email protected]>
[ Upstream commit 0ffba246652faf4a36aedc66059c2f94e4c83ea5 ]
igc_xmit_frame() misses updating skb->tail when the packet size is shorter than the minimum one.
Use skb_put_padto() in alignment with other Intel Ethernet drivers.
--- drivers/net/ethernet/intel/igc/igc_main.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/igc/igc_main.c +2 -5
@@ -1730,11 +1730,8 @@ static netdev_tx_t igc_xmit_frame(struct sk_buff *skb,/* The minimum packet size with TCTL.PSP set is 17 so pad the skb * in order to meet this minimum size requirement. */ -if (skb->len <17 ) { -if (skb_padto (skb,17 )) -return NETDEV_TX_OK ; - skb->len =17 ; - } +if (skb_put_padto (skb,17 )) +return NETDEV_TX_OK ;return igc_xmit_frame_ring (skb,igc_tx_queue_mapping (adapter, skb)); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 158/220 igc: fix page fault in XDP TX timestamps handling
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zdenek Bouska <[email protected]>
[ Upstream commit 45b33e805bd39f615d9353a7194b2da5281332df ]
If an XDP application that requested TX timestamping is shutting down while the link of the interface in use is still up the following kernel splat is reported:
[ 883.803618] [ T1554] BUG: unable to handle page fault for address: ffffcfb6200fd008 ... [ 883.803650] [ T1554] Call Trace: [ 883.803652] [ T1554] <TASK> [ 883.803654] [ T1554] igc_ptp_tx_tstamp_event+0xdf/0x160 [igc] [ 883.803660] [ T1554] igc_tsync_interrupt+0x2d5/0x300 [igc]
...
During shutdown of the TX ring the xsk_meta pointers are left behind, so that the IRQ handler is trying to touch them.
This issue is now being fixed by cleaning up the stale xsk meta data on TX shutdown. TX timestamps on other queues remain unaffected.
--- drivers/net/ethernet/intel/igc/igc.h | 2 ++ drivers/net/ethernet/intel/igc/igc_main.c | 7 +++++ drivers/net/ethernet/intel/igc/igc_ptp.c | 33 +++++++++++++++++++++++ 3 files changed, 42 insertions(+)
drivers/net/ethernet/intel/igc/igc.h +2 -0
@@ -781,6 +781,8 @@ int igc_ptp_hwtstamp_set(struct net_device *netdev,struct kernel_hwtstamp_config *config, struct netlink_ext_ack *extack);void igc_ptp_tx_hang (struct igc_adapter *adapter); +void igc_ptp_clear_xsk_tx_tstamp_queue (struct igc_adapter *adapter, +u16 queue_id);void igc_ptp_read (struct igc_adapter *adapter,struct timespec64 *ts);void igc_ptp_tx_tstamp_event (struct igc_adapter *adapter);
drivers/net/ethernet/intel/igc/igc_main.c +7 -0
@@ -264,6 +264,13 @@ static void igc_clean_tx_ring(struct igc_ring *tx_ring)/* reset next_to_use and next_to_clean */ tx_ring->next_to_use =0 ; tx_ring->next_to_clean =0 ; + +/* Clear any lingering XSK TX timestamp requests */ +if (test_bit (IGC_RING_FLAG_TX_HWTSTAMP , &tx_ring->flags)) { +struct igc_adapter *adapter =netdev_priv (tx_ring->netdev); + +igc_ptp_clear_xsk_tx_tstamp_queue (adapter, tx_ring->queue_index); + } }/**
drivers/net/ethernet/intel/igc/igc_ptp.c +33 -0
@@ -577,6 +577,39 @@ static void igc_ptp_clear_tx_tstamp(struct igc_adapter *adapter)spin_unlock_irqrestore (&adapter->ptp_tx_lock, flags); } +/** +* igc_ptp_clear_xsk_tx_tstamp_queue - Clear pending XSK TX timestamps for a queue +* @adapter: Board private structure +* @queue_id: TX queue index to clear timestamps for +* +* Iterates over all TX timestamp registers and releases any pending +* timestamp requests associated with the given TX queue. This is +* called when an XDP pool is being disabled to ensure no stale +* timestamp references remain. +*/ +void igc_ptp_clear_xsk_tx_tstamp_queue (struct igc_adapter *adapter,u16 queue_id) +{ +unsigned long flags; +int i; + +spin_lock_irqsave (&adapter->ptp_tx_lock, flags); + +for (i =0 ; i <IGC_MAX_TX_TSTAMP_REGS ; i++) { +struct igc_tx_timestamp_request *tstamp = &adapter->tx_tstamp[i]; + +if (tstamp->buffer_type !=IGC_TX_BUFFER_TYPE_XSK ) +continue ; +if (tstamp->xsk_queue_index != queue_id) +continue ; +if (!tstamp->xsk_tx_buffer) +continue ; + +igc_ptp_free_tx_buffer (adapter, tstamp); + } + +spin_unlock_irqrestore (&adapter->ptp_tx_lock, flags); +} +static void igc_ptp_disable_tx_timestamp (struct igc_adapter *adapter) {struct igc_hw *hw = &adapter->hw;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 159/220 iavf: fix VLAN filter lost on add/delete race
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Oros <[email protected]>
[ Upstream commit fc9c69be594756b81b54c6bc40803fa6052f35ae ]
When iavf_add_vlan() finds an existing filter in IAVF_VLAN_REMOVE state, it transitions the filter to IAVF_VLAN_ACTIVE assuming the pending delete can simply be cancelled. However, there is no guarantee that iavf_del_vlans() has not already processed the delete AQ request and removed the filter from the PF. In that case the filter remains in the driver's list as IAVF_VLAN_ACTIVE but is no longer programmed on the NIC. Since iavf_add_vlans() only picks up filters in IAVF_VLAN_ADD state, the filter is never re-added, and spoof checking drops all traffic for that VLAN.
CPU0 CPU1 Workqueue
---- ---- ---------
iavf_del_vlan(vlan 100)
f->state = REMOVE
schedule AQ_DEL_VLAN
iavf_add_vlan(vlan 100)
f->state = ACTIVE
iavf_del_vlans()
f is ACTIVE, skip
iavf_add_vlans()
f is ACTIVE, skipFilter is ACTIVE in driver but absent from NIC.
Transition to IAVF_VLAN_ADD instead and schedule IAVF_FLAG_AQ_ADD_VLAN_FILTER so iavf_add_vlans() re-programs the filter. A duplicate add is idempotent on the PF.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +6 -3
@@ -757,10 +757,13 @@ iavf_vlan_filter *iavf_add_vlan(struct iavf_adapter *adapter, adapter->num_vlan_filters++;iavf_schedule_aq_request (adapter,IAVF_FLAG_AQ_ADD_VLAN_FILTER ); }else if (f->state ==IAVF_VLAN_REMOVE ) { -/* IAVF_VLAN_REMOVE means that VLAN wasn't yet removed. -* We can safely only change the state here. +/* Re-add the filter since we cannot tell whether the +* pending delete has already been processed by the PF. +* A duplicate add is harmless. */ - f->state =IAVF_VLAN_ACTIVE ; + f->state =IAVF_VLAN_ADD ; +iavf_schedule_aq_request (adapter, +IAVF_FLAG_AQ_ADD_VLAN_FILTER ); } clearout:
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 160/220 libie: prevent memleak in fwlog code
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Swiatkowski <[email protected]>
[ Upstream commit 6850deb61118345996f03b87817b4ae0f2f25c38 ]
All cmd_buf buffers are allocated and need to be freed after usage. Add an error unwinding path that properly frees these buffers.
The memory leak happens whenever fwlog configuration is changed. For example:
$echo 256K > /sys/kernel/debug/ixgbe/0000\:32\:00.0/fwlog/log_size
--- drivers/net/ethernet/intel/libie/fwlog.c | 49 +++++++++++++++++------- 1 file changed, 36 insertions(+), 13 deletions(-)
drivers/net/ethernet/intel/libie/fwlog.c +36 -13
@@ -433,17 +433,21 @@ libie_debugfs_module_write(struct file *filp, const char __user *buf, module =libie_find_module_by_dentry (fwlog->debugfs_modules, dentry);if (module <0 ) {dev_info (dev,"unknown module\n" ); -return -EINVAL ; + count = -EINVAL ; + goto free_cmd_buf; } cnt =sscanf (cmd_buf,"%s" , user_val); -if (cnt !=1 ) -return -EINVAL ; +if (cnt !=1 ) { + count = -EINVAL ; + goto free_cmd_buf; + } log_level =sysfs_match_string (libie_fwlog_level_string, user_val);if (log_level <0 ) {dev_info (dev,"unknown log level '%s'\n" , user_val); -return -EINVAL ; + count = -EINVAL ; + goto free_cmd_buf; }if (module !=LIBIE_AQC_FW_LOG_ID_MAX ) {
@@ -458,6 +462,9 @@ libie_debugfs_module_write(struct file *filp, const char __user *buf, fwlog->cfg.module_entries[i].log_level = log_level; } +free_cmd_buf: +kfree (cmd_buf); +return count; }
@@ -515,23 +522,31 @@ libie_debugfs_nr_messages_write(struct file *filp, const char __user *buf,return PTR_ERR (cmd_buf); ret =sscanf (cmd_buf,"%s" , user_val); -if (ret !=1 ) -return -EINVAL ; +if (ret !=1 ) { + count = -EINVAL ; + goto free_cmd_buf; + } ret =kstrtos16 (user_val,0 , &nr_messages); -if (ret) -return ret; +if (ret) { + count = ret; + goto free_cmd_buf; + }if (nr_messages <LIBIE_AQC_FW_LOG_MIN_RESOLUTION || nr_messages >LIBIE_AQC_FW_LOG_MAX_RESOLUTION ) {dev_err (dev,"Invalid FW log number of messages %d, value must be between %d - %d\n" , nr_messages,LIBIE_AQC_FW_LOG_MIN_RESOLUTION ,LIBIE_AQC_FW_LOG_MAX_RESOLUTION ); -return -EINVAL ; + count = -EINVAL ; + goto free_cmd_buf; } fwlog->cfg.log_resolution = nr_messages; +free_cmd_buf: +kfree (cmd_buf); +return count; }
@@ -588,8 +603,10 @@ libie_debugfs_enable_write(struct file *filp, const char __user *buf,return PTR_ERR (cmd_buf); ret =sscanf (cmd_buf,"%s" , user_val); -if (ret !=1 ) -return -EINVAL ; +if (ret !=1 ) { + ret = -EINVAL ; + goto free_cmd_buf; + } ret =kstrtobool (user_val, &enable);if (ret)
@@ -624,6 +641,8 @@ libie_debugfs_enable_write(struct file *filp, const char __user *buf,*/ if (WARN_ON (ret != (ssize_t )count && ret >=0 )) ret = -EIO ; +free_cmd_buf: +kfree (cmd_buf);return ret; }
@@ -682,8 +701,10 @@ libie_debugfs_log_size_write(struct file *filp, const char __user *buf,return PTR_ERR (cmd_buf); ret =sscanf (cmd_buf,"%s" , user_val); -if (ret !=1 ) -return -EINVAL ; +if (ret !=1 ) { + ret = -EINVAL ; + goto free_cmd_buf; + } index =sysfs_match_string (libie_fwlog_log_size, user_val);if (index <0 ) {
@@ -712,6 +733,8 @@ libie_debugfs_log_size_write(struct file *filp, const char __user *buf,*/ if (WARN_ON (ret != (ssize_t )count && ret >=0 )) ret = -EIO ; +free_cmd_buf: +kfree (cmd_buf);return ret; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 161/220 wifi: mac80211: fix NULL deref in mesh_matches_local()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit c73bb9a2d33bf81f6eecaa0f474b6c6dbe9855bd ]
mesh_matches_local() unconditionally dereferences ie->mesh_config to compare mesh configuration parameters. When called from mesh_rx_csa_frame(), the parsed action-frame elements may not contain a Mesh Configuration IE, leaving ie->mesh_config NULL and triggering a kernel NULL pointer dereference.
The other two callers are already safe:
- ieee80211_mesh_rx_bcn_presp() checks !elems->mesh_config before calling mesh_matches_local()
- mesh_plink_get_event() is only reached through
mesh_process_plink_frame(), which checks !elems->mesh_config, too
mesh_rx_csa_frame() is the only caller that passes raw parsed elements to mesh_matches_local() without guarding mesh_config. An adjacent attacker can exploit this by sending a crafted CSA action frame that includes a valid Mesh ID IE but omits the Mesh Configuration IE, crashing the kernel.
The captured crash log:
Oops: general protection fault, probably for non-canonical address ... KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] Workqueue: events_unbound cfg80211_wiphy_work [...] Call Trace: <TASK> ? __pfx_mesh_matches_local (net/mac80211/mesh.c:65) ieee80211_mesh_rx_queued_mgmt (net/mac80211/mesh.c:1686) [...] ieee80211_iface_work (net/mac80211/iface.c:1754 net/mac80211/iface.c:1802) [...] cfg80211_wiphy_work (net/wireless/core.c:426) process_one_work (net/kernel/workqueue.c:3280) ? assign_work (net/kernel/workqueue.c:1219) worker_thread (net/kernel/workqueue.c:3352) ? __pfx_worker_thread (net/kernel/workqueue.c:3385) kthread (net/kernel/kthread.c:436) [...] ret_from_fork_asm (net/arch/x86/entry/entry_64.S:255) </TASK>
This patch adds a NULL check for ie->mesh_config at the top of mesh_matches_local() to return false early when the Mesh Configuration IE is absent.
--- net/mac80211/mesh.c | 3 +++ 1 file changed, 3 insertions(+)
net/mac80211/mesh.c +3 -0
@@ -79,6 +79,9 @@ bool mesh_matches_local(struct ieee80211_sub_if_data *sdata,* - MDA enabled * - Power management control on fc */ +if (!ie->mesh_config) +return false; + if (!(ifmsh->mesh_id_len == ie->mesh_id_len && memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 && (ifmsh->mesh_pp_id == ie->mesh_config->meshconf_psel) &&
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 162/220 wifi: wlcore: Return -ENOMEM instead of -EAGAIN if there is not enough headroom
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit deb353d9bb009638b7762cae2d0b6e8fdbb41a69 ]
Since upstream commit e75665dd0968 ("wifi: wlcore: ensure skb headroom before skb_push"), wl1271_tx_allocate() and with it wl1271_prepare_tx_frame() returns -EAGAIN if pskb_expand_head() fails. However, in wlcore_tx_work_locked(), a return value of -EAGAIN from wl1271_prepare_tx_frame() is interpreted as the aggregation buffer being full. This causes the code to flush the buffer, put the skb back at the head of the queue, and immediately retry the same skb in a tight while loop.
Because wlcore_tx_work_locked() holds wl->mutex, and the retry happens immediately with GFP_ATOMIC, this will result in an infinite loop and a CPU soft lockup. Return -ENOMEM instead so the packet is dropped and the loop terminates.
The problem was found by an experimental code review agent based on gemini-3.1-pro while reviewing backports into v6.18.y.
--- drivers/net/wireless/ti/wlcore/tx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ti/wlcore/tx.c +1 -1
@@ -210,7 +210,7 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif,if (skb_headroom (skb) < (total_len - skb->len) &&pskb_expand_head (skb, (total_len - skb->len),0 ,GFP_ATOMIC )) {wl1271_free_tx_id (wl, id); -return -EAGAIN ; +return -ENOMEM ; } desc =skb_push (skb, total_len - skb->len);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 163/220 wifi: mac80211: always free skb on ieee80211_tx_prepare_skb() failure
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit d5ad6ab61cbd89afdb60881f6274f74328af3ee9 ]
ieee80211_tx_prepare_skb() has three error paths, but only two of them free the skb. The first error path (ieee80211_tx_prepare() returning TX_DROP) does not free it, while invoke_tx_handlers() failure and the fragmentation check both do.
Add kfree_skb() to the first error path so all three are consistent, and remove the now-redundant frees in callers (ath9k, mt76, mac80211_hwsim) to avoid double-free.
Document the skb ownership guarantee in the function's kdoc.
--- drivers/net/wireless/ath/ath9k/channel.c | 6 ++---- drivers/net/wireless/mediatek/mt76/scan.c | 4 +--- drivers/net/wireless/virtual/mac80211_hwsim.c | 1 - include/net/mac80211.h | 4 +++- net/mac80211/tx.c | 4 +++- 5 files changed, 9 insertions(+), 10 deletions(-)
drivers/net/wireless/ath/ath9k/channel.c +2 -4
@@ -1006,7 +1006,7 @@ static void ath_scan_send_probe(struct ath_softc *sc,skb_set_queue_mapping (skb,IEEE80211_AC_VO );if (!ieee80211_tx_prepare_skb (sc->hw, vif, skb, band,NULL )) - goto error; +return ; txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO ];if (ath_tx_start (sc->hw, skb, &txctl))
@@ -1119,10 +1119,8 @@ ath_chanctx_send_vif_ps_frame(struct ath_softc *sc, struct ath_vif *avp, skb->priority =7 ;skb_set_queue_mapping (skb,IEEE80211_AC_VO ); -if (!ieee80211_tx_prepare_skb (sc->hw, vif, skb, band, &sta)) { -dev_kfree_skb_any (skb); +if (!ieee80211_tx_prepare_skb (sc->hw, vif, skb, band, &sta))return false; - }break ;default :return false;
drivers/net/wireless/mediatek/mt76/scan.c +1 -3
@@ -63,10 +63,8 @@ mt76_scan_send_probe(struct mt76_dev *dev, struct cfg80211_ssid *ssid)rcu_read_lock (); -if (!ieee80211_tx_prepare_skb (phy->hw, vif, skb, band,NULL )) { -ieee80211_free_txskb (phy->hw, skb); +if (!ieee80211_tx_prepare_skb (phy->hw, vif, skb, band,NULL )) goto out; - } info =IEEE80211_SKB_CB (skb);if (req->no_cck)
drivers/net/wireless/virtual/mac80211_hwsim.c +0 -1
@@ -3021,7 +3021,6 @@ static void hw_scan_work(struct work_struct *work) hwsim->tmp_chan->band, NULL)) {rcu_read_unlock (); -kfree_skb (probe);continue ; }
include/net/mac80211.h +3 -1
@@ -7291,7 +7291,9 @@ void ieee80211_report_wowlan_wakeup(struct ieee80211_vif *vif,* @band: the band to transmit on * @sta: optional pointer to get the station to send the frame to * -* Return: %true if the skb was prepared, %false otherwise +* Return: %true if the skb was prepared, %false otherwise. +* On failure, the skb is freed by this function; callers must not +* free it again. * * Note: must be called under RCU lock */
net/mac80211/tx.c +3 -1
@@ -1898,8 +1898,10 @@ bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw,struct ieee80211_tx_data tx;struct sk_buff *skb2; -if (ieee80211_tx_prepare (sdata, &tx,NULL , skb) ==TX_DROP ) +if (ieee80211_tx_prepare (sdata, &tx,NULL , skb) ==TX_DROP ) { +kfree_skb (skb);return false; + } info->band = band; info->control.vif = vif;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 164/220 ACPI: processor: Fix previous acpi_processor_errata_piix4() fix
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
[ Upstream commit bf504b229cb8d534eccbaeaa23eba34c05131e25 ]
After commi f132e089fe89 ("ACPI: processor: Fix NULL-pointer dereference in acpi_processor_errata_piix4()"), device pointers may be dereferenced after dropping references to the device objects pointed to by them, which may cause a use-after-free to occur.
Moreover, debug messages about enabling the errata may be printed if the errata flags corresponding to them are unset.
Address all of these issues by moving message printing to the points in the code where the errata flags are set.
--- drivers/acpi/acpi_processor.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/acpi/acpi_processor.c +8 -7
@@ -113,6 +113,10 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev) PCI_ANY_ID, PCI_ANY_ID, NULL);if (ide_dev) { errata.piix4.bmisx =pci_resource_start (ide_dev,4 ); +if (errata.piix4.bmisx) +dev_dbg (&ide_dev->dev, +"Bus master activity detection (BM-IDE) erratum enabled\n" ); +pci_dev_put (ide_dev); }
@@ -131,20 +135,17 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev)if (isa_dev) {pci_read_config_byte (isa_dev,0x76 , &value1);pci_read_config_byte (isa_dev,0x77 , &value2); -if ((value1 &0x80 ) || (value2 &0x80 )) +if ((value1 &0x80 ) || (value2 &0x80 )) { errata.piix4.fdma =1 ; +dev_dbg (&isa_dev->dev, +"Type-F DMA livelock erratum (C3 disabled)\n" ); + }pci_dev_put (isa_dev); }break ; } -if (ide_dev) -dev_dbg (&ide_dev->dev,"Bus master activity detection (BM-IDE) erratum enabled\n" ); - -if (isa_dev) -dev_dbg (&isa_dev->dev,"Type-F DMA livelock erratum (C3 disabled)\n" ); -return 0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 165/220 netdevsim: drop PSP ext ref on forward failure
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wesley Atwell <[email protected]>
[ Upstream commit 7d9351435ebba08bbb60f42793175c9dc714d2fb ]
nsim_do_psp() takes an extra reference to the PSP skb extension so the extension survives __dev_forward_skb(). That forward path scrubs the skb and drops attached skb extensions before nsim_psp_handle_ext() can reattach the PSP metadata.
If __dev_forward_skb() fails in nsim_forward_skb(), the function returns before nsim_psp_handle_ext() can attach that extension to the skb, leaving the extra reference leaked.
Drop the saved PSP extension reference before returning from the forward-failure path. Guard the put because plain or non-decapsulated traffic can also fail forwarding without ever taking the extra PSP reference.
--- drivers/net/netdevsim/netdev.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/netdevsim/netdev.c +4 -1
@@ -109,8 +109,11 @@ static int nsim_forward_skb(struct net_device *tx_dev,int ret; ret =__dev_forward_skb (rx_dev, skb); -if (ret) +if (ret) { +if (psp_ext) +__skb_ext_put (psp_ext);return ret; + }nsim_psp_handle_ext (skb, psp_ext);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 166/220 net: macb: fix uninitialized rx_fs_lock
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit 34b11cc56e4369bc08b1f4c4a04222d75ed596ce ]
If hardware doesn't support RX Flow Filters, rx_fs_lock spinlock is not initialized leading to the following assertion splat triggerable via set_rxnfc callback.
INFO: trying to register non-static key.
The code is fine but needs lockdep annotation, or maybe you didn't initialize this object before use? turning off the locking correctness validator.
CPU: 1 PID: 949 Comm: syz.0.6 Not tainted 6.1.164+ #113 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.1-0-g3208b098f51a-prebuilt.qemu.org 04/01/2014 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x8d/0xba lib/dump_stack.c:106 assign_lock_key kernel/locking/lockdep.c:974 [inline] register_lock_class+0x141b/0x17f0 kernel/locking/lockdep.c:1287 __lock_acquire+0x74f/0x6c40 kernel/locking/lockdep.c:4928 lock_acquire kernel/locking/lockdep.c:5662 [inline] lock_acquire+0x190/0x4b0 kernel/locking/lockdep.c:5627 __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline] _raw_spin_lock_irqsave+0x33/0x50 kernel/locking/spinlock.c:162 gem_del_flow_filter drivers/net/ethernet/cadence/macb_main.c:3562 [inline] gem_set_rxnfc+0x533/0xac0 drivers/net/ethernet/cadence/macb_main.c:3667 ethtool_set_rxnfc+0x18c/0x280 net/ethtool/ioctl.c:961 __dev_ethtool net/ethtool/ioctl.c:2956 [inline] dev_ethtool+0x229c/0x6290 net/ethtool/ioctl.c:3095 dev_ioctl+0x637/0x1070 net/core/dev_ioctl.c:510 sock_do_ioctl+0x20d/0x2c0 net/socket.c:1215 sock_ioctl+0x577/0x6d0 net/socket.c:1320 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:870 [inline] __se_sys_ioctl fs/ioctl.c:856 [inline] __x64_sys_ioctl+0x18c/0x210 fs/ioctl.c:856 do_syscall_x64 arch/x86/entry/common.c:46 [inline] do_syscall_64+0x35/0x80 arch/x86/entry/common.c:76 entry_SYSCALL_64_after_hwframe+0x6e/0xd8
A more straightforward solution would be to always initialize rx_fs_lock, just like rx_fs_list. However, in this case the driver set_rxnfc callback would return with a rather confusing error code, e.g. -EINVAL. So deny set_rxnfc attempts directly if the RX filtering feature is not supported by hardware.
--- drivers/net/ethernet/cadence/macb_main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/cadence/macb_main.c +3 -0
@@ -3979,6 +3979,9 @@ static int gem_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd)struct macb *bp =netdev_priv (netdev);int ret; +if (!(netdev->hw_features &NETIF_F_NTUPLE )) +return -EOPNOTSUPP ; +switch (cmd->cmd) {case ETHTOOL_SRXCLSRLINS : if ((cmd->fs.location >= bp->max_tuples)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 167/220 ipv6: add NULL checks for idev in SRv6 paths
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Minhong He <[email protected]>
[ Upstream commit 06413793526251870e20402c39930804f14d59c0 ]
__in6_dev_get() can return NULL when the device has no IPv6 configuration (e.g. MTU < IPV6_MIN_MTU or after NETDEV_UNREGISTER).
Add NULL checks for idev returned by __in6_dev_get() in both seg6_hmac_validate_skb() and ipv6_srh_rcv() to prevent potential NULL pointer dereferences.
--- net/ipv6/exthdrs.c | 4 ++++ net/ipv6/seg6_hmac.c | 2 ++ 2 files changed, 6 insertions(+)
net/ipv6/exthdrs.c +4 -0
@@ -379,6 +379,10 @@ static int ipv6_srh_rcv(struct sk_buff *skb) hdr = (struct ipv6_sr_hdr *)skb_transport_header (skb); idev =__in6_dev_get (skb->dev); +if (!idev) { +kfree_skb (skb); +return -1 ; + } accept_seg6 =min (READ_ONCE (net->ipv6.devconf_all->seg6_enabled),READ_ONCE (idev->cnf.seg6_enabled));
net/ipv6/seg6_hmac.c +2 -0
@@ -184,6 +184,8 @@ bool seg6_hmac_validate_skb(struct sk_buff *skb)int require_hmac; idev =__in6_dev_get (skb->dev); +if (!idev) +return false; srh = (struct ipv6_sr_hdr *)skb_transport_header (skb);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 168/220 net/mlx5: qos: Restrict RTNL area to avoid a lock cycle
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cosmin Ratiu <[email protected]>
[ Upstream commit b7e3a5d9c0d66b7fb44f63aef3bd734821afa0c8 ]
A lock dependency cycle exists where:
1. mlx5_ib_roce_init -> mlx5_core_uplink_netdev_event_replay -> mlx5_blocking_notifier_call_chain (takes notifier_rwsem) -> mlx5e_mdev_notifier_event -> mlx5_netdev_notifier_register -> register_netdevice_notifier_dev_net (takes rtnl)
=> notifier_rwsem -> rtnl
2. mlx5e_probe -> _mlx5e_probe -> mlx5_core_uplink_netdev_set (takes uplink_netdev_lock) -> mlx5_blocking_notifier_call_chain (takes notifier_rwsem) => uplink_netdev_lock -> notifier_rwsem
3: devlink_nl_rate_set_doit -> devlink_nl_rate_set -> mlx5_esw_devlink_rate_leaf_tx_max_set -> esw_qos_devlink_rate_to_mbps -> mlx5_esw_qos_max_link_speed_get (takes rtnl) -> mlx5_esw_qos_lag_link_speed_get_locked -> mlx5_uplink_netdev_get (takes uplink_netdev_lock)
=> rtnl -> uplink_netdev_lock
=> BOOM! (lock cycle)
Fix that by restricting the rtnl-protected section to just the necessary part, the call to netdev_master_upper_dev_get and speed querying, so that the last lock dependency is avoided and the cycle doesn't close. This is safe because mlx5_uplink_netdev_get uses netdev_hold to keep the uplink netdev alive while its master device is queried.
Use this opportunity to rename the ambiguously-named "hold_rtnl_lock" argument to "take_rtnl" and remove the "_locked" suffix from mlx5_esw_qos_lag_link_speed_get_locked.
--- .../net/ethernet/mellanox/mlx5/core/esw/qos.c | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +9 -14
@@ -1490,24 +1490,24 @@ static int esw_qos_node_enable_tc_arbitration(struct mlx5_esw_sched_node *node,return err; } -static u32 mlx5_esw_qos_lag_link_speed_get_locked (struct mlx5_core_dev *mdev) +static u32 mlx5_esw_qos_lag_link_speed_get (struct mlx5_core_dev *mdev, +bool take_rtnl) {struct ethtool_link_ksettings lksettings;struct net_device *slave, *master;u32 speed =SPEED_UNKNOWN ; -/* Lock ensures a stable reference to master and slave netdevice -* while port speed of master is queried. -*/ -ASSERT_RTNL (); - slave =mlx5_uplink_netdev_get (mdev);if (!slave) goto out; +if (take_rtnl) +rtnl_lock (); master =netdev_master_upper_dev_get (slave);if (master && !__ethtool_get_link_ksettings (master, &lksettings)) speed = lksettings.base.speed; +if (take_rtnl) +rtnl_unlock (); out:mlx5_uplink_netdev_put (mdev, slave);
@@ -1515,20 +1515,15 @@ static u32 mlx5_esw_qos_lag_link_speed_get_locked(struct mlx5_core_dev *mdev) }static int mlx5_esw_qos_max_link_speed_get (struct mlx5_core_dev *mdev,u32 *link_speed_max, -bool hold_rtnl_lock,struct netlink_ext_ack *extack) +bool take_rtnl, +struct netlink_ext_ack *extack) {int err;if (!mlx5_lag_is_active (mdev)) goto skip_lag; -if (hold_rtnl_lock) -rtnl_lock (); - - *link_speed_max =mlx5_esw_qos_lag_link_speed_get_locked (mdev); - -if (hold_rtnl_lock) -rtnl_unlock (); + *link_speed_max =mlx5_esw_qos_lag_link_speed_get (mdev, take_rtnl);if (*link_speed_max != (u32 )SPEED_UNKNOWN )return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 169/220 net/mlx5e: Prevent concurrent access to IPSec ASO context
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jianbo Liu <[email protected]>
[ Upstream commit 99b36850d881e2d65912b2520a1c80d0fcc9429a ]
The query or updating IPSec offload object is through Access ASO WQE. The driver uses a single mlx5e_ipsec_aso struct for each PF, which contains a shared DMA-mapped context for all ASO operations.
A race condition exists because the ASO spinlock is released before the hardware has finished processing WQE. If a second operation is initiated immediately after, it overwrites the shared context in the DMA area.
When the first operation's completion is processed later, it reads this corrupted context, leading to unexpected behavior and incorrect results.
This commit fixes the race by introducing a private context within each IPSec offload object. The shared ASO context is now copied to this private context while the ASO spinlock is held. Subsequent processing uses this saved, per-object context, ensuring its integrity is maintained.
--- .../mellanox/mlx5/core/en_accel/ipsec.h | 1 + .../mellanox/mlx5/core/en_accel/ipsec_offload.c | 17 ++++++++--------- 2 files changed, 9 insertions(+), 9 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h +1 -0
@@ -287,6 +287,7 @@ struct mlx5e_ipsec_sa_entry {struct mlx5e_ipsec_dwork *dwork;struct mlx5e_ipsec_limits limits;u32 rx_mapped_id; +u8 ctx[MLX5_ST_SZ_BYTES (ipsec_aso)]; };struct mlx5_accel_pol_xfrm_attrs {
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c +8 -9
@@ -370,20 +370,18 @@ static void mlx5e_ipsec_aso_update_soft(struct mlx5e_ipsec_sa_entry *sa_entry,static void mlx5e_ipsec_handle_limits (struct mlx5e_ipsec_sa_entry *sa_entry) {struct mlx5_accel_esp_xfrm_attrs *attrs = &sa_entry->attrs; -struct mlx5e_ipsec *ipsec = sa_entry->ipsec; -struct mlx5e_ipsec_aso *aso = ipsec->aso;bool soft_arm, hard_arm;u64 hard_cnt;lockdep_assert_held (&sa_entry->x->lock); - soft_arm = !MLX5_GET (ipsec_aso, aso->ctx, soft_lft_arm); - hard_arm = !MLX5_GET (ipsec_aso, aso->ctx, hard_lft_arm); + soft_arm = !MLX5_GET (ipsec_aso, sa_entry->ctx, soft_lft_arm); + hard_arm = !MLX5_GET (ipsec_aso, sa_entry->ctx, hard_lft_arm);if (!soft_arm && !hard_arm)/* It is not lifetime event */ return ; - hard_cnt =MLX5_GET (ipsec_aso, aso->ctx, remove_flow_pkt_cnt); + hard_cnt =MLX5_GET (ipsec_aso, sa_entry->ctx, remove_flow_pkt_cnt);if (!hard_cnt || hard_arm) {/* It is possible to see packet counter equal to zero without * hard limit event armed. Such situation can be if packet
@@ -454,10 +452,8 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work) container_of(_work, struct mlx5e_ipsec_work, work);struct mlx5e_ipsec_sa_entry *sa_entry = work->data;struct mlx5_accel_esp_xfrm_attrs *attrs; -struct mlx5e_ipsec_aso *aso;int ret; - aso = sa_entry->ipsec->aso; attrs = &sa_entry->attrs;spin_lock_bh (&sa_entry->x->lock);
@@ -466,8 +462,9 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work) goto unlock;if (attrs->replay_esn.trigger && - !MLX5_GET (ipsec_aso, aso->ctx, esn_event_arm)) { -u32 mode_param =MLX5_GET (ipsec_aso, aso->ctx, mode_parameter); + !MLX5_GET (ipsec_aso, sa_entry->ctx, esn_event_arm)) { +u32 mode_param =MLX5_GET (ipsec_aso, sa_entry->ctx, + mode_parameter);mlx5e_ipsec_update_esn_state (sa_entry, mode_param); }
@@ -629,6 +626,8 @@ int mlx5e_ipsec_aso_query(struct mlx5e_ipsec_sa_entry *sa_entry,/* We are in atomic context */ udelay (10 ); }while (ret &&time_is_after_jiffies (expires)); +if (!ret) +memcpy (sa_entry->ctx, aso->ctx,MLX5_ST_SZ_BYTES (ipsec_aso));spin_unlock_bh (&aso->lock);return ret; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 170/220 net/mlx5e: Fix race condition during IPSec ESN update
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jianbo Liu <[email protected]>
[ Upstream commit beb6e2e5976a128b0cccf10d158124422210c5ef ]
In IPSec full offload mode, the device reports an ESN (Extended Sequence Number) wrap event to the driver. The driver validates this event by querying the IPSec ASO and checking that the esn_event_arm field is 0x0, which indicates an event has occurred. After handling the event, the driver must re-arm the context by setting esn_event_arm back to 0x1.
A race condition exists in this handling path. After validating the event, the driver calls mlx5_accel_esp_modify_xfrm() to update the kernel's xfrm state. This function temporarily releases and re-acquires the xfrm state lock.
So, need to acknowledge the event first by setting esn_event_arm to 0x1. This prevents the driver from reprocessing the same ESN update if the hardware sends events for other reason. Since the next ESN update only occurs after nearly 2^31 packets are received, there's no risk of missing an update, as it will happen long after this handling has finished.
Processing the event twice causes the ESN high-order bits (esn_msb) to be incremented incorrectly. The driver then programs the hardware with this invalid ESN state, which leads to anti-replay failures and a complete halt of IPSec traffic.
Fix this by re-arming the ESN event immediately after it is validated, before calling mlx5_accel_esp_modify_xfrm(). This ensures that any spurious, duplicate events are correctly ignored, closing the race window.
--- .../mlx5/core/en_accel/ipsec_offload.c | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c +14 -19
@@ -310,10 +310,11 @@ static void mlx5e_ipsec_aso_update(struct mlx5e_ipsec_sa_entry *sa_entry,mlx5e_ipsec_aso_query (sa_entry, data); } -static void mlx5e_ipsec_update_esn_state (struct mlx5e_ipsec_sa_entry *sa_entry, -u32 mode_param) +static void +mlx5e_ipsec_update_esn_state (struct mlx5e_ipsec_sa_entry *sa_entry, +u32 mode_param, +struct mlx5_accel_esp_xfrm_attrs *attrs) { -struct mlx5_accel_esp_xfrm_attrs attrs = {};struct mlx5_wqe_aso_ctrl_seg data = {};if (mode_param <MLX5E_IPSEC_ESN_SCOPE_MID ) {
@@ -323,18 +324,7 @@ static void mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry, sa_entry->esn_state.overlap =1 ; } -mlx5e_ipsec_build_accel_xfrm_attrs (sa_entry, &attrs); - -/* It is safe to execute the modify below unlocked since the only flows -* that could affect this HW object, are create, destroy and this work. -* -* Creation flow can't co-exist with this modify work, the destruction -* flow would cancel this work, and this work is a single entity that -* can't conflict with it self. -*/ -spin_unlock_bh (&sa_entry->x->lock); -mlx5_accel_esp_modify_xfrm (sa_entry, &attrs); -spin_lock_bh (&sa_entry->x->lock); +mlx5e_ipsec_build_accel_xfrm_attrs (sa_entry, attrs); data.data_offset_condition_operand =MLX5_IPSEC_ASO_REMOVE_FLOW_PKT_CNT_OFFSET ;
@@ -451,7 +441,9 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work)struct mlx5e_ipsec_work *work = container_of(_work, struct mlx5e_ipsec_work, work);struct mlx5e_ipsec_sa_entry *sa_entry = work->data; +struct mlx5_accel_esp_xfrm_attrs tmp = {};struct mlx5_accel_esp_xfrm_attrs *attrs; +bool need_modify = false;int ret; attrs = &sa_entry->attrs;
@@ -461,19 +453,22 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work)if (ret) goto unlock; +if (attrs->lft.soft_packet_limit !=XFRM_INF ) +mlx5e_ipsec_handle_limits (sa_entry); +if (attrs->replay_esn.trigger && !MLX5_GET (ipsec_aso, sa_entry->ctx, esn_event_arm)) {u32 mode_param =MLX5_GET (ipsec_aso, sa_entry->ctx, mode_parameter); -mlx5e_ipsec_update_esn_state (sa_entry, mode_param); +mlx5e_ipsec_update_esn_state (sa_entry, mode_param, &tmp); + need_modify = true; } -if (attrs->lft.soft_packet_limit !=XFRM_INF ) -mlx5e_ipsec_handle_limits (sa_entry); - unlock:spin_unlock_bh (&sa_entry->x->lock); +if (need_modify) +mlx5_accel_esp_modify_xfrm (sa_entry, &tmp);kfree (work); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 171/220 udp_tunnel: fix NULL deref caused by udp_sock_create6 when CONFIG_IPV6=n
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit b3a6df291fecf5f8a308953b65ca72b7fc9e015d ]
When CONFIG_IPV6 is disabled, the udp_sock_create6() function returns 0 (success) without actually creating a socket. Callers such as fou_create() then proceed to dereference the uninitialized socket pointer, resulting in a NULL pointer dereference.
The captured NULL deref crash:
BUG: kernel NULL pointer dereference, address: 0000000000000018
RIP: 0010:fou_nl_add_doit (net/ipv4/fou_core.c:590 net/ipv4/fou_core.c:764)
[...]
Call Trace:
<TASK>
genl_family_rcv_msg_doit.constprop.0 (net/netlink/genetlink.c:1114)
genl_rcv_msg (net/netlink/genetlink.c:1194 net/netlink/genetlink.c:1209)
[...]
netlink_rcv_skb (net/netlink/af_netlink.c:2550)
genl_rcv (net/netlink/genetlink.c:1219)
netlink_unicast (net/netlink/af_netlink.c:1319 net/netlink/af_netlink.c:1344)
netlink_sendmsg (net/netlink/af_netlink.c:1894)
__sock_sendmsg (net/socket.c:727 (discriminator 1) net/socket.c:742 (discriminator 1))
__sys_sendto (./include/linux/file.h:62 (discriminator 1) ./include/linux/file.h:83 (discriminator 1) net/socket.c:2183 (discriminator 1))
__x64_sys_sendto (net/socket.c:2213 (discriminator 1) net/socket.c:2209 (discriminator 1) net/socket.c:2209 (discriminator 1))
do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1))
entry_SYSCALL_64_after_hwframe (net/arch/x86/entry/entry_64.S:130)This patch makes udp_sock_create6 return -EPFNOSUPPORT instead, so callers correctly take their error paths. There is only one caller of the vulnerable function and only privileged users can trigger it.
--- include/net/udp_tunnel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/udp_tunnel.h +1 -1
@@ -47,7 +47,7 @@ int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,static inline int udp_sock_create6 (struct net *net,struct udp_port_cfg *cfg,struct socket **sockp) { -return 0 ; +return -EPFNOSUPPORT ; }#endif
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 172/220 net: bonding: fix NULL deref in bond_debug_rlb_hash_show
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit 605b52497bf89b3b154674deb135da98f916e390 ]
rlb_clear_slave intentionally keeps RLB hash-table entries on the rx_hashtbl_used_head list with slave set to NULL when no replacement slave is available. However, bond_debug_rlb_hash_show visites client_info->slave without checking if it's NULL.
Other used-list iterators in bond_alb.c already handle this NULL-slave state safely:
- rlb_update_client returns early on !client_info->slave
- rlb_req_update_slave_clients, rlb_clear_slave, and rlb_rebalance compare slave values before visiting
- lb_req_update_subnet_clients continues if slave is NULL
The following NULL deref crash can be trigger inbond_debug_rlb_hash_show:
[ 1.289791] BUG: kernel NULL pointer dereference, address: 0000000000000000 [ 1.292058] RIP: 0010:bond_debug_rlb_hash_show (drivers/net/bonding/bond_debugfs.c:41) [ 1.293101] RSP: 0018:ffffc900004a7d00 EFLAGS: 00010286 [ 1.293333] RAX: 0000000000000000 RBX: ffff888102b48200 RCX: ffff888102b48204 [ 1.293631] RDX: ffff888102b48200 RSI: ffffffff839daad5 RDI: ffff888102815078 [ 1.293924] RBP: ffff888102815078 R08: ffff888102b4820e R09: 0000000000000000 [ 1.294267] R10: 0000000000000000 R11: 0000000000000000 R12: ffff888100f929c0 [ 1.294564] R13: ffff888100f92a00 R14: 0000000000000001 R15: ffffc900004a7ed8 [ 1.294864] FS: 0000000001395380(0000) GS:ffff888196e75000(0000) knlGS:0000000000000000 [ 1.295239] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1.295480] CR2: 0000000000000000 CR3: 0000000102adc004 CR4: 0000000000772ef0 [ 1.295897] Call Trace: [ 1.296134] seq_read_iter (fs/seq_file.c:231) [ 1.296341] seq_read (fs/seq_file.c:164) [ 1.296493] full_proxy_read (fs/debugfs/file.c:378 (discriminator 1)) [ 1.296658] vfs_read (fs/read_write.c:572) [ 1.296981] ksys_read (fs/read_write.c:717) [ 1.297132] do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1)) [ 1.297325] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
Add a NULL check and print "(none)" for entries with no assigned slave.
--- drivers/net/bonding/bond_debugfs.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
drivers/net/bonding/bond_debugfs.c +11 -5
@@ -34,11 +34,17 @@ static int bond_debug_rlb_hash_show(struct seq_file *m, void *v)for (; hash_index !=RLB_NULL_INDEX ; hash_index = client_info->used_next) { client_info = &(bond_info->rx_hashtbl[hash_index]); -seq_printf (m,"%-15pI4 %-15pI4 %-17pM %s\n" , - &client_info->ip_src, - &client_info->ip_dst, - &client_info->mac_dst, - client_info->slave->dev->name); +if (client_info->slave) +seq_printf (m,"%-15pI4 %-15pI4 %-17pM %s\n" , + &client_info->ip_src, + &client_info->ip_dst, + &client_info->mac_dst, + client_info->slave->dev->name); +else +seq_printf (m,"%-15pI4 %-15pI4 %-17pM (none)\n" , + &client_info->ip_src, + &client_info->ip_dst, + &client_info->mac_dst); }spin_unlock_bh (&bond->mode_lock);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 173/220 netfilter: bpf: defer hook memory release until rcu readers are done
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 24f90fa3994b992d1a09003a3db2599330a5232a ]
Yiming Qian reports UaF when concurrent process is dumping hooks via nfnetlink_hooks:
BUG: KASAN: slab-use-after-free in nfnl_hook_dump_one.isra.0+0xe71/0x10f0 Read of size 8 at addr ffff888003edbf88 by task poc/79 Call Trace: <TASK> nfnl_hook_dump_one.isra.0+0xe71/0x10f0 netlink_dump+0x554/0x12b0 nfnl_hook_get+0x176/0x230 [..]
Defer release until after concurrent readers have completed.
--- net/netfilter/nf_bpf_link.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nf_bpf_link.c +1 -1
@@ -170,7 +170,7 @@ static int bpf_nf_link_update(struct bpf_link *link, struct bpf_prog *new_prog,static const struct bpf_link_ops bpf_nf_link_lops = { .release = bpf_nf_link_release, - .dealloc = bpf_nf_link_dealloc, + .dealloc_deferred = bpf_nf_link_dealloc, .detach = bpf_nf_link_detach, .show_fdinfo = bpf_nf_link_show_info, .fill_link_info = bpf_nf_link_fill_link_info,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 174/220 netfilter: nf_tables: release flowtable after rcu grace period on error
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit d73f4b53aaaea4c95f245e491aa5eeb8a21874ce ]
Call synchronize_rcu() after unregistering the hooks from error path, since a hook that already refers to this flowtable can be already registered, exposing this flowtable to packet path and nfnetlink_hook control plane.
This error path is rare, it should only happen by reaching the maximum number hooks or by failing to set up to hardware offload, just call synchronize_rcu().
There is a check for already used device hooks by different flowtable that could result in EEXIST at this late stage. The hook parser can be updated to perform this check earlier to this error path really becomes rarely exercised.
Uncovered by KASAN reported as use-after-free from nfnetlink_hook path when dumping hooks.
--- net/netfilter/nf_tables_api.c | 1 + 1 file changed, 1 insertion(+)
net/netfilter/nf_tables_api.c +1 -0
@@ -9203,6 +9203,7 @@ static int nf_tables_newflowtable(struct sk_buff *skb,return 0 ; err_flowtable_hooks: +synchronize_rcu ();nft_trans_destroy (trans); err_flowtable_trans:nft_hooks_destroy (&flowtable->hook_list);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 175/220 nfnetlink_osf: validate individual option lengths in fingerprints
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weiming Shi <[email protected]>
[ Upstream commit dbdfaae9609629a9569362e3b8f33d0a20fd783c ]
nfnl_osf_add_callback() validates opt_num bounds and string NUL-termination but does not check individual option length fields. A zero-length option causes nf_osf_match_one() to enter the option matching loop even when foptsize sums to zero, which matches packets with no TCP options where ctx->optp is NULL:
Oops: general protection fault KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] RIP: 0010:nf_osf_match_one (net/netfilter/nfnetlink_osf.c:98) Call Trace: nf_osf_match (net/netfilter/nfnetlink_osf.c:227) xt_osf_match_packet (net/netfilter/xt_osf.c:32) ipt_do_table (net/ipv4/netfilter/ip_tables.c:293) nf_hook_slow (net/netfilter/core.c:623) ip_local_deliver (net/ipv4/ip_input.c:262) ip_rcv (net/ipv4/ip_input.c:573)
Additionally, an MSS option (kind=2) with length < 4 causes out-of-bounds reads when nf_osf_match_one() unconditionally accesses optp[2] and optp[3] for MSS value extraction. While RFC 9293 section 3.2 specifies that the MSS option is always exactly 4 bytes (Kind=2, Length=4), the check uses "< 4" rather than "!= 4" because lengths greater than 4 do not cause memory safety issues -- the buffer is guaranteed to be at least foptsize bytes by the ctx->optsize == foptsize check.
Reject fingerprints where any option has zero length, or where an MSS option has length less than 4, at add time rather than trusting these values in the packet matching hot path.
--- net/netfilter/nfnetlink_osf.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
net/netfilter/nfnetlink_osf.c +13 -0
@@ -302,7 +302,9 @@ static int nfnl_osf_add_callback(struct sk_buff *skb, {struct nf_osf_user_finger *f;struct nf_osf_finger *kf =NULL , *sf; +unsigned int tot_opt_len =0 ;int err =0 ; +int i;if (!capable (CAP_NET_ADMIN ))return -EPERM ;
@@ -318,6 +320,17 @@ static int nfnl_osf_add_callback(struct sk_buff *skb,if (f->opt_num >ARRAY_SIZE (f->opt))return -EINVAL ; +for (i =0 ; i < f->opt_num; i++) { +if (!f->opt[i].length || f->opt[i].length >MAX_IPOPTLEN ) +return -EINVAL ; +if (f->opt[i].kind ==OSFOPT_MSS && f->opt[i].length <4 ) +return -EINVAL ; + + tot_opt_len += f->opt[i].length; +if (tot_opt_len >MAX_IPOPTLEN ) +return -EINVAL ; + } +if (!memchr (f->genre,0 ,MAXGENRELEN ) || !memchr (f->subtype,0 ,MAXGENRELEN ) || !memchr (f->version,0 ,MAXGENRELEN ))
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 176/220 net: mvpp2: guard flow control update with global_tx_fc in buffer switching
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Muhammad Hammad Ijaz <[email protected]>
[ Upstream commit 8a63baadf08453f66eb582fdb6dd234f72024723 ]
mvpp2_bm_switch_buffers() unconditionally calls mvpp2_bm_pool_update_priv_fc() when switching between per-cpu and shared buffer pool modes. This function programs CM3 flow control registers via mvpp2_cm3_read()/mvpp2_cm3_write(), which dereference priv->cm3_base without any NULL check.
When the CM3 SRAM resource is not present in the device tree (the third reg entry added by commit 60523583b07c ("dts: marvell: add CM3 SRAM memory to cp11x ethernet device tree")), priv->cm3_base remains NULL and priv->global_tx_fc is false. Any operation that triggers mvpp2_bm_switch_buffers(), for example an MTU change that crosses the jumbo frame threshold, will crash:
Unable to handle kernel NULL pointer dereference at
virtual address 0000000000000000
Mem abort info:
ESR = 0x0000000096000006
EC = 0x25: DABT (current EL), IL = 32 bits
pc : readl+0x0/0x18
lr : mvpp2_cm3_read.isra.0+0x14/0x20
Call trace:
readl+0x0/0x18
mvpp2_bm_pool_update_fc+0x40/0x12c
mvpp2_bm_pool_update_priv_fc+0x94/0xd8
mvpp2_bm_switch_buffers.isra.0+0x80/0x1c0
mvpp2_change_mtu+0x140/0x380
__dev_set_mtu+0x1c/0x38
dev_set_mtu_ext+0x78/0x118
dev_set_mtu+0x48/0xa8
dev_ifsioc+0x21c/0x43c
dev_ioctl+0x2d8/0x42c
sock_ioctl+0x314/0x378Every other flow control call site in the driver already guards hardware access with either priv->global_tx_fc or port->tx_fc. mvpp2_bm_switch_buffers() is the only place that omits this check.
Add the missing priv->global_tx_fc guard to both the disable and re-enable calls in mvpp2_bm_switch_buffers(), consistent with the rest of the driver.
--- drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +2 -2
@@ -5018,7 +5018,7 @@ static int mvpp2_bm_switch_buffers(struct mvpp2 *priv, bool percpu)if (priv->percpu_pools) numbufs = port->nrxqs *2 ; -if (change_percpu) +if (change_percpu && priv->global_tx_fc)mvpp2_bm_pool_update_priv_fc (priv, false);for (i =0 ; i < numbufs; i++)
@@ -5043,7 +5043,7 @@ static int mvpp2_bm_switch_buffers(struct mvpp2 *priv, bool percpu)mvpp2_open (port->dev); } -if (change_percpu) +if (change_percpu && priv->global_tx_fc)mvpp2_bm_pool_update_priv_fc (priv, true);return 0 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 177/220 net: shaper: protect late read accesses to the hierarchy
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 0f9ea7141f365b4f27226898e62220fb98ef8dc6 ]
We look up a netdev during prep of Netlink ops (pre- callbacks) and take a ref to it. Then later in the body of the callback we take its lock or RCU which are the actual protections.
This is not proper, a conversion from a ref to a locked netdev must include a liveness check (a check if the netdev hasn't been unregistered already). Fix the read cases (those under RCU). Writes needs a separate change to protect from creating the hierarchy after flush has already run.
--- net/shaper/shaper.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
net/shaper/shaper.c +22 -4
@@ -65,6 +65,21 @@ net_shaper_hierarchy(struct net_shaper_binding *binding)return NULL ; } +static struct net_shaper_hierarchy * +net_shaper_hierarchy_rcu (struct net_shaper_binding *binding) +{ +/* Readers look up the device and take a ref, then take RCU lock +* later at which point netdev may have been unregistered and flushed. +* READ_ONCE() pairs with WRITE_ONCE() in net_shaper_hierarchy_setup. +*/ +if (binding->type ==NET_SHAPER_BINDING_TYPE_NETDEV && +READ_ONCE (binding->netdev->reg_state) <=NETREG_REGISTERED ) +return READ_ONCE (binding->netdev->net_shaper_hierarchy); + +/* No other type supported yet. */ +return NULL ; +} +static const struct net_shaper_ops *net_shaper_ops (struct net_shaper_binding *binding) {
@@ -251,9 +266,10 @@ static struct net_shaper * net_shaper_lookup(struct net_shaper_binding *binding, const struct net_shaper_handle *handle) { - struct net_shaper_hierarchy *hierarchy = net_shaper_hierarchy(binding); u32 index = net_shaper_handle_to_index(handle); +struct net_shaper_hierarchy *hierarchy; + hierarchy =net_shaper_hierarchy_rcu (binding);if (!hierarchy ||xa_get_mark (&hierarchy->shapers, index,NET_SHAPER_NOT_VALID ))return NULL ;
@@ -778,17 +794,19 @@ int net_shaper_nl_get_dumpit(struct sk_buff *skb,/* Don't error out dumps performed before any set operation. */ binding =net_shaper_binding_from_ctx (ctx); - hierarchy =net_shaper_hierarchy (binding); -if (!hierarchy) -return 0 ;rcu_read_lock (); + hierarchy =net_shaper_hierarchy_rcu (binding); +if (!hierarchy) + goto out_unlock; +for (; (shaper =xa_find (&hierarchy->shapers, &ctx->start_index,U32_MAX ,XA_PRESENT )); ctx->start_index++) { ret =net_shaper_fill_one (skb, binding, shaper, info);if (ret)break ; } +out_unlock:rcu_read_unlock ();return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 178/220 net: shaper: protect from late creation of hierarchy
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit d75ec7e8ba1979a1eb0b9211d94d749cdce849c8 ]
We look up a netdev during prep of Netlink ops (pre- callbacks) and take a ref to it. Then later in the body of the callback we take its lock or RCU which are the actual protections.
The netdev may get unregistered in between the time we take the ref and the time we lock it. We may allocate the hierarchy after flush has already run, which would lead to a leak.
Take the instance lock in pre- already, this saves us from the race and removes the need for dedicated lock/unlock callbacks completely. After all, if there's any chance of write happening concurrently with the flush - we're back to leaking the hierarchy.
We may take the lock for devices which don't support shapers but we're only dealing with SET operations here, not taking the lock would be optimizing for an error case.
--- Documentation/netlink/specs/net_shaper.yaml | 12 +- net/shaper/shaper.c | 134 +++++++++++--------- net/shaper/shaper_nl_gen.c | 12 +- net/shaper/shaper_nl_gen.h | 5 + 4 files changed, 89 insertions(+), 74 deletions(-)
Documentation/netlink/specs/net_shaper.yaml +6 -6
@@ -247,8 +247,8 @@ operations: flags: [admin-perm] do: - pre: net-shaper-nl-pre-doit - post: net-shaper-nl-post-doit + pre: net-shaper-nl-pre-doit-write + post: net-shaper-nl-post-doit-write request: attributes: - ifindex
@@ -278,8 +278,8 @@ operations: flags: [admin-perm] do: - pre: net-shaper-nl-pre-doit - post: net-shaper-nl-post-doit + pre: net-shaper-nl-pre-doit-write + post: net-shaper-nl-post-doit-write request: attributes: *ns-binding
@@ -309,8 +309,8 @@ operations: flags: [admin-perm] do: - pre: net-shaper-nl-pre-doit - post: net-shaper-nl-post-doit + pre: net-shaper-nl-pre-doit-write + post: net-shaper-nl-post-doit-write request: attributes: - ifindex
net/shaper/shaper.c +72 -62
245 lines not on this page · raw message
net/shaper/shaper_nl_gen.c +6 -6
@@ -99,27 +99,27 @@ static const struct genl_split_ops net_shaper_nl_ops[] = { }, { .cmd = NET_SHAPER_CMD_SET, - .pre_doit = net_shaper_nl_pre_doit, + .pre_doit = net_shaper_nl_pre_doit_write, .doit = net_shaper_nl_set_doit, - .post_doit = net_shaper_nl_post_doit, + .post_doit = net_shaper_nl_post_doit_write, .policy = net_shaper_set_nl_policy, .maxattr = NET_SHAPER_A_IFINDEX, .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO, }, { .cmd = NET_SHAPER_CMD_DELETE, - .pre_doit = net_shaper_nl_pre_doit, + .pre_doit = net_shaper_nl_pre_doit_write, .doit = net_shaper_nl_delete_doit, - .post_doit = net_shaper_nl_post_doit, + .post_doit = net_shaper_nl_post_doit_write, .policy = net_shaper_delete_nl_policy, .maxattr = NET_SHAPER_A_IFINDEX, .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO, }, { .cmd = NET_SHAPER_CMD_GROUP, - .pre_doit = net_shaper_nl_pre_doit, + .pre_doit = net_shaper_nl_pre_doit_write, .doit = net_shaper_nl_group_doit, - .post_doit = net_shaper_nl_post_doit, + .post_doit = net_shaper_nl_post_doit_write, .policy = net_shaper_group_nl_policy, .maxattr = NET_SHAPER_A_LEAVES, .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
net/shaper/shaper_nl_gen.h +5 -0
@@ -18,12 +18,17 @@ extern const struct nla_policy net_shaper_leaf_info_nl_policy[NET_SHAPER_A_WEIGHint net_shaper_nl_pre_doit (const struct genl_split_ops *ops,struct sk_buff *skb,struct genl_info *info); +int net_shaper_nl_pre_doit_write (const struct genl_split_ops *ops, +struct sk_buff *skb,struct genl_info *info);int net_shaper_nl_cap_pre_doit (const struct genl_split_ops *ops,struct sk_buff *skb,struct genl_info *info);void net_shaper_nl_post_doit (const struct genl_split_ops *ops,struct sk_buff *skb,struct genl_info *info);void +net_shaper_nl_post_doit_write (const struct genl_split_ops *ops, +struct sk_buff *skb,struct genl_info *info); +void net_shaper_nl_cap_post_doit (const struct genl_split_ops *ops,struct sk_buff *skb,struct genl_info *info);int net_shaper_nl_pre_dumpit (struct netlink_callback *cb);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 179/220 net: dsa: bcm_sf2: fix missing clk_disable_unprepare() in error paths
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anas Iqbal <[email protected]>
[ Upstream commit b48731849609cbd8c53785a48976850b443153fd ]
Smatch reports:drivers/net/dsa/bcm_sf2.c:997 bcm_sf2_sw_resume() warn:
'priv->clk' from clk_prepare_enable() not released on lines: 983,990.
The clock enabled by clk_prepare_enable() in bcm_sf2_sw_resume() is not released if bcm_sf2_sw_rst() or bcm_sf2_cfp_resume() fails.
Add the missing clk_disable_unprepare() calls in the error paths to properly release the clock resource.
--- drivers/net/dsa/bcm_sf2.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/dsa/bcm_sf2.c +6 -2
@@ -980,15 +980,19 @@ static int bcm_sf2_sw_resume(struct dsa_switch *ds) ret =bcm_sf2_sw_rst (priv);if (ret) {pr_err ("%s: failed to software reset switch\n" , __func__); +if (!priv->wol_ports_mask) +clk_disable_unprepare (priv->clk);return ret; }bcm_sf2_crossbar_setup (priv); ret =bcm_sf2_cfp_resume (ds); -if (ret) +if (ret) { +if (!priv->wol_ports_mask) +clk_disable_unprepare (priv->clk);return ret; - + }if (priv->hw_params.num_gphy ==1 )bcm_sf2_gphy_enable_set (ds, true);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 180/220 icmp: fix NULL pointer dereference in icmp_tag_validation()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weiming Shi <[email protected]>
[ Upstream commit 614aefe56af8e13331e50220c936fc0689cf5675 ]
icmp_tag_validation() unconditionally dereferences the result of rcu_dereference(inet_protos[proto]) without checking for NULL. The inet_protos[] array is sparse -- only about 15 of 256 protocol numbers have registered handlers. When ip_no_pmtu_disc is set to 3 (hardened PMTU mode) and the kernel receives an ICMP Fragmentation Needed error with a quoted inner IP header containing an unregistered protocol number, the NULL dereference causes a kernel panic in softirq context.
Oops: general protection fault, probably for non-canonical address 0xdffffc0000000002: 0000 [#1] SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000010-0x0000000000000017] RIP: 0010:icmp_unreach (net/ipv4/icmp.c:1085 net/ipv4/icmp.c:1143) Call Trace: <IRQ> icmp_rcv (net/ipv4/icmp.c:1527) ip_protocol_deliver_rcu (net/ipv4/ip_input.c:207) ip_local_deliver_finish (net/ipv4/ip_input.c:242) ip_local_deliver (net/ipv4/ip_input.c:262) ip_rcv (net/ipv4/ip_input.c:573) __netif_receive_skb_one_core (net/core/dev.c:6164) process_backlog (net/core/dev.c:6628) handle_softirqs (kernel/softirq.c:561) </IRQ>
Add a NULL check before accessing icmp_strict_tag_validation. If the protocol has no registered handler, return false since it cannot perform strict tag validation.
--- net/ipv4/icmp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv4/icmp.c +3 -1
@@ -1067,10 +1067,12 @@ static void icmp_socket_deliver(struct sk_buff *skb, u32 info)static bool icmp_tag_validation (int proto) { +const struct net_protocol *ipprot;bool ok;rcu_read_lock (); - ok =rcu_dereference (inet_protos[proto])->icmp_strict_tag_validation; + ipprot =rcu_dereference (inet_protos[proto]); + ok = ipprot ? ipprot->icmp_strict_tag_validation : false;rcu_read_unlock ();return ok; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 181/220 MPTCP: fix lock class name family in pm_nl_create_listen_socket
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Xiasong <[email protected]>
[ Upstream commit 7ab4a7c5d969642782b8a5b608da0dd02aa9f229 ]
In mptcp_pm_nl_create_listen_socket(), use entry->addr.family instead of sk->sk_family for lock class setup. The 'sk' parameter is a netlink socket, not the MPTCP subflow socket being created.
--- net/mptcp/pm_kernel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mptcp/pm_kernel.c +1 -1
@@ -838,7 +838,7 @@ static struct lock_class_key mptcp_keys[2];static int mptcp_pm_nl_create_listen_socket (struct sock *sk,struct mptcp_pm_addr_entry *entry) { -bool is_ipv6 = sk->sk_family ==AF_INET6 ; +bool is_ipv6 = entry->addr.family ==AF_INET6 ;int addrlen =sizeof (struct sockaddr_in );struct sockaddr_storage addr;struct sock *newsk, *ssk;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 182/220 hwmon: (pmbus/ina233) Add error check for pmbus_read_word_data() return value
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sanman Pradhan <[email protected]>
commit 32f59301b9898c0ab5e72908556d553e2d481945 upstream.
ina233_read_word_data() uses the return value of pmbus_read_word_data() directly in a DIV_ROUND_CLOSEST() computation without first checking for errors. If the underlying I2C transaction fails, a negative error code is used in the arithmetic, producing a garbage sensor value instead of propagating the error.
Add the missing error check before using the return value.
--- drivers/hwmon/pmbus/ina233.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/hwmon/pmbus/ina233.c +2 -0
@@ -67,6 +67,8 @@ static int ina233_read_word_data(structswitch (reg) {case PMBUS_VIRT_READ_VMON : ret =pmbus_read_word_data (client,0 ,0xff ,MFR_READ_VSHUNT ); +if (ret <0 ) +return ret;/* Adjust returned value to match VIN coefficients */ /* VIN: 1.25 mV VSHUNT: 2.5 uV LSB */
Greg Kroah-Hartman
maintainerPATCH 183/220 hwmon: (pmbus/mp2975) Add error check for pmbus_read_word_data() return value
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sanman Pradhan <[email protected]>
commit 19d4b9c8a136704d5f2544e7ac550f27918a5004 upstream.
mp2973_read_word_data() XORs the return value of pmbus_read_word_data() with PB_STATUS_POWER_GOOD_N without first checking for errors. If the I2C transaction fails, a negative error code is XORed with the constant, producing a corrupted value that is returned as valid status data instead of propagating the error.
Add the missing error check before modifying the return value.
--- drivers/hwmon/pmbus/mp2975.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/hwmon/pmbus/mp2975.c +2 -0
@@ -313,6 +313,8 @@ static int mp2973_read_word_data(structcase PMBUS_STATUS_WORD :/* MP2973 & MP2971 return PGOOD instead of PB_STATUS_POWER_GOOD_N. */ ret =pmbus_read_word_data (client, page, phase, reg); +if (ret <0 ) +return ret; ret ^=PB_STATUS_POWER_GOOD_N ;break ;case PMBUS_OT_FAULT_LIMIT :
Greg Kroah-Hartman
maintainerPATCH 184/220 hwmon: (pmbus/mp2869) Check pmbus_read_byte_data() before using its return value
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sanman Pradhan <[email protected]>
commit c6f45ed26b6eb4766db06f21ff28a97ed485bcbb upstream.
In mp2869_read_byte_data() and mp2869_read_word_data(), the return value of pmbus_read_byte_data() for PMBUS_STATUS_MFR_SPECIFIC is used directly inside FIELD_GET() macro arguments without error checking. If the I2C transaction fails, a negative error code is passed to FIELD_GET() and FIELD_PREP(), silently corrupting the status register bits being constructed.
Extract the nested pmbus_read_byte_data() calls into a separate variable and check for errors before use. This also eliminates a redundant duplicate read of the same register in the PMBUS_STATUS_TEMPERATURE case.
--- drivers/hwmon/pmbus/mp2869.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-)
drivers/hwmon/pmbus/mp2869.c +21 -14
@@ -165,7 +165,7 @@ static int mp2869_read_byte_data(struct {const struct pmbus_driver_info *info =pmbus_get_driver_info (client);struct mp2869_data *data =to_mp2869_data (info); -int ret; +int ret, mfr;switch (reg) {case PMBUS_VOUT_MODE :
@@ -188,11 +188,14 @@ static int mp2869_read_byte_data(structif (ret <0 )return ret; + mfr =pmbus_read_byte_data (client, page, +PMBUS_STATUS_MFR_SPECIFIC ); +if (mfr <0 ) +return mfr; + ret = (ret & ~GENMASK (2 ,2 )) |FIELD_PREP (GENMASK (2 ,2 ), -FIELD_GET (GENMASK (1 ,1 ), -pmbus_read_byte_data (client, page, -PMBUS_STATUS_MFR_SPECIFIC ))); +FIELD_GET (GENMASK (1 ,1 ), mfr));break ;case PMBUS_STATUS_TEMPERATURE :/*
@@ -207,15 +210,16 @@ static int mp2869_read_byte_data(structif (ret <0 )return ret; + mfr =pmbus_read_byte_data (client, page, +PMBUS_STATUS_MFR_SPECIFIC ); +if (mfr <0 ) +return mfr; + ret = (ret & ~GENMASK (7 ,6 )) |FIELD_PREP (GENMASK (6 ,6 ), -FIELD_GET (GENMASK (1 ,1 ), -pmbus_read_byte_data (client, page, -PMBUS_STATUS_MFR_SPECIFIC ))) | +FIELD_GET (GENMASK (1 ,1 ), mfr)) |FIELD_PREP (GENMASK (7 ,7 ), -FIELD_GET (GENMASK (1 ,1 ), -pmbus_read_byte_data (client, page, -PMBUS_STATUS_MFR_SPECIFIC ))); +FIELD_GET (GENMASK (1 ,1 ), mfr));break ;default : ret = -ENODATA ;
@@ -230,7 +234,7 @@ static int mp2869_read_word_data(struct {const struct pmbus_driver_info *info =pmbus_get_driver_info (client);struct mp2869_data *data =to_mp2869_data (info); -int ret; +int ret, mfr;switch (reg) {case PMBUS_STATUS_WORD :
@@ -246,11 +250,14 @@ static int mp2869_read_word_data(structif (ret <0 )return ret; + mfr =pmbus_read_byte_data (client, page, +PMBUS_STATUS_MFR_SPECIFIC ); +if (mfr <0 ) +return mfr; + ret = (ret & ~GENMASK (2 ,2 )) |FIELD_PREP (GENMASK (2 ,2 ), -FIELD_GET (GENMASK (1 ,1 ), -pmbus_read_byte_data (client, page, -PMBUS_STATUS_MFR_SPECIFIC ))); +FIELD_GET (GENMASK (1 ,1 ), mfr));break ;case PMBUS_READ_VIN :/*
Greg Kroah-Hartman
maintainerPATCH 185/220 hwmon: (pmbus/isl68137) Fix unchecked return value and use sysfs_emit()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sanman Pradhan <[email protected]>
commit 86259558e422b250aa6aa57163a6d759074573f5 upstream.
isl68137_avs_enable_show_page() uses the return value of pmbus_read_byte_data() without checking for errors. If the I2C transaction fails, a negative error code is passed through bitwise operations, producing incorrect output.
Add an error check to propagate the return value if it is negative. Additionally, modernize the callback by replacing sprintf() with sysfs_emit().
--- drivers/hwmon/pmbus/isl68137.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/hwmon/pmbus/isl68137.c +5 -2
@@ -98,8 +98,11 @@ static ssize_t isl68137_avs_enable_show_ {int val =pmbus_read_byte_data (client, page,PMBUS_OPERATION ); -return sprintf (buf,"%d\n" , - (val &ISL68137_VOUT_AVS ) ==ISL68137_VOUT_AVS ?1 :0 ); +if (val <0 ) +return val; + +return sysfs_emit (buf,"%d\n" , + (val &ISL68137_VOUT_AVS ) ==ISL68137_VOUT_AVS ); } static ssize_t isl68137_avs_enable_store_page(struct i2c_client *client,
Greg Kroah-Hartman
maintainerPATCH 186/220 i2c: cp2615: fix serial string NULL-deref at probe
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit aa79f996eb41e95aed85a1bd7f56bcd6a3842008 upstream.
The cp2615 driver uses the USB device serial string as the i2c adapter name but does not make sure that the string exists.
Verify that the device has a serial number before accessing it to avoid triggering a NULL-pointer dereference (e.g. with malicious devices).
--- drivers/i2c/busses/i2c-cp2615.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/i2c/busses/i2c-cp2615.c +3 -0
@@ -298,6 +298,9 @@ cp2615_i2c_probe(struct usb_interface *uif (!adap)return -ENOMEM ; +if (!usbdev->serial) +return -EINVAL ; +strscpy (adap->name, usbdev->serial,sizeof (adap->name)); adap->owner =THIS_MODULE ; adap->dev.parent = &usbif->dev;
Greg Kroah-Hartman
maintainerPATCH 187/220 i2c: fsi: Fix a potential leak in fsi_i2c_probe()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
commit be627abcc0d5dbd5882873bd85fbc18aa3d189ed upstream.
In the commit in Fixes:, when the code has been updated to use an explicit for loop, instead of for_each_available_child_of_node(), the assumption that a reference to a device_node structure would be released at each iteration has been broken.
Now, an explicit of_node_put() is needed to release the reference.
--- drivers/i2c/busses/i2c-fsi.c | 1 + 1 file changed, 1 insertion(+)
drivers/i2c/busses/i2c-fsi.c +1 -0
@@ -728,6 +728,7 @@ static int fsi_i2c_probe(struct device * rc =i2c_add_adapter (&port->adapter);if (rc <0 ) {dev_err (dev,"Failed to register adapter: %d\n" , rc); +of_node_put (np);kfree (port);continue ; }
Greg Kroah-Hartman
maintainerPATCH 188/220 i2c: pxa: defer reset on Armada 3700 when recovery is used
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabor Juhos <[email protected]>
commit 78a6ee14f8b9e1c8f7c77612122444f3be8dc8cc upstream.
The I2C communication is completely broken on the Armada 3700 platform since commit 0b01392c18b9 ("i2c: pxa: move to generic GPIO recovery").
For example, on the Methode uDPU board, probing of the two onboard temperature sensors fails ...
[ 7.271713] i2c i2c-0: using pinctrl states for GPIO recovery [ 7.277503] i2c i2c-0: PXA I2C adapter [ 7.282199] i2c i2c-1: using pinctrl states for GPIO recovery [ 7.288241] i2c i2c-1: PXA I2C adapter [ 7.292947] sfp sfp-eth1: Host maximum power 3.0W [ 7.299614] sfp sfp-eth0: Host maximum power 3.0W [ 7.308178] lm75 1-0048: supply vs not found, using dummy regulator [ 32.489631] lm75 1-0048: probe with driver lm75 failed with error -121 [ 32.496833] lm75 1-0049: supply vs not found, using dummy regulator [ 82.890614] lm75 1-0049: probe with driver lm75 failed with error -121
... and accessing the plugged-in SFP modules also does not work:
[ 511.298537] sfp sfp-eth1: please wait, module slow to respond [ 536.488530] sfp sfp-eth0: please wait, module slow to respond ... [ 1065.688536] sfp sfp-eth1: failed to read EEPROM: -EREMOTEIO [ 1090.888532] sfp sfp-eth0: failed to read EEPROM: -EREMOTEIO
After a discussion [1], there was an attempt to fix the problem by reverting the offending change by commit 7b211c767121 ("Revert "i2c:
pxa: move to generic GPIO recovery""), but that only helped to fix the issue in the 6.1.y stable tree. The reason behind the partial succes is that there was another change in commit 20cb3fce4d60 ("i2c: Set i2c pinctrl recovery info from it's device pinctrl") in the 6.3-rc1 cycle which broke things further.
The cause of the problem is the same in case of both offending commits mentioned above. Namely, the I2C core code changes the pinctrl state to GPIO while running the recovery initialization code. Although the PXA specific initialization also does this, but the key difference is that it happens before the controller is getting enabled in i2c_pxa_reset(), whereas in the case of the generic initialization it happens after that.
Change the code to reset the controller only before the first transfer instead of before registering the controller. This ensures that the controller is not enabled at the time when the generic recovery code performs the pinctrl state changes, thus avoids the problem described above.
As the result this change restores the original behaviour, which in turn makes the I2C communication to work again as it can be seen from the following log:
[ 7.363250] i2c i2c-0: using pinctrl states for GPIO recovery [ 7.369041] i2c i2c-0: PXA I2C adapter [ 7.373673] i2c i2c-1: using pinctrl states for GPIO recovery [ 7.379742] i2c i2c-1: PXA I2C adapter [ 7.384506] sfp sfp-eth1: Host maximum power 3.0W [ 7.393013] sfp sfp-eth0: Host maximum power 3.0W [ 7.399266] lm75 1-0048: supply vs not found, using dummy regulator [ 7.407257] hwmon hwmon0: temp1_input not attached to any thermal zone [ 7.413863] lm75 1-0048: hwmon0: sensor 'tmp75c' [ 7.418746] lm75 1-0049: supply vs not found, using dummy regulator [ 7.426371] hwmon hwmon1: temp1_input not attached to any thermal zone [ 7.432972] lm75 1-0049: hwmon1: sensor 'tmp75c' [ 7.755092] sfp sfp-eth1: module MENTECHOPTO POS22-LDCC-KR rev 1.0 sn MNC208U90009 dc 200828 [ 7.764997] mvneta d0040000.ethernet eth1: unsupported SFP module: no common interface modes [ 7.785362] sfp sfp-eth0: module Mikrotik S-RJ01 rev 1.0 sn 61B103C55C58 dc 201022 [ 7.803426] hwmon hwmon2: temp1_input not attached to any thermal zone
--- drivers/i2c/busses/i2c-pxa.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-pxa.c +16 -1
@@ -268,6 +268,7 @@ struct pxa_i2c {struct pinctrl *pinctrl;struct pinctrl_state *pinctrl_default;struct pinctrl_state *pinctrl_recovery; +bool reset_before_xfer; };#define _IBMR (i2c) ((i2c)->reg_ibmr)
@@ -1144,6 +1145,11 @@ static int i2c_pxa_xfer(struct i2c_adapt {struct pxa_i2c *i2c = adap->algo_data; +if (i2c->reset_before_xfer) { +i2c_pxa_reset (i2c); + i2c->reset_before_xfer = false; + } +return i2c_pxa_internal_xfer (i2c, msgs, num, i2c_pxa_do_xfer); }
@@ -1521,7 +1527,16 @@ static int i2c_pxa_probe(struct platform } } -i2c_pxa_reset (i2c); +/* +* Skip reset on Armada 3700 when recovery is used to avoid +* controller hang due to the pinctrl state changes done by +* the generic recovery initialization code. The reset will +* be performed later, prior to the first transfer. +*/ +if (i2c_type ==REGS_A3700 && i2c->adap.bus_recovery_info) + i2c->reset_before_xfer = true; +else +i2c_pxa_reset (i2c); ret =i2c_add_numbered_adapter (&i2c->adap);if (ret <0 )
Greg Kroah-Hartman
maintainerPATCH 189/220 irqchip/riscv-rpmi-sysmsi: Fix mailbox channel leak in rpmi_sysmsi_probe()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
commit 76f0930d6e809234904cf9f0f5f42ee6c1dc694e upstream.
When riscv_acpi_get_gsi_info() fails, the mailbox channel previously requested via mbox_request_channel() is not freed. Add the missing mbox_free_channel() call to prevent the resource leak.
--- drivers/irqchip/irq-riscv-rpmi-sysmsi.c | 1 + 1 file changed, 1 insertion(+)
drivers/irqchip/irq-riscv-rpmi-sysmsi.c +1 -0
@@ -250,6 +250,7 @@ static int rpmi_sysmsi_probe(struct plat rc =riscv_acpi_get_gsi_info (fwnode, &priv->gsi_base, &id, &nr_irqs,NULL );if (rc) { +mbox_free_channel (priv->chan);dev_err (dev,"failed to find GSI mapping\n" );return rc; }
Greg Kroah-Hartman
maintainerPATCH 190/220 perf/x86/intel: Add missing branch counters constraint apply
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dapeng Mi <[email protected]>
commit 1d07bbd7ea36ea0b8dfa8068dbe67eb3a32d9590 upstream.
When running the command:
'perf record -e "{instructions,instructions:p}" -j any,counter sleep 1', a "shift-out-of-bounds" warning is reported on CWF.
UBSAN: shift-out-of-bounds in /kbuild/src/consumer/arch/x86/events/intel/lbr.c:970:15 shift exponent 64 is too large for 64-bit type 'long long unsigned int' ...... intel_pmu_lbr_counters_reorder.isra.0.cold+0x2a/0xa7 intel_pmu_lbr_save_brstack+0xc0/0x4c0 setup_arch_pebs_sample_data+0x114b/0x2400
The warning occurs because the second "instructions:p" event, which involves branch counters sampling, is incorrectly programmed to fixed counter 0 instead of the general-purpose (GP) counters 0-3 that support branch counters sampling. Currently only GP counters 0-3 support branch counters sampling on CWF, any event involving branch counters sampling should be programed on GP counters 0-3. Since the counter index of fixed counter 0 is 32, it leads to the "src" value in below code is right shifted 64 bits and trigger the "shift-out-of-bounds" warning.
cnt = (src >> (order[j] * LBR_INFO_BR_CNTR_BITS)) & LBR_INFO_BR_CNTR_MASK;
The root cause is the loss of the branch counters constraint for the new event in the branch counters sampling event group. Since it isn't yet part of the sibling list. This results in the second "instructions:p" event being programmed on fixed counter 0 incorrectly instead of the appropriate GP counters 0-3.
To address this, we apply the missing branch counters constraint for the last event in the group. Additionally, we introduce a new function, intel_set_branch_counter_constr(), to apply the branch counters constraint and avoid code duplication.
--- arch/x86/events/intel/core.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-)
arch/x86/events/intel/core.c +21 -10
@@ -4367,6 +4367,19 @@ static inline void intel_pmu_set_acr_cau event->hw.dyn_constraint &=hybrid (event->pmu, acr_cause_mask64); } +static inline int intel_set_branch_counter_constr (struct perf_event *event, +int *num) +{ +if (branch_sample_call_stack (event)) +return -EINVAL ; +if (branch_sample_counters (event)) { + (*num)++; + event->hw.dyn_constraint &= x86_pmu.lbr_counters; + } + +return 0 ; +} +static int intel_pmu_hw_config (struct perf_event *event) {int ret =x86_pmu_hw_config (event);
@@ -4437,21 +4450,19 @@ static int intel_pmu_hw_config(struct pe* group, which requires the extra space to store the counters. */ leader = event->group_leader; -if (branch_sample_call_stack (leader)) +if (intel_set_branch_counter_constr (leader, &num))return -EINVAL ; -if (branch_sample_counters (leader)) { - num++; - leader->hw.dyn_constraint &= x86_pmu.lbr_counters; - } leader->hw.flags |=PERF_X86_EVENT_BRANCH_COUNTERS ;for_each_sibling_event (sibling, leader) { -if (branch_sample_call_stack (sibling)) +if (intel_set_branch_counter_constr (sibling, &num)) +return -EINVAL ; + } + +/* event isn't installed as a sibling yet. */ +if (event != leader) { +if (intel_set_branch_counter_constr (event, &num))return -EINVAL ; -if (branch_sample_counters (sibling)) { - num++; - sibling->hw.dyn_constraint &= x86_pmu.lbr_counters; - } }if (num >fls (x86_pmu.lbr_counters))
Greg Kroah-Hartman
maintainerPATCH 191/220 perf/x86: Move event pointer setup earlier in x86_pmu_enable()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
commit 8d5fae6011260de209aaf231120e8146b14bc8e0 upstream.
A production AMD EPYC system crashed with a NULL pointer dereference in the PMU NMI handler:
BUG: kernel NULL pointer dereference, address: 0000000000000198 RIP: x86_perf_event_update+0xc/0xa0 Call Trace: <NMI> amd_pmu_v2_handle_irq+0x1a6/0x390 perf_event_nmi_handler+0x24/0x40
The faulting instruction is cmpq $0x0, 0x198(%rdi) with RDI=0, corresponding to the if (unlikely(!hwc->event_base)) check in x86_perf_event_update() where hwc = &event->hw and event is NULL.
drgn inspection of the vmcore on CPU 106 showed a mismatch between cpuc->active_mask and cpuc->events[]:
active_mask: 0x1e (bits 1, 2, 3, 4)
events[1]: 0xff1100136cbd4f38 (valid) events[2]: 0x0 (NULL, but active_mask bit 2 set) events[3]: 0xff1100076fd2cf38 (valid) events[4]: 0xff1100079e990a90 (valid)
The event that should occupy events[2] was found in event_list[2] with hw.idx=2 and hw.state=0x0, confirming x86_pmu_start() had run (which clears hw.state and sets active_mask) but events[2] was never populated.
Another event (event_list[0]) had hw.state=0x7 (STOPPED|UPTODATE|ARCH), showing it was stopped when the PMU rescheduled events, confirming the throttle-then-reschedule sequence occurred.
The root cause is commit 7e772a93eb61 ("perf/x86: Fix NULL event access and potential PEBS record loss") which moved the cpuc->events[idx] assignment out of x86_pmu_start() and into step 2 of x86_pmu_enable(), after the PERF_HES_ARCH check. This broke any path that calls pmu->start() without going through x86_pmu_enable() -- specifically the unthrottle path:
perf_adjust_freq_unthr_events()
-> perf_event_unthrottle_group()
-> perf_event_unthrottle()
-> event->pmu->start(event, 0)
-> x86_pmu_start() // sets active_mask but not events[]The race sequence is:
1. A group of perf events overflows, triggering group throttle via
perf_event_throttle_group(). All events are stopped: active_mask
bits cleared, events[] preserved (x86_pmu_stop no longer clears
events[] after commit 7e772a93eb61). 2. While still throttled (PERF_HES_STOPPED), x86_pmu_enable() runs due to other scheduling activity. Stopped events that need to move counters get PERF_HES_ARCH set and events[old_idx] cleared. In step 2 of x86_pmu_enable(), PERF_HES_ARCH causes these events to be skipped -- events[new_idx] is never set.
3. The timer tick unthrottles the group via pmu->start(). Since commit 7e772a93eb61 removed the events[] assignment from x86_pmu_start(), active_mask[new_idx] is set but events[new_idx] remains NULL.
4. A PMC overflow NMI fires. The handler iterates active counters, finds active_mask[2] set, reads events[2] which is NULL, and crashes dereferencing it.
Move the cpuc->events[hwc->idx] assignment in x86_pmu_enable() to before the PERF_HES_ARCH check, so that events[] is populated even for events that are not immediately started. This ensures the unthrottle path via pmu->start() always finds a valid event pointer.
--- arch/x86/events/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/events/core.c +2 -1
@@ -1369,6 +1369,8 @@ static void x86_pmu_enable(struct pmu *pelse if (i < n_running)continue ; + cpuc->events[hwc->idx] = event; +if (hwc->state &PERF_HES_ARCH )continue ;
@@ -1376,7 +1378,6 @@ static void x86_pmu_enable(struct pmu *p* if cpuc->enabled = 0, then no wrmsr as * per x86_pmu_enable_event() */ - cpuc->events[hwc->idx] = event;x86_pmu_start (event,PERF_EF_RELOAD ); } cpuc->n_added =0 ;
Greg Kroah-Hartman
maintainerPATCH 192/220 ring-buffer: Fix to update per-subbuf entries of persistent ring buffer
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masami Hiramatsu (Google) <[email protected]>
commit f35dbac6942171dc4ce9398d1d216a59224590a9 upstream.
Since the validation loop in rb_meta_validate_events() updates the same cpu_buffer->head_page->entries, the other subbuf entries are not updated. Fix to use head_page to update the entries field, since it is the cursor in this loop.
--- kernel/trace/ring_buffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/ring_buffer.c +1 -1
@@ -2052,7 +2052,7 @@ static void rb_meta_validate_events(stru entries += ret; entry_bytes +=local_read (&head_page->page->commit); -local_set (&cpu_buffer->head_page->entries, ret); +local_set (&head_page->entries, ret);if (head_page == cpu_buffer->commit_page)break ;
Greg Kroah-Hartman
maintainerPATCH 193/220 tracing: Fix failure to read user space from system call trace events
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit edca33a56297d5741ccf867669debec116681987 upstream.
The system call trace events call trace_user_fault_read() to read the user space part of some system calls. This is done by grabbing a per-cpu buffer, disabling migration, enabling preemption, calling copy_from_user(), disabling preemption, enabling migration and checking if the task was preempted while preemption was enabled. If it was, the buffer is considered corrupted and it tries again.
There's a safety mechanism that will fail out of this loop if it fails 100 times (with a warning). That warning message was triggered in some pi_futex stress tests. Enabling the sched_switch trace event and traceoff_on_warning, showed the problem:
pi_mutex_hammer-1375 [006] d..21 138.981648: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981651: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981656: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981659: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981664: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981667: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981671: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981675: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981679: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981682: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981687: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981690: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981695: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981698: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981703: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981706: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981711: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981714: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981719: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981722: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981727: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981730: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95
pi_mutex_hammer-1375 [006] d..21 138.981735: sched_switch: prev_comm=pi_mutex_hammer prev_pid=1375 prev_prio=95 prev_state=R+ ==> next_comm=migration/6 next_pid=47 next_prio=0
migration/6-47 [006] d..2. 138.981738: sched_switch: prev_comm=migration/6 prev_pid=47 prev_prio=0 prev_state=S ==> next_comm=pi_mutex_hammer next_pid=1375 next_prio=95What happened was the task 1375 was flagged to be migrated. When preemption was enabled, the migration thread woke up to migrate that task, but failed because migration for that task was disabled. This caused the loop to fail to exit because the task scheduled out while trying to read user space.
Every time the task enabled preemption the migration thread would schedule in, try to migrate the task, fail and let the task continue. But because the loop would only enable preemption with migration disabled, it would always fail because each time it enabled preemption to read user space, the migration thread would try to migrate it.
To solve this, when the loop fails to read user space without being scheduled out, enabled and disable preemption with migration enabled. This will allow the migration task to successfully migrate the task and the next loop should succeed to read user space without being scheduled out.
--- kernel/trace/trace.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
kernel/trace/trace.c +17 -0
@@ -7546,6 +7546,23 @@ char *trace_user_fault_read(struct trace do { /* + * It is possible that something is trying to migrate this + * task. What happens then, is when preemption is enabled, + * the migration thread will preempt this task, try to + * migrate it, fail, then let it run again. That will + * cause this to loop again and never succeed. + * On failures, enabled and disable preemption with + * migration enabled, to allow the migration thread to + * migrate this task. + */ + if (trys) { + preempt_enable_notrace(); + preempt_disable_notrace(); + cpu = smp_processor_id(); + buffer = per_cpu_ptr(tinfo->tbuf, cpu)->buf; + } + + /* * If for some reason, copy_from_user() always causes a context * switch, this would then cause an infinite loop. * If this task is preempted by another user space task, it
Greg Kroah-Hartman
maintainerPATCH 194/220 tracing: Fix trace_marker copy link list updates
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 07183aac4a6828e474f00b37c9d795d0d99e18a7 upstream.
When the "copy_trace_marker" option is enabled for an instance, anything written into /sys/kernel/tracing/trace_marker is also copied into that instances buffer. When the option is set, that instance's trace_array descriptor is added to the marker_copies link list. This list is protected by RCU, as all iterations uses an RCU protected list traversal.
When the instance is deleted, all the flags that were enabled are cleared. This also clears the copy_trace_marker flag and removes the trace_array descriptor from the list.
The issue is after the flags are called, a direct call to update_marker_trace() is performed to clear the flag. This function returns true if the state of the flag changed and false otherwise. If it returns true here, synchronize_rcu() is called to make sure all readers see that its removed from the list.
But since the flag was already cleared, the state does not change and the synchronization is never called, leaving a possible UAF bug.
Move the clearing of all flags below the updating of the copy_trace_marker option which then makes sure the synchronization is performed.
Also use the flag for checking the state in update_marker_trace() instead of looking at if the list is empty.
--- kernel/trace/trace.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
kernel/trace/trace.c +10 -9
@@ -567,7 +567,7 @@ static bool update_marker_trace(struct tlockdep_assert_held (&event_mutex);if (enabled) { -if (!list_empty (&tr->marker_list)) +if (tr->trace_flags &TRACE_ITER (COPY_MARKER ))return false;list_add_rcu (&tr->marker_list, &marker_copies);
@@ -575,10 +575,10 @@ static bool update_marker_trace(struct treturn true; } -if (list_empty (&tr->marker_list)) +if (!(tr->trace_flags &TRACE_ITER (COPY_MARKER )))return false; -list_del_init (&tr->marker_list); +list_del_rcu (&tr->marker_list); tr->trace_flags &= ~TRACE_ITER (COPY_MARKER );return true; }
@@ -10547,18 +10547,19 @@ static int __remove_instance(struct traclist_del (&tr->list); -/* Disable all the flags that were enabled coming in */ -for (i =0 ; i <TRACE_FLAGS_MAX_SIZE ; i++) { -if ((1ULL << i) &ZEROED_TRACE_FLAGS ) -set_tracer_flag (tr,1ULL << i,0 ); - } -if (printk_trace == tr)update_printk_trace (&global_trace); +/* Must be done before disabling all the flags */ if (update_marker_trace (tr,0 ))synchronize_rcu (); +/* Disable all the flags that were enabled coming in */ +for (i =0 ; i <TRACE_FLAGS_MAX_SIZE ; i++) { +if ((1ULL << i) &ZEROED_TRACE_FLAGS ) +set_tracer_flag (tr,1ULL << i,0 ); + } +tracing_set_nop (tr);clear_ftrace_function_probes (tr);event_trace_del_tracer (tr);
Greg Kroah-Hartman
maintainerPATCH 195/220 x86/mce/amd: Check SMCA feature bit before accessing SMCA MSRs
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: William Roche <[email protected]>
commit 201bc182ad6333468013f1af0719ffe125826b6a upstream.
People do effort to inject MCEs into guests in order to simulate/test handling of hardware errors. The real use case behind it is testing the handling of SIGBUS which the memory failure code sends to the process.
If that process is QEMU, instead of killing the whole guest, the MCE can be injected into the guest kernel so that latter can attempt proper handling and kill the user *process* in the guest, instead, which caused the MCE. The assumption being here that the whole injection flow can supply enough information that the guest kernel can pinpoint the right process. But that's a different topic...
Regardless of virtualization or not, access to SMCA-specific registers like MCA_DESTAT should only be done after having checked the smca feature bit. And there are AMD machines like Bulldozer (the one before Zen1) which do support deferred errors but are not SMCA machines.
Therefore, properly check the feature bit before accessing related MSRs.
[ bp: Rewrite commit message. ]
--- arch/x86/kernel/cpu/mce/amd.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
arch/x86/kernel/cpu/mce/amd.c +11 -6
@@ -875,13 +875,18 @@ void amd_clear_bank(struct mce *m) {amd_reset_thr_limit (m->bank); -/* Clear MCA_DESTAT for all deferred errors even those logged in MCA_STATUS. */ -if (m->status &MCI_STATUS_DEFERRED ) -mce_wrmsrq (MSR_AMD64_SMCA_MCx_DESTAT (m->bank),0 ); +if (mce_flags.smca) { +/* +* Clear MCA_DESTAT for all deferred errors even those +* logged in MCA_STATUS. +*/ +if (m->status &MCI_STATUS_DEFERRED ) +mce_wrmsrq (MSR_AMD64_SMCA_MCx_DESTAT (m->bank),0 ); -/* Don't clear MCA_STATUS if MCA_DESTAT was used exclusively. */ -if (m->kflags &MCE_CHECK_DFR_REGS ) -return ; +/* Don't clear MCA_STATUS if MCA_DESTAT was used exclusively. */ +if (m->kflags &MCE_CHECK_DFR_REGS ) +return ; + }mce_wrmsrq (mca_msr_reg (m->bank,MCA_STATUS ),0 ); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 196/220 x86/platform/uv: Handle deconfigured sockets
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kyle Meyer <[email protected]>
commit 1f6aa5bbf1d0f81a8a2aafc16136e7dd9a609ff3 upstream.
When a socket is deconfigured, it's mapped to SOCK_EMPTY (0xffff). This causes a panic while allocating UV hub info structures.
Fix this by using NUMA_NO_NODE, allowing UV hub info structures to be allocated on valid nodes.
--- arch/x86/kernel/apic/x2apic_uv_x.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
arch/x86/kernel/apic/x2apic_uv_x.c +16 -2
@@ -1708,8 +1708,22 @@ static void __init uv_system_init_hub(vostruct uv_hub_info_s *new_hub;/* Allocate & fill new per hub info list */ - new_hub = (bid ==0 ) ? &uv_hub_info_node0 - :kzalloc_node (bytes,GFP_KERNEL ,uv_blade_to_node (bid)); +if (bid ==0 ) { + new_hub = &uv_hub_info_node0; + }else { +int nid; + +/* +* Deconfigured sockets are mapped to SOCK_EMPTY. Use +* NUMA_NO_NODE to allocate on a valid node. +*/ + nid =uv_blade_to_node (bid); +if (nid ==SOCK_EMPTY ) + nid =NUMA_NO_NODE ; + + new_hub =kzalloc_node (bytes,GFP_KERNEL , nid); + } +if (WARN_ON_ONCE (!new_hub)) {/* do not kfree() bid 0, which is statically allocated */ while (--bid >0 )
Greg Kroah-Hartman
maintainerPATCH 197/220 binfmt_elf_fdpic: fix AUXV size calculation for ELF_HWCAP3 and ELF_HWCAP4
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrei Vagin <[email protected]>
[ Upstream commit 4ced4cf5c9d172d91f181df3accdf949d3761aab ]
Commit 4e6e8c2b757f ("binfmt_elf: Wire up AT_HWCAP3 at AT_HWCAP4") added support for AT_HWCAP3 and AT_HWCAP4, but it missed updating the AUX vector size calculation in create_elf_fdpic_tables() and AT_VECTOR_SIZE_BASE in include/linux/auxvec.h.
Similar to the fix for AT_HWCAP2 in commit c6a09e342f8e ("binfmt_elf_fdpic:
fix AUXV size calculation when ELF_HWCAP2 is defined"), this omission leads to a mismatch between the reserved space and the actual number of AUX entries, eventually triggering a kernel BUG_ON(csp != sp).
Fix this by incrementing nitems when ELF_HWCAP3 or ELF_HWCAP4 are defined and updating AT_VECTOR_SIZE_BASE.
--- fs/binfmt_elf_fdpic.c | 6 ++++++ include/linux/auxvec.h | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-)
fs/binfmt_elf_fdpic.c +6 -0
@@ -595,6 +595,12 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,#ifdef ELF_HWCAP2 nitems++;#endif +#ifdef ELF_HWCAP3 + nitems++; +#endif +#ifdef ELF_HWCAP4 + nitems++; +#endif csp = sp; sp -= nitems *2 *sizeof (unsigned long );
include/linux/auxvec.h +1 -1
@@ -4,6 +4,6 @@#include <uapi/linux/auxvec.h> -#define AT_VECTOR_SIZE_BASE 22/* NEW_AUX_ENT entries in auxiliary table */ +#define AT_VECTOR_SIZE_BASE 24/* NEW_AUX_ENT entries in auxiliary table */ /* number of "#define AT_.*" above, minus {AT_NULL, AT_IGNORE, AT_NOTELF} */ #endif /* _LINUX_AUXVEC_H */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 198/220 mtd: rawnand: serialize lock/unlock against other NAND operations
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kamal Dasu <[email protected]>
[ Upstream commit bab2bc6e850a697a23b9e5f0e21bb8c187615e95 ]
nand_lock() and nand_unlock() call into chip->ops.lock_area/unlock_area without holding the NAND device lock. On controllers that implement SET_FEATURES via multiple low-level PIO commands, these can race with concurrent UBI/UBIFS background erase/write operations that hold the device lock, resulting in cmd_pending conflicts on the NAND controller.
Add nand_get_device()/nand_release_device() around the lock/unlock operations to serialize them against all other NAND controller access.
--- drivers/mtd/nand/raw/nand_base.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/mtd/nand/raw/nand_base.c +12 -2
@@ -4737,11 +4737,16 @@ static void nand_shutdown(struct mtd_info *mtd)static int nand_lock (struct mtd_info *mtd,loff_t ofs,uint64_t len) {struct nand_chip *chip =mtd_to_nand (mtd); +int ret;if (!chip->ops.lock_area)return -ENOTSUPP ; -return chip->ops.lock_area (chip, ofs, len); +nand_get_device (chip); + ret = chip->ops.lock_area (chip, ofs, len); +nand_release_device (chip); + +return ret; }/**
@@ -4753,11 +4758,16 @@ static int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)static int nand_unlock (struct mtd_info *mtd,loff_t ofs,uint64_t len) {struct nand_chip *chip =mtd_to_nand (mtd); +int ret;if (!chip->ops.unlock_area)return -ENOTSUPP ; -return chip->ops.unlock_area (chip, ofs, len); +nand_get_device (chip); + ret = chip->ops.unlock_area (chip, ofs, len); +nand_release_device (chip); + +return ret; }/* Set default functions */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 199/220 mtd: rawnand: brcmnand: skip DMA during panic write
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kamal Dasu <[email protected]>
[ Upstream commit da9ba4dcc01e7cf52b7676f0ee9607b8358c2171 ]
When oops_panic_write is set, the driver disables interrupts and switches to PIO polling mode but still falls through into the DMA path. DMA cannot be used reliably in panic context, so make the DMA path an else branch to ensure only PIO is used during panic writes.
--- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/mtd/nand/raw/brcmnand/brcmnand.c +2 -4
@@ -2350,14 +2350,12 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip,for (i =0 ; i < ctrl->max_oob; i +=4 )oob_reg_write (ctrl, i,0xffffffff ); -if (mtd->oops_panic_write) +if (mtd->oops_panic_write) {/* switch to interrupt polling and PIO mode */ disable_ctrl_irqs (ctrl); - -if (use_dma (ctrl) && (has_edu (ctrl) || !oob) &&flash_dma_buf_ok (buf)) { + }else if (use_dma (ctrl) && (has_edu (ctrl) || !oob) &&flash_dma_buf_ok (buf)) {if (ctrl->dma_trans (host, addr, (u32 *)buf, oob, mtd->writesize,CMD_PROGRAM_PAGE )) - ret = -EIO ; goto out;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 200/220 x86/hyperv: Use __naked attribute to fix stackless C function
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Upstream commit 3fde5281b805370a6c3bd2ef462ebff70a0ea2c6 ]
hv_crash_c_entry() is a C function that is entered without a stack, and this is only allowed for functions that have the __naked attribute, which informs the compiler that it must not emit the usual prologue and epilogue or emit any other kind of instrumentation that relies on a stack frame.
So split up the function, and set the __naked attribute on the initial part that sets up the stack, GDT, IDT and other pieces that are needed for ordinary C execution. Given that function calls are not permitted either, use the existing long return coded in an asm() block to call the second part of the function, which is an ordinary function that is permitted to call other functions as usual.
--- arch/x86/hyperv/hv_crash.c | 82 ++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 39 deletions(-)
arch/x86/hyperv/hv_crash.c +43 -39
@@ -107,14 +107,12 @@ static void __noreturn hv_panic_timeout_reboot(void)cpu_relax (); } -/* This cannot be inlined as it needs stack */ -static noinline __noclone void hv_crash_restore_tss(void) +static void hv_crash_restore_tss (void ) {load_TR_desc (); } -/* This cannot be inlined as it needs stack */ -static noinline void hv_crash_clear_kernpt(void) +static void hv_crash_clear_kernpt (void ) {pgd_t *pgd;p4d_t *p4d;
@@ -125,6 +123,25 @@ static noinline void hv_crash_clear_kernpt(void)native_p4d_clear (p4d); } + +static void __noreturn hv_crash_handle (void ) +{ +hv_crash_restore_tss (); +hv_crash_clear_kernpt (); + +/* we are now fully in devirtualized normal kernel mode */ +__crash_kexec (NULL ); + +hv_panic_timeout_reboot (); +} + +/* +* __naked functions do not permit function calls, not even to __always_inline +* functions that only contain asm() blocks themselves. So use a macro instead. +*/ +#define hv_wrmsr (msr, val) \ + asm volatile("wrmsr" :: "c"(msr), "a"((u32)val), "d"((u32)(val >> 32)) : "memory") +/* * This is the C entry point from the asm glue code after the disable hypercall. * We enter here in IA32-e long mode, ie, full 64bit mode running on kernel
@@ -133,51 +150,38 @@ static noinline void hv_crash_clear_kernpt(void)* available. We restore kernel GDT, and rest of the context, and continue * to kexec. */ -static asmlinkage void __noreturn hv_crash_c_entry(void) +static void __naked hv_crash_c_entry (void ) { -struct hv_crash_ctxt *ctxt = &hv_crash_ctxt; -/* first thing, restore kernel gdt */ -native_load_gdt (&ctxt->gdtr); + asmvolatile ("lgdt %0" : :"m" (hv_crash_ctxt.gdtr)); - asmvolatile ("movw %%ax, %%ss" : :"a" (ctxt->ss)); - asmvolatile ("movq %0, %%rsp" : :"m" (ctxt->rsp)); + asmvolatile ("movw %0, %%ss\n\t" +"movq %1, %%rsp" + ::"m" (hv_crash_ctxt.ss),"m" (hv_crash_ctxt.rsp)); - asmvolatile ("movw %%ax, %%ds" : :"a" (ctxt->ds)); - asmvolatile ("movw %%ax, %%es" : :"a" (ctxt->es)); - asmvolatile ("movw %%ax, %%fs" : :"a" (ctxt->fs)); - asmvolatile ("movw %%ax, %%gs" : :"a" (ctxt->gs)); + asmvolatile ("movw %0, %%ds" : :"m" (hv_crash_ctxt.ds)); + asmvolatile ("movw %0, %%es" : :"m" (hv_crash_ctxt.es)); + asmvolatile ("movw %0, %%fs" : :"m" (hv_crash_ctxt.fs)); + asmvolatile ("movw %0, %%gs" : :"m" (hv_crash_ctxt.gs)); -native_wrmsrq (MSR_IA32_CR_PAT , ctxt->pat); - asmvolatile ("movq %0, %%cr0" : :"r" (ctxt->cr0)); +hv_wrmsr (MSR_IA32_CR_PAT , hv_crash_ctxt.pat); + asmvolatile ("movq %0, %%cr0" : :"r" (hv_crash_ctxt.cr0)); - asmvolatile ("movq %0, %%cr8" : :"r" (ctxt->cr8)); - asmvolatile ("movq %0, %%cr4" : :"r" (ctxt->cr4)); - asmvolatile ("movq %0, %%cr2" : :"r" (ctxt->cr4)); + asmvolatile ("movq %0, %%cr8" : :"r" (hv_crash_ctxt.cr8)); + asmvolatile ("movq %0, %%cr4" : :"r" (hv_crash_ctxt.cr4)); + asmvolatile ("movq %0, %%cr2" : :"r" (hv_crash_ctxt.cr2)); -native_load_idt (&ctxt->idtr); -native_wrmsrq (MSR_GS_BASE , ctxt->gsbase); -native_wrmsrq (MSR_EFER , ctxt->efer); + asmvolatile ("lidt %0" : :"m" (hv_crash_ctxt.idtr)); +hv_wrmsr (MSR_GS_BASE , hv_crash_ctxt.gsbase); +hv_wrmsr (MSR_EFER , hv_crash_ctxt.efer);/* restore the original kernel CS now via far return */ - asmvolatile ("movzwq %0, %%rax\n\t" -"pushq %%rax\n\t" -"pushq $1f\n\t" -"lretq\n\t" -"1:nop\n\t" : :"m" (ctxt->cs) :"rax" ); - -/* We are in asmlinkage without stack frame, hence make C function -* calls which will buy stack frames. -*/ -hv_crash_restore_tss (); -hv_crash_clear_kernpt (); - -/* we are now fully in devirtualized normal kernel mode */ -__crash_kexec (NULL ); - -hv_panic_timeout_reboot (); + asmvolatile ("pushq %q0\n\t" +"pushq %q1\n\t" +"lretq" + ::"r" (hv_crash_ctxt.cs),"r" (hv_crash_handle)); } -/* Tell gcc we are using lretq long jump in the above function intentionally */ +/* Tell objtool we are using lretq long jump in the above function intentionally */ STACK_FRAME_NON_STANDARD (hv_crash_c_entry);static void hv_mark_tss_not_busy (void )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 201/220 arm_mpam: Fix null pointer dereference when restoring bandwidth counters
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Horgan <[email protected]>
[ Upstream commit 4ad79c874e53ebb7fe3b8ae7ac6c858a2121f415 ]
When an MSC supporting memory bandwidth monitoring is brought offline and then online, mpam_restore_mbwu_state() calls __ris_msmon_read() via ipi to restore the configuration of the bandwidth counters. It doesn't care about the value read, mbwu_arg.val, and doesn't set it leading to a null pointer dereference when __ris_msmon_read() adds to it. This results in a kernel oops with a call trace such as:
Call trace: __ris_msmon_read+0x19c/0x64c (P) mpam_restore_mbwu_state+0xa0/0xe8 smp_call_on_cpu_callback+0x1c/0x38 process_one_work+0x154/0x4b4 worker_thread+0x188/0x310 kthread+0x11c/0x130 ret_from_fork+0x10/0x20
Provide a local variable for val to avoid __ris_msmon_read() dereferencing a null pointer when adding to val.
--- drivers/resctrl/mpam_devices.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/resctrl/mpam_devices.c +2 -0
@@ -1428,6 +1428,7 @@ static void mpam_reprogram_ris_partid(struct mpam_msc_ris *ris, u16 partid,static int mpam_restore_mbwu_state (void *_ris) {int i; +u64 val;struct mon_read mwbu_arg;struct mpam_msc_ris *ris = _ris;struct mpam_class *class = ris->vmsc->comp->class;
@@ -1437,6 +1438,7 @@ static int mpam_restore_mbwu_state(void *_ris) mwbu_arg.ris = ris; mwbu_arg.ctx = &ris->mbwu_state[i].cfg; mwbu_arg.type =mpam_msmon_choose_counter (class); + mwbu_arg.val = &val;__ris_msmon_read (&mwbu_arg); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 202/220 mshv: Fix use-after-free in mshv_map_user_memory error path
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanislav Kinsburskii <[email protected]>
[ Upstream commit 6922db250422a0dfee34de322f86b7a73d713d33 ]
In the error path of mshv_map_user_memory(), calling vfree() directly on the region leaves the MMU notifier registered. When userspace later unmaps the memory, the notifier fires and accesses the freed region, causing a use-after-free and potential kernel panic.
Replace vfree() with mshv_partition_put() to properly unregister the MMU notifier before freeing the region.
--- drivers/hv/mshv_root_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hv/mshv_root_main.c +1 -1
@@ -1334,7 +1334,7 @@ mshv_map_user_memory(struct mshv_partition *partition,return 0 ; errout: -vfree (region); +mshv_region_put (region);return ret; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 203/220 spi: amlogic: spifc-a4: Remove redundant clock cleanup
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit a00da54d06f435dbbeacb84f9121dbbe6d6eda74 ]
The driver uses devm_clk_get_enabled() which enables the clock and registers a callback to automatically disable it when the device is unbound.
Remove the redundant aml_sfc_disable_clk() call in the error paths and remove callback.
--- drivers/spi/spi-amlogic-spifc-a4.c | 46 +++++------------------------- 1 file changed, 7 insertions(+), 39 deletions(-)
drivers/spi/spi-amlogic-spifc-a4.c +7 -39
@@ -1083,14 +1083,6 @@ static int aml_sfc_clk_init(struct aml_sfc *sfc)return clk_set_rate (sfc->core_clk,SFC_BUS_DEFAULT_CLK ); } -static int aml_sfc_disable_clk (struct aml_sfc *sfc) -{ -clk_disable_unprepare (sfc->core_clk); -clk_disable_unprepare (sfc->gate_clk); - -return 0 ; -} -static int aml_sfc_probe (struct platform_device *pdev) {struct device_node *np = pdev->dev.of_node;
@@ -1141,16 +1133,12 @@ static int aml_sfc_probe(struct platform_device *pdev)/* Enable Amlogic flash controller spi mode */ ret =regmap_write (sfc->regmap_base,SFC_SPI_CFG ,SPI_MODE_EN ); -if (ret) { -dev_err (dev,"failed to enable SPI mode\n" ); - goto err_out; - } +if (ret) +return dev_err_probe (dev, ret,"failed to enable SPI mode\n" ); ret =dma_set_mask (sfc->dev,DMA_BIT_MASK (32 )); -if (ret) { -dev_err (sfc->dev,"failed to set dma mask\n" ); - goto err_out; - } +if (ret) +return dev_err_probe (sfc->dev, ret,"failed to set dma mask\n" ); sfc->ecc_eng.dev = &pdev->dev; sfc->ecc_eng.integration =NAND_ECC_ENGINE_INTEGRATION_PIPELINED ;
@@ -1158,10 +1146,8 @@ static int aml_sfc_probe(struct platform_device *pdev) sfc->ecc_eng.priv = sfc; ret =nand_ecc_register_on_host_hw_engine (&sfc->ecc_eng); -if (ret) { -dev_err (&pdev->dev,"failed to register Aml host ecc engine.\n" ); - goto err_out; - } +if (ret) +return dev_err_probe (&pdev->dev, ret,"failed to register Aml host ecc engine.\n" ); ret =of_property_read_u32 (np,"amlogic,rx-adj" , &val);if (!ret)
@@ -1177,24 +1163,7 @@ static int aml_sfc_probe(struct platform_device *pdev) ctrl->min_speed_hz =SFC_MIN_FREQUENCY ; ctrl->num_chipselect =SFC_MAX_CS_NUM ; - ret =devm_spi_register_controller (dev, ctrl); -if (ret) - goto err_out; - -return 0 ; - -err_out: -aml_sfc_disable_clk (sfc); - -return ret; -} - -static void aml_sfc_remove (struct platform_device *pdev) -{ -struct spi_controller *ctlr =platform_get_drvdata (pdev); -struct aml_sfc *sfc =spi_controller_get_devdata (ctlr); - -aml_sfc_disable_clk (sfc); +return devm_spi_register_controller (dev, ctrl); }static const struct of_device_id aml_sfc_of_match[] = {
@@ -1212,7 +1181,6 @@ static struct platform_driver aml_sfc_driver = { .of_match_table = aml_sfc_of_match, }, .probe = aml_sfc_probe, - .remove = aml_sfc_remove, };module_platform_driver (aml_sfc_driver);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 204/220 spi: amlogic-spisg: Fix memory leak in aml_spisg_probe()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit b8db9552997924b750e727a625a30eaa4603bbb9 ]
In aml_spisg_probe(), ctlr is allocated by spi_alloc_target()/spi_alloc_host(), but fails to call spi_controller_put() in several error paths. This leads to a memory leak whenever the driver fails to probe after the initial allocation.
Convert to use devm_spi_alloc_host()/devm_spi_alloc_target() to fix the memory leak.
--- drivers/spi/spi-amlogic-spisg.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
drivers/spi/spi-amlogic-spisg.c +4 -8
@@ -729,9 +729,9 @@ static int aml_spisg_probe(struct platform_device *pdev) };if (of_property_read_bool (dev->of_node,"spi-slave" )) - ctlr =spi_alloc_target (dev,sizeof (*spisg)); + ctlr =devm_spi_alloc_target (dev,sizeof (*spisg));else - ctlr =spi_alloc_host (dev,sizeof (*spisg)); + ctlr =devm_spi_alloc_host (dev,sizeof (*spisg));if (!ctlr)return -ENOMEM ;
@@ -750,10 +750,8 @@ static int aml_spisg_probe(struct platform_device *pdev)return dev_err_probe (dev,PTR_ERR (spisg->map),"regmap init failed\n" ); irq =platform_get_irq (pdev,0 ); -if (irq <0 ) { - ret = irq; - goto out_controller; - } +if (irq <0 ) +return irq; ret =device_reset_optional (dev);if (ret)
@@ -818,8 +816,6 @@ static int aml_spisg_probe(struct platform_device *pdev)if (spisg->core)clk_disable_unprepare (spisg->core);clk_disable_unprepare (spisg->pclk); -out_controller: -spi_controller_put (ctlr);return ret; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 205/220 drm/vmwgfx: Dont overwrite KMS surface dirty tracker
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Forbes <[email protected]>
[ Upstream commit c6cb77c474a32265e21c4871c7992468bf5e7638 ]
We were overwriting the surface's dirty tracker here causing a memory leak.
--- drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +2 -1
@@ -771,7 +771,8 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev, ret =vmw_bo_dirty_add (bo);if (!ret && surface && surface->res.func->dirty_alloc) { surface->res.coherent = true; - ret = surface->res.func->dirty_alloc (&surface->res); +if (surface->res.dirty ==NULL ) + ret = surface->res.func->dirty_alloc (&surface->res); }ttm_bo_unreserve (&bo->tbo); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 206/220 iommu: Fix mapping check for 0x0 to avoid re-mapping it
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antheas Kapenekakis <[email protected]>
[ Upstream commit 0a4d00e2e99a39a5698e4b63c394415dcbb39d90 ]
Commit 789a5913b29c ("iommu/amd: Use the generic iommu page table") introduces the shared iommu page table for AMD IOMMU. Some bioses contain an identity mapping for address 0x0, which is not parsed properly (e.g., certain Strix Halo devices). This causes the DMA components of the device to fail to initialize (e.g., the NVMe SSD controller), leading to a failed post.
Specifically, on the GPD Win 5, the NVME and SSD GPU fail to mount, making collecting errors difficult. While debugging, it was found that a -EADDRINUSE error was emitted and its source was traced to iommu_iova_to_phys(). After adding some debug prints, it was found that phys_addr becomes 0, which causes the code to try to re-map the 0 address and fail, causing a cascade leading to a failed post. This is because the GPD Win 5 contains a 0x0-0x1 identity mapping for DMA devices, causing it to be repeated for each device.
The cause of this failure is the following check in iommu_create_device_direct_mappings(), where address aliasing is handled via the following check:
```
phys_addr = iommu_iova_to_phys(domain, addr);
if (!phys_addr) {
map_size += pg_size;
continue;
}
````Obviously, the iommu_iova_to_phys() signature is faulty and aliases unmapped and 0 together, causing the allocation code to try to re-allocate the 0 address per device. However, it has too many instantiations to fix. Therefore, use a ternary so that when addr is 0, the check is done for address 1 instead.
--- drivers/iommu/iommu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/iommu/iommu.c +5 -1
@@ -1207,7 +1207,11 @@ static int iommu_create_device_direct_mappings(struct iommu_domain *domain,if (addr == end) goto map_end; - phys_addr =iommu_iova_to_phys (domain, addr); +/* +* Return address by iommu_iova_to_phys for 0 is +* ambiguous. Offset to address 1 if addr is 0. +*/ + phys_addr =iommu_iova_to_phys (domain, addr ? addr :1 );if (!phys_addr) { map_size += pg_size;continue ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 207/220 iommu/sva: Fix crash in iommu_sva_unbind_device()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lizhi Hou <[email protected]>
[ Upstream commit 06e14c36e20b48171df13d51b89fe67c594ed07a ]
domain->mm->iommu_mm can be freed by iommu_domain_free():
iommu_domain_free()
mmdrop()
__mmdrop()
mm_pasid_drop()After iommu_domain_free() returns, accessing domain->mm->iommu_mm may dereference a freed mm structure, leading to a crash.
Fix this by moving the code that accesses domain->mm->iommu_mm to before the call to iommu_domain_free().
--- drivers/iommu/iommu-sva.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/iommu/iommu-sva.c +6 -6
@@ -182,13 +182,13 @@ void iommu_sva_unbind_device(struct iommu_sva *handle)iommu_detach_device_pasid (domain, dev, iommu_mm->pasid);if (--domain->users ==0 ) {list_del (&domain->next); -iommu_domain_free (domain); - } +if (list_empty (&iommu_mm->sva_domains)) { +list_del (&iommu_mm->mm_list_elm); +if (list_empty (&iommu_sva_mms)) + iommu_sva_present = false; + } -if (list_empty (&iommu_mm->sva_domains)) { -list_del (&iommu_mm->mm_list_elm); -if (list_empty (&iommu_sva_mms)) - iommu_sva_present = false; +iommu_domain_free (domain); }mutex_unlock (&iommu_sva_lock);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 208/220 iommu/amd: Block identity domain when SNP enabled
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joe Damato <[email protected]>
[ Upstream commit ba17de98545d07285d15ce4fe2afe98283338fb0 ]
Previously, commit 8388f7df936b ("iommu/amd: Do not support IOMMU_DOMAIN_IDENTITY after SNP is enabled") prevented users from changing the IOMMU domain to identity if SNP was enabled.
This resulted in an error when writing to sysfs:
# echo "identity" > /sys/kernel/iommu_groups/50/type -bash: echo: write error: Cannot allocate memory
However, commit 4402f2627d30 ("iommu/amd: Implement global identity domain") changed the flow of the code, skipping the SNP guard and allowing users to change the IOMMU domain to identity after a machine has booted.
Once the user does that, they will probably try to bind and the device/driver will start to do DMA which will trigger errors:
iommu ivhd3: AMD-Vi: Event logged [ILLEGAL_DEV_TABLE_ENTRY device=0000:43:00.0 pasid=0x00000 address=0x3737b01000 flags=0x0020] iommu ivhd3: AMD-Vi: Control Reg : 0xc22000142148d
AMD-Vi: DTE[0]: 6000000000000003
AMD-Vi: DTE[1]: 0000000000000001
AMD-Vi: DTE[2]: 2000003088b3e013
AMD-Vi: DTE[3]: 0000000000000000
bnxt_en 0000:43:00.0 (unnamed net_device) (uninitialized): Error (timeout: 500015) msg {0x0 0x0} len:0 iommu ivhd3: AMD-Vi: Event logged [ILLEGAL_DEV_TABLE_ENTRY device=0000:43:00.0 pasid=0x00000 address=0x3737b01000 flags=0x0020] iommu ivhd3: AMD-Vi: Control Reg : 0xc22000142148d
AMD-Vi: DTE[0]: 6000000000000003
AMD-Vi: DTE[1]: 0000000000000001
AMD-Vi: DTE[2]: 2000003088b3e013
AMD-Vi: DTE[3]: 0000000000000000
bnxt_en 0000:43:00.0: probe with driver bnxt_en failed with error -16
To prevent this from happening, create an attach wrapper for identity_domain_ops which returns EINVAL if amd_iommu_snp_en is true.
With this commit applied:
# echo "identity" > /sys/kernel/iommu_groups/62/type -bash: echo: write error: Invalid argument
--- drivers/iommu/amd/iommu.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/iommu/amd/iommu.c +14 -1
@@ -2854,8 +2854,21 @@ static struct iommu_domain blocked_domain = {static struct protection_domain identity_domain; +static int amd_iommu_identity_attach (struct iommu_domain *dom,struct device *dev, +struct iommu_domain *old) +{ +/* +* Don't allow attaching a device to the identity domain if SNP is +* enabled. +*/ +if (amd_iommu_snp_en) +return -EINVAL ; + +return amd_iommu_attach_device (dom, dev, old); +} +static const struct iommu_domain_ops identity_domain_ops = { - .attach_dev = amd_iommu_attach_device, + .attach_dev = amd_iommu_identity_attach, };void amd_iommu_init_identity_domain (void )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 209/220 drm/amd/display: Fix DisplayID not-found handling in parse_edid_displayid_vrr()
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit 2323b019651ad81c20a0f7f817c63392b3110652 ]
parse_edid_displayid_vrr() searches the EDID extension blocks for a DisplayID extension before parsing the dynamic video timing range.
The code previously checked whether edid_ext was NULL after the search loop. However, edid_ext is assigned during each iteration of the loop, so it will never be NULL once the loop has executed. If no DisplayID extension is found, edid_ext ends up pointing to the last extension block, and the NULL check does not correctly detect the failure case.
Instead, check whether the loop completed without finding a matching DisplayID block by testing "i == edid->extensions". This ensures the function exits early when no DisplayID extension is present and avoids parsing an unrelated EDID extension block.
Also simplify the EDID validation check using "!edid || !edid->extensions".
Fixes the below:drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:13079 parse_edid_displayid_vrr() warn: variable dereferenced before check 'edid_ext' (see line 13075)
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +2 -2
@@ -13101,7 +13101,7 @@ static void parse_edid_displayid_vrr(struct drm_connector *connector,u16 min_vfreq;u16 max_vfreq; -if (edid ==NULL || edid->extensions ==0 ) +if (!edid || !edid->extensions)return ;/* Find DisplayID extension */
@@ -13111,7 +13111,7 @@ static void parse_edid_displayid_vrr(struct drm_connector *connector,break ; } -if (edid_ext ==NULL ) +if (i == edid->extensions)return ;while (j <EDID_LENGTH ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 210/220 drm/amd: fix dcn 2.01 check
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Nguyen <[email protected]>
[ Upstream commit 39f44f54afa58661ecae9c27e15f5dbce2372892 ]
The ASICREV_IS_BEIGE_GOBY_P check always took precedence, because it includes all chip revisions upto NV_UNKNOWN.
--- drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/display/dc/clk_mgr/clk_mgr.c +4 -4
@@ -255,6 +255,10 @@ struct clk_mgr *dc_clk_mgr_create(struct dc_context *ctx, struct pp_smu_funcs *pBREAK_TO_DEBUGGER ();return NULL ; } +if (ctx->dce_version ==DCN_VERSION_2_01 ) { +dcn201_clk_mgr_construct (ctx, clk_mgr, pp_smu, dccg); +return &clk_mgr->base; + }if (ASICREV_IS_SIENNA_CICHLID_P (asic_id.hw_internal_rev)) {dcn3_clk_mgr_construct (ctx, clk_mgr, pp_smu, dccg);return &clk_mgr->base;
@@ -267,10 +271,6 @@ struct clk_mgr *dc_clk_mgr_create(struct dc_context *ctx, struct pp_smu_funcs *pdcn3_clk_mgr_construct (ctx, clk_mgr, pp_smu, dccg);return &clk_mgr->base; } -if (ctx->dce_version ==DCN_VERSION_2_01 ) { -dcn201_clk_mgr_construct (ctx, clk_mgr, pp_smu, dccg); -return &clk_mgr->base; - }dcn20_clk_mgr_construct (ctx, clk_mgr, pp_smu, dccg);return &clk_mgr->base; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 211/220 drm/bridge: dw-hdmi-qp: fix multi-channel audio output
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Karlman <[email protected]>
[ Upstream commit cffcb42c57686e9a801dfcf37a3d0c62e51c1c3e ]
Channel Allocation (PB4) and Level Shift Information (PB5) are configured with values from PB1 and PB2 due to the wrong offset being used. This results in missing audio channels or incorrect speaker placement when playing multi-channel audio.
Use the correct offset to fix multi-channel audio output.
--- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +1 -1
@@ -838,7 +838,7 @@ static int dw_hdmi_qp_config_audio_infoframe(struct dw_hdmi_qp *hdmi,regmap_bulk_write (hdmi->regm,PKT_AUDI_CONTENTS0 , &header_bytes,1 );regmap_bulk_write (hdmi->regm,PKT_AUDI_CONTENTS1 , &buffer[3 ],1 ); -regmap_bulk_write (hdmi->regm,PKT_AUDI_CONTENTS2 , &buffer[4 ],1 ); +regmap_bulk_write (hdmi->regm,PKT_AUDI_CONTENTS2 , &buffer[7 ],1 );/* Enable ACR, AUDI, AMD */ dw_hdmi_qp_mod(hdmi,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 212/220 ksmbd: fix use-after-free of share_conf in compound request
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hyunwoo Kim <[email protected]>
[ Upstream commit c33615f995aee80657b9fdfbc4ee7f49c2bd733d ]
smb2_get_ksmbd_tcon() reuses work->tcon in compound requests without validating tcon->t_state. ksmbd_tree_conn_lookup() checks t_state == TREE_CONNECTED on the initial lookup path, but the compound reuse path bypasses this check entirely.
If a prior command in the compound (SMB2_TREE_DISCONNECT) sets t_state to TREE_DISCONNECTED and frees share_conf via ksmbd_share_config_put(), subsequent commands dereference the freed share_conf through work->tcon->share_conf.
KASAN report:
[ 4.144653] ================================================================== [ 4.145059] BUG: KASAN: slab-use-after-free in smb2_write+0xc74/0xe70 [ 4.145415] Read of size 4 at addr ffff88810430c194 by task kworker/1:1/44 [ 4.145772] [ 4.145867] CPU: 1 UID: 0 PID: 44 Comm: kworker/1:1 Not tainted 7.0.0-rc3+ #60 PREEMPTLAZY [ 4.145871] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 4.145875] Workqueue: ksmbd-io handle_ksmbd_work [ 4.145888] Call Trace: [ 4.145892] <TASK> [ 4.145894] dump_stack_lvl+0x64/0x80 [ 4.145910] print_report+0xce/0x660 [ 4.145919] ? __pfx__raw_spin_lock_irqsave+0x10/0x10 [ 4.145928] ? smb2_write+0xc74/0xe70 [ 4.145931] kasan_report+0xce/0x100 [ 4.145934] ? smb2_write+0xc74/0xe70 [ 4.145937] smb2_write+0xc74/0xe70 [ 4.145939] ? __pfx_smb2_write+0x10/0x10 [ 4.145942] ? _raw_spin_unlock+0xe/0x30 [ 4.145945] ? ksmbd_smb2_check_message+0xeb2/0x24c0 [ 4.145948] ? smb2_tree_disconnect+0x31c/0x480 [ 4.145951] handle_ksmbd_work+0x40f/0x1080 [ 4.145953] process_one_work+0x5fa/0xef0 [ 4.145962] ? assign_work+0x122/0x3e0 [ 4.145964] worker_thread+0x54b/0xf70 [ 4.145967] ? __pfx_worker_thread+0x10/0x10 [ 4.145970] kthread+0x346/0x470 [ 4.145976] ? recalc_sigpending+0x19b/0x230 [ 4.145980] ? __pfx_kthread+0x10/0x10 [ 4.145984] ret_from_fork+0x4fb/0x6c0 [ 4.145992] ? __pfx_ret_from_fork+0x10/0x10 [ 4.145995] ? __switch_to+0x36c/0xbe0 [ 4.145999] ? __pfx_kthread+0x10/0x10 [ 4.146003] ret_from_fork_asm+0x1a/0x30 [ 4.146013] </TASK> [ 4.146014] [ 4.149858] Allocated by task 44: [ 4.149953] kasan_save_stack+0x33/0x60 [ 4.150061] kasan_save_track+0x14/0x30 [ 4.150169] __kasan_kmalloc+0x8f/0xa0 [ 4.150274] ksmbd_share_config_get+0x1dd/0xdd0 [ 4.150401] ksmbd_tree_conn_connect+0x7e/0x600 [ 4.150529] smb2_tree_connect+0x2e6/0x1000 [ 4.150645] handle_ksmbd_work+0x40f/0x1080 [ 4.150761] process_one_work+0x5fa/0xef0 [ 4.150873] worker_thread+0x54b/0xf70 [ 4.150978] kthread+0x346/0x470 [ 4.151071] ret_from_fork+0x4fb/0x6c0 [ 4.151176] ret_from_fork_asm+0x1a/0x30 [ 4.151286] [ 4.151332] Freed by task 44: [ 4.151418] kasan_save_stack+0x33/0x60 [ 4.151526] kasan_save_track+0x14/0x30 [ 4.151634] kasan_save_free_info+0x3b/0x60 [ 4.151751] __kasan_slab_free+0x43/0x70 [ 4.151861] kfree+0x1ca/0x430 [ 4.151952] __ksmbd_tree_conn_disconnect+0xc8/0x190 [ 4.152088] smb2_tree_disconnect+0x1cd/0x480 [ 4.152211] handle_ksmbd_work+0x40f/0x1080 [ 4.152326] process_one_work+0x5fa/0xef0 [ 4.152438] worker_thread+0x54b/0xf70 [ 4.152545] kthread+0x346/0x470 [ 4.152638] ret_from_fork+0x4fb/0x6c0 [ 4.152743] ret_from_fork_asm+0x1a/0x30 [ 4.152853] [ 4.152900] The buggy address belongs to the object at ffff88810430c180 [ 4.152900] which belongs to the cache kmalloc-96 of size 96 [ 4.153226] The buggy address is located 20 bytes inside of [ 4.153226] freed 96-byte region [ffff88810430c180, ffff88810430c1e0) [ 4.153549] [ 4.153596] The buggy address belongs to the physical page: [ 4.153750] page: refcount:0 mapcount:0 mapping:0000000000000000 index:0xffff88810430ce80 pfn:0x10430c [ 4.154000] flags: 0x100000000000200(workingset|node=0|zone=2) [ 4.154160] page_type: f5(slab) [ 4.154251] raw: 0100000000000200 ffff888100041280 ffff888100040110 ffff888100040110 [ 4.154461] raw: ffff88810430ce80 0000000800200009 00000000f5000000 0000000000000000 [ 4.154668] page dumped because: kasan: bad access detected [ 4.154820] [ 4.154866] Memory state around the buggy address: [ 4.155002] ffff88810430c080: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 4.155196] ffff88810430c100: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 4.155391] >ffff88810430c180: fa fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc [ 4.155587] ^ [ 4.155693] ffff88810430c200: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 4.155891] ffff88810430c280: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 4.156087] ==================================================================
Add the same t_state validation to the compound reuse path, consistent with ksmbd_tree_conn_lookup().
--- fs/smb/server/smb2pdu.c | 2 ++ 1 file changed, 2 insertions(+)
fs/smb/server/smb2pdu.c +2 -0
@@ -125,6 +125,8 @@ int smb2_get_ksmbd_tcon(struct ksmbd_work *work)pr_err ("The first operation in the compound does not have tcon\n" );return -EINVAL ; } +if (work->tcon->t_state !=TREE_CONNECTED ) +return -ENOENT ;if (tree_id !=UINT_MAX && work->tcon->id != tree_id) {pr_err ("tree id(%u) is different with id(%u) in first operation\n" , tree_id, work->tcon->id);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 213/220 ksmbd: fix use-after-free in durable v2 replay of active file handles
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hyunwoo Kim <[email protected]>
[ Upstream commit b425e4d0eb321a1116ddbf39636333181675d8f4 ]
parse_durable_handle_context() unconditionally assigns dh_info->fp->conn to the current connection when handling a DURABLE_REQ_V2 context with SMB2_FLAGS_REPLAY_OPERATION. ksmbd_lookup_fd_cguid() does not filter by fp->conn, so it returns file handles that are already actively connected. The unconditional overwrite replaces fp->conn, and when the overwriting connection is subsequently freed, __ksmbd_close_fd() dereferences the stale fp->conn via spin_lock(&fp->conn->llist_lock), causing a use-after-free.
KASAN report:
[ 7.349357] ================================================================== [ 7.349607] BUG: KASAN: slab-use-after-free in _raw_spin_lock+0x75/0xe0 [ 7.349811] Write of size 4 at addr ffff8881056ac18c by task kworker/1:2/108 [ 7.350010] [ 7.350064] CPU: 1 UID: 0 PID: 108 Comm: kworker/1:2 Not tainted 7.0.0-rc3+ #58 PREEMPTLAZY [ 7.350068] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [ 7.350070] Workqueue: ksmbd-io handle_ksmbd_work [ 7.350083] Call Trace: [ 7.350087] <TASK> [ 7.350087] dump_stack_lvl+0x64/0x80 [ 7.350094] print_report+0xce/0x660 [ 7.350100] ? __pfx__raw_spin_lock_irqsave+0x10/0x10 [ 7.350101] ? __pfx___mod_timer+0x10/0x10 [ 7.350106] ? _raw_spin_lock+0x75/0xe0 [ 7.350108] kasan_report+0xce/0x100 [ 7.350109] ? _raw_spin_lock+0x75/0xe0 [ 7.350114] kasan_check_range+0x105/0x1b0 [ 7.350116] _raw_spin_lock+0x75/0xe0 [ 7.350118] ? __pfx__raw_spin_lock+0x10/0x10 [ 7.350119] ? __call_rcu_common.constprop.0+0x25e/0x780 [ 7.350125] ? close_id_del_oplock+0x2cc/0x4e0 [ 7.350128] __ksmbd_close_fd+0x27f/0xaf0 [ 7.350131] ksmbd_close_fd+0x135/0x1b0 [ 7.350133] smb2_close+0xb19/0x15b0 [ 7.350142] ? __pfx_smb2_close+0x10/0x10 [ 7.350143] ? xas_load+0x18/0x270 [ 7.350146] ? _raw_spin_lock+0x84/0xe0 [ 7.350148] ? __pfx__raw_spin_lock+0x10/0x10 [ 7.350150] ? _raw_spin_unlock+0xe/0x30 [ 7.350151] ? ksmbd_smb2_check_message+0xeb2/0x24c0 [ 7.350153] ? ksmbd_tree_conn_lookup+0xcd/0xf0 [ 7.350154] handle_ksmbd_work+0x40f/0x1080 [ 7.350156] process_one_work+0x5fa/0xef0 [ 7.350162] ? assign_work+0x122/0x3e0 [ 7.350163] worker_thread+0x54b/0xf70 [ 7.350165] ? __pfx_worker_thread+0x10/0x10 [ 7.350166] kthread+0x346/0x470 [ 7.350170] ? recalc_sigpending+0x19b/0x230 [ 7.350176] ? __pfx_kthread+0x10/0x10 [ 7.350178] ret_from_fork+0x4fb/0x6c0 [ 7.350183] ? __pfx_ret_from_fork+0x10/0x10 [ 7.350185] ? __switch_to+0x36c/0xbe0 [ 7.350188] ? __pfx_kthread+0x10/0x10 [ 7.350190] ret_from_fork_asm+0x1a/0x30 [ 7.350197] </TASK> [ 7.350197] [ 7.355160] Allocated by task 123: [ 7.355261] kasan_save_stack+0x33/0x60 [ 7.355373] kasan_save_track+0x14/0x30 [ 7.355484] __kasan_kmalloc+0x8f/0xa0 [ 7.355593] ksmbd_conn_alloc+0x44/0x6d0 [ 7.355711] ksmbd_kthread_fn+0x243/0xd70 [ 7.355839] kthread+0x346/0x470 [ 7.355942] ret_from_fork+0x4fb/0x6c0 [ 7.356051] ret_from_fork_asm+0x1a/0x30 [ 7.356164] [ 7.356214] Freed by task 134: [ 7.356305] kasan_save_stack+0x33/0x60 [ 7.356416] kasan_save_track+0x14/0x30 [ 7.356527] kasan_save_free_info+0x3b/0x60 [ 7.356646] __kasan_slab_free+0x43/0x70 [ 7.356761] kfree+0x1ca/0x430 [ 7.356862] ksmbd_tcp_disconnect+0x59/0xe0 [ 7.356993] ksmbd_conn_handler_loop+0x77e/0xd40 [ 7.357138] kthread+0x346/0x470 [ 7.357240] ret_from_fork+0x4fb/0x6c0 [ 7.357350] ret_from_fork_asm+0x1a/0x30 [ 7.357463] [ 7.357513] The buggy address belongs to the object at ffff8881056ac000 [ 7.357513] which belongs to the cache kmalloc-1k of size 1024 [ 7.357857] The buggy address is located 396 bytes inside of [ 7.357857] freed 1024-byte region [ffff8881056ac000, ffff8881056ac400)
Fix by removing the unconditional fp->conn assignment and rejecting the replay when fp->conn is non-NULL. This is consistent with ksmbd_lookup_durable_fd(), which also rejects file handles with a non-NULL fp->conn. For disconnected file handles (fp->conn == NULL), ksmbd_reopen_durable_fd() handles setting fp->conn.
--- fs/smb/server/smb2pdu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/smb/server/smb2pdu.c +5 -1
@@ -2830,7 +2830,11 @@ static int parse_durable_handle_context(struct ksmbd_work *work, goto out; } - dh_info->fp->conn = conn; +if (dh_info->fp->conn) { +ksmbd_put_durable_fd (dh_info->fp); + err = -EBADF ; + goto out; + } dh_info->reconnected = true; goto out; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 214/220 drm/i915/gt: Check set_default_submission() before deferencing
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rahul Bukte <[email protected]>
[ Upstream commit 0162ab3220bac870e43e229e6e3024d1a21c3f26 ]
When the i915 driver firmware binaries are not present, the set_default_submission pointer is not set. This pointer is dereferenced during suspend anyways.
Add a check to make sure it is set before dereferencing.
[ 23.289926] PM: suspend entry (deep) [ 23.293558] Filesystems sync: 0.000 seconds [ 23.298010] Freezing user space processes [ 23.302771] Freezing user space processes completed (elapsed 0.000 seconds) [ 23.309766] OOM killer disabled. [ 23.313027] Freezing remaining freezable tasks [ 23.318540] Freezing remaining freezable tasks completed (elapsed 0.001 seconds) [ 23.342038] serial 00:05: disabled [ 23.345719] serial 00:02: disabled [ 23.349342] serial 00:01: disabled [ 23.353782] sd 0:0:0:0: [sda] Synchronizing SCSI cache [ 23.358993] sd 1:0:0:0: [sdb] Synchronizing SCSI cache [ 23.361635] ata1.00: Entering standby power mode [ 23.368863] ata2.00: Entering standby power mode [ 23.445187] BUG: kernel NULL pointer dereference, address: 0000000000000000 [ 23.452194] #PF: supervisor instruction fetch in kernel mode [ 23.457896] #PF: error_code(0x0010) - not-present page [ 23.463065] PGD 0 P4D 0 [ 23.465640] Oops: Oops: 0010 [#1] SMP NOPTI [ 23.469869] CPU: 8 UID: 0 PID: 211 Comm: kworker/u48:18 Tainted: G S W 6.19.0-rc4-00020-gf0b9d8eb98df #10 PREEMPT(voluntary) [ 23.482512] Tainted: [S]=CPU_OUT_OF_SPEC, [W]=WARN [ 23.496511] Workqueue: async async_run_entry_fn [ 23.501087] RIP: 0010:0x0 [ 23.503755] Code: Unable to access opcode bytes at 0xffffffffffffffd6. [ 23.510324] RSP: 0018:ffffb4a60065fca8 EFLAGS: 00010246 [ 23.515592] RAX: 0000000000000000 RBX: ffff9f428290e000 RCX: 000000000000000f [ 23.522765] RDX: 0000000000000000 RSI: 0000000000000282 RDI: ffff9f428290e000 [ 23.529937] RBP: ffff9f4282907070 R08: ffff9f4281130428 R09: 00000000ffffffff [ 23.537111] R10: 0000000000000000 R11: 0000000000000001 R12: ffff9f42829070f8 [ 23.544284] R13: ffff9f4282906028 R14: ffff9f4282900000 R15: ffff9f4282906b68 [ 23.551457] FS: 0000000000000000(0000) GS:ffff9f466b2cf000(0000) knlGS:0000000000000000 [ 23.559588] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 23.565365] CR2: ffffffffffffffd6 CR3: 000000031c230001 CR4: 0000000000f70ef0 [ 23.572539] PKRU: 55555554 [ 23.575281] Call Trace: [ 23.577770] <TASK> [ 23.579905] intel_engines_reset_default_submission+0x42/0x60 [ 23.585695] __intel_gt_unset_wedged+0x191/0x200 [ 23.590360] intel_gt_unset_wedged+0x20/0x40 [ 23.594675] gt_sanitize+0x15e/0x170 [ 23.598290] i915_gem_suspend_late+0x6b/0x180 [ 23.602692] i915_drm_suspend_late+0x35/0xf0 [ 23.607008] ? __pfx_pci_pm_suspend_late+0x10/0x10 [ 23.611843] dpm_run_callback+0x78/0x1c0 [ 23.615817] device_suspend_late+0xde/0x2e0 [ 23.620037] async_suspend_late+0x18/0x30 [ 23.624082] async_run_entry_fn+0x25/0xa0 [ 23.628129] process_one_work+0x15b/0x380 [ 23.632182] worker_thread+0x2a5/0x3c0 [ 23.635973] ? __pfx_worker_thread+0x10/0x10 [ 23.640279] kthread+0xf6/0x1f0 [ 23.643464] ? __pfx_kthread+0x10/0x10 [ 23.647263] ? __pfx_kthread+0x10/0x10 [ 23.651045] ret_from_fork+0x131/0x190 [ 23.654837] ? __pfx_kthread+0x10/0x10 [ 23.658634] ret_from_fork_asm+0x1a/0x30 [ 23.662597] </TASK> [ 23.664826] Modules linked in: [ 23.667914] CR2: 0000000000000000 [ 23.671271] ------------[ cut here ]------------
--- drivers/gpu/drm/i915/gt/intel_engine_cs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/intel_engine_cs.c +2 -1
@@ -1969,7 +1969,8 @@ void intel_engines_reset_default_submission(struct intel_gt *gt)if (engine->sanitize) engine->sanitize (engine); - engine->set_default_submission (engine); +if (engine->set_default_submission) + engine->set_default_submission (engine); } }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 215/220 fs/tests: exec: Remove bad test vector
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit c4192754e836e0ffed95833509b6ada975b74418 ]
Drop an unusable test in the bprm stack limits.
--- fs/tests/exec_kunit.c | 3 --- 1 file changed, 3 deletions(-)
fs/tests/exec_kunit.c +0 -3
@@ -94,9 +94,6 @@ static const struct bprm_stack_limits_result bprm_stack_limits_results[] = { { { .p = ULONG_MAX, .rlim_stack.rlim_cur = 4 * (_STK_LIM / 4 * 3 + sizeof(void *)), .argc = 0, .envc = 0 }, .expected_argmin = ULONG_MAX - (_STK_LIM / 4 * 3) + sizeof(void *) }, - { { .p = ULONG_MAX, .rlim_stack.rlim_cur = 4 * (_STK_LIM / 4 * + sizeof(void *)), - .argc = 0, .envc = 0 }, - .expected_argmin = ULONG_MAX - (_STK_LIM / 4 * 3) + sizeof(void *) }, { { .p = ULONG_MAX, .rlim_stack.rlim_cur = 4 * _STK_LIM, .argc = 0, .envc = 0 }, .expected_argmin = ULONG_MAX - (_STK_LIM / 4 * 3) + sizeof(void *) },
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 216/220 lib/bootconfig: check xbc_init_node() return in override path
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Law <[email protected]>
[ Upstream commit bb288d7d869e86d382f35a0e26242c5ccb05ca82 ]
The ':=' override path in xbc_parse_kv() calls xbc_init_node() to re-initialize an existing value node but does not check the return value. If xbc_init_node() fails (data offset out of range), parsing silently continues with stale node data.
Add the missing error check to match the xbc_add_node() call path which already checks for failure.
In practice, a bootconfig using ':=' to override a value near the 32KB data limit could silently retain the old value, meaning a security-relevant boot parameter override (e.g., a trace filter or debug setting) would not take effect as intended.
--- lib/bootconfig.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
lib/bootconfig.c +2 -1
@@ -712,7 +712,8 @@ static int __init xbc_parse_kv(char **k, char *v, int op)if (op ==':' ) {unsigned short nidx = child->next; -xbc_init_node (child, v,XBC_VALUE ); +if (xbc_init_node (child, v,XBC_VALUE ) <0 ) +return xbc_parse_error ("Failed to override value" , v); child->next = nidx;/* keep subkeys */ goto array; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 217/220 tools/bootconfig: fix fd leak in load_xbc_file() on fstat failure
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Law <[email protected]>
[ Upstream commit 3b2c2ab4ceb82af484310c3087541eab00ea288b ]
If fstat() fails after open() succeeds, the function returns without closing the file descriptor. Also preserve errno across close(), since close() may overwrite it before the error is returned.
--- tools/bootconfig/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
tools/bootconfig/main.c +5 -2
@@ -162,8 +162,11 @@ static int load_xbc_file(const char *path, char **buf)if (fd <0 )return -errno; ret =fstat (fd, &stat); -if (ret <0 ) -return -errno; +if (ret <0 ) { + ret = -errno; +close (fd); +return ret; + } ret =load_xbc_fd (fd, buf, stat.st_size);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 218/220 arm64: realm: Fix PTE_NS_SHARED for 52bit PA support
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suzuki K Poulose <[email protected]>
[ Upstream commit 8c6e9b60f5c7985a9fe41320556a92d7a33451df ]
With LPA/LPA2, the top bits of the PFN (Bits[51:48]) end up in the lower bits of the PTE. So, simply creating a mask of the "top IPA bit" doesn't work well for these configurations to set the "top" bit at the output of Stage1 translation.
Fix this by using the __phys_to_pte_val() to do the right thing for all configurations.
Tested using, kvmtool, placing the memory at a higher address (-m <size>@<Addr>).
e.g:
# lkvm run --realm -c 4 -m 512M@@128T -k Image --console serial
sh-5.0# dmesg | grep "LPA2\|RSI"
[ 0.000000] RME: Using RSI version 1.0 [ 0.000000] CPU features: detected: 52-bit Virtual Addressing (LPA2) [ 0.777354] CPU features: detected: 52-bit Virtual Addressing for KVM (LPA2)
--- arch/arm64/kernel/rsi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/kernel/rsi.c +2 -1
@@ -12,6 +12,7 @@#include <asm/io.h> #include <asm/mem_encrypt.h> +#include <asm/pgtable.h> #include <asm/rsi.h> static struct realm_config config;
@@ -146,7 +147,7 @@ void __init arm64_rsi_init(void)return ;if (WARN_ON (rsi_get_realm_config (&config)))return ; - prot_ns_shared =BIT (config.ipa_bits -1 ); + prot_ns_shared =__phys_to_pte_val (BIT (config.ipa_bits -1 ));if (arm64_ioremap_prot_hook_register (realm_ioremap_hook))return ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 219/220 drm/xe/guc: Fail immediately on GuC load error
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Ceraolo Spurio <[email protected]>
[ Upstream commit 9b72283ec9b8685acdb3467de8fbc3352fdb70bb ]
By using the same variable for both the return of poll_timeout_us and the return of the polled function guc_wait_ucode, the return value of the latter is overwritten and lost after exiting the polling loop. Since guc_wait_ucode returns -1 on GuC load failure, we lose that information and always continue as if the GuC had been loaded correctly.
This is fixed by simply using 2 separate variables.
--- drivers/gpu/drm/xe/xe_guc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/xe/xe_guc.c +3 -3
@@ -1121,14 +1121,14 @@ static int guc_wait_ucode(struct xe_guc *guc)struct xe_guc_pc *guc_pc = >->uc.guc.pc;u32 before_freq, act_freq, cur_freq;u32 status =0 , tries =0 ; +int load_result, ret;ktime_t before;u64 delta_ms; -int ret; before_freq =xe_guc_pc_get_act_freq (guc_pc); before =ktime_get (); - ret =poll_timeout_us (ret =guc_load_done (gt, &status, &tries), ret, + ret =poll_timeout_us (load_result =guc_load_done (gt, &status, &tries), load_result,10 *USEC_PER_MSEC ,GUC_LOAD_TIMEOUT_SEC *USEC_PER_SEC , false);
@@ -1136,7 +1136,7 @@ static int guc_wait_ucode(struct xe_guc *guc) act_freq =xe_guc_pc_get_act_freq (guc_pc); cur_freq =xe_guc_pc_get_cur_freq_fw (guc_pc); -if (ret) { +if (ret || load_result <=0 ) {xe_gt_err (gt,"load failed: status = 0x%08X, time = %lldms, freq = %dMHz (req %dMHz)\n" , status, delta_ms,xe_guc_pc_get_act_freq (guc_pc),xe_guc_pc_get_cur_freq_fw (guc_pc));
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 220/220 hwmon: (max6639) Fix pulses-per-revolution implementation
In reply to Greg Kroah-Hartman6.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit e7bae9a7a5e1251ab414291f4e9304d702bb9221 ]
The valid range for the pulses-per-revolution devicetree property is 1..4. The current code checks for a range of 1..5. Fix it.
Declare the variable used to retrieve pulses per revolution from devicetree as u32 (unsigned) to match the of_property_read_u32() API.
The current code uses a postfix decrement when writing the pulses per resolution into the chip. This has no effect since the value is evaluated before it is decremented. Fix it by decrementing before evaluating the value.
--- drivers/hwmon/max6639.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/hwmon/max6639.c +5 -5
@@ -232,7 +232,7 @@ static int max6639_read_fan(struct device *dev, u32 attr, int channel,static int max6639_set_ppr (struct max6639_data *data,int channel,u8 ppr) {/* Decrement the PPR value and shift left by 6 to match the register format */ -return regmap_write (data->regmap,MAX6639_REG_FAN_PPR (channel), ppr-- <<6 ); +return regmap_write (data->regmap,MAX6639_REG_FAN_PPR (channel), --ppr <<6 ); } static int max6639_write_fan(struct device *dev, u32 attr, int channel,
@@ -524,8 +524,8 @@ static int max6639_probe_child_from_dt(struct i2c_client *client, {struct device *dev = &client->dev; -u32 i; -int err, val; +u32 i, val; +int err; err =of_property_read_u32 (child,"reg" , &i);if (err) {
@@ -540,8 +540,8 @@ static int max6639_probe_child_from_dt(struct i2c_client *client, err =of_property_read_u32 (child,"pulses-per-revolution" , &val);if (!err) { -if (val <1 || val >5 ) { -dev_err (dev,"invalid pulses-per-revolution %d of %pOFn\n" , val, child); +if (val <1 || val >4 ) { +dev_err (dev,"invalid pulses-per-revolution %u of %pOFn\n" , val, child);return -EINVAL ; } data->ppr[i] = val;
Signature · 1 line
2.51.0
# Librecast Test Results
020/020 [ OK ] liblcrq
010/010 [ OK ] libmld
120/120 [ OK ] liblibrecast
CPU/kernel: Linux auntie 6.19.10-rc1-g5cf3b8242cca #1 SMP PREEMPT_DYNAMIC Mon Mar 23 14:10:11 -00 2026 x86_64 AMD Ryzen 9 9950X 16-Core Processor AuthenticAMD GNU/Linux
Hi
no regressions here on x86_64 (Intel 11th Gen. CPU)
Thanks
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 6.19.10 release. There are 220 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.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.19.y
6.18 passes our testing, too:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.18.y
Best regards,
Pavel
Am 23.03.2026 um 14:42 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.19.10 release. There are 220 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. No dmesg oddities or regressions found.
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 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.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
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.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.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.19:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
133 tests: 133 pass, 0 failLinux version: 6.19.10-rc1-g5cf3b8242cca
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,
tegra234-p3737-0000+p3701-0000,
tegra234-p3768-0000+p3767-0005, tegra30-cardhu-a04Jon
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.y
and the diffstat can be found below.thanks,
greg k-h
6.19.10-rc1 tested.
Build successfully completed.
Boot successfully completed.
No dmesg regressions.
Video output normal.
Sound output normal.
Lenovo ThinkPad X1 Carbon Gen10(Intel i7-1260P(x86_64) arch linux)
[ 0.000000] Linux version 6.19.10-rc1rv-g5cf3b8242cca
(takeshi@ThinkPadX1Gen10J0764) (gcc (GCC) 15.2.1 20260209, GNU ld (GNU Binutils) 2.46) #1 SMP PREEMPT_DYNAMIC Tue Mar 24 19:05:43 JST 2026
Thanks
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 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 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.y
and the diffstat can be found below.thanks,
greg k-h
Tested rc1 against the Fedora build system (aarch64, ppc64le, s390x, x86_64), and boot tested x86_64. No regressions noted.
Quoted 15 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.y
and the diffstat can be found below.
Quoted 5 lines
thanks,
greg k-h
-------------
Build and Boot Report for 6.19.10-rc1
Build and boot testing was performed on version 6.19.10-rc1 using the default configuration on both x86_64 and arm64 architectures in a virtual environment. The kernel built and booted successfully, and no dmesg regressions were observed.
Configurations: x86_64_defconfig, defconfig
Architectures: arm64, x86_64
Kernel Source: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Commit: 5cf3b8242cca1247b6b278b778152b5e343e7d62
Best regards,
Dileep Malepu
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.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
Quoted 8 lines · On Mon, 23 Mar 2026 14:42:57 +0100 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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:
For loongarch64, I am seeing:
drivers/gpu/nova-core/nova_core.o: warning: objtool: _RNvMs1_NtNtCskfHXyXj90Gn_9nova_core3gsp4cmdqNtB5_4Cmdq3new+0x2c8: return with modified stack frame
Which got fixed in mainline by:
c7940c8bf215 ("gpu: nova-core: fix stack overflow in GSP memory allocation")
But 1) this is just for loongarch64, 2) Nova is still being developed and 3) it is just for 6.19.y, so that is probably there was no Cc:
stable@. Anyway, Cc'ing here.
Thanks!
Cheers,
Miguel
Quoted 4 lines · Miguel Ojeda
But 1) this is just for loongarch64, 2) Nova is still being developed and 3) it is just for 6.19.y, so that is probably there was no Cc:
stable@. Anyway, Cc'ing here.
And 4) it would need backporting more bits or a custom backport.
Cheers,
Miguel
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +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.19.10-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.19.y
and the diffstat can be found below.thanks,
greg k-h
Tested on my amd64 DIY home NAS. Working well, no regressions observed.
Signature · 1 line
-Barry K. Nathan <[email protected]>
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.19.10 release. There are 220 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 25 Mar 2026 13:44:33 +0000. Anything received after that time might be too late.
test_progs, test_progs-no_alu32, test_progs-cpuv4, test_maps, test_verifier in BPF selftests all passes[1] on x86_64.
1: https://github.com/shunghsiyu/libbpf/actions/runs/23507388452/job/68418868804
[...]