From nobody Sat Apr 20 11:15:48 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107814jah; Wed, 12 Jan 2022 14:16:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJyooM4Se9DMks8vL/0Vaip2OFJbplPeVBFLSidnMiS/GEN/Qv88+nC0+XevzaSCM4y1mZo9 X-Received: by 2002:a05:6214:2484:: with SMTP id gi4mr1732662qvb.36.1642025779787; Wed, 12 Jan 2022 14:16:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025779; cv=none; d=google.com; s=arc-20160816; b=Gat7LNe/bBy2Zt85Lan+Z0sLR+Ru+nc+Q8/jujIN/qEAhCFdXoMYOv3GL6wCQxbOnz sI1wYiAB+3RcrB5aq2JQooxvKkHqpeAY7QQcP59Me/v/zWzb25jvxMAquPtYn7IRvaLI e5g859ieoSWloJUDBHU6EHSm36YpKpzB8Ynj2bgByHNqBXsmuXwiOAM/0a9hoFwlDEHe LvpkEQuWy2PKghhHKc4om9ezcHgrrDJt+UCvJC4Bw2O47SbW2dzEhZLLTIo3JrBSGxUb 2fr0cI0gF1cHBCtWC24I0OIb2UCTdPYZWrsyEd/8gbN9kfe4L6XKCnYViWBM4BZ7OvWF h6Wg== 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=wchLrJjyj7uHHpBo5TDtUvlm2Ik+LMsQUUlHtsVNkAk=; b=pugCFlFngce87wz7kWtz2UIlM1sDqtUqWi+o69+koxd7QwHYS9tsgvoH6oLpzE/5AS Fzmgv0wVaM47ww3QZPpLZ5Sq1y+xP5JA7AerK/sN8+IJaeRspGXcxEzH+lcdKowayTOn 0D9dVRPb8cdbyGEoKckH4975cYpswF2uOqc4K+dWdXy12DUEqSY8BAnGu6r9OQz45VF6 fwtDmQtyV86aNRBBsfn7dESB7TBsFItj7UhjMigR1QEnChaXc9ytcxhJOspC3CkBqOvy hdsY0ApEFSnUKffw2irdY3P9xJBjXci7K0sGq5D6dNtNM661P4bOfjsjfKa1K478UkUN hqVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=UdRJpfgn; spf=pass (google.com: domain of mptcp+bounces-3080-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3080-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id g8si407497qke.346.2022.01.12.14.16.19 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:19 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3080-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=UdRJpfgn; spf=pass (google.com: domain of mptcp+bounces-3080-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3080-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 ewr.edge.kernel.org (Postfix) with ESMTPS id 97C0E1C0726 for ; Wed, 12 Jan 2022 22:16:19 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 137D42CA9; Wed, 12 Jan 2022 22:16:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 A0EAB2CA5 for ; Wed, 12 Jan 2022 22:16:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642025772; x=1673561772; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=r4GMc6LKC2K42+FKNenk3il7PVutlelI2qbyAddfPCU=; b=UdRJpfgntvbmElw4l24uq3yC4lWAJq5WTA1taUipJzs1rTey9s8GHsbH 1QvDAopmYCggY7sQ0tPbl3hfHZtv3Q+I+aeqpFafamd8plht3kd/3agLc cF1g5CLChufLGrndvATzUZQZrXTHCpDNfVQDCqEfImV5xrZgJ+VYSEchc Z9Pw2QmDrCwR8CorP6m8njEWCH7ZLvH+lNRUkJA8o5R+vu9KIwme1EykP x84PJaMeGD8ZBm+4tKWipHiDLKKhppipat7LzkIpRfhMiZvzz4iRo5X7B grsaFYHQrvk71FGdlOXYSMs8JrtSEF+CE9C9kmNm3p5aBmw++9Scg9KLx A==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213933" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213933" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907345" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 06/21] mptcp: netlink: store lsk ref in mptcp_pm_addr_entry Date: Wed, 12 Jan 2022 17:15:08 -0500 Message-Id: <20220112221523.1829397-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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. v2: fixed formatting 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 4ad43310d50d..4c1895dbc2a5 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