]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Aug 2024 17:44:32 +0000 (19:44 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Aug 2024 17:44:32 +0000 (19:44 +0200)
added patches:
mptcp-pass-addr-to-mptcp_pm_alloc_anno_list.patch
mptcp-pm-do-not-ignore-subflow-if-signal-flag-is-also-set.patch
mptcp-pm-don-t-try-to-create-sf-if-alloc-failed.patch
mptcp-pm-reduce-indentation-blocks.patch
selftests-mptcp-join-test-both-signal-subflow.patch
series

queue-6.1/mptcp-pass-addr-to-mptcp_pm_alloc_anno_list.patch [new file with mode: 0644]
queue-6.1/mptcp-pm-do-not-ignore-subflow-if-signal-flag-is-also-set.patch [new file with mode: 0644]
queue-6.1/mptcp-pm-don-t-try-to-create-sf-if-alloc-failed.patch [new file with mode: 0644]
queue-6.1/mptcp-pm-reduce-indentation-blocks.patch [new file with mode: 0644]
queue-6.1/selftests-mptcp-join-test-both-signal-subflow.patch [new file with mode: 0644]
queue-6.1/series [new file with mode: 0644]

diff --git a/queue-6.1/mptcp-pass-addr-to-mptcp_pm_alloc_anno_list.patch b/queue-6.1/mptcp-pass-addr-to-mptcp_pm_alloc_anno_list.patch
new file mode 100644 (file)
index 0000000..66518fc
--- /dev/null
@@ -0,0 +1,89 @@
+From stable+bounces-67437-greg=kroah.com@vger.kernel.org Tue Aug 13 11:28:38 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue, 13 Aug 2024 11:28:17 +0200
+Subject: mptcp: pass addr to mptcp_pm_alloc_anno_list
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: Geliang Tang <geliang.tang@suse.com>, Matthieu Baerts <matthieu.baerts@tessares.net>, Jakub Kicinski <kuba@kernel.org>, Matthieu Baerts <matttbe@kernel.org>
+Message-ID: <20240813092815.966749-8-matttbe@kernel.org>
+
+From: Geliang Tang <geliang.tang@suse.com>
+
+commit 528cb5f2a1e859522f36f091f29f5c81ec6d4a4c upstream.
+
+Pass addr parameter to mptcp_pm_alloc_anno_list() instead of entry. We
+can reduce the scope, e.g. in mptcp_pm_alloc_anno_list(), we only access
+"entry->addr", we can then restrict to the pointer to "addr" then.
+
+Signed-off-by: Geliang Tang <geliang.tang@suse.com>
+Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
+Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: c95eb32ced82 ("mptcp: pm: reduce indentation blocks")
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/pm_netlink.c   |    8 ++++----
+ net/mptcp/pm_userspace.c |    2 +-
+ net/mptcp/protocol.h     |    2 +-
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+--- a/net/mptcp/pm_netlink.c
++++ b/net/mptcp/pm_netlink.c
+@@ -352,7 +352,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock
+ }
+ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
+-                            const struct mptcp_pm_addr_entry *entry)
++                            const struct mptcp_addr_info *addr)
+ {
+       struct mptcp_pm_add_entry *add_entry = NULL;
+       struct sock *sk = (struct sock *)msk;
+@@ -360,7 +360,7 @@ bool mptcp_pm_alloc_anno_list(struct mpt
+       lockdep_assert_held(&msk->pm.lock);
+-      add_entry = mptcp_lookup_anno_list_by_saddr(msk, &entry->addr);
++      add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
+       if (add_entry) {
+               if (mptcp_pm_is_kernel(msk))
+@@ -377,7 +377,7 @@ bool mptcp_pm_alloc_anno_list(struct mpt
+       list_add(&add_entry->list, &msk->pm.anno_list);
+-      add_entry->addr = entry->addr;
++      add_entry->addr = *addr;
+       add_entry->sock = msk;
+       add_entry->retrans_times = 0;
+@@ -580,7 +580,7 @@ static void mptcp_pm_create_subflow_or_s
+                       return;
+               if (local) {
+-                      if (mptcp_pm_alloc_anno_list(msk, local)) {
++                      if (mptcp_pm_alloc_anno_list(msk, &local->addr)) {
+                               __clear_bit(local->addr.id, msk->pm.id_avail_bitmap);
+                               msk->pm.add_addr_signaled++;
+                               mptcp_pm_announce_addr(msk, &local->addr, false);
+--- a/net/mptcp/pm_userspace.c
++++ b/net/mptcp/pm_userspace.c
+@@ -225,7 +225,7 @@ int mptcp_nl_cmd_announce(struct sk_buff
+       lock_sock((struct sock *)msk);
+       spin_lock_bh(&msk->pm.lock);
+-      if (mptcp_pm_alloc_anno_list(msk, &addr_val)) {
++      if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) {
+               msk->pm.add_addr_signaled++;
+               mptcp_pm_announce_addr(msk, &addr_val.addr, false);
+               mptcp_pm_nl_addr_send_ack(msk);
+--- a/net/mptcp/protocol.h
++++ b/net/mptcp/protocol.h
+@@ -812,7 +812,7 @@ int mptcp_pm_nl_mp_prio_send_ack(struct
+                                struct mptcp_addr_info *rem,
+                                u8 bkup);
+ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
+-                            const struct mptcp_pm_addr_entry *entry);
++                            const struct mptcp_addr_info *addr);
+ void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
+ bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
+ struct mptcp_pm_add_entry *
diff --git a/queue-6.1/mptcp-pm-do-not-ignore-subflow-if-signal-flag-is-also-set.patch b/queue-6.1/mptcp-pm-do-not-ignore-subflow-if-signal-flag-is-also-set.patch
new file mode 100644 (file)
index 0000000..5fb1a46
--- /dev/null
@@ -0,0 +1,103 @@
+From stable+bounces-67440-greg=kroah.com@vger.kernel.org Tue Aug 13 11:28:40 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue, 13 Aug 2024 11:28:20 +0200
+Subject: mptcp: pm: do not ignore 'subflow' if 'signal' flag is also set
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, Paolo Abeni <pabeni@redhat.com>, Mat Martineau <martineau@kernel.org>, Jakub Kicinski <kuba@kernel.org>
+Message-ID: <20240813092815.966749-11-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+commit 85df533a787bf07bf4367ce2a02b822ff1fba1a3 upstream.
+
+Up to the 'Fixes' commit, having an endpoint with both the 'signal' and
+'subflow' flags, resulted in the creation of a subflow and an address
+announcement using the address linked to this endpoint. After this
+commit, only the address announcement was done, ignoring the 'subflow'
+flag.
+
+That's because the same bitmap is used for the two flags. It is OK to
+keep this single bitmap, the already selected local endpoint simply have
+to be re-used, but not via select_local_address() not to look at the
+just modified bitmap.
+
+Note that it is unusual to set the two flags together: creating a new
+subflow using a new local address will implicitly advertise it to the
+other peer. So in theory, no need to advertise it explicitly as well.
+Maybe there are use-cases -- the subflow might not reach the other peer
+that way, we can ask the other peer to try initiating the new subflow
+without delay -- or very likely the user is confused, and put both flags
+"just to be sure at least the right one is set". Still, if it is
+allowed, the kernel should do what has been asked: using this endpoint
+to announce the address and to create a new subflow from it.
+
+An alternative is to forbid the use of the two flags together, but
+that's probably too late, there are maybe use-cases, and it was working
+before. This patch will avoid people complaining subflows are not
+created using the endpoint they added with the 'subflow' and 'signal'
+flag.
+
+Note that with the current patch, the subflow might not be created in
+some corner cases, e.g. if the 'subflows' limit was reached when sending
+the ADD_ADDR, but changed later on. It is probably not worth splitting
+id_avail_bitmap per target ('signal', 'subflow'), which will add another
+large field to the msk "just" to track (again) endpoints. Anyway,
+currently when the limits are changed, the kernel doesn't check if new
+subflows can be created or removed, because we would need to keep track
+of the received ADD_ADDR, and more. It sounds OK to assume that the
+limits should be properly configured before establishing new
+connections.
+
+Fixes: 86e39e04482b ("mptcp: keep track of local endpoint still available for each msk")
+Cc: stable@vger.kernel.org
+Suggested-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Mat Martineau <martineau@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Link: https://patch.msgid.link/20240731-upstream-net-20240731-mptcp-endp-subflow-signal-v1-5-c8a9b036493b@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/pm_netlink.c |   16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+--- a/net/mptcp/pm_netlink.c
++++ b/net/mptcp/pm_netlink.c
+@@ -524,8 +524,8 @@ __lookup_addr(struct pm_nl_pernet *perne
+ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
+ {
++      struct mptcp_pm_addr_entry *local, *signal_and_subflow = NULL;
+       struct sock *sk = (struct sock *)msk;
+-      struct mptcp_pm_addr_entry *local;
+       unsigned int add_addr_signal_max;
+       unsigned int local_addr_max;
+       struct pm_nl_pernet *pernet;
+@@ -591,6 +591,9 @@ static void mptcp_pm_create_subflow_or_s
+               msk->pm.add_addr_signaled++;
+               mptcp_pm_announce_addr(msk, &local->addr, false);
+               mptcp_pm_nl_addr_send_ack(msk);
++
++              if (local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW)
++                      signal_and_subflow = local;
+       }
+ subflow:
+@@ -601,9 +604,14 @@ subflow:
+               bool fullmesh;
+               int i, nr;
+-              local = select_local_address(pernet, msk);
+-              if (!local)
+-                      break;
++              if (signal_and_subflow) {
++                      local = signal_and_subflow;
++                      signal_and_subflow = NULL;
++              } else {
++                      local = select_local_address(pernet, msk);
++                      if (!local)
++                              break;
++              }
+               fullmesh = !!(local->flags & MPTCP_PM_ADDR_FLAG_FULLMESH);
diff --git a/queue-6.1/mptcp-pm-don-t-try-to-create-sf-if-alloc-failed.patch b/queue-6.1/mptcp-pm-don-t-try-to-create-sf-if-alloc-failed.patch
new file mode 100644 (file)
index 0000000..0719a78
--- /dev/null
@@ -0,0 +1,71 @@
+From stable+bounces-67439-greg=kroah.com@vger.kernel.org Tue Aug 13 11:28:38 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue, 13 Aug 2024 11:28:19 +0200
+Subject: mptcp: pm: don't try to create sf if alloc failed
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, Paolo Abeni <pabeni@redhat.com>, Mat Martineau <martineau@kernel.org>, Jakub Kicinski <kuba@kernel.org>
+Message-ID: <20240813092815.966749-10-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+commit cd7c957f936f8cb80d03e5152f4013aae65bd986 upstream.
+
+It sounds better to avoid wasting cycles and / or put extreme memory
+pressure on the system by trying to create new subflows if it was not
+possible to add a new item in the announce list.
+
+While at it, a warning is now printed if the entry was already in the
+list as it should not happen with the in-kernel path-manager. With this
+PM, mptcp_pm_alloc_anno_list() should only fail in case of memory
+pressure.
+
+Fixes: b6c08380860b ("mptcp: remove addr and subflow in PM netlink")
+Cc: stable@vger.kernel.org
+Suggested-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Mat Martineau <martineau@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Link: https://patch.msgid.link/20240731-upstream-net-20240731-mptcp-endp-subflow-signal-v1-4-c8a9b036493b@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/pm_netlink.c |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+--- a/net/mptcp/pm_netlink.c
++++ b/net/mptcp/pm_netlink.c
+@@ -363,7 +363,7 @@ bool mptcp_pm_alloc_anno_list(struct mpt
+       add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
+       if (add_entry) {
+-              if (mptcp_pm_is_kernel(msk))
++              if (WARN_ON_ONCE(mptcp_pm_is_kernel(msk)))
+                       return false;
+               sk_reset_timer(sk, &add_entry->add_timer,
+@@ -567,8 +567,6 @@ static void mptcp_pm_create_subflow_or_s
+       /* check first for announce */
+       if (msk->pm.add_addr_signaled < add_addr_signal_max) {
+-              local = select_signal_address(pernet, msk);
+-
+               /* due to racing events on both ends we can reach here while
+                * previous add address is still running: if we invoke now
+                * mptcp_pm_announce_addr(), that will fail and the
+@@ -579,11 +577,15 @@ static void mptcp_pm_create_subflow_or_s
+               if (msk->pm.addr_signal & BIT(MPTCP_ADD_ADDR_SIGNAL))
+                       return;
++              local = select_signal_address(pernet, msk);
+               if (!local)
+                       goto subflow;
++              /* If the alloc fails, we are on memory pressure, not worth
++               * continuing, and trying to create subflows.
++               */
+               if (!mptcp_pm_alloc_anno_list(msk, &local->addr))
+-                      goto subflow;
++                      return;
+               __clear_bit(local->addr.id, msk->pm.id_avail_bitmap);
+               msk->pm.add_addr_signaled++;
diff --git a/queue-6.1/mptcp-pm-reduce-indentation-blocks.patch b/queue-6.1/mptcp-pm-reduce-indentation-blocks.patch
new file mode 100644 (file)
index 0000000..f510aaf
--- /dev/null
@@ -0,0 +1,58 @@
+From stable+bounces-67438-greg=kroah.com@vger.kernel.org Tue Aug 13 11:28:37 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue, 13 Aug 2024 11:28:18 +0200
+Subject: mptcp: pm: reduce indentation blocks
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, Paolo Abeni <pabeni@redhat.com>, Mat Martineau <martineau@kernel.org>, Jakub Kicinski <kuba@kernel.org>
+Message-ID: <20240813092815.966749-9-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+commit c95eb32ced823a00be62202b43966b07b2f20b7f upstream.
+
+That will simplify the following commits.
+
+No functional changes intended.
+
+Suggested-by: Paolo Abeni <pabeni@redhat.com>
+Reviewed-by: Mat Martineau <martineau@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Link: https://patch.msgid.link/20240731-upstream-net-20240731-mptcp-endp-subflow-signal-v1-3-c8a9b036493b@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: cd7c957f936f ("mptcp: pm: don't try to create sf if alloc failed")
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/pm_netlink.c |   19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+--- a/net/mptcp/pm_netlink.c
++++ b/net/mptcp/pm_netlink.c
+@@ -579,16 +579,19 @@ static void mptcp_pm_create_subflow_or_s
+               if (msk->pm.addr_signal & BIT(MPTCP_ADD_ADDR_SIGNAL))
+                       return;
+-              if (local) {
+-                      if (mptcp_pm_alloc_anno_list(msk, &local->addr)) {
+-                              __clear_bit(local->addr.id, msk->pm.id_avail_bitmap);
+-                              msk->pm.add_addr_signaled++;
+-                              mptcp_pm_announce_addr(msk, &local->addr, false);
+-                              mptcp_pm_nl_addr_send_ack(msk);
+-                      }
+-              }
++              if (!local)
++                      goto subflow;
++
++              if (!mptcp_pm_alloc_anno_list(msk, &local->addr))
++                      goto subflow;
++
++              __clear_bit(local->addr.id, msk->pm.id_avail_bitmap);
++              msk->pm.add_addr_signaled++;
++              mptcp_pm_announce_addr(msk, &local->addr, false);
++              mptcp_pm_nl_addr_send_ack(msk);
+       }
++subflow:
+       /* check if should create a new subflow */
+       while (msk->pm.local_addr_used < local_addr_max &&
+              msk->pm.subflows < subflows_max) {
diff --git a/queue-6.1/selftests-mptcp-join-test-both-signal-subflow.patch b/queue-6.1/selftests-mptcp-join-test-both-signal-subflow.patch
new file mode 100644 (file)
index 0000000..7f551a6
--- /dev/null
@@ -0,0 +1,72 @@
+From stable+bounces-67442-greg=kroah.com@vger.kernel.org Tue Aug 13 11:28:51 2024
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+Date: Tue, 13 Aug 2024 11:28:21 +0200
+Subject: selftests: mptcp: join: test both signal & subflow
+To: mptcp@lists.linux.dev, stable@vger.kernel.org, gregkh@linuxfoundation.org
+Cc: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>, Mat Martineau <martineau@kernel.org>, Jakub Kicinski <kuba@kernel.org>
+Message-ID: <20240813092815.966749-12-matttbe@kernel.org>
+
+From: "Matthieu Baerts (NGI0)" <matttbe@kernel.org>
+
+commit 4d2868b5d191c74262f7407972d68d1bf3245d6a upstream.
+
+It should be quite uncommon to set both the subflow and the signal
+flags: the initiator of the connection is typically the one creating new
+subflows, not the other peer, then no need to announce additional local
+addresses, and use it to create subflows.
+
+But some people might be confused about the flags, and set both "just to
+be sure at least the right one is set". To verify the previous fix, and
+avoid future regressions, this specific case is now validated: the
+client announces a new address, and initiates a new subflow from the
+same address.
+
+While working on this, another bug has been noticed, where the client
+reset the new subflow because an ADD_ADDR echo got received as the 3rd
+ACK: this new test also explicitly checks that no RST have been sent by
+the client and server.
+
+The 'Fixes' tag here below is the same as the one from the previous
+commit: this patch here is not fixing anything wrong in the selftests,
+but it validates the previous fix for an issue introduced by this commit
+ID.
+
+Fixes: 86e39e04482b ("mptcp: keep track of local endpoint still available for each msk")
+Reviewed-by: Mat Martineau <martineau@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Link: https://patch.msgid.link/20240731-upstream-net-20240731-mptcp-endp-subflow-signal-v1-7-c8a9b036493b@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+[ No conflicts, but not using 'chk_add_nr 1 1 0 invert': in this
+  version, 'chk_add_nr' cannot be used with 'invert': d73bb9d3957b
+  ("selftests: mptcp: join: ability to invert ADD_ADDR check") is not in
+  this version, and backporting it causes a lot of conflicts. That's
+  fine, checking that there is an additional subflow should be enough. ]
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/testing/selftests/net/mptcp/mptcp_join.sh |   14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
++++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
+@@ -2090,6 +2090,20 @@ signal_address_tests()
+               chk_add_nr 1 1
+       fi
++      # uncommon: subflow and signal flags on the same endpoint
++      # or because the user wrongly picked both, but still expects the client
++      # to create additional subflows
++      if reset "subflow and signal together"; then
++              pm_nl_set_limits $ns1 0 2
++              pm_nl_set_limits $ns2 0 2
++              pm_nl_add_endpoint $ns2 10.0.3.2 flags signal,subflow
++              run_tests $ns1 $ns2 10.0.1.1
++              chk_join_nr 1 1 1
++              chk_add_nr 0 0 0         # none initiated by ns1
++              chk_rst_nr 0 0 invert    # no RST sent by the client
++              chk_rst_nr 0 0           # no RST sent by the server
++      fi
++
+       # accept and use add_addr with additional subflows
+       if reset "multiple subflows and signal"; then
+               pm_nl_set_limits $ns1 0 3
diff --git a/queue-6.1/series b/queue-6.1/series
new file mode 100644 (file)
index 0000000..1a9d0ed
--- /dev/null
@@ -0,0 +1,5 @@
+mptcp-pass-addr-to-mptcp_pm_alloc_anno_list.patch
+mptcp-pm-reduce-indentation-blocks.patch
+mptcp-pm-don-t-try-to-create-sf-if-alloc-failed.patch
+mptcp-pm-do-not-ignore-subflow-if-signal-flag-is-also-set.patch
+selftests-mptcp-join-test-both-signal-subflow.patch