Message ID | cover.1740735165.git.tanggeliang@kylinos.cn (mailing list archive) |
---|---|
Headers | show |
Series | add sock_kmemdup helper | expand |
Hi Geliang, Thank you for your modifications, that's great! Our CI did some validations and here is its report: - KVM Validation: normal: Success! ✅ - KVM Validation: debug: Success! ✅ - KVM Validation: btf-normal (only bpftest_all): Success! ✅ - KVM Validation: btf-debug (only bpftest_all): Success! ✅ - Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/13585962844 Initiator: Patchew Applier Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/bce1a3afe292 Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=938919 If there are some issues, you can reproduce them using the same environment as the one used by the CI thanks to a docker image, e.g.: $ cd [kernel source code] $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \ --pull always mptcp/mptcp-upstream-virtme-docker:latest \ auto-normal For more details: https://github.com/multipath-tcp/mptcp-upstream-virtme-docker Please note that despite all the efforts that have been already done to have a stable tests suite when executed on a public CI like here, it is possible some reported issues are not due to your modifications. Still, do not hesitate to help us improve that ;-) Cheers, MPTCP GH Action bot Bot operated by Matthieu Baerts (NGI0 Core)
Hi Geliang, On 28/02/2025 11:01, Geliang Tang wrote: > v2: > - add "EXPORT_SYMBOL(sock_kmemdup)" as Matthieu suggested. > - drop the patch "use sock_kmemdup for tcp_ao_key". Thank you for the v2! For the modifications in MPTCP code, this looks OK to me: Acked-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Cheers, Matt
From: Geliang Tang <tanggeliang@kylinos.cn> v2: - add "EXPORT_SYMBOL(sock_kmemdup)" as Matthieu suggested. - drop the patch "use sock_kmemdup for tcp_ao_key". While developing MPTCP BPF path manager [1], I found it's useful to add a new sock_kmemdup() helper. My use case is this: In mptcp_userspace_pm_append_new_local_addr() function (see patch 3 in this patchset), it uses sock_kmalloc() to allocate an address entry "e", then immediately duplicate the input "entry" to it: ''' e = sock_kmalloc(sk, sizeof(*e), GFP_ATOMIC); if (!e) { ret = -ENOMEM; goto append_err; } *e = *entry; ''' When I implemented MPTCP BPF path manager, I needed to implement a code similar to this in BPF. The kfunc sock_kmalloc() can be easily invoked in BPF to allocate an entry "e", but the code "*e = *entry;" that assigns "entry" to "e" is not easy to implemented. I had to implement such a "copy entry" helper in BPF: ''' static void mptcp_pm_copy_addr(struct mptcp_addr_info *dst, struct mptcp_addr_info *src) { dst->id = src->id; dst->family = src->family; dst->port = src->port; if (src->family == AF_INET) { dst->addr.s_addr = src->addr.s_addr; } else if (src->family == AF_INET6) { dst->addr6.s6_addr32[0] = src->addr6.s6_addr32[0]; dst->addr6.s6_addr32[1] = src->addr6.s6_addr32[1]; dst->addr6.s6_addr32[2] = src->addr6.s6_addr32[2]; dst->addr6.s6_addr32[3] = src->addr6.s6_addr32[3]; } } static void mptcp_pm_copy_entry(struct mptcp_pm_addr_entry *dst, struct mptcp_pm_addr_entry *src) { mptcp_pm_copy_addr(&dst->addr, &src->addr); dst->flags = src->flags; dst->ifindex = src->ifindex; } ''' And add "write permission" for BPF to each field of mptcp_pm_addr_entry: ''' @@ static int bpf_mptcp_pm_btf_struct_access(struct bpf_verifier_log *log, case offsetof(struct mptcp_pm_addr_entry, addr.port): end = offsetofend(struct mptcp_pm_addr_entry, addr.port); break; #if IS_ENABLED(CONFIG_MPTCP_IPV6) case offsetof(struct mptcp_pm_addr_entry, addr.addr6.s6_addr32[0]): end = offsetofend(struct mptcp_pm_addr_entry, addr.addr6.s6_addr32[0]); break; case offsetof(struct mptcp_pm_addr_entry, addr.addr6.s6_addr32[1]): end = offsetofend(struct mptcp_pm_addr_entry, addr.addr6.s6_addr32[1]); break; case offsetof(struct mptcp_pm_addr_entry, addr.addr6.s6_addr32[2]): end = offsetofend(struct mptcp_pm_addr_entry, addr.addr6.s6_addr32[2]); break; case offsetof(struct mptcp_pm_addr_entry, addr.addr6.s6_addr32[3]): end = offsetofend(struct mptcp_pm_addr_entry, addr.addr6.s6_addr32[3]); break; #else case offsetof(struct mptcp_pm_addr_entry, addr.addr.s_addr): end = offsetofend(struct mptcp_pm_addr_entry, addr.addr.s_addr); break; #endif ''' But if there's a sock_kmemdup() helper, it will become much simpler, only need to call kfunc sock_kmemdup() instead in BPF. So this patchset adds this new helper and uses it in several places. [1] https://lore.kernel.org/mptcp/cover.1738924875.git.tanggeliang@kylinos.cn/ Geliang Tang (3): sock: add sock_kmemdup helper net: use sock_kmemdup for ip_options mptcp: use sock_kmemdup for address entry include/net/sock.h | 2 ++ net/core/sock.c | 16 ++++++++++++++++ net/ipv6/exthdrs.c | 3 +-- net/mptcp/pm_userspace.c | 3 +-- net/mptcp/protocol.c | 7 ++----- net/sctp/protocol.c | 7 ++----- 6 files changed, 24 insertions(+), 14 deletions(-)