mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ihor Solodrai <ihor.solodrai@linux.dev>
To: Siddharth Nayyar <sidnayyar@google.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	John Fastabend <john.fastabend@gmail.com>,
	Andrii Nakryiko <andrii@kernel.org>,
	Eduard Zingerman <eddyz87@gmail.com>,
	Kumar Kartikeya Dwivedi <memxor@gmail.com>,
	Martin KaFai Lau <martin.lau@linux.dev>,
	Song Liu <song@kernel.org>,
	Yonghong Song <yonghong.song@linux.dev>,
	Jiri Olsa <jolsa@kernel.org>,
	Emil Tsalapatis <emil@etsalapatis.com>,
	Quentin Monnet <qmo@kernel.org>, Shuah Khan <shuah@kernel.org>
Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-kselftest@vger.kernel.org,
	"Giuliano Procida" <gprocida@google.com>,
	"Neill Kapron" <nkapron@google.com>,
	"Thiébaud Weksteen" <tweek@google.com>,
	"Maxime Ripard" <mripard@kernel.org>
Subject: Re: [PATCH RFC bpf-next 0/7] bpf: Support struct_ops in light skeletons
Date: Mon, 9 Nov 2026 12:46:34 -0700	[thread overview]
Message-ID: <f5a22a46-0fd8-4739-bf11-a20e0b3a443b@linux.dev> (raw)
In-Reply-To: <20261106-lskel-struct-ops-v1-0-a4486ffc79cb@google.com>

On 11/6/26 1:19 PM, Siddharth Nayyar wrote:
> BPF light skeletons (bpftool gen skeleton -L) compile BPF object loading
> into a self-contained BPF_PROG_TYPE_SYSCALL loader program (gen_loader)
> embedded in a C header, removing any runtime dependency on libbpf or
> userspace BTF parsing. Currently, light skeletons do not support
> BPF_MAP_TYPE_STRUCT_OPS maps or BPF_PROG_TYPE_STRUCT_OPS programs
> because preparing a struct_ops map normally relies on libbpf parsing the
> target vmlinux or kernel module BTF in userspace to resolve type IDs,
> struct sizes, member byte offsets, and member indices.
> 
> This series adds BPF_MAP_TYPE_STRUCT_OPS support for link-based
> (SEC(".struct_ops.link")) maps in light skeletons across both vmlinux
> and kernel module BTF targets:
> 
> - Patch 1 adds a new bpf_btf_get_struct_member_info() helper for
>   BPF_PROG_TYPE_SYSCALL programs to query a struct's byte size (when the
>   member name is NULL) or a named member's byte offset and member index
>   from vmlinux or module BTF at load time.
> - Patches 2-5 wire up struct_ops initialization, map creation, program
>   loading, and map update in libbpf's gen_loader. At runtime, the loader
>   program resolves the kernel wrapper type bpf_struct_ops_<name> and
>   target <name> struct BTF IDs (and module BTF FDs) via
>   bpf_btf_find_by_name_kind(), queries struct sizes and member
>   offsets/indices via bpf_btf_get_struct_member_info(), constructs the
>   kernel vdata buffer in the loader data blob, passes the resolved BTF
>   metadata to BPF_MAP_CREATE and BPF_PROG_LOAD, and populates the
>   callback program FDs before issuing BPF_MAP_UPDATE_ELEM.
> - Patch 6 teaches bpftool to generate per-map skel_link_create() attach
>   functions and skel__attach() / skel__detach() plumbing for BPF_F_LINK
>   struct_ops maps in light skeletons, skips gen_st_ops_shadow() so the
>   light skeleton ctx layout is preserved, and rejects non-link
>   struct_ops maps.
> - Patch 7 adds light skeleton struct_ops selftests covering both vmlinux
>   (tcp_congestion_ops) and bpf_testmod (bpf_testmod_ops, including a
>   subset struct with reordered members, scalar fields, detach, and
>   re-attachment).
> 
> Adding a new BPF helper and alternative kfunc approach
> ======================================================
> I am aware that BPF helpers have been frozen for several years in favor
> of kfuncs. I propose adding bpf_btf_get_struct_member_info() as a BPF
> helper (restricted exclusively to BPF_PROG_TYPE_SYSCALL loader programs,
> alongside bpf_btf_find_by_name_kind()) because, to my knowledge, there
> is no better way to enable struct_ops support in light skeletons.
> 
> Before settling on a BPF helper, I explored an alternative approach
> using a kfunc, which hit a roadblock. Calling a kfunc directly from the
> light skeleton loader program is not possible because kfunc calls
> (BPF_PSEUDO_KFUNC_CALL) require the target kfunc's BTF ID in insn->imm
> when the loader program itself is loaded, whereas light skeletons ship
> pre-generated loader bytecode without userspace BTF resolution.

Hi Siddharth,

I don't think a new helper is going to fly.
It's a legacy baggage we are carrying because we can't easily get rid
of it, we don't want to make it heavier.

IIUC the problem is that the BPF instructions of the loader are
supposed to be frozen (signed?), therefore it's not an option to patch
them at load time, as libbpf normally does with kfuncs.

I think the way around this may be teaching the kernel to resolve
kfuncs itself, similar to how it resolves CO-RE relocations?

The call instruction (or a new bpf_core_relo kind) would refer to the
kfunc in the *program* BTF instead of a kernel BTF ID. Early in
bpf_check(), the verifier would look the name up in vmlinux and module
BTF, check prototype compatibility against the local FUNC, and patch
imm/off. The rest of the verifier would see a regular kfunc call.

The loader could then call kfuncs, so your member info query could be
a kfunc, and the programs it loads would resolve kfuncs the same way
libbpf does.

One concern with this may be that we are moving libbpf functionality
into the kernel, which may not be desirable for reasons I haven't
thought of. Not sure.

Andrii, Alexei, wdyt? Any other ideas?



> [...]

      parent reply	other threads:[~2026-11-09 19:46 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-06 20:19 Siddharth Nayyar
2026-11-06 20:19 ` [PATCH RFC bpf-next 1/7] bpf: Add bpf_btf_get_struct_member_info() helper Siddharth Nayyar
2026-11-06 20:56   ` bot+bpf-ci
2026-11-06 20:19 ` [PATCH RFC bpf-next 2/7] libbpf: Implement bpf_gen__init_kern_struct_ops() for light skeletons Siddharth Nayyar
2026-11-06 20:56   ` bot+bpf-ci
2026-11-06 20:19 ` [PATCH RFC bpf-next 3/7] libbpf: Support BPF_MAP_TYPE_STRUCT_OPS in bpf_gen__map_create() Siddharth Nayyar
2026-11-06 20:56   ` bot+bpf-ci
2026-11-06 20:19 ` [PATCH RFC bpf-next 4/7] libbpf: Support BPF_PROG_TYPE_STRUCT_OPS in bpf_gen__prog_load() Siddharth Nayyar
2026-11-06 20:56   ` bot+bpf-ci
2026-11-06 20:19 ` [PATCH RFC bpf-next 5/7] libbpf: Implement bpf_gen__struct_ops_update_elem() for light skeletons Siddharth Nayyar
2026-11-06 20:56   ` bot+bpf-ci
2026-11-06 20:19 ` [PATCH RFC bpf-next 6/7] bpftool: Generate attach and detach for struct_ops in " Siddharth Nayyar
2026-11-06 20:19 ` [PATCH RFC bpf-next 7/7] selftests/bpf: Add light skeleton struct_ops tests Siddharth Nayyar
2026-11-09 19:46 ` Ihor Solodrai [this message]

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=f5a22a46-0fd8-4739-bf11-a20e0b3a443b@linux.dev \
    --to=ihor.solodrai@linux.dev \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=emil@etsalapatis.com \
    --cc=gprocida@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=martin.lau@linux.dev \
    --cc=memxor@gmail.com \
    --cc=mripard@kernel.org \
    --cc=nkapron@google.com \
    --cc=qmo@kernel.org \
    --cc=shuah@kernel.org \
    --cc=sidnayyar@google.com \
    --cc=song@kernel.org \
    --cc=tweek@google.com \
    --cc=yonghong.song@linux.dev \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®