From: Jiri Olsa <jolsa@kernel.org>
To: Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>
Cc: bpf@vger.kernel.org, linux-mm@kvack.org,
Andrii Nakryiko <andrii@kernel.org>,
Eduard Zingerman <eddyz87@gmail.com>,
Kumar Kartikeya Dwivedi <memxor@gmail.com>,
Lorenzo Stoakes <ljs@kernel.org>,
John Fastabend <john.fastabend@gmail.com>,
Federico Di Pierro <nierro92@gmail.com>
Subject: [PATCHv3 bpf-next 0/8] bpf: Add user memory kfuncs
Date: Thu, 5 Nov 2026 11:23:34 +0100 [thread overview]
Message-ID: <20261105102343.311331-1-jolsa@kernel.org> (raw)
hi,
BPF programs have no supported interface for creating or removing private
anonymous mappings in the current task. This limits use cases that need normal
or executable memory in a live process, such as replacing a function or
changing environment variables.
Although bpf_probe_write_user() can write to user memory, it disables page
faults during the copy and therefore cannot handle memory that needs to be
faulted in.
This series adds three sleepable kfuncs for those operations:
- bpf_user_anon_mmap(len, prot) creates a private anonymous mapping in the
current task and returns its address. The requested protections can include
execute permission.
- bpf_copy_to_user(dst, src, len, flags) copies data into the current task’s
address space, handles page faults, and reports copy errors.
- bpf_user_munmap(addr, len) removes a mapping.
Together, the kfuncs provide a small interface for allocating, populating,
and removing memory:
addr = bpf_user_anon_mmap(len, prot);
ret = bpf_copy_to_user((void *)addr, src, len, flags);
bpf_user_munmap(addr, len);
This interface lets a BPF program perform the operations in the current task’s
address space without changing bpf_probe_write_user()’s fault behavior or
introducing a separate mapping abstraction.
thanks,
jirka
rfc: https://lore.kernel.org/bpf/20261021195759.119421-1-jolsa@kernel.org/
v1: https://lore.kernel.org/bpf/20261029212551.56964-1-jolsa@kernel.org/
v2: https://lore.kernel.org/bpf/20261103075916.100050-1-jolsa@kernel.org/
v3 changes:
- use Alexei's change for checking the const [Aleexi]
- drop ia32 support/hack for vm_mmap [Alexei]
- remove leftover srcptr suffix in kfunc declaration
- drop extra verifier test for non-sleepable kprobe
v2 changes:
- infer read-only from constness of a pointer instead of srcptr
argument suffix [Andrii]
- rename bpf_user_mmap to bpf_user_anon_mmap [Andrii]
- use arch_validate_prot to validate prot argument in mmap
- add the x86 compat mmap workaround
- assorted small changes
v1 changes:
- follow vm_mmap/vm_munmap design suggested by Alexei
- allow user space write only to current process, because we don't
have remote task use case and it simplifies security checks
- many changes in tests
---
Jiri Olsa (8):
bpf: Honor const on generic kfunc memory arguments
bpf: Add user memory kfuncs
selftests/bpf: Add get_procmap_info helper
selftests/bpf: Test const kfunc memory arguments
selftests/bpf: Test user memory mmap kfuncs
selftests/bpf: Test user memory page exec
selftests/bpf: Test bpf_copy_to_user kfunc
selftests/bpf: Test user memory kfunc errors
Documentation/bpf/kfuncs.rst | 21 ++++
kernel/bpf/helpers.c | 107 ++++++++++++++++
kernel/bpf/syscall.c | 10 +-
kernel/bpf/verifier.c | 24 +++-
tools/testing/selftests/bpf/prog_tests/kfunc_call.c | 2 +
tools/testing/selftests/bpf/prog_tests/user_mem.c | 349 ++++++++++++++++++++++++++++++++++++++++++++++++++++
tools/testing/selftests/bpf/progs/kfunc_call_fail.c | 10 ++
tools/testing/selftests/bpf/progs/kfunc_call_test.c | 14 +++
tools/testing/selftests/bpf/progs/user_mem.c | 101 +++++++++++++++
tools/testing/selftests/bpf/test_kmods/bpf_testmod.c | 10 ++
tools/testing/selftests/bpf/test_kmods/bpf_testmod_kfunc.h | 2 +
tools/testing/selftests/bpf/trace_helpers.c | 38 +++++-
tools/testing/selftests/bpf/trace_helpers.h | 1 +
13 files changed, 676 insertions(+), 13 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/user_mem.c
create mode 100644 tools/testing/selftests/bpf/progs/user_mem.c
next reply other threads:[~2026-11-05 10:23 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-05 10:23 Jiri Olsa [this message]
2026-11-05 10:23 ` [PATCHv3 bpf-next 1/8] bpf: Honor const on generic kfunc memory arguments Jiri Olsa
2026-11-05 10:59 ` bot+bpf-ci
2026-11-05 10:23 ` [PATCHv3 bpf-next 2/8] bpf: Add user memory kfuncs Jiri Olsa
2026-11-05 10:44 ` sashiko-bot
2026-11-05 10:23 ` [PATCHv3 bpf-next 3/8] selftests/bpf: Add get_procmap_info helper Jiri Olsa
2026-11-05 10:23 ` [PATCHv3 bpf-next 4/8] selftests/bpf: Test const kfunc memory arguments Jiri Olsa
2026-11-05 10:32 ` sashiko-bot
2026-11-05 10:23 ` [PATCHv3 bpf-next 5/8] selftests/bpf: Test user memory mmap kfuncs Jiri Olsa
2026-11-05 10:33 ` sashiko-bot
2026-11-05 10:23 ` [PATCHv3 bpf-next 6/8] selftests/bpf: Test user memory page exec Jiri Olsa
2026-11-05 10:23 ` [PATCHv3 bpf-next 7/8] selftests/bpf: Test bpf_copy_to_user kfunc Jiri Olsa
2026-11-05 10:23 ` [PATCHv3 bpf-next 8/8] selftests/bpf: Test user memory kfunc errors Jiri Olsa
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=20261105102343.311331-1-jolsa@kernel.org \
--to=jolsa@kernel.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=john.fastabend@gmail.com \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=memxor@gmail.com \
--cc=nierro92@gmail.com \
/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