From: Greg Kroah-Hartman Date: Tue, 27 Feb 2024 10:31:35 +0000 (+0100) Subject: 6.1-stable patches X-Git-Tag: v4.19.308~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87fa4de1b60eae9b9ea261ce871fba6063fb7b07;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches 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 --- 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 index 00000000000..4043091aa1f --- /dev/null +++ b/queue-6.1/mm-zswap-fix-missing-folio-cleanup-in-writeback-race-path.patch @@ -0,0 +1,48 @@ +From e3b63e966cac0bf78aaa1efede1827a252815a1d Mon Sep 17 00:00:00 2001 +From: Yosry Ahmed +Date: Thu, 25 Jan 2024 08:51:27 +0000 +Subject: mm: zswap: fix missing folio cleanup in writeback race path + +From: Yosry Ahmed + +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 +Reviewed-by: Chengming Zhou +Acked-by: Johannes Weiner +Reviewed-by: Nhat Pham +Cc: Domenico Cerasuolo +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Yosry Ahmed +Signed-off-by: Greg Kroah-Hartman +--- + 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 index 00000000000..e89f2a34737 --- /dev/null +++ b/queue-6.1/mptcp-add-needs_id-for-netlink-appending-addr.patch @@ -0,0 +1,99 @@ +From 584f3894262634596532cf43a5e782e34a0ce374 Mon Sep 17 00:00:00 2001 +From: Geliang Tang +Date: Thu, 15 Feb 2024 19:25:29 +0100 +Subject: mptcp: add needs_id for netlink appending addr + +From: Geliang Tang + +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 +Reviewed-by: Mat Martineau +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: David S. Miller +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + 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 index 00000000000..29ebe9c89bb --- /dev/null +++ b/queue-6.1/mptcp-userspace-pm-send-rm_addr-for-id-0.patch @@ -0,0 +1,85 @@ +From 84c531f54ad9a124a924c9505d74e33d16965146 Mon Sep 17 00:00:00 2001 +From: Geliang Tang +Date: Wed, 25 Oct 2023 16:37:04 -0700 +Subject: mptcp: userspace pm send RM_ADDR for ID 0 + +From: Geliang Tang + +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 +Signed-off-by: Geliang Tang +Signed-off-by: Mat Martineau +Link: https://lore.kernel.org/r/20231025-send-net-next-20231025-v1-3-db8f25f798eb@kernel.org +Signed-off-by: Jakub Kicinski +Fixes: d9a4594edabf ("mptcp: netlink: Add MPTCP_PM_CMD_REMOVE") +Signed-off-by: Matthieu Baerts (NGI0) +Signed-off-by: Greg Kroah-Hartman +--- + 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) { diff --git a/queue-6.1/series b/queue-6.1/series index d578e7842af..b23d629ad24 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -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