diff options
author | Kumar Kartikeya Dwivedi <memxor@gmail.com> | 2023-09-13 01:32:03 +0200 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2023-09-16 09:34:21 -0700 |
commit | b9ae0c9dd0aca79bffc17be51c2dc148d1f72708 (patch) | |
tree | 707dbacb5c8d333b110716dc52f482d02f6b6b13 /include/linux/bpf_verifier.h | |
parent | aaa619ebccb2b78b3c6d2c0cd72d206ee8fc0025 (diff) | |
download | linux-b9ae0c9dd0aca79bffc17be51c2dc148d1f72708.tar.gz linux-b9ae0c9dd0aca79bffc17be51c2dc148d1f72708.tar.bz2 linux-b9ae0c9dd0aca79bffc17be51c2dc148d1f72708.zip |
bpf: Add support for custom exception callbacks
By default, the subprog generated by the verifier to handle a thrown
exception hardcodes a return value of 0. To allow user-defined logic
and modification of the return value when an exception is thrown,
introduce the 'exception_callback:' declaration tag, which marks a
callback as the default exception handler for the program.
The format of the declaration tag is 'exception_callback:<value>', where
<value> is the name of the exception callback. Each main program can be
tagged using this BTF declaratiion tag to associate it with an exception
callback. In case the tag is absent, the default callback is used.
As such, the exception callback cannot be modified at runtime, only set
during verification.
Allowing modification of the callback for the current program execution
at runtime leads to issues when the programs begin to nest, as any
per-CPU state maintaing this information will have to be saved and
restored. We don't want it to stay in bpf_prog_aux as this takes a
global effect for all programs. An alternative solution is spilling
the callback pointer at a known location on the program stack on entry,
and then passing this location to bpf_throw as a parameter.
However, since exceptions are geared more towards a use case where they
are ideally never invoked, optimizing for this use case and adding to
the complexity has diminishing returns.
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20230912233214.1518551-7-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'include/linux/bpf_verifier.h')
-rw-r--r-- | include/linux/bpf_verifier.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index da21a3ec5027..94ec766432f5 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -300,6 +300,7 @@ struct bpf_func_state { bool in_callback_fn; struct tnum callback_ret_range; bool in_async_callback_fn; + bool in_exception_callback_fn; /* The following fields should be last. See copy_func_state() */ int acquired_refs; |