bpf: Allow loading of a bpf_iter program
A bpf_iter program is a tracing program with attach type BPF_TRACE_ITER. The load attribute attach_btf_id is used by the verifier against a particular kernel function, which represents a target, e.g., __bpf_iter__bpf_map for target bpf_map which is implemented later. The program return value must be 0 or 1 for now. 0 : successful, except potential seq_file buffer overflow which is handled by seq_file reader. 1 : request to restart the same object In the future, other return values may be used for filtering or teminating the iterator. Signed-off-by: Yonghong Song <yhs@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Andrii Nakryiko <andriin@fb.com> Link: https://lore.kernel.org/bpf/20200509175900.2474947-1-yhs@fb.com
This commit is contained in:

committed by
Alexei Starovoitov

parent
ae24345da5
commit
15d83c4d7c
@@ -12,6 +12,7 @@ struct bpf_iter_target_info {
|
||||
bpf_iter_init_seq_priv_t init_seq_private;
|
||||
bpf_iter_fini_seq_priv_t fini_seq_private;
|
||||
u32 seq_priv_size;
|
||||
u32 btf_id; /* cached value */
|
||||
};
|
||||
|
||||
static struct list_head targets = LIST_HEAD_INIT(targets);
|
||||
@@ -57,3 +58,38 @@ void bpf_iter_unreg_target(const char *target)
|
||||
|
||||
WARN_ON(found == false);
|
||||
}
|
||||
|
||||
static void cache_btf_id(struct bpf_iter_target_info *tinfo,
|
||||
struct bpf_prog *prog)
|
||||
{
|
||||
tinfo->btf_id = prog->aux->attach_btf_id;
|
||||
}
|
||||
|
||||
bool bpf_iter_prog_supported(struct bpf_prog *prog)
|
||||
{
|
||||
const char *attach_fname = prog->aux->attach_func_name;
|
||||
u32 prog_btf_id = prog->aux->attach_btf_id;
|
||||
const char *prefix = BPF_ITER_FUNC_PREFIX;
|
||||
struct bpf_iter_target_info *tinfo;
|
||||
int prefix_len = strlen(prefix);
|
||||
bool supported = false;
|
||||
|
||||
if (strncmp(attach_fname, prefix, prefix_len))
|
||||
return false;
|
||||
|
||||
mutex_lock(&targets_mutex);
|
||||
list_for_each_entry(tinfo, &targets, list) {
|
||||
if (tinfo->btf_id && tinfo->btf_id == prog_btf_id) {
|
||||
supported = true;
|
||||
break;
|
||||
}
|
||||
if (!strcmp(attach_fname + prefix_len, tinfo->target)) {
|
||||
cache_btf_id(tinfo, prog);
|
||||
supported = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&targets_mutex);
|
||||
|
||||
return supported;
|
||||
}
|
||||
|
Reference in New Issue
Block a user