]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.15
authorSasha Levin <sashal@kernel.org>
Sun, 23 Mar 2025 17:44:05 +0000 (13:44 -0400)
committerSasha Levin <sashal@kernel.org>
Sun, 23 Mar 2025 17:44:05 +0000 (13:44 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
18 files changed:
queue-5.15/arm-dts-bcm2711-don-t-mark-timer-regs-unconfigured.patch [new file with mode: 0644]
queue-5.15/arm-dts-bcm2711-pl011-uarts-are-actually-r1p5.patch [new file with mode: 0644]
queue-5.15/bluetooth-fix-error-code-in-chan_alloc_skb_cb.patch [new file with mode: 0644]
queue-5.15/firmware-imx-scu-fix-of-node-leak-in-.probe.patch [new file with mode: 0644]
queue-5.15/ipv6-fix-memleak-of-nhc_pcpu_rth_output-in-fib_check.patch [new file with mode: 0644]
queue-5.15/ipv6-set-errno-after-ip_fib_metrics_init-in-ip6_rout.patch [new file with mode: 0644]
queue-5.15/net-atm-fix-use-after-free-in-lec_send.patch [new file with mode: 0644]
queue-5.15/net-neighbor-add-missing-policy-for-ndtpa_queue_lenb.patch [new file with mode: 0644]
queue-5.15/rdma-bnxt_re-add-missing-paranthesis-in-map_qp_id_to.patch [new file with mode: 0644]
queue-5.15/rdma-bnxt_re-avoid-clearing-vlan_id-mask-in-modify-q.patch [new file with mode: 0644]
queue-5.15/rdma-hns-fix-a-missing-rollback-in-error-path-of-hns.patch [new file with mode: 0644]
queue-5.15/rdma-hns-fix-soft-lockup-during-bt-pages-loop.patch [new file with mode: 0644]
queue-5.15/rdma-hns-fix-unmatched-condition-in-error-path-of-al.patch [new file with mode: 0644]
queue-5.15/rdma-hns-fix-wrong-value-of-max_sge_rd.patch [new file with mode: 0644]
queue-5.15/rdma-hns-remove-redundant-phy_addr-in-hns_roce_hem_l.patch [new file with mode: 0644]
queue-5.15/revert-gre-fix-ipv6-link-local-address-generation.patch [new file with mode: 0644]
queue-5.15/series
queue-5.15/xfrm_output-force-software-gso-only-in-tunnel-mode.patch [new file with mode: 0644]

diff --git a/queue-5.15/arm-dts-bcm2711-don-t-mark-timer-regs-unconfigured.patch b/queue-5.15/arm-dts-bcm2711-don-t-mark-timer-regs-unconfigured.patch
new file mode 100644 (file)
index 0000000..f8f7a10
--- /dev/null
@@ -0,0 +1,44 @@
+From 4e767ac23de3b77a9204f76e37f303ee78da6189 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 22 Feb 2025 10:41:13 +0100
+Subject: ARM: dts: bcm2711: Don't mark timer regs unconfigured
+
+From: Phil Elwell <phil@raspberrypi.com>
+
+[ Upstream commit c24f272ae751a9f54f8816430e7f2d56031892cc ]
+
+During upstream process of Raspberry Pi 4 back in 2019 the ARMv7 stubs
+didn't configured the ARM architectural timer. This firmware issue has
+been fixed in 2020, which gave users enough time to update their system.
+
+So drop this property to allow the use of the vDSO version of
+clock_gettime.
+
+Link: https://github.com/raspberrypi/tools/pull/113
+Fixes: 7dbe8c62ceeb ("ARM: dts: Add minimal Raspberry Pi 4 support")
+Signed-off-by: Phil Elwell <phil@raspberrypi.com>
+Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Link: https://lore.kernel.org/r/20250222094113.48198-1-wahrenst@gmx.net
+Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/bcm2711.dtsi | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/arch/arm/boot/dts/bcm2711.dtsi b/arch/arm/boot/dts/bcm2711.dtsi
+index 926bc467d4516..da0eb87026028 100644
+--- a/arch/arm/boot/dts/bcm2711.dtsi
++++ b/arch/arm/boot/dts/bcm2711.dtsi
+@@ -450,8 +450,6 @@ IRQ_TYPE_LEVEL_LOW)>,
+                                         IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) |
+                                         IRQ_TYPE_LEVEL_LOW)>;
+-              /* This only applies to the ARMv7 stub */
+-              arm,cpu-registers-not-fw-configured;
+       };
+       cpus: cpus {
+-- 
+2.39.5
+
diff --git a/queue-5.15/arm-dts-bcm2711-pl011-uarts-are-actually-r1p5.patch b/queue-5.15/arm-dts-bcm2711-pl011-uarts-are-actually-r1p5.patch
new file mode 100644 (file)
index 0000000..6845772
--- /dev/null
@@ -0,0 +1,74 @@
+From 0eefd4d24972d85a7eac77f96328bc5369f60377 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 23 Feb 2025 13:56:13 +0100
+Subject: ARM: dts: bcm2711: PL011 UARTs are actually r1p5
+
+From: Phil Elwell <phil@raspberrypi.com>
+
+[ Upstream commit 0de09025f161f67c07978c4742e221243d070d41 ]
+
+The ARM PL011 UART instances in BCM2711 are r1p5 spec, which means they
+have 32-entry FIFOs. The correct periphid value for this is 0x00341011.
+Thanks to N Buchwitz for pointing this out.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.com>
+Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
+Link: https://lore.kernel.org/r/20250223125614.3592-2-wahrenst@gmx.net
+Fixes: 7dbe8c62ceeb ("ARM: dts: Add minimal Raspberry Pi 4 support")
+Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/bcm2711.dtsi | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm/boot/dts/bcm2711.dtsi b/arch/arm/boot/dts/bcm2711.dtsi
+index 89af57482bc8f..926bc467d4516 100644
+--- a/arch/arm/boot/dts/bcm2711.dtsi
++++ b/arch/arm/boot/dts/bcm2711.dtsi
+@@ -133,7 +133,7 @@ uart2: serial@7e201400 {
+                       clocks = <&clocks BCM2835_CLOCK_UART>,
+                                <&clocks BCM2835_CLOCK_VPU>;
+                       clock-names = "uartclk", "apb_pclk";
+-                      arm,primecell-periphid = <0x00241011>;
++                      arm,primecell-periphid = <0x00341011>;
+                       status = "disabled";
+               };
+@@ -144,7 +144,7 @@ uart3: serial@7e201600 {
+                       clocks = <&clocks BCM2835_CLOCK_UART>,
+                                <&clocks BCM2835_CLOCK_VPU>;
+                       clock-names = "uartclk", "apb_pclk";
+-                      arm,primecell-periphid = <0x00241011>;
++                      arm,primecell-periphid = <0x00341011>;
+                       status = "disabled";
+               };
+@@ -155,7 +155,7 @@ uart4: serial@7e201800 {
+                       clocks = <&clocks BCM2835_CLOCK_UART>,
+                                <&clocks BCM2835_CLOCK_VPU>;
+                       clock-names = "uartclk", "apb_pclk";
+-                      arm,primecell-periphid = <0x00241011>;
++                      arm,primecell-periphid = <0x00341011>;
+                       status = "disabled";
+               };
+@@ -166,7 +166,7 @@ uart5: serial@7e201a00 {
+                       clocks = <&clocks BCM2835_CLOCK_UART>,
+                                <&clocks BCM2835_CLOCK_VPU>;
+                       clock-names = "uartclk", "apb_pclk";
+-                      arm,primecell-periphid = <0x00241011>;
++                      arm,primecell-periphid = <0x00341011>;
+                       status = "disabled";
+               };
+@@ -1142,6 +1142,7 @@ &txp {
+ };
+ &uart0 {
++      arm,primecell-periphid = <0x00341011>;
+       interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
+ };
+-- 
+2.39.5
+
diff --git a/queue-5.15/bluetooth-fix-error-code-in-chan_alloc_skb_cb.patch b/queue-5.15/bluetooth-fix-error-code-in-chan_alloc_skb_cb.patch
new file mode 100644 (file)
index 0000000..863312e
--- /dev/null
@@ -0,0 +1,45 @@
+From 6c4dea43176be6b171bead1a5e9a0a9cfc3d10f1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Mar 2025 22:46:56 +0300
+Subject: Bluetooth: Fix error code in chan_alloc_skb_cb()
+
+From: Dan Carpenter <dan.carpenter@linaro.org>
+
+[ Upstream commit 72d061ee630d0dbb45c2920d8d19b3861c413e54 ]
+
+The chan_alloc_skb_cb() function is supposed to return error pointers on
+error.  Returning NULL will lead to a NULL dereference.
+
+Fixes: 6b8d4a6a0314 ("Bluetooth: 6LoWPAN: Use connected oriented channel instead of fixed one")
+Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bluetooth/6lowpan.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
+index 580b0940f067a..c4a1b478cf3e9 100644
+--- a/net/bluetooth/6lowpan.c
++++ b/net/bluetooth/6lowpan.c
+@@ -824,11 +824,16 @@ static struct sk_buff *chan_alloc_skb_cb(struct l2cap_chan *chan,
+                                        unsigned long hdr_len,
+                                        unsigned long len, int nb)
+ {
++      struct sk_buff *skb;
++
+       /* Note that we must allocate using GFP_ATOMIC here as
+        * this function is called originally from netdev hard xmit
+        * function in atomic context.
+        */
+-      return bt_skb_alloc(hdr_len + len, GFP_ATOMIC);
++      skb = bt_skb_alloc(hdr_len + len, GFP_ATOMIC);
++      if (!skb)
++              return ERR_PTR(-ENOMEM);
++      return skb;
+ }
+ static void chan_suspend_cb(struct l2cap_chan *chan)
+-- 
+2.39.5
+
diff --git a/queue-5.15/firmware-imx-scu-fix-of-node-leak-in-.probe.patch b/queue-5.15/firmware-imx-scu-fix-of-node-leak-in-.probe.patch
new file mode 100644 (file)
index 0000000..7daa1b4
--- /dev/null
@@ -0,0 +1,36 @@
+From 1cbea9ae502e346dc9a22644dcbbf7ffe25046ee Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 Dec 2024 12:34:56 +0900
+Subject: firmware: imx-scu: fix OF node leak in .probe()
+
+From: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
+
+[ Upstream commit fbf10b86f6057cf79300720da4ea4b77e6708b0d ]
+
+imx_scu_probe() calls of_parse_phandle_with_args(), but does not
+release the OF node reference obtained by it. Add a of_node_put() call
+after done with the node.
+
+Fixes: f25a066d1a07 ("firmware: imx-scu: Support one TX and one RX")
+Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firmware/imx/imx-scu.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/firmware/imx/imx-scu.c b/drivers/firmware/imx/imx-scu.c
+index dca79caccd01c..fa25c082109ac 100644
+--- a/drivers/firmware/imx/imx-scu.c
++++ b/drivers/firmware/imx/imx-scu.c
+@@ -279,6 +279,7 @@ static int imx_scu_probe(struct platform_device *pdev)
+               return ret;
+       sc_ipc->fast_ipc = of_device_is_compatible(args.np, "fsl,imx8-mu-scu");
++      of_node_put(args.np);
+       num_channel = sc_ipc->fast_ipc ? 2 : SCU_MU_CHAN_NUM;
+       for (i = 0; i < num_channel; i++) {
+-- 
+2.39.5
+
diff --git a/queue-5.15/ipv6-fix-memleak-of-nhc_pcpu_rth_output-in-fib_check.patch b/queue-5.15/ipv6-fix-memleak-of-nhc_pcpu_rth_output-in-fib_check.patch
new file mode 100644 (file)
index 0000000..afd0f2b
--- /dev/null
@@ -0,0 +1,49 @@
+From 5573e0bf4efbddab8817136c8f2f6e136cfcecc8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Mar 2025 18:03:25 -0700
+Subject: ipv6: Fix memleak of nhc_pcpu_rth_output in fib_check_nh_v6_gw().
+
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+
+[ Upstream commit 9740890ee20e01f99ff1dde84c63dcf089fabb98 ]
+
+fib_check_nh_v6_gw() expects that fib6_nh_init() cleans up everything
+when it fails.
+
+Commit 7dd73168e273 ("ipv6: Always allocate pcpu memory in a fib6_nh")
+moved fib_nh_common_init() before alloc_percpu_gfp() within fib6_nh_init()
+but forgot to add cleanup for fib6_nh->nh_common.nhc_pcpu_rth_output in
+case it fails to allocate fib6_nh->rt6i_pcpu, resulting in memleak.
+
+Let's call fib_nh_common_release() and clear nhc_pcpu_rth_output in the
+error path.
+
+Note that we can remove the fib6_nh_release() call in nh_create_ipv6()
+later in net-next.git.
+
+Fixes: 7dd73168e273 ("ipv6: Always allocate pcpu memory in a fib6_nh")
+Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Link: https://patch.msgid.link/20250312010333.56001-1-kuniyu@amazon.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/route.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/ipv6/route.c b/net/ipv6/route.c
+index 94526436b91e8..875cab88f3891 100644
+--- a/net/ipv6/route.c
++++ b/net/ipv6/route.c
+@@ -3630,7 +3630,8 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
+               in6_dev_put(idev);
+       if (err) {
+-              lwtstate_put(fib6_nh->fib_nh_lws);
++              fib_nh_common_release(&fib6_nh->nh_common);
++              fib6_nh->nh_common.nhc_pcpu_rth_output = NULL;
+               fib6_nh->fib_nh_lws = NULL;
+               dev_put(dev);
+       }
+-- 
+2.39.5
+
diff --git a/queue-5.15/ipv6-set-errno-after-ip_fib_metrics_init-in-ip6_rout.patch b/queue-5.15/ipv6-set-errno-after-ip_fib_metrics_init-in-ip6_rout.patch
new file mode 100644 (file)
index 0000000..b01024b
--- /dev/null
@@ -0,0 +1,57 @@
+From 385ec29722594c6ea50c1c40f700a949dfc3306f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Mar 2025 18:38:48 -0700
+Subject: ipv6: Set errno after ip_fib_metrics_init() in
+ ip6_route_info_create().
+
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+
+[ Upstream commit 9a81fc3480bf5dbe2bf80e278c440770f6ba2692 ]
+
+While creating a new IPv6, we could get a weird -ENOMEM when
+RTA_NH_ID is set and either of the conditions below is true:
+
+  1) CONFIG_IPV6_SUBTREES is enabled and rtm_src_len is specified
+  2) nexthop_get() fails
+
+e.g.)
+
+  # strace ip -6 route add fe80::dead:beef:dead:beef nhid 1 from ::
+  recvmsg(3, {msg_iov=[{iov_base=[...[
+    {error=-ENOMEM, msg=[... [...]]},
+    [{nla_len=49, nla_type=NLMSGERR_ATTR_MSG}, "Nexthops can not be used with so"...]
+  ]], iov_len=32768}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 148
+
+Let's set err explicitly after ip_fib_metrics_init() in
+ip6_route_info_create().
+
+Fixes: f88d8ea67fbd ("ipv6: Plumb support for nexthop object in a fib6_info")
+Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Link: https://patch.msgid.link/20250312013854.61125-1-kuniyu@amazon.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/route.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/net/ipv6/route.c b/net/ipv6/route.c
+index 875cab88f3891..f8b2fdaef67f4 100644
+--- a/net/ipv6/route.c
++++ b/net/ipv6/route.c
+@@ -3807,10 +3807,12 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
+       if (nh) {
+               if (rt->fib6_src.plen) {
+                       NL_SET_ERR_MSG(extack, "Nexthops can not be used with source routing");
++                      err = -EINVAL;
+                       goto out_free;
+               }
+               if (!nexthop_get(nh)) {
+                       NL_SET_ERR_MSG(extack, "Nexthop has been deleted");
++                      err = -ENOENT;
+                       goto out_free;
+               }
+               rt->nh = nh;
+-- 
+2.39.5
+
diff --git a/queue-5.15/net-atm-fix-use-after-free-in-lec_send.patch b/queue-5.15/net-atm-fix-use-after-free-in-lec_send.patch
new file mode 100644 (file)
index 0000000..4651d35
--- /dev/null
@@ -0,0 +1,46 @@
+From b170d5d637177259d89a6ecf1faf2963ad9e8374 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 14 Mar 2025 13:10:57 +0300
+Subject: net: atm: fix use after free in lec_send()
+
+From: Dan Carpenter <dan.carpenter@linaro.org>
+
+[ Upstream commit f3009d0d6ab78053117f8857b921a8237f4d17b3 ]
+
+The ->send() operation frees skb so save the length before calling
+->send() to avoid a use after free.
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Link: https://patch.msgid.link/c751531d-4af4-42fe-affe-6104b34b791d@stanley.mountain
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/atm/lec.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/atm/lec.c b/net/atm/lec.c
+index 7226c784dbe0c..ca9952c52fb5c 100644
+--- a/net/atm/lec.c
++++ b/net/atm/lec.c
+@@ -181,6 +181,7 @@ static void
+ lec_send(struct atm_vcc *vcc, struct sk_buff *skb)
+ {
+       struct net_device *dev = skb->dev;
++      unsigned int len = skb->len;
+       ATM_SKB(skb)->vcc = vcc;
+       atm_account_tx(vcc, skb);
+@@ -191,7 +192,7 @@ lec_send(struct atm_vcc *vcc, struct sk_buff *skb)
+       }
+       dev->stats.tx_packets++;
+-      dev->stats.tx_bytes += skb->len;
++      dev->stats.tx_bytes += len;
+ }
+ static void lec_tx_timeout(struct net_device *dev, unsigned int txqueue)
+-- 
+2.39.5
+
diff --git a/queue-5.15/net-neighbor-add-missing-policy-for-ndtpa_queue_lenb.patch b/queue-5.15/net-neighbor-add-missing-policy-for-ndtpa_queue_lenb.patch
new file mode 100644 (file)
index 0000000..d8ee029
--- /dev/null
@@ -0,0 +1,39 @@
+From 3b2acf8b0931f72ee0b2343dfb98fbf992438be8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 16 Mar 2025 00:51:13 +0800
+Subject: net/neighbor: add missing policy for NDTPA_QUEUE_LENBYTES
+
+From: Lin Ma <linma@zju.edu.cn>
+
+[ Upstream commit 90a7138619a0c55e2aefaad27b12ffc2ddbeed78 ]
+
+Previous commit 8b5c171bb3dc ("neigh: new unresolved queue limits")
+introduces new netlink attribute NDTPA_QUEUE_LENBYTES to represent
+approximative value for deprecated QUEUE_LEN. However, it forgot to add
+the associated nla_policy in nl_ntbl_parm_policy array. Fix it with one
+simple NLA_U32 type policy.
+
+Fixes: 8b5c171bb3dc ("neigh: new unresolved queue limits")
+Signed-off-by: Lin Ma <linma@zju.edu.cn>
+Link: https://patch.msgid.link/20250315165113.37600-1-linma@zju.edu.cn
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/neighbour.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/net/core/neighbour.c b/net/core/neighbour.c
+index 9549738b81842..b83878b5bf788 100644
+--- a/net/core/neighbour.c
++++ b/net/core/neighbour.c
+@@ -2173,6 +2173,7 @@ static const struct nla_policy nl_neightbl_policy[NDTA_MAX+1] = {
+ static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
+       [NDTPA_IFINDEX]                 = { .type = NLA_U32 },
+       [NDTPA_QUEUE_LEN]               = { .type = NLA_U32 },
++      [NDTPA_QUEUE_LENBYTES]          = { .type = NLA_U32 },
+       [NDTPA_PROXY_QLEN]              = { .type = NLA_U32 },
+       [NDTPA_APP_PROBES]              = { .type = NLA_U32 },
+       [NDTPA_UCAST_PROBES]            = { .type = NLA_U32 },
+-- 
+2.39.5
+
diff --git a/queue-5.15/rdma-bnxt_re-add-missing-paranthesis-in-map_qp_id_to.patch b/queue-5.15/rdma-bnxt_re-add-missing-paranthesis-in-map_qp_id_to.patch
new file mode 100644 (file)
index 0000000..1960de3
--- /dev/null
@@ -0,0 +1,42 @@
+From 62c9eb5d17248de241ef0ac3fb9831447ab01853 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Mar 2025 08:59:37 -0800
+Subject: RDMA/bnxt_re: Add missing paranthesis in map_qp_id_to_tbl_indx
+
+From: Kashyap Desai <kashyap.desai@broadcom.com>
+
+[ Upstream commit 67ee8d496511ad8e1cb88f72944847e7b3e4e47c ]
+
+The modulo operation returns wrong result without the
+paranthesis and that resulted in wrong QP table indexing.
+
+Fixes: 84cf229f4001 ("RDMA/bnxt_re: Fix the qp table indexing")
+Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
+Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
+Link: https://patch.msgid.link/1741021178-2569-3-git-send-email-selvin.xavier@broadcom.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/bnxt_re/qplib_rcfw.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
+index aaf06cd939e69..08ea292512797 100644
+--- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
++++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
+@@ -220,9 +220,10 @@ int bnxt_qplib_deinit_rcfw(struct bnxt_qplib_rcfw *rcfw);
+ int bnxt_qplib_init_rcfw(struct bnxt_qplib_rcfw *rcfw,
+                        struct bnxt_qplib_ctx *ctx, int is_virtfn);
+ void bnxt_qplib_mark_qp_error(void *qp_handle);
++
+ static inline u32 map_qp_id_to_tbl_indx(u32 qid, struct bnxt_qplib_rcfw *rcfw)
+ {
+       /* Last index of the qp_tbl is for QP1 ie. qp_tbl_size - 1*/
+-      return (qid == 1) ? rcfw->qp_tbl_size - 1 : qid % rcfw->qp_tbl_size - 2;
++      return (qid == 1) ? rcfw->qp_tbl_size - 1 : (qid % (rcfw->qp_tbl_size - 2));
+ }
+ #endif /* __BNXT_QPLIB_RCFW_H__ */
+-- 
+2.39.5
+
diff --git a/queue-5.15/rdma-bnxt_re-avoid-clearing-vlan_id-mask-in-modify-q.patch b/queue-5.15/rdma-bnxt_re-avoid-clearing-vlan_id-mask-in-modify-q.patch
new file mode 100644 (file)
index 0000000..8499cdb
--- /dev/null
@@ -0,0 +1,42 @@
+From 4bf93df296a63dc76a7acabe19dd8a6cad0a4954 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Mar 2025 22:16:36 -0700
+Subject: RDMA/bnxt_re: Avoid clearing VLAN_ID mask in modify qp path
+
+From: Saravanan Vajravel <saravanan.vajravel@broadcom.com>
+
+[ Upstream commit 81c0db302a674f8004ed805393d17fd76f552e83 ]
+
+Driver is always clearing the mask that sets the VLAN ID/Service Level
+in the adapter. Recent change for supporting multiple traffic class
+exposed this issue.
+
+Allow setting SL and VLAN_ID while QP is moved from INIT to RTR state.
+
+Fixes: 1ac5a4047975 ("RDMA/bnxt_re: Add bnxt_re RoCE driver")
+Fixes: c64b16a37b6d ("RDMA/bnxt_re: Support different traffic class")
+Signed-off-by: Saravanan Vajravel <saravanan.vajravel@broadcom.com>
+Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
+Link: https://patch.msgid.link/1741670196-2919-1-git-send-email-selvin.xavier@broadcom.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/bnxt_re/qplib_fp.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+index 27cf6e62422aa..3725f05ad297b 100644
+--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
++++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+@@ -1181,8 +1181,6 @@ static void __modify_flags_from_init_state(struct bnxt_qplib_qp *qp)
+                       qp->path_mtu =
+                               CMDQ_MODIFY_QP_PATH_MTU_MTU_2048;
+               }
+-              qp->modify_flags &=
+-                      ~CMDQ_MODIFY_QP_MODIFY_MASK_VLAN_ID;
+               /* Bono FW require the max_dest_rd_atomic to be >= 1 */
+               if (qp->max_dest_rd_atomic < 1)
+                       qp->max_dest_rd_atomic = 1;
+-- 
+2.39.5
+
diff --git a/queue-5.15/rdma-hns-fix-a-missing-rollback-in-error-path-of-hns.patch b/queue-5.15/rdma-hns-fix-a-missing-rollback-in-error-path-of-hns.patch
new file mode 100644 (file)
index 0000000..1a41277
--- /dev/null
@@ -0,0 +1,39 @@
+From 65a53338b19bc2466c8496534c4a276326a65844 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Mar 2025 16:48:55 +0800
+Subject: RDMA/hns: Fix a missing rollback in error path of
+ hns_roce_create_qp_common()
+
+From: Junxian Huang <huangjunxian6@hisilicon.com>
+
+[ Upstream commit 444907dd45cbe62fd69398805b6e2c626fab5b3a ]
+
+When ib_copy_to_udata() fails in hns_roce_create_qp_common(),
+hns_roce_qp_remove() should be called in the error path to
+clean up resources in hns_roce_qp_store().
+
+Fixes: 0f00571f9433 ("RDMA/hns: Use new SQ doorbell register for HIP09")
+Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
+Link: https://patch.msgid.link/20250311084857.3803665-6-huangjunxian6@hisilicon.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_qp.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
+index d7f620eb4f21d..3875563abf374 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
++++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
+@@ -1117,7 +1117,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
+                                      min(udata->outlen, sizeof(resp)));
+               if (ret) {
+                       ibdev_err(ibdev, "copy qp resp failed!\n");
+-                      goto err_store;
++                      goto err_flow_ctrl;
+               }
+       }
+-- 
+2.39.5
+
diff --git a/queue-5.15/rdma-hns-fix-soft-lockup-during-bt-pages-loop.patch b/queue-5.15/rdma-hns-fix-soft-lockup-during-bt-pages-loop.patch
new file mode 100644 (file)
index 0000000..a5b0e02
--- /dev/null
@@ -0,0 +1,100 @@
+From 0ef240ffdccc3354a9e00b6395618cbb69dc633c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Mar 2025 16:48:52 +0800
+Subject: RDMA/hns: Fix soft lockup during bt pages loop
+
+From: Junxian Huang <huangjunxian6@hisilicon.com>
+
+[ Upstream commit 25655580136de59ec89f09089dd28008ea440fc9 ]
+
+Driver runs a for-loop when allocating bt pages and mapping them with
+buffer pages. When a large buffer (e.g. MR over 100GB) is being allocated,
+it may require a considerable loop count. This will lead to soft lockup:
+
+        watchdog: BUG: soft lockup - CPU#27 stuck for 22s!
+        ...
+        Call trace:
+         hem_list_alloc_mid_bt+0x124/0x394 [hns_roce_hw_v2]
+         hns_roce_hem_list_request+0xf8/0x160 [hns_roce_hw_v2]
+         hns_roce_mtr_create+0x2e4/0x360 [hns_roce_hw_v2]
+         alloc_mr_pbl+0xd4/0x17c [hns_roce_hw_v2]
+         hns_roce_reg_user_mr+0xf8/0x190 [hns_roce_hw_v2]
+         ib_uverbs_reg_mr+0x118/0x290
+
+        watchdog: BUG: soft lockup - CPU#35 stuck for 23s!
+        ...
+        Call trace:
+         hns_roce_hem_list_find_mtt+0x7c/0xb0 [hns_roce_hw_v2]
+         mtr_map_bufs+0xc4/0x204 [hns_roce_hw_v2]
+         hns_roce_mtr_create+0x31c/0x3c4 [hns_roce_hw_v2]
+         alloc_mr_pbl+0xb0/0x160 [hns_roce_hw_v2]
+         hns_roce_reg_user_mr+0x108/0x1c0 [hns_roce_hw_v2]
+         ib_uverbs_reg_mr+0x120/0x2bc
+
+Add a cond_resched() to fix soft lockup during these loops. In order not
+to affect the allocation performance of normal-size buffer, set the loop
+count of a 100GB MR as the threshold to call cond_resched().
+
+Fixes: 38389eaa4db1 ("RDMA/hns: Add mtr support for mixed multihop addressing")
+Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
+Link: https://patch.msgid.link/20250311084857.3803665-3-huangjunxian6@hisilicon.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_hem.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c
+index 57b84f5dc0f16..64ee875cc6d1c 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_hem.c
++++ b/drivers/infiniband/hw/hns/hns_roce_hem.c
+@@ -1410,6 +1410,11 @@ static int hem_list_alloc_root_bt(struct hns_roce_dev *hr_dev,
+       return ret;
+ }
++/* This is the bottom bt pages number of a 100G MR on 4K OS, assuming
++ * the bt page size is not expanded by cal_best_bt_pg_sz()
++ */
++#define RESCHED_LOOP_CNT_THRESHOLD_ON_4K 12800
++
+ /* construct the base address table and link them by address hop config */
+ int hns_roce_hem_list_request(struct hns_roce_dev *hr_dev,
+                             struct hns_roce_hem_list *hem_list,
+@@ -1418,6 +1423,7 @@ int hns_roce_hem_list_request(struct hns_roce_dev *hr_dev,
+ {
+       const struct hns_roce_buf_region *r;
+       int ofs, end;
++      int loop;
+       int unit;
+       int ret;
+       int i;
+@@ -1435,7 +1441,10 @@ int hns_roce_hem_list_request(struct hns_roce_dev *hr_dev,
+                       continue;
+               end = r->offset + r->count;
+-              for (ofs = r->offset; ofs < end; ofs += unit) {
++              for (ofs = r->offset, loop = 1; ofs < end; ofs += unit, loop++) {
++                      if (!(loop % RESCHED_LOOP_CNT_THRESHOLD_ON_4K))
++                              cond_resched();
++
+                       ret = hem_list_alloc_mid_bt(hr_dev, r, unit, ofs,
+                                                   hem_list->mid_bt[i],
+                                                   &hem_list->btm_bt);
+@@ -1492,9 +1501,14 @@ void *hns_roce_hem_list_find_mtt(struct hns_roce_dev *hr_dev,
+       struct list_head *head = &hem_list->btm_bt;
+       struct hns_roce_hem_item *hem, *temp_hem;
+       void *cpu_base = NULL;
++      int loop = 1;
+       int nr = 0;
+       list_for_each_entry_safe(hem, temp_hem, head, sibling) {
++              if (!(loop % RESCHED_LOOP_CNT_THRESHOLD_ON_4K))
++                      cond_resched();
++              loop++;
++
+               if (hem_list_page_is_in_range(hem, offset)) {
+                       nr = offset - hem->start;
+                       cpu_base = hem->addr + nr * BA_BYTE_LEN;
+-- 
+2.39.5
+
diff --git a/queue-5.15/rdma-hns-fix-unmatched-condition-in-error-path-of-al.patch b/queue-5.15/rdma-hns-fix-unmatched-condition-in-error-path-of-al.patch
new file mode 100644 (file)
index 0000000..f4a1305
--- /dev/null
@@ -0,0 +1,64 @@
+From f2a13e377606895ffb3cd07c921203a7ad019d1b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Mar 2025 16:48:53 +0800
+Subject: RDMA/hns: Fix unmatched condition in error path of alloc_user_qp_db()
+
+From: Junxian Huang <huangjunxian6@hisilicon.com>
+
+[ Upstream commit b9f59a24ba35a7d955a9f8e148dd9f85b7b40a01 ]
+
+Currently the condition of unmapping sdb in error path is not exactly
+the same as the condition of mapping in alloc_user_qp_db(). This may
+cause a problem of unmapping an unmapped db in some case, such as
+when the QP is XRC TGT. Unified the two conditions.
+
+Fixes: 90ae0b57e4a5 ("RDMA/hns: Combine enable flags of qp")
+Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
+Link: https://patch.msgid.link/20250311084857.3803665-4-huangjunxian6@hisilicon.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_qp.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
+index ff019e32c4552..d7f620eb4f21d 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
++++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
+@@ -842,12 +842,14 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
+                           struct hns_roce_ib_create_qp *ucmd,
+                           struct hns_roce_ib_create_qp_resp *resp)
+ {
++      bool has_sdb = user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd);
+       struct hns_roce_ucontext *uctx = rdma_udata_to_drv_context(udata,
+               struct hns_roce_ucontext, ibucontext);
++      bool has_rdb = user_qp_has_rdb(hr_dev, init_attr, udata, resp);
+       struct ib_device *ibdev = &hr_dev->ib_dev;
+       int ret;
+-      if (user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd)) {
++      if (has_sdb) {
+               ret = hns_roce_db_map_user(uctx, ucmd->sdb_addr, &hr_qp->sdb);
+               if (ret) {
+                       ibdev_err(ibdev,
+@@ -858,7 +860,7 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
+               hr_qp->en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB;
+       }
+-      if (user_qp_has_rdb(hr_dev, init_attr, udata, resp)) {
++      if (has_rdb) {
+               ret = hns_roce_db_map_user(uctx, ucmd->db_addr, &hr_qp->rdb);
+               if (ret) {
+                       ibdev_err(ibdev,
+@@ -872,7 +874,7 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
+       return 0;
+ err_sdb:
+-      if (hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB)
++      if (has_sdb)
+               hns_roce_db_unmap_user(uctx, &hr_qp->sdb);
+ err_out:
+       return ret;
+-- 
+2.39.5
+
diff --git a/queue-5.15/rdma-hns-fix-wrong-value-of-max_sge_rd.patch b/queue-5.15/rdma-hns-fix-wrong-value-of-max_sge_rd.patch
new file mode 100644 (file)
index 0000000..b5d95ab
--- /dev/null
@@ -0,0 +1,38 @@
+From 0cff0cad6b65a3df8fca1590f99a95679306c927 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Mar 2025 16:48:57 +0800
+Subject: RDMA/hns: Fix wrong value of max_sge_rd
+
+From: Junxian Huang <huangjunxian6@hisilicon.com>
+
+[ Upstream commit 6b5e41a8b51fce520bb09bd651a29ef495e990de ]
+
+There is no difference between the sge of READ and non-READ
+operations in hns RoCE. Set max_sge_rd to the same value as
+max_send_sge.
+
+Fixes: 9a4435375cd1 ("IB/hns: Add driver files for hns RoCE driver")
+Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
+Link: https://patch.msgid.link/20250311084857.3803665-8-huangjunxian6@hisilicon.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_main.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c
+index e2d2f8f2bdbcf..83a6b8fbe10f0 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_main.c
++++ b/drivers/infiniband/hw/hns/hns_roce_main.c
+@@ -185,7 +185,7 @@ static int hns_roce_query_device(struct ib_device *ib_dev,
+                                 IB_DEVICE_RC_RNR_NAK_GEN;
+       props->max_send_sge = hr_dev->caps.max_sq_sg;
+       props->max_recv_sge = hr_dev->caps.max_rq_sg;
+-      props->max_sge_rd = 1;
++      props->max_sge_rd = hr_dev->caps.max_sq_sg;
+       props->max_cq = hr_dev->caps.num_cqs;
+       props->max_cqe = hr_dev->caps.max_cqes;
+       props->max_mr = hr_dev->caps.num_mtpts;
+-- 
+2.39.5
+
diff --git a/queue-5.15/rdma-hns-remove-redundant-phy_addr-in-hns_roce_hem_l.patch b/queue-5.15/rdma-hns-remove-redundant-phy_addr-in-hns_roce_hem_l.patch
new file mode 100644 (file)
index 0000000..97a8cc8
--- /dev/null
@@ -0,0 +1,96 @@
+From 1297ff3f3b955cf76f67d2072a99a72a4fafba7a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 22 Sep 2022 20:33:10 +0800
+Subject: RDMA/hns: Remove redundant 'phy_addr' in hns_roce_hem_list_find_mtt()
+
+From: Chengchang Tang <tangchengchang@huawei.com>
+
+[ Upstream commit 5f652387c5423a82453c5cb446a88834bf41a94b ]
+
+This parameter has never been used. Remove it to simplify the function.
+
+Link: https://lore.kernel.org/r/20220922123315.3732205-8-xuhaoyue1@hisilicon.com
+Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
+Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
+Signed-off-by: Haoyue Xu <xuhaoyue1@hisilicon.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Stable-dep-of: 25655580136d ("RDMA/hns: Fix soft lockup during bt pages loop")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_hem.c | 7 +------
+ drivers/infiniband/hw/hns/hns_roce_hem.h | 2 +-
+ drivers/infiniband/hw/hns/hns_roce_mr.c  | 4 ++--
+ 3 files changed, 4 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c
+index 99708a7bcda78..57b84f5dc0f16 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_hem.c
++++ b/drivers/infiniband/hw/hns/hns_roce_hem.c
+@@ -1487,19 +1487,17 @@ void hns_roce_hem_list_init(struct hns_roce_hem_list *hem_list)
+ void *hns_roce_hem_list_find_mtt(struct hns_roce_dev *hr_dev,
+                                struct hns_roce_hem_list *hem_list,
+-                               int offset, int *mtt_cnt, u64 *phy_addr)
++                               int offset, int *mtt_cnt)
+ {
+       struct list_head *head = &hem_list->btm_bt;
+       struct hns_roce_hem_item *hem, *temp_hem;
+       void *cpu_base = NULL;
+-      u64 phy_base = 0;
+       int nr = 0;
+       list_for_each_entry_safe(hem, temp_hem, head, sibling) {
+               if (hem_list_page_is_in_range(hem, offset)) {
+                       nr = offset - hem->start;
+                       cpu_base = hem->addr + nr * BA_BYTE_LEN;
+-                      phy_base = hem->dma_addr + nr * BA_BYTE_LEN;
+                       nr = hem->end + 1 - offset;
+                       break;
+               }
+@@ -1508,8 +1506,5 @@ void *hns_roce_hem_list_find_mtt(struct hns_roce_dev *hr_dev,
+       if (mtt_cnt)
+               *mtt_cnt = nr;
+-      if (phy_addr)
+-              *phy_addr = phy_base;
+-
+       return cpu_base;
+ }
+diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.h b/drivers/infiniband/hw/hns/hns_roce_hem.h
+index fa84ce33076ac..150922b22eaa6 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_hem.h
++++ b/drivers/infiniband/hw/hns/hns_roce_hem.h
+@@ -132,7 +132,7 @@ void hns_roce_hem_list_release(struct hns_roce_dev *hr_dev,
+                              struct hns_roce_hem_list *hem_list);
+ void *hns_roce_hem_list_find_mtt(struct hns_roce_dev *hr_dev,
+                                struct hns_roce_hem_list *hem_list,
+-                               int offset, int *mtt_cnt, u64 *phy_addr);
++                               int offset, int *mtt_cnt);
+ static inline void hns_roce_hem_first(struct hns_roce_hem *hem,
+                                     struct hns_roce_hem_iter *iter)
+diff --git a/drivers/infiniband/hw/hns/hns_roce_mr.c b/drivers/infiniband/hw/hns/hns_roce_mr.c
+index 604dd38b5c8fd..791a45802d6b2 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_mr.c
++++ b/drivers/infiniband/hw/hns/hns_roce_mr.c
+@@ -614,7 +614,7 @@ static int mtr_map_region(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
+       while (offset < end && npage < max_count) {
+               count = 0;
+               mtts = hns_roce_hem_list_find_mtt(hr_dev, &mtr->hem_list,
+-                                                offset, &count, NULL);
++                                                offset, &count);
+               if (!mtts)
+                       return -ENOBUFS;
+@@ -864,7 +864,7 @@ int hns_roce_mtr_find(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,
+               mtt_count = 0;
+               mtts = hns_roce_hem_list_find_mtt(hr_dev, &mtr->hem_list,
+                                                 start_index + total,
+-                                                &mtt_count, NULL);
++                                                &mtt_count);
+               if (!mtts || !mtt_count)
+                       goto done;
+-- 
+2.39.5
+
diff --git a/queue-5.15/revert-gre-fix-ipv6-link-local-address-generation.patch b/queue-5.15/revert-gre-fix-ipv6-link-local-address-generation.patch
new file mode 100644 (file)
index 0000000..d2afa84
--- /dev/null
@@ -0,0 +1,66 @@
+From d618f1a7671c39dc1ee61c5175439326bee07bb2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Mar 2025 22:26:50 +0100
+Subject: Revert "gre: Fix IPv6 link-local address generation."
+
+From: Guillaume Nault <gnault@redhat.com>
+
+[ Upstream commit fc486c2d060f67d672ddad81724f7c8a4d329570 ]
+
+This reverts commit 183185a18ff96751db52a46ccf93fff3a1f42815.
+
+This patch broke net/forwarding/ip6gre_custom_multipath_hash.sh in some
+circumstances (https://lore.kernel.org/netdev/Z9RIyKZDNoka53EO@mini-arch/).
+Let's revert it while the problem is being investigated.
+
+Fixes: 183185a18ff9 ("gre: Fix IPv6 link-local address generation.")
+Signed-off-by: Guillaume Nault <gnault@redhat.com>
+Link: https://patch.msgid.link/8b1ce738eb15dd841aab9ef888640cab4f6ccfea.1742418408.git.gnault@redhat.com
+Acked-by: Stanislav Fomichev <sdf@fomichev.me>
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/addrconf.c | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
+index f5cca40b71610..932a10f64adcb 100644
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -3145,13 +3145,16 @@ static void add_v4_addrs(struct inet6_dev *idev)
+       struct in6_addr addr;
+       struct net_device *dev;
+       struct net *net = dev_net(idev->dev);
+-      int scope, plen;
++      int scope, plen, offset = 0;
+       u32 pflags = 0;
+       ASSERT_RTNL();
+       memset(&addr, 0, sizeof(struct in6_addr));
+-      memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4);
++      /* in case of IP6GRE the dev_addr is an IPv6 and therefore we use only the last 4 bytes */
++      if (idev->dev->addr_len == sizeof(struct in6_addr))
++              offset = sizeof(struct in6_addr) - 4;
++      memcpy(&addr.s6_addr32[3], idev->dev->dev_addr + offset, 4);
+       if (!(idev->dev->flags & IFF_POINTOPOINT) && idev->dev->type == ARPHRD_SIT) {
+               scope = IPV6_ADDR_COMPATv4;
+@@ -3459,13 +3462,7 @@ static void addrconf_gre_config(struct net_device *dev)
+               return;
+       }
+-      /* Generate the IPv6 link-local address using addrconf_addr_gen(),
+-       * unless we have an IPv4 GRE device not bound to an IP address and
+-       * which is in EUI64 mode (as __ipv6_isatap_ifid() would fail in this
+-       * case). Such devices fall back to add_v4_addrs() instead.
+-       */
+-      if (!(dev->type == ARPHRD_IPGRE && *(__be32 *)dev->dev_addr == 0 &&
+-            idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64)) {
++      if (dev->type == ARPHRD_ETHER) {
+               addrconf_addr_gen(idev, true);
+               return;
+       }
+-- 
+2.39.5
+
index ab8d2bca0595f2256f02d9df0bc072c6cf89e061..825a78af3aeda8cf6f67929847b61365cfc7168f 100644 (file)
@@ -76,3 +76,20 @@ drm-amd-display-check-for-invalid-input-params-when-.patch
 drm-amd-display-fix-null-check-for-pipe_ctx-plane_st.patch
 smb-client-fix-match_session-bug-preventing-session-reuse.patch
 smb-client-fix-potential-uaf-in-cifs_debug_files_proc_show.patch
+firmware-imx-scu-fix-of-node-leak-in-.probe.patch
+xfrm_output-force-software-gso-only-in-tunnel-mode.patch
+arm-dts-bcm2711-pl011-uarts-are-actually-r1p5.patch
+rdma-bnxt_re-add-missing-paranthesis-in-map_qp_id_to.patch
+arm-dts-bcm2711-don-t-mark-timer-regs-unconfigured.patch
+rdma-bnxt_re-avoid-clearing-vlan_id-mask-in-modify-q.patch
+rdma-hns-remove-redundant-phy_addr-in-hns_roce_hem_l.patch
+rdma-hns-fix-soft-lockup-during-bt-pages-loop.patch
+rdma-hns-fix-unmatched-condition-in-error-path-of-al.patch
+rdma-hns-fix-a-missing-rollback-in-error-path-of-hns.patch
+rdma-hns-fix-wrong-value-of-max_sge_rd.patch
+bluetooth-fix-error-code-in-chan_alloc_skb_cb.patch
+ipv6-fix-memleak-of-nhc_pcpu_rth_output-in-fib_check.patch
+ipv6-set-errno-after-ip_fib_metrics_init-in-ip6_rout.patch
+net-atm-fix-use-after-free-in-lec_send.patch
+net-neighbor-add-missing-policy-for-ndtpa_queue_lenb.patch
+revert-gre-fix-ipv6-link-local-address-generation.patch
diff --git a/queue-5.15/xfrm_output-force-software-gso-only-in-tunnel-mode.patch b/queue-5.15/xfrm_output-force-software-gso-only-in-tunnel-mode.patch
new file mode 100644 (file)
index 0000000..57cde95
--- /dev/null
@@ -0,0 +1,77 @@
+From 94722d46a84f0bb1260e8804d22bb96a667d2e6f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Feb 2025 12:52:48 +0200
+Subject: xfrm_output: Force software GSO only in tunnel mode
+
+From: Cosmin Ratiu <cratiu@nvidia.com>
+
+[ Upstream commit 0aae2867aa6067f73d066bc98385e23c8454a1d7 ]
+
+The cited commit fixed a software GSO bug with VXLAN + IPSec in tunnel
+mode. Unfortunately, it is slightly broader than necessary, as it also
+severely affects performance for Geneve + IPSec transport mode over a
+device capable of both HW GSO and IPSec crypto offload. In this case,
+xfrm_output unnecessarily triggers software GSO instead of letting the
+HW do it. In simple iperf3 tests over Geneve + IPSec transport mode over
+a back-2-back pair of NICs with MTU 1500, the performance was observed
+to be up to 6x worse when doing software GSO compared to leaving it to
+the hardware.
+
+This commit makes xfrm_output only trigger software GSO in crypto
+offload cases for already encapsulated packets in tunnel mode, as not
+doing so would then cause the inner tunnel skb->inner_networking_header
+to be overwritten and break software GSO for that packet later if the
+device turns out to not be capable of HW GSO.
+
+Taking a closer look at the conditions for the original bug, to better
+understand the reasons for this change:
+- vxlan_build_skb -> iptunnel_handle_offloads sets inner_protocol and
+  inner network header.
+- then, udp_tunnel_xmit_skb -> ip_tunnel_xmit adds outer transport and
+  network headers.
+- later in the xmit path, xfrm_output -> xfrm_outer_mode_output ->
+  xfrm4_prepare_output -> xfrm4_tunnel_encap_add overwrites the inner
+  network header with the one set in ip_tunnel_xmit before adding the
+  second outer header.
+- __dev_queue_xmit -> validate_xmit_skb checks whether GSO segmentation
+  needs to happen based on dev features. In the original bug, the hw
+  couldn't segment the packets, so skb_gso_segment was invoked.
+- deep in the .gso_segment callback machinery, __skb_udp_tunnel_segment
+  tries to use the wrong inner network header, expecting the one set in
+  iptunnel_handle_offloads but getting the one set by xfrm instead.
+- a bit later, ipv6_gso_segment accesses the wrong memory based on that
+  wrong inner network header.
+
+With the new change, the original bug (or similar ones) cannot happen
+again, as xfrm will now trigger software GSO before applying a tunnel.
+This concern doesn't exist in packet offload mode, when the HW adds
+encapsulation headers. For the non-offloaded packets (crypto in SW),
+software GSO is still done unconditionally in the else branch.
+
+Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
+Reviewed-by: Yael Chemla <ychemla@nvidia.com>
+Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
+Fixes: a204aef9fd77 ("xfrm: call xfrm_output_gso when inner_protocol is set in xfrm_output")
+Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/xfrm/xfrm_output.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c
+index 4dc4a7bbe51cf..29ce7f6f16a09 100644
+--- a/net/xfrm/xfrm_output.c
++++ b/net/xfrm/xfrm_output.c
+@@ -737,7 +737,7 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb)
+               skb->encapsulation = 1;
+               if (skb_is_gso(skb)) {
+-                      if (skb->inner_protocol)
++                      if (skb->inner_protocol && x->props.mode == XFRM_MODE_TUNNEL)
+                               return xfrm_output_gso(net, sk, skb);
+                       skb_shinfo(skb)->gso_type |= SKB_GSO_ESP;
+-- 
+2.39.5
+