From nobody Thu Sep 18 11:29:22 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690230jap; Thu, 16 Dec 2021 14:24:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJzJI0r5HZO3L0HD6fwfmVrIbAkoO8DMr9D7jRpuz+Vn8Ha8HiLRPZbLhuLobSgsJdwDGHuT X-Received: by 2002:a63:8441:: with SMTP id k62mr251579pgd.152.1639693462434; Thu, 16 Dec 2021 14:24:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693462; cv=none; d=google.com; s=arc-20160816; b=okV8aZ4wshsdt4QDj5pivAa2ODrnjpKgtvYNOfUW9FYq7di+EmMpTon5v9PsklVzyG 1GhHCormSU58WsIaYICmrV6qs25jwEsOMs7Sv22F9/MIhNxGlA6Dpo8vkwLUnlXSkMm7 NC3GYAkK7W4m5IXkhZ+jcbf/yr2B/I9lRyHg7O9CJZ8FORNillJbNcGMFV/gJjFQ2rLF sZeCB8XLvdKxdRm0k+Te3gk1WOigYqrD/rjCkCHIJlpJH/D+zZ4oA6JvxFiQFfVdszu6 eI9L5jLDqlwtsR9gFDqzLHtorG7Tce9JnssAsGC1iG1SHSwHofsJ4Yrwo+GHGHcMa6LH yaxA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=GfABm51SZfA8A4pK/OOBi2tIlNgUiC1Zob/OoGrS5J0=; b=xMdhjwcycMD0cwbOtZojWK6cVFMijL7tw/rHrGM0mixVotlqDOI39iYUtns6/LH2Hb eCyNEpaxayIs5Sq1iaVqYPSIVNOz8/yRHSe9m2LQF3iTUStuKxp07OFr0RBQWlZ1TilJ 0XUFDYrChwm7wbqpuHFK6gdRirMk/JDq72otVnVHkLClS6iUQL4a7QxASzrJOs94rOdI pemb0cM43yHb1MqWWIwUg7UBXjF/KMec50YHCzzi1Ir7LX8rqyP6GMleYJAa6/3uHVTQ MByNqTUv80v9OKd6vLLRNyFNu7uoxm4P3eyIc4VOAQqgjIs7IHwObSzpCVOFAaALNOQi USUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZY3Fga8h; spf=pass (google.com: domain of mptcp+bounces-2801-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2801-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id t14si5242277plg.17.2021.12.16.14.24.22 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:22 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2801-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZY3Fga8h; spf=pass (google.com: domain of mptcp+bounces-2801-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2801-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id D15FE3E0E77 for ; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 28EA93FC0; Thu, 16 Dec 2021 22:24:18 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C7A902CA7 for ; Thu, 16 Dec 2021 22:24:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693456; x=1671229456; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=u7ln60s7R4d1FomcW5RgcqIW5uF6tc/aywzy3OXklOw=; b=ZY3Fga8hMI5J2CCMLzgSB9r/rHpASC4eBo5p9Qzp8XEp28Lj9vbtP2dB 9GaMAKRL9rrXtJXpKLSMK+RuVCBspVaRgv1md5OGTXW6Mbn562ercVlWD ieJ0nv0w6BYFuh22KV2oBt16gxKbTVjqgBVwWab7if5C2ImD5Njl1rM4i FAcuOK2gWB1ThXQPvrPQeL96JZLEW/ibwH05XtY6+sXXaknB0jcSApP0R iuQOhUVB2IX3bvPfkSQTV3UYrja0wknDZwpq3B6GKs9tgs/z6ZOuu5Zvs ps80Yaw3QX5EmCMdPX+4JA0Sk1E1vC/Iu+f6cyRHMfjJ1vQiy8GpxkvwX Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393161" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393161" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461238" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 06/21] mptcp: netlink: store lsk ref in mptcp_pm_addr_entry Date: Thu, 16 Dec 2021 17:22:59 -0500 Message-Id: <20211216222314.1244708-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates struct mptcp_pm_addr_entry to store a listening socket (lsk) reference, i.e. a pointer to a reference counted structure containing the lsk (struct socket *) instead of the lsk itself. Code blocks that directly operated on the lsk in struct mptcp_pm_addr_entry have been updated to work with the lsk ref instead, utilizing the new helper functions that operate on lsk refs. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 62 ++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 0cb03d78e22b..29f6d01ace2d 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -35,7 +35,7 @@ struct mptcp_pm_addr_entry { struct mptcp_addr_info addr; u8 flags; int ifindex; - struct socket *lsk; + struct mptcp_local_lsk *lsk_ref; }; =20 struct mptcp_pm_add_entry { @@ -983,7 +983,8 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_= nl_pernet *pernet, } =20 static int mptcp_pm_nl_create_listen_socket(struct sock *sk, - struct mptcp_pm_addr_entry *entry) + struct mptcp_pm_addr_entry *entry, + struct socket **lsk) { struct sockaddr_storage addr; struct mptcp_sock *msk; @@ -992,11 +993,11 @@ static int mptcp_pm_nl_create_listen_socket(struct so= ck *sk, int err; =20 err =3D sock_create_kern(sock_net(sk), entry->addr.family, - SOCK_STREAM, IPPROTO_MPTCP, &entry->lsk); + SOCK_STREAM, IPPROTO_MPTCP, lsk); if (err) return err; =20 - msk =3D mptcp_sk(entry->lsk->sk); + msk =3D mptcp_sk((*lsk)->sk); if (!msk) { err =3D -EINVAL; goto out; @@ -1025,7 +1026,8 @@ static int mptcp_pm_nl_create_listen_socket(struct so= ck *sk, return 0; =20 out: - sock_release(entry->lsk); + sock_release(*lsk); + *lsk =3D NULL; return err; } =20 @@ -1074,7 +1076,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, = struct sock_common *skc) entry->addr.port =3D 0; entry->ifindex =3D 0; entry->flags =3D 0; - entry->lsk =3D NULL; + entry->lsk_ref =3D NULL; ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); if (ret < 0) kfree(entry); @@ -1270,6 +1272,7 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb,= struct genl_info *info) struct nlattr *attr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; struct pm_nl_pernet *pernet =3D genl_info_pm_nl(info); struct mptcp_pm_addr_entry addr, *entry; + struct socket *lsk; int ret; =20 ret =3D mptcp_pm_parse_addr(attr, info, true, &addr); @@ -1284,18 +1287,34 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *sk= b, struct genl_info *info) =20 *entry =3D addr; if (entry->addr.port) { - ret =3D mptcp_pm_nl_create_listen_socket(skb->sk, entry); - if (ret) { - GENL_SET_ERR_MSG(info, "create listen socket error"); - kfree(entry); - return ret; + entry->lsk_ref =3D lsk_list_find(pernet, &entry->addr); + + if (!entry->lsk_ref) { + ret =3D mptcp_pm_nl_create_listen_socket(skb->sk, entry, &lsk); + + if (ret) { + GENL_SET_ERR_MSG(info, "create listen socket error"); + kfree(entry); + return ret; + } + + entry->lsk_ref =3D lsk_list_add(pernet, &entry->addr, lsk); + + if (!entry->lsk_ref) { + GENL_SET_ERR_MSG(info, "can't allocate lsk ref"); + sock_release(lsk); + kfree(entry); + return -ENOMEM; + } } } + ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); + if (ret < 0) { GENL_SET_ERR_MSG(info, "too many addresses or duplicate one"); - if (entry->lsk) - sock_release(entry->lsk); + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); kfree(entry); return ret; } @@ -1398,10 +1417,11 @@ static int mptcp_nl_remove_subflow_and_signal_addr(= struct net *net, } =20 /* caller must ensure the RCU grace period is already elapsed */ -static void __mptcp_pm_release_addr_entry(struct mptcp_pm_addr_entry *entr= y) +static void __mptcp_pm_release_addr_entry(struct pm_nl_pernet *pernet, + struct mptcp_pm_addr_entry *entry) { - if (entry->lsk) - sock_release(entry->lsk); + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); kfree(entry); } =20 @@ -1483,7 +1503,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb,= struct genl_info *info) =20 mptcp_nl_remove_subflow_and_signal_addr(sock_net(skb->sk), &entry->addr); synchronize_rcu(); - __mptcp_pm_release_addr_entry(entry); + __mptcp_pm_release_addr_entry(pernet, entry); =20 return ret; } @@ -1539,7 +1559,7 @@ static void mptcp_nl_remove_addrs_list(struct net *ne= t, } =20 /* caller must ensure the RCU grace period is already elapsed */ -static void __flush_addrs(struct list_head *list) +static void __flush_addrs(struct pm_nl_pernet *pernet, struct list_head *l= ist) { while (!list_empty(list)) { struct mptcp_pm_addr_entry *cur; @@ -1547,7 +1567,7 @@ static void __flush_addrs(struct list_head *list) cur =3D list_entry(list->next, struct mptcp_pm_addr_entry, list); list_del_rcu(&cur->list); - __mptcp_pm_release_addr_entry(cur); + __mptcp_pm_release_addr_entry(pernet, cur); } } =20 @@ -1572,7 +1592,7 @@ static int mptcp_nl_cmd_flush_addrs(struct sk_buff *s= kb, struct genl_info *info) spin_unlock_bh(&pernet->lock); mptcp_nl_remove_addrs_list(sock_net(skb->sk), &free_list); synchronize_rcu(); - __flush_addrs(&free_list); + __flush_addrs(pernet, &free_list); return 0; } =20 @@ -2199,7 +2219,7 @@ static void __net_exit pm_nl_exit_net(struct list_hea= d *net_list) * other modifiers, also netns core already waited for a * RCU grace period. */ - __flush_addrs(&pernet->local_addr_list); + __flush_addrs(pernet, &pernet->local_addr_list); } } =20 --=20 2.31.1