]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.19
authorSasha Levin <sashal@kernel.org>
Sun, 11 Jun 2023 02:02:41 +0000 (22:02 -0400)
committerSasha Levin <sashal@kernel.org>
Sun, 11 Jun 2023 02:02:41 +0000 (22:02 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.19/bluetooth-fix-l2cap_disconnect_req-deadlock.patch [new file with mode: 0644]
queue-4.19/bluetooth-l2cap-add-missing-checks-for-invalid-dcid.patch [new file with mode: 0644]
queue-4.19/lib-cpu_rmap-fix-potential-use-after-free-in-irq_cpu.patch [new file with mode: 0644]
queue-4.19/net-dsa-lan9303-allow-vid-0-in-port_fdb_-add-del-met.patch [new file with mode: 0644]
queue-4.19/net-sched-fix-possible-refcount-leak-in-tc_chain_tmp.patch [new file with mode: 0644]
queue-4.19/net-sched-move-rtm_tca_policy-declaration-to-include.patch [new file with mode: 0644]
queue-4.19/rfs-annotate-lockless-accesses-to-rfs-sock-flow-tabl.patch [new file with mode: 0644]
queue-4.19/rfs-annotate-lockless-accesses-to-sk-sk_rxhash.patch [new file with mode: 0644]
queue-4.19/series
queue-4.19/spi-qup-request-dma-before-enabling-clocks.patch [new file with mode: 0644]

diff --git a/queue-4.19/bluetooth-fix-l2cap_disconnect_req-deadlock.patch b/queue-4.19/bluetooth-fix-l2cap_disconnect_req-deadlock.patch
new file mode 100644 (file)
index 0000000..3ef6e41
--- /dev/null
@@ -0,0 +1,61 @@
+From 122dd7bddcee8d7bb1c0a5b20e9369bfc4ca1992 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 31 May 2023 03:44:56 +0000
+Subject: Bluetooth: Fix l2cap_disconnect_req deadlock
+
+From: Ying Hsu <yinghsu@chromium.org>
+
+[ Upstream commit 02c5ea5246a44d6ffde0fddebfc1d56188052976 ]
+
+L2CAP assumes that the locks conn->chan_lock and chan->lock are
+acquired in the order conn->chan_lock, chan->lock to avoid
+potential deadlock.
+For example, l2sock_shutdown acquires these locks in the order:
+  mutex_lock(&conn->chan_lock)
+  l2cap_chan_lock(chan)
+
+However, l2cap_disconnect_req acquires chan->lock in
+l2cap_get_chan_by_scid first and then acquires conn->chan_lock
+before calling l2cap_chan_del. This means that these locks are
+acquired in unexpected order, which leads to potential deadlock:
+  l2cap_chan_lock(c)
+  mutex_lock(&conn->chan_lock)
+
+This patch releases chan->lock before acquiring the conn_chan_lock
+to avoid the potential deadlock.
+
+Fixes: a2a9339e1c9d ("Bluetooth: L2CAP: Fix use-after-free in l2cap_disconnect_{req,rsp}")
+Signed-off-by: Ying Hsu <yinghsu@chromium.org>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bluetooth/l2cap_core.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
+index 94d40a20ab958..d91ddcd54e278 100644
+--- a/net/bluetooth/l2cap_core.c
++++ b/net/bluetooth/l2cap_core.c
+@@ -4362,7 +4362,9 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
+       chan->ops->set_shutdown(chan);
++      l2cap_chan_unlock(chan);
+       mutex_lock(&conn->chan_lock);
++      l2cap_chan_lock(chan);
+       l2cap_chan_del(chan, ECONNRESET);
+       mutex_unlock(&conn->chan_lock);
+@@ -4401,7 +4403,9 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
+               return 0;
+       }
++      l2cap_chan_unlock(chan);
+       mutex_lock(&conn->chan_lock);
++      l2cap_chan_lock(chan);
+       l2cap_chan_del(chan, 0);
+       mutex_unlock(&conn->chan_lock);
+-- 
+2.39.2
+
diff --git a/queue-4.19/bluetooth-l2cap-add-missing-checks-for-invalid-dcid.patch b/queue-4.19/bluetooth-l2cap-add-missing-checks-for-invalid-dcid.patch
new file mode 100644 (file)
index 0000000..577224e
--- /dev/null
@@ -0,0 +1,53 @@
+From 0efe25af0da0ecbdf7fda2ca4c4c56e168e9b266 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 3 Jun 2023 08:28:09 -0400
+Subject: Bluetooth: L2CAP: Add missing checks for invalid DCID
+
+From: Sungwoo Kim <iam@sung-woo.kim>
+
+[ Upstream commit 75767213f3d9b97f63694d02260b6a49a2271876 ]
+
+When receiving a connect response we should make sure that the DCID is
+within the valid range and that we don't already have another channel
+allocated for the same DCID.
+Missing checks may violate the specification (BLUETOOTH CORE SPECIFICATION
+Version 5.4 | Vol 3, Part A, Page 1046).
+
+Fixes: 40624183c202 ("Bluetooth: L2CAP: Add missing checks for invalid LE DCID")
+Signed-off-by: Sungwoo Kim <iam@sung-woo.kim>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bluetooth/l2cap_core.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
+index d91ddcd54e278..fcc471f921895 100644
+--- a/net/bluetooth/l2cap_core.c
++++ b/net/bluetooth/l2cap_core.c
+@@ -4007,6 +4007,10 @@ static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
+       result = __le16_to_cpu(rsp->result);
+       status = __le16_to_cpu(rsp->status);
++      if (result == L2CAP_CR_SUCCESS && (dcid < L2CAP_CID_DYN_START ||
++                                         dcid > L2CAP_CID_DYN_END))
++              return -EPROTO;
++
+       BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x",
+              dcid, scid, result, status);
+@@ -4038,6 +4042,11 @@ static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
+       switch (result) {
+       case L2CAP_CR_SUCCESS:
++              if (__l2cap_get_chan_by_dcid(conn, dcid)) {
++                      err = -EBADSLT;
++                      break;
++              }
++
+               l2cap_state_change(chan, BT_CONFIG);
+               chan->ident = 0;
+               chan->dcid = dcid;
+-- 
+2.39.2
+
diff --git a/queue-4.19/lib-cpu_rmap-fix-potential-use-after-free-in-irq_cpu.patch b/queue-4.19/lib-cpu_rmap-fix-potential-use-after-free-in-irq_cpu.patch
new file mode 100644 (file)
index 0000000..b371ca4
--- /dev/null
@@ -0,0 +1,40 @@
+From e39450775c9e4924e60c04a852156a0302e09118 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 2 Jun 2023 20:28:15 +0200
+Subject: lib: cpu_rmap: Fix potential use-after-free in irq_cpu_rmap_release()
+
+From: Ben Hutchings <ben@decadent.org.uk>
+
+[ Upstream commit 7c5d4801ecf0564c860033d89726b99723c55146 ]
+
+irq_cpu_rmap_release() calls cpu_rmap_put(), which may free the rmap.
+So we need to clear the pointer to our glue structure in rmap before
+doing that, not after.
+
+Fixes: 4e0473f1060a ("lib: cpu_rmap: Avoid use after free on rmap->obj array entries")
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Link: https://lore.kernel.org/r/ZHo0vwquhOy3FaXc@decadent.org.uk
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/cpu_rmap.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/cpu_rmap.c b/lib/cpu_rmap.c
+index f52389054a24f..a0de1b2579f71 100644
+--- a/lib/cpu_rmap.c
++++ b/lib/cpu_rmap.c
+@@ -271,8 +271,8 @@ static void irq_cpu_rmap_release(struct kref *ref)
+       struct irq_glue *glue =
+               container_of(ref, struct irq_glue, notify.kref);
+-      cpu_rmap_put(glue->rmap);
+       glue->rmap->obj[glue->index] = NULL;
++      cpu_rmap_put(glue->rmap);
+       kfree(glue);
+ }
+-- 
+2.39.2
+
diff --git a/queue-4.19/net-dsa-lan9303-allow-vid-0-in-port_fdb_-add-del-met.patch b/queue-4.19/net-dsa-lan9303-allow-vid-0-in-port_fdb_-add-del-met.patch
new file mode 100644 (file)
index 0000000..9d06eb8
--- /dev/null
@@ -0,0 +1,56 @@
+From bc6a9bca0f5ec5d92b20d0cab4dd88bd4cd0df26 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 31 May 2023 16:38:26 +0200
+Subject: net: dsa: lan9303: allow vid != 0 in port_fdb_{add|del} methods
+
+From: Alexander Sverdlin <alexander.sverdlin@siemens.com>
+
+[ Upstream commit 5a59a58ec25d44f853c26bdbfda47d73b3067435 ]
+
+LAN9303 doesn't associate FDB (ALR) entries with VLANs, it has just one
+global Address Logic Resolution table [1].
+
+Ignore VID in port_fdb_{add|del} methods, go on with the global table. This
+is the same semantics as hellcreek or RZ/N1 implement.
+
+Visible symptoms:
+LAN9303_MDIO 5b050000.ethernet-1:00: port 2 failed to delete 00:xx:xx:xx:xx:cf vid 1 from fdb: -2
+LAN9303_MDIO 5b050000.ethernet-1:00: port 2 failed to add 00:xx:xx:xx:xx:cf vid 1 to fdb: -95
+
+[1] https://ww1.microchip.com/downloads/en/DeviceDoc/00002308A.pdf
+
+Fixes: 0620427ea0d6 ("net: dsa: lan9303: Add fdb/mdb manipulation")
+Signed-off-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
+Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
+Link: https://lore.kernel.org/r/20230531143826.477267-1-alexander.sverdlin@siemens.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/lan9303-core.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
+index f976b3d64593a..80ac5efb0a7a9 100644
+--- a/drivers/net/dsa/lan9303-core.c
++++ b/drivers/net/dsa/lan9303-core.c
+@@ -1191,8 +1191,6 @@ static int lan9303_port_fdb_add(struct dsa_switch *ds, int port,
+       struct lan9303 *chip = ds->priv;
+       dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, addr, vid);
+-      if (vid)
+-              return -EOPNOTSUPP;
+       return lan9303_alr_add_port(chip, addr, port, false);
+ }
+@@ -1204,8 +1202,6 @@ static int lan9303_port_fdb_del(struct dsa_switch *ds, int port,
+       struct lan9303 *chip = ds->priv;
+       dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, addr, vid);
+-      if (vid)
+-              return -EOPNOTSUPP;
+       lan9303_alr_del_port(chip, addr, port);
+       return 0;
+-- 
+2.39.2
+
diff --git a/queue-4.19/net-sched-fix-possible-refcount-leak-in-tc_chain_tmp.patch b/queue-4.19/net-sched-fix-possible-refcount-leak-in-tc_chain_tmp.patch
new file mode 100644 (file)
index 0000000..e746423
--- /dev/null
@@ -0,0 +1,37 @@
+From 76a0357ff51005c3a2e3a2d281081165bcde65f4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 7 Jun 2023 10:23:01 +0800
+Subject: net: sched: fix possible refcount leak in tc_chain_tmplt_add()
+
+From: Hangyu Hua <hbh25y@gmail.com>
+
+[ Upstream commit 44f8baaf230c655c249467ca415b570deca8df77 ]
+
+try_module_get will be called in tcf_proto_lookup_ops. So module_put needs
+to be called to drop the refcount if ops don't implement the required
+function.
+
+Fixes: 9f407f1768d3 ("net: sched: introduce chain templates")
+Signed-off-by: Hangyu Hua <hbh25y@gmail.com>
+Reviewed-by: Larysa Zaremba <larysa.zaremba@intel.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sched/cls_api.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
+index fdd4af137c9fe..6166bbad97536 100644
+--- a/net/sched/cls_api.c
++++ b/net/sched/cls_api.c
+@@ -1838,6 +1838,7 @@ static int tc_chain_tmplt_add(struct tcf_chain *chain, struct net *net,
+               return PTR_ERR(ops);
+       if (!ops->tmplt_create || !ops->tmplt_destroy || !ops->tmplt_dump) {
+               NL_SET_ERR_MSG(extack, "Chain templates are not supported with specified classifier");
++              module_put(ops->owner);
+               return -EOPNOTSUPP;
+       }
+-- 
+2.39.2
+
diff --git a/queue-4.19/net-sched-move-rtm_tca_policy-declaration-to-include.patch b/queue-4.19/net-sched-move-rtm_tca_policy-declaration-to-include.patch
new file mode 100644 (file)
index 0000000..54463a3
--- /dev/null
@@ -0,0 +1,54 @@
+From 640bc5cbc6da75d698e47b8d0fb3aa56d0894aa2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 6 Jun 2023 11:42:33 +0000
+Subject: net: sched: move rtm_tca_policy declaration to include file
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 886bc7d6ed3357975c5f1d3c784da96000d4bbb4 ]
+
+rtm_tca_policy is used from net/sched/sch_api.c and net/sched/cls_api.c,
+thus should be declared in an include file.
+
+This fixes the following sparse warning:
+net/sched/sch_api.c:1434:25: warning: symbol 'rtm_tca_policy' was not declared. Should it be static?
+
+Fixes: e331473fee3d ("net/sched: cls_api: add missing validation of netlink attributes")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/pkt_sched.h | 2 ++
+ net/sched/cls_api.c     | 2 --
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h
+index 1a6ac924266db..e09ea6917c061 100644
+--- a/include/net/pkt_sched.h
++++ b/include/net/pkt_sched.h
+@@ -124,6 +124,8 @@ static inline void qdisc_run(struct Qdisc *q)
+       }
+ }
++extern const struct nla_policy rtm_tca_policy[TCA_MAX + 1];
++
+ /* Calculate maximal size of packet seen by hard_start_xmit
+    routine of this device.
+  */
+diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
+index 435911dc9f16a..fdd4af137c9fe 100644
+--- a/net/sched/cls_api.c
++++ b/net/sched/cls_api.c
+@@ -31,8 +31,6 @@
+ #include <net/pkt_sched.h>
+ #include <net/pkt_cls.h>
+-extern const struct nla_policy rtm_tca_policy[TCA_MAX + 1];
+-
+ /* The list of all installed classifier types */
+ static LIST_HEAD(tcf_proto_base);
+-- 
+2.39.2
+
diff --git a/queue-4.19/rfs-annotate-lockless-accesses-to-rfs-sock-flow-tabl.patch b/queue-4.19/rfs-annotate-lockless-accesses-to-rfs-sock-flow-tabl.patch
new file mode 100644 (file)
index 0000000..f243bb5
--- /dev/null
@@ -0,0 +1,67 @@
+From 2ae0def59011a96bd03906d63b75f05eb75f3f45 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 6 Jun 2023 07:41:15 +0000
+Subject: rfs: annotate lockless accesses to RFS sock flow table
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 5c3b74a92aa285a3df722bf6329ba7ccf70346d6 ]
+
+Add READ_ONCE()/WRITE_ONCE() on accesses to the sock flow table.
+
+This also prevents a (smart ?) compiler to remove the condition in:
+
+if (table->ents[index] != newval)
+        table->ents[index] = newval;
+
+We need the condition to avoid dirtying a shared cache line.
+
+Fixes: fec5e652e58f ("rfs: Receive Flow Steering")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/netdevice.h | 7 +++++--
+ net/core/dev.c            | 6 ++++--
+ 2 files changed, 9 insertions(+), 4 deletions(-)
+
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index 4d0f48e74755d..64c4ff699e471 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -695,8 +695,11 @@ static inline void rps_record_sock_flow(struct rps_sock_flow_table *table,
+               /* We only give a hint, preemption can change CPU under us */
+               val |= raw_smp_processor_id();
+-              if (table->ents[index] != val)
+-                      table->ents[index] = val;
++              /* The following WRITE_ONCE() is paired with the READ_ONCE()
++               * here, and another one in get_rps_cpu().
++               */
++              if (READ_ONCE(table->ents[index]) != val)
++                      WRITE_ONCE(table->ents[index], val);
+       }
+ }
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 03903d3f1d695..ba99adcd70878 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -4064,8 +4064,10 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
+               u32 next_cpu;
+               u32 ident;
+-              /* First check into global flow table if there is a match */
+-              ident = sock_flow_table->ents[hash & sock_flow_table->mask];
++              /* First check into global flow table if there is a match.
++               * This READ_ONCE() pairs with WRITE_ONCE() from rps_record_sock_flow().
++               */
++              ident = READ_ONCE(sock_flow_table->ents[hash & sock_flow_table->mask]);
+               if ((ident ^ hash) & ~rps_cpu_mask)
+                       goto try_rps;
+-- 
+2.39.2
+
diff --git a/queue-4.19/rfs-annotate-lockless-accesses-to-sk-sk_rxhash.patch b/queue-4.19/rfs-annotate-lockless-accesses-to-sk-sk_rxhash.patch
new file mode 100644 (file)
index 0000000..f05a60c
--- /dev/null
@@ -0,0 +1,73 @@
+From 5b1bd1924ac01b5521345435d2db41dac3e86451 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 6 Jun 2023 07:41:14 +0000
+Subject: rfs: annotate lockless accesses to sk->sk_rxhash
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 1e5c647c3f6d4f8497dedcd226204e1880e0ffb3 ]
+
+Add READ_ONCE()/WRITE_ONCE() on accesses to sk->sk_rxhash.
+
+This also prevents a (smart ?) compiler to remove the condition in:
+
+if (sk->sk_rxhash != newval)
+       sk->sk_rxhash = newval;
+
+We need the condition to avoid dirtying a shared cache line.
+
+Fixes: fec5e652e58f ("rfs: Receive Flow Steering")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reviewed-by: Simon Horman <simon.horman@corigine.com>
+Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/sock.h | 18 +++++++++++++-----
+ 1 file changed, 13 insertions(+), 5 deletions(-)
+
+diff --git a/include/net/sock.h b/include/net/sock.h
+index c140c6f86e4b1..616e84d1670df 100644
+--- a/include/net/sock.h
++++ b/include/net/sock.h
+@@ -988,8 +988,12 @@ static inline void sock_rps_record_flow(const struct sock *sk)
+                * OR   an additional socket flag
+                * [1] : sk_state and sk_prot are in the same cache line.
+                */
+-              if (sk->sk_state == TCP_ESTABLISHED)
+-                      sock_rps_record_flow_hash(sk->sk_rxhash);
++              if (sk->sk_state == TCP_ESTABLISHED) {
++                      /* This READ_ONCE() is paired with the WRITE_ONCE()
++                       * from sock_rps_save_rxhash() and sock_rps_reset_rxhash().
++                       */
++                      sock_rps_record_flow_hash(READ_ONCE(sk->sk_rxhash));
++              }
+       }
+ #endif
+ }
+@@ -998,15 +1002,19 @@ static inline void sock_rps_save_rxhash(struct sock *sk,
+                                       const struct sk_buff *skb)
+ {
+ #ifdef CONFIG_RPS
+-      if (unlikely(sk->sk_rxhash != skb->hash))
+-              sk->sk_rxhash = skb->hash;
++      /* The following WRITE_ONCE() is paired with the READ_ONCE()
++       * here, and another one in sock_rps_record_flow().
++       */
++      if (unlikely(READ_ONCE(sk->sk_rxhash) != skb->hash))
++              WRITE_ONCE(sk->sk_rxhash, skb->hash);
+ #endif
+ }
+ static inline void sock_rps_reset_rxhash(struct sock *sk)
+ {
+ #ifdef CONFIG_RPS
+-      sk->sk_rxhash = 0;
++      /* Paired with READ_ONCE() in sock_rps_record_flow() */
++      WRITE_ONCE(sk->sk_rxhash, 0);
+ #endif
+ }
+-- 
+2.39.2
+
index 73e29108aea463617609fe9e522484ac45567be4..c04e3665c0e18b9532ec6dc100e394c46a341965 100644 (file)
@@ -1,2 +1,11 @@
 i40iw-fix-build-warning-in-i40iw_manage_apbvt.patch
 i40e-fix-build-warnings-in-i40e_alloc.h.patch
+spi-qup-request-dma-before-enabling-clocks.patch
+net-dsa-lan9303-allow-vid-0-in-port_fdb_-add-del-met.patch
+bluetooth-fix-l2cap_disconnect_req-deadlock.patch
+bluetooth-l2cap-add-missing-checks-for-invalid-dcid.patch
+rfs-annotate-lockless-accesses-to-sk-sk_rxhash.patch
+rfs-annotate-lockless-accesses-to-rfs-sock-flow-tabl.patch
+net-sched-move-rtm_tca_policy-declaration-to-include.patch
+net-sched-fix-possible-refcount-leak-in-tc_chain_tmp.patch
+lib-cpu_rmap-fix-potential-use-after-free-in-irq_cpu.patch
diff --git a/queue-4.19/spi-qup-request-dma-before-enabling-clocks.patch b/queue-4.19/spi-qup-request-dma-before-enabling-clocks.patch
new file mode 100644 (file)
index 0000000..62d36df
--- /dev/null
@@ -0,0 +1,122 @@
+From b54d289eb7f804f36a4fe76a6f20e1509fd7e85f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 18 May 2023 15:04:25 +0200
+Subject: spi: qup: Request DMA before enabling clocks
+
+From: Stephan Gerhold <stephan@gerhold.net>
+
+[ Upstream commit 0c331fd1dccfba657129380ee084b95c1cedfbef ]
+
+It is usually better to request all necessary resources (clocks,
+regulators, ...) before starting to make use of them. That way they do
+not change state in case one of the resources is not available yet and
+probe deferral (-EPROBE_DEFER) is necessary. This is particularly
+important for DMA channels and IOMMUs which are not enforced by
+fw_devlink yet (unless you use fw_devlink.strict=1).
+
+spi-qup does this in the wrong order, the clocks are enabled and
+disabled again when the DMA channels are not available yet.
+
+This causes issues in some cases: On most SoCs one of the SPI QUP
+clocks is shared with the UART controller. When using earlycon UART is
+actively used during boot but might not have probed yet, usually for
+the same reason (waiting for the DMA controller). In this case, the
+brief enable/disable cycle ends up gating the clock and further UART
+console output will halt the system completely.
+
+Avoid this by requesting the DMA channels before changing the clock
+state.
+
+Fixes: 612762e82ae6 ("spi: qup: Add DMA capabilities")
+Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
+Link: https://lore.kernel.org/r/20230518-spi-qup-clk-defer-v1-1-f49fc9ca4e02@gerhold.net
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/spi/spi-qup.c | 37 ++++++++++++++++++-------------------
+ 1 file changed, 18 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c
+index defe959884dae..1518a8bf49be1 100644
+--- a/drivers/spi/spi-qup.c
++++ b/drivers/spi/spi-qup.c
+@@ -1003,23 +1003,8 @@ static int spi_qup_probe(struct platform_device *pdev)
+               return -ENXIO;
+       }
+-      ret = clk_prepare_enable(cclk);
+-      if (ret) {
+-              dev_err(dev, "cannot enable core clock\n");
+-              return ret;
+-      }
+-
+-      ret = clk_prepare_enable(iclk);
+-      if (ret) {
+-              clk_disable_unprepare(cclk);
+-              dev_err(dev, "cannot enable iface clock\n");
+-              return ret;
+-      }
+-
+       master = spi_alloc_master(dev, sizeof(struct spi_qup));
+       if (!master) {
+-              clk_disable_unprepare(cclk);
+-              clk_disable_unprepare(iclk);
+               dev_err(dev, "cannot allocate master\n");
+               return -ENOMEM;
+       }
+@@ -1065,6 +1050,19 @@ static int spi_qup_probe(struct platform_device *pdev)
+       spin_lock_init(&controller->lock);
+       init_completion(&controller->done);
++      ret = clk_prepare_enable(cclk);
++      if (ret) {
++              dev_err(dev, "cannot enable core clock\n");
++              goto error_dma;
++      }
++
++      ret = clk_prepare_enable(iclk);
++      if (ret) {
++              clk_disable_unprepare(cclk);
++              dev_err(dev, "cannot enable iface clock\n");
++              goto error_dma;
++      }
++
+       iomode = readl_relaxed(base + QUP_IO_M_MODES);
+       size = QUP_IO_M_OUTPUT_BLOCK_SIZE(iomode);
+@@ -1094,7 +1092,7 @@ static int spi_qup_probe(struct platform_device *pdev)
+       ret = spi_qup_set_state(controller, QUP_STATE_RESET);
+       if (ret) {
+               dev_err(dev, "cannot set RESET state\n");
+-              goto error_dma;
++              goto error_clk;
+       }
+       writel_relaxed(0, base + QUP_OPERATIONAL);
+@@ -1118,7 +1116,7 @@ static int spi_qup_probe(struct platform_device *pdev)
+       ret = devm_request_irq(dev, irq, spi_qup_qup_irq,
+                              IRQF_TRIGGER_HIGH, pdev->name, controller);
+       if (ret)
+-              goto error_dma;
++              goto error_clk;
+       pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC);
+       pm_runtime_use_autosuspend(dev);
+@@ -1133,11 +1131,12 @@ static int spi_qup_probe(struct platform_device *pdev)
+ disable_pm:
+       pm_runtime_disable(&pdev->dev);
++error_clk:
++      clk_disable_unprepare(cclk);
++      clk_disable_unprepare(iclk);
+ error_dma:
+       spi_qup_release_dma(master);
+ error:
+-      clk_disable_unprepare(cclk);
+-      clk_disable_unprepare(iclk);
+       spi_master_put(master);
+       return ret;
+ }
+-- 
+2.39.2
+