6.1.75-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainerPATCH 148/417 bpf: sockmap, fix proto update hook to avoid dup calls
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Fastabend <[email protected]>
[ Upstream commit 16b2f264983dc264c1560cc0170e760dec1bf54f ]
When sockets are added to a sockmap or sockhash we allocate and init a psock. Then update the proto ops with sock_map_init_proto the flow is
sock_hash_update_common
sock_map_link
psock = sock_map_psock_get_checked() <-returns existing psock
sock_map_init_proto(sk, psock) <- updates sk_proto
If the socket is already in a map this results in the sock_map_init_proto being called multiple times on the same socket. We do this because when a socket is added to multiple maps this might result in a new set of BPF programs being attached to the socket requiring an updated ops struct.
This creates a rule where it must be safe to call psock_update_sk_prot multiple times. When we added a fix for UAF through unix sockets in patch 4dd9a38a753fc we broke this rule by adding a sock_hold in that path to ensure the sock is not released. The result is if a af_unix stream sock is placed in multiple maps it results in a memory leak because we call sock_hold multiple times with only a single sock_put on it.
--- net/unix/unix_bpf.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
net/unix/unix_bpf.c +18 -3
@@ -161,15 +161,30 @@ int unix_stream_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool r {struct sock *sk_pair; +/* Restore does not decrement the sk_pair reference yet because we must +* keep the a reference to the socket until after an RCU grace period +* and any pending sends have completed. +*/ if (restore) { sk->sk_write_space = psock->saved_write_space;sock_replace_proto (sk, psock->sk_proto);return 0 ; } - sk_pair =unix_peer (sk); -sock_hold (sk_pair); - psock->sk_pair = sk_pair; +/* psock_update_sk_prot can be called multiple times if psock is +* added to multiple maps and/or slots in the same map. There is +* also an edge case where replacing a psock with itself can trigger +* an extra psock_update_sk_prot during the insert process. So it +* must be safe to do multiple calls. Here we need to ensure we don't +* increment the refcnt through sock_hold many times. There will only +* be a single matching destroy operation. +*/ +if (!psock->sk_pair) { + sk_pair =unix_peer (sk); +sock_hold (sk_pair); + psock->sk_pair = sk_pair; + } +unix_stream_bpf_check_needs_rebuild (psock->sk_proto);sock_replace_proto (sk, &unix_stream_bpf_prot);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 149/417 sctp: support MSG_ERRQUEUE flag in recvmsg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4746b36b1abe11ca32987b2d21e1e770deab17cc ]
For some reason sctp_poll() generates EPOLLERR if sk->sk_error_queue is not empty but recvmsg() can not drain the error queue yet.
This is needed to better support timestamping.
I had to export inet_recv_error(), since sctp
can be compiled as a module.
Stable-dep-of: a562c0a2d651 ("sctp: fix busy polling")
--- net/ipv4/af_inet.c | 1 + net/sctp/socket.c | 3 +++ 2 files changed, 4 insertions(+)
net/ipv4/af_inet.c +1 -0
@@ -1642,6 +1642,7 @@ int inet_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)#endif return -EINVAL ; } +EXPORT_SYMBOL (inet_recv_error);int inet_gro_complete (struct sk_buff *skb,int nhoff) {
net/sctp/socket.c +3 -0
@@ -2098,6 +2098,9 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,pr_debug ("%s: sk:%p, msghdr:%p, len:%zd, flags:0x%x, addr_len:%p)\n" , __func__, sk, msg, len, flags, addr_len); +if (unlikely (flags &MSG_ERRQUEUE )) +return inet_recv_error (sk, msg, len, addr_len); +lock_sock (sk); if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED) &&
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 150/417 sctp: fix busy polling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit a562c0a2d651e040681b0bfce9b4d229ac3b0b8c ]
Busy polling while holding the socket lock makes litle sense, because incoming packets wont reach our receive queue.
--- net/sctp/socket.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
net/sctp/socket.c +4 -6
@@ -2101,6 +2101,10 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,if (unlikely (flags &MSG_ERRQUEUE ))return inet_recv_error (sk, msg, len, addr_len); +if (sk_can_busy_loop (sk) && +skb_queue_empty_lockless (&sk->sk_receive_queue)) +sk_busy_loop (sk, flags &MSG_DONTWAIT ); +lock_sock (sk); if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED) &&
@@ -9041,12 +9045,6 @@ struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, int *err)if (sk->sk_shutdown &RCV_SHUTDOWN )break ; -if (sk_can_busy_loop (sk)) { -sk_busy_loop (sk, flags &MSG_DONTWAIT ); - -if (!skb_queue_empty_lockless (&sk->sk_receive_queue)) -continue ; - }/* User doesn't want to wait. */ error = -EAGAIN ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 151/417 net/sched: act_ct: fix skb leak and crash on ooo frags
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tao Liu <[email protected]>
[ Upstream commit 3f14b377d01d8357eba032b4cabc8c1149b458b6 ]
act_ct adds skb->users before defragmentation. If frags arrive in order, the last frag's reference is reset in:
inet_frag_reasm_prepare
skb_morph
which is not straightforward.
However when frags arrive out of order, nobody unref the last frag, and all frags are leaked. The situation is even worse, as initiating packet capture can lead to a crash[0] when skb has been cloned and shared at the same time.
Fix the issue by removing skb_get() before defragmentation. act_ct returns TC_ACT_CONSUMED when defrag failed or in progress.
[0]:
[ 843.804823] ------------[ cut here ]------------ [ 843.809659] kernel BUG at net/core/skbuff.c:2091! [ 843.814516] invalid opcode: 0000 [#1] PREEMPT SMP [ 843.819296] CPU: 7 PID: 0 Comm: swapper/7 Kdump: loaded Tainted: G S 6.7.0-rc3 #2 [ 843.824107] Hardware name: XFUSION 1288H V6/BC13MBSBD, BIOS 1.29 11/25/2022 [ 843.828953] RIP: 0010:pskb_expand_head+0x2ac/0x300 [ 843.833805] Code: 8b 70 28 48 85 f6 74 82 48 83 c6 08 bf 01 00 00 00 e8 38 bd ff ff 8b 83 c0 00 00 00 48 03 83 c8 00 00 00 e9 62 ff ff ff 0f 0b <0f> 0b e8 8d d0 ff ff e9 b3 fd ff ff 81 7c 24 14 40 01 00 00 4c 89 [ 843.843698] RSP: 0018:ffffc9000cce07c0 EFLAGS: 00010202 [ 843.848524] RAX: 0000000000000002 RBX: ffff88811a211d00 RCX: 0000000000000820 [ 843.853299] RDX: 0000000000000640 RSI: 0000000000000000 RDI: ffff88811a211d00 [ 843.857974] RBP: ffff888127d39518 R08: 00000000bee97314 R09: 0000000000000000 [ 843.862584] R10: 0000000000000000 R11: ffff8881109f0000 R12: 0000000000000880 [ 843.867147] R13: ffff888127d39580 R14: 0000000000000640 R15: ffff888170f7b900 [ 843.871680] FS: 0000000000000000(0000) GS:ffff889ffffc0000(0000) knlGS:0000000000000000 [ 843.876242] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 843.880778] CR2: 00007fa42affcfb8 CR3: 000000011433a002 CR4: 0000000000770ef0 [ 843.885336] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 843.889809] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 843.894229] PKRU: 55555554 [ 843.898539] Call Trace: [ 843.902772] <IRQ> [ 843.906922] ? __die_body+0x1e/0x60 [ 843.911032] ? die+0x3c/0x60 [ 843.915037] ? do_trap+0xe2/0x110 [ 843.918911] ? pskb_expand_head+0x2ac/0x300 [ 843.922687] ? do_error_trap+0x65/0x80 [ 843.926342] ? pskb_expand_head+0x2ac/0x300 [ 843.929905] ? exc_invalid_op+0x50/0x60 [ 843.933398] ? pskb_expand_head+0x2ac/0x300 [ 843.936835] ? asm_exc_invalid_op+0x1a/0x20 [ 843.940226] ? pskb_expand_head+0x2ac/0x300 [ 843.943580] inet_frag_reasm_prepare+0xd1/0x240 [ 843.946904] ip_defrag+0x5d4/0x870 [ 843.950132] nf_ct_handle_fragments+0xec/0x130 [nf_conntrack] [ 843.953334] tcf_ct_act+0x252/0xd90 [act_ct] [ 843.956473] ? tcf_mirred_act+0x516/0x5a0 [act_mirred] [ 843.959657] tcf_action_exec+0xa1/0x160 [ 843.962823] fl_classify+0x1db/0x1f0 [cls_flower] [ 843.966010] ? skb_clone+0x53/0xc0 [ 843.969173] tcf_classify+0x24d/0x420 [ 843.972333] tc_run+0x8f/0xf0 [ 843.975465] __netif_receive_skb_core+0x67a/0x1080 [ 843.978634] ? dev_gro_receive+0x249/0x730 [ 843.981759] __netif_receive_skb_list_core+0x12d/0x260 [ 843.984869] netif_receive_skb_list_internal+0x1cb/0x2f0 [ 843.987957] ? mlx5e_handle_rx_cqe_mpwrq_rep+0xfa/0x1a0 [mlx5_core] [ 843.991170] napi_complete_done+0x72/0x1a0 [ 843.994305] mlx5e_napi_poll+0x28c/0x6d0 [mlx5_core] [ 843.997501] __napi_poll+0x25/0x1b0 [ 844.000627] net_rx_action+0x256/0x330 [ 844.003705] __do_softirq+0xb3/0x29b [ 844.006718] irq_exit_rcu+0x9e/0xc0 [ 844.009672] common_interrupt+0x86/0xa0 [ 844.012537] </IRQ> [ 844.015285] <TASK> [ 844.017937] asm_common_interrupt+0x26/0x40 [ 844.020591] RIP: 0010:acpi_safe_halt+0x1b/0x20 [ 844.023247] Code: ff 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 65 48 8b 04 25 00 18 03 00 48 8b 00 a8 08 75 0c 66 90 0f 00 2d 81 d0 44 00 fb f4 <fa> c3 0f 1f 00 89 fa ec 48 8b 05 ee 88 ed 00 a9 00 00 00 80 75 11 [ 844.028900] RSP: 0018:ffffc90000533e70 EFLAGS: 00000246 [ 844.031725] RAX: 0000000000004000 RBX: 0000000000000001 RCX: 0000000000000000 [ 844.034553] RDX: ffff889ffffc0000 RSI: ffffffff828b7f20 RDI: ffff88a090f45c64 [ 844.037368] RBP: ffff88a0901a2800 R08: ffff88a090f45c00 R09: 00000000000317c0 [ 844.040155] R10: 00ec812281150475 R11: ffff889fffff0e04 R12: ffffffff828b7fa0 [ 844.042962] R13: ffffffff828b7f20 R14: 0000000000000001 R15: 0000000000000000 [ 844.045819] acpi_idle_enter+0x7b/0xc0 [ 844.048621] cpuidle_enter_state+0x7f/0x430 [ 844.051451] cpuidle_enter+0x2d/0x40 [ 844.054279] do_idle+0x1d4/0x240 [ 844.057096] cpu_startup_entry+0x2a/0x30 [ 844.059934] start_secondary+0x104/0x130 [ 844.062787] secondary_startup_64_no_verify+0x16b/0x16b [ 844.065674] </TASK>
--- net/sched/act_ct.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/sched/act_ct.c +6 -6
@@ -863,7 +863,6 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb,if (err || !frag)return err; -skb_get (skb); mru =tc_skb_cb (skb)->mru;if (family ==NFPROTO_IPV4 ) {
@@ -1150,12 +1149,8 @@ static int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a, nh_ofs =skb_network_offset (skb);skb_pull_rcsum (skb, nh_ofs); err =tcf_ct_handle_fragments (net, skb, family, p->zone, &defrag); -if (err == -EINPROGRESS ) { - retval =TC_ACT_STOLEN ; - goto out_clear; - }if (err) - goto drop; + goto out_frag; err =tcf_ct_skb_network_trim (skb, family);if (err)
@@ -1226,6 +1221,11 @@ static int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a,qdisc_skb_cb (skb)->pkt_len = skb->len;return retval; +out_frag: +if (err != -EINPROGRESS ) +tcf_action_inc_drop_qstats (&c->common); +return TC_ACT_CONSUMED ; + drop:tcf_action_inc_drop_qstats (&c->common);return TC_ACT_SHOT ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 152/417 mlxbf_gige: Fix intermittent no ip issue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Asmaa Mnebhi <[email protected]>
[ Upstream commit ef210ef85d5cb543ce34a57803ed856d0c8c08c2 ]
Although the link is up, there is no ip assigned on setups with high background traffic. Nothing is transmitted nor received. The RX error count keeps on increasing. After several minutes, the RX error count stagnates and the GigE interface finally gets an ip.
The issue is that mlxbf_gige_rx_init() is called before phy_start(). As soon as the RX DMA is enabled in mlxbf_gige_rx_init(), the RX CI reaches the max of 128, and becomes equal to RX PI. RX CI doesn't decrease since the code hasn't ran phy_start yet.
Bring the PHY up before starting the RX.
--- .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c | 14 +++++++------- .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-)
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c +7 -7
@@ -147,14 +147,14 @@ static int mlxbf_gige_open(struct net_device *netdev)*/ priv->valid_polarity =0 ; - err =mlxbf_gige_rx_init (priv); +phy_start (phydev); + + err =mlxbf_gige_tx_init (priv);if (err) goto free_irqs; - err =mlxbf_gige_tx_init (priv); + err =mlxbf_gige_rx_init (priv);if (err) - goto rx_deinit; - -phy_start (phydev); + goto tx_deinit;netif_napi_add (netdev, &priv->napi, mlxbf_gige_poll);napi_enable (&priv->napi);
@@ -176,8 +176,8 @@ static int mlxbf_gige_open(struct net_device *netdev)return 0 ; -rx_deinit: -mlxbf_gige_rx_deinit (priv); +tx_deinit: +mlxbf_gige_tx_deinit (priv); free_irqs:mlxbf_gige_free_irqs (priv);
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c +3 -3
@@ -142,6 +142,9 @@ int mlxbf_gige_rx_init(struct mlxbf_gige *priv)writeq (MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS_EN , priv->base +MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS ); +writeq (ilog2 (priv->rx_q_entries), + priv->base +MLXBF_GIGE_RX_WQE_SIZE_LOG2 ); +/* Clear MLXBF_GIGE_INT_MASK 'receive pkt' bit to * indicate readiness to receive interrupts */
@@ -154,9 +157,6 @@ int mlxbf_gige_rx_init(struct mlxbf_gige *priv) data |=MLXBF_GIGE_RX_DMA_EN ;writeq (data, priv->base +MLXBF_GIGE_RX_DMA ); -writeq (ilog2 (priv->rx_q_entries), - priv->base +MLXBF_GIGE_RX_WQE_SIZE_LOG2 ); -return 0 ; free_wqe_and_skb:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 153/417 mlxbf_gige: Enable the GigE port in mlxbf_gige_open
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Asmaa Mnebhi <[email protected]>
[ Upstream commit a460f4a684511e007bbf1700758a41f05d9981e6 ]
At the moment, the GigE port is enabled in the mlxbf_gige_probe function. If the mlxbf_gige_open is not executed, this could cause pause frames to increase in the case where there is high backgroud traffic. This results in clogging the port.
So move enabling the OOB port to mlxbf_gige_open.
--- .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_main.c +6 -6
@@ -130,9 +130,15 @@ static int mlxbf_gige_open(struct net_device *netdev) {struct mlxbf_gige *priv =netdev_priv (netdev);struct phy_device *phydev = netdev->phydev; +u64 control;u64 int_en;int err; +/* Perform general init of GigE block */ + control =readq (priv->base +MLXBF_GIGE_CONTROL ); + control |=MLXBF_GIGE_CONTROL_PORT_EN ; +writeq (control, priv->base +MLXBF_GIGE_CONTROL ); + err =mlxbf_gige_request_irqs (priv);if (err)return err;
@@ -279,7 +285,6 @@ static int mlxbf_gige_probe(struct platform_device *pdev)void __iomem *plu_base;void __iomem *base;int addr, phy_irq; -u64 control;int err; base =devm_platform_ioremap_resource (pdev,MLXBF_GIGE_RES_MAC );
@@ -294,11 +299,6 @@ static int mlxbf_gige_probe(struct platform_device *pdev)if (IS_ERR (plu_base))return PTR_ERR (plu_base); -/* Perform general init of GigE block */ - control =readq (base +MLXBF_GIGE_CONTROL ); - control |=MLXBF_GIGE_CONTROL_PORT_EN ; -writeq (control, base +MLXBF_GIGE_CONTROL ); - netdev =devm_alloc_etherdev (&pdev->dev,sizeof (*priv));if (!netdev)return -ENOMEM ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 154/417 ip6_tunnel: fix NEXTHDR_FRAGMENT handling in ip6_tnl_parse_tlv_enc_lim()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit d375b98e0248980681e5e56b712026174d617198 ]
syzbot pointed out [1] that NEXTHDR_FRAGMENT handling is broken.
Reading frag_off can only be done if we pulled enough bytes to skb->head. Currently we might access garbage.
[1]
BUG: KMSAN: uninit-value in ip6_tnl_parse_tlv_enc_lim+0x94f/0xbb0 ip6_tnl_parse_tlv_enc_lim+0x94f/0xbb0 ipxip6_tnl_xmit net/ipv6/ip6_tunnel.c:1326 [inline] ip6_tnl_start_xmit+0xab2/0x1a70 net/ipv6/ip6_tunnel.c:1432 __netdev_start_xmit include/linux/netdevice.h:4940 [inline] netdev_start_xmit include/linux/netdevice.h:4954 [inline] xmit_one net/core/dev.c:3548 [inline] dev_hard_start_xmit+0x247/0xa10 net/core/dev.c:3564 __dev_queue_xmit+0x33b8/0x5130 net/core/dev.c:4349 dev_queue_xmit include/linux/netdevice.h:3134 [inline] neigh_connected_output+0x569/0x660 net/core/neighbour.c:1592 neigh_output include/net/neighbour.h:542 [inline] ip6_finish_output2+0x23a9/0x2b30 net/ipv6/ip6_output.c:137 ip6_finish_output+0x855/0x12b0 net/ipv6/ip6_output.c:222 NF_HOOK_COND include/linux/netfilter.h:303 [inline] ip6_output+0x323/0x610 net/ipv6/ip6_output.c:243 dst_output include/net/dst.h:451 [inline] ip6_local_out+0xe9/0x140 net/ipv6/output_core.c:155 ip6_send_skb net/ipv6/ip6_output.c:1952 [inline] ip6_push_pending_frames+0x1f9/0x560 net/ipv6/ip6_output.c:1972 rawv6_push_pending_frames+0xbe8/0xdf0 net/ipv6/raw.c:582 rawv6_sendmsg+0x2b66/0x2e70 net/ipv6/raw.c:920 inet_sendmsg+0x105/0x190 net/ipv4/af_inet.c:847 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg net/socket.c:745 [inline] ____sys_sendmsg+0x9c2/0xd60 net/socket.c:2584 ___sys_sendmsg+0x28d/0x3c0 net/socket.c:2638 __sys_sendmsg net/socket.c:2667 [inline] __do_sys_sendmsg net/socket.c:2676 [inline] __se_sys_sendmsg net/socket.c:2674 [inline] __x64_sys_sendmsg+0x307/0x490 net/socket.c:2674 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x44/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b
Uninit was created at:
slab_post_alloc_hook+0x129/0xa70 mm/slab.h:768 slab_alloc_node mm/slub.c:3478 [inline] __kmem_cache_alloc_node+0x5c9/0x970 mm/slub.c:3517 __do_kmalloc_node mm/slab_common.c:1006 [inline] __kmalloc_node_track_caller+0x118/0x3c0 mm/slab_common.c:1027 kmalloc_reserve+0x249/0x4a0 net/core/skbuff.c:582 pskb_expand_head+0x226/0x1a00 net/core/skbuff.c:2098 __pskb_pull_tail+0x13b/0x2310 net/core/skbuff.c:2655 pskb_may_pull_reason include/linux/skbuff.h:2673 [inline] pskb_may_pull include/linux/skbuff.h:2681 [inline] ip6_tnl_parse_tlv_enc_lim+0x901/0xbb0 net/ipv6/ip6_tunnel.c:408 ipxip6_tnl_xmit net/ipv6/ip6_tunnel.c:1326 [inline] ip6_tnl_start_xmit+0xab2/0x1a70 net/ipv6/ip6_tunnel.c:1432 __netdev_start_xmit include/linux/netdevice.h:4940 [inline] netdev_start_xmit include/linux/netdevice.h:4954 [inline] xmit_one net/core/dev.c:3548 [inline] dev_hard_start_xmit+0x247/0xa10 net/core/dev.c:3564 __dev_queue_xmit+0x33b8/0x5130 net/core/dev.c:4349 dev_queue_xmit include/linux/netdevice.h:3134 [inline] neigh_connected_output+0x569/0x660 net/core/neighbour.c:1592 neigh_output include/net/neighbour.h:542 [inline] ip6_finish_output2+0x23a9/0x2b30 net/ipv6/ip6_output.c:137 ip6_finish_output+0x855/0x12b0 net/ipv6/ip6_output.c:222 NF_HOOK_COND include/linux/netfilter.h:303 [inline] ip6_output+0x323/0x610 net/ipv6/ip6_output.c:243 dst_output include/net/dst.h:451 [inline] ip6_local_out+0xe9/0x140 net/ipv6/output_core.c:155 ip6_send_skb net/ipv6/ip6_output.c:1952 [inline] ip6_push_pending_frames+0x1f9/0x560 net/ipv6/ip6_output.c:1972 rawv6_push_pending_frames+0xbe8/0xdf0 net/ipv6/raw.c:582 rawv6_sendmsg+0x2b66/0x2e70 net/ipv6/raw.c:920 inet_sendmsg+0x105/0x190 net/ipv4/af_inet.c:847 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg net/socket.c:745 [inline] ____sys_sendmsg+0x9c2/0xd60 net/socket.c:2584 ___sys_sendmsg+0x28d/0x3c0 net/socket.c:2638 __sys_sendmsg net/socket.c:2667 [inline] __do_sys_sendmsg net/socket.c:2676 [inline] __se_sys_sendmsg net/socket.c:2674 [inline] __x64_sys_sendmsg+0x307/0x490 net/socket.c:2674 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x44/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b CPU: 0 PID: 7345 Comm: syz-executor.3 Not tainted 6.7.0-rc8-syzkaller-00024-gac865f00af29 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/17/2023
--- net/ipv6/ip6_tunnel.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
net/ipv6/ip6_tunnel.c +13 -13
@@ -399,7 +399,7 @@ __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw)const struct ipv6hdr *ipv6h = (const struct ipv6hdr *)raw;unsigned int nhoff = raw - skb->data;unsigned int off = nhoff +sizeof (*ipv6h); -u8 next, nexthdr = ipv6h->nexthdr; +u8 nexthdr = ipv6h->nexthdr;while (ipv6_ext_hdr (nexthdr) && nexthdr !=NEXTHDR_NONE ) {struct ipv6_opt_hdr *hdr;
@@ -410,25 +410,25 @@ __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw) hdr = (struct ipv6_opt_hdr *)(skb->data + off);if (nexthdr ==NEXTHDR_FRAGMENT ) { -struct frag_hdr *frag_hdr = (struct frag_hdr *) hdr; -if (frag_hdr->frag_off) -break ; optlen =8 ; }else if (nexthdr ==NEXTHDR_AUTH ) { optlen =ipv6_authlen (hdr); }else { optlen =ipv6_optlen (hdr); } -/* cache hdr->nexthdr, since pskb_may_pull() might -* invalidate hdr -*/ - next = hdr->nexthdr; -if (nexthdr ==NEXTHDR_DEST ) { -u16 i =2 ; -/* Remember : hdr is no longer valid at this point. */ -if (!pskb_may_pull (skb, off + optlen)) +if (!pskb_may_pull (skb, off + optlen)) +break ; + + hdr = (struct ipv6_opt_hdr *)(skb->data + off); +if (nexthdr ==NEXTHDR_FRAGMENT ) { +struct frag_hdr *frag_hdr = (struct frag_hdr *)hdr; + +if (frag_hdr->frag_off)break ; + } +if (nexthdr ==NEXTHDR_DEST ) { +u16 i =2 ;while (1 ) {struct ipv6_tlv_tnl_enc_lim *tel;
@@ -449,7 +449,7 @@ __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw) i++; } } - nexthdr = next; + nexthdr = hdr->nexthdr; off += optlen; }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 155/417 ARM: davinci: always select CONFIG_CPU_ARM926T
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 40974ee421b4d1fc74ac733d86899ce1b83d8f65 ]
The select was lost by accident during the multiplatform conversion. Any davinci-only
arm-linux-gnueabi-ld: arch/arm/mach-davinci/sleep.o: in function `CACHE_FLUSH':
(.text+0x168): undefined reference to `arm926_flush_kern_cache_all'
--- arch/arm/mach-davinci/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/arm/mach-davinci/Kconfig +1 -0
@@ -4,6 +4,7 @@ menuconfig ARCH_DAVINCI bool "TI DaVinci" depends on ARCH_MULTI_V5 depends on CPU_LITTLE_ENDIAN + select CPU_ARM926T select DAVINCI_TIMER select ZONE_DMA select PM_GENERIC_DOMAINS if PM
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 156/417 Revert "drm/tidss: Annotate dma-fence critical section in commit path"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit ca34d816558c3e4c3f8fe037b5a6b16c944693de ]
This reverts commit 4d56a4f08391857ba93465de489707b66adad114.
The DMA-fence annotations cause a lockdep warning (see below). As per
https://patchwork.freedesktop.org/patch/462170/ it sounds like the annotations don't work correctly.
======================================================
WARNING: possible circular locking dependency detected
6.6.0-rc2+ #1 Not tainted
------------------------------------------------------
kmstest/733 is trying to acquire lock:ffff8000819377f0 (fs_reclaim){+.+.}-{0:0}, at: __kmem_cache_alloc_node+0x58/0x2d4
but task is already holding lock:ffff800081a06aa0 (dma_fence_map){++++}-{0:0}, at: tidss_atomic_commit_tail+0x20/0xc0 [tidss]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (dma_fence_map){++++}-{0:0}:
__dma_fence_might_wait+0x5c/0xd0
dma_resv_lockdep+0x1a4/0x32c
do_one_initcall+0x84/0x2fc
kernel_init_freeable+0x28c/0x4c4
kernel_init+0x24/0x1dc
ret_from_fork+0x10/0x20-> #1 (mmu_notifier_invalidate_range_start){+.+.}-{0:0}:
fs_reclaim_acquire+0x70/0xe4
__kmem_cache_alloc_node+0x58/0x2d4
kmalloc_trace+0x38/0x78
__kthread_create_worker+0x3c/0x150
kthread_create_worker+0x64/0x8c
workqueue_init+0x1e8/0x2f0
kernel_init_freeable+0x11c/0x4c4
kernel_init+0x24/0x1dc
ret_from_fork+0x10/0x20-> #0 (fs_reclaim){+.+.}-{0:0}:
__lock_acquire+0x1370/0x20d8
lock_acquire+0x1e8/0x308
fs_reclaim_acquire+0xd0/0xe4
__kmem_cache_alloc_node+0x58/0x2d4
__kmalloc_node_track_caller+0x58/0xf0
kmemdup+0x34/0x60
regmap_bulk_write+0x64/0x2c0
tc358768_bridge_pre_enable+0x8c/0x12d0 [tc358768]
drm_atomic_bridge_call_pre_enable+0x68/0x80 [drm]
drm_atomic_bridge_chain_pre_enable+0x50/0x158 [drm]
drm_atomic_helper_commit_modeset_enables+0x164/0x264 [drm_kms_helper]
tidss_atomic_commit_tail+0x58/0xc0 [tidss]
commit_tail+0xa0/0x188 [drm_kms_helper]
drm_atomic_helper_commit+0x1a8/0x1c0 [drm_kms_helper]
drm_atomic_commit+0xa8/0xe0 [drm]
drm_mode_atomic_ioctl+0x9ec/0xc80 [drm]
drm_ioctl_kernel+0xc4/0x170 [drm]
drm_ioctl+0x234/0x4b0 [drm]
drm_compat_ioctl+0x110/0x12c [drm]
__arm64_compat_sys_ioctl+0x128/0x150
invoke_syscall+0x48/0x110
el0_svc_common.constprop.0+0x40/0xe0
do_el0_svc_compat+0x1c/0x38
el0_svc_compat+0x48/0xb4
el0t_32_sync_handler+0xb0/0x138
el0t_32_sync+0x194/0x198other info that might help us debug this:
Chain exists of: fs_reclaim --> mmu_notifier_invalidate_range_start --> dma_fence_map Possible unsafe locking scenario:
CPU0 CPU1
---- ----
rlock(dma_fence_map);
lock(mmu_notifier_invalidate_range_start);
lock(dma_fence_map); lock(fs_reclaim);
*** DEADLOCK ***
3 locks held by kmstest/733:
#0: ffff800082e5bba0 (crtc_ww_class_acquire){+.+.}-{0:0}, at: drm_mode_atomic_ioctl+0x118/0xc80 [drm] #1: ffff000004224c88 (crtc_ww_class_mutex){+.+.}-{3:3}, at: modeset_lock+0xdc/0x1a0 [drm] #2: ffff800081a06aa0 (dma_fence_map){++++}-{0:0}, at: tidss_atomic_commit_tail+0x20/0xc0 [tidss]
stack backtrace: CPU: 0 PID: 733 Comm: kmstest Not tainted 6.6.0-rc2+ #1 Hardware name: Toradex Verdin AM62 on Verdin Development Board (DT) Call trace: dump_backtrace+0x98/0x118 show_stack+0x18/0x24 dump_stack_lvl+0x60/0xac dump_stack+0x18/0x24 print_circular_bug+0x288/0x368 check_noncircular+0x168/0x17c __lock_acquire+0x1370/0x20d8 lock_acquire+0x1e8/0x308 fs_reclaim_acquire+0xd0/0xe4 __kmem_cache_alloc_node+0x58/0x2d4 __kmalloc_node_track_caller+0x58/0xf0 kmemdup+0x34/0x60 regmap_bulk_write+0x64/0x2c0 tc358768_bridge_pre_enable+0x8c/0x12d0 [tc358768] drm_atomic_bridge_call_pre_enable+0x68/0x80 [drm] drm_atomic_bridge_chain_pre_enable+0x50/0x158 [drm] drm_atomic_helper_commit_modeset_enables+0x164/0x264 [drm_kms_helper] tidss_atomic_commit_tail+0x58/0xc0 [tidss] commit_tail+0xa0/0x188 [drm_kms_helper] drm_atomic_helper_commit+0x1a8/0x1c0 [drm_kms_helper] drm_atomic_commit+0xa8/0xe0 [drm] drm_mode_atomic_ioctl+0x9ec/0xc80 [drm] drm_ioctl_kernel+0xc4/0x170 [drm] drm_ioctl+0x234/0x4b0 [drm] drm_compat_ioctl+0x110/0x12c [drm] __arm64_compat_sys_ioctl+0x128/0x150 invoke_syscall+0x48/0x110 el0_svc_common.constprop.0+0x40/0xe0 do_el0_svc_compat+0x1c/0x38 el0_svc_compat+0x48/0xb4 el0t_32_sync_handler+0xb0/0x138 el0t_32_sync+0x194/0x198
--- drivers/gpu/drm/tidss/tidss_kms.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/gpu/drm/tidss/tidss_kms.c +0 -4
@@ -4,8 +4,6 @@* Author: Tomi Valkeinen <[email protected]> */ -#include <linux/dma-fence.h> -#include <drm/drm_atomic.h> #include <drm/drm_atomic_helper.h> #include <drm/drm_bridge.h>
@@ -27,7 +25,6 @@ static void tidss_atomic_commit_tail(struct drm_atomic_state *old_state) {struct drm_device *ddev = old_state->dev;struct tidss_device *tidss =to_tidss (ddev); -bool fence_cookie =dma_fence_begin_signalling ();dev_dbg (ddev->dev,"%s\n" , __func__);
@@ -38,7 +35,6 @@ static void tidss_atomic_commit_tail(struct drm_atomic_state *old_state)drm_atomic_helper_commit_modeset_enables (ddev, old_state);drm_atomic_helper_commit_hw_done (old_state); -dma_fence_end_signalling (fence_cookie);drm_atomic_helper_wait_for_flip_done (ddev, old_state);drm_atomic_helper_cleanup_planes (ddev, old_state);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 157/417 Revert "drm/omapdrm: Annotate dma-fence critical section in commit path"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 9d7c8c066916f231ca0ed4e4fce6c4b58ca3e451 ]
This reverts commit 250aa22920cd5d956a5d3e9c6a43d671c2bae217.
The DMA-fence annotations cause a lockdep warning (see below). As per
https://patchwork.freedesktop.org/patch/462170/ it sounds like the annotations don't work correctly.
======================================================
WARNING: possible circular locking dependency detected 6.5.0-rc2+ #2 Not tainted
------------------------------------------------------
kmstest/219 is trying to acquire lock:c4705838 (&hdmi->lock){+.+.}-{3:3}, at: hdmi5_bridge_mode_set+0x1c/0x50
but task is already holding lock:c11e1128 (dma_fence_map){++++}-{0:0}, at: omap_atomic_commit_tail+0x14/0xbc
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (dma_fence_map){++++}-{0:0}:
__dma_fence_might_wait+0x48/0xb4
dma_resv_lockdep+0x1b8/0x2bc
do_one_initcall+0x68/0x3b0
kernel_init_freeable+0x260/0x34c
kernel_init+0x14/0x140
ret_from_fork+0x14/0x28-> #1 (fs_reclaim){+.+.}-{0:0}:
fs_reclaim_acquire+0x70/0xa8
__kmem_cache_alloc_node+0x3c/0x368
kmalloc_trace+0x28/0x58
_drm_do_get_edid+0x7c/0x35c
hdmi5_bridge_get_edid+0xc8/0x1ac
drm_bridge_connector_get_modes+0x64/0xc0
drm_helper_probe_single_connector_modes+0x170/0x528
drm_client_modeset_probe+0x208/0x1334
__drm_fb_helper_initial_config_and_unlock+0x30/0x548
omap_fbdev_client_hotplug+0x3c/0x6c
drm_client_register+0x58/0x94
pdev_probe+0x544/0x6b0
platform_probe+0x58/0xbc
really_probe+0xd8/0x3fc
__driver_probe_device+0x94/0x1f4
driver_probe_device+0x2c/0xc4
__device_attach_driver+0xa4/0x11c
bus_for_each_drv+0x84/0xdc
__device_attach+0xac/0x20c
bus_probe_device+0x8c/0x90
device_add+0x588/0x7e0
platform_device_add+0x110/0x24c
platform_device_register_full+0x108/0x15c
dss_bind+0x90/0xc0
try_to_bring_up_aggregate_device+0x1e0/0x2c8
__component_add+0xa4/0x174
hdmi5_probe+0x1c8/0x270
platform_probe+0x58/0xbc
really_probe+0xd8/0x3fc
__driver_probe_device+0x94/0x1f4
driver_probe_device+0x2c/0xc4
__device_attach_driver+0xa4/0x11c
bus_for_each_drv+0x84/0xdc
__device_attach+0xac/0x20c
bus_probe_device+0x8c/0x90
deferred_probe_work_func+0x8c/0xd8
process_one_work+0x2ac/0x6e4
worker_thread+0x30/0x4ec
kthread+0x100/0x124
ret_from_fork+0x14/0x28-> #0 (&hdmi->lock){+.+.}-{3:3}:
__lock_acquire+0x145c/0x29cc
lock_acquire.part.0+0xb4/0x258
__mutex_lock+0x90/0x950
mutex_lock_nested+0x1c/0x24
hdmi5_bridge_mode_set+0x1c/0x50
drm_bridge_chain_mode_set+0x48/0x5c
crtc_set_mode+0x188/0x1d0
omap_atomic_commit_tail+0x2c/0xbc
commit_tail+0x9c/0x188
drm_atomic_helper_commit+0x158/0x18c
drm_atomic_commit+0xa4/0xe8
drm_mode_atomic_ioctl+0x9a4/0xc38
drm_ioctl+0x210/0x4a8
sys_ioctl+0x138/0xf00
ret_fast_syscall+0x0/0x1cother info that might help us debug this:
Chain exists of: &hdmi->lock --> fs_reclaim --> dma_fence_map Possible unsafe locking scenario:
CPU0 CPU1
---- ----
rlock(dma_fence_map);
lock(fs_reclaim);
lock(dma_fence_map); lock(&hdmi->lock);
*** DEADLOCK ***
3 locks held by kmstest/219:
#0: f1011de4 (crtc_ww_class_acquire){+.+.}-{0:0}, at: drm_mode_atomic_ioctl+0xf0/0xc38 #1: c47059c8 (crtc_ww_class_mutex){+.+.}-{3:3}, at: modeset_lock+0xf8/0x230 #2: c11e1128 (dma_fence_map){++++}-{0:0}, at: omap_atomic_commit_tail+0x14/0xbc
stack backtrace: CPU: 1 PID: 219 Comm: kmstest Not tainted 6.5.0-rc2+ #2 Hardware name: Generic DRA74X (Flattened Device Tree) unwind_backtrace from show_stack+0x10/0x14 show_stack from dump_stack_lvl+0x58/0x70 dump_stack_lvl from check_noncircular+0x164/0x198 check_noncircular from __lock_acquire+0x145c/0x29cc __lock_acquire from lock_acquire.part.0+0xb4/0x258 lock_acquire.part.0 from __mutex_lock+0x90/0x950 __mutex_lock from mutex_lock_nested+0x1c/0x24 mutex_lock_nested from hdmi5_bridge_mode_set+0x1c/0x50 hdmi5_bridge_mode_set from drm_bridge_chain_mode_set+0x48/0x5c drm_bridge_chain_mode_set from crtc_set_mode+0x188/0x1d0 crtc_set_mode from omap_atomic_commit_tail+0x2c/0xbc omap_atomic_commit_tail from commit_tail+0x9c/0x188 commit_tail from drm_atomic_helper_commit+0x158/0x18c drm_atomic_helper_commit from drm_atomic_commit+0xa4/0xe8 drm_atomic_commit from drm_mode_atomic_ioctl+0x9a4/0xc38 drm_mode_atomic_ioctl from drm_ioctl+0x210/0x4a8 drm_ioctl from sys_ioctl+0x138/0xf00 sys_ioctl from ret_fast_syscall+0x0/0x1c Exception stack(0xf1011fa8 to 0xf1011ff0)
1fa0: 00466d58 be9ab510 00000003 c03864bc be9ab510 be9ab4e0
1fc0: 00466d58 be9ab510 c03864bc 00000036 00466ef0 00466fc0 00467020 00466f20 1fe0: b6bc7ef4 be9ab4d0 b6bbbb00 b6cb2cc0
--- drivers/gpu/drm/omapdrm/omap_drv.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/gpu/drm/omapdrm/omap_drv.c +4 -5
@@ -68,7 +68,6 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state) {struct drm_device *dev = old_state->dev;struct omap_drm_private *priv = dev->dev_private; -bool fence_cookie =dma_fence_begin_signalling ();dispc_runtime_get (priv->dispc);
@@ -91,6 +90,8 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state)omap_atomic_wait_for_completion (dev, old_state);drm_atomic_helper_commit_planes (dev, old_state,0 ); + +drm_atomic_helper_commit_hw_done (old_state); }else {/* * OMAP3 DSS seems to have issues with the work-around above,
@@ -100,11 +101,9 @@ static void omap_atomic_commit_tail(struct drm_atomic_state *old_state)drm_atomic_helper_commit_planes (dev, old_state,0 );drm_atomic_helper_commit_modeset_enables (dev, old_state); - } -drm_atomic_helper_commit_hw_done (old_state); - -dma_fence_end_signalling (fence_cookie); +drm_atomic_helper_commit_hw_done (old_state); + }/* * Wait for completion of the page flips to ensure that old buffers
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 158/417 drm/panfrost: Really power off GPU cores in panfrost_gpu_power_off()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 22aa1a209018dc2eca78745f7666db63637cd5dc ]
The layout of the registers {TILER,SHADER,L2}_PWROFF_LO, used to request powering off cores, is the same as the {TILER,SHADER,L2}_PWRON_LO ones:
this means that in order to request poweroff of cores, we are supposed to write a bitmask of cores that should be powered off!
This means that the panfrost_gpu_power_off() function has always been doing nothing.
Fix powering off the GPU by writing a bitmask of the cores to poweroff to the relevant PWROFF_LO registers and then check that the transition (from ON to OFF) has finished by polling the relevant PWRTRANS_LO registers.
While at it, in order to avoid code duplication, move the core mask logic from panfrost_gpu_power_on() to a new panfrost_get_core_mask() function, used in both poweron and poweroff.
--- drivers/gpu/drm/panfrost/panfrost_gpu.c | 64 ++++++++++++++++++------- 1 file changed, 46 insertions(+), 18 deletions(-)
drivers/gpu/drm/panfrost/panfrost_gpu.c +46 -18
@@ -313,28 +313,38 @@ static void panfrost_gpu_init_features(struct panfrost_device *pfdev) pfdev->features.shader_present, pfdev->features.l2_present); } +static u64 panfrost_get_core_mask (struct panfrost_device *pfdev) +{ +u64 core_mask; + +if (pfdev->features.l2_present ==1 ) +return U64_MAX ; + +/* +* Only support one core group now. +* ~(l2_present - 1) unsets all bits in l2_present except +* the bottom bit. (l2_present - 2) has all the bits in +* the first core group set. AND them together to generate +* a mask of cores in the first core group. +*/ + core_mask = ~(pfdev->features.l2_present -1 ) & + (pfdev->features.l2_present -2 ); +dev_info_once (pfdev->dev,"using only 1st core group (%lu cores from %lu)\n" , +hweight64 (core_mask), +hweight64 (pfdev->features.shader_present)); + +return core_mask; +} +void panfrost_gpu_power_on (struct panfrost_device *pfdev) {int ret;u32 val; -u64 core_mask =U64_MAX ; +u64 core_mask;panfrost_gpu_init_quirks (pfdev); + core_mask =panfrost_get_core_mask (pfdev); -if (pfdev->features.l2_present !=1 ) { -/* -* Only support one core group now. -* ~(l2_present - 1) unsets all bits in l2_present except -* the bottom bit. (l2_present - 2) has all the bits in -* the first core group set. AND them together to generate -* a mask of cores in the first core group. -*/ - core_mask = ~(pfdev->features.l2_present -1 ) & - (pfdev->features.l2_present -2 ); -dev_info_once (pfdev->dev,"using only 1st core group (%lu cores from %lu)\n" , -hweight64 (core_mask), -hweight64 (pfdev->features.shader_present)); - }gpu_write (pfdev,L2_PWRON_LO , pfdev->features.l2_present & core_mask); ret = readl_relaxed_poll_timeout(pfdev->iomem + L2_READY_LO, val, val == (pfdev->features.l2_present & core_mask),
@@ -359,9 +369,27 @@ void panfrost_gpu_power_on(struct panfrost_device *pfdev)void panfrost_gpu_power_off (struct panfrost_device *pfdev) { -gpu_write (pfdev,TILER_PWROFF_LO ,0 ); -gpu_write (pfdev,SHADER_PWROFF_LO ,0 ); -gpu_write (pfdev,L2_PWROFF_LO ,0 ); +u64 core_mask =panfrost_get_core_mask (pfdev); +int ret; +u32 val; + +gpu_write (pfdev,SHADER_PWROFF_LO , pfdev->features.shader_present & core_mask); + ret =readl_relaxed_poll_timeout (pfdev->iomem +SHADER_PWRTRANS_LO , + val, !val,1 ,1000 ); +if (ret) +dev_err (pfdev->dev,"shader power transition timeout" ); + +gpu_write (pfdev,TILER_PWROFF_LO , pfdev->features.tiler_present); + ret =readl_relaxed_poll_timeout (pfdev->iomem +TILER_PWRTRANS_LO , + val, !val,1 ,1000 ); +if (ret) +dev_err (pfdev->dev,"tiler power transition timeout" ); + +gpu_write (pfdev,L2_PWROFF_LO , pfdev->features.l2_present & core_mask); + ret =readl_poll_timeout (pfdev->iomem +L2_PWRTRANS_LO , + val, !val,0 ,1000 ); +if (ret) +dev_err (pfdev->dev,"l2 power transition timeout" ); }int panfrost_gpu_init (struct panfrost_device *pfdev)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 159/417 RDMA/usnic: Silence uninitialized symbol smatch warnings
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Romanovsky <[email protected]>
[ Upstream commit b9a85e5eec126d6ae6c362f94b447c223e8fe6e4 ]
The patch 1da177e4c3f4: "Linux-2.6.12-rc2" from Apr 16, 2005 (linux-next), leads to the following Smatch static checker warning:
drivers/infiniband/hw/mthca/mthca_cmd.c:644 mthca_SYS_EN()
error: uninitialized symbol 'out'.
drivers/infiniband/hw/mthca/mthca_cmd.c
636 int mthca_SYS_EN(struct mthca_dev *dev)
637 {
638 u64 out;
639 int ret;
640
641 ret = mthca_cmd_imm(dev, 0, &out, 0, 0, CMD_SYS_EN, CMD_TIME_CLASS_D);We pass out here and it gets used without being initialized.
err = mthca_cmd_post(dev, in_param,
out_param ? *out_param : 0,
^^^^^^^^^^
in_modifier, op_modifier,
op, context->token, 1);It's the same in mthca_cmd_wait() and mthca_cmd_poll().
--- drivers/infiniband/hw/mthca/mthca_cmd.c | 4 ++-- drivers/infiniband/hw/mthca/mthca_main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/infiniband/hw/mthca/mthca_cmd.c +2 -2
@@ -635,7 +635,7 @@ void mthca_free_mailbox(struct mthca_dev *dev, struct mthca_mailbox *mailbox)int mthca_SYS_EN (struct mthca_dev *dev) { -u64 out; +u64 out =0 ;int ret; ret =mthca_cmd_imm (dev,0 , &out,0 ,0 ,CMD_SYS_EN ,CMD_TIME_CLASS_D );
@@ -1955,7 +1955,7 @@ int mthca_WRITE_MGM(struct mthca_dev *dev, int index,int mthca_MGID_HASH (struct mthca_dev *dev,struct mthca_mailbox *mailbox,u16 *hash) { -u64 imm; +u64 imm =0 ;int err; err = mthca_cmd_imm(dev, mailbox->dma, &imm, 0, 0, CMD_MGID_HASH,
drivers/infiniband/hw/mthca/mthca_main.c +1 -1
@@ -382,7 +382,7 @@ static int mthca_init_icm(struct mthca_dev *mdev, struct mthca_init_hca_param *init_hca, u64 icm_size) { -u64 aux_pages; +u64 aux_pages =0 ;int err; err =mthca_SET_ICM_SIZE (mdev, icm_size, &aux_pages);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 160/417 RDMA/hns: Fix inappropriate err code for unsupported operations
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit f45b83ad39f8033e717b1eee57e81811113d5a84 ]
EOPNOTSUPP is more situable than EINVAL for allocating XRCD while XRC is not supported and unsupported resizing SRQ.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 2 +- drivers/infiniband/hw/hns/hns_roce_pd.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +1 -1
@@ -5791,7 +5791,7 @@ static int hns_roce_v2_modify_srq(struct ib_srq *ibsrq,/* Resizing SRQs is not supported yet */ if (srq_attr_mask &IB_SRQ_MAX_WR ) -return -EINVAL ; +return -EOPNOTSUPP ;if (srq_attr_mask &IB_SRQ_LIMIT ) {if (srq_attr->srq_limit > srq->wqe_cnt)
drivers/infiniband/hw/hns/hns_roce_pd.c +1 -1
@@ -150,7 +150,7 @@ int hns_roce_alloc_xrcd(struct ib_xrcd *ib_xrcd, struct ib_udata *udata)int ret;if (!(hr_dev->caps.flags &HNS_ROCE_CAP_FLAG_XRC )) -return -EINVAL ; +return -EOPNOTSUPP ; ret =hns_roce_xrcd_alloc (hr_dev, &xrcd->xrcdn);if (ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 161/417 drm/panel-elida-kd35t133: hold panel in reset for unprepare
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Morgan <[email protected]>
[ Upstream commit 03c5b2a5f6c39fe4e090346536cf1c14ee18b61e ]
For devices like the Anbernic RG351M and RG351P the panel is wired to an always on regulator. When the device suspends and wakes up, there are some slight artifacts on the screen that go away over time. If instead we hold the panel in reset status after it is unprepared, this does not happen.
--- drivers/gpu/drm/panel/panel-elida-kd35t133.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/panel/panel-elida-kd35t133.c +2 -0
@@ -112,6 +112,8 @@ static int kd35t133_unprepare(struct drm_panel *panel)return ret; } +gpiod_set_value_cansleep (ctx->reset_gpio,1 ); +regulator_disable (ctx->iovcc);regulator_disable (ctx->vdd);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 162/417 drm/nouveau/fence:: fix warning directly dereferencing a rcu pointer
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abhinav Singh <[email protected]>
[ Upstream commit 5f35a624c1e30b5bae5023b3c256e94e0ad4f806 ]
Fix a sparse warning with this message
"warning:dereference of noderef expression". In this context it means we are dereferencing a __rcu tagged pointer directly.
We should not be directly dereferencing a rcu pointer. To get a normal (non __rcu tagged pointer) from a __rcu tagged pointer we are using the function unrcu_pointer(...). The non __rcu tagged pointer then can be dereferenced just like a normal pointer.
I tested with qemu with this command
qemu-system-x86_64 \ -m 2G \ -smp 2 \ -kernel bzImage \ -append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \ -drive file=bullseye.img,format=raw \ -net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \ -net nic,model=e1000 \ -enable-kvm \ -nographic \ -pidfile vm.pid \ 2>&1 | tee vm.log
with lockdep enabled.
--- drivers/gpu/drm/nouveau/nv04_fence.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nv04_fence.c +1 -1
@@ -39,7 +39,7 @@ struct nv04_fence_priv {static int nv04_fence_emit (struct nouveau_fence *fence) { -struct nvif_push *push = fence->channel->chan.push; +struct nvif_push *push =unrcu_pointer (fence->channel)->chan.push;int ret =PUSH_WAIT (push,2 );if (ret ==0 ) {PUSH_NVSQ (push,NV_SW ,0x0150 , fence->base.seqno);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 163/417 drm/bridge: tpd12s015: Drop buggy __exit annotation for remove function
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit ce3e112e7ae854249d8755906acc5f27e1542114 ]
With tpd12s015_remove() marked with __exit this function is discarded when the driver is compiled as a built-in. The result is that when the driver unbinds there is no cleanup done which results in resource leakage or worse.
--- drivers/gpu/drm/bridge/ti-tpd12s015.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/ti-tpd12s015.c +2 -2
@@ -179,7 +179,7 @@ static int tpd12s015_probe(struct platform_device *pdev)return 0 ; } -static int __exit tpd12s015_remove(struct platform_device *pdev) +static int tpd12s015_remove (struct platform_device *pdev) {struct tpd12s015_device *tpd =platform_get_drvdata (pdev);
@@ -197,7 +197,7 @@ MODULE_DEVICE_TABLE(of, tpd12s015_of_match);static struct platform_driver tpd12s015_driver = { .probe = tpd12s015_probe, - .remove =__exit_p (tpd12s015_remove), + .remove = tpd12s015_remove, .driver = { .name ="tpd12s015" , .of_match_table = tpd12s015_of_match,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 164/417 drm/tilcdc: Fix irq free on unload
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 38360bf96d816e175bc602c4ee76953cd303b71d ]
The driver only frees the reserved irq if priv->irq_enabled is set to true. However, the driver mistakenly sets priv->irq_enabled to false, instead of true, in tilcdc_irq_install(), and thus the driver never frees the irq, causing issues on loading the driver a second time.
--- drivers/gpu/drm/tilcdc/tilcdc_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/tilcdc/tilcdc_drv.c +1 -1
@@ -138,7 +138,7 @@ static int tilcdc_irq_install(struct drm_device *dev, unsigned int irq)if (ret)return ret; - priv->irq_enabled = false; + priv->irq_enabled = true;return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 165/417 media: pvrusb2: fix use after free on context disconnection
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo B. Marliere <[email protected]>
[ Upstream commit ded85b0c0edd8f45fec88783d7555a5b982449c1 ]
Upon module load, a kthread is created targeting the pvr2_context_thread_func function, which may call pvr2_context_destroy and thus call kfree() on the context object. However, that might happen before the usb hub_event handler is able to notify the driver. This patch adds a sanity check before the invalid read reported by syzbot, within the context disconnection call stack.
--- drivers/media/usb/pvrusb2/pvrusb2-context.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/media/usb/pvrusb2/pvrusb2-context.c +2 -1
@@ -268,7 +268,8 @@ void pvr2_context_disconnect(struct pvr2_context *mp) {pvr2_hdw_disconnect (mp->hdw); mp->disconnect_flag = !0 ; -pvr2_context_notify (mp); +if (!pvr2_context_shutok ()) +pvr2_context_notify (mp); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 166/417 media: mtk-jpegdec: export jpeg decoder functions
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: kyrie wu <[email protected]>
[ Upstream commit 08d530a8da706f157e9dcb4d9b7b4f0eff908ab9 ]
mtk jpeg decoder is built as a module, export some functions to make them visible by other modules.
Stable-dep-of: d8212c5c87c1 ("media: mtk-jpeg: Remove cancel worker in mtk_jpeg_remove to avoid the crash of multi-core JPEG devices")
--- drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c +6 -0
@@ -188,6 +188,7 @@ int mtk_jpeg_dec_fill_param(struct mtk_jpeg_dec_param *param)return 0 ; } +EXPORT_SYMBOL_GPL (mtk_jpeg_dec_fill_param);u32 mtk_jpeg_dec_get_int_status (void __iomem *base) {
@@ -199,6 +200,7 @@ u32 mtk_jpeg_dec_get_int_status(void __iomem *base)return ret; } +EXPORT_SYMBOL_GPL (mtk_jpeg_dec_get_int_status);u32 mtk_jpeg_dec_enum_result (u32 irq_result) {
@@ -215,11 +217,13 @@ u32 mtk_jpeg_dec_enum_result(u32 irq_result)return MTK_JPEG_DEC_RESULT_ERROR_UNKNOWN ; } +EXPORT_SYMBOL_GPL (mtk_jpeg_dec_enum_result);void mtk_jpeg_dec_start (void __iomem *base) {writel (0 , base +JPGDEC_REG_TRIG ); } +EXPORT_SYMBOL_GPL (mtk_jpeg_dec_start);static void mtk_jpeg_dec_soft_reset (void __iomem *base) {
@@ -239,6 +243,7 @@ void mtk_jpeg_dec_reset(void __iomem *base)mtk_jpeg_dec_soft_reset (base);mtk_jpeg_dec_hard_reset (base); } +EXPORT_SYMBOL_GPL (mtk_jpeg_dec_reset);static void mtk_jpeg_dec_set_brz_factor (void __iomem *base,u8 yscale_w,u8 yscale_h,u8 uvscale_w,u8 uvscale_h)
@@ -407,3 +412,4 @@ void mtk_jpeg_dec_set_config(void __iomem *base, config->dma_last_mcu);mtk_jpeg_dec_set_pause_mcu_idx (base, config->total_mcu); } +EXPORT_SYMBOL_GPL (mtk_jpeg_dec_set_config);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 167/417 media: mtk-jpeg: Remove cancel worker in mtk_jpeg_remove to avoid the crash of multi-core JPEG devices
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zheng Wang <[email protected]>
[ Upstream commit d8212c5c87c143ca01b78f6bf61244af07e0058e ]
This patch reverts commit c677d7ae8314
("media: mtk-jpeg: Fix use after free bug due to uncanceled work"). The job_timeout_work is initialized only for
the single-core JPEG device so it will cause the crash for multi-core JPEG devices.
Fix it by removing the cancel_delayed_work_sync function.
--- drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c | 1 - 1 file changed, 1 deletion(-)
drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c +0 -1
@@ -1412,7 +1412,6 @@ static int mtk_jpeg_remove(struct platform_device *pdev) {struct mtk_jpeg_dev *jpeg =platform_get_drvdata (pdev); -cancel_delayed_work_sync (&jpeg->job_timeout_work);pm_runtime_disable (&pdev->dev);video_unregister_device (jpeg->vdev);v4l2_m2m_release (jpeg->m2m_dev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 168/417 media: verisilicon: Hook the (TRY_)DECODER_CMD stateless ioctls
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Kocialkowski <[email protected]>
[ Upstream commit 6c0d9e12b1d12bbd95484e4b99f63feeb423765f ]
The (TRY_)DECODER_CMD ioctls are used to support flushing when holding capture buffers is supported. This is the case of this driver but the ioctls were never hooked to the ioctl ops.
Add them to correctly support flushing.
--- drivers/media/platform/verisilicon/hantro_drv.c | 2 ++ drivers/media/platform/verisilicon/hantro_v4l2.c | 3 +++ 2 files changed, 5 insertions(+)
drivers/media/platform/verisilicon/hantro_drv.c +2 -0
@@ -813,6 +813,8 @@ static int hantro_add_func(struct hantro_dev *vpu, unsigned int funcid)if (funcid ==MEDIA_ENT_F_PROC_VIDEO_ENCODER ) { vpu->encoder = func; +v4l2_disable_ioctl (vfd,VIDIOC_TRY_DECODER_CMD ); +v4l2_disable_ioctl (vfd,VIDIOC_DECODER_CMD ); }else { vpu->decoder = func;v4l2_disable_ioctl (vfd,VIDIOC_TRY_ENCODER_CMD );
drivers/media/platform/verisilicon/hantro_v4l2.c +3 -0
@@ -759,6 +759,9 @@ const struct v4l2_ioctl_ops hantro_ioctl_ops = { .vidioc_g_selection = vidioc_g_selection, .vidioc_s_selection = vidioc_s_selection, + .vidioc_decoder_cmd = v4l2_m2m_ioctl_stateless_decoder_cmd, + .vidioc_try_decoder_cmd = v4l2_m2m_ioctl_stateless_try_decoder_cmd, + .vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd, .vidioc_encoder_cmd = vidioc_encoder_cmd, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 169/417 media: rkvdec: Hook the (TRY_)DECODER_CMD stateless ioctls
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Kocialkowski <[email protected]>
[ Upstream commit 1fb7b5ab62113b29ce331464048d8c39e58fd08a ]
The (TRY_)DECODER_CMD ioctls are used to support flushing when holding capture buffers is supported. This is the case of this driver but the ioctls were never hooked to the ioctl ops.
Add them to correctly support flushing.
--- drivers/staging/media/rkvdec/rkvdec.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/staging/media/rkvdec/rkvdec.c +3 -0
@@ -461,6 +461,9 @@ static const struct v4l2_ioctl_ops rkvdec_ioctl_ops = { .vidioc_streamon = v4l2_m2m_ioctl_streamon, .vidioc_streamoff = v4l2_m2m_ioctl_streamoff, + + .vidioc_decoder_cmd = v4l2_m2m_ioctl_stateless_decoder_cmd, + .vidioc_try_decoder_cmd = v4l2_m2m_ioctl_stateless_try_decoder_cmd, }; static int rkvdec_queue_setup(struct vb2_queue *vq, unsigned int *num_buffers,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 170/417 drm/bridge: Fix typo in post_disable() description
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 288b039db225676e0c520c981a1b5a2562d893a3 ]
s/singals/signals/
--- include/drm/drm_bridge.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/drm/drm_bridge.h +1 -1
@@ -191,7 +191,7 @@ struct drm_bridge_funcs {* or &drm_encoder_helper_funcs.dpms hook. * * The bridge must assume that the display pipe (i.e. clocks and timing -* singals) feeding it is no longer running when this callback is +* signals) feeding it is no longer running when this callback is * called. * * The @post_disable callback is optional.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 171/417 f2fs: fix to avoid dirent corruption
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 53edb549565f55ccd0bdf43be3d66ce4c2d48b28 ]
As Al reported in link[1]:
f2fs_rename()
...
if (old_dir != new_dir && !whiteout) f2fs_set_link(old_inode, old_dir_entry, old_dir_page, new_dir); else f2fs_put_page(old_dir_page, 0);
You want correct inumber in the ".." link. And cross-directory rename does move the source to new parent, even if you'd been asked to leave a whiteout in the old place.
[1] https://lore.kernel.org/all/20231017055040.GN800259@ZenIV/
With below testcase, it may cause dirent corruption, due to it missed to call f2fs_set_link() to update ".." link to new directory.
- mkdir -p dir/foo
- renameat2 -w dir/foo bar
[ASSERT] (__chk_dots_dentries:1421) --> Bad inode number[0x4] for '..', parent parent ino is [0x3]
[FSCK] other corrupted bugs [Fail]
--- fs/f2fs/namei.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/namei.c +1 -1
@@ -1099,7 +1099,7 @@ static int f2fs_rename(struct user_namespace *mnt_userns, struct inode *old_dir, }if (old_dir_entry) { -if (old_dir != new_dir && !whiteout) +if (old_dir != new_dir)f2fs_set_link (old_inode, old_dir_entry, old_dir_page, new_dir);else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 172/417 drm/radeon/r600_cs: Fix possible int overflows in r600_cs_check_reg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikita Zhandarovich <[email protected]>
[ Upstream commit 39c960bbf9d9ea862398759e75736cfb68c3446f ]
While improbable, there may be a chance of hitting integer overflow when the result of radeon_get_ib_value() gets shifted left.
Avoid it by casting one of the operands to larger data type (u64).
Found by Linux Verification Center (linuxtesting.org) with static analysis tool SVACE.
--- drivers/gpu/drm/radeon/r600_cs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/r600_cs.c +2 -2
@@ -1275,7 +1275,7 @@ static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)return -EINVAL ; } tmp = (reg -CB_COLOR0_BASE ) /4 ; - track->cb_color_bo_offset[tmp] =radeon_get_ib_value (p, idx) <<8 ; + track->cb_color_bo_offset[tmp] = (u64 )radeon_get_ib_value (p, idx) <<8 ; ib[idx] += (u32)((reloc->gpu_offset >>8 ) &0xffffffff ); track->cb_color_base_last[tmp] = ib[idx]; track->cb_color_bo[tmp] = reloc->robj;
@@ -1302,7 +1302,7 @@ static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx) "0x%04X\n", reg);return -EINVAL ; } - track->htile_offset =radeon_get_ib_value (p, idx) <<8 ; + track->htile_offset = (u64 )radeon_get_ib_value (p, idx) <<8 ; ib[idx] += (u32)((reloc->gpu_offset >>8 ) &0xffffffff ); track->htile_bo = reloc->robj; track->db_dirty = true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 173/417 drm/radeon/r100: Fix integer overflow issues in r100_cs_track_check()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikita Zhandarovich <[email protected]>
[ Upstream commit b5c5baa458faa5430c445acd9a17481274d77ccf ]
It may be possible, albeit unlikely, to encounter integer overflow during the multiplication of several unsigned int variables, the result being assigned to a variable 'size' of wider type.
Prevent this potential behaviour by converting one of the multiples to unsigned long.
Found by Linux Verification Center (linuxtesting.org) with static analysis tool SVACE.
--- drivers/gpu/drm/radeon/r100.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/r100.c +2 -2
@@ -2321,7 +2321,7 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)switch (prim_walk) {case 1 :for (i =0 ; i < track->num_arrays; i++) { - size = track->arrays[i].esize * track->max_indx *4 ; + size = track->arrays[i].esize * track->max_indx *4UL ;if (track->arrays[i].robj ==NULL ) {DRM_ERROR ("(PW %u) Vertex array %u no buffer " "bound\n" , prim_walk, i);
@@ -2340,7 +2340,7 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)break ;case 2 :for (i =0 ; i < track->num_arrays; i++) { - size = track->arrays[i].esize * (nverts -1 ) *4 ; + size = track->arrays[i].esize * (nverts -1 ) *4UL ;if (track->arrays[i].robj ==NULL ) {DRM_ERROR ("(PW %u) Vertex array %u no buffer " "bound\n" , prim_walk, i);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 174/417 drm/radeon: check return value of radeon_ring_lock()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikita Zhandarovich <[email protected]>
[ Upstream commit 71225e1c930942cb1e042fc08c5cc0c4ef30e95e ]
In the unlikely event of radeon_ring_lock() failing, its errno return value should be processed. This patch checks said return value and prints a debug message in case of an error.
Found by Linux Verification Center (linuxtesting.org) with static analysis tool SVACE.
--- drivers/gpu/drm/radeon/si.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/radeon/si.c +4 -0
@@ -3611,6 +3611,10 @@ static int si_cp_start(struct radeon_device *rdev)for (i =RADEON_RING_TYPE_GFX_INDEX ; i <=CAYMAN_RING_TYPE_CP2_INDEX ; ++i) { ring = &rdev->ring[i]; r =radeon_ring_lock (rdev, ring,2 ); +if (r) { +DRM_ERROR ("radeon: cp failed to lock ring (%d).\n" , r); +return r; + }/* clear the compute context state */ radeon_ring_write (ring,PACKET3_COMPUTE (PACKET3_CLEAR_STATE ,0 ));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 175/417 drm/tidss: Move reset to the end of dispc_init()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 36d1e0852680aa038e2428d450673390111b165c ]
We do a DSS reset in the middle of the dispc_init(). While that happens to work now, we should really make sure that e..g the fclk, which is acquired only later in the function, is enabled when doing a reset. This will be handled in a later patch, but for now, let's move the dispc_softreset() call to the end of dispc_init(), which is a sensible place for it anyway.
Stable-dep-of: bc288a927815 ("drm/tidss: Fix dss reset")
--- drivers/gpu/drm/tidss/tidss_dispc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/tidss/tidss_dispc.c +4 -4
@@ -2726,10 +2726,6 @@ int dispc_init(struct tidss_device *tidss)return r; } -/* K2G display controller does not support soft reset */ -if (feat->subrev !=DISPC_K2G ) -dispc_softreset (dispc); -for (i =0 ; i < dispc->feat->num_vps; i++) {u32 gamma_size = dispc->feat->vp_feat.color.gamma_size;u32 *gamma_table;
@@ -2778,6 +2774,10 @@ int dispc_init(struct tidss_device *tidss)of_property_read_u32 (dispc->dev->of_node,"max-memory-bandwidth" , &dispc->memory_bandwidth_limit); +/* K2G display controller does not support soft reset */ +if (feat->subrev !=DISPC_K2G ) +dispc_softreset (dispc); + tidss->dispc = dispc;return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 176/417 drm/tidss: Return error value from from softreset
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit aceafbb5035c4bfc75a321863ed1e393d644d2d2 ]
Return an error value from dispc_softreset() so that the caller can handle the errors.
Stable-dep-of: bc288a927815 ("drm/tidss: Fix dss reset")
--- drivers/gpu/drm/tidss/tidss_dispc.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/gpu/drm/tidss/tidss_dispc.c +12 -5
@@ -2653,7 +2653,7 @@ static void dispc_init_errata(struct dispc_device *dispc) } } -static void dispc_softreset (struct dispc_device *dispc) +static int dispc_softreset (struct dispc_device *dispc) {u32 val;int ret =0 ;
@@ -2663,8 +2663,12 @@ static void dispc_softreset(struct dispc_device *dispc)/* Wait for reset to complete */ ret =readl_poll_timeout (dispc->base_common +DSS_SYSSTATUS , val, val &1 ,100 ,5000 ); -if (ret) -dev_warn (dispc->dev,"failed to reset dispc\n" ); +if (ret) { +dev_err (dispc->dev,"failed to reset dispc\n" ); +return ret; + } + +return 0 ; }int dispc_init (struct tidss_device *tidss)
@@ -2775,8 +2779,11 @@ int dispc_init(struct tidss_device *tidss) &dispc->memory_bandwidth_limit);/* K2G display controller does not support soft reset */ -if (feat->subrev !=DISPC_K2G ) -dispc_softreset (dispc); +if (feat->subrev !=DISPC_K2G ) { + r =dispc_softreset (dispc); +if (r) +return r; + } tidss->dispc = dispc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 177/417 drm/tidss: Check for K2G in in dispc_softreset()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 151825150cf9c2e9fb90763d35b9dff3783628ac ]
K2G doesn't have softreset feature. Instead of having every caller of dispc_softreset() check for K2G, move the check into dispc_softreset(), and make dispc_softreset() return 0 in case of K2G.
Stable-dep-of: bc288a927815 ("drm/tidss: Fix dss reset")
--- drivers/gpu/drm/tidss/tidss_dispc.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/gpu/drm/tidss/tidss_dispc.c +7 -6
@@ -2658,6 +2658,10 @@ static int dispc_softreset(struct dispc_device *dispc)u32 val;int ret =0 ; +/* K2G display controller does not support soft reset */ +if (dispc->feat->subrev ==DISPC_K2G ) +return 0 ; +/* Soft reset */ REG_FLD_MOD (dispc,DSS_SYSCONFIG ,1 ,1 ,1 );/* Wait for reset to complete */
@@ -2778,12 +2782,9 @@ int dispc_init(struct tidss_device *tidss)of_property_read_u32 (dispc->dev->of_node,"max-memory-bandwidth" , &dispc->memory_bandwidth_limit); -/* K2G display controller does not support soft reset */ -if (feat->subrev !=DISPC_K2G ) { - r =dispc_softreset (dispc); -if (r) -return r; - } + r =dispc_softreset (dispc); +if (r) +return r; tidss->dispc = dispc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/417 drm/tidss: Fix dss reset
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit bc288a927815efcf9d7f4a54d4d89c5df478c635 ]
The probe function calls dispc_softreset() before runtime PM is enabled and without enabling any of the DSS clocks. This happens to work by luck, and we need to make sure the DSS HW is active and the fclk is enabled.
To fix the above, add a new function, dispc_init_hw(), which does:
- pm_runtime_set_active()
- clk_prepare_enable(fclk)
- dispc_softreset().
This ensures that the reset can be successfully accomplished.
Note that we use pm_runtime_set_active(), not the normal pm_runtime_get(). The reason for this is that at this point we haven't enabled the runtime PM yet and also we don't want the normal resume callback to be called: the dispc resume callback does some initial HW setup, and it expects that the HW was off (no video ports are streaming). If the bootloader has enabled the DSS and has set up a boot time splash-screen, the DSS would be enabled and streaming which might lead to issues with the normal resume callback.
--- drivers/gpu/drm/tidss/tidss_dispc.c | 45 ++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-)
drivers/gpu/drm/tidss/tidss_dispc.c +44 -1
@@ -2675,6 +2675,49 @@ static int dispc_softreset(struct dispc_device *dispc)return 0 ; } +static int dispc_init_hw (struct dispc_device *dispc) +{ +struct device *dev = dispc->dev; +int ret; + + ret =pm_runtime_set_active (dev); +if (ret) { +dev_err (dev,"Failed to set DSS PM to active\n" ); +return ret; + } + + ret =clk_prepare_enable (dispc->fclk); +if (ret) { +dev_err (dev,"Failed to enable DSS fclk\n" ); + goto err_runtime_suspend; + } + + ret =dispc_softreset (dispc); +if (ret) + goto err_clk_disable; + +clk_disable_unprepare (dispc->fclk); + ret =pm_runtime_set_suspended (dev); +if (ret) { +dev_err (dev,"Failed to set DSS PM to suspended\n" ); +return ret; + } + +return 0 ; + +err_clk_disable: +clk_disable_unprepare (dispc->fclk); + +err_runtime_suspend: + ret =pm_runtime_set_suspended (dev); +if (ret) { +dev_err (dev,"Failed to set DSS PM to suspended\n" ); +return ret; + } + +return ret; +} +int dispc_init (struct tidss_device *tidss) {struct device *dev = tidss->dev;
@@ -2782,7 +2825,7 @@ int dispc_init(struct tidss_device *tidss)of_property_read_u32 (dispc->dev->of_node,"max-memory-bandwidth" , &dispc->memory_bandwidth_limit); - r =dispc_softreset (dispc); + r =dispc_init_hw (dispc);if (r)return r;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/417 ASoC: cs35l33: Fix GPIO name and drop legacy include
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
[ Upstream commit 50678d339d670a92658e5538ebee30447c88ccb3 ]
This driver includes the legacy GPIO APIs <linux/gpio.h> and <linux/of_gpio.h> but does not use any symbols from any of them.
Drop the includes.
Further the driver is requesting "reset-gpios" rather than just "reset" from the GPIO framework. This is wrong because the gpiolib core will add "-gpios" before processing the request from e.g. device tree. Drop the suffix.
The last problem means that the optional RESET GPIO has never been properly retrieved and used even if it existed, but nobody noticed.
--- sound/soc/codecs/cs35l33.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
sound/soc/codecs/cs35l33.c +1 -3
@@ -22,13 +22,11 @@#include <sound/soc-dapm.h> #include <sound/initval.h> #include <sound/tlv.h> -#include <linux/gpio.h> #include <linux/gpio/consumer.h> #include <sound/cs35l33.h> #include <linux/pm_runtime.h> #include <linux/regulator/consumer.h> #include <linux/regulator/machine.h> -#include <linux/of_gpio.h> #include <linux/of.h> #include <linux/of_device.h> #include <linux/of_irq.h>
@@ -1167,7 +1165,7 @@ static int cs35l33_i2c_probe(struct i2c_client *i2c_client)/* We could issue !RST or skip it based on AMP topology */ cs35l33->reset_gpio =devm_gpiod_get_optional (&i2c_client->dev, -"reset-gpios" ,GPIOD_OUT_HIGH ); +"reset" ,GPIOD_OUT_HIGH );if (IS_ERR (cs35l33->reset_gpio)) {dev_err (&i2c_client->dev,"%s ERROR: Can't get reset GPIO\n" , __func__);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 180/417 ASoC: cs35l34: Fix GPIO name and drop legacy include
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
[ Upstream commit a6122b0b4211d132934ef99e7b737910e6d54d2f ]
This driver includes the legacy GPIO APIs <linux/gpio.h> and <linux/of_gpio.h> but does not use any symbols from any of them.
Drop the includes.
Further the driver is requesting "reset-gpios" rather than just "reset" from the GPIO framework. This is wrong because the gpiolib core will add "-gpios" before processing the request from e.g. device tree. Drop the suffix.
The last problem means that the optional RESET GPIO has never been properly retrieved and used even if it existed, but nobody noticed.
--- sound/soc/codecs/cs35l34.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
sound/soc/codecs/cs35l34.c +1 -3
@@ -20,14 +20,12 @@#include <linux/regulator/machine.h> #include <linux/pm_runtime.h> #include <linux/of_device.h> -#include <linux/of_gpio.h> #include <linux/of_irq.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/pcm_params.h> #include <sound/soc.h> #include <sound/soc-dapm.h> -#include <linux/gpio.h> #include <linux/gpio/consumer.h> #include <sound/initval.h> #include <sound/tlv.h>
@@ -1061,7 +1059,7 @@ static int cs35l34_i2c_probe(struct i2c_client *i2c_client)dev_err (&i2c_client->dev,"Failed to request IRQ: %d\n" , ret); cs35l34->reset_gpio =devm_gpiod_get_optional (&i2c_client->dev, -"reset-gpios" ,GPIOD_OUT_LOW ); +"reset" ,GPIOD_OUT_LOW );if (IS_ERR (cs35l34->reset_gpio)) { ret =PTR_ERR (cs35l34->reset_gpio); goto err_regulator;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 181/417 drm/msm/mdp4: flush vblank event on disable
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit c6721b3c6423d8a348ae885a0f4c85e14f9bf85c ]
Flush queued events when disabling the crtc. This avoids timeouts when we come back and wait for dependencies (like the previous frame's flip_done).
Patchwork: https://patchwork.freedesktop.org/patch/569127/
--- drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c +9 -0
@@ -269,6 +269,7 @@ static void mdp4_crtc_atomic_disable(struct drm_crtc *crtc, {struct mdp4_crtc *mdp4_crtc =to_mdp4_crtc (crtc);struct mdp4_kms *mdp4_kms =get_kms (crtc); +unsigned long flags;DBG ("%s" , mdp4_crtc->name);
@@ -281,6 +282,14 @@ static void mdp4_crtc_atomic_disable(struct drm_crtc *crtc,mdp_irq_unregister (&mdp4_kms->base, &mdp4_crtc->err);mdp4_disable (mdp4_kms); +if (crtc->state->event && !crtc->state->active) { +WARN_ON (mdp4_crtc->event); +spin_lock_irqsave (&mdp4_kms->dev->event_lock, flags); +drm_crtc_send_vblank_event (crtc, crtc->state->event); + crtc->state->event =NULL ; +spin_unlock_irqrestore (&mdp4_kms->dev->event_lock, flags); + } + mdp4_crtc->enabled = false; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 182/417 drm/msm/dsi: Use pm_runtime_resume_and_get to prevent refcnt leaks
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 3d07a411b4faaf2b498760ccf12888f8de529de0 ]
This helper has been introduced to avoid programmer errors (missing _put calls leading to dangling refcnt) when using pm_runtime_get, use it.
While at it, start checking the return value.
Patchwork: https://patchwork.freedesktop.org/patch/543350/
--- drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +3 -1
@@ -512,7 +512,9 @@ static int dsi_phy_enable_resource(struct msm_dsi_phy *phy)struct device *dev = &phy->pdev->dev;int ret; -pm_runtime_get_sync (dev); + ret =pm_runtime_resume_and_get (dev); +if (ret) +return ret; ret =clk_prepare_enable (phy->ahb_clk);if (ret) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 183/417 drm/drv: propagate errors from drm_modeset_register_all()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 5f8dec200923a76dc57187965fd59c1136f5d085 ]
In case the drm_modeset_register_all() function fails, its error code will be ignored. Instead make the drm_dev_register() bail out in case of such an error.
--- drivers/gpu/drm/drm_drv.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_drv.c +8 -2
@@ -895,8 +895,11 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags) goto err_minors; } -if (drm_core_check_feature (dev,DRIVER_MODESET )) -drm_modeset_register_all (dev); +if (drm_core_check_feature (dev,DRIVER_MODESET )) { + ret =drm_modeset_register_all (dev); +if (ret) + goto err_unload; + } DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n", driver->name, driver->major, driver->minor,
@@ -906,6 +909,9 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags) goto out_unlock; +err_unload: +if (dev->driver->unload) + dev->driver->unload (dev); err_minors:remove_compat_control_link (dev);drm_minor_unregister (dev,DRM_MINOR_PRIMARY );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 184/417 ASoC: Intel: glk_rt5682_max98357a: fix board id mismatch
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brent Lu <[email protected]>
[ Upstream commit 486ede0df82dd74472c6f5651e38ff48f7f766c1 ]
The drv_name in enumeration table for ALC5682I-VS codec does not match the board id string in machine driver. Modify the entry of "10EC5682" to enumerate "RTL5682" as well and remove invalid entry.
--- sound/soc/intel/common/soc-acpi-intel-glk-match.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
sound/soc/intel/common/soc-acpi-intel-glk-match.c +6 -8
@@ -19,6 +19,11 @@ static const struct snd_soc_acpi_codecs glk_codecs = { .codecs = {"MX98357A"} }; +static const struct snd_soc_acpi_codecs glk_rt5682_rt5682s_hp = { + .num_codecs =2 , + .codecs = {"10EC5682" ,"RTL5682" }, +}; +struct snd_soc_acpi_mach snd_soc_acpi_intel_glk_machines[] = { { .id ="INT343A" ,
@@ -35,20 +40,13 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_glk_machines[] = { .sof_tplg_filename = "sof-glk-da7219.tplg", }, { - .id = "10EC5682", + .comp_ids = &glk_rt5682_rt5682s_hp, .drv_name = "glk_rt5682_mx98357a", .fw_filename = "intel/dsp_fw_glk.bin", .machine_quirk = snd_soc_acpi_codec_list, .quirk_data = &glk_codecs, .sof_tplg_filename = "sof-glk-rt5682.tplg", }, - { - .id = "RTL5682", - .drv_name = "glk_rt5682_max98357a", - .machine_quirk = snd_soc_acpi_codec_list, - .quirk_data = &glk_codecs, - .sof_tplg_filename = "sof-glk-rt5682.tplg", - }, { .id = "10134242", .drv_name = "glk_cs4242_mx98357a",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 185/417 drm/panfrost: Ignore core_mask for poweroff and disable PWRTRANS irq
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit a4f5892914ca7709ea6d191f0edace93a5935966 ]
Some SoCs may be equipped with a GPU containing two core groups and this is exactly the case of Samsung's Exynos 5422 featuring an ARM Mali-T628 MP6 GPU: the support for this GPU in Panfrost is partial, as this driver currently supports using only one core group and that's reflected on all parts of it, including the power on (and power off, previously to this patch) function.
The issue with this is that even though executing the soft reset operation should power off all cores unconditionally, on at least one platform we're seeing a crash that seems to be happening due to an interrupt firing which may be because we are calling power transition only on the first core group, leaving the second one unchanged, or because ISR execution was pending before entering the panfrost_gpu_power_off() function and executed after powering off the GPU cores, or all of the above.
Finally, solve this by:
- Avoid to enable the power transition interrupt on reset; and
- Ignoring the core_mask and ask the GPU to poweroff both core groups
--- drivers/gpu/drm/panfrost/panfrost_gpu.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/panfrost/panfrost_gpu.c +8 -4
@@ -71,7 +71,12 @@ int panfrost_gpu_soft_reset(struct panfrost_device *pfdev) }gpu_write (pfdev,GPU_INT_CLEAR ,GPU_IRQ_MASK_ALL ); -gpu_write (pfdev,GPU_INT_MASK ,GPU_IRQ_MASK_ALL ); + +/* Only enable the interrupts we care about */ +gpu_write (pfdev,GPU_INT_MASK , +GPU_IRQ_MASK_ERROR | +GPU_IRQ_PERFCNT_SAMPLE_COMPLETED | +GPU_IRQ_CLEAN_CACHES_COMPLETED );return 0 ; }
@@ -369,11 +374,10 @@ void panfrost_gpu_power_on(struct panfrost_device *pfdev)void panfrost_gpu_power_off (struct panfrost_device *pfdev) { -u64 core_mask =panfrost_get_core_mask (pfdev);int ret;u32 val; -gpu_write (pfdev,SHADER_PWROFF_LO , pfdev->features.shader_present & core_mask); +gpu_write (pfdev,SHADER_PWROFF_LO , pfdev->features.shader_present); ret =readl_relaxed_poll_timeout (pfdev->iomem +SHADER_PWRTRANS_LO , val, !val,1 ,1000 );if (ret)
@@ -385,7 +389,7 @@ void panfrost_gpu_power_off(struct panfrost_device *pfdev)if (ret)dev_err (pfdev->dev,"tiler power transition timeout" ); -gpu_write (pfdev,L2_PWROFF_LO , pfdev->features.l2_present & core_mask); +gpu_write (pfdev,L2_PWROFF_LO , pfdev->features.l2_present); ret =readl_poll_timeout (pfdev->iomem +L2_PWRTRANS_LO , val, !val,0 ,1000 );if (ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 186/417 drm/radeon: check the alloc_workqueue return value in radeon_crtc_init()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Yingliang <[email protected]>
[ Upstream commit 7a2464fac80d42f6f8819fed97a553e9c2f43310 ]
check the alloc_workqueue return value in radeon_crtc_init() to avoid null-ptr-deref.
--- drivers/gpu/drm/radeon/radeon_display.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/radeon/radeon_display.c +6 -1
@@ -687,11 +687,16 @@ static void radeon_crtc_init(struct drm_device *dev, int index)if (radeon_crtc ==NULL )return ; + radeon_crtc->flip_queue =alloc_workqueue ("radeon-crtc" ,WQ_HIGHPRI ,0 ); +if (!radeon_crtc->flip_queue) { +kfree (radeon_crtc); +return ; + } +drm_crtc_init (dev, &radeon_crtc->base, &radeon_crtc_funcs);drm_mode_crtc_set_gamma_size (&radeon_crtc->base,256 ); radeon_crtc->crtc_id = index; - radeon_crtc->flip_queue =alloc_workqueue ("radeon-crtc" ,WQ_HIGHPRI ,0 ); rdev->mode_info.crtcs[index] = radeon_crtc;if (rdev->family >=CHIP_BONAIRE ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 187/417 drm/radeon/dpm: fix a memleak in sumo_parse_power_table
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit 0737df9ed0997f5b8addd6e2b9699a8c6edba2e4 ]
The rdev->pm.dpm.ps allocated by kcalloc should be freed in every following error-handling path. However, in the error-handling of rdev->pm.power_state[i].clock_info the rdev->pm.dpm.ps is not freed, resulting in a memleak in this function.
--- drivers/gpu/drm/radeon/sumo_dpm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/radeon/sumo_dpm.c +3 -1
@@ -1493,8 +1493,10 @@ static int sumo_parse_power_table(struct radeon_device *rdev) non_clock_array_index = power_state->v2.nonClockInfoIndex; non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) &non_clock_info_array->nonClockInfo[non_clock_array_index]; -if (!rdev->pm.power_state[i].clock_info) +if (!rdev->pm.power_state[i].clock_info) { +kfree (rdev->pm.dpm.ps);return -EINVAL ; + } ps =kzalloc (sizeof (struct sumo_ps ),GFP_KERNEL );if (ps ==NULL ) {kfree (rdev->pm.dpm.ps);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 188/417 drm/radeon/trinity_dpm: fix a memleak in trinity_parse_power_table
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit 28c28d7f77c06ac2c0b8f9c82bc04eba22912b3b ]
The rdev->pm.dpm.ps allocated by kcalloc should be freed in every following error-handling path. However, in the error-handling of rdev->pm.power_state[i].clock_info the rdev->pm.dpm.ps is not freed, resulting in a memleak in this function.
--- drivers/gpu/drm/radeon/trinity_dpm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/radeon/trinity_dpm.c +3 -1
@@ -1726,8 +1726,10 @@ static int trinity_parse_power_table(struct radeon_device *rdev) non_clock_array_index = power_state->v2.nonClockInfoIndex; non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) &non_clock_info_array->nonClockInfo[non_clock_array_index]; -if (!rdev->pm.power_state[i].clock_info) +if (!rdev->pm.power_state[i].clock_info) { +kfree (rdev->pm.dpm.ps);return -EINVAL ; + } ps =kzalloc (sizeof (struct sumo_ps ),GFP_KERNEL );if (ps ==NULL ) {kfree (rdev->pm.dpm.ps);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 189/417 drm/bridge: cdns-mhdp8546: Fix use of uninitialized variable
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 155d6fb61270dd297f128731cd155080deee8f3a ]
'ret' could be uninitialized at the end of the function, although it's not clear if that can happen in practice.
--- drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-hdcp.c +2 -1
@@ -403,7 +403,8 @@ static int _cdns_mhdp_hdcp_disable(struct cdns_mhdp_device *mhdp)static int _cdns_mhdp_hdcp_enable (struct cdns_mhdp_device *mhdp,u8 content_type) { -int ret, tries =3 ; +int ret = -EINVAL ; +int tries =3 ;u32 i;for (i =0 ; i < tries; i++) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 190/417 drm/bridge: tc358767: Fix return value on error case
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 32bd29b619638256c5b75fb021d6d9f12fc4a984 ]
If the hpd_pin is invalid, the driver returns 'ret'. But 'ret' contains 0, instead of an error value.
Return -EINVAL instead.
--- drivers/gpu/drm/bridge/tc358767.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/tc358767.c +1 -1
@@ -2097,7 +2097,7 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) }else {if (tc->hpd_pin <0 || tc->hpd_pin >1 ) {dev_err (dev,"failed to parse HPD number\n" ); -return ret; +return -EINVAL ; } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 191/417 media: cx231xx: fix a memleak in cx231xx_init_isoc
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit 5d3c8990e2bbf929cb211563dadd70708f42e4e6 ]
The dma_q->p_left_data alloced by kzalloc should be freed in all the following error handling paths. However, it hasn't been freed in the allocation error paths of dev->video_mode.isoc_ctl.urb and dev->video_mode.isoc_ctl.transfer_buffer.
On the other hand, the dma_q->p_left_data did be freed in the error-handling paths after that of dev->video_mode.isoc_ctl.urb and dev->video_mode.isoc_ctl.transfer_buffer, by calling cx231xx_uninit_isoc(dev). So the same free operation should be done in error-handling paths of those two allocation.
--- drivers/media/usb/cx231xx/cx231xx-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/usb/cx231xx/cx231xx-core.c +2 -0
@@ -1024,6 +1024,7 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,if (!dev->video_mode.isoc_ctl.urb) {dev_err (dev->dev,"cannot alloc memory for usb buffers\n" ); +kfree (dma_q->p_left_data);return -ENOMEM ; }
@@ -1033,6 +1034,7 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,dev_err (dev->dev,"cannot allocate memory for usbtransfer\n" );kfree (dev->video_mode.isoc_ctl.urb); +kfree (dma_q->p_left_data);return -ENOMEM ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 192/417 RDMA/hns: Fix memory leak in free_mr_init()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit 288f535951aa81ed674f5e5477ab11b9d9351b8c ]
When a reserved QP fails to be created, the memory of the remaining created reserved QPs is leaked.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +4 -0
@@ -2819,6 +2819,10 @@ static int free_mr_alloc_res(struct hns_roce_dev *hr_dev)return 0 ; create_failed_qp: +for (i--; i >=0 ; i--) { +hns_roce_v2_destroy_qp (&free_mr->rsv_qp[i]->ibqp,NULL ); +kfree (free_mr->rsv_qp[i]); + }hns_roce_destroy_cq (cq,NULL );kfree (cq);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 193/417 clk: qcom: gpucc-sm8150: Update the gpu_cc_pll1 config
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satya Priya Kakitapalli <[email protected]>
[ Upstream commit 6ebd9a4f8b8d2b35cf965a04849c4ba763722f13 ]
Update the test_ctl_hi_val and test_ctl_hi1_val of gpu_cc_pll1 as per latest HW recommendation.
--- drivers/clk/qcom/gpucc-sm8150.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/qcom/gpucc-sm8150.c +2 -2
@@ -37,8 +37,8 @@ static struct alpha_pll_config gpu_cc_pll1_config = { .config_ctl_hi_val = 0x00002267, .config_ctl_hi1_val = 0x00000024, .test_ctl_val = 0x00000000, - .test_ctl_hi_val = 0x00000002, - .test_ctl_hi1_val = 0x00000000, + .test_ctl_hi_val = 0x00000000, + .test_ctl_hi1_val = 0x00000020, .user_ctl_val = 0x00000000, .user_ctl_hi_val = 0x00000805, .user_ctl_hi1_val = 0x000000d0,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 194/417 media: imx-mipi-csis: Fix clock handling in remove()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 5705b0e0eb550ff834125a46a4ef99b62093d83d ]
The driver always calls mipi_csis_runtime_suspend() and mipi_csis_clk_disable() in remove(). This causes multiple WARNs from the kernel, as the clocks get disabled too many times.
Fix the remove() to call mipi_csis_runtime_suspend() and mipi_csis_clk_disable() in a way that reverses what is done in probe().
--- drivers/media/platform/nxp/imx-mipi-csis.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/nxp/imx-mipi-csis.c +3 -1
@@ -1553,8 +1553,10 @@ static int mipi_csis_remove(struct platform_device *pdev)v4l2_async_nf_cleanup (&csis->notifier);v4l2_async_unregister_subdev (&csis->sd); +if (!pm_runtime_enabled (&pdev->dev)) +mipi_csis_runtime_suspend (&pdev->dev); +pm_runtime_disable (&pdev->dev); -mipi_csis_runtime_suspend (&pdev->dev);mipi_csis_clk_disable (csis);media_entity_cleanup (&csis->sd.entity);fwnode_handle_put (csis->sd.fwnode);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 195/417 media: dt-bindings: media: rkisp1: Fix the port description for the parallel interface
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mehdi Djait <[email protected]>
[ Upstream commit 25bf28b25a2afa1864b7143259443160d9163ea0 ]
The bus-type belongs to the endpoint's properties and should therefore be moved.
--- .../devicetree/bindings/media/rockchip-isp1.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
Documentation/devicetree/bindings/media/rockchip-isp1.yaml +6 -5
@@ -90,15 +90,16 @@ properties: description: connection point for input on the parallel interface properties: - bus-type: - enum: [5, 6] - endpoint: $ref: video-interfaces.yaml# unevaluatedProperties: false - required: - - bus-type + properties: + bus-type: + enum: [5, 6] + + required: + - bus-type anyOf: - required:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 196/417 media: rkisp1: Fix media device memory leak
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 452f604a4683654f4d9472b3126d8da61d748443 ]
Add missing calls to media_device_cleanup() to fix memory leak.
--- drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c +5 -1
@@ -582,7 +582,7 @@ static int rkisp1_probe(struct platform_device *pdev) ret =v4l2_device_register (rkisp1->dev, &rkisp1->v4l2_dev);if (ret) - goto err_pm_runtime_disable; + goto err_media_dev_cleanup; ret =media_device_register (&rkisp1->media_dev);if (ret) {
@@ -617,6 +617,8 @@ static int rkisp1_probe(struct platform_device *pdev)media_device_unregister (&rkisp1->media_dev); err_unreg_v4l2_dev:v4l2_device_unregister (&rkisp1->v4l2_dev); +err_media_dev_cleanup: +media_device_cleanup (&rkisp1->media_dev); err_pm_runtime_disable:pm_runtime_disable (&pdev->dev);return ret;
@@ -637,6 +639,8 @@ static int rkisp1_remove(struct platform_device *pdev)media_device_unregister (&rkisp1->media_dev);v4l2_device_unregister (&rkisp1->v4l2_dev); +media_device_cleanup (&rkisp1->media_dev); +pm_runtime_disable (&pdev->dev);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 197/417 drm/panel: st7701: Fix AVCL calculation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Morgan <[email protected]>
[ Upstream commit 799825aa87200ade1ba21db853d1c2ff720dcfe0 ]
The AVCL register, according to the datasheet, comes in increments of -0.2v between -4.4v (represented by 0x0) to -5.0v (represented by 0x3). The current calculation is done by adding the defined AVCL value in mV to -4400 and then dividing by 200 to get the register value. Unfortunately if I subtract -4400 from -4400 I get -8800, which divided by 200 gives me -44. If I instead subtract -4400 from -4400 I get 0, which divided by 200 gives me 0. Based on the datasheet this is the expected register value.
--- drivers/gpu/drm/panel/panel-sitronix-st7701.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/panel/panel-sitronix-st7701.c +1 -1
@@ -288,7 +288,7 @@ static void st7701_init_sequence(struct st7701 *st7701)FIELD_PREP (DSI_CMD2_BK1_PWRCTRL2_AVDD_MASK ,DIV_ROUND_CLOSEST (desc->avdd_mv -6200 ,200 )) |FIELD_PREP (DSI_CMD2_BK1_PWRCTRL2_AVCL_MASK , - DIV_ROUND_CLOSEST(-4400 + desc->avcl_mv, 200))); + DIV_ROUND_CLOSEST(-4400 - desc->avcl_mv, 200)));/* T2D = 0.2us * T2D[3:0] */ ST7701_DSI(st7701, DSI_CMD2_BK1_SPD1,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 198/417 f2fs: fix to wait on block writeback for post_read case
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 55fdc1c24a1d6229fe0ecf31335fb9a2eceaaa00 ]
If inode is compressed, but not encrypted, it missed to call f2fs_wait_on_block_writeback() to wait for GCed page writeback in IPU write path.
Thread A GC-Thread
- f2fs_gc
- do_garbage_collect
- gc_data_segment
- move_data_block
- f2fs_submit_page_write migrate normal cluster's block via meta_inode's page cache
- f2fs_write_single_data_page
- f2fs_do_write_data_page
- f2fs_inplace_write_data
- f2fs_submit_page_bio
IRQ
- f2fs_read_end_io
IRQ
old data overrides new data due to out-of-order GC and common IO.
- f2fs_read_end_io
--- fs/f2fs/data.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/f2fs/data.c +4 -3
@@ -2490,9 +2490,6 @@ int f2fs_encrypt_one_page(struct f2fs_io_info *fio) page = fio->compressed_page ? fio->compressed_page : fio->page; -/* wait for GCed page writeback via META_MAPPING */ -f2fs_wait_on_block_writeback (inode, fio->old_blkaddr); -if (fscrypt_inode_uses_inline_crypto (inode))return 0 ;
@@ -2681,6 +2678,10 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio) goto out_writepage; } +/* wait for GCed page writeback via META_MAPPING */ +if (fio->post_read) +f2fs_wait_on_block_writeback (inode, fio->old_blkaddr); +/* * If current allocation needs SSR, * it had better in-place writes for updated data.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 199/417 f2fs: fix to check compress file in f2fs_move_file_range()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit fb9b65340c818875ea86464faf3c744bdce0055c ]
f2fs_move_file_range() doesn't support migrating compressed cluster data, let's add the missing check condition and return -EOPNOTSUPP for the case until we support it.
--- fs/f2fs/file.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/f2fs/file.c +5 -0
@@ -2821,6 +2821,11 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in, goto out; } +if (f2fs_compressed_file (src) ||f2fs_compressed_file (dst)) { + ret = -EOPNOTSUPP ; + goto out_unlock; + } + ret = -EINVAL ;if (pos_in + len > src->i_size || pos_in + len < pos_in) goto out_unlock;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 200/417 f2fs: fix to update iostat correctly in f2fs_filemap_fault()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit bb34cc6ca87ff78f9fb5913d7619dc1389554da6 ]
In f2fs_filemap_fault(), it fixes to update iostat info only if VM_FAULT_LOCKED is tagged in return value of filemap_fault().
--- fs/f2fs/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/file.c +1 -1
@@ -42,7 +42,7 @@ static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)vm_fault_t ret; ret =filemap_fault (vmf); -if (!ret) +if (ret &VM_FAULT_LOCKED )f2fs_update_iostat (F2FS_I_SB (inode), inode,APP_MAPPED_READ_IO ,F2FS_BLKSIZE );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 201/417 media: dvbdev: drop refcount on error path in dvb_device_open()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit a2dd235df435a05d389240be748909ada91201d2 ]
If call to file->f_op->open() fails, then call dvb_device_put(dvbdev).
--- drivers/media/dvb-core/dvbdev.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/dvb-core/dvbdev.c +2 -0
@@ -104,6 +104,8 @@ static int dvb_device_open(struct inode *inode, struct file *file) err = file->f_op->open (inode, file);up_read (&minor_rwsem);mutex_unlock (&dvbdev_mutex); +if (err) +dvb_device_put (dvbdev);return err; } fail:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 202/417 media: dvb-frontends: m88ds3103: Fix a memory leak in an error handling path of m88ds3103_probe()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 5b2f885e2f6f482d05c23f04c8240f7b4fc5bdb5 ]
If an error occurs after a successful i2c_mux_add_adapter(), then i2c_mux_del_adapters() should be called to free some resources, as already done in the remove function.
--- drivers/media/dvb-frontends/m88ds3103.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/media/dvb-frontends/m88ds3103.c +5 -2
@@ -1894,7 +1894,7 @@ static int m88ds3103_probe(struct i2c_client *client,/* get frontend address */ ret =regmap_read (dev->regmap,0x29 , &utmp);if (ret) - goto err_kfree; + goto err_del_adapters; dev->dt_addr = ((utmp &0x80 ) ==0 ) ?0x42 >>1 :0x40 >>1 ;dev_dbg (&client->dev,"dt addr is 0x%02x\n" , dev->dt_addr);
@@ -1902,11 +1902,14 @@ static int m88ds3103_probe(struct i2c_client *client, dev->dt_addr);if (IS_ERR (dev->dt_client)) { ret =PTR_ERR (dev->dt_client); - goto err_kfree; + goto err_del_adapters; } }return 0 ; + +err_del_adapters: +i2c_mux_del_adapters (dev->muxc); err_kfree:kfree (dev); err:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 203/417 clk: renesas: rzg2l-cpg: Reuse code in rzg2l_cpg_reset()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit 5f9e29b9159a41fcf6733c3b59fa46a90ce3ae20 ]
Code in rzg2l_cpg_reset() is equivalent with the combined code of rzg2l_cpg_assert() and rzg2l_cpg_deassert(). There is no need to have different versions thus re-use rzg2l_cpg_assert() and rzg2l_cpg_deassert().
Stable-dep-of: da235d2fac21 ("clk: renesas: rzg2l: Check reset monitor registers")
--- drivers/clk/renesas/rzg2l-cpg.c | 38 +++++++++++++-------------------- 1 file changed, 15 insertions(+), 23 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +15 -23
@@ -1115,29 +1115,6 @@ rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,#define rcdev_to_priv (x) container_of(x, struct rzg2l_cpg_priv, rcdev) -static int rzg2l_cpg_reset (struct reset_controller_dev *rcdev, -unsigned long id) -{ -struct rzg2l_cpg_priv *priv =rcdev_to_priv (rcdev); -const struct rzg2l_cpg_info *info = priv->info; -unsigned int reg = info->resets[id].off; -u32 dis =BIT (info->resets[id].bit); -u32 we = dis <<16 ; - -dev_dbg (rcdev->dev,"reset id:%ld offset:0x%x\n" , id,CLK_RST_R (reg)); - -/* Reset module */ -writel (we, priv->base +CLK_RST_R (reg)); - -/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ -udelay (35 ); - -/* Release module from reset state */ -writel (we | dis, priv->base +CLK_RST_R (reg)); - -return 0 ; -} -static int rzg2l_cpg_assert (struct reset_controller_dev *rcdev,unsigned long id) {
@@ -1168,6 +1145,21 @@ static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,return 0 ; } +static int rzg2l_cpg_reset (struct reset_controller_dev *rcdev, +unsigned long id) +{ +int ret; + + ret =rzg2l_cpg_assert (rcdev, id); +if (ret) +return ret; + +/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ +udelay (35 ); + +return rzg2l_cpg_deassert (rcdev, id); +} +static int rzg2l_cpg_status (struct reset_controller_dev *rcdev,unsigned long id) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 204/417 clk: renesas: rzg2l: Check reset monitor registers
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit da235d2fac212d0add570e755feb1167a830bc99 ]
The hardware manual of both RZ/G2L and RZ/G3S specifies that the reset monitor registers need to be interrogated when the reset signals are toggled (chapters "Procedures for Supplying and Stopping Reset Signals" and "Procedure for Activating Modules"). Without this, there is a chance that different modules (e.g. Ethernet) are not ready after their reset signal is toggled, leading to failures (on probe or resume from deep sleep states).
The same indications are available for RZ/V2M for TYPE-B reset controls.
--- drivers/clk/renesas/rzg2l-cpg.c | 59 ++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 15 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +44 -15
@@ -1121,12 +1121,27 @@ static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,struct rzg2l_cpg_priv *priv =rcdev_to_priv (rcdev);const struct rzg2l_cpg_info *info = priv->info;unsigned int reg = info->resets[id].off; -u32 value =BIT (info->resets[id].bit) <<16 ; +u32 mask =BIT (info->resets[id].bit); +s8 monbit = info->resets[id].monbit; +u32 value = mask <<16 ;dev_dbg (rcdev->dev,"assert id:%ld offset:0x%x\n" , id,CLK_RST_R (reg));writel (value, priv->base +CLK_RST_R (reg)); -return 0 ; + +if (info->has_clk_mon_regs) { + reg =CLK_MRST_R (reg); + }else if (monbit >=0 ) { + reg =CPG_RST_MON ; + mask =BIT (monbit); + }else { +/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ +udelay (35 ); +return 0 ; + } + +return readl_poll_timeout_atomic (priv->base + reg, value, + value & mask,10 ,200 ); } static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
@@ -1135,14 +1150,28 @@ static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,struct rzg2l_cpg_priv *priv =rcdev_to_priv (rcdev);const struct rzg2l_cpg_info *info = priv->info;unsigned int reg = info->resets[id].off; -u32 dis =BIT (info->resets[id].bit); -u32 value = (dis <<16 ) | dis; +u32 mask =BIT (info->resets[id].bit); +s8 monbit = info->resets[id].monbit; +u32 value = (mask <<16 ) | mask;dev_dbg (rcdev->dev,"deassert id:%ld offset:0x%x\n" , id,CLK_RST_R (reg));writel (value, priv->base +CLK_RST_R (reg)); -return 0 ; + +if (info->has_clk_mon_regs) { + reg =CLK_MRST_R (reg); + }else if (monbit >=0 ) { + reg =CPG_RST_MON ; + mask =BIT (monbit); + }else { +/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ +udelay (35 ); +return 0 ; + } + +return readl_poll_timeout_atomic (priv->base + reg, value, + !(value & mask),10 ,200 ); } static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
@@ -1154,9 +1183,6 @@ static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,if (ret)return ret; -/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */ -udelay (35 ); -return rzg2l_cpg_deassert (rcdev, id); }
@@ -1165,18 +1191,21 @@ static int rzg2l_cpg_status(struct reset_controller_dev *rcdev, {struct rzg2l_cpg_priv *priv =rcdev_to_priv (rcdev);const struct rzg2l_cpg_info *info = priv->info; -unsigned int reg = info->resets[id].off; -u32 bitmask =BIT (info->resets[id].bit);s8 monbit = info->resets[id].monbit; +unsigned int reg; +u32 bitmask;if (info->has_clk_mon_regs) { -return !!(readl (priv->base +CLK_MRST_R (reg)) & bitmask); + reg =CLK_MRST_R (info->resets[id].off); + bitmask =BIT (info->resets[id].bit); }else if (monbit >=0 ) { -u32 monbitmask =BIT (monbit); - -return !!(readl (priv->base +CPG_RST_MON ) & monbitmask); + reg =CPG_RST_MON ; + bitmask =BIT (monbit); + }else { +return -ENOTSUPP ; } -return -ENOTSUPP ; + +return !!(readl (priv->base + reg) & bitmask); }static const struct reset_control_ops rzg2l_cpg_reset_ops = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 205/417 drm/msm/dpu: Set input_sel bit for INTF
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jessica Zhang <[email protected]>
[ Upstream commit 980fffd0c69e5df0f67ee089d405899d532aeeab ]
Set the input_sel bit for encoders as it was missed in the initial implementation.
Patchwork: https://patchwork.freedesktop.org/patch/572007/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 2 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 2 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c | 9 +++++++-- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h | 3 ++- 4 files changed, 11 insertions(+), 5 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c +1 -1
@@ -324,7 +324,7 @@ static u32 dpu_hw_intf_get_line_count(struct dpu_hw_intf *intf)static void dpu_hw_intf_setup_misr (struct dpu_hw_intf *intf,bool enable,u32 frame_count) { -dpu_hw_setup_misr (&intf->hw,INTF_MISR_CTRL , enable, frame_count); +dpu_hw_setup_misr (&intf->hw,INTF_MISR_CTRL , enable, frame_count,0x1 ); }static int dpu_hw_intf_collect_misr (struct dpu_hw_intf *intf,u32 *misr_value)
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c +1 -1
@@ -101,7 +101,7 @@ static void dpu_hw_lm_setup_border_color(struct dpu_hw_mixer *ctx,static void dpu_hw_lm_setup_misr (struct dpu_hw_mixer *ctx,bool enable,u32 frame_count) { -dpu_hw_setup_misr (&ctx->hw,LM_MISR_CTRL , enable, frame_count); +dpu_hw_setup_misr (&ctx->hw,LM_MISR_CTRL , enable, frame_count,0x0 ); }static int dpu_hw_lm_collect_misr (struct dpu_hw_mixer *ctx,u32 *misr_value)
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c +7 -2
@@ -450,9 +450,13 @@ u64 _dpu_hw_get_qos_lut(const struct dpu_qos_lut_tbl *tbl,return 0 ; } +/* +* note: Aside from encoders, input_sel should be set to 0x0 by default +*/ void dpu_hw_setup_misr (struct dpu_hw_blk_reg_map *c,u32 misr_ctrl_offset, -bool enable,u32 frame_count) +bool enable,u32 frame_count, +u8 input_sel) {u32 config =0 ;
@@ -463,7 +467,8 @@ void dpu_hw_setup_misr(struct dpu_hw_blk_reg_map *c,if (enable) { config = (frame_count &MISR_FRAME_COUNT_MASK ) | -MISR_CTRL_ENABLE |MISR_CTRL_FREE_RUN_MASK ; +MISR_CTRL_ENABLE |MISR_CTRL_FREE_RUN_MASK | + ((input_sel &0xF ) <<24 );DPU_REG_WRITE (c, misr_ctrl_offset, config); }else {
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h +2 -1
@@ -352,7 +352,8 @@ u64 _dpu_hw_get_qos_lut(const struct dpu_qos_lut_tbl *tbl,void dpu_hw_setup_misr (struct dpu_hw_blk_reg_map *c,u32 misr_ctrl_offset,bool enable, -u32 frame_count); +u32 frame_count, +u8 input_sel); int dpu_hw_collect_misr(struct dpu_hw_blk_reg_map *c, u32 misr_ctrl_offset,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 206/417 drm/msm/dpu: Drop enable and frame_count parameters from dpu_hw_setup_misr()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jessica Zhang <[email protected]>
[ Upstream commit 3313c23f3eab698bc6b904520ee608fc0f7b03d0 ]
Drop the enable and frame_count parameters from dpu_hw_setup_misr() as they are always set to the same values.
In addition, replace MISR_FRAME_COUNT_MASK with MISR_FRAME_COUNT as frame_count is always set to the same value.
Patchwork: https://patchwork.freedesktop.org/patch/572009/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 4 ++-- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 4 ++-- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 6 +++--- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 4 ++-- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 6 +++--- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 3 ++- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c | 19 +++++-------------- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h | 9 +++------ 8 files changed, 22 insertions(+), 33 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2 -2
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0-only /* -* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <[email protected]>
@@ -124,7 +124,7 @@ static void dpu_crtc_setup_lm_misr(struct dpu_crtc_state *crtc_state)continue ;/* Calculate MISR over 1 frame */ - m->hw_lm->ops.setup_misr (m->hw_lm, true,1 ); + m->hw_lm->ops.setup_misr (m->hw_lm); } }
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +2 -2
@@ -2,7 +2,7 @@/* * Copyright (C) 2013 Red Hat * Copyright (c) 2014-2018, 2020-2021 The Linux Foundation. All rights reserved. -* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Author: Rob Clark <[email protected]> */
@@ -257,7 +257,7 @@ void dpu_encoder_setup_misr(const struct drm_encoder *drm_enc)if (!phys->hw_intf || !phys->hw_intf->ops.setup_misr)continue ; - phys->hw_intf->ops.setup_misr (phys->hw_intf, true,1 ); + phys->hw_intf->ops.setup_misr (phys->hw_intf); } }
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c +3 -3
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0-only /* -* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. */
@@ -322,9 +322,9 @@ static u32 dpu_hw_intf_get_line_count(struct dpu_hw_intf *intf)return DPU_REG_READ (c,INTF_LINE_COUNT ); } -static void dpu_hw_intf_setup_misr (struct dpu_hw_intf *intf,bool enable,u32 frame_count) +static void dpu_hw_intf_setup_misr (struct dpu_hw_intf *intf) { -dpu_hw_setup_misr (&intf->hw,INTF_MISR_CTRL , enable, frame_count,0x1 ); +dpu_hw_setup_misr (&intf->hw,INTF_MISR_CTRL ,0x1 ); }static int dpu_hw_intf_collect_misr (struct dpu_hw_intf *intf,u32 *misr_value)
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h +2 -2
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0-only */ /* -* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. */
@@ -80,7 +80,7 @@ struct dpu_hw_intf_ops {void (*bind_pingpong_blk)(struct dpu_hw_intf *intf,bool enable,const enum dpu_pingpong pp); -void (*setup_misr)(struct dpu_hw_intf *intf,bool enable,u32 frame_count); +void (*setup_misr)(struct dpu_hw_intf *intf);int (*collect_misr)(struct dpu_hw_intf *intf,u32 *misr_value); };
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c +3 -3
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0-only /* -* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. */
@@ -99,9 +99,9 @@ static void dpu_hw_lm_setup_border_color(struct dpu_hw_mixer *ctx, } } -static void dpu_hw_lm_setup_misr (struct dpu_hw_mixer *ctx,bool enable,u32 frame_count) +static void dpu_hw_lm_setup_misr (struct dpu_hw_mixer *ctx) { -dpu_hw_setup_misr (&ctx->hw,LM_MISR_CTRL , enable, frame_count,0x0 ); +dpu_hw_setup_misr (&ctx->hw,LM_MISR_CTRL ,0x0 ); }static int dpu_hw_lm_collect_misr (struct dpu_hw_mixer *ctx,u32 *misr_value)
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h +2 -1
@@ -1,5 +1,6 @@/* SPDX-License-Identifier: GPL-2.0-only */ /* +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. */
@@ -57,7 +58,7 @@ struct dpu_hw_lm_ops {/** * setup_misr: Enable/disable MISR */ -void (*setup_misr)(struct dpu_hw_mixer *ctx,bool enable,u32 frame_count); +void (*setup_misr)(struct dpu_hw_mixer *ctx);/** * collect_misr: Read MISR signature
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.c +5 -14
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0-only /* -* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. */ #define pr_fmt (fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
@@ -454,9 +454,7 @@ u64 _dpu_hw_get_qos_lut(const struct dpu_qos_lut_tbl *tbl,* note: Aside from encoders, input_sel should be set to 0x0 by default */ void dpu_hw_setup_misr (struct dpu_hw_blk_reg_map *c, -u32 misr_ctrl_offset, -bool enable,u32 frame_count, -u8 input_sel) +u32 misr_ctrl_offset,u8 input_sel) {u32 config =0 ;
@@ -465,16 +463,9 @@ void dpu_hw_setup_misr(struct dpu_hw_blk_reg_map *c,/* Clear old MISR value (in case it's read before a new value is calculated)*/ wmb (); -if (enable) { - config = (frame_count &MISR_FRAME_COUNT_MASK ) | -MISR_CTRL_ENABLE |MISR_CTRL_FREE_RUN_MASK | - ((input_sel &0xF ) <<24 ); - -DPU_REG_WRITE (c, misr_ctrl_offset, config); - }else { -DPU_REG_WRITE (c, misr_ctrl_offset,0 ); - } - + config =MISR_FRAME_COUNT |MISR_CTRL_ENABLE |MISR_CTRL_FREE_RUN_MASK | + ((input_sel &0xF ) <<24 ); +DPU_REG_WRITE (c, misr_ctrl_offset, config); } int dpu_hw_collect_misr(struct dpu_hw_blk_reg_map *c,
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_util.h +3 -6
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0-only */ /* -* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. */
@@ -13,7 +13,7 @@#include "dpu_hw_catalog.h" #define REG_MASK (n) ((BIT(n)) - 1) -#define MISR_FRAME_COUNT_MASK 0xFF +#define MISR_FRAME_COUNT 0x1#define MISR_CTRL_ENABLE BIT(8)#define MISR_CTRL_STATUS BIT(9)#define MISR_CTRL_STATUS_CLEAR BIT(10)
@@ -350,10 +350,7 @@ u64 _dpu_hw_get_qos_lut(const struct dpu_qos_lut_tbl *tbl, u32 total_fl);void dpu_hw_setup_misr (struct dpu_hw_blk_reg_map *c, -u32 misr_ctrl_offset, -bool enable, -u32 frame_count, -u8 input_sel); +u32 misr_ctrl_offset,u8 input_sel); int dpu_hw_collect_misr(struct dpu_hw_blk_reg_map *c, u32 misr_ctrl_offset,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 207/417 drm/mediatek: Return error if MDP RDMA failed to enable the clock
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hsiao Chien Sung <[email protected]>
[ Upstream commit 21b287146adf39304193e4c49198021e06a28ded ]
Return the result of clk_prepare_enable() instead of always returns 0.
--- drivers/gpu/drm/mediatek/mtk_mdp_rdma.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpu/drm/mediatek/mtk_mdp_rdma.c +1 -2
@@ -223,8 +223,7 @@ int mtk_mdp_rdma_clk_enable(struct device *dev) {struct mtk_mdp_rdma *rdma =dev_get_drvdata (dev); -clk_prepare_enable (rdma->clk); -return 0 ; +return clk_prepare_enable (rdma->clk); }void mtk_mdp_rdma_clk_disable (struct device *dev)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 208/417 drm/mediatek: Fix underrun in VDO1 when switches off the layer
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hsiao Chien Sung <[email protected]>
[ Upstream commit 73b5ab27ab2ee616f2709dc212c2b0007894a12e ]
Do not reset Merge while using CMDQ because reset API doesn't wait for frame done event as CMDQ does and could lead to underrun when the layer is switching off.
--- drivers/gpu/drm/mediatek/mtk_disp_merge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/mediatek/mtk_disp_merge.c +1 -1
@@ -104,7 +104,7 @@ void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)mtk_ddp_write (cmdq_pkt,0 , &priv->cmdq_reg, priv->regs,DISP_REG_MERGE_CTRL ); -if (priv->async_clk) +if (!cmdq_pkt && priv->async_clk)reset_control_reset (priv->reset_ctl); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 209/417 drm/amdgpu/debugfs: fix error code when smc register accessors are NULL
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit afe58346d5d3887b3e49ff623d2f2e471f232a8d ]
Should be -EOPNOTSUPP.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +2 -2
@@ -596,7 +596,7 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,int r;if (!adev->smc_rreg) -return -EPERM ; +return -EOPNOTSUPP ;if (size &0x3 || *pos &0x3 )return -EINVAL ;
@@ -655,7 +655,7 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *int r;if (!adev->smc_wreg) -return -EPERM ; +return -EOPNOTSUPP ;if (size &0x3 || *pos &0x3 )return -EINVAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 210/417 drm/amd/pm: fix a double-free in si_dpm_init
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit ac16667237a82e2597e329eb9bc520d1cf9dff30 ]
When the allocation of adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries fails, amdgpu_free_extended_power_table is called to free some fields of adev. However, when the control flow returns to si_dpm_sw_init, it goes to label dpm_failed and calls si_dpm_fini, which calls amdgpu_free_extended_power_table again and free those fields again. Thus a double-free is triggered.
--- drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c +2 -3
@@ -7379,10 +7379,9 @@ static int si_dpm_init(struct amdgpu_device *adev)kcalloc (4 ,sizeof (struct amdgpu_clock_voltage_dependency_entry ),GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries)return -ENOMEM ; - } + adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count =4 ; adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0 ].clk =0 ; adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0 ].v =0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 211/417 drivers/amd/pm: fix a use-after-free in kv_parse_power_table
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit 28dd788382c43b330480f57cd34cde0840896743 ]
When ps allocated by kzalloc equals to NULL, kv_parse_power_table frees adev->pm.dpm.ps that allocated before. However, after the control flow goes through the following call chains:
kv_parse_power_table
|-> kv_dpm_init
|-> kv_dpm_sw_init |-> kv_dpm_fini
The adev->pm.dpm.ps is used in the for loop of kv_dpm_fini after its first free in kv_parse_power_table and causes a use-after-free bug.
--- drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c +1 -3
@@ -2748,10 +2748,8 @@ static int kv_parse_power_table(struct amdgpu_device *adev) non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) &non_clock_info_array->nonClockInfo[non_clock_array_index]; ps =kzalloc (sizeof (struct kv_ps ),GFP_KERNEL ); -if (ps ==NULL ) { -kfree (adev->pm.dpm.ps); +if (ps ==NULL )return -ENOMEM ; - } adev->pm.dpm.ps[i].ps_priv = ps; k =0 ; idx = (u8 *)&power_state->v2.clockInfoIndex[0 ];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 212/417 gpu/drm/radeon: fix two memleaks in radeon_vm_init
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit c2709b2d6a537ca0fa0f1da36fdaf07e48ef447d ]
When radeon_bo_create and radeon_vm_clear_bo fail, the vm->page_tables allocated before need to be freed. However, neither radeon_vm_init itself nor its caller have done such deallocation.
--- drivers/gpu/drm/radeon/radeon_vm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/radeon_vm.c +6 -2
@@ -1204,13 +1204,17 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm) r =radeon_bo_create (rdev, pd_size, align, true,RADEON_GEM_DOMAIN_VRAM ,0 ,NULL ,NULL , &vm->page_directory); -if (r) +if (r) { +kfree (vm->page_tables); + vm->page_tables =NULL ;return r; - + } r =radeon_vm_clear_bo (rdev, vm->page_directory);if (r) {radeon_bo_unref (&vm->page_directory); vm->page_directory =NULL ; +kfree (vm->page_tables); + vm->page_tables =NULL ;return r; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 213/417 drm/amd/pm: fix a double-free in amdgpu_parse_extended_power_table
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit a6582701178a47c4d0cb2188c965c59c0c0647c8 ]
The amdgpu_free_extended_power_table is called in every error-handling paths of amdgpu_parse_extended_power_table. However, after the following call chain of returning:
amdgpu_parse_extended_power_table
|-> kv_dpm_init / si_dpm_init
(the only two caller of amdgpu_parse_extended_power_table)
|-> kv_dpm_sw_init / si_dpm_sw_init
(the only caller of kv_dpm_init / si_dpm_init, accordingly)
|-> kv_dpm_fini / si_dpm_fini
(goto dpm_failed in xx_dpm_sw_init)
|-> amdgpu_free_extended_power_table
As above, the amdgpu_free_extended_power_table is called twice in this returning chain and thus a double-free is triggered. Similarily, the last kfree in amdgpu_parse_extended_power_table also cause a double free with amdgpu_free_extended_power_table in kv_dpm_fini.
--- .../gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c | 52 +++++-------------- 1 file changed, 13 insertions(+), 39 deletions(-)
drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c +13 -39
@@ -272,10 +272,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(power_info->pplib4.usVddcDependencyOnSCLKOffset)); ret =amdgpu_parse_clk_voltage_dep_table (&adev->pm.dpm.dyn_state.vddc_dependency_on_sclk, dep_table); -if (ret) { -amdgpu_free_extended_power_table (adev); +if (ret)return ret; - } }if (power_info->pplib4.usVddciDependencyOnMCLKOffset) { dep_table = (ATOM_PPLIB_Clock_Voltage_Dependency_Table *)
@@ -283,10 +281,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(power_info->pplib4.usVddciDependencyOnMCLKOffset)); ret =amdgpu_parse_clk_voltage_dep_table (&adev->pm.dpm.dyn_state.vddci_dependency_on_mclk, dep_table); -if (ret) { -amdgpu_free_extended_power_table (adev); +if (ret)return ret; - } }if (power_info->pplib4.usVddcDependencyOnMCLKOffset) { dep_table = (ATOM_PPLIB_Clock_Voltage_Dependency_Table *)
@@ -294,10 +290,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(power_info->pplib4.usVddcDependencyOnMCLKOffset)); ret =amdgpu_parse_clk_voltage_dep_table (&adev->pm.dpm.dyn_state.vddc_dependency_on_mclk, dep_table); -if (ret) { -amdgpu_free_extended_power_table (adev); +if (ret)return ret; - } }if (power_info->pplib4.usMvddDependencyOnMCLKOffset) { dep_table = (ATOM_PPLIB_Clock_Voltage_Dependency_Table *)
@@ -305,10 +299,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(power_info->pplib4.usMvddDependencyOnMCLKOffset)); ret =amdgpu_parse_clk_voltage_dep_table (&adev->pm.dpm.dyn_state.mvdd_dependency_on_mclk, dep_table); -if (ret) { -amdgpu_free_extended_power_table (adev); +if (ret)return ret; - } }if (power_info->pplib4.usMaxClockVoltageOnDCOffset) { ATOM_PPLIB_Clock_Voltage_Limit_Table *clk_v =
@@ -339,10 +331,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev)kcalloc (psl->ucNumEntries,sizeof (struct amdgpu_phase_shedding_limits_entry ),GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.phase_shedding_limits_table.entries) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.phase_shedding_limits_table.entries)return -ENOMEM ; - } entry = &psl->entries[0 ];for (i =0 ; i < psl->ucNumEntries; i++) {
@@ -383,10 +373,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev)ATOM_PPLIB_CAC_Leakage_Record *entry;u32 size = cac_table->ucNumEntries *sizeof (struct amdgpu_cac_leakage_table ); adev->pm.dpm.dyn_state.cac_leakage_table.entries =kzalloc (size,GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.cac_leakage_table.entries) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.cac_leakage_table.entries)return -ENOMEM ; - } entry = &cac_table->entries[0 ];for (i =0 ; i < cac_table->ucNumEntries; i++) {if (adev->pm.dpm.platform_caps &ATOM_PP_PLATFORM_CAP_EVV ) {
@@ -438,10 +426,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev)sizeof (struct amdgpu_vce_clock_voltage_dependency_entry ); adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries =kzalloc (size,GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries)return -ENOMEM ; - } adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.count = limits->numEntries; entry = &limits->entries[0 ];
@@ -493,10 +479,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev)sizeof (struct amdgpu_uvd_clock_voltage_dependency_entry ); adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries =kzalloc (size,GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries)return -ENOMEM ; - } adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count = limits->numEntries; entry = &limits->entries[0 ];
@@ -525,10 +509,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev)sizeof (struct amdgpu_clock_voltage_dependency_entry ); adev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries =kzalloc (size,GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries)return -ENOMEM ; - } adev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.count = limits->numEntries; entry = &limits->entries[0 ];
@@ -548,10 +530,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) le16_to_cpu(ext_hdr->usPPMTableOffset)); adev->pm.dpm.dyn_state.ppm_table =kzalloc (sizeof (struct amdgpu_ppm_table ),GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.ppm_table) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.ppm_table)return -ENOMEM ; - } adev->pm.dpm.dyn_state.ppm_table->ppm_design = ppm->ucPpmDesign; adev->pm.dpm.dyn_state.ppm_table->cpu_core_number =le16_to_cpu (ppm->usCpuCoreNumber);
@@ -583,10 +563,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev)sizeof (struct amdgpu_clock_voltage_dependency_entry ); adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries =kzalloc (size,GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries)return -ENOMEM ; - } adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.count = limits->numEntries; entry = &limits->entries[0 ];
@@ -606,10 +584,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev)ATOM_PowerTune_Table *pt; adev->pm.dpm.dyn_state.cac_tdp_table =kzalloc (sizeof (struct amdgpu_cac_tdp_table ),GFP_KERNEL ); -if (!adev->pm.dpm.dyn_state.cac_tdp_table) { -amdgpu_free_extended_power_table (adev); +if (!adev->pm.dpm.dyn_state.cac_tdp_table)return -ENOMEM ; - }if (rev >0 ) { ATOM_PPLIB_POWERTUNE_Table_V1 *ppt = (ATOM_PPLIB_POWERTUNE_Table_V1 *) (mode_info->atom_context->bios + data_offset +
@@ -645,10 +621,8 @@ int amdgpu_parse_extended_power_table(struct amdgpu_device *adev) ret =amdgpu_parse_clk_voltage_dep_table ( &adev->pm.dpm.dyn_state.vddgfx_dependency_on_sclk, dep_table); -if (ret) { -kfree (adev->pm.dpm.dyn_state.vddgfx_dependency_on_sclk.entries); +if (ret)return ret; - } } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 214/417 f2fs: fix to check return value of f2fs_recover_xattr_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiguo Niu <[email protected]>
[ Upstream commit 86d7d57a3f096c8349b32a0cd5f6f314e4416a6d ]
Should check return value of f2fs_recover_xattr_data in __f2fs_setxattr rather than doing invalid retry if error happen.
Also just do set_page_dirty in f2fs_recover_xattr_data when page is changed really.
--- fs/f2fs/node.c | 6 +++--- fs/f2fs/xattr.c | 11 +++++++---- 2 files changed, 10 insertions(+), 7 deletions(-)
fs/f2fs/node.c +3 -3
@@ -2738,11 +2738,11 @@ int f2fs_recover_xattr_data(struct inode *inode, struct page *page)f2fs_update_inode_page (inode);/* 3: update and set xattr node page dirty */ -if (page) +if (page) {memcpy (F2FS_NODE (xpage),F2FS_NODE (page),VALID_XATTR_BLOCK_SIZE ); - -set_page_dirty (xpage); +set_page_dirty (xpage); + }f2fs_put_page (xpage,1 );return 0 ;
fs/f2fs/xattr.c +7 -4
@@ -660,11 +660,14 @@ static int __f2fs_setxattr(struct inode *inode, int index, here =__find_xattr (base_addr, last_base_addr,NULL , index, len, name);if (!here) {if (!F2FS_I (inode)->i_xattr_nid) { + error =f2fs_recover_xattr_data (inode,NULL );f2fs_notice (F2FS_I_SB (inode), -"recover xattr in inode (%lu)" , inode->i_ino); -f2fs_recover_xattr_data (inode,NULL ); -kfree (base_addr); - goto retry; +"recover xattr in inode (%lu), error(%d)" , + inode->i_ino, error); +if (!error) { +kfree (base_addr); + goto retry; + } }f2fs_err (F2FS_I_SB (inode),"set inode (%lu) has corrupted xattr" , inode->i_ino);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 215/417 dt-bindings: clock: Update the videocc resets for sm8150
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satya Priya Kakitapalli <[email protected]>
[ Upstream commit 3185f96968eedd117ec72ee7b87ead44b6d1bbbd ]
Add all the available resets for the video clock controller on sm8150.
Stable-dep-of: 1fd9a939db24 ("clk: qcom: videocc-sm8150: Update the videocc resets")
--- include/dt-bindings/clock/qcom,videocc-sm8150.h | 4 ++++ 1 file changed, 4 insertions(+)
include/dt-bindings/clock/qcom,videocc-sm8150.h +4 -0
@@ -16,6 +16,10 @@/* VIDEO_CC Resets */ #define VIDEO_CC_MVSC_CORE_CLK_BCR 0 +#define VIDEO_CC_INTERFACE_BCR 1 +#define VIDEO_CC_MVS0_BCR 2 +#define VIDEO_CC_MVS1_BCR 3 +#define VIDEO_CC_MVSC_BCR 4/* VIDEO_CC GDSCRs */ #define VENUS_GDSC 0
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 216/417 clk: qcom: videocc-sm8150: Update the videocc resets
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satya Priya Kakitapalli <[email protected]>
[ Upstream commit 1fd9a939db24d2f66e48f8bca3e3654add3fa205 ]
Add all the available resets for the video clock controller on sm8150.
--- drivers/clk/qcom/videocc-sm8150.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/qcom/videocc-sm8150.c +4 -0
@@ -214,6 +214,10 @@ static const struct regmap_config video_cc_sm8150_regmap_config = {static const struct qcom_reset_map video_cc_sm8150_resets[] = { [VIDEO_CC_MVSC_CORE_CLK_BCR ] = {0x850 ,2 }, + [VIDEO_CC_INTERFACE_BCR ] = {0x8f0 }, + [VIDEO_CC_MVS0_BCR ] = {0x870 }, + [VIDEO_CC_MVS1_BCR ] = {0x8b0 }, + [VIDEO_CC_MVSC_BCR ] = {0x810 }, };static const struct qcom_cc_desc video_cc_sm8150_desc = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 217/417 clk: qcom: videocc-sm8150: Add missing PLL config property
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Satya Priya Kakitapalli <[email protected]>
[ Upstream commit 71f130c9193f613d497f7245365ed05ffdb0a401 ]
When the driver was ported upstream, PLL test_ctl_hi1 register value was omitted. Add it to ensure the PLLs are fully configured.
--- drivers/clk/qcom/videocc-sm8150.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/qcom/videocc-sm8150.c +1 -0
@@ -33,6 +33,7 @@ static struct alpha_pll_config video_pll0_config = { .config_ctl_val = 0x20485699, .config_ctl_hi_val = 0x00002267, .config_ctl_hi1_val = 0x00000024, + .test_ctl_hi1_val = 0x00000020, .user_ctl_val = 0x00000000, .user_ctl_hi_val = 0x00000805, .user_ctl_hi1_val = 0x000000D0,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 218/417 drivers: clk: zynqmp: calculate closest mux rate
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jay Buddhabhatti <[email protected]>
[ Upstream commit b782921ddd7f84f524723090377903f399fdbbcb ]
Currently zynqmp clock driver is not calculating closest mux rate and because of that Linux is not setting proper frequency for CPU and not able to set given frequency for dynamic frequency scaling.
E.g., In current logic initial acpu clock parent and frequency as below
apll1 0 0 0 2199999978 0 0 50000 Y
acpu0_mux 0 0 0 2199999978 0 0 50000 Y
acpu0_idiv1 0 0 0 2199999978 0 0 50000 Y
acpu0 0 0 0 2199999978 0 0 50000 YAfter changing acpu frequency to 549999994 Hz using CPU freq scaling its selecting incorrect parent which is not closest frequency.
rpll_to_xpd 0 0 0 1599999984 0 0 50000 Y
acpu0_mux 0 0 0 1599999984 0 0 50000 Y
acpu0_div1 0 0 0 533333328 0 0 50000 Y
acpu0 0 0 0 533333328 0 0 50000 YParent should remain same since 549999994 = 2199999978 / 4.
So use __clk_mux_determine_rate_closest() generic function to calculate closest rate for mux clock. After this change its selecting correct parent and correct clock rate.
apll1 0 0 0 2199999978 0 0 50000 Y
acpu0_mux 0 0 0 2199999978 0 0 50000 Y
acpu0_div1 0 0 0 549999995 0 0 50000 Y
acpu0 0 0 0 549999995 0 0 50000 Y--- drivers/clk/zynqmp/clk-mux-zynqmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/zynqmp/clk-mux-zynqmp.c +1 -1
@@ -89,7 +89,7 @@ static int zynqmp_clk_mux_set_parent(struct clk_hw *hw, u8 index)static const struct clk_ops zynqmp_clk_mux_ops = { .get_parent = zynqmp_clk_mux_get_parent, .set_parent = zynqmp_clk_mux_set_parent, - .determine_rate = __clk_mux_determine_rate, + .determine_rate = __clk_mux_determine_rate_closest, };static const struct clk_ops zynqmp_clk_mux_ro_ops = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 219/417 drivers: clk: zynqmp: update divider round rate logic
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jay Buddhabhatti <[email protected]>
[ Upstream commit 1fe15be1fb613534ecbac5f8c3f8744f757d237d ]
Currently zynqmp divider round rate is considering single parent and calculating rate and parent rate accordingly. But if divider clock flag is set to SET_RATE_PARENT then its not trying to traverse through all parent rate and not selecting best parent rate from that. So use common divider_round_rate() which is traversing through all clock parents and its rate and calculating proper parent rate.
--- drivers/clk/zynqmp/divider.c | 66 +++--------------------------------- 1 file changed, 5 insertions(+), 61 deletions(-)
drivers/clk/zynqmp/divider.c +5 -61
@@ -110,52 +110,6 @@ static unsigned long zynqmp_clk_divider_recalc_rate(struct clk_hw *hw,return DIV_ROUND_UP_ULL (parent_rate, value); } -static void zynqmp_get_divider2_val (struct clk_hw *hw, -unsigned long rate, -struct zynqmp_clk_divider *divider, -u32 *bestdiv) -{ -int div1; -int div2; -long error =LONG_MAX ; -unsigned long div1_prate; -struct clk_hw *div1_parent_hw; -struct zynqmp_clk_divider *pdivider; -struct clk_hw *div2_parent_hw =clk_hw_get_parent (hw); - -if (!div2_parent_hw) -return ; - - pdivider =to_zynqmp_clk_divider (div2_parent_hw); -if (!pdivider) -return ; - - div1_parent_hw =clk_hw_get_parent (div2_parent_hw); -if (!div1_parent_hw) -return ; - - div1_prate =clk_hw_get_rate (div1_parent_hw); - *bestdiv =1 ; -for (div1 =1 ; div1 <= pdivider->max_div;) { -for (div2 =1 ; div2 <= divider->max_div;) { -long new_error = ((div1_prate / div1) / div2) - rate; - -if (abs (new_error) <abs (error)) { - *bestdiv = div2; - error = new_error; - } -if (divider->flags &CLK_DIVIDER_POWER_OF_TWO ) - div2 = div2 <<1 ; -else - div2++; - } -if (pdivider->flags &CLK_DIVIDER_POWER_OF_TWO ) - div1 = div1 <<1 ; -else - div1++; - } -} -/** * zynqmp_clk_divider_round_rate() - Round rate of divider clock * @hw: handle between common and hardware-specific interfaces
@@ -174,6 +128,7 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw,u32 div_type = divider->div_type;u32 bestdiv;int ret; +u8 width;/* if read only, just return current value */ if (divider->flags &CLK_DIVIDER_READ_ONLY ) {
@@ -193,23 +148,12 @@ static long zynqmp_clk_divider_round_rate(struct clk_hw *hw,return DIV_ROUND_UP_ULL ((u64)*prate, bestdiv); } - bestdiv =zynqmp_divider_get_val (*prate, rate, divider->flags); - -/* -* In case of two divisors, compute best divider values and return -* divider2 value based on compute value. div1 will be automatically -* set to optimum based on required total divider value. -*/ -if (div_type ==TYPE_DIV2 && - (clk_hw_get_flags (hw) &CLK_SET_RATE_PARENT )) { -zynqmp_get_divider2_val (hw, rate, divider, &bestdiv); - } + width =fls (divider->max_div); -if ((clk_hw_get_flags (hw) &CLK_SET_RATE_PARENT ) && divider->is_frac) - bestdiv = rate % *prate ?1 : bestdiv; + rate =divider_round_rate (hw, rate, prate,NULL , width, divider->flags); - bestdiv =min_t (u32, bestdiv, divider->max_div); - *prate = rate * bestdiv; +if (divider->is_frac && (clk_hw_get_flags (hw) &CLK_SET_RATE_PARENT ) && (rate % *prate)) + *prate = rate;return rate; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 220/417 watchdog: set cdev owner before adding
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Curtis Klein <[email protected]>
[ Upstream commit 38d75297745f04206db9c29bdd75557f0344c7cc ]
When the new watchdog character device is registered, it becomes available for opening. This creates a race where userspace may open the device before the character device's owner is set. This results in an imbalance in module_get calls as the cdev_get in cdev_open will not increment the reference count on the watchdog driver module.
This causes problems when the watchdog character device is released as the module loader's reference will also be released. This makes it impossible to open the watchdog device later on as it now appears that the module is being unloaded. The open will fail with -ENXIO from chrdev_open.
The legacy watchdog device will fail with -EBUSY from the try_module_get in watchdog_open because it's module owner is the watchdog core module so it can still be opened but it will fail to get a refcount on the underlying watchdog device driver.
--- drivers/watchdog/watchdog_dev.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/watchdog/watchdog_dev.c +1 -2
@@ -1052,6 +1052,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd)/* Fill in the data structures */ cdev_init (&wd_data->cdev, &watchdog_fops); + wd_data->cdev.owner = wdd->ops->owner;/* Add the device */ err =cdev_device_add (&wd_data->cdev, &wd_data->dev);
@@ -1066,8 +1067,6 @@ static int watchdog_cdev_register(struct watchdog_device *wdd)return err; } - wd_data->cdev.owner = wdd->ops->owner; -/* Record time of most recent heartbeat as 'just before now'. */ wd_data->last_hw_keepalive =ktime_sub (ktime_get (),1 );watchdog_set_open_deadline (wd_data);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 221/417 watchdog/hpwdt: Only claim UNKNOWN NMI if from iLO
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jerry Hoemann <[email protected]>
[ Upstream commit dced0b3e51dd2af3730efe14dd86b5e3173f0a65 ]
Avoid unnecessary crashes by claiming only NMIs that are due to ERROR signalling or generated by the hpwdt hardware device.
The code does this, but only for iLO5.
The intent was to preserve legacy, Gen9 and earlier, semantics of using hpwdt for error containtment as hardware/firmware would signal fatal IO errors as an NMI with the expectation of hpwdt crashing the system. Howerver, these IO errors should be received by hpwdt as an NMI_IO_CHECK. So the test is overly permissive and should not be limited to only ilo5.
We need to enable this protection for future iLOs not matching the current PCI IDs.
--- drivers/watchdog/hpwdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/hpwdt.c +1 -1
@@ -178,7 +178,7 @@ static int hpwdt_pretimeout(unsigned int ulReason, struct pt_regs *regs)"3. OA Forward Progress Log\n" "4. iLO Event Log" ; -if (ilo5 && ulReason ==NMI_UNKNOWN && !mynmi) +if (ulReason ==NMI_UNKNOWN && !mynmi)return NMI_DONE ;if (ilo5 && !pretimeout && !mynmi)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 222/417 watchdog: bcm2835_wdt: Fix WDIOC_SETTIMEOUT handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
[ Upstream commit f33f5b1fd1be5f5106d16f831309648cb0f1c31d ]
Users report about the unexpected behavior for setting timeouts above 15 sec on Raspberry Pi. According to watchdog-api.rst the ioctl WDIOC_SETTIMEOUT shouldn't fail because of hardware limitations. But looking at the code shows that max_timeout based on the register value PM_WDOG_TIME_SET, which is the maximum.
Since 664a39236e71 ("watchdog: Introduce hardware maximum heartbeat in watchdog core") the watchdog core is able to handle this problem.
This fix has been tested with watchdog-test from selftests.
--- drivers/watchdog/bcm2835_wdt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/watchdog/bcm2835_wdt.c +2 -1
@@ -42,6 +42,7 @@#define SECS_TO_WDOG_TICKS (x) ((x) << 16)#define WDOG_TICKS_TO_SECS (x) ((x) >> 16) +#define WDOG_TICKS_TO_MSECS (x) ((x) * 1000 >> 16)struct bcm2835_wdt {void __iomem *base;
@@ -140,7 +141,7 @@ static struct watchdog_device bcm2835_wdt_wdd = { .info = &bcm2835_wdt_info, .ops = &bcm2835_wdt_ops, .min_timeout = 1, - .max_timeout = WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET), + .max_hw_heartbeat_ms = WDOG_TICKS_TO_MSECS(PM_WDOG_TIME_SET), .timeout = WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET), };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 223/417 watchdog: rti_wdt: Drop runtime pm reference count when watchdog is unused
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vignesh Raghavendra <[email protected]>
[ Upstream commit c1a6edf3b541e44e78f10bc6024df779715723f1 ]
Call runtime_pm_put*() if watchdog is not already started during probe and re enable it in watchdog start as required.
On K3 SoCs, watchdogs and their corresponding CPUs are under same power-domain, so if the reference count of unused watchdogs aren't dropped, it will lead to CPU hotplug failures as Device Management firmware won't allow to turn off the power-domain due to dangling reference count.
--- drivers/watchdog/rti_wdt.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/watchdog/rti_wdt.c +12 -1
@@ -70,6 +70,11 @@ static int rti_wdt_start(struct watchdog_device *wdd) {u32 timer_margin;struct rti_wdt_device *wdt =watchdog_get_drvdata (wdd); +int ret; + + ret =pm_runtime_resume_and_get (wdd->parent); +if (ret) +return ret;/* set timeout period */ timer_margin = (u64 )wdd->timeout * wdt->freq;
@@ -295,6 +300,9 @@ static int rti_wdt_probe(struct platform_device *pdev)if (last_ping)watchdog_set_last_hw_keepalive (wdd, last_ping); +if (!watchdog_hw_running (wdd)) +pm_runtime_put_sync (&pdev->dev); +return 0 ; err_iomap:
@@ -309,7 +317,10 @@ static int rti_wdt_remove(struct platform_device *pdev)struct rti_wdt_device *wdt =platform_get_drvdata (pdev);watchdog_unregister_device (&wdt->wdd); -pm_runtime_put (&pdev->dev); + +if (!pm_runtime_suspended (&pdev->dev)) +pm_runtime_put (&pdev->dev); +pm_runtime_disable (&pdev->dev);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 224/417 clk: si5341: fix an error code problem in si5341_output_clk_set_rate
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit 5607068ae5ab02c3ac9cabc6859d36e98004c341 ]
regmap_bulk_write() return zero or negative error code, return the value of regmap_bulk_write() rather than '0'.
--- drivers/clk/clk-si5341.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/clk/clk-si5341.c +1 -3
@@ -892,10 +892,8 @@ static int si5341_output_clk_set_rate(struct clk_hw *hw, unsigned long rate, r[0 ] = r_div ? (r_div &0xff ) :1 ; r[1 ] = (r_div >>8 ) &0xff ; r[2 ] = (r_div >>16 ) &0xff ; - err =regmap_bulk_write (output->data->regmap, +return regmap_bulk_write (output->data->regmap,SI5341_OUT_R_REG (output), r,3 ); - -return 0 ; }static int si5341_output_reparent (struct clk_si5341_output *output,u8 index)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 225/417 drm/mediatek: dp: Add phy_mtk_dp module as pre-dependency
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nícolas F. R. A. Prado <[email protected]>
[ Upstream commit c8048dd0b07df68724805254b9e994d99e9a7af4 ]
The mtk_dp driver registers a phy device which is handled by the phy_mtk_dp driver and assumes that the phy probe will complete synchronously, proceeding to make use of functionality exposed by that driver right away. This assumption however is false when the phy driver is built as a module, causing the mtk_dp driver to fail probe in this case.
Add the phy_mtk_dp module as a pre-dependency to the mtk_dp module to ensure the phy module has been loaded before the dp, so that the phy probe happens synchrounously and the mtk_dp driver can probe successfully even with the phy driver built as a module.
--- drivers/gpu/drm/mediatek/mtk_dp.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/mediatek/mtk_dp.c +1 -0
@@ -2669,3 +2669,4 @@ MODULE_AUTHOR("Markus Schneider-Pargmann <[email protected]>");MODULE_AUTHOR ("Bo-Chen Chen <[email protected]>" );MODULE_DESCRIPTION ("MediaTek DisplayPort Driver" );MODULE_LICENSE ("GPL" ); +MODULE_SOFTDEP ("pre: phy_mtk_dp" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 226/417 accel/habanalabs: fix information leak in sec_attest_info()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xingyuan Mo <[email protected]>
[ Upstream commit a9f07790a4b2250f0140e9a61c7f842fd9b618c7 ]
This function may copy the pad0 field of struct hl_info_sec_attest to user mode which has not been initialized, resulting in leakage of kernel heap data to user mode. To prevent this, use kzalloc() to allocate and zero out the buffer, which can also eliminate other uninitialized holes, if any.
--- drivers/misc/habanalabs/common/habanalabs_ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/habanalabs/common/habanalabs_ioctl.c +1 -1
@@ -677,7 +677,7 @@ static int sec_attest_info(struct hl_fpriv *hpriv, struct hl_info_args *args)if (!sec_attest_info)return -ENOMEM ; - info =kmalloc (sizeof (*info),GFP_KERNEL ); + info =kzalloc (sizeof (*info),GFP_KERNEL );if (!info) { rc = -ENOMEM ; goto free_sec_attest_info;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 227/417 clk: fixed-rate: fix clk_hw_register_fixed_rate_with_accuracy_parent_hw
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Théo Lebrun <[email protected]>
[ Upstream commit ee0cf5e07f44a10fce8f1bfa9db226c0b5ecf880 ]
Add missing comma and remove extraneous NULL argument. The macro is currently used by no one which explains why the typo slipped by.
--- include/linux/clk-provider.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/clk-provider.h +2 -2
@@ -446,8 +446,8 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name,*/ #define clk_hw_register_fixed_rate_with_accuracy_parent_hw (dev, name, \ parent_hw, flags, fixed_rate, fixed_accuracy) \ - __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, (parent_hw) \ - NULL, NULL, (flags), (fixed_rate), \ + __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, (parent_hw), \ + NULL, (flags), (fixed_rate), \ (fixed_accuracy), 0, false)/** * clk_hw_register_fixed_rate_with_accuracy_parent_data - register fixed-rate
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 228/417 pwm: stm32: Use regmap_clear_bits and regmap_set_bits where applicable
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit 632ae5d7eb348b3ef88552ec0999260b6f9d6ab1 ]
Found using coccinelle and the following semantic patch:
@@
expression map, reg, bits;
@@
- regmap_update_bits(map, reg, bits, bits)
+ regmap_set_bits(map, reg, bits)
@@
expression map, reg, bits;
@@
- regmap_update_bits(map, reg, bits, 0)
+ regmap_clear_bits(map, reg, bits)
Stable-dep-of: 19f1016ea960 ("pwm: stm32: Fix enable count for clk in .probe()")
--- drivers/pwm/pwm-stm32.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-)
drivers/pwm/pwm-stm32.c +16 -18
@@ -115,14 +115,14 @@ static int stm32_pwm_raw_capture(struct stm32_pwm *priv, struct pwm_device *pwm,int ret;/* Ensure registers have been updated, enable counter and capture */ -regmap_update_bits (priv->regmap,TIM_EGR ,TIM_EGR_UG ,TIM_EGR_UG ); -regmap_update_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN ,TIM_CR1_CEN ); +regmap_set_bits (priv->regmap,TIM_EGR ,TIM_EGR_UG ); +regmap_set_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN );/* Use cc1 or cc3 DMA resp for PWM input channels 1 & 2 or 3 & 4 */ dma_id = pwm->hwpwm <2 ?STM32_TIMERS_DMA_CH1 :STM32_TIMERS_DMA_CH3 ; ccen = pwm->hwpwm <2 ?TIM_CCER_CC12E :TIM_CCER_CC34E ; ccr = pwm->hwpwm <2 ?TIM_CCR1 :TIM_CCR3 ; -regmap_update_bits (priv->regmap,TIM_CCER , ccen, ccen); +regmap_set_bits (priv->regmap,TIM_CCER , ccen);/* * Timer DMA burst mode. Request 2 registers, 2 bursts, to get both
@@ -160,8 +160,8 @@ static int stm32_pwm_raw_capture(struct stm32_pwm *priv, struct pwm_device *pwm, } stop: -regmap_update_bits (priv->regmap,TIM_CCER , ccen,0 ); -regmap_update_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN ,0 ); +regmap_clear_bits (priv->regmap,TIM_CCER , ccen); +regmap_clear_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN );return ret; }
@@ -359,7 +359,7 @@ static int stm32_pwm_config(struct stm32_pwm *priv, int ch,regmap_write (priv->regmap,TIM_PSC , prescaler);regmap_write (priv->regmap,TIM_ARR , prd -1 ); -regmap_update_bits (priv->regmap,TIM_CR1 ,TIM_CR1_ARPE ,TIM_CR1_ARPE ); +regmap_set_bits (priv->regmap,TIM_CR1 ,TIM_CR1_ARPE );/* Calculate the duty cycles */ dty = prd * duty_ns;
@@ -377,7 +377,7 @@ static int stm32_pwm_config(struct stm32_pwm *priv, int ch,else regmap_update_bits (priv->regmap,TIM_CCMR2 , mask, ccmr); -regmap_update_bits (priv->regmap,TIM_BDTR ,TIM_BDTR_MOE ,TIM_BDTR_MOE ); +regmap_set_bits (priv->regmap,TIM_BDTR ,TIM_BDTR_MOE );return 0 ; }
@@ -411,13 +411,13 @@ static int stm32_pwm_enable(struct stm32_pwm *priv, int ch)if (priv->have_complementary_output) mask |=TIM_CCER_CC1NE << (ch *4 ); -regmap_update_bits (priv->regmap,TIM_CCER , mask, mask); +regmap_set_bits (priv->regmap,TIM_CCER , mask);/* Make sure that registers are updated */ -regmap_update_bits (priv->regmap,TIM_EGR ,TIM_EGR_UG ,TIM_EGR_UG ); +regmap_set_bits (priv->regmap,TIM_EGR ,TIM_EGR_UG );/* Enable controller */ -regmap_update_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN ,TIM_CR1_CEN ); +regmap_set_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN );return 0 ; }
@@ -431,11 +431,11 @@ static void stm32_pwm_disable(struct stm32_pwm *priv, int ch)if (priv->have_complementary_output) mask |=TIM_CCER_CC1NE << (ch *4 ); -regmap_update_bits (priv->regmap,TIM_CCER , mask,0 ); +regmap_clear_bits (priv->regmap,TIM_CCER , mask);/* When all channels are disabled, we can disable the controller */ if (!active_channels (priv)) -regmap_update_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN ,0 ); +regmap_clear_bits (priv->regmap,TIM_CR1 ,TIM_CR1_CEN );clk_disable (priv->clk); }
@@ -568,10 +568,9 @@ static void stm32_pwm_detect_complementary(struct stm32_pwm *priv)* If complementary bit doesn't exist writing 1 will have no * effect so we can detect it. */ -regmap_update_bits (priv->regmap, -TIM_CCER ,TIM_CCER_CC1NE ,TIM_CCER_CC1NE ); +regmap_set_bits (priv->regmap,TIM_CCER ,TIM_CCER_CC1NE );regmap_read (priv->regmap,TIM_CCER , &ccer); -regmap_update_bits (priv->regmap,TIM_CCER ,TIM_CCER_CC1NE ,0 ); +regmap_clear_bits (priv->regmap,TIM_CCER ,TIM_CCER_CC1NE ); priv->have_complementary_output = (ccer !=0 ); }
@@ -585,10 +584,9 @@ static int stm32_pwm_detect_channels(struct stm32_pwm *priv)* If channels enable bits don't exist writing 1 will have no * effect so we can detect and count them. */ -regmap_update_bits (priv->regmap, -TIM_CCER ,TIM_CCER_CCXE ,TIM_CCER_CCXE ); +regmap_set_bits (priv->regmap,TIM_CCER ,TIM_CCER_CCXE );regmap_read (priv->regmap,TIM_CCER , &ccer); -regmap_update_bits (priv->regmap,TIM_CCER ,TIM_CCER_CCXE ,0 ); +regmap_clear_bits (priv->regmap,TIM_CCER ,TIM_CCER_CCXE );if (ccer &TIM_CCER_CC1E ) npwm++;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 229/417 pwm: stm32: Use hweight32 in stm32_pwm_detect_channels
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philipp Zabel <[email protected]>
[ Upstream commit 41fa8f57c0d269243fe3bde2bce71e82c884b9ad ]
Use hweight32() to count the CCxE bits in stm32_pwm_detect_channels(). Since the return value is assigned to chip.npwm, change it to unsigned int as well.
Stable-dep-of: 19f1016ea960 ("pwm: stm32: Fix enable count for clk in .probe()")
--- drivers/pwm/pwm-stm32.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-)
drivers/pwm/pwm-stm32.c +2 -15
@@ -575,10 +575,9 @@ static void stm32_pwm_detect_complementary(struct stm32_pwm *priv) priv->have_complementary_output = (ccer !=0 ); } -static int stm32_pwm_detect_channels (struct stm32_pwm *priv) +static unsigned int stm32_pwm_detect_channels (struct stm32_pwm *priv) {u32 ccer; -int npwm =0 ;/* * If channels enable bits don't exist writing 1 will have no
@@ -588,19 +587,7 @@ static int stm32_pwm_detect_channels(struct stm32_pwm *priv)regmap_read (priv->regmap,TIM_CCER , &ccer);regmap_clear_bits (priv->regmap,TIM_CCER ,TIM_CCER_CCXE ); -if (ccer &TIM_CCER_CC1E ) - npwm++; - -if (ccer &TIM_CCER_CC2E ) - npwm++; - -if (ccer &TIM_CCER_CC3E ) - npwm++; - -if (ccer &TIM_CCER_CC4E ) - npwm++; - -return npwm; +return hweight32 (ccer &TIM_CCER_CCXE ); }static int stm32_pwm_probe (struct platform_device *pdev)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 230/417 pwm: stm32: Fix enable count for clk in .probe()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philipp Zabel <[email protected]>
[ Upstream commit 19f1016ea9600ed89bc24247c36ff5934ad94fbb ]
Make the driver take over hardware state without disabling in .probe() and enable the clock for each enabled channel.
--- drivers/pwm/pwm-stm32.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
drivers/pwm/pwm-stm32.c +14 -4
@@ -575,17 +575,21 @@ static void stm32_pwm_detect_complementary(struct stm32_pwm *priv) priv->have_complementary_output = (ccer !=0 ); } -static unsigned int stm32_pwm_detect_channels (struct stm32_pwm *priv) +static unsigned int stm32_pwm_detect_channels (struct stm32_pwm *priv, +unsigned int *num_enabled) { -u32 ccer; +u32 ccer, ccer_backup;/* * If channels enable bits don't exist writing 1 will have no * effect so we can detect and count them. */ +regmap_read (priv->regmap,TIM_CCER , &ccer_backup);regmap_set_bits (priv->regmap,TIM_CCER ,TIM_CCER_CCXE );regmap_read (priv->regmap,TIM_CCER , &ccer); -regmap_clear_bits (priv->regmap,TIM_CCER ,TIM_CCER_CCXE ); +regmap_write (priv->regmap,TIM_CCER , ccer_backup); + + *num_enabled =hweight32 (ccer_backup &TIM_CCER_CCXE );return hweight32 (ccer &TIM_CCER_CCXE ); }
@@ -596,6 +600,8 @@ static int stm32_pwm_probe(struct platform_device *pdev)struct device_node *np = dev->of_node;struct stm32_timers *ddata =dev_get_drvdata (pdev->dev.parent);struct stm32_pwm *priv; +unsigned int num_enabled; +unsigned int i;int ret; priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL );
@@ -618,7 +624,11 @@ static int stm32_pwm_probe(struct platform_device *pdev) priv->chip.dev = dev; priv->chip.ops = &stm32pwm_ops; - priv->chip.npwm =stm32_pwm_detect_channels (priv); + priv->chip.npwm =stm32_pwm_detect_channels (priv, &num_enabled); + +/* Initialize clock refcount to number of enabled PWM channels. */ +for (i =0 ; i < num_enabled; i++) +clk_enable (priv->clk); ret =pwmchip_add (&priv->chip);if (ret <0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 231/417 ASoC: rt5645: Drop double EF20 entry from dmi_platform_data[]
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit 51add1687f39292af626ac3c2046f49241713273 ]
dmi_platform_data[] first contains a DMI entry matching:
DMI_MATCH(DMI_PRODUCT_NAME, "EF20"),
and then contains an identical entry except for the match being:
DMI_MATCH(DMI_PRODUCT_NAME, "EF20EA"),
Since these are partial (non exact) DMI matches the first match will also match any board with "EF20EA" in their DMI product-name, drop the second, redundant, entry.
--- sound/soc/codecs/rt5645.c | 8 -------- 1 file changed, 8 deletions(-)
sound/soc/codecs/rt5645.c +0 -8
@@ -3827,14 +3827,6 @@ static const struct dmi_system_id dmi_platform_data[] = { }, .driver_data = (void *)&ecs_ef20_platform_data, }, - { - .ident = "EF20EA", - .callback = cht_rt5645_ef20_quirk_cb, - .matches = { - DMI_MATCH(DMI_PRODUCT_NAME, "EF20EA"), - }, - .driver_data = (void *)&ecs_ef20_platform_data, - }, { } };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 232/417 ALSA: scarlett2: Add missing error check to scarlett2_config_save()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit 5f6ff6931a1c0065a55448108940371e1ac8075f ]
scarlett2_config_save() was ignoring the return value from scarlett2_usb(). As this function is not called from user-space we can't return the error, so call usb_audio_err() instead.
--- sound/usb/mixer_scarlett_gen2.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
sound/usb/mixer_scarlett_gen2.c +5 -3
@@ -1337,9 +1337,11 @@ static void scarlett2_config_save(struct usb_mixer_interface *mixer) {__le32 req =cpu_to_le32 (SCARLETT2_USB_CONFIG_SAVE ); -scarlett2_usb (mixer,SCARLETT2_USB_DATA_CMD , - &req,sizeof (u32), -NULL ,0 ); +int err =scarlett2_usb (mixer,SCARLETT2_USB_DATA_CMD , + &req,sizeof (u32), +NULL ,0 ); +if (err <0 ) +usb_audio_err (mixer->chip,"config save failed: %d\n" , err); }/* Delayed work to save config */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 233/417 ALSA: scarlett2: Add missing error check to scarlett2_usb_set_config()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit ca459dfa7d4ed9098fcf13e410963be6ae9b6bf3 ]
scarlett2_usb_set_config() calls scarlett2_usb_get() but was not checking the result. Return the error if it fails rather than continuing with an invalid value.
--- sound/usb/mixer_scarlett_gen2.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
sound/usb/mixer_scarlett_gen2.c +4 -1
@@ -1390,7 +1390,10 @@ static int scarlett2_usb_set_config( size =1 ; offset = config_item->offset; -scarlett2_usb_get (mixer, offset, &tmp,1 ); + err =scarlett2_usb_get (mixer, offset, &tmp,1 ); +if (err <0 ) +return err; +if (value) tmp |= (1 << index);else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 234/417 ALSA: scarlett2: Allow passing any output to line_out_remap()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit 2190b9aea4eb92ccf3176e35c17c959e40f1a81b ]
Line outputs 3 & 4 on the Gen 3 18i8 are internally the analogue 7 and 8 outputs, and this renumbering is hidden from the user by line_out_remap(). By allowing higher values (representing non-analogue outputs) to be passed to line_out_remap(), repeated code from scarlett2_mux_src_enum_ctl_get() and scarlett2_mux_src_enum_ctl_put() can be removed.
Stable-dep-of: 50603a67daef ("ALSA: scarlett2: Add missing error checks to *_ctl_get()")
--- sound/usb/mixer_scarlett_gen2.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-)
sound/usb/mixer_scarlett_gen2.c +9 -16
@@ -1901,9 +1901,16 @@ static int scarlett2_master_volume_ctl_get(struct snd_kcontrol *kctl,static int line_out_remap (struct scarlett2_data *private,int index) {const struct scarlett2_device_info *info = private->info; +const int (*port_count)[SCARLETT2_PORT_DIRNS ] = info->port_count; +int line_out_count = + port_count[SCARLETT2_PORT_TYPE_ANALOGUE ][SCARLETT2_PORT_OUT ];if (!info->line_out_remap_enable)return index; + +if (index >= line_out_count) +return index; +return info->line_out_remap[index]; }
@@ -3388,14 +3395,7 @@ static int scarlett2_mux_src_enum_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; -const struct scarlett2_device_info *info = private->info; -const int (*port_count)[SCARLETT2_PORT_DIRNS ] = info->port_count; -int line_out_count = - port_count[SCARLETT2_PORT_TYPE_ANALOGUE ][SCARLETT2_PORT_OUT ]; -int index = elem->control; - -if (index < line_out_count) - index =line_out_remap (private, index); +int index =line_out_remap (private, elem->control);mutex_lock (&private->data_mutex);if (private->mux_updated)
@@ -3412,16 +3412,9 @@ static int scarlett2_mux_src_enum_ctl_put(struct snd_kcontrol *kctl,struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; -const struct scarlett2_device_info *info = private->info; -const int (*port_count)[SCARLETT2_PORT_DIRNS ] = info->port_count; -int line_out_count = - port_count[SCARLETT2_PORT_TYPE_ANALOGUE ][SCARLETT2_PORT_OUT ]; -int index = elem->control; +int index =line_out_remap (private, elem->control);int oval, val, err =0 ; -if (index < line_out_count) - index =line_out_remap (private, index); -mutex_lock (&private->data_mutex); oval = private->mux[index];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 235/417 ALSA: scarlett2: Add missing error checks to *_ctl_get()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit 50603a67daef161c78c814580d57f7f0be57167e ]
The *_ctl_get() functions which call scarlett2_update_*() were not checking the return value. Fix to check the return value and pass to the caller.
--- sound/usb/mixer_scarlett_gen2.c | 182 +++++++++++++++++++++++--------- 1 file changed, 130 insertions(+), 52 deletions(-)
sound/usb/mixer_scarlett_gen2.c +130 -52
@@ -1798,14 +1798,20 @@ static int scarlett2_sync_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->sync_updated) -scarlett2_update_sync (mixer); + +if (private->sync_updated) { + err =scarlett2_update_sync (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.enumerated.item[0 ] = private->sync; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; }static const struct snd_kcontrol_new scarlett2_sync_ctl = {
@@ -1888,14 +1894,20 @@ static int scarlett2_master_volume_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->vol_updated) -scarlett2_update_volumes (mixer); -mutex_unlock (&private->data_mutex); +if (private->vol_updated) { + err =scarlett2_update_volumes (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.integer.value[0 ] = private->master_vol; -return 0 ; + +unlock: +mutex_unlock (&private->data_mutex); +return err; }static int line_out_remap (struct scarlett2_data *private,int index)
@@ -1921,14 +1933,20 @@ static int scarlett2_volume_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data;int index =line_out_remap (private, elem->control); +int err =0 ;mutex_lock (&private->data_mutex); -if (private->vol_updated) -scarlett2_update_volumes (mixer); -mutex_unlock (&private->data_mutex); +if (private->vol_updated) { + err =scarlett2_update_volumes (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.integer.value[0 ] = private->vol[index]; -return 0 ; + +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_volume_ctl_put(struct snd_kcontrol *kctl,
@@ -1995,14 +2013,20 @@ static int scarlett2_mute_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data;int index =line_out_remap (private, elem->control); +int err =0 ;mutex_lock (&private->data_mutex); -if (private->vol_updated) -scarlett2_update_volumes (mixer); -mutex_unlock (&private->data_mutex); +if (private->vol_updated) { + err =scarlett2_update_volumes (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.integer.value[0 ] = private->mute_switch[index]; -return 0 ; + +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_mute_ctl_put(struct snd_kcontrol *kctl,
@@ -2248,14 +2272,20 @@ static int scarlett2_level_enum_ctl_get(struct snd_kcontrol *kctl,const struct scarlett2_device_info *info = private->info;int index = elem->control + info->level_input_first; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->input_other_updated) -scarlett2_update_input_other (mixer); + +if (private->input_other_updated) { + err =scarlett2_update_input_other (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.enumerated.item[0 ] = private->level_switch[index]; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_level_enum_ctl_put(struct snd_kcontrol *kctl,
@@ -2306,15 +2336,21 @@ static int scarlett2_pad_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->input_other_updated) -scarlett2_update_input_other (mixer); + +if (private->input_other_updated) { + err =scarlett2_update_input_other (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.integer.value[0 ] = private->pad_switch[elem->control]; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_pad_ctl_put(struct snd_kcontrol *kctl,
@@ -2364,14 +2400,20 @@ static int scarlett2_air_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->input_other_updated) -scarlett2_update_input_other (mixer); + +if (private->input_other_updated) { + err =scarlett2_update_input_other (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.integer.value[0 ] = private->air_switch[elem->control]; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_air_ctl_put(struct snd_kcontrol *kctl,
@@ -2421,15 +2463,21 @@ static int scarlett2_phantom_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->input_other_updated) -scarlett2_update_input_other (mixer); + +if (private->input_other_updated) { + err =scarlett2_update_input_other (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.integer.value[0 ] = private->phantom_switch[elem->control]; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_phantom_ctl_put(struct snd_kcontrol *kctl,
@@ -2601,14 +2649,20 @@ static int scarlett2_direct_monitor_ctl_get(struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = elem->head.mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->monitor_other_updated) -scarlett2_update_monitor_other (mixer); + +if (private->monitor_other_updated) { + err =scarlett2_update_monitor_other (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.enumerated.item[0 ] = private->direct_monitor_switch; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_direct_monitor_ctl_put(
@@ -2708,14 +2762,20 @@ static int scarlett2_speaker_switch_enum_ctl_get(struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->monitor_other_updated) -scarlett2_update_monitor_other (mixer); + +if (private->monitor_other_updated) { + err =scarlett2_update_monitor_other (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.enumerated.item[0 ] = private->speaker_switching_switch; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; }/* when speaker switching gets enabled, switch the main/alt speakers
@@ -2863,14 +2923,20 @@ static int scarlett2_talkback_enum_ctl_get(struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->monitor_other_updated) -scarlett2_update_monitor_other (mixer); + +if (private->monitor_other_updated) { + err =scarlett2_update_monitor_other (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.enumerated.item[0 ] = private->talkback_switch; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_talkback_enum_ctl_put(
@@ -3018,14 +3084,20 @@ static int scarlett2_dim_mute_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_elem_info *elem = kctl->private_data;struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data; +int err =0 ;mutex_lock (&private->data_mutex); -if (private->vol_updated) -scarlett2_update_volumes (mixer); -mutex_unlock (&private->data_mutex); +if (private->vol_updated) { + err =scarlett2_update_volumes (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.integer.value[0 ] = private->dim_mute[elem->control]; -return 0 ; + +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_dim_mute_ctl_put(struct snd_kcontrol *kctl,
@@ -3396,14 +3468,20 @@ static int scarlett2_mux_src_enum_ctl_get(struct snd_kcontrol *kctl,struct usb_mixer_interface *mixer = elem->head.mixer;struct scarlett2_data *private = mixer->private_data;int index =line_out_remap (private, elem->control); +int err =0 ;mutex_lock (&private->data_mutex); -if (private->mux_updated) -scarlett2_usb_get_mux (mixer); + +if (private->mux_updated) { + err =scarlett2_usb_get_mux (mixer); +if (err <0 ) + goto unlock; + } ucontrol->value.enumerated.item[0 ] = private->mux[index]; -mutex_unlock (&private->data_mutex); -return 0 ; +unlock: +mutex_unlock (&private->data_mutex); +return err; } static int scarlett2_mux_src_enum_ctl_put(struct snd_kcontrol *kctl,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 236/417 ALSA: scarlett2: Add clamp() in scarlett2_mixer_ctl_put()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geoffrey D. Bennett <[email protected]>
[ Upstream commit 04f8f053252b86c7583895c962d66747ecdc61b7 ]
Ensure the value passed to scarlett2_mixer_ctl_put() is between 0 and SCARLETT2_MIXER_MAX_VALUE so we don't attempt to access outside scarlett2_mixer_values[].
--- sound/usb/mixer_scarlett_gen2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/usb/mixer_scarlett_gen2.c +2 -1
@@ -3361,7 +3361,8 @@ static int scarlett2_mixer_ctl_put(struct snd_kcontrol *kctl,mutex_lock (&private->data_mutex); oval = private->mix[index]; - val = ucontrol->value.integer.value[0 ]; + val =clamp (ucontrol->value.integer.value[0 ], +0L , (long )SCARLETT2_MIXER_MAX_VALUE ); num_mixer_in = port_count[SCARLETT2_PORT_TYPE_MIX ][SCARLETT2_PORT_OUT ]; mix_num = index / num_mixer_in;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 237/417 mmc: sdhci_am654: Fix TI SoC dependencies
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Robinson <[email protected]>
[ Upstream commit cb052da7f031b0d2309a4895ca236afb3b4bbf50 ]
The sdhci_am654 is specific to recent TI SoCs, update the dependencies for those SoCs and compile testing. While we're at it update the text to reflect the wider range of supported TI SoCS the driver now supports.
--- drivers/mmc/host/Kconfig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/mmc/host/Kconfig +3 -2
@@ -1076,14 +1076,15 @@ config MMC_SDHCI_OMAP config MMC_SDHCI_AM654 tristate "Support for the SDHCI Controller in TI's AM654 SOCs" + depends on ARCH_K3 || COMPILE_TEST depends on MMC_SDHCI_PLTFM && OF select MMC_SDHCI_IO_ACCESSORS select MMC_CQHCI select REGMAP_MMIO help This selects the Secure Digital Host Controller Interface (SDHCI) - support present in TI's AM654 SOCs. The controller supports - SD/MMC/SDIO devices. + support present in TI's AM65x/AM64x/AM62x/J721E SOCs. The controller + supports SD/MMC/SDIO devices. If you have a controller with this interface, say Y or M here.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 238/417 mmc: sdhci_omap: Fix TI SoC dependencies
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Robinson <[email protected]>
[ Upstream commit 09f164d393a6671e5ff8342ba6b3cb7fe3f20208 ]
The sdhci_omap is specific to older TI SoCs, update the dependencies for those SoCs and compile testing. While we're at it update the text to reflect the wider range of supported TI SoCS the driver now supports.
--- drivers/mmc/host/Kconfig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/mmc/host/Kconfig +3 -2
@@ -1061,14 +1061,15 @@ config MMC_SDHCI_XENON config MMC_SDHCI_OMAP tristate "TI SDHCI Controller Support" + depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || COMPILE_TEST depends on MMC_SDHCI_PLTFM && OF select THERMAL imply TI_SOC_THERMAL select MMC_SDHCI_EXTERNAL_DMA if DMA_ENGINE help This selects the Secure Digital Host Controller Interface (SDHCI) - support present in TI's DRA7 SOCs. The controller supports - SD/MMC/SDIO devices. + support present in TI's Keystone/OMAP2+/DRA7 SOCs. The controller + supports SD/MMC/SDIO devices. If you have a controller with this interface, say Y or M here.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 239/417 IB/iser: Prevent invalidating wrong MR
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Gorenko <[email protected]>
[ Upstream commit 2f1888281e67205bd80d3e8f54dbd519a9653f26 ]
The iser_reg_resources structure has two pointers to MR but only one mr_valid field. The implementation assumes that we use only *sig_mr when pi_enable is true. Otherwise, we use only *mr. However, it is only sometimes correct. Read commands without protection information occur even when pi_enble is true. For example, the following SCSI commands have a Data-In buffer but never have protection information: READ CAPACITY (16), INQUIRY, MODE SENSE(6), MAINTENANCE IN. So, we use*sig_mr for some SCSI commands and *mr for the other SCSI commands.
In most cases, it works fine because the remote invalidation is applied. However, there are two cases when the remote invalidation is not applicable.
1. Small write commands when all data is sent as an immediate.
2. The target does not support the remote invalidation feature.
The lazy invalidation is used if the remote invalidation is impossible. Since, at the lazy invalidation, we always invalidate the MR we want to use, the wrong MR may be invalidated.
To fix the issue, we need a field per MR that indicates the MR needs invalidation. Since the ib_mr structure already has such a field, let's use ib_mr.need_inval instead of iser_reg_resources.mr_valid.
--- drivers/infiniband/ulp/iser/iscsi_iser.h | 2 -- drivers/infiniband/ulp/iser/iser_initiator.c | 5 ++++- drivers/infiniband/ulp/iser/iser_memory.c | 8 ++++---- drivers/infiniband/ulp/iser/iser_verbs.c | 1 - 4 files changed, 8 insertions(+), 8 deletions(-)
drivers/infiniband/ulp/iser/iscsi_iser.h +0 -2
@@ -317,12 +317,10 @@ struct iser_device {* * @mr: memory region * @sig_mr: signature memory region -* @mr_valid: is mr valid indicator */ struct iser_reg_resources {struct ib_mr *mr;struct ib_mr *sig_mr; -u8 mr_valid:1 ; };/**
drivers/infiniband/ulp/iser/iser_initiator.c +4 -1
@@ -580,7 +580,10 @@ static inline int iser_inv_desc(struct iser_fr_desc *desc, u32 rkey)return -EINVAL ; } - desc->rsc.mr_valid =0 ; +if (desc->sig_protected) + desc->rsc.sig_mr->need_inval = false; +else + desc->rsc.mr->need_inval = false;return 0 ; }
drivers/infiniband/ulp/iser/iser_memory.c +4 -4
@@ -264,7 +264,7 @@ static int iser_reg_sig_mr(struct iscsi_iser_task *iser_task,iser_set_prot_checks (iser_task->sc, &sig_attrs->check_mask); -if (rsc->mr_valid) +if (rsc->sig_mr->need_inval)iser_inv_rkey (&tx_desc->inv_wr, mr, cqe, &wr->wr);ib_update_fast_reg_key (mr,ib_inc_rkey (mr->rkey));
@@ -288,7 +288,7 @@ static int iser_reg_sig_mr(struct iscsi_iser_task *iser_task, wr->access =IB_ACCESS_LOCAL_WRITE |IB_ACCESS_REMOTE_READ |IB_ACCESS_REMOTE_WRITE ; - rsc->mr_valid =1 ; + rsc->sig_mr->need_inval = true; sig_reg->sge.lkey = mr->lkey; sig_reg->rkey = mr->rkey;
@@ -313,7 +313,7 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,struct ib_reg_wr *wr = &tx_desc->reg_wr;int n; -if (rsc->mr_valid) +if (rsc->mr->need_inval)iser_inv_rkey (&tx_desc->inv_wr, mr, cqe, &wr->wr);ib_update_fast_reg_key (mr,ib_inc_rkey (mr->rkey));
@@ -336,7 +336,7 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,IB_ACCESS_REMOTE_WRITE |IB_ACCESS_REMOTE_READ ; - rsc->mr_valid =1 ; + rsc->mr->need_inval = true; reg->sge.lkey = mr->lkey; reg->rkey = mr->rkey;
drivers/infiniband/ulp/iser/iser_verbs.c +0 -1
@@ -135,7 +135,6 @@ iser_create_fastreg_desc(struct iser_device *device, goto err_alloc_mr_integrity; } } - desc->rsc.mr_valid =0 ;return desc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 240/417 drm/amdkfd: Confirm list is non-empty before utilizing list_first_entry in kfd_topology.c
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit 499839eca34ad62d43025ec0b46b80e77065f6d8 ]
Before using list_first_entry, make sure to check that list is not empty, if list is empty return -ENODATA.
Fixes the below:drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c:1347 kfd_create_indirect_link_prop() warn: can 'gpu_link' even be NULL? drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c:1428 kfd_add_peer_prop() warn: can 'iolink1' even be NULL? drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c:1433 kfd_add_peer_prop() warn: can 'iolink2' even be NULL?
--- drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_topology.c +12 -9
@@ -1403,10 +1403,11 @@ static int kfd_create_indirect_link_prop(struct kfd_topology_device *kdev, int g num_cpu++; } +if (list_empty (&kdev->io_link_props)) +return -ENODATA ; + gpu_link =list_first_entry (&kdev->io_link_props, - struct kfd_iolink_properties, list); -if (!gpu_link) -return -ENOMEM ; + struct kfd_iolink_properties, list);for (i =0 ; i < num_cpu; i++) {/* CPU <--> GPU */
@@ -1484,15 +1485,17 @@ static int kfd_add_peer_prop(struct kfd_topology_device *kdev, peer->gpu->adev))return ret; +if (list_empty (&kdev->io_link_props)) +return -ENODATA ; + iolink1 =list_first_entry (&kdev->io_link_props, - struct kfd_iolink_properties, list); -if (!iolink1) -return -ENOMEM ; + struct kfd_iolink_properties, list); + +if (list_empty (&peer->io_link_props)) +return -ENODATA ; iolink2 =list_first_entry (&peer->io_link_props, - struct kfd_iolink_properties, list); -if (!iolink2) -return -ENOMEM ; + struct kfd_iolink_properties, list); props =kfd_alloc_struct (props);if (!props)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 241/417 drm/amd/pm/smu7: fix a memleak in smu7_hwmgr_backend_init
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit 2f3be3ca779b11c332441b10e00443a2510f4d7b ]
The hwmgr->backend, (i.e. data) allocated by kzalloc is not freed in the error-handling paths of smu7_get_evv_voltages and smu7_update_edc_leakage_table. However, it did be freed in the error-handling of phm_initializa_dynamic_state_adjustment_rule_settings, by smu7_hwmgr_backend_fini. So the lack of free in smu7_get_evv_voltages and smu7_update_edc_leakage_table is considered a memleak in this patch.
--- drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +5 -1
@@ -2987,6 +2987,8 @@ static int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr) result =smu7_get_evv_voltages (hwmgr);if (result) {pr_info ("Get EVV Voltage Failed. Abort Driver loading!\n" ); +kfree (hwmgr->backend); + hwmgr->backend =NULL ;return -EINVAL ; } }else {
@@ -3032,8 +3034,10 @@ static int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr) } result =smu7_update_edc_leakage_table (hwmgr); -if (result) +if (result) { +smu7_hwmgr_backend_fini (hwmgr);return result; + }return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 242/417 kselftest/alsa - mixer-test: fix the number of parameters to ksft_exit_fail_msg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mirsad Todorovac <[email protected]>
[ Upstream commit 8c51c13dc63d46e754c44215eabc0890a8bd9bfb ]
Minor fix in the number of arguments to error reporting function in the test program as reported by GCC 13.2.0 warning.
mixer-test.c: In function ‘find_controls’:
mixer-test.c:169:44: warning: too many arguments for format [-Wformat-extra-args]
169 | ksft_exit_fail_msg("snd_ctl_poll_descriptors() failed for %d\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The number of arguments in call to ksft_exit_fail_msg() doesn't correspond to the format specifiers, so this is adjusted resembling the sibling calls to the error function.
--- tools/testing/selftests/alsa/mixer-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/alsa/mixer-test.c +1 -1
@@ -205,7 +205,7 @@ static void find_controls(void) err =snd_ctl_poll_descriptors (card_data->handle, &card_data->pollfd,1 );if (err !=1 ) { -ksft_exit_fail_msg ("snd_ctl_poll_descriptors() failed for %d\n" , +ksft_exit_fail_msg ("snd_ctl_poll_descriptors() failed for card %d: %d\n" , card, err); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 243/417 kselftest/alsa - mixer-test: Fix the print format specifier warning
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mirsad Todorovac <[email protected]>
[ Upstream commit 3f47c1ebe5ca9c5883e596c7888dec4bec0176d8 ]
The GCC 13.2.0 compiler issued the following warning:
mixer-test.c: In function ‘ctl_value_index_valid’:
mixer-test.c:322:79: warning: format ‘%lld’ expects argument of type ‘long long int’, \
but argument 5 has type ‘long int’ [-Wformat=]
322 | ksft_print_msg("%s.%d value %lld more than maximum %lld\n",
| ~~~^
| |
| long long int
| %ld
323 | ctl->name, index, int64_val,
324 | snd_ctl_elem_info_get_max(ctl->info));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| long intFixing the format specifier as advised by the compiler suggestion removes the warning.
--- tools/testing/selftests/alsa/mixer-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/alsa/mixer-test.c +1 -1
@@ -358,7 +358,7 @@ static bool ctl_value_index_valid(struct ctl_data *ctl, }if (int64_val >snd_ctl_elem_info_get_max64 (ctl->info)) { -ksft_print_msg ("%s.%d value %lld more than maximum %lld\n" , +ksft_print_msg ("%s.%d value %lld more than maximum %ld\n" , ctl->name, index, int64_val,snd_ctl_elem_info_get_max (ctl->info));return false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 244/417 ksmbd: validate the zero field of packet header
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Nan <[email protected]>
[ Upstream commit 516b3eb8c8065f7465f87608d37a7ed08298c7a5 ]
The SMB2 Protocol requires that "The first byte of the Direct TCP transport packet header MUST be zero (0x00)"[1]. Commit 1c1bcf2d3ea0 ("ksmbd: validate smb request protocol id") removed the validation of this 1-byte zero. Add the validation back now.
[1]: [MS-SMB2] - v20230227, page 30.
https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-SMB2/%5bMS-SMB2%5d-230227.pdf
--- fs/smb/server/smb_common.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/smb/server/smb_common.c +5 -1
@@ -158,8 +158,12 @@ int ksmbd_verify_smb_message(struct ksmbd_work *work)*/ bool ksmbd_smb_request (struct ksmbd_conn *conn) { -__le32 *proto = (__le32 *)smb2_get_msg (conn->request_buf); +__le32 *proto; +if (conn->request_buf[0 ] !=0 ) +return false; + + proto = (__le32 *)smb2_get_msg (conn->request_buf);if (*proto ==SMB2_COMPRESSION_TRANSFORM_ID ) {pr_err_ratelimited ("smb2 compression not support yet" );return false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 245/417 of: Fix double free in of_parse_phandle_with_args_map
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian A. Ehrhardt <[email protected]>
[ Upstream commit 4dde83569832f9377362e50f7748463340c5db6b ]
In of_parse_phandle_with_args_map() the inner loop that iterates through the map entries calls of_node_put(new) to free the reference acquired by the previous iteration of the inner loop. This assumes that the value of "new" is NULL on the first iteration of the inner loop.
Make sure that this is true in all iterations of the outer loop by setting "new" to NULL after its value is assigned to "cur".
Extend the unittest to detect the double free and add an additional test case that actually triggers this path.
--- drivers/of/base.c | 1 + drivers/of/unittest-data/tests-phandle.dtsi | 10 ++- drivers/of/unittest.c | 74 ++++++++++++--------- 3 files changed, 53 insertions(+), 32 deletions(-)
drivers/of/base.c +1 -0
@@ -1646,6 +1646,7 @@ int of_parse_phandle_with_args_map(const struct device_node *np, out_args->np = new;of_node_put (cur); cur = new; + new =NULL ; } put:of_node_put (cur);
drivers/of/unittest-data/tests-phandle.dtsi +9 -1
@@ -38,6 +38,13 @@ provider4: provider4 { phandle-map-pass-thru = <0x0 0xf0>; }; + provider5: provider5 { + #phandle-cells = <2>; + phandle-map = <2 7 &provider4 2 3>; + phandle-map-mask = <0xff 0xf>; + phandle-map-pass-thru = <0x0 0xf0>; + }; + consumer-a { phandle-list = <&provider1 1>, <&provider2 2 0>,
@@ -64,7 +71,8 @@ consumer-b { <&provider4 4 0x100>, <&provider4 0 0x61>, <&provider0>, - <&provider4 19 0x20>; + <&provider4 19 0x20>, + <&provider5 2 7>; phandle-list-bad-phandle = <12345678 0 0>; phandle-list-bad-args = <&provider2 1 0>, <&provider4 0>;
drivers/of/unittest.c +43 -31
144 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 246/417 fbdev: imxfb: fix left margin setting
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 5758844105f7dd9a0a04990cd92499a1a593dd36 ]
The previous setting did not take into account the CSTN mode. For the H_WAIT_2 bitfield (bits 0-7) of the LCDC Horizontal Configuration Register (LCDCR), the IMX25RM manual states that:
In TFT mode, it specifies the number of SCLK periods between the end of HSYNC and the beginning of OE signal, and the total delay time equals (H_WAIT_2 + 3) of SCLK periods.
In CSTN mode, it specifies the number of SCLK periods between the end of HSYNC and the first display data in each line, and the total delay time equals (H_WAIT_2 + 2) of SCLK periods.
The patch handles both cases.
--- drivers/video/fbdev/imxfb.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
drivers/video/fbdev/imxfb.c +25 -2
@@ -42,6 +42,7 @@#include <video/videomode.h> #define PCR_TFT (1 << 31) +#define PCR_COLOR (1 << 30)#define PCR_BPIX_8 (3 << 25)#define PCR_BPIX_12 (4 << 25)#define PCR_BPIX_16 (5 << 25)
@@ -150,6 +151,12 @@ enum imxfb_type { IMX21_FB, }; +enum imxfb_panel_type { +PANEL_TYPE_MONOCHROME , +PANEL_TYPE_CSTN , +PANEL_TYPE_TFT , +}; +struct imxfb_info {struct platform_device *pdev;void __iomem *regs;
@@ -157,6 +164,7 @@ struct imxfb_info {struct clk *clk_ahb;struct clk *clk_per;enum imxfb_type devtype; +enum imxfb_panel_type panel_type;bool enabled;/*
@@ -444,6 +452,13 @@ static int imxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)if (!is_imx1_fb (fbi) && imxfb_mode->aus_mode) fbi->lauscr =LAUSCR_AUS_MODE ; +if (imxfb_mode->pcr &PCR_TFT ) + fbi->panel_type =PANEL_TYPE_TFT ; +else if (imxfb_mode->pcr &PCR_COLOR ) + fbi->panel_type =PANEL_TYPE_CSTN ; +else + fbi->panel_type =PANEL_TYPE_MONOCHROME ; +/* * Copy the RGB parameters for this display * from the machine specific parameters.
@@ -598,6 +613,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf {struct imxfb_info *fbi = info->par;u32 ymax_mask =is_imx1_fb (fbi) ?YMAX_MASK_IMX1 :YMAX_MASK_IMX21 ; +u8 left_margin_low; pr_debug("var: xres=%d hslen=%d lm=%d rm=%d\n", var->xres, var->hsync_len,
@@ -606,6 +622,13 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf var->yres, var->vsync_len, var->upper_margin, var->lower_margin); +if (fbi->panel_type ==PANEL_TYPE_TFT ) + left_margin_low =3 ; +else if (fbi->panel_type ==PANEL_TYPE_CSTN ) + left_margin_low =2 ; +else + left_margin_low =0 ; +#if DEBUG_VAR if (var->xres <16 || var->xres >1024 ) printk(KERN_ERR "%s: invalid xres %d\n",
@@ -613,7 +636,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *infif (var->hsync_len <1 || var->hsync_len >64 )printk (KERN_ERR "%s: invalid hsync_len %d\n" , info->fix.id, var->hsync_len); -if (var->left_margin <3 || var->left_margin >255 ) +if (var->left_margin < left_margin_low || var->left_margin >255 )printk (KERN_ERR "%s: invalid left_margin %d\n" , info->fix.id, var->left_margin);if (var->right_margin <1 || var->right_margin >255 )
@@ -639,7 +662,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *infwritel (HCR_H_WIDTH (var->hsync_len -1 ) |HCR_H_WAIT_1 (var->right_margin -1 ) | -HCR_H_WAIT_2 (var->left_margin -3 ), +HCR_H_WAIT_2 (var->left_margin - left_margin_low), fbi->regs +LCDC_HCR ); writel(VCR_V_WIDTH(var->vsync_len) |
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 247/417 of: unittest: Fix of_count_phandle_with_args() expected value message
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 716089b417cf98d01f0dc1b39f9c47e1d7b4c965 ]
The expected result value for the call to of_count_phandle_with_args() was updated from 7 to 8, but the accompanying error message was forgotten.
--- drivers/of/unittest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/of/unittest.c +1 -1
@@ -566,7 +566,7 @@ static void __init of_unittest_parse_phandle_with_args_map(void) } rc =of_count_phandle_with_args (np,"phandle-list" ,"#phandle-cells" ); -unittest (rc ==8 ,"of_count_phandle_with_args() returned %i, expected 7\n" , rc); +unittest (rc ==8 ,"of_count_phandle_with_args() returned %i, expected 8\n" , rc);for (i =0 ; i <9 ; i++) {bool passed = true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 248/417 selftests/bpf: Add assert for user stacks in test_task_stack
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jordan Rome <[email protected]>
commit 727a92d62fd6a382b4c5972008e45667e707b0e4 upstream.
This is a follow up to:
commit b8e3a87a627b ("bpf: Add crosstask check to __bpf_get_stack").
This test ensures that the task iterator only gets a single user stack (for the current task).
--- tools/testing/selftests/bpf/prog_tests/bpf_iter.c | 2 ++ tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c | 5 +++++ 2 files changed, 7 insertions(+)
tools/testing/selftests/bpf/prog_tests/bpf_iter.c +2 -0
@@ -338,6 +338,8 @@ static void test_task_stack(void)do_dummy_read (skel->progs.dump_task_stack);do_dummy_read (skel->progs.get_task_user_stacks); +ASSERT_EQ (skel->bss->num_user_stacks,1 ,"num_user_stacks" ); +bpf_iter_task_stack__destroy (skel); }
tools/testing/selftests/bpf/progs/bpf_iter_task_stack.c +5 -0
@@ -35,6 +35,8 @@ int dump_task_stack(struct bpf_iter__tasreturn 0 ; } +int num_user_stacks =0 ; + SEC("iter/task")int get_task_user_stacks (struct bpf_iter__task *ctx) {
@@ -51,6 +53,9 @@ int get_task_user_stacks(struct bpf_iterif (res <=0 )return 0 ; +/* Only one task, the current one, should succeed */ + ++num_user_stacks; + buf_sz += res;/* If the verifier doesn't refine bpf_get_task_stack res, and instead
Greg Kroah-Hartman
maintainerPATCH 249/417 keys, dns: Fix size check of V1 server-list header
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
commit acc657692aed438e9931438f8c923b2b107aebf9 upstream.
Fix the size check added to dns_resolver_preparse() for the V1 server-list header so that it doesn't give EINVAL if the size supplied is the same as the size of the header struct (which should be valid).
This can be tested with:
echo -n -e '\0\0\01\xff\0\0' | keyctl padd dns_resolver desc @p
which will give "add_key: Invalid argument" without this fix.
--- net/dns_resolver/dns_key.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/dns_resolver/dns_key.c +1 -1
@@ -104,7 +104,7 @@ dns_resolver_preparse(struct key_preparsconst struct dns_server_list_v1_header *v1;/* It may be a server list. */ -if (datalen <=sizeof (*v1)) +if (datalen <sizeof (*v1))return -EINVAL ; v1 = (const struct dns_server_list_v1_header *)data;
Greg Kroah-Hartman
maintainerPATCH 250/417 binder: fix async space check for 0-sized buffers
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carlos Llamas <[email protected]>
commit 3091c21d3e9322428691ce0b7a0cfa9c0b239eeb upstream.
Move the padding of 0-sized buffers to an earlier stage to account for this round up during the alloc->free_async_space check.
--- drivers/android/binder_alloc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/android/binder_alloc.c +4 -3
@@ -407,6 +407,10 @@ static struct binder_buffer *binder_allo alloc->pid, extra_buffers_size);return ERR_PTR (-EINVAL ); } + +/* Pad 0-size buffers so they get assigned unique addresses */ + size =max (size,sizeof (void *)); +if (is_async && alloc->free_async_space < size +sizeof (struct binder_buffer )) { binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
@@ -415,9 +419,6 @@ static struct binder_buffer *binder_alloreturn ERR_PTR (-ENOSPC ); } -/* Pad 0-size buffers so they get assigned unique addresses */ - size =max (size,sizeof (void *)); -while (n) { buffer = rb_entry(n, struct binder_buffer, rb_node);BUG_ON (!buffer->free);
Greg Kroah-Hartman
maintainerPATCH 251/417 binder: fix unused alloc->free_async_space
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carlos Llamas <[email protected]>
commit c6d05e0762ab276102246d24affd1e116a46aa0c upstream.
Each transaction is associated with a 'struct binder_buffer' that stores the metadata about its buffer area. Since commit 74310e06be4d ("android:
binder: Move buffer out of area shared with user space") this struct is no longer embedded within the buffer itself but is instead allocated on the heap to prevent userspace access to this driver-exclusive info.
Unfortunately, the space of this struct is still being accounted for in the total buffer size calculation, specifically for async transactions. This results in an additional 104 bytes added to every async buffer request, and this area is never used.
This wasted space can be substantial. If we consider the maximum mmap buffer space of SZ_4M, the driver will reserve half of it for async transactions, or 0x200000. This area should, in theory, accommodate up to 262,144 buffers of the minimum 8-byte size. However, after adding the extra 'sizeof(struct binder_buffer)', the total number of buffers drops to only 18,724, which is a sad 7.14% of the actual capacity.
This patch fixes the buffer size calculation to enable the utilization of the entire async buffer space. This is expected to reduce the number of -ENOSPC errors that are seen on the field.
--- drivers/android/binder_alloc.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/android/binder_alloc.c +4 -7
@@ -344,8 +344,7 @@ static bool debug_low_async_space_lockedcontinue ;if (!buffer->async_transaction)continue ; - total_alloc_size +=binder_alloc_buffer_size (alloc, buffer) - +sizeof (struct binder_buffer ); + total_alloc_size +=binder_alloc_buffer_size (alloc, buffer); num_buffers++; }
@@ -411,8 +410,7 @@ static struct binder_buffer *binder_allo/* Pad 0-size buffers so they get assigned unique addresses */ size =max (size,sizeof (void *)); -if (is_async && - alloc->free_async_space < size +sizeof (struct binder_buffer )) { +if (is_async && alloc->free_async_space < size) {binder_alloc_debug (BINDER_DEBUG_BUFFER_ALLOC ,"%d: binder_alloc_buf size %zd failed, no async space left\n" , alloc->pid, size);
@@ -520,7 +518,7 @@ static struct binder_buffer *binder_allo buffer->pid = pid; buffer->oneway_spam_suspect = false;if (is_async) { - alloc->free_async_space -= size +sizeof (struct binder_buffer ); + alloc->free_async_space -= size;binder_alloc_debug (BINDER_DEBUG_BUFFER_ALLOC_ASYNC ,"%d: binder_alloc_buf size %zd async free %zd\n" , alloc->pid, size, alloc->free_async_space);
@@ -658,8 +656,7 @@ static void binder_free_buf_locked(strucBUG_ON (buffer->user_data > alloc->buffer + alloc->buffer_size);if (buffer->async_transaction) { - alloc->free_async_space += buffer_size +sizeof (struct binder_buffer ); - + alloc->free_async_space += buffer_size;binder_alloc_debug (BINDER_DEBUG_BUFFER_ALLOC_ASYNC ,"%d: binder_free_buf size %zd async free %zd\n" , alloc->pid, size, alloc->free_async_space);
Greg Kroah-Hartman
maintainerPATCH 252/417 mips/smp: Call rcutree_report_cpu_starting() earlier
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wiehler <[email protected]>
commit 55702ec9603ebeffb15e6f7b113623fe1d8872f4 upstream.
rcutree_report_cpu_starting() must be called before clockevents_register_device() to avoid the following lockdep splat triggered by calling list_add() when CONFIG_PROVE_RCU_LIST=y:
WARNING: suspicious RCU usage
...
-----------------------------
kernel/locking/lockdep.c:3680 RCU-list traversed in non-reader section!!
other info that might help us debug this:
RCU used illegally from offline CPU!
rcu_scheduler_active = 1, debug_locks = 1
no locks held by swapper/1/0.
...
Call Trace: [<ffffffff8012a434>] show_stack+0x64/0x158 [<ffffffff80a93d98>] dump_stack_lvl+0x90/0xc4 [<ffffffff801c9e9c>] __lock_acquire+0x1404/0x2940 [<ffffffff801cbf3c>] lock_acquire+0x14c/0x448 [<ffffffff80aa4260>] _raw_spin_lock_irqsave+0x50/0x88 [<ffffffff8021e0c8>] clockevents_register_device+0x60/0x1e8 [<ffffffff80130ff0>] r4k_clockevent_init+0x220/0x3a0 [<ffffffff801339d0>] start_secondary+0x50/0x3b8
raw_smp_processor_id() is required in order to avoid calling into lockdep before RCU has declared the CPU to be watched for readers.
See also commit 29368e093921 ("x86/smpboot: Move rcu_cpu_starting() earlier"), commit de5d9dae150c ("s390/smp: move rcu_cpu_starting() earlier") and commit 99f070b62322 ("powerpc/smp: Call rcu_cpu_starting() earlier").
--- arch/mips/kernel/smp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/mips/kernel/smp.c +2 -2
@@ -333,10 +333,11 @@ early_initcall(mips_smp_ipi_init);*/ asmlinkage void start_secondary(void) { -unsigned int cpu; +unsigned int cpu =raw_smp_processor_id ();cpu_probe ();per_cpu_trap_init (false); +rcu_cpu_starting (cpu);mips_clockevent_init (); mp_ops->init_secondary ();cpu_report ();
@@ -348,7 +349,6 @@ asmlinkage void start_secondary(void)*/ calibrate_delay (); - cpu =smp_processor_id (); cpu_data[cpu].udelay_val = loops_per_jiffy;set_cpu_sibling_map (cpu);
Greg Kroah-Hartman
maintainerPATCH 253/417 Input: atkbd - use ab83 as id when skipping the getid command
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 58f65f9db7e0de366a5a115c2e2c0703858bba69 upstream.
Barnabás reported that the change to skip the getid command when the controller is in translated mode on laptops caused the Version field of his "AT Translated Set 2 keyboard" input device to change from ab83 to abba, breaking a custom hwdb entry for this keyboard.
Use the standard ab83 id for keyboards when getid is skipped (rather then that getid fails) to avoid reporting a different Version to userspace then before skipping the getid.
--- drivers/input/keyboard/atkbd.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/input/keyboard/atkbd.c +7 -5
@@ -772,9 +772,9 @@ static bool atkbd_is_portable_device(voi* not work. So in this case simply assume a keyboard is connected to avoid * confusing some laptop keyboards. * -* Skipping ATKBD_CMD_GETID ends up using a fake keyboard id. Using a fake id is -* ok in translated mode, only atkbd_select_set() checks atkbd->id and in -* translated mode that is a no-op. +* Skipping ATKBD_CMD_GETID ends up using a fake keyboard id. Using the standard +* 0xab83 id is ok in translated mode, only atkbd_select_set() checks atkbd->id +* and in translated mode that is a no-op. */ static bool atkbd_skip_getid (struct atkbd *atkbd) {
@@ -792,6 +792,7 @@ static int atkbd_probe(struct atkbd *atk {struct ps2dev *ps2dev = &atkbd->ps2dev;unsigned char param[2 ]; +bool skip_getid;/* * Some systems, where the bit-twiddling when testing the io-lines of the
@@ -813,7 +814,8 @@ static int atkbd_probe(struct atkbd *atk*/ param[0 ] = param[1 ] =0xa5 ;/* initialize with invalid values */ -if (atkbd_skip_getid (atkbd) ||ps2_command (ps2dev, param,ATKBD_CMD_GETID )) { + skip_getid =atkbd_skip_getid (atkbd); +if (skip_getid ||ps2_command (ps2dev, param,ATKBD_CMD_GETID )) {/* * If the get ID command was skipped or failed, we check if we can at least set
@@ -823,7 +825,7 @@ static int atkbd_probe(struct atkbd *atk param[0 ] =0 ;if (ps2_command (ps2dev, param,ATKBD_CMD_SETLEDS ))return -1 ; - atkbd->id =0xabba ; + atkbd->id = skip_getid ?0xab83 :0xabba ;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 254/417 xen-netback: dont produce zero-size SKB frags
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Beulich <[email protected]>
commit c7ec4f2d684e17d69bbdd7c4324db0ef5daac26a upstream.
While frontends may submit zero-size requests (wasting a precious slot), core networking code as of at least 3ece782693c4b ("sock: skb_copy_ubufs support for compound pages") can't deal with SKBs when they have all zero-size fragments. Respond to empty requests right when populating fragments; all further processing is fragment based and hence won't encounter these empty requests anymore.
In a way this should have been that way from the beginning: When no data is to be transferred for a particular request, there's not even a point in validating the respective grant ref. That's no different from e.g. passing NULL into memcpy() when at the same time the size is 0.
This is XSA-448 / CVE-2023-46838.
--- drivers/net/xen-netback/netback.c | 44 ++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-)
drivers/net/xen-netback/netback.c +38 -6
@@ -463,12 +463,25 @@ static void xenvif_get_requests(struct x }for (shinfo->nr_frags =0 ; nr_slots >0 && shinfo->nr_frags <MAX_SKB_FRAGS ; - shinfo->nr_frags++, gop++, nr_slots--) { + nr_slots--) { +if (unlikely (!txp->size)) { +unsigned long flags; + +spin_lock_irqsave (&queue->response_lock, flags); +make_tx_response (queue, txp,0 ,XEN_NETIF_RSP_OKAY ); +push_tx_responses (queue); +spin_unlock_irqrestore (&queue->response_lock, flags); + ++txp; +continue ; + } + index =pending_index (queue->pending_cons++); pending_idx = queue->pending_ring[index];xenvif_tx_create_map_op (queue, pending_idx, txp, txp == first ? extra_count :0 , gop);frag_set_pending_idx (&frags[shinfo->nr_frags], pending_idx); + ++shinfo->nr_frags; + ++gop;if (txp == first) txp = txfrags;
@@ -481,20 +494,39 @@ static void xenvif_get_requests(struct x shinfo =skb_shinfo (nskb); frags = shinfo->frags; -for (shinfo->nr_frags =0 ; shinfo->nr_frags < nr_slots; - shinfo->nr_frags++, txp++, gop++) { +for (shinfo->nr_frags =0 ; shinfo->nr_frags < nr_slots; ++txp) { +if (unlikely (!txp->size)) { +unsigned long flags; + +spin_lock_irqsave (&queue->response_lock, flags); +make_tx_response (queue, txp,0 , +XEN_NETIF_RSP_OKAY ); +push_tx_responses (queue); +spin_unlock_irqrestore (&queue->response_lock, + flags); +continue ; + } + index =pending_index (queue->pending_cons++); pending_idx = queue->pending_ring[index];xenvif_tx_create_map_op (queue, pending_idx, txp,0 , gop);frag_set_pending_idx (&frags[shinfo->nr_frags], pending_idx); + ++shinfo->nr_frags; + ++gop; } -skb_shinfo (skb)->frag_list = nskb; - }else if (nskb) { +if (shinfo->nr_frags) { +skb_shinfo (skb)->frag_list = nskb; + nskb =NULL ; + } + } + +if (nskb) {/* A frag_list skb was allocated but it is no longer needed -* because enough slots were converted to copy ops above. +* because enough slots were converted to copy ops above or some +* were empty. */ kfree_skb (nskb); }
Greg Kroah-Hartman
maintainerPATCH 255/417 binder: fix race between mmput() and do_exit()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carlos Llamas <[email protected]>
commit 9a9ab0d963621d9d12199df9817e66982582d5a5 upstream.
Task A calls binder_update_page_range() to allocate and insert pages on a remote address space from Task B. For this, Task A pins the remote mm via mmget_not_zero() first. This can race with Task B do_exit() and the final mmput() refcount decrement will come from Task A.
Task A | Task B
------------------+------------------
mmget_not_zero() |
| do_exit()
| exit_mm()
| mmput()
mmput() |
exit_mmap() |
remove_vma() |
fput() |In this case, the work of ____fput() from Task B is queued up in Task A as TWA_RESUME. So in theory, Task A returns to userspace and the cleanup work gets executed. However, Task A instead sleep, waiting for a reply from Task B that never comes (it's dead).
This means the binder_deferred_release() is blocked until an unrelated binder event forces Task A to go back to userspace. All the associated death notifications will also be delayed until then.
In order to fix this use mmput_async() that will schedule the work in the corresponding mm->async_put_work WQ instead of Task A.
--- drivers/android/binder_alloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/android/binder_alloc.c +2 -2
@@ -271,7 +271,7 @@ static int binder_update_page_range(stru }if (mm) {mmap_write_unlock (mm); -mmput (mm); +mmput_async (mm); }return 0 ;
@@ -304,7 +304,7 @@ err_page_ptr_cleared: err_no_vma:if (mm) {mmap_write_unlock (mm); -mmput (mm); +mmput_async (mm); }return vma ? -ENOMEM : -ESRCH ; }
Greg Kroah-Hartman
maintainerPATCH 256/417 clocksource/drivers/timer-ti-dm: Fix make W=n kerneldoc warnings
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
commit b99a212a7697c542b460adaa15d4a98abf8223f0 upstream.
Kernel test robot reports of kerneldoc related warnings that happen with make W=n for "parameter or member not described".
These were caused by changes to function parameter names with earlier commits where the kerneldoc parts were not updated.
--- drivers/clocksource/timer-ti-dm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clocksource/timer-ti-dm.c +2 -2
@@ -184,7 +184,7 @@ static inline u32 dmtimer_read(struct dm* dmtimer_write - write timer registers in posted and non-posted mode * @timer: timer pointer over which write operation is to perform * @reg: lowest byte holds the register offset -* @value: data to write into the register +* @val: data to write into the register * * The posted mode bit is encoded in reg. Note that in posted mode, the write * pending bit must be checked. Otherwise a write on a register which has a
@@ -937,7 +937,7 @@ static int omap_dm_timer_set_int_enable(/** * omap_dm_timer_set_int_disable - disable timer interrupts -* @timer: pointer to timer handle +* @cookie: pointer to timer cookie * @mask: bit mask of interrupts to be disabled * * Disables the specified timer interrupts for a timer.
Greg Kroah-Hartman
maintainerPATCH 257/417 powerpc/64s: Increase default stack size to 32KB
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
commit 18f14afe281648e31ed35c9ad2fcb724c4838ad9 upstream.
There are reports of kernels crashing due to stack overflow while running OpenShift (Kubernetes). The primary contributor to the stack usage seems to be openvswitch, which is used by OVN-Kubernetes (based on OVN (Open Virtual Network)), but NFS also contributes in some stack traces.
There may be some opportunities to reduce stack usage in the openvswitch code, but doing so potentially require tradeoffs vs performance, and also requires testing across architectures.
Looking at stack usage across the kernel (using -fstack-usage), shows that ppc64le stack frames are on average 50-100% larger than the equivalent function built for x86-64. Which is not surprising given the minimum stack frame size is 32 bytes on ppc64le vs 16 bytes on x86-64.
So increase the default stack size to 32KB for the modern 64-bit Book3S platforms, ie. pseries (virtualised) and powernv (bare metal). That leaves the older systems like G5s, and the AmigaOne (pasemi) with a 16KB stack which should be sufficient on those machines.
--- arch/powerpc/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/Kconfig +1 -0
@@ -806,6 +806,7 @@ config THREAD_SHIFT int "Thread shift" if EXPERT range 13 15 default "15" if PPC_256K_PAGES + default "15" if PPC_PSERIES || PPC_POWERNV default "14" if PPC64 default "13" help
Greg Kroah-Hartman
maintainerPATCH 258/417 tick-sched: Fix idle and iowait sleeptime accounting vs CPU hotplug
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit 71fee48fb772ac4f6cfa63dbebc5629de8b4cc09 upstream.
When offlining and onlining CPUs the overall reported idle and iowait times as reported by /proc/stat jump backward and forward:
cpu 132 0 176 225249 47 6 6 21 0 0
cpu0 80 0 115 112575 33 3 4 18 0 0
cpu1 52 0 60 112673 13 3 1 2 0 0
cpu 133 0 177 226681 47 6 6 21 0 0
cpu0 80 0 116 113387 33 3 4 18 0 0
cpu 133 0 178 114431 33 6 6 21 0 0 <---- jump backward cpu0 80 0 116 114247 33 3 4 18 0 0
cpu1 52 0 61 183 0 3 1 2 0 0 <---- idle + iowait start with 0
cpu 133 0 178 228956 47 6 6 21 0 0 <---- jump forward cpu0 81 0 117 114929 33 3 4 18 0 0
Reason for this is that get_idle_time() in fs/proc/stat.c has different sources for both values depending on if a CPU is online or offline:
- if a CPU is online the values may be taken from its per cpu tick_cpu_sched structure
- if a CPU is offline the values are taken from its per cpu cpustat structure
The problem is that the per cpu tick_cpu_sched structure is set to zero on CPU offline. See tick_cancel_sched_timer() in kernel/time/tick-sched.c.
Therefore when a CPU is brought offline and online afterwards both its idle and iowait sleeptime will be zero, causing a jump backward in total system idle and iowait sleeptime. In a similar way if a CPU is then brought offline again the total idle and iowait sleeptimes will jump forward.
It looks like this behavior was introduced with commit 4b0c0f294f60 ("tick: Cleanup NOHZ per cpu data on cpu down").
This was only noticed now on s390, since we switched to generic idle time reporting with commit be76ea614460 ("s390/idle: remove arch_cpu_idle_time() and corresponding code").
Fix this by preserving the values of idle_sleeptime and iowait_sleeptime members of the per-cpu tick_sched structure on CPU hotplug.
--- kernel/time/tick-sched.c | 5 +++++ 1 file changed, 5 insertions(+)
kernel/time/tick-sched.c +5 -0
@@ -1556,13 +1556,18 @@ void tick_setup_sched_timer(void)void tick_cancel_sched_timer (int cpu) {struct tick_sched *ts = &per_cpu (tick_cpu_sched, cpu); +ktime_t idle_sleeptime, iowait_sleeptime;# ifdef CONFIG_HIGH_RES_TIMERS if (ts->sched_timer.base)hrtimer_cancel (&ts->sched_timer);# endif + idle_sleeptime = ts->idle_sleeptime; + iowait_sleeptime = ts->iowait_sleeptime;memset (ts,0 ,sizeof (*ts)); + ts->idle_sleeptime = idle_sleeptime; + ts->iowait_sleeptime = iowait_sleeptime; }#endif
Greg Kroah-Hartman
maintainerPATCH 259/417 usb: phy: mxs: remove CONFIG_USB_OTG condition for mxs_phy_is_otg_host()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Yang <[email protected]>
commit ff2b89de471da942a4d853443688113a44fd35ed upstream.
When CONFIG_USB_OTG is not set, mxs_phy_is_otg_host() will always return false. This behaviour is wrong. Since phy.last_event will always be set for either host or device mode. Therefore, CONFIG_USB_OTG condition can be removed.
--- drivers/usb/phy/phy-mxs-usb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/phy/phy-mxs-usb.c +1 -2
@@ -388,8 +388,7 @@ static void __mxs_phy_disconnect_line(ststatic bool mxs_phy_is_otg_host (struct mxs_phy *mxs_phy) { -return IS_ENABLED (CONFIG_USB_OTG ) && - mxs_phy->phy.last_event ==USB_EVENT_ID ; +return mxs_phy->phy.last_event ==USB_EVENT_ID ; }static void mxs_phy_disconnect_line (struct mxs_phy *mxs_phy,bool on)
Greg Kroah-Hartman
maintainerPATCH 260/417 usb: dwc: ep0: Update request status in dwc3_ep0_stall_restart
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uttkarsh Aggarwal <[email protected]>
commit e9d40b215e38480fd94c66b06d79045717a59e9c upstream.
Current implementation blocks the running operations when Plug-out and Plug-In is performed continuously, process gets stuck in dwc3_thread_interrupt().
Code Flow:
CPU1 ->Gadget_start ->dwc3_interrupt ->dwc3_thread_interrupt ->dwc3_process_event_buf ->dwc3_process_event_entry ->dwc3_endpoint_interrupt ->dwc3_ep0_interrupt ->dwc3_ep0_inspect_setup ->dwc3_ep0_stall_and_restart
By this time if pending_list is not empty, it will get the next request on the given list and calls dwc3_gadget_giveback which will unmap request and call its complete() callback to notify upper layers that it has completed. Currently dwc3_gadget_giveback status is set to -ECONNRESET, whereas it should be -ESHUTDOWN based on condition if not dwc->connected is true.
--- drivers/usb/dwc3/ep0.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/usb/dwc3/ep0.c +4 -1
@@ -236,7 +236,10 @@ void dwc3_ep0_stall_and_restart(struct dstruct dwc3_request *req; req =next_request (&dep->pending_list); -dwc3_gadget_giveback (dep, req, -ECONNRESET ); +if (!dwc->connected) +dwc3_gadget_giveback (dep, req, -ESHUTDOWN ); +else +dwc3_gadget_giveback (dep, req, -ECONNRESET ); } dwc->eps[0 ]->trb_enqueue =0 ;
Greg Kroah-Hartman
maintainerPATCH 261/417 Revert "usb: dwc3: Soft reset phy on probe for host"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thinh Nguyen <[email protected]>
commit 7059fbebcb00554c3f31e5b5d93ef6d2d96dc7b4 upstream.
This reverts commit 8bea147dfdf823eaa8d3baeccc7aeb041b41944b.
The phy soft reset GUSB2PHYCFG.PHYSOFTRST only applies to UTMI phy, not ULPI. This fix is incomplete.
--- drivers/usb/dwc3/core.c | 39 +-------------------------------------- 1 file changed, 1 insertion(+), 38 deletions(-)
drivers/usb/dwc3/core.c +1 -38
@@ -279,46 +279,9 @@ int dwc3_core_soft_reset(struct dwc3 *dw* XHCI driver will reset the host block. If dwc3 was configured for * host-only mode or current role is host, then we can return early. */ -if (dwc->current_dr_role ==DWC3_GCTL_PRTCAP_HOST ) +if (dwc->dr_mode ==USB_DR_MODE_HOST || dwc->current_dr_role ==DWC3_GCTL_PRTCAP_HOST )return 0 ; -/* -* If the dr_mode is host and the dwc->current_dr_role is not the -* corresponding DWC3_GCTL_PRTCAP_HOST, then the dwc3_core_init_mode -* isn't executed yet. Ensure the phy is ready before the controller -* updates the GCTL.PRTCAPDIR or other settings by soft-resetting -* the phy. -* -* Note: GUSB3PIPECTL[n] and GUSB2PHYCFG[n] are port settings where n -* is port index. If this is a multiport host, then we need to reset -* all active ports. -*/ -if (dwc->dr_mode ==USB_DR_MODE_HOST ) { -u32 usb3_port; -u32 usb2_port; - - usb3_port =dwc3_readl (dwc->regs,DWC3_GUSB3PIPECTL (0 )); - usb3_port |=DWC3_GUSB3PIPECTL_PHYSOFTRST ; -dwc3_writel (dwc->regs,DWC3_GUSB3PIPECTL (0 ), usb3_port); - - usb2_port =dwc3_readl (dwc->regs,DWC3_GUSB2PHYCFG (0 )); - usb2_port |=DWC3_GUSB2PHYCFG_PHYSOFTRST ; -dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (0 ), usb2_port); - -/* Small delay for phy reset assertion */ -usleep_range (1000 ,2000 ); - - usb3_port &= ~DWC3_GUSB3PIPECTL_PHYSOFTRST ; -dwc3_writel (dwc->regs,DWC3_GUSB3PIPECTL (0 ), usb3_port); - - usb2_port &= ~DWC3_GUSB2PHYCFG_PHYSOFTRST ; -dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (0 ), usb2_port); - -/* Wait for clock synchronization */ -msleep (50 ); -return 0 ; - } - reg =dwc3_readl (dwc->regs,DWC3_DCTL ); reg |=DWC3_DCTL_CSFTRST ; reg &= ~DWC3_DCTL_RUN_STOP ;
Greg Kroah-Hartman
maintainerPATCH 262/417 Revert "usb: dwc3: dont reset device side if dwc3 was configured as host-only"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thinh Nguyen <[email protected]>
commit afe28cd686aeb77e8d9140d50fb1cf06a7ecb731 upstream.
This reverts commit e835c0a4e23c38531dcee5ef77e8d1cf462658c7.
Don't omit soft-reset. During initialization, the driver may need to perform a soft reset to ensure the phy is ready when the controller updates the GCTL.PRTCAPDIR or other settings by issuing phy soft-reset. Many platforms often have access to DCTL register for soft-reset despite being host-only. If there are actual reported issues from the platforms that don't expose DCTL registers, then we will need to revisit (perhaps to teach dwc3 to perform xhci's soft-reset USBCMD.HCRST).
--- drivers/usb/dwc3/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/dwc3/core.c +2 -2
@@ -277,9 +277,9 @@ int dwc3_core_soft_reset(struct dwc3 *dw/* * We're resetting only the device side because, if we're in host mode, * XHCI driver will reset the host block. If dwc3 was configured for -* host-only mode or current role is host, then we can return early. +* host-only mode, then we can return early. */ -if (dwc->dr_mode ==USB_DR_MODE_HOST || dwc->current_dr_role ==DWC3_GCTL_PRTCAP_HOST ) +if (dwc->current_dr_role ==DWC3_GCTL_PRTCAP_HOST )return 0 ; reg =dwc3_readl (dwc->regs,DWC3_DCTL );
Greg Kroah-Hartman
maintainerPATCH 263/417 usb: chipidea: wait controller resume finished for wakeup irq
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Yang <[email protected]>
commit 128d849074d05545becf86e713715ce7676fc074 upstream.
After the chipidea driver introduce extcon for id and vbus, it's able to wakeup from another irq source, in case the system with extcon ID cable, wakeup from usb ID cable and device removal, the usb device disconnect irq may come firstly before the extcon notifier while system resume, so we will get 2 "wakeup" irq, one for usb device disconnect; and one for extcon ID cable change(real wakeup event), current driver treat them as 2 successive wakeup irq so can't handle it correctly, then finally the usb irq can't be enabled. This patch adds a check to bypass further usb events before controller resume finished to fix it.
--- drivers/usb/chipidea/core.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/usb/chipidea/core.c +7 -0
@@ -523,6 +523,13 @@ static irqreturn_t ci_irq_handler(int iru32 otgsc =0 ;if (ci->in_lpm) { +/* +* If we already have a wakeup irq pending there, +* let's just return to wait resume finished firstly. +*/ +if (ci->wakeup_int) +return IRQ_HANDLED ; +disable_irq_nosync (irq); ci->wakeup_int = true;pm_runtime_get (ci->dev);
Greg Kroah-Hartman
maintainerPATCH 264/417 usb: cdns3: fix uvc failure work since sg support enabled
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
commit 1b8be5ecff26201bafb0a554c74e91571299fb94 upstream.
When IP version >= DEV_VER_V2, gadget:sg_supported is true. So uvc gadget function driver will use sg to equeue data, first is 8bytes header, the second is 1016bytes data.
cdns3_prepare_trb: ep2in: trb 0000000000ac755f, dma buf: 0xbf455000, size: 8, burst: 128 ctrl: 0x00000415 (C=1, T=0, ISP, CHAIN, Normal)
cdns3_prepare_trb: ep2in: trb 00000000a574e693, dma buf: 0xc0200fe0, size: 1016, burst: 128 ctrl: 0x00000405 (C=1, T=0, ISP, Normal)But cdns3_ep_run_transfer() can't correctly handle this case, which only support one TRB for ISO transfer.
The controller requires duplicate the TD for each SOF if priv_ep->interval is not 1. DMA will read data from DDR to internal FIFO when get SOF. Send data to bus when receive IN token. DMA always refill FIFO when get SOF regardless host send IN token or not. If host send IN token later, some frames data will be lost.
Fixed it by below major steps:
1. Calculate numembers of TRB base on sg_nums and priv_ep->interval.
2. Remove CHAIN flags for each end TRB of TD when duplicate TD.
3. The controller requires LINK TRB must be first TRB of TD. When check there are not enough TRBs lefts, just fill LINK TRB for left TRBs.
.... CHAIN_TRB DATA_TRB, CHAIN_TRB DATA_TRB, LINK_TRB ... LINK_TRB
^End of TRB List
--- drivers/usb/cdns3/cdns3-gadget.c | 51 ++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 11 deletions(-)
drivers/usb/cdns3/cdns3-gadget.c +40 -11
@@ -1117,6 +1117,7 @@ static int cdns3_ep_run_transfer(structdma_addr_t trb_dma;u32 togle_pcs =1 ;int sg_iter =0 ; +int num_trb_req;int num_trb;int address;u32 control;
@@ -1125,15 +1126,13 @@ static int cdns3_ep_run_transfer(structstruct scatterlist *s =NULL ;bool sg_supported = !!(request->num_mapped_sgs); + num_trb_req = sg_supported ? request->num_mapped_sgs :1 ; + +/* ISO transfer require each SOF have a TD, each TD include some TRBs */ if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC ) - num_trb = priv_ep->interval; + num_trb = priv_ep->interval * num_trb_req;else - num_trb = sg_supported ? request->num_mapped_sgs :1 ; - -if (num_trb > priv_ep->free_trbs) { - priv_ep->flags |=EP_RING_FULL ; -return -ENOBUFS ; - } + num_trb = num_trb_req; priv_req =to_cdns3_request (request); address = priv_ep->endpoint.desc->bEndpointAddress;
@@ -1182,14 +1181,31 @@ static int cdns3_ep_run_transfer(struct link_trb->control =cpu_to_le32 (((priv_ep->pcs) ?TRB_CYCLE :0 ) |TRB_TYPE (TRB_LINK ) |TRB_TOGGLE | ch_bit); + +if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC ) { +/* +* ISO require LINK TRB must be first one of TD. +* Fill LINK TRBs for left trb space to simply software process logic. +*/ +while (priv_ep->enqueue) { + *trb = *link_trb; +trace_cdns3_prepare_trb (priv_ep, trb); + +cdns3_ep_inc_enq (priv_ep); + trb = priv_ep->trb_pool + priv_ep->enqueue; + priv_req->trb = trb; + } + } + } + +if (num_trb > priv_ep->free_trbs) { + priv_ep->flags |=EP_RING_FULL ; +return -ENOBUFS ; }if (priv_dev->dev_ver <=DEV_VER_V2 ) togle_pcs =cdns3_wa1_update_guard (priv_ep, trb); -if (sg_supported) - s = request->sg; -/* set incorrect Cycle Bit for first trb*/ control = priv_ep->pcs ?0 :TRB_CYCLE ; trb->length =0 ;
@@ -1207,6 +1223,9 @@ static int cdns3_ep_run_transfer(struct do { u32 length; + if (!(sg_iter % num_trb_req) && sg_supported) + s = request->sg; + /* fill TRB */ control |= TRB_TYPE(TRB_NORMAL); if (sg_supported) {
@@ -1248,7 +1267,7 @@ static int cdns3_ep_run_transfer(structif (sg_supported) { trb->control |=cpu_to_le32 (TRB_ISP );/* Don't set chain bit for last TRB */ -if (sg_iter < num_trb -1 ) +if ((sg_iter % num_trb_req) < num_trb_req -1 ) trb->control |=cpu_to_le32 (TRB_CHAIN ); s =sg_next (s);
@@ -1506,6 +1525,12 @@ static void cdns3_transfer_completed(str/* The TRB was changed as link TRB, and the request was handled at ep_dequeue */ while (TRB_FIELD_TO_TYPE (le32_to_cpu (trb->control)) ==TRB_LINK ) { + +/* ISO ep_traddr may stop at LINK TRB */ +if (priv_ep->dequeue ==cdns3_get_dma_pos (priv_dev, priv_ep) && + priv_ep->type ==USB_ENDPOINT_XFER_ISOC ) +break ; +trace_cdns3_complete_trb (priv_ep, trb);cdns3_ep_inc_deq (priv_ep); trb = priv_ep->trb_pool + priv_ep->dequeue;
@@ -1538,6 +1563,10 @@ static void cdns3_transfer_completed(str }if (request_handled) { +/* TRBs are duplicated by priv_ep->interval time for ISO IN */ +if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC && priv_ep->dir) + request->actual /= priv_ep->interval; +cdns3_gadget_giveback (priv_ep, priv_req,0 ); request_handled = false; transfer_end = false;
Greg Kroah-Hartman
maintainerPATCH 265/417 usb: cdns3: fix iso transfer error when mult is not zero
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
commit 92f02efa1d86d7dcaef7f38a5fe3396c4e88a93c upstream.
ISO basic transfer is
ITP(SOF) Package_0 Package_1 ... Package_n
CDNS3 DMA start dma transfer from memmory to internal FIFO when get SOF, controller will transfer data to usb bus from internal FIFO when get IN token.
According USB spec defination:
Maximum number of packets = (bMaxBurst + 1) * (Mult + 1)
Internal memory should be the same as (bMaxBurst + 1) * (Mult + 1). DMA don't fetch data advance when ISO transfer, so only reserve (bMaxBurst + 1) * (Mult + 1) internal memory for ISO transfer.
Need save Mult and bMaxBurst information and set it into EP_CFG register, otherwise only 1 package is sent by controller, other package will be lost.
--- drivers/usb/cdns3/cdns3-gadget.c | 59 +++++++++++++++++++++++---------------- drivers/usb/cdns3/cdns3-gadget.h | 3 + 2 files changed, 39 insertions(+), 23 deletions(-)
drivers/usb/cdns3/cdns3-gadget.c +36 -23
@@ -2062,11 +2062,10 @@ int cdns3_ep_config(struct cdns3_endpoinbool is_iso_ep = (priv_ep->type ==USB_ENDPOINT_XFER_ISOC );struct cdns3_device *priv_dev = priv_ep->cdns3_dev;u32 bEndpointAddress = priv_ep->num | priv_ep->dir; -u32 max_packet_size =0 ; -u8 maxburst =0 ; +u32 max_packet_size = priv_ep->wMaxPacketSize; +u8 maxburst = priv_ep->bMaxBurst;u32 ep_cfg =0 ;u8 buffering; -u8 mult =0 ;int ret; buffering = priv_dev->ep_buf_size -1 ;
@@ -2088,8 +2087,7 @@ int cdns3_ep_config(struct cdns3_endpoinbreak ;default : ep_cfg =EP_CFG_EPTYPE (USB_ENDPOINT_XFER_ISOC ); - mult = priv_dev->ep_iso_burst -1 ; - buffering = mult +1 ; + buffering = (priv_ep->bMaxBurst +1 ) * (priv_ep->mult +1 ) -1 ; }switch (priv_dev->gadget.speed) {
@@ -2100,17 +2098,8 @@ int cdns3_ep_config(struct cdns3_endpoin max_packet_size = is_iso_ep ?1024 :512 ;break ;case USB_SPEED_SUPER : -/* It's limitation that driver assumes in driver. */ - mult =0 ; - max_packet_size =1024 ; -if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC ) { - maxburst = priv_dev->ep_iso_burst -1 ; - buffering = (mult +1 ) * - (maxburst +1 ); - -if (priv_ep->interval >1 ) - buffering++; - }else { +if (priv_ep->type !=USB_ENDPOINT_XFER_ISOC ) { + max_packet_size =1024 ; maxburst = priv_dev->ep_buf_size -1 ; }break ;
@@ -2139,7 +2128,6 @@ int cdns3_ep_config(struct cdns3_endpoinif (priv_dev->dev_ver <DEV_VER_V2 ) priv_ep->trb_burst_size =16 ; - mult =min_t (u8, mult,EP_CFG_MULT_MAX ); buffering =min_t (u8, buffering,EP_CFG_BUFFERING_MAX ); maxburst =min_t (u8, maxburst,EP_CFG_MAXBURST_MAX );
@@ -2173,7 +2161,7 @@ int cdns3_ep_config(struct cdns3_endpoin } ep_cfg |=EP_CFG_MAXPKTSIZE (max_packet_size) | -EP_CFG_MULT (mult) | +EP_CFG_MULT (priv_ep->mult) |/* must match EP setting */ EP_CFG_BUFFERING (buffering) |EP_CFG_MAXBURST (maxburst);
@@ -2263,6 +2251,13 @@ usb_ep *cdns3_gadget_match_ep(struct usb priv_ep->type =usb_endpoint_type (desc); priv_ep->flags |=EP_CLAIMED ; priv_ep->interval = desc->bInterval ?BIT (desc->bInterval -1 ) :0 ; + priv_ep->wMaxPacketSize =usb_endpoint_maxp (desc); + priv_ep->mult =USB_EP_MAXP_MULT (priv_ep->wMaxPacketSize); + priv_ep->wMaxPacketSize &=USB_ENDPOINT_MAXP_MASK ; +if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC && comp_desc) { + priv_ep->mult =USB_SS_MULT (comp_desc->bmAttributes) -1 ; + priv_ep->bMaxBurst = comp_desc->bMaxBurst; + }spin_unlock_irqrestore (&priv_dev->lock, flags);return &priv_ep->endpoint;
@@ -3044,22 +3039,40 @@ static int cdns3_gadget_check_config(strstruct cdns3_endpoint *priv_ep;struct usb_ep *ep;int n_in =0 ; +int iso =0 ; +int out =1 ;int total; +int n;list_for_each_entry (ep, &gadget->ep_list, ep_list) { priv_ep =ep_to_cdns3_ep (ep); -if ((priv_ep->flags &EP_CLAIMED ) && (ep->address &USB_DIR_IN )) - n_in++; +if (!(priv_ep->flags &EP_CLAIMED )) +continue ; + + n = (priv_ep->mult +1 ) * (priv_ep->bMaxBurst +1 ); +if (ep->address &USB_DIR_IN ) { +/* +* ISO transfer: DMA start move data when get ISO, only transfer +* data as min(TD size, iso). No benefit for allocate bigger +* internal memory than 'iso'. +*/ +if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC ) + iso += n; +else + n_in++; + }else { +if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC ) + out =max_t (int, out, n); + } }/* 2KB are reserved for EP0, 1KB for out*/ - total =2 + n_in +1 ; + total =2 + n_in + out + iso;if (total > priv_dev->onchip_buffers)return -ENOMEM ; - priv_dev->ep_buf_size = priv_dev->ep_iso_burst = - (priv_dev->onchip_buffers -2 ) / (n_in +1 ); + priv_dev->ep_buf_size = (priv_dev->onchip_buffers -2 - iso) / (n_in + out);return 0 ; }
drivers/usb/cdns3/cdns3-gadget.h +3 -0
@@ -1168,6 +1168,9 @@ struct cdns3_endpoint {u8 dir;u8 num;u8 type; +u8 mult; +u8 bMaxBurst; +u16 wMaxPacketSize;int interval;int free_trbs;
Greg Kroah-Hartman
maintainerPATCH 266/417 usb: cdns3: Fix uvc fail when DMA cross 4k boundery since sg enabled
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
commit 40c304109e866a7dc123661a5c8ca72f6b5e14e0 upstream.
Supposed DMA cross 4k bounder problem should be fixed at DEV_VER_V2, but still met problem when do ISO transfer if sg enabled.
Data pattern likes below when sg enabled, package size is 1k and mult is 2
[UVC Header(8B) ] [data(3k - 8)] ...
The received data at offset 0xd000 will get 0xc000 data, len 0x70. Error happen position as below pattern:
0xd000: wrong 0xe000: wrong 0xf000: correct 0x10000: wrong 0x11000: wrong 0x12000: correct ...
To avoid DMA cross 4k bounder at ISO transfer, reduce burst len according to start DMA address's alignment.
--- drivers/usb/cdns3/cdns3-gadget.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)
drivers/usb/cdns3/cdns3-gadget.c +31 -1
@@ -1118,6 +1118,7 @@ static int cdns3_ep_run_transfer(structu32 togle_pcs =1 ;int sg_iter =0 ;int num_trb_req; +int trb_burst;int num_trb;int address;u32 control;
@@ -1240,7 +1241,36 @@ static int cdns3_ep_run_transfer(struct total_tdl +=DIV_ROUND_UP (length, priv_ep->endpoint.maxpacket); - trb->length |=cpu_to_le32 (TRB_BURST_LEN (priv_ep->trb_burst_size) | + trb_burst = priv_ep->trb_burst_size; + +/* +* Supposed DMA cross 4k bounder problem should be fixed at DEV_VER_V2, but still +* met problem when do ISO transfer if sg enabled. +* +* Data pattern likes below when sg enabled, package size is 1k and mult is 2 +* [UVC Header(8B) ] [data(3k - 8)] ... +* +* The received data at offset 0xd000 will get 0xc000 data, len 0x70. Error happen +* as below pattern: +* 0xd000: wrong +* 0xe000: wrong +* 0xf000: correct +* 0x10000: wrong +* 0x11000: wrong +* 0x12000: correct +* ... +* +* But it is still unclear about why error have not happen below 0xd000, it should +* cross 4k bounder. But anyway, the below code can fix this problem. +* +* To avoid DMA cross 4k bounder at ISO transfer, reduce burst len according to 16. +*/ +if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC && priv_dev->dev_ver <=DEV_VER_V2 ) +if (ALIGN_DOWN (trb->buffer,SZ_4K ) != +ALIGN_DOWN (trb->buffer + length,SZ_4K )) + trb_burst =16 ; + + trb->length |=cpu_to_le32 (TRB_BURST_LEN (trb_burst) |TRB_LEN (length)); pcs = priv_ep->pcs ?TRB_CYCLE :0 ;
Greg Kroah-Hartman
maintainerPATCH 267/417 Revert "usb: typec: class: fix typec_altmode_put_partner to put plugs"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heikki Krogerus <[email protected]>
commit 9c6b789e954fae73c548f39332bcc56bdf0d4373 upstream.
This reverts commit b17b7fe6dd5c6ff74b38b0758ca799cdbb79e26e.
That commit messed up the reference counting, so it needs to be rethought.
--- drivers/usb/typec/class.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/usb/typec/class.c +2 -3
@@ -267,7 +267,7 @@ static void typec_altmode_put_partner(stif (!partner)return ; - adev = &altmode->adev; + adev = &partner->adev;if (is_typec_plug (adev->dev.parent)) {struct typec_plug *plug =to_typec_plug (adev->dev.parent);
@@ -497,8 +497,7 @@ static void typec_altmode_release(struct {struct altmode *alt =to_altmode (to_typec_altmode (dev)); -if (!is_typec_port (dev->parent)) -typec_altmode_put_partner (alt); +typec_altmode_put_partner (alt);altmode_id_remove (alt->adev.dev.parent, alt->id);kfree (alt);
Greg Kroah-Hartman
maintainerPATCH 268/417 usb: typec: class: fix typec_altmode_put_partner to put plugs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: RD Babiera <[email protected]>
commit 5962ded777d689cd8bf04454273e32228d7fb71f upstream.
When typec_altmode_put_partner is called by a plug altmode upon release, the port altmode the plug belongs to will not remove its reference to the plug. The check to see if the altmode being released is a plug evaluates against the released altmode's partner instead of the calling altmode, so change adev in typec_altmode_put_partner to properly refer to the altmode being released.
Because typec_altmode_set_partner calls get_device() on the port altmode, add partner_adev that points to the port altmode in typec_put_partner to call put_device() on. typec_altmode_set_partner is not called for port altmodes, so add a check in typec_altmode_release to prevent typec_altmode_put_partner() calls on port altmode release.
--- drivers/usb/typec/class.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/usb/typec/class.c +6 -3
@@ -263,11 +263,13 @@ static void typec_altmode_put_partner(st {struct altmode *partner = altmode->partner;struct typec_altmode *adev; +struct typec_altmode *partner_adev;if (!partner)return ; - adev = &partner->adev; + adev = &altmode->adev; + partner_adev = &partner->adev;if (is_typec_plug (adev->dev.parent)) {struct typec_plug *plug =to_typec_plug (adev->dev.parent);
@@ -276,7 +278,7 @@ static void typec_altmode_put_partner(st }else { partner->partner =NULL ; } -put_device (&adev->dev); +put_device (&partner_adev->dev); }/**
@@ -497,7 +499,8 @@ static void typec_altmode_release(struct {struct altmode *alt =to_altmode (to_typec_altmode (dev)); -typec_altmode_put_partner (alt); +if (!is_typec_port (dev->parent)) +typec_altmode_put_partner (alt);altmode_id_remove (alt->adev.dev.parent, alt->id);kfree (alt);
Greg Kroah-Hartman
maintainerPATCH 269/417 usb: mon: Fix atomicity violation in mon_bin_vma_fault
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gui-Dong Han <[email protected]>
commit 2dd23cc4d0e6aa55cf9fb3b05f2f4165b01de81c upstream.
In mon_bin_vma_fault():
offset = vmf->pgoff << PAGE_SHIFT;
if (offset >= rp->b_size)
return VM_FAULT_SIGBUS;
chunk_idx = offset / CHUNK_SIZE;
pageptr = rp->b_vec[chunk_idx].pg;The code is executed without holding any lock.
In mon_bin_vma_close():
spin_lock_irqsave(&rp->b_lock, flags);
rp->mmap_active--;
spin_unlock_irqrestore(&rp->b_lock, flags);In mon_bin_ioctl():
spin_lock_irqsave(&rp->b_lock, flags);
if (rp->mmap_active) {
...
} else {
...
kfree(rp->b_vec);
rp->b_vec = vec;
rp->b_size = size;
...
}
spin_unlock_irqrestore(&rp->b_lock, flags);Concurrent execution of mon_bin_vma_fault() with mon_bin_vma_close() and mon_bin_ioctl() could lead to atomicity violations. mon_bin_vma_fault() accesses rp->b_size and rp->b_vec without locking, risking array out-of-bounds access or use-after-free bugs due to possible modifications in mon_bin_ioctl().
This possible bug is found by an experimental static analysis tool developed by our team, BassCheck[1]. This tool analyzes the locking APIs to extract function pairs that can be concurrently executed, and then analyzes the instructions in the paired functions to identify possible concurrency bugs including data races and atomicity violations. The above possible bug is reported when our tool analyzes the source code of Linux 6.2.
To address this issue, it is proposed to add a spin lock pair in mon_bin_vma_fault() to ensure atomicity. With this patch applied, our tool never reports the possible bug, with the kernel configuration allyesconfig for x86_64. Due to the lack of associated hardware, we cannot test the patch in runtime testing, and just verify it according to the code logic.
[1] https://sites.google.com/view/basscheck/
--- drivers/usb/mon/mon_bin.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/usb/mon/mon_bin.c +6 -1
@@ -1247,14 +1247,19 @@ static vm_fault_t mon_bin_vma_fault(strustruct mon_reader_bin *rp = vmf->vma->vm_private_data;unsigned long offset, chunk_idx;struct page *pageptr; +unsigned long flags; +spin_lock_irqsave (&rp->b_lock, flags); offset = vmf->pgoff <<PAGE_SHIFT ; -if (offset >= rp->b_size) +if (offset >= rp->b_size) { +spin_unlock_irqrestore (&rp->b_lock, flags);return VM_FAULT_SIGBUS ; + } chunk_idx = offset /CHUNK_SIZE ; pageptr = rp->b_vec[chunk_idx].pg;get_page (pageptr); vmf->page = pageptr; +spin_unlock_irqrestore (&rp->b_lock, flags);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 270/417 serial: core: fix sanitizing check for RTS settings
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lino Sanfilippo <[email protected]>
commit 4afeced55baa391490b61ed9164867e2927353ed upstream.
Among other things uart_sanitize_serial_rs485() tests the sanity of the RTS settings in a RS485 configuration that has been passed by userspace. If RTS-on-send and RTS-after-send are both set or unset the configuration is adjusted and RTS-after-send is disabled and RTS-on-send enabled.
This however makes only sense if both RTS modes are actually supported by the driver.
With commit be2e2cb1d281 ("serial: Sanitize rs485_struct") the code does take the driver support into account but only checks if one of both RTS modes are supported. This may lead to the errorneous result of RTS-on-send being set even if only RTS-after-send is supported.
Fix this by changing the implemented logic: First clear all unsupported flags in the RS485 configuration, then adjust an invalid RTS setting by taking into account which RTS mode is supported.
--- drivers/tty/serial/serial_core.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
drivers/tty/serial/serial_core.c +18 -10
@@ -1353,19 +1353,27 @@ static void uart_sanitize_serial_rs485(sreturn ; } + rs485->flags &= supported_flags; +/* Pick sane settings if the user hasn't */ -if ((supported_flags & (SER_RS485_RTS_ON_SEND |SER_RS485_RTS_AFTER_SEND )) && - !(rs485->flags &SER_RS485_RTS_ON_SEND ) == +if (!(rs485->flags &SER_RS485_RTS_ON_SEND ) == !(rs485->flags &SER_RS485_RTS_AFTER_SEND )) { -dev_warn_ratelimited (port->dev, -"%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n" , - port->name, port->line); - rs485->flags |=SER_RS485_RTS_ON_SEND ; - rs485->flags &= ~SER_RS485_RTS_AFTER_SEND ; - supported_flags |=SER_RS485_RTS_ON_SEND |SER_RS485_RTS_AFTER_SEND ; - } +if (supported_flags &SER_RS485_RTS_ON_SEND ) { + rs485->flags |=SER_RS485_RTS_ON_SEND ; + rs485->flags &= ~SER_RS485_RTS_AFTER_SEND ; - rs485->flags &= supported_flags; +dev_warn_ratelimited (port->dev, +"%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n" , + port->name, port->line); + }else { + rs485->flags |=SER_RS485_RTS_AFTER_SEND ; + rs485->flags &= ~SER_RS485_RTS_ON_SEND ; + +dev_warn_ratelimited (port->dev, +"%s (%d): invalid RTS setting, using RTS_AFTER_SEND instead\n" , + port->name, port->line); + } + }uart_sanitize_serial_rs485_delays (port, rs485);
Greg Kroah-Hartman
maintainerPATCH 271/417 serial: core: make sure RS485 cannot be enabled when it is not supported
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lino Sanfilippo <[email protected]>
commit c73986913fa47e71e0b1ad7f039f6444915e8810 upstream.
Some uart drivers specify a rs485_config() function and then decide later to disable RS485 support for some reason (e.g. imx and ar933).
In these cases userspace may be able to activate RS485 via TIOCSRS485 nevertheless, since in uart_set_rs485_config() an existing rs485_config() function indicates that RS485 is supported.
Make sure that this is not longer possible by checking the uarts rs485_supported.flags instead and bailing out if SER_RS485_ENABLED is not set.
Furthermore instead of returning an empty structure return -ENOTTY if the RS485 configuration is requested via TIOCGRS485 but RS485 is not supported. This has a small impact on userspace visibility but it is consistent with the -ENOTTY error for TIOCGRS485.
--- drivers/tty/serial/serial_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/serial_core.c +1 -1
@@ -1436,7 +1436,7 @@ static int uart_set_rs485_config(structint ret;unsigned long flags; -if (!port->rs485_config) +if (!(port->rs485_supported.flags &SER_RS485_ENABLED ))return -ENOTTY ;if (copy_from_user (&rs485, rs485_user,sizeof (*rs485_user)))
Greg Kroah-Hartman
maintainerPATCH 272/417 serial: 8250_bcm2835aux: Restore clock error handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
commit 83e571f054cd742eb9a46d46ef05193904adf53f upstream.
The commit fcc446c8aa63 ("serial: 8250_bcm2835aux: Add ACPI support") dropped the error handling for clock acquiring. But even an optional clock needs this.
--- drivers/tty/serial/8250/8250_bcm2835aux.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/serial/8250/8250_bcm2835aux.c +2 -0
@@ -119,6 +119,8 @@ static int bcm2835aux_serial_probe(struc/* get the clock - this also enables the HW */ data->clk =devm_clk_get_optional (&pdev->dev,NULL ); +if (IS_ERR (data->clk)) +return dev_err_probe (&pdev->dev,PTR_ERR (data->clk),"could not get clk\n" );/* get the interrupt */ ret =platform_get_irq (pdev,0 );
Greg Kroah-Hartman
maintainerPATCH 273/417 serial: core, imx: do not set RS485 enabled if it is not supported
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lino Sanfilippo <[email protected]>
commit 74eab89b26ac433ad857292f4707b43c1a8f0209 upstream.
If the imx driver cannot support RS485 it nullifies the ports rs485_supported structure. But it still calls uart_get_rs485_mode() which may set the RS485_ENABLED flag nevertheless.
This may lead to an attempt to configure RS485 even if it is not supported when the flag is evaluated in uart_configure_port() at port startup.
Avoid this by bailing out of uart_get_rs485_mode() if the RS485_ENABLED flag is not supported by the caller.
With this fix a check for RTS availability is now obsolete in the imx driver, since it can not evaluate to true any more. So remove this check.
Furthermore the explicit nullifcation of rs485_supported is not needed, since the memory has already been set to zeros at allocation. So remove this, too.
--- drivers/tty/serial/imx.c | 7 ------- drivers/tty/serial/serial_core.c | 3 +++ 2 files changed, 3 insertions(+), 7 deletions(-)
drivers/tty/serial/imx.c +0 -7
@@ -2229,7 +2229,6 @@ static enum hrtimer_restart imx_trigger_return HRTIMER_NORESTART ; } -static const struct serial_rs485 imx_no_rs485 = {};/* No RS485 if no RTS */ static const struct serial_rs485 imx_rs485_supported = { .flags =SER_RS485_ENABLED |SER_RS485_RTS_ON_SEND |SER_RS485_RTS_AFTER_SEND |SER_RS485_RX_DURING_TX ,
@@ -2319,8 +2318,6 @@ static int imx_uart_probe(struct platfor/* RTS is required to control the RS485 transmitter */ if (sport->have_rtscts || sport->have_rtsgpio) sport->port.rs485_supported = imx_rs485_supported; -else - sport->port.rs485_supported = imx_no_rs485; sport->port.flags =UPF_BOOT_AUTOCONF ;timer_setup (&sport->timer, imx_uart_timeout,0 );
@@ -2364,10 +2361,6 @@ static int imx_uart_probe(struct platforreturn ret; } -if (sport->port.rs485.flags &SER_RS485_ENABLED && - (!sport->have_rtscts && !sport->have_rtsgpio)) -dev_err (&pdev->dev,"no RTS control, disabling rs485\n" ); -/* * If using the i.MX UART RTS/CTS control then the RTS (CTS_B) * signal cannot be set low during transmission in case the
drivers/tty/serial/serial_core.c +3 -0
@@ -3428,6 +3428,9 @@ int uart_get_rs485_mode(struct uart_portu32 rs485_delay[2 ];int ret; +if (!(port->rs485_supported.flags &SER_RS485_ENABLED )) +return 0 ; + ret =device_property_read_u32_array (dev,"rs485-rts-delay" , rs485_delay,2 );if (!ret) {
Greg Kroah-Hartman
maintainerPATCH 274/417 serial: imx: Ensure that imx_uart_rs485_config() is called with enabled clock
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Niedermaier <[email protected]>
commit 7c45eaa813476bd195ac1227a64b52f9cf2e2030 upstream.
There are register accesses in the function imx_uart_rs485_config(). The clock must be enabled for these accesses. This was ensured by calling it via the function uart_rs485_config() in the probe() function within the range where the clock is enabled. With the commit 7c7f9bc986e6 ("serial:
Deassert Transmit Enable on probe in driver-specific way") it was removed from the probe() function and is now only called through the function uart_add_one_port() which is located at the end of the probe() function. But the clock is already switched off in this area. To ensure that the clock is enabled during register access, move the disabling of the clock to the very end of the probe() function. To avoid leaking enabled clocks on error also add an error path for exiting with disabling the clock.
--- drivers/tty/serial/imx.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
drivers/tty/serial/imx.c +12 -11
@@ -2356,10 +2356,8 @@ static int imx_uart_probe(struct platfor sport->ufcr =readl (sport->port.membase +UFCR ); ret =uart_get_rs485_mode (&sport->port); -if (ret) { -clk_disable_unprepare (sport->clk_ipg); -return ret; - } +if (ret) + goto err_clk;/* * If using the i.MX UART RTS/CTS control then the RTS (CTS_B)
@@ -2439,8 +2437,6 @@ static int imx_uart_probe(struct platforimx_uart_writel (sport, ucr3,UCR3 ); } -clk_disable_unprepare (sport->clk_ipg); -hrtimer_init (&sport->trigger_start_tx,CLOCK_MONOTONIC ,HRTIMER_MODE_REL );hrtimer_init (&sport->trigger_stop_tx,CLOCK_MONOTONIC ,HRTIMER_MODE_REL ); sport->trigger_start_tx.function = imx_trigger_start_tx;
@@ -2456,7 +2452,7 @@ static int imx_uart_probe(struct platforif (ret) {dev_err (&pdev->dev,"failed to request rx irq: %d\n" , ret); -return ret; + goto err_clk; } ret = devm_request_irq(&pdev->dev, txirq, imx_uart_txint, 0,
@@ -2464,7 +2460,7 @@ static int imx_uart_probe(struct platforif (ret) {dev_err (&pdev->dev,"failed to request tx irq: %d\n" , ret); -return ret; + goto err_clk; } ret = devm_request_irq(&pdev->dev, rtsirq, imx_uart_rtsint, 0,
@@ -2472,14 +2468,14 @@ static int imx_uart_probe(struct platforif (ret) {dev_err (&pdev->dev,"failed to request rts irq: %d\n" , ret); -return ret; + goto err_clk; } }else { ret =devm_request_irq (&pdev->dev, rxirq, imx_uart_int,0 ,dev_name (&pdev->dev), sport);if (ret) {dev_err (&pdev->dev,"failed to request irq: %d\n" , ret); -return ret; + goto err_clk; } }
@@ -2487,7 +2483,12 @@ static int imx_uart_probe(struct platforplatform_set_drvdata (pdev, sport); -return uart_add_one_port (&imx_uart_uart_driver, &sport->port); + ret =uart_add_one_port (&imx_uart_uart_driver, &sport->port); + +err_clk: +clk_disable_unprepare (sport->clk_ipg); + +return ret; }static int imx_uart_remove (struct platform_device *pdev)
Greg Kroah-Hartman
maintainerPATCH 275/417 serial: 8250_exar: Set missing rs485_supported flag
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lino Sanfilippo <[email protected]>
commit 0c2a5f471ce58bca8f8ab5fcb911aff91eaaa5eb upstream.
The UART supports an auto-RTS mode in which the RTS pin is automatically activated during transmission. So mark this mode as being supported even if RTS is not controlled by the driver but the UART.
Also the serial core expects now at least one of both modes rts-on-send or rts-after-send to be supported. This is since during sanitization unsupported flags are deleted from a RS485 configuration set by userspace. However if the configuration ends up with both flags unset, the core prints a warning since it considers such a configuration invalid (see uart_sanitize_serial_rs485()).
--- drivers/tty/serial/8250/8250_exar.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/tty/serial/8250/8250_exar.c +3 -2
@@ -442,7 +442,7 @@ static int generic_rs485_config(struct u }static const struct serial_rs485 generic_rs485_supported = { - .flags =SER_RS485_ENABLED , + .flags =SER_RS485_ENABLED |SER_RS485_RTS_ON_SEND , };static const struct exar8250_platform exar8250_default_platform = {
@@ -486,7 +486,8 @@ static int iot2040_rs485_config(struct u }static const struct serial_rs485 iot2040_rs485_supported = { - .flags =SER_RS485_ENABLED |SER_RS485_RX_DURING_TX |SER_RS485_TERMINATE_BUS , + .flags =SER_RS485_ENABLED |SER_RS485_RTS_ON_SEND | +SER_RS485_RX_DURING_TX |SER_RS485_TERMINATE_BUS , };static const struct property_entry iot2040_gpio_properties[] = {
Greg Kroah-Hartman
maintainerPATCH 276/417 serial: omap: do not override settings for RS485 support
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lino Sanfilippo <[email protected]>
commit 51f93776b84dee23e44a7be880736669a01cec2b upstream.
The drivers RS485 support is deactivated if there is no RTS GPIO available. This is done by nullifying the ports rs485_supported struct. After that however the settings in serial_omap_rs485_supported are assigned to the same structure unconditionally, which results in an unintended reactivation of RS485 support.
Fix this by moving the assignment to the beginning of serial_omap_probe_rs485() and thus before uart_get_rs485_mode() gets called.
Also replace the assignment of rs485_config() to have the complete RS485 setup in one function.
--- drivers/tty/serial/omap-serial.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
drivers/tty/serial/omap-serial.c +14 -13
@@ -1512,6 +1512,13 @@ static struct omap_uart_port_info *of_gereturn omap_up_info; } +static const struct serial_rs485 serial_omap_rs485_supported = { + .flags =SER_RS485_ENABLED |SER_RS485_RTS_ON_SEND |SER_RS485_RTS_AFTER_SEND | +SER_RS485_RX_DURING_TX , + .delay_rts_before_send =1 , + .delay_rts_after_send =1 , +}; +static int serial_omap_probe_rs485 (struct uart_omap_port *up,struct device *dev) {
@@ -1526,6 +1533,9 @@ static int serial_omap_probe_rs485(strucif (!np)return 0 ; + up->port.rs485_config = serial_omap_config_rs485; + up->port.rs485_supported = serial_omap_rs485_supported; + ret =uart_get_rs485_mode (&up->port);if (ret)return ret;
@@ -1560,13 +1570,6 @@ static int serial_omap_probe_rs485(strucreturn 0 ; } -static const struct serial_rs485 serial_omap_rs485_supported = { - .flags =SER_RS485_ENABLED |SER_RS485_RTS_ON_SEND |SER_RS485_RTS_AFTER_SEND | -SER_RS485_RX_DURING_TX , - .delay_rts_before_send =1 , - .delay_rts_after_send =1 , -}; -static int serial_omap_probe (struct platform_device *pdev) {struct omap_uart_port_info *omap_up_info =dev_get_platdata (&pdev->dev);
@@ -1634,17 +1637,11 @@ static int serial_omap_probe(struct platdev_info (up->port.dev,"no wakeirq for uart%d\n" , up->port.line); - ret =serial_omap_probe_rs485 (up, &pdev->dev); -if (ret <0 ) - goto err_rs485; -sprintf (up->name,"OMAP UART%d" , up->port.line); up->port.mapbase = mem->start; up->port.membase = base; up->port.flags = omap_up_info->flags; up->port.uartclk = omap_up_info->uartclk; - up->port.rs485_config = serial_omap_config_rs485; - up->port.rs485_supported = serial_omap_rs485_supported;if (!up->port.uartclk) { up->port.uartclk =DEFAULT_CLK_SPEED ; dev_warn(&pdev->dev,
@@ -1652,6 +1649,10 @@ static int serial_omap_probe(struct plat DEFAULT_CLK_SPEED); } + ret =serial_omap_probe_rs485 (up, &pdev->dev); +if (ret <0 ) + goto err_rs485; + up->latency =PM_QOS_CPU_LATENCY_DEFAULT_VALUE ; up->calc_latency =PM_QOS_CPU_LATENCY_DEFAULT_VALUE ;cpu_latency_qos_add_request (&up->pm_qos_request, up->latency);
Greg Kroah-Hartman
maintainerPATCH 277/417 drm/vmwgfx: Fix possible invalid drm gem put calls
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zack Rusin <[email protected]>
commit f9e96bf1905479f18e83a3a4c314a8dfa56ede2c upstream.
vmw_bo_unreference sets the input buffer to null on exit, resulting in null ptr deref's on the subsequent drm gem put calls.
This went unnoticed because only very old userspace would be exercising those paths but it wouldn't be hard to hit on old distros with brand new kernels.
Introduce a new function that abstracts unrefing of user bo's to make the code cleaner and more explicit.
--- drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 6 ++---- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 8 ++++++++ drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 6 ++---- drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 6 ++---- drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | 3 +-- drivers/gpu/drm/vmwgfx/vmwgfx_shader.c | 3 +-- 6 files changed, 16 insertions(+), 16 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +2 -4
@@ -595,10 +595,9 @@ static int vmw_user_bo_synccpu_release(sif (!(flags & drm_vmw_synccpu_allow_cs)) {atomic_dec (&vmw_bo->cpu_writers); } -ttm_bo_put (&vmw_bo->base); +vmw_user_bo_unref (vmw_bo); } -drm_gem_object_put (&vmw_bo->base.base);return ret; }
@@ -638,8 +637,7 @@ int vmw_user_bo_synccpu_ioctl(struct drmreturn ret; ret =vmw_user_bo_synccpu_grab (vbo, arg->flags); -vmw_bo_unreference (&vbo); -drm_gem_object_put (&vbo->base.base); +vmw_user_bo_unref (vbo);if (unlikely (ret !=0 )) {if (ret == -ERESTARTSYS || ret == -EBUSY )return -EBUSY ;
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +8 -0
@@ -1600,6 +1600,14 @@ vmw_bo_reference(struct vmw_buffer_objecreturn buf; } +static inline void vmw_user_bo_unref (struct vmw_buffer_object *vbo) +{ +if (vbo) { +ttm_bo_put (&vbo->base); +drm_gem_object_put (&vbo->base.base); + } +} +static inline void vmw_fifo_resource_inc (struct vmw_private *dev_priv) {atomic_inc (&dev_priv->num_fifo_resources);
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +2 -4
@@ -1159,8 +1159,7 @@ static int vmw_translate_mob_ptr(structreturn PTR_ERR (vmw_bo); } ret =vmw_validation_add_bo (sw_context->ctx, vmw_bo, true, false); -ttm_bo_put (&vmw_bo->base); -drm_gem_object_put (&vmw_bo->base.base); +vmw_user_bo_unref (vmw_bo);if (unlikely (ret !=0 ))return ret;
@@ -1214,8 +1213,7 @@ static int vmw_translate_guest_ptr(strucreturn PTR_ERR (vmw_bo); } ret =vmw_validation_add_bo (sw_context->ctx, vmw_bo, false, false); -ttm_bo_put (&vmw_bo->base); -drm_gem_object_put (&vmw_bo->base.base); +vmw_user_bo_unref (vmw_bo);if (unlikely (ret !=0 ))return ret;
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +2 -4
@@ -1599,10 +1599,8 @@ static struct drm_framebuffer *vmw_kms_f err_out:/* vmw_user_lookup_handle takes one ref so does new_fb */ -if (bo) { -vmw_bo_unreference (&bo); -drm_gem_object_put (&bo->base.base); - } +if (bo) +vmw_user_bo_unref (bo);if (surface)vmw_surface_unreference (&surface);
drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c +1 -2
@@ -457,8 +457,7 @@ int vmw_overlay_ioctl(struct drm_device ret =vmw_overlay_update_stream (dev_priv, buf, arg, true); -vmw_bo_unreference (&buf); -drm_gem_object_put (&buf->base.base); +vmw_user_bo_unref (buf); out_unlock:mutex_unlock (&overlay->mutex);
drivers/gpu/drm/vmwgfx/vmwgfx_shader.c +1 -2
@@ -806,8 +806,7 @@ static int vmw_shader_define(struct drm_ shader_type, num_input_sig, num_output_sig, tfile, shader_handle); out_bad_arg: -vmw_bo_unreference (&buffer); -drm_gem_object_put (&buffer->base.base); +vmw_user_bo_unref (buffer);return ret; }
Greg Kroah-Hartman
maintainerPATCH 278/417 drm/vmwgfx: Keep a gem reference to user bos in surfaces
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zack Rusin <[email protected]>
commit 91398b413d03660fd5828f7b4abc64e884b98069 upstream.
Surfaces can be backed (i.e. stored in) memory objects (mob's) which are created and managed by the userspace as GEM buffers. Surfaces grab only a ttm reference which means that the gem object can be deleted underneath us, especially in cases where prime buffer export is used.
Make sure that all userspace surfaces which are backed by gem objects hold a gem reference to make sure they're not deleted before vmw surfaces are done with them, which fixes:
------------[ cut here ]------------ refcount_t: underflow; use-after-free. WARNING: CPU: 2 PID: 2632 at lib/refcount.c:28 refcount_warn_saturate+0xfb/0x150 Modules linked in: overlay vsock_loopback vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport vsock snd_ens1371 snd_ac97_codec ac97_bus snd_pcm gameport> CPU: 2 PID: 2632 Comm: vmw_ref_count Not tainted 6.5.0-rc2-vmwgfx #1 Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020 RIP: 0010:refcount_warn_saturate+0xfb/0x150 Code: eb 9e 0f b6 1d 8b 5b a6 01 80 fb 01 0f 87 ba e4 80 00 83 e3 01 75 89 48 c7 c7 c0 3c f9 a3 c6 05 6f 5b a6 01 01 e8 15 81 98 ff <0f> 0b e9 6f ff ff ff 0f b> RSP: 0018:ffffbdc34344bba0 EFLAGS: 00010286 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000027 RDX: ffff960475ea1548 RSI: 0000000000000001 RDI: ffff960475ea1540 RBP: ffffbdc34344bba8 R08: 0000000000000003 R09: 65646e75203a745f R10: ffffffffa5b32b20 R11: 72657466612d6573 R12: ffff96037d6a6400 R13: ffff9603484805b0 R14: 000000000000000b R15: ffff9603bed06060 FS: 00007f5fd8520c40(0000) GS:ffff960475e80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f5fda755000 CR3: 000000010d012005 CR4: 00000000003706e0 Call Trace: <TASK> ? show_regs+0x6e/0x80 ? refcount_warn_saturate+0xfb/0x150 ? __warn+0x91/0x150 ? refcount_warn_saturate+0xfb/0x150 ? report_bug+0x19d/0x1b0 ? handle_bug+0x46/0x80 ? exc_invalid_op+0x1d/0x80 ? asm_exc_invalid_op+0x1f/0x30 ? refcount_warn_saturate+0xfb/0x150 drm_gem_object_handle_put_unlocked+0xba/0x110 [drm] drm_gem_object_release_handle+0x6e/0x80 [drm] drm_gem_handle_delete+0x6a/0xc0 [drm] ? __pfx_vmw_bo_unref_ioctl+0x10/0x10 [vmwgfx] vmw_bo_unref_ioctl+0x33/0x40 [vmwgfx] drm_ioctl_kernel+0xbc/0x160 [drm] drm_ioctl+0x2d2/0x580 [drm] ? __pfx_vmw_bo_unref_ioctl+0x10/0x10 [vmwgfx] ? do_vmi_munmap+0xee/0x180 vmw_generic_ioctl+0xbd/0x180 [vmwgfx] vmw_unlocked_ioctl+0x19/0x20 [vmwgfx] __x64_sys_ioctl+0x99/0xd0 do_syscall_64+0x5d/0x90 ? syscall_exit_to_user_mode+0x2a/0x50 ? do_syscall_64+0x6d/0x90 ? handle_mm_fault+0x16e/0x2f0 ? exit_to_user_mode_prepare+0x34/0x170 ? irqentry_exit_to_user_mode+0xd/0x20 ? irqentry_exit+0x3f/0x50 ? exc_page_fault+0x8e/0x190 entry_SYSCALL_64_after_hwframe+0x6e/0xd8 RIP: 0033:0x7f5fda51aaff Code: 00 48 89 44 24 18 31 c0 48 8d 44 24 60 c7 04 24 10 00 00 00 48 89 44 24 08 48 8d 44 24 20 48 89 44 24 10 b8 10 00 00 00 0f 05 <41> 89 c0 3d 00 f0 ff ff 7> RSP: 002b:00007ffd536a4d30 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 RAX: ffffffffffffffda RBX: 00007ffd536a4de0 RCX: 00007f5fda51aaff RDX: 00007ffd536a4de0 RSI: 0000000040086442 RDI: 0000000000000003 RBP: 0000000040086442 R08: 000055fa603ada50 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000246 R12: 00007ffd536a51b8 R13: 0000000000000003 R14: 000055fa5ebb4c80 R15: 00007f5fda90f040 </TASK> ---[ end trace 0000000000000000 ]---
A lot of the analyis on the bug was done by Murray McAllister and Ian Forbes.
--- drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 5 ++--- drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c | 8 ++++---- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 22 +++++++++++++++++----- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 10 ++++++---- drivers/gpu/drm/vmwgfx/vmwgfx_gem.c | 24 +++++++++++++++++++----- drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 6 +++--- drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 18 +++++++++--------- drivers/gpu/drm/vmwgfx/vmwgfx_shader.c | 4 ++-- drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 27 ++++++++------------------- 10 files changed, 71 insertions(+), 55 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +2 -3
@@ -595,7 +595,7 @@ static int vmw_user_bo_synccpu_release(sif (!(flags & drm_vmw_synccpu_allow_cs)) {atomic_dec (&vmw_bo->cpu_writers); } -vmw_user_bo_unref (vmw_bo); +vmw_user_bo_unref (&vmw_bo); }return ret;
@@ -637,7 +637,7 @@ int vmw_user_bo_synccpu_ioctl(struct drmreturn ret; ret =vmw_user_bo_synccpu_grab (vbo, arg->flags); -vmw_user_bo_unref (vbo); +vmw_user_bo_unref (&vbo);if (unlikely (ret !=0 )) {if (ret == -ERESTARTSYS || ret == -EBUSY )return -EBUSY ;
@@ -711,7 +711,6 @@ int vmw_user_bo_lookup(struct drm_file * } *out =gem_to_vmw_bo (gobj); -ttm_bo_get (&(*out)->base);return 0 ; }
drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c +4 -4
@@ -407,8 +407,8 @@ static int vmw_cotable_resize(struct vmw* for the new COTable. Initially pin the buffer object to make sure * we can use tryreserve without failure. */ - ret =vmw_bo_create (dev_priv, new_size, &vmw_mob_placement, - true, true, vmw_bo_bo_free, &buf); + ret =vmw_gem_object_create (dev_priv, new_size, &vmw_mob_placement, + true, true, vmw_bo_bo_free, &buf);if (ret) {DRM_ERROR ("Failed initializing new cotable MOB.\n" );return ret;
@@ -475,7 +475,7 @@ static int vmw_cotable_resize(struct vmwvmw_resource_mob_attach (res);/* Let go of the old mob. */ -vmw_bo_unreference (&old_buf); +vmw_user_bo_unref (&old_buf); res->id = vcotbl->type; ret =dma_resv_reserve_fences (bo->base.resv,1 );
@@ -492,7 +492,7 @@ out_map_new: out_wait:ttm_bo_unpin (bo);ttm_bo_unreserve (bo); -vmw_bo_unreference (&buf); +vmw_user_bo_unref (&buf);return ret; }
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +17 -5
@@ -969,6 +969,11 @@ static inline void vmw_bo_prio_del(struc/** * GEM related functionality - vmwgfx_gem.c */ +extern int vmw_gem_object_create (struct vmw_private *dev_priv, +size_t size,struct ttm_placement *placement, +bool interruptible,bool pin, +void (*bo_free)(struct ttm_buffer_object *bo), +struct vmw_buffer_object **p_bo); extern int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv, struct drm_file *filp, uint32_t size,
@@ -1600,12 +1605,19 @@ vmw_bo_reference(struct vmw_buffer_objecreturn buf; } -static inline void vmw_user_bo_unref (struct vmw_buffer_object *vbo) +static inline struct vmw_buffer_object *vmw_user_bo_ref (struct vmw_buffer_object *vbo) { -if (vbo) { -ttm_bo_put (&vbo->base); -drm_gem_object_put (&vbo->base.base); - } +drm_gem_object_get (&vbo->base.base); +return vbo; +} + +static inline void vmw_user_bo_unref (struct vmw_buffer_object **buf) +{ +struct vmw_buffer_object *tmp_buf = *buf; + + *buf =NULL ; +if (tmp_buf) +drm_gem_object_put (&tmp_buf->base.base); }static inline void vmw_fifo_resource_inc (struct vmw_private *dev_priv)
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +6 -4
@@ -1147,7 +1147,7 @@ static int vmw_translate_mob_ptr(structSVGAMobId *id, struct vmw_buffer_object **vmw_bo_p) { - struct vmw_buffer_object *vmw_bo; + struct vmw_buffer_object *vmw_bo, *tmp_bo;uint32_t handle = *id;struct vmw_relocation *reloc;int ret;
@@ -1159,7 +1159,8 @@ static int vmw_translate_mob_ptr(structreturn PTR_ERR (vmw_bo); } ret =vmw_validation_add_bo (sw_context->ctx, vmw_bo, true, false); -vmw_user_bo_unref (vmw_bo); + tmp_bo = vmw_bo; +vmw_user_bo_unref (&tmp_bo);if (unlikely (ret !=0 ))return ret;
@@ -1201,7 +1202,7 @@ static int vmw_translate_guest_ptr(strucSVGAGuestPtr *ptr, struct vmw_buffer_object **vmw_bo_p) { - struct vmw_buffer_object *vmw_bo; + struct vmw_buffer_object *vmw_bo, *tmp_bo;uint32_t handle = ptr->gmrId;struct vmw_relocation *reloc;int ret;
@@ -1213,7 +1214,8 @@ static int vmw_translate_guest_ptr(strucreturn PTR_ERR (vmw_bo); } ret =vmw_validation_add_bo (sw_context->ctx, vmw_bo, false, false); -vmw_user_bo_unref (vmw_bo); + tmp_bo = vmw_bo; +vmw_user_bo_unref (&tmp_bo);if (unlikely (ret !=0 ))return ret;
drivers/gpu/drm/vmwgfx/vmwgfx_gem.c +19 -5
@@ -133,6 +133,22 @@ void vmw_gem_destroy(struct ttm_buffer_okfree (vbo); } +int vmw_gem_object_create (struct vmw_private *vmw, +size_t size,struct ttm_placement *placement, +bool interruptible,bool pin, +void (*bo_free)(struct ttm_buffer_object *bo), +struct vmw_buffer_object **p_bo) +{ +int ret =vmw_bo_create (vmw, size, placement, interruptible, pin, bo_free, p_bo); + +if (ret !=0 ) + goto out_no_bo; + + (*p_bo)->base.base.funcs = &vmw_gem_object_funcs; +out_no_bo: +return ret; +} + int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv, struct drm_file *filp, uint32_t size,
@@ -141,16 +157,14 @@ int vmw_gem_object_create_with_handle(st {int ret; - ret =vmw_bo_create (dev_priv, size, - (dev_priv->has_mob) ? + ret =vmw_gem_object_create (dev_priv, size, + (dev_priv->has_mob) ? &vmw_sys_placement : &vmw_vram_sys_placement, - true, false, &vmw_gem_destroy, p_vbo); + true, false, &vmw_gem_destroy, p_vbo);if (ret !=0 ) goto out_no_bo; - (*p_vbo)->base.base.funcs = &vmw_gem_object_funcs; - ret =drm_gem_handle_create (filp, &(*p_vbo)->base.base, handle); out_no_bo:return ret;
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +3 -3
@@ -1402,8 +1402,8 @@ static int vmw_create_bo_proxy(struct dr/* Reserve and switch the backing mob. */ mutex_lock (&res->dev_priv->cmdbuf_mutex); (void )vmw_resource_reserve (res, false, true); -vmw_bo_unreference (&res->backup); - res->backup =vmw_bo_reference (bo_mob); +vmw_user_bo_unref (&res->backup); + res->backup =vmw_user_bo_ref (bo_mob); res->backup_offset =0 ;vmw_resource_unreserve (res, false, false, false,NULL ,0 );mutex_unlock (&res->dev_priv->cmdbuf_mutex);
@@ -1600,7 +1600,7 @@ static struct drm_framebuffer *vmw_kms_f err_out:/* vmw_user_lookup_handle takes one ref so does new_fb */ if (bo) -vmw_user_bo_unref (bo); +vmw_user_bo_unref (&bo);if (surface)vmw_surface_unreference (&surface);
drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c +1 -1
@@ -457,7 +457,7 @@ int vmw_overlay_ioctl(struct drm_device ret =vmw_overlay_update_stream (dev_priv, buf, arg, true); -vmw_user_bo_unref (buf); +vmw_user_bo_unref (&buf); out_unlock:mutex_unlock (&overlay->mutex);
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +9 -9
@@ -140,7 +140,7 @@ static void vmw_resource_release(structif (res->coherent)vmw_bo_dirty_release (res->backup);ttm_bo_unreserve (bo); -vmw_bo_unreference (&res->backup); +vmw_user_bo_unref (&res->backup); }if (likely (res->hw_destroy !=NULL )) {
@@ -330,10 +330,10 @@ static int vmw_resource_buf_alloc(structreturn 0 ; } - ret =vmw_bo_create (res->dev_priv, res->backup_size, - res->func->backup_placement, - interruptible, false, - &vmw_bo_bo_free, &backup); + ret =vmw_gem_object_create (res->dev_priv, res->backup_size, + res->func->backup_placement, + interruptible, false, + &vmw_bo_bo_free, &backup);if (unlikely (ret !=0 )) goto out_no_bo;
@@ -452,11 +452,11 @@ void vmw_resource_unreserve(struct vmw_rvmw_resource_mob_detach (res);if (res->coherent)vmw_bo_dirty_release (res->backup); -vmw_bo_unreference (&res->backup); +vmw_user_bo_unref (&res->backup); }if (new_backup) { - res->backup =vmw_bo_reference (new_backup); + res->backup =vmw_user_bo_ref (new_backup);/* * The validation code should already have added a
@@ -544,7 +544,7 @@ out_no_reserve:ttm_bo_put (val_buf->bo); val_buf->bo =NULL ;if (backup_dirty) -vmw_bo_unreference (&res->backup); +vmw_user_bo_unref (&res->backup);return ret; }
@@ -719,7 +719,7 @@ int vmw_resource_validate(struct vmw_res goto out_no_validate; else if (!res->func->needs_backup && res->backup) {WARN_ON_ONCE (vmw_resource_mob_attached (res)); -vmw_bo_unreference (&res->backup); +vmw_user_bo_unref (&res->backup); }return 0 ;
drivers/gpu/drm/vmwgfx/vmwgfx_shader.c +2 -2
@@ -177,7 +177,7 @@ static int vmw_gb_shader_init(struct vmw res->backup_size = size;if (byte_code) { - res->backup =vmw_bo_reference (byte_code); + res->backup =vmw_user_bo_ref (byte_code); res->backup_offset = offset; } shader->size = size;
@@ -806,7 +806,7 @@ static int vmw_shader_define(struct drm_ shader_type, num_input_sig, num_output_sig, tfile, shader_handle); out_bad_arg: -vmw_user_bo_unref (buffer); +vmw_user_bo_unref (&buffer);return ret; }
drivers/gpu/drm/vmwgfx/vmwgfx_surface.c +8 -19
@@ -683,9 +683,6 @@ static void vmw_user_surface_base_releas container_of(base, struct vmw_user_surface, prime.base);struct vmw_resource *res = &user_srf->srf.res; -if (res && res->backup) -drm_gem_object_put (&res->backup->base.base); - *p_base =NULL ;vmw_resource_unreference (&res); }
@@ -848,23 +845,17 @@ int vmw_surface_define_ioctl(struct drm_* expect a backup buffer to be present. */ if (dev_priv->has_mob && req->shareable) { -uint32_t backup_handle; - - ret =vmw_gem_object_create_with_handle (dev_priv, - file_priv, - res->backup_size, - &backup_handle, - &res->backup); + ret =vmw_gem_object_create (dev_priv, + res->backup_size, + &vmw_sys_placement, + true, + false, + &vmw_gem_destroy, + &res->backup);if (unlikely (ret !=0 )) {vmw_resource_unreference (&res); goto out_unlock; } -vmw_bo_reference (res->backup); -/* -* We don't expose the handle to the userspace and surface -* already holds a gem reference -*/ -drm_gem_handle_delete (file_priv, backup_handle); } tmp =vmw_resource_reference (&srf->res);
@@ -1505,7 +1496,7 @@ vmw_gb_surface_define_internal(struct drif (ret ==0 ) {if (res->backup->base.base.size < res->backup_size) {VMW_DEBUG_USER ("Surface backup buffer too small.\n" ); -vmw_bo_unreference (&res->backup); +vmw_user_bo_unref (&res->backup); ret = -EINVAL ; goto out_unlock; }else {
@@ -1519,8 +1510,6 @@ vmw_gb_surface_define_internal(struct dr res->backup_size, &backup_handle, &res->backup); -if (ret ==0 ) -vmw_bo_reference (res->backup); }if (unlikely (ret !=0 )) {
Greg Kroah-Hartman
maintainerPATCH 279/417 ALSA: oxygen: Fix right channel of capture volume mixer
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit a03cfad512ac24a35184d7d87ec0d5489e1cb763 upstream.
There was a typo in oxygen mixer code that didn't update the right channel value properly for the capture volume. Let's fix it.
This trivial fix was originally reported on Bugzilla.
--- sound/pci/oxygen/oxygen_mixer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/oxygen/oxygen_mixer.c +1 -1
@@ -718,7 +718,7 @@ static int ac97_fp_rec_volume_put(struct oldreg =oxygen_read_ac97 (chip,1 ,AC97_REC_GAIN ); newreg = oldreg & ~0x0707 ; newreg = newreg | (value->value.integer.value[0 ] &7 ); - newreg = newreg | ((value->value.integer.value[0 ] &7 ) <<8 ); + newreg = newreg | ((value->value.integer.value[1 ] &7 ) <<8 ); change = newreg != oldreg;if (change)oxygen_write_ac97 (chip,1 ,AC97_REC_GAIN , newreg);
Greg Kroah-Hartman
maintainerPATCH 280/417 ALSA: hda/relatek: Enable Mute LED on HP Laptop 15s-fq2xxx
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Çağhan Demir <[email protected]>
commit bc7863d18677df66b2c7a0e172c91296ff380f11 upstream.
This HP Laptop uses ALC236 codec with COEF 0x07 idx 1 controlling the mute LED. This patch enables the already existing quirk for this device.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9626,6 +9626,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x87f5 ,"HP" ,ALC287_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x87f6 ,"HP Spectre x360 14" ,ALC245_FIXUP_HP_X360_AMP ),SND_PCI_QUIRK (0x103c ,0x87f7 ,"HP Spectre x360 14" ,ALC245_FIXUP_HP_X360_AMP ), +SND_PCI_QUIRK (0x103c ,0x87fe ,"HP Laptop 15s-fq2xxx" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x8805 ,"HP ProBook 650 G8 Notebook PC" ,ALC236_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x880d ,"HP EliteBook 830 G8 Notebook PC" ,ALC285_FIXUP_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
Greg Kroah-Hartman
maintainerPATCH 281/417 ALSA: hda/realtek: Enable mute/micmute LEDs and limit mic boost on HP ZBook
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yo-Jung Lin <[email protected]>
commit b018cee7369896c7a15bfdbe88f168f3dbd8ba27 upstream.
On some HP ZBooks, the audio LEDs can be enabled by ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF. So use it accordingly.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9721,6 +9721,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x8c71 ,"HP EliteBook 845 G11" ,ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8c72 ,"HP EliteBook 865 G11" ,ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8c96 ,"HP" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ), +SND_PCI_QUIRK (0x103c ,0x8c97 ,"HP ZBook" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ),SND_PCI_QUIRK (0x103c ,0x8ca4 ,"HP ZBook Fury" ,ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8ca7 ,"HP ZBook Fury" ,ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
Greg Kroah-Hartman
maintainerPATCH 282/417 ALSA: hda/realtek: Enable headset mic on Lenovo M70 Gen5
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bin Li <[email protected]>
commit fb3c007fde80d9d3b4207943e74c150c9116cead upstream.
Lenovo M70 Gen5 is equipped with ALC623, and it needs ALC283_FIXUP_HEADSET_MIC quirk to make its headset mic work.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9980,6 +9980,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x17aa ,0x3176 ,"ThinkCentre Station" ,ALC283_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x17aa ,0x3178 ,"ThinkCentre Station" ,ALC283_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x17aa ,0x31af ,"ThinkCentre Station" ,ALC623_FIXUP_LENOVO_THINKSTATION_P340 ), +SND_PCI_QUIRK (0x17aa ,0x334b ,"Lenovo ThinkCentre M70 Gen5" ,ALC283_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x17aa ,0x3801 ,"Lenovo Yoga9 14IAP7" ,ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN ),SND_PCI_QUIRK (0x17aa ,0x3802 ,"Lenovo Yoga DuetITL 2021" ,ALC287_FIXUP_YOGA7_14ITL_SPEAKERS ), SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
Greg Kroah-Hartman
maintainerPATCH 283/417 ksmbd: validate mech token in session setup
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit 92e470163d96df8db6c4fa0f484e4a229edb903d upstream.
If client send invalid mech token in session setup request, ksmbd validate and make the error if it is invalid.
--- fs/smb/server/asn1.c | 5 +++++ fs/smb/server/connection.h | 1 + fs/smb/server/smb2pdu.c | 22 +++++++++++++++++----- 3 files changed, 23 insertions(+), 5 deletions(-)
fs/smb/server/asn1.c +5 -0
@@ -214,10 +214,15 @@ static int ksmbd_neg_token_alloc(void *c {struct ksmbd_conn *conn = context; +if (!vlen) +return -EINVAL ; + conn->mechToken =kmemdup_nul (value, vlen,GFP_KERNEL );if (!conn->mechToken)return -ENOMEM ; + conn->mechTokenLen = (unsigned int )vlen; +return 0 ; }
fs/smb/server/connection.h +1 -0
@@ -88,6 +88,7 @@ struct ksmbd_conn {__u16 dialect;char *mechToken; +unsigned int mechTokenLen;struct ksmbd_conn_ops *conn_ops;
fs/smb/server/smb2pdu.c +17 -5
@@ -1412,7 +1412,10 @@ static struct ksmbd_user *session_user(schar *name;unsigned int name_off, name_len, secbuf_len; - secbuf_len =le16_to_cpu (req->SecurityBufferLength); +if (conn->use_spnego && conn->mechToken) + secbuf_len = conn->mechTokenLen; +else + secbuf_len =le16_to_cpu (req->SecurityBufferLength);if (secbuf_len <sizeof (struct authenticate_message )) {ksmbd_debug (SMB ,"blob len %d too small\n" , secbuf_len);return NULL ;
@@ -1503,7 +1506,10 @@ static int ntlm_authenticate(struct ksmbstruct authenticate_message *authblob; authblob =user_authblob (conn, req); - sz =le16_to_cpu (req->SecurityBufferLength); +if (conn->use_spnego && conn->mechToken) + sz = conn->mechTokenLen; +else + sz =le16_to_cpu (req->SecurityBufferLength); rc =ksmbd_decode_ntlmssp_auth_blob (authblob, sz, conn, sess);if (rc) {set_user_flag (sess->user,KSMBD_USER_FLAG_BAD_PASSWORD );
@@ -1776,8 +1782,7 @@ int smb2_sess_setup(struct ksmbd_work *w negblob_off =le16_to_cpu (req->SecurityBufferOffset); negblob_len =le16_to_cpu (req->SecurityBufferLength); -if (negblob_off < offsetof(struct smb2_sess_setup_req , Buffer) || - negblob_len < offsetof(struct negotiate_message , NegotiateFlags)) { +if (negblob_off < offsetof(struct smb2_sess_setup_req , Buffer)) { rc = -EINVAL ; goto out_err; }
@@ -1786,8 +1791,15 @@ int smb2_sess_setup(struct ksmbd_work *w negblob_off);if (decode_negotiation_token (conn, negblob, negblob_len) ==0 ) { -if (conn->mechToken) +if (conn->mechToken) { negblob = (struct negotiate_message *)conn->mechToken; + negblob_len = conn->mechTokenLen; + } + } + +if (negblob_len < offsetof(struct negotiate_message , NegotiateFlags)) { + rc = -EINVAL ; + goto out_err; }if (server_conf.auth_mechs & conn->auth_mechs) {
Greg Kroah-Hartman
maintainerPATCH 284/417 ksmbd: fix UAF issue in ksmbd_tcp_new_connection()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit 38d20c62903d669693a1869aa68c4dd5674e2544 upstream.
The race is between the handling of a new TCP connection and its disconnection. It leads to UAF on struct tcp_transport in ksmbd_tcp_new_connection() function.
--- fs/smb/server/connection.c | 6 ------ fs/smb/server/connection.h | 1 - fs/smb/server/transport_rdma.c | 11 ++++++----- fs/smb/server/transport_tcp.c | 13 +++++++------ 4 files changed, 13 insertions(+), 18 deletions(-)
fs/smb/server/connection.c +0 -6
@@ -415,13 +415,7 @@ static void stop_sessions(void) again:down_read (&conn_list_lock);list_for_each_entry (conn, &conn_list, conns_list) { -struct task_struct *task; - t = conn->transport; - task = t->handler; -if (task) -ksmbd_debug (CONN ,"Stop session handler %s/%d\n" , - task->comm,task_pid_nr (task));ksmbd_conn_set_exiting (conn);if (t->ops->shutdown) {up_read (&conn_list_lock);
fs/smb/server/connection.h +0 -1
@@ -135,7 +135,6 @@ struct ksmbd_transport_ops {struct ksmbd_transport {struct ksmbd_conn *conn;struct ksmbd_transport_ops *ops; -struct task_struct *handler; };#define KSMBD_TCP_RECV_TIMEOUT (7 * HZ)
fs/smb/server/transport_rdma.c +6 -5
@@ -2039,6 +2039,7 @@ static bool rdma_frwr_is_supported(strucstatic int smb_direct_handle_connect_request (struct rdma_cm_id *new_cm_id) {struct smb_direct_transport *t; +struct task_struct *handler;int ret;if (!rdma_frwr_is_supported (&new_cm_id->device->attrs)) {
@@ -2056,11 +2057,11 @@ static int smb_direct_handle_connect_reqif (ret) goto out_err; -KSMBD_TRANS (t)->handler =kthread_run (ksmbd_conn_handler_loop, -KSMBD_TRANS (t)->conn,"ksmbd:r%u" , - smb_direct_port); -if (IS_ERR (KSMBD_TRANS (t)->handler)) { - ret =PTR_ERR (KSMBD_TRANS (t)->handler); + handler =kthread_run (ksmbd_conn_handler_loop, +KSMBD_TRANS (t)->conn,"ksmbd:r%u" , + smb_direct_port); +if (IS_ERR (handler)) { + ret =PTR_ERR (handler);pr_err ("Can't start thread\n" ); goto out_err; }
fs/smb/server/transport_tcp.c +7 -6
@@ -185,6 +185,7 @@ static int ksmbd_tcp_new_connection(strustruct sockaddr *csin;int rc =0 ;struct tcp_transport *t; +struct task_struct *handler; t =alloc_transport (client_sk);if (!t) {
@@ -199,13 +200,13 @@ static int ksmbd_tcp_new_connection(stru goto out_error; } -KSMBD_TRANS (t)->handler =kthread_run (ksmbd_conn_handler_loop, -KSMBD_TRANS (t)->conn, -"ksmbd:%u" , -ksmbd_tcp_get_port (csin)); -if (IS_ERR (KSMBD_TRANS (t)->handler)) { + handler =kthread_run (ksmbd_conn_handler_loop, +KSMBD_TRANS (t)->conn, +"ksmbd:%u" , +ksmbd_tcp_get_port (csin)); +if (IS_ERR (handler)) {pr_err ("cannot start conn thread\n" ); - rc =PTR_ERR (KSMBD_TRANS (t)->handler); + rc =PTR_ERR (handler);free_transport (t); }return rc;
Greg Kroah-Hartman
maintainerPATCH 285/417 ksmbd: only v2 leases handle the directory
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namjae Jeon <[email protected]>
commit 77bebd186442a7d703b796784db7495129cc3e70 upstream.
When smb2 leases is disable, ksmbd can send oplock break notification and cause wait oplock break ack timeout. It may appear like hang when accessing a directory. This patch make only v2 leases handle the directory.
--- fs/smb/server/oplock.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/smb/server/oplock.c +6 -0
@@ -1191,6 +1191,12 @@ int smb_grant_oplock(struct ksmbd_work *bool prev_op_has_lease;__le32 prev_op_state =0 ; +/* Only v2 leases handle the directory */ +if (S_ISDIR (file_inode (fp->filp)->i_mode)) { +if (!lctx || lctx->version !=2 ) +return 0 ; + } + opinfo =alloc_opinfo (work, pid, tid);if (!opinfo)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 286/417 io_uring/rw: ensure io->bytes_done is always initialized
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
commit 0a535eddbe0dc1de4386046ab849f08aeb2f8faf upstream.
If IOSQE_ASYNC is set and we fail importing an iovec for a readv or writev request, then we leave ->bytes_done uninitialized and hence the eventual failure CQE posted can potentially have a random res value rather than the expected -EINVAL.
Setup ->bytes_done before potentially failing, so we have a consistent value if we fail the request early.
--- io_uring/rw.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
io_uring/rw.c +7 -3
@@ -534,15 +534,19 @@ static inline int io_rw_prep_async(strucstruct iovec *iov;int ret; + iorw->bytes_done =0 ; + iorw->free_iovec =NULL ; +/* submission path, ->uring_lock should already be taken */ ret =io_import_iovec (rw, req, &iov, &iorw->s,0 );if (unlikely (ret <0 ))return ret; - iorw->bytes_done =0 ; - iorw->free_iovec = iov; -if (iov) +if (iov) { + iorw->free_iovec = iov; req->flags |=REQ_F_NEED_CLEANUP ; + } +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 287/417 fbdev: flush deferred work in fb_deferred_io_fsync()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nam Cao <[email protected]>
commit 15e4c1f462279b4e128f27de48133e0debe9e0df upstream.
The driver's fsync() is supposed to flush any pending operation to hardware. It is implemented in this driver by cancelling the queued deferred IO first, then schedule it for "immediate execution" by calling schedule_delayed_work() again with delay=0. However, setting delay=0 only means the work is scheduled immediately, it does not mean the work is executed immediately. There is no guarantee that the work is finished after schedule_delayed_work() returns. After this driver's fsync() returns, there can still be pending work. Furthermore, if close() is called by users immediately after fsync(), the pending work gets cancelled and fsync() may do nothing.
To ensure that the deferred IO completes, use flush_delayed_work() instead. Write operations to this driver either write to the device directly, or invoke schedule_delayed_work(); so by flushing the workqueue, it can be guaranteed that all previous writes make it to the device.
--- drivers/video/fbdev/core/fb_defio.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
drivers/video/fbdev/core/fb_defio.c +1 -5
@@ -132,11 +132,7 @@ int fb_deferred_io_fsync(struct file *fireturn 0 ;inode_lock (inode); -/* Kill off the delayed work */ -cancel_delayed_work_sync (&info->deferred_work); - -/* Run it immediately */ -schedule_delayed_work (&info->deferred_work,0 ); +flush_delayed_work (&info->deferred_work);inode_unlock (inode);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 288/417 fbdev: flush deferred IO before closing
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nam Cao <[email protected]>
commit 33cd6ea9c0673517cdb06ad5c915c6f22e9615fc upstream.
When framebuffer gets closed, the queued deferred IO gets cancelled. This can cause some last display data to vanish. This is problematic for users who send a still image to the framebuffer, then close the file: the image may never appear.
To ensure none of display data get lost, flush the queued deferred IO first before closing.
Another possible solution is to delete the cancel_delayed_work_sync() instead. The difference is that the display may appear some time after closing. However, the clearing of page mapping after this needs to be removed too, because the page mapping is used by the deferred work. It is not completely obvious whether it is okay to not clear the page mapping. For a patch intended for stable trees, go with the simple and obvious solution.
--- drivers/video/fbdev/core/fb_defio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/fbdev/core/fb_defio.c +1 -1
@@ -317,7 +317,7 @@ static void fb_deferred_io_lastclose(strstruct page *page;int i; -cancel_delayed_work_sync (&info->deferred_work); +flush_delayed_work (&info->deferred_work);/* clear out the mapping that we setup */ for (i =0 ; i < info->fix.smem_len; i +=PAGE_SIZE ) {
Greg Kroah-Hartman
maintainerPATCH 289/417 scsi: ufs: core: Simplify power management during async scan
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit daf7795406bf307997366f694888bd317ae5b5fa upstream.
ufshcd_init() calls pm_runtime_get_sync() before it calls async_schedule(). ufshcd_async_scan() calls pm_runtime_put_sync() directly or indirectly from ufshcd_add_lus(). Simplify ufshcd_async_scan() by always calling pm_runtime_put_sync() from ufshcd_async_scan().
--- drivers/ufs/core/ufshcd.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/ufs/core/ufshcd.c +3 -4
@@ -8204,7 +8204,6 @@ static int ufshcd_add_lus(struct ufs_hbaufs_bsg_probe (hba);ufshpb_init (hba);scsi_scan_host (hba->host); -pm_runtime_put_sync (hba->dev); out:return ret;
@@ -8331,15 +8330,15 @@ static void ufshcd_async_scan(void *data/* Probe and add UFS logical units */ ret =ufshcd_add_lus (hba); + out: +pm_runtime_put_sync (hba->dev);/* * If we failed to initialize the device or the device is not * present, turn off the power/clocks etc. */ -if (ret) { -pm_runtime_put_sync (hba->dev); +if (ret)ufshcd_hba_exit (hba); - } }static const struct attribute_group *ufshcd_driver_groups[] = {
Greg Kroah-Hartman
maintainerPATCH 290/417 scsi: target: core: add missing file_{start,end}_write()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Goldstein <[email protected]>
commit 0db1d53937fafa8bb96e077375691e16902f4899 upstream.
The callers of vfs_iter_write() are required to hold file_start_write(). file_start_write() is a no-op for the S_ISBLK() case, but it is really needed when the backing file is a regular file.
We are going to move file_{start,end}_write() into vfs_iter_write(), but we need to fix this first, so that the fix could be backported to stable kernels.
--- drivers/target/target_core_file.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/target/target_core_file.c +7 -3
@@ -338,11 +338,13 @@ static int fd_do_rw(struct se_cmd *cmd, }iov_iter_bvec (&iter, is_write, bvec, sgl_nents, len); -if (is_write) +if (is_write) { +file_start_write (fd); ret =vfs_iter_write (fd, &iter, &pos,0 ); -else +file_end_write (fd); + }else { ret =vfs_iter_read (fd, &iter, &pos,0 ); - + }if (is_write) {if (ret <0 || ret != data_length) {pr_err ("%s() write returned %d\n" , __func__, ret);
@@ -474,7 +476,9 @@ fd_execute_write_same(struct se_cmd *cmd }iov_iter_bvec (&iter,ITER_SOURCE , bvec, nolb, len); +file_start_write (fd_dev->fd_file); ret =vfs_iter_write (fd_dev->fd_file, &iter, &pos,0 ); +file_end_write (fd_dev->fd_file);kfree (bvec);if (ret <0 || ret != len) {
Greg Kroah-Hartman
maintainerPATCH 291/417 scsi: mpi3mr: Refresh sdev queue depth after controller reset
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chandrakanth patil <[email protected]>
commit e5aab848dfdf7996d20ece4d28d2733c732c5e5a upstream.
After a controller reset, the firmware may modify the device queue depth. Therefore, update the device queue depth accordingly.
--- drivers/scsi/mpi3mr/mpi3mr_os.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/scsi/mpi3mr/mpi3mr_os.c +8 -2
@@ -1044,8 +1044,14 @@ void mpi3mr_rfresh_tgtdevs(struct mpi3mr tgtdev =NULL ;list_for_each_entry (tgtdev, &mrioc->tgtdev_list, list) {if ((tgtdev->dev_handle !=MPI3MR_INVALID_DEV_HANDLE ) && - !tgtdev->is_hidden && !tgtdev->host_exposed) -mpi3mr_report_tgtdev_to_host (mrioc, tgtdev->perst_id); + !tgtdev->is_hidden) { +if (!tgtdev->host_exposed) +mpi3mr_report_tgtdev_to_host (mrioc, + tgtdev->perst_id); +else if (tgtdev->starget) +starget_for_each_device (tgtdev->starget, + (void *)tgtdev, mpi3mr_update_sdev); + } } }
Greg Kroah-Hartman
maintainerPATCH 292/417 scsi: mpi3mr: Block PEL Enable Command on Controller Reset and Unrecoverable State
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chandrakanth patil <[email protected]>
commit f8fb3f39148e8010479e4b2003ba4728818ec661 upstream.
If a controller reset is underway or the controller is in an unrecoverable state, the PEL enable management command will be returned as EAGAIN or EFAULT.
--- drivers/scsi/mpi3mr/mpi3mr_app.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/scsi/mpi3mr/mpi3mr_app.c +16 -0
@@ -223,6 +223,22 @@ static long mpi3mr_bsg_pel_enable(struct mpi3mr_ioc *mrioc,return rval; } +if (mrioc->unrecoverable) { +dprint_bsg_err (mrioc,"%s: unrecoverable controller\n" , + __func__); +return -EFAULT ; + } + +if (mrioc->reset_in_progress) { +dprint_bsg_err (mrioc,"%s: reset in progress\n" , __func__); +return -EAGAIN ; + } + +if (mrioc->stop_bsgs) { +dprint_bsg_err (mrioc,"%s: bsgs are blocked\n" , __func__); +return -EAGAIN ; + } +sg_copy_to_buffer (job->request_payload.sg_list, job->request_payload.sg_cnt, &pel_enable,sizeof (pel_enable));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 293/417 md: bypass block throttle for superblock update
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxiao Bi <[email protected]>
commit d6e035aad6c09991da1c667fb83419329a3baed8 upstream.
commit 5e2cf333b7bd ("md/raid5: Wait for MD_SB_CHANGE_PENDING in raid5d") introduced a hung bug and will be reverted in next patch, since the issue that commit is fixing is due to md superblock write is throttled by wbt, to fix it, we can have superblock write bypass block layer throttle.
--- drivers/md/md.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/md/md.c +4 -3
@@ -963,9 +963,10 @@ void md_super_write(struct mddev *mddev,return ; bio =bio_alloc_bioset (rdev->meta_bdev ? rdev->meta_bdev : rdev->bdev, -1 , -REQ_OP_WRITE |REQ_SYNC |REQ_PREFLUSH |REQ_FUA , -GFP_NOIO , &mddev->sync_set); +1 , +REQ_OP_WRITE |REQ_SYNC |REQ_IDLE |REQ_META + |REQ_PREFLUSH |REQ_FUA , +GFP_NOIO , &mddev->sync_set);atomic_inc (&rdev->nr_pending);
Greg Kroah-Hartman
maintainerPATCH 294/417 drm/amd: Enable PCIe PME from D3
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
commit bd1f6a31e7762ebc99b97f3eda5e5ea3708fa792 upstream.
When dGPU is put into BOCO it may be in D3cold but still able send PME on display hotplug event. For this to work it must be enabled as wake source from D3.
When runpm is enabled use pci_wake_from_d3() to mark wakeup as enabled by default.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +2 -0
@@ -2202,6 +2202,8 @@ retry_init:pci_wake_from_d3 (pdev, TRUE); +pci_wake_from_d3 (pdev, TRUE); +/* * For runpm implemented via BACO, PMFW will handle the * timing for BACO in and out:
Greg Kroah-Hartman
maintainerPATCH 295/417 block: add check that partition length needs to be aligned with block size
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Min Li <[email protected]>
commit 6f64f866aa1ae6975c95d805ed51d7e9433a0016 upstream.
Before calling add partition or resize partition, there is no check on whether the length is aligned with the logical block size. If the logical block size of the disk is larger than 512 bytes, then the partition size maybe not the multiple of the logical block size, and when the last sector is read, bio_truncate() will adjust the bio size, resulting in an IO error if the size of the read command is smaller than the logical block size.If integrity data is supported, this will also result in a null pointer dereference when calling bio_integrity_free.
--- block/ioctl.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
block/ioctl.c +7 -4
@@ -18,7 +18,7 @@ static int blkpg_do_ioctl(struct block_d {struct gendisk *disk = bdev->bd_disk;struct blkpg_partition p; -long long start, length; +sector_t start, length;if (disk->flags &GENHD_FL_NO_PART )return -EINVAL ;
@@ -35,14 +35,17 @@ static int blkpg_do_ioctl(struct block_dif (op ==BLKPG_DEL_PARTITION )return bdev_del_partition (disk, p.pno); +if (p.start <0 || p.length <=0 || p.start + p.length <0 ) +return -EINVAL ; +/* Check that the partition is aligned to the block size */ +if (!IS_ALIGNED (p.start | p.length,bdev_logical_block_size (bdev))) +return -EINVAL ; + start = p.start >>SECTOR_SHIFT ; length = p.length >>SECTOR_SHIFT ;switch (op) {case BLKPG_ADD_PARTITION : -/* check if partition is aligned to blocksize */ -if (p.start & (bdev_logical_block_size (bdev) -1 )) -return -EINVAL ;return bdev_add_partition (disk, p.pno, start, length);case BLKPG_RESIZE_PARTITION :return bdev_resize_partition (disk, p.pno, start, length);
Greg Kroah-Hartman
maintainerPATCH 296/417 block: Fix iterating over an empty bio with bio_for_each_folio_all
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox (Oracle) <[email protected]>
commit 7bed6f3d08b7af27b7015da8dc3acf2b9c1f21d7 upstream.
If the bio contains no data, bio_first_folio() calls page_folio() on a NULL pointer and oopses. Move the test that we've reached the end of the bio from bio_next_folio() to bio_first_folio().
--- include/linux/bio.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
include/linux/bio.h +6 -3
@@ -279,6 +279,11 @@ static inline void bio_first_folio(struc {struct bio_vec *bvec =bio_first_bvec_all (bio) + i; +if (unlikely (i >= bio->bi_vcnt)) { + fi->folio =NULL ; +return ; + } + fi->folio =page_folio (bvec->bv_page); fi->offset = bvec->bv_offset +PAGE_SIZE * (bvec->bv_page - &fi->folio->page);
@@ -296,10 +301,8 @@ static inline void bio_next_folio(struct fi->offset =0 ; fi->length =min (folio_size (fi->folio), fi->_seg_count); fi->_next =folio_next (fi->folio); - }else if (fi->_i +1 < bio->bi_vcnt) { -bio_first_folio (fi, bio, fi->_i +1 ); }else { - fi->folio =NULL ; +bio_first_folio (fi, bio, fi->_i +1 ); } }
Greg Kroah-Hartman
maintainerPATCH 297/417 netfilter: nf_tables: check if catch-all set element is active in next generation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
commit b1db244ffd041a49ecc9618e8feb6b5c1afcdaa7 upstream.
When deactivating the catch-all set element, check the state in the next generation that represents this transaction.
This bug uncovered after the recent removal of the element busy mark a2dd0233cbc4 ("netfilter: nf_tables: remove busy mark and gc batch API").
--- net/netfilter/nf_tables_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +1 -1
@@ -6152,7 +6152,7 @@ static int nft_setelem_catchall_deactivalist_for_each_entry (catchall, &set->catchall_list, list) { ext =nft_set_elem_ext (set, catchall->elem); -if (!nft_is_active (net, ext)) +if (!nft_is_active_next (net, ext))continue ;kfree (elem->priv);
Greg Kroah-Hartman
maintainerPATCH 298/417 pwm: jz4740: Dont use dev_err_probe() in .request()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
commit 9320fc509b87b4d795fb37112931e2f4f8b5c55f upstream.
dev_err_probe() is only supposed to be used in probe functions. While it probably doesn't hurt, both the EPROBE_DEFER handling and calling device_set_deferred_probe_reason() are conceptually wrong in the request callback. So replace the call by dev_err() and a separate return statement.
This effectively reverts commit c0bfe9606e03 ("pwm: jz4740: Simplify with dev_err_probe()").
--- drivers/pwm/pwm-jz4740.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/pwm/pwm-jz4740.c +4 -3
@@ -60,9 +60,10 @@ static int jz4740_pwm_request(struct pwmsnprintf (name,sizeof (name),"timer%u" , pwm->hwpwm); clk =clk_get (chip->dev, name); -if (IS_ERR (clk)) -return dev_err_probe (chip->dev,PTR_ERR (clk), -"Failed to get clock\n" ); +if (IS_ERR (clk)) { +dev_err (chip->dev,"error %pe: Failed to get clock\n" , clk); +return PTR_ERR (clk); + } err =clk_prepare_enable (clk);if (err <0 ) {
Greg Kroah-Hartman
maintainerPATCH 299/417 pwm: Fix out-of-bounds access in of_pwm_single_xlate()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
commit a297d07b9a1e4fb8cda25a4a2363a507d294b7c9 upstream.
With args->args_count == 2 args->args[2] is not defined. Actually the flags are contained in args->args[1].
--- drivers/pwm/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pwm/core.c +1 -1
@@ -171,7 +171,7 @@ of_pwm_single_xlate(struct pwm_chip *pc, pwm->args.period = args->args[0 ]; pwm->args.polarity =PWM_POLARITY_NORMAL ; -if (args->args_count ==2 && args->args[2 ] &PWM_POLARITY_INVERTED ) +if (args->args_count ==2 && args->args[1 ] &PWM_POLARITY_INVERTED ) pwm->args.polarity =PWM_POLARITY_INVERSED ;return pwm;
Greg Kroah-Hartman
maintainerPATCH 300/417 md/raid1: Use blk_opf_t for read and write operations
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit 7dab24554dedd4e6f408af8eb2d25c89997a6a1f upstream.
Use the type blk_opf_t for read and write operations instead of int. This patch does not affect the generated code but fixes the following sparse warning:
drivers/md/raid1.c:1993:60: sparse: sparse: incorrect type in argument 5 (different base types)
expected restricted blk_opf_t [usertype] opf
got int rw
--- drivers/md/raid1.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/md/raid1.c +6 -6
@@ -1972,12 +1972,12 @@ static void end_sync_write(struct bio *b }static int r1_sync_page_io (struct md_rdev *rdev,sector_t sector, -int sectors,struct page *page,int rw) +int sectors,struct page *page,blk_opf_t rw) {if (sync_page_io (rdev, sector, sectors <<9 , page, rw, false))/* success */ return 1 ; -if (rw ==WRITE ) { +if (rw ==REQ_OP_WRITE ) {set_bit (WriteErrorSeen, &rdev->flags);if (!test_and_set_bit (WantReplacement, &rdev->flags))
@@ -2094,7 +2094,7 @@ static int fix_sync_read_error(struct r1 rdev = conf->mirrors[d].rdev;if (r1_sync_page_io (rdev, sect, s, pages[idx], -WRITE ) ==0 ) { +REQ_OP_WRITE ) ==0 ) { r1_bio->bios[d]->bi_end_io =NULL ;rdev_dec_pending (rdev, mddev); }
@@ -2109,7 +2109,7 @@ static int fix_sync_read_error(struct r1 rdev = conf->mirrors[d].rdev;if (r1_sync_page_io (rdev, sect, s, pages[idx], -READ ) !=0 ) +REQ_OP_READ ) !=0 )atomic_add (s, &rdev->corrected_errors); } sectors -= s;
@@ -2321,7 +2321,7 @@ static void fix_read_error(struct r1confatomic_inc (&rdev->nr_pending);rcu_read_unlock ();r1_sync_page_io (rdev, sect, s, - conf->tmppage,WRITE ); + conf->tmppage,REQ_OP_WRITE );rdev_dec_pending (rdev, mddev); }else rcu_read_unlock ();
@@ -2338,7 +2338,7 @@ static void fix_read_error(struct r1confatomic_inc (&rdev->nr_pending);rcu_read_unlock ();if (r1_sync_page_io (rdev, sect, s, - conf->tmppage,READ )) { + conf->tmppage,REQ_OP_READ )) {atomic_add (s, &rdev->corrected_errors); pr_info("md/raid1:%s: read error corrected (%d sectors at %llu on %pg)\n", mdname(mddev), s,
Greg Kroah-Hartman
maintainerPATCH 301/417 rootfs: Fix support for rootfstype= when root= is given
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Berger <[email protected]>
commit 21528c69a0d8483f7c6345b1a0bc8d8975e9a172 upstream.
Documentation/filesystems/ramfs-rootfs-initramfs.rst states:
If CONFIG_TMPFS is enabled, rootfs will use tmpfs instead of ramfs by default. To force ramfs, add "rootfstype=ramfs" to the kernel command line.
This currently does not work when root= is provided since then saved_root_name contains a string and rootfstype= is ignored. Therefore, ramfs is currently always chosen when root= is provided.
The current behavior for rootfs's filesystem is:
root= | rootfstype= | chosen rootfs filesystem
------------+-------------+--------------------------
unspecified | unspecified | tmpfs
unspecified | tmpfs | tmpfs
unspecified | ramfs | ramfs
provided | ignored | ramfsrootfstype= should be respected regardless whether root= is given, as shown below:
root= | rootfstype= | chosen rootfs filesystem
------------+-------------+--------------------------
unspecified | unspecified | tmpfs (as before)
unspecified | tmpfs | tmpfs (as before)
unspecified | ramfs | ramfs (as before)
provided | unspecified | ramfs (compatibility with before)
provided | tmpfs | tmpfs (new)
provided | ramfs | ramfs (new)This table represents the new behavior.
--- init/do_mounts.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
init/do_mounts.c +6 -3
@@ -665,7 +665,10 @@ struct file_system_type rootfs_fs_type =void __init init_rootfs (void ) { -if (IS_ENABLED (CONFIG_TMPFS ) && !saved_root_name[0 ] && - (!root_fs_names ||strstr (root_fs_names,"tmpfs" ))) - is_tmpfs = true; +if (IS_ENABLED (CONFIG_TMPFS )) { +if (!saved_root_name[0 ] && !root_fs_names) + is_tmpfs = true; +else if (root_fs_names && !!strstr (root_fs_names,"tmpfs" )) + is_tmpfs = true; + } }
Greg Kroah-Hartman
maintainerPATCH 302/417 Bluetooth: Fix atomicity violation in {min,max}_key_size_set
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gui-Dong Han <[email protected]>
commit da9065caa594d19b26e1a030fd0cc27bd365d685 upstream.
In min_key_size_set():
if (val > hdev->le_max_key_size || val < SMP_MIN_ENC_KEY_SIZE)
return -EINVAL;
hci_dev_lock(hdev);
hdev->le_min_key_size = val;
hci_dev_unlock(hdev);In max_key_size_set():
if (val > SMP_MAX_ENC_KEY_SIZE || val < hdev->le_min_key_size)
return -EINVAL;
hci_dev_lock(hdev);
hdev->le_max_key_size = val;
hci_dev_unlock(hdev);The atomicity violation occurs due to concurrent execution of set_min and set_max funcs.Consider a scenario where setmin writes a new, valid 'min' value, and concurrently, setmax writes a value that is greater than the old 'min' but smaller than the new 'min'. In this case, setmax might check against the old 'min' value (before acquiring the lock) but write its value after the 'min' has been updated by setmin. This leads to a situation where the 'max' value ends up being smaller than the 'min' value, which is an inconsistency.
This possible bug is found by an experimental static analysis tool developed by our team, BassCheck[1]. This tool analyzes the locking APIs to extract function pairs that can be concurrently executed, and then analyzes the instructions in the paired functions to identify possible concurrency bugs including data races and atomicity violations. The above possible bug is reported when our tool analyzes the source code of Linux 5.17.
To resolve this issue, it is suggested to encompass the validity checks within the locked sections in both set_min and set_max funcs. The modification ensures that the validation of 'val' against the current min/max values is atomic, thus maintaining the integrity of the settings. With this patch applied, our tool no longer reports the bug, with the kernel configuration allyesconfig for x86_64. Due to the lack of associated hardware, we cannot test the patch in runtime testing, and just verify it according to the code logic.
[1] https://sites.google.com/view/basscheck/
--- net/bluetooth/hci_debugfs.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
net/bluetooth/hci_debugfs.c +8 -4
@@ -1045,10 +1045,12 @@ static int min_key_size_set(void *data, {struct hci_dev *hdev = data; -if (val > hdev->le_max_key_size || val <SMP_MIN_ENC_KEY_SIZE ) +hci_dev_lock (hdev); +if (val > hdev->le_max_key_size || val <SMP_MIN_ENC_KEY_SIZE ) { +hci_dev_unlock (hdev);return -EINVAL ; + } -hci_dev_lock (hdev); hdev->le_min_key_size = val;hci_dev_unlock (hdev);
@@ -1073,10 +1075,12 @@ static int max_key_size_set(void *data, {struct hci_dev *hdev = data; -if (val >SMP_MAX_ENC_KEY_SIZE || val < hdev->le_min_key_size) +hci_dev_lock (hdev); +if (val >SMP_MAX_ENC_KEY_SIZE || val < hdev->le_min_key_size) { +hci_dev_unlock (hdev);return -EINVAL ; + } -hci_dev_lock (hdev); hdev->le_max_key_size = val;hci_dev_unlock (hdev);
Greg Kroah-Hartman
maintainerPATCH 303/417 bpf: Fix re-attachment branch in bpf_tracing_prog_attach
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
commit 715d82ba636cb3629a6e18a33bb9dbe53f9936ee upstream.
The following case can cause a crash due to missing attach_btf:
1) load rawtp program
2) load fentry program with rawtp as target_fd
3) create tracing link for fentry program with target_fd = 0
4) repeat 3
In the end we have:
- prog->aux->dst_trampoline == NULL
- tgt_prog == NULL (because we did not provide target_fd to link_create)
- prog->aux->attach_btf == NULL (the program was loaded with attach_prog_fd=X)
- the program was loaded for tgt_prog but we have no way to find out which one
BUG: kernel NULL pointer dereference, address: 0000000000000058
Call Trace:
<TASK>
? __die+0x20/0x70
? page_fault_oops+0x15b/0x430
? fixup_exception+0x22/0x330
? exc_page_fault+0x6f/0x170
? asm_exc_page_fault+0x22/0x30
? bpf_tracing_prog_attach+0x279/0x560
? btf_obj_id+0x5/0x10
bpf_tracing_prog_attach+0x439/0x560
__sys_bpf+0x1cf4/0x2de0
__x64_sys_bpf+0x1c/0x30
do_syscall_64+0x41/0xf0
entry_SYSCALL_64_after_hwframe+0x6e/0x76Return -EINVAL in this situation.
--- kernel/bpf/syscall.c | 9 +++++++++ 1 file changed, 9 insertions(+)
kernel/bpf/syscall.c +9 -0
@@ -3058,6 +3058,10 @@ static int bpf_tracing_prog_attach(struc* * - if prog->aux->dst_trampoline and tgt_prog is NULL, the program * was detached and is going for re-attachment. +* +* - if prog->aux->dst_trampoline is NULL and tgt_prog and prog->aux->attach_btf +* are NULL, then program was already attached and user did not provide +* tgt_prog_fd so we have no way to find out or create trampoline */ if (!prog->aux->dst_trampoline && !tgt_prog) {/*
@@ -3071,6 +3075,11 @@ static int bpf_tracing_prog_attach(struc err = -EINVAL ; goto out_unlock; } +/* We can allow re-attach only if we have valid attach_btf. */ +if (!prog->aux->attach_btf) { + err = -EINVAL ; + goto out_unlock; + } btf_id = prog->aux->attach_btf_id; key =bpf_trampoline_compute_key (NULL , prog->aux->attach_btf, btf_id); }