From: Matthieu Baerts <matttbe@kernel.org>
To: Geliang Tang <geliang@kernel.org>, mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: Re: [PATCH mptcp-next v7 07/11] mptcp: pm: initialize and release mptcp_pm_ops
Date: Mon, 3 Mar 2025 11:53:03 +0100 [thread overview]
Message-ID: <038d7f67-b235-4010-a75f-1ef5651bbb4b@kernel.org> (raw)
In-Reply-To: <7c65de17fee4c36d003684e730c1459542eedca8.1740975633.git.tanggeliang@kylinos.cn>
Hi Geliang,
On 03/03/2025 05:22, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> Add a struct mptcp_pm_ops pointer "ops" in struct mptcp_pm_data, and two
> functions mptcp_pm_initialize() and mptcp_pm_release(), to set and release
> this pointer. mptcp_pm_initialize() is invoked in mptcp_pm_data_reset(),
> while mptcp_pm_release() is invoked in mptcp_pm_destroy().
>
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
> net/mptcp/pm.c | 42 +++++++++++++++++++++++++++++++++++++++---
> net/mptcp/protocol.h | 3 +++
> 2 files changed, 42 insertions(+), 3 deletions(-)
>
> diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
> index 98f81221786f..e8b34f2ecb35 100644
> --- a/net/mptcp/pm.c
> +++ b/net/mptcp/pm.c
> @@ -973,15 +973,15 @@ void mptcp_pm_worker(struct mptcp_sock *msk)
> void mptcp_pm_destroy(struct mptcp_sock *msk)
> {
> mptcp_pm_free_anno_list(msk);
> -
> - if (mptcp_pm_is_userspace(msk))
> - mptcp_userspace_pm_free_local_addr_list(msk);
> + mptcp_pm_release(msk);
> }
>
> void mptcp_pm_data_reset(struct mptcp_sock *msk)
> {
> + const char *path_manager = mptcp_get_path_manager(sock_net((struct sock *)msk));
> u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk));
> struct mptcp_pm_data *pm = &msk->pm;
> + int ret;
>
> pm->add_addr_signaled = 0;
> pm->add_addr_accepted = 0;
> @@ -991,6 +991,12 @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
> pm->rm_list_rx.nr = 0;
> WRITE_ONCE(pm->pm_type, pm_type);
>
> + rcu_read_lock();
> + ret = mptcp_pm_initialize(msk, mptcp_pm_find(path_manager));
> + rcu_read_unlock();
> + if (ret)
> + return;
Mmh, that's annoying if pm->ops has not been set here! I don't think
mptcp_pm_initialize() can fail and if it does, it should stop the
connection.
> +
> if (pm_type == MPTCP_PM_TYPE_KERNEL) {> bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
>
> @@ -1102,3 +1108,33 @@ void mptcp_pm_get_available(char *buf, size_t maxlen)
> }
> rcu_read_unlock();
> }
> +
> +int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm)
> +{
> + if (!pm)
I guess this should never happen, right? Or maybe yes if a BPF PM has
been unloaded?
> + pm = &mptcp_kernel_pm;
> +
> + if (!bpf_try_module_get(pm, pm->owner))
> + return -EBUSY;
Should it not fallback to the kernel PM + print a warning (once?)?
pr_warn_once("%pm %s couldn't be initialized, falling back to 'kernel'",
pm->name);
pm = &mptcp_kernel_pm;
> +
> + msk->pm.ops = pm;
> + if (msk->pm.ops->init)
> + msk->pm.ops->init(msk);
> +
> + pr_debug("pm %s initialized\n", pm->name);
> + return 0;
> +}
> +
> +void mptcp_pm_release(struct mptcp_sock *msk)
> +{
> + struct mptcp_pm_ops *pm = msk->pm.ops;
> +
> + if (!pm)
> + return;
> +
> + msk->pm.ops = NULL;
> + if (pm->release)
> + pm->release(msk);
> +
> + bpf_module_put(pm, pm->owner);
> +}
Can you not declare mptcp_pm_release() and mptcp_pm_initialize() as
static and move them above mptcp_pm_destroy() and mptcp_pm_data_reset()?
It would make more sense, and no need to export them in protocol.h.
Cheers,
Matt
--
Sponsored by the NGI0 Core fund.
next prev parent reply other threads:[~2025-03-03 10:53 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-03 4:22 [PATCH mptcp-next v7 00/11] BPF path manager, part 5 Geliang Tang
2025-03-03 4:22 ` [PATCH mptcp-next v7 01/11] mptcp: pm: define struct mptcp_pm_ops Geliang Tang
2025-03-03 10:39 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 02/11] mptcp: sysctl: new sysctl to set path manager by name Geliang Tang
2025-03-03 10:40 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 03/11] mptcp: sysctl: map pm_type to path_manager Geliang Tang
2025-03-03 10:40 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 04/11] mptcp: sysctl: add available_path_managers Geliang Tang
2025-03-03 10:41 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 05/11] mptcp: pm: in-kernel: register mptcp_kernel_pm Geliang Tang
2025-03-03 10:42 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 06/11] mptcp: pm: userspace: register mptcp_userspace_pm Geliang Tang
2025-03-03 10:52 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 07/11] mptcp: pm: initialize and release mptcp_pm_ops Geliang Tang
2025-03-03 10:53 ` Matthieu Baerts [this message]
2025-03-03 4:22 ` [PATCH mptcp-next v7 08/11] mptcp: pm: drop pm_type in mptcp_pm_data Geliang Tang
2025-03-03 10:57 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 09/11] mptcp: sysctl: drop get_pm_type helper Geliang Tang
2025-03-03 10:57 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 10/11] mptcp: pm: make get_local_id helpers static Geliang Tang
2025-03-03 10:58 ` Matthieu Baerts
2025-03-03 4:22 ` [PATCH mptcp-next v7 11/11] mptcp: pm: make is_backup " Geliang Tang
2025-03-03 5:32 ` [PATCH mptcp-next v7 00/11] BPF path manager, part 5 MPTCP CI
2025-03-03 10:38 ` Matthieu Baerts
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=038d7f67-b235-4010-a75f-1ef5651bbb4b@kernel.org \
--to=matttbe@kernel.org \
--cc=geliang@kernel.org \
--cc=mptcp@lists.linux.dev \
--cc=tanggeliang@kylinos.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.