From nobody Thu Sep 18 11:14:17 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2129973jaa; Wed, 2 Feb 2022 23:25:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJxgUIcp/nmkCYYfIaKRy33fKHZpX1tjymjuw3HRQvTm0ahk84Al8ESGReCJlj/wSciJdAtJ X-Received: by 2002:a05:620a:7e7:: with SMTP id k7mr22782564qkk.268.1643873124598; Wed, 02 Feb 2022 23:25:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643873124; cv=none; d=google.com; s=arc-20160816; b=pZPXm7nsy/2Qv4M/yQKiY/F4FBmmnrm2EQTcy8KdpTJlWGXRe2g1CMjOpCHj8VOkDg A+jkAKowiPMIIMeIrObtKIFEHykDKQrGrQSJ5nn+5wKXBkmCaprsRm48ygJt+zna6zHb U7/7imcLA4cXZnn5CwTm/ChNP8yW0bPVbO4ty+Q9Ikv9syQMAgMEDxxidHwktxql1D5J Yn/m9BXGlIRmlztdNnkxGyxj1sYqMJy8rYhlQSNMmM8gpmB3T3w0ZIiFjB8Xu0tkntkq 0FOCY7wWbeztLW0qNxrwEdW7QpBsJtP/tI76VTU7RQ9SIIzw544CWd+BSqxEuqy6LahF jDQg== 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=2EgxlikbHqVOD+iv8BuVGnL65o4xBN/7AwO6T3NsqCQ=; b=oE9+nGXyiI2n54c2T4kM3pEEd7bW5aP5KMeUyH25ItswfJ99GFYOR86iMJ3syhRN+D R2coVNDAGO5B2x5rxJVj+2rPaHBi1ESm6Ur2lj5Czh37pBOIPSUIV4qpO49m2DGQuhSm 8SqslKSviWrIbGaTjkgGQlLvCLhGw8h4nHH9TuNnoH3v4OQfev3Q5ybqcurn5L7E5JpM DiZyTsoVkeiOyntSJ187XBtn25Ov7SR3V4Hy6yM+L1UN7D7qols6ZpEjah5vge1WnF45 9hjgffCL7tDurWhy0waGclw3LPPUEeImTld4PqpurmB0l/CCDblZpk7THveeS5eN5B0B 7usg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=k4UbdTwC; spf=pass (google.com: domain of mptcp+bounces-3447-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3447-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 101si15708756qtg.338.2022.02.02.23.25.24 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 23:25:24 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3447-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=k4UbdTwC; spf=pass (google.com: domain of mptcp+bounces-3447-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3447-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 3E1E11C0425 for ; Thu, 3 Feb 2022 07:25:24 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C36442CA4; Thu, 3 Feb 2022 07:25:20 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 437B32C9D for ; Thu, 3 Feb 2022 07:25:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643873119; x=1675409119; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=EtJNFBe+tNKy51yk4DnKNVwStlaZ9uX06yyF25qBonE=; b=k4UbdTwCsJF9/yhXvKYMExTgH8Vg/UYbFI7KzWW19IbR6tFrvE6rkMMx 8OhoDvr80WgRGcewvri60zjyc6VF1UPATe8fZ1BuRJ/vP68eiGKO0kMLO OstzROlZB6DccKsc8BL/4Y0tWPWWWaUQhhZMf2QR9DciVTgFFdQxUqEXw roUG1fbbojA0DaCHymWTcUSUNnxjZelThKwVtmhRM3m3ojD2dTzhy4gpM ac77ezGX55/Izk9F/xWkAwzhtFem/3L03/W2W02Lf7hpQDvTsaBpOzFxu MElNyQE4YTFZ70zj6bpux0B12K5pR+qIfLNMhb9on5B8/dY+WS2+D/mgI Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="272580775" X-IronPort-AV: E=Sophos;i="5.88,339,1635231600"; d="scan'208";a="272580775" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 23:25:14 -0800 X-IronPort-AV: E=Sophos;i="5.88,339,1635231600"; d="scan'208";a="535118729" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 23:25:14 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 6/8] mptcp: netlink: store lsk ref in mptcp_pm_addr_entry Date: Thu, 3 Feb 2022 02:25:06 -0500 Message-Id: <20220203072508.3072309-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203072508.3072309-1-kishen.maloor@intel.com> References: <20220203072508.3072309-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 previously operated on the lsk in struct mptcp_pm_addr_entry have been updated to work with the lsk ref instead, utilizing new helper functions. Signed-off-by: Kishen Maloor --- v2: fixed formatting v3: added helper lsk_list_find_or_create(), updated mptcp_pm_nl_create_listen_socket() to take struct net* as param v4: call lsk_list_find() after a failed lsk_list_find_or_create() for a chance to retrieve a recently created lsk by a simultaneous call v5: fixed implicit declaration error --- net/mptcp/pm_netlink.c | 83 +++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 3d6251baef26..a4fb9acbba51 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 { @@ -66,6 +66,10 @@ struct pm_nl_pernet { #define MPTCP_PM_ADDR_MAX 8 #define ADD_ADDR_RETRANS_MAX 3 =20 +static int mptcp_pm_nl_create_listen_socket(struct net *net, + struct mptcp_pm_addr_entry *entry, + struct socket **lsk); + static bool addresses_equal(const struct mptcp_addr_info *a, const struct mptcp_addr_info *b, bool use_port) { @@ -157,6 +161,33 @@ static void lsk_list_release(struct pm_nl_pernet *pern= et, } } =20 +static struct mptcp_local_lsk *lsk_list_find_or_create(struct net *net, + struct pm_nl_pernet *pernet, + struct mptcp_pm_addr_entry *entry, + int *createlsk_err) +{ + struct mptcp_local_lsk *lsk_ref; + struct socket *lsk; + int err; + + lsk_ref =3D lsk_list_find(pernet, &entry->addr); + + if (!lsk_ref) { + err =3D mptcp_pm_nl_create_listen_socket(net, entry, &lsk); + + if (createlsk_err) + *createlsk_err =3D err; + + if (lsk) + lsk_ref =3D lsk_list_add(pernet, &entry->addr, lsk); + + if (lsk && !lsk_ref) + sock_release(lsk); + } + + return lsk_ref; +} + static bool address_zero(const struct mptcp_addr_info *addr) { struct mptcp_addr_info zero; @@ -999,8 +1030,9 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm= _nl_pernet *pernet, return ret; } =20 -static int mptcp_pm_nl_create_listen_socket(struct sock *sk, - struct mptcp_pm_addr_entry *entry) +static int mptcp_pm_nl_create_listen_socket(struct net *net, + struct mptcp_pm_addr_entry *entry, + struct socket **lsk) { int addrlen =3D sizeof(struct sockaddr_in); struct sockaddr_storage addr; @@ -1009,12 +1041,12 @@ static int mptcp_pm_nl_create_listen_socket(struct = sock *sk, int backlog =3D 1024; int err; =20 - err =3D sock_create_kern(sock_net(sk), entry->addr.family, - SOCK_STREAM, IPPROTO_MPTCP, &entry->lsk); + err =3D sock_create_kern(net, entry->addr.family, + 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; @@ -1046,7 +1078,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 @@ -1095,7 +1128,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); @@ -1304,18 +1337,25 @@ 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"); + entry->lsk_ref =3D lsk_list_find_or_create(sock_net(skb->sk), pernet, en= try, &ret); + + if (!entry->lsk_ref) + entry->lsk_ref =3D lsk_list_find(pernet, &entry->addr); + + if (!entry->lsk_ref) { + GENL_SET_ERR_MSG(info, "can't create/allocate lsk"); kfree(entry); + ret =3D (ret =3D=3D 0) ? -ENOMEM : ret; return ret; } } + 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; } @@ -1418,10 +1458,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 @@ -1503,7 +1544,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; } @@ -1559,7 +1600,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; @@ -1567,7 +1608,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 @@ -1592,7 +1633,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 @@ -2242,7 +2283,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