]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Feb 2024 10:31:35 +0000 (11:31 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Feb 2024 10:31:35 +0000 (11:31 +0100)
added patches:
mm-zswap-fix-missing-folio-cleanup-in-writeback-race-path.patch
mptcp-add-needs_id-for-netlink-appending-addr.patch
mptcp-userspace-pm-send-rm_addr-for-id-0.patch

queue-6.1/mm-zswap-fix-missing-folio-cleanup-in-writeback-race-path.patch [new file with mode: 0644]
queue-6.1/mptcp-add-needs_id-for-netlink-appending-addr.patch [new file with mode: 0644]
queue-6.1/mptcp-userspace-pm-send-rm_addr-for-id-0.patch [new file with mode: 0644]
queue-6.1/series

diff --git a/queue-6.1/mm-zswap-fix-missing-folio-cleanup-in-writeback-race-path.patch b/queue-6.1/mm-zswap-fix-missing-folio-cleanup-in-writeback-race-path.patch
new file mode 100644 (file)
index 0000000..4043091
--- /dev/null
@@ -0,0 +1,48 @@
+From e3b63e966cac0bf78aaa1efede1827a252815a1d Mon Sep 17 00:00:00 2001
+From: Yosry Ahmed <yosryahmed@google.com>
+Date: Thu, 25 Jan 2024 08:51:27 +0000
+Subject: mm: zswap: fix missing folio cleanup in writeback race path
+
+From: Yosry Ahmed <yosryahmed@google.com>
+
+commit e3b63e966cac0bf78aaa1efede1827a252815a1d upstream.
+
+In zswap_writeback_entry(), after we get a folio from
+__read_swap_cache_async(), we grab the tree lock again to check that the
+swap entry was not invalidated and recycled.  If it was, we delete the
+folio we just added to the swap cache and exit.
+
+However, __read_swap_cache_async() returns the folio locked when it is
+newly allocated, which is always true for this path, and the folio is
+ref'd.  Make sure to unlock and put the folio before returning.
+
+This was discovered by code inspection, probably because this path handles
+a race condition that should not happen often, and the bug would not crash
+the system, it will only strand the folio indefinitely.
+
+Link: https://lkml.kernel.org/r/20240125085127.1327013-1-yosryahmed@google.com
+Fixes: 04fc7816089c ("mm: fix zswap writeback race condition")
+Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
+Reviewed-by: Chengming Zhou <zhouchengming@bytedance.com>
+Acked-by: Johannes Weiner <hannes@cmpxchg.org>
+Reviewed-by: Nhat Pham <nphamcs@gmail.com>
+Cc: Domenico Cerasuolo <cerasuolodomenico@gmail.com>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Yosry Ahmed <yosryahmed@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ mm/zswap.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/mm/zswap.c
++++ b/mm/zswap.c
+@@ -1013,6 +1013,8 @@ static int zswap_writeback_entry(struct
+               if (zswap_rb_search(&tree->rbroot, entry->offset) != entry) {
+                       spin_unlock(&tree->lock);
+                       delete_from_swap_cache(page_folio(page));
++                      unlock_page(page);
++                      put_page(page);
+                       ret = -ENOMEM;
+                       goto fail;
+               }
diff --git a/queue-6.1/mptcp-add-needs_id-for-netlink-appending-addr.patch b/queue-6.1/mptcp-add-needs_id-for-netlink-appending-addr.patch
new file mode 100644 (file)
index 0000000..e89f2a3
--- /dev/null
@@ -0,0 +1,99 @@
+From 584f3894262634596532cf43a5e782e34a0ce374 Mon Sep 17 00:00:00 2001
+From: Geliang Tang <tanggeliang@kylinos.cn>
+Date: Thu, 15 Feb 2024 19:25:29 +0100
+Subject: mptcp: add needs_id for netlink appending addr
+
+From: Geliang Tang <tanggeliang@kylinos.cn>
+
+commit 584f3894262634596532cf43a5e782e34a0ce374 upstream.
+
+Just the same as userspace PM, a new parameter needs_id is added for
+in-kernel PM mptcp_pm_nl_append_new_local_addr() too.
+
+Add a new helper mptcp_pm_has_addr_attr_id() to check whether an address
+ID is set from PM or not.
+
+In mptcp_pm_nl_get_local_id(), needs_id is always true, but in
+mptcp_pm_nl_add_addr_doit(), pass mptcp_pm_has_addr_attr_id() to
+needs_it.
+
+Fixes: efd5a4c04e18 ("mptcp: add the address ID assignment bitmap")
+Cc: stable@vger.kernel.org
+Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
+Reviewed-by: Mat Martineau <martineau@kernel.org>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/pm_netlink.c |   24 +++++++++++++++++++-----
+ 1 file changed, 19 insertions(+), 5 deletions(-)
+
+--- a/net/mptcp/pm_netlink.c
++++ b/net/mptcp/pm_netlink.c
+@@ -900,7 +900,8 @@ static void __mptcp_pm_release_addr_entr
+ }
+ static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet,
+-                                           struct mptcp_pm_addr_entry *entry)
++                                           struct mptcp_pm_addr_entry *entry,
++                                           bool needs_id)
+ {
+       struct mptcp_pm_addr_entry *cur, *del_entry = NULL;
+       unsigned int addr_max;
+@@ -942,7 +943,7 @@ static int mptcp_pm_nl_append_new_local_
+               }
+       }
+-      if (!entry->addr.id) {
++      if (!entry->addr.id && needs_id) {
+ find_next:
+               entry->addr.id = find_next_zero_bit(pernet->id_bitmap,
+                                                   MPTCP_PM_MAX_ADDR_ID + 1,
+@@ -953,7 +954,7 @@ find_next:
+               }
+       }
+-      if (!entry->addr.id)
++      if (!entry->addr.id && needs_id)
+               goto out;
+       __set_bit(entry->addr.id, pernet->id_bitmap);
+@@ -1095,7 +1096,7 @@ int mptcp_pm_nl_get_local_id(struct mptc
+       entry->ifindex = 0;
+       entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
+       entry->lsk = NULL;
+-      ret = mptcp_pm_nl_append_new_local_addr(pernet, entry);
++      ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true);
+       if (ret < 0)
+               kfree(entry);
+@@ -1311,6 +1312,18 @@ next:
+       return 0;
+ }
++static bool mptcp_pm_has_addr_attr_id(const struct nlattr *attr,
++                                    struct genl_info *info)
++{
++      struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];
++
++      if (!nla_parse_nested_deprecated(tb, MPTCP_PM_ADDR_ATTR_MAX, attr,
++                                       mptcp_pm_addr_policy, info->extack) &&
++          tb[MPTCP_PM_ADDR_ATTR_ID])
++              return true;
++      return false;
++}
++
+ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
+ {
+       struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
+@@ -1352,7 +1365,8 @@ static int mptcp_nl_cmd_add_addr(struct
+                       goto out_free;
+               }
+       }
+-      ret = mptcp_pm_nl_append_new_local_addr(pernet, entry);
++      ret = mptcp_pm_nl_append_new_local_addr(pernet, entry,
++                                              !mptcp_pm_has_addr_attr_id(attr, info));
+       if (ret < 0) {
+               GENL_SET_ERR_MSG(info, "too many addresses or duplicate one");
+               goto out_free;
diff --git a/queue-6.1/mptcp-userspace-pm-send-rm_addr-for-id-0.patch b/queue-6.1/mptcp-userspace-pm-send-rm_addr-for-id-0.patch
new file mode 100644 (file)
index 0000000..29ebe9c
--- /dev/null
@@ -0,0 +1,85 @@
+From 84c531f54ad9a124a924c9505d74e33d16965146 Mon Sep 17 00:00:00 2001
+From: Geliang Tang <geliang.tang@suse.com>
+Date: Wed, 25 Oct 2023 16:37:04 -0700
+Subject: mptcp: userspace pm send RM_ADDR for ID 0
+
+From: Geliang Tang <geliang.tang@suse.com>
+
+commit 84c531f54ad9a124a924c9505d74e33d16965146 upstream.
+
+This patch adds the ability to send RM_ADDR for local ID 0. Check
+whether id 0 address is removed, if not, put id 0 into a removing
+list, pass it to mptcp_pm_remove_addr() to remove id 0 address.
+
+There is no reason not to allow the userspace to remove the initial
+address (ID 0). This special case was not taken into account not
+letting the userspace to delete all addresses as announced.
+
+Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/379
+Reviewed-by: Matthieu Baerts <matttbe@kernel.org>
+Signed-off-by: Geliang Tang <geliang.tang@suse.com>
+Signed-off-by: Mat Martineau <martineau@kernel.org>
+Link: https://lore.kernel.org/r/20231025-send-net-next-20231025-v1-3-db8f25f798eb@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Fixes: d9a4594edabf ("mptcp: netlink: Add MPTCP_PM_CMD_REMOVE")
+Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/mptcp/pm_userspace.c |   39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+--- a/net/mptcp/pm_userspace.c
++++ b/net/mptcp/pm_userspace.c
+@@ -222,6 +222,40 @@ int mptcp_nl_cmd_announce(struct sk_buff
+       return err;
+ }
++static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk,
++                                                   struct genl_info *info)
++{
++      struct mptcp_rm_list list = { .nr = 0 };
++      struct mptcp_subflow_context *subflow;
++      struct sock *sk = (struct sock *)msk;
++      bool has_id_0 = false;
++      int err = -EINVAL;
++
++      lock_sock(sk);
++      mptcp_for_each_subflow(msk, subflow) {
++              if (subflow->local_id == 0) {
++                      has_id_0 = true;
++                      break;
++              }
++      }
++      if (!has_id_0) {
++              GENL_SET_ERR_MSG(info, "address with id 0 not found");
++              goto remove_err;
++      }
++
++      list.ids[list.nr++] = 0;
++
++      spin_lock_bh(&msk->pm.lock);
++      mptcp_pm_remove_addr(msk, &list);
++      spin_unlock_bh(&msk->pm.lock);
++
++      err = 0;
++
++remove_err:
++      release_sock(sk);
++      return err;
++}
++
+ int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info)
+ {
+       struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
+@@ -253,6 +287,11 @@ int mptcp_nl_cmd_remove(struct sk_buff *
+               goto remove_err;
+       }
++      if (id_val == 0) {
++              err = mptcp_userspace_pm_remove_id_zero_address(msk, info);
++              goto remove_err;
++      }
++
+       lock_sock((struct sock *)msk);
+       list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
index d578e7842afd4c2047d63d8ffc63f3708f660fb9..b23d629ad249541d275ddf1e1beb8df032e3b5a4 100644 (file)
@@ -187,3 +187,6 @@ erofs-simplify-compression-configuration-parser.patch
 erofs-fix-inconsistent-per-file-compression-format.patch
 mm-damon-reclaim-fix-quota-stauts-loss-due-to-online-tunings.patch
 fs-aio-restrict-kiocb_set_cancel_fn-to-i-o-submitted-via-libaio.patch
+mm-zswap-fix-missing-folio-cleanup-in-writeback-race-path.patch
+mptcp-userspace-pm-send-rm_addr-for-id-0.patch
+mptcp-add-needs_id-for-netlink-appending-addr.patch