diff options
| author | Alexei Starovoitov <ast@kernel.org> | 2022-05-10 11:20:45 -0700 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2022-05-10 11:20:45 -0700 |
| commit | 9376d3898b2da50e6a6e7c0c1a0d7a3bbf0b8f44 (patch) | |
| tree | cb067fb720ef0a789c2453780239717913f8ed93 /kernel/bpf/syscall.c | |
| parent | Merge branch 'Add source ip in bpf tunnel key' (diff) | |
| parent | selftests/bpf: Add bpf link iter test (diff) | |
| download | linux-9376d3898b2da50e6a6e7c0c1a0d7a3bbf0b8f44.tar.gz linux-9376d3898b2da50e6a6e7c0c1a0d7a3bbf0b8f44.zip | |
Merge branch 'bpf: bpf link iterator'
Dmitrii Dolgov says:
====================
Bpf links seem to be one of the important structures for which no
iterator is provided. Such iterator could be useful in those cases when
generic 'task/file' is not suitable or better performance is needed.
The implementation is mostly copied from prog iterator. This time tests were
executed, although I still had to exclude test_bpf_nf (failed to find BTF info
for global/extern symbol 'bpf_skb_ct_lookup') -- since it's unrelated, I hope
it's a minor issue.
Per suggestion from the previous discussion, there is a new patch for
converting CHECK to corresponding ASSERT_* macro. Such replacement is done only
if the final result would be the same, e.g. CHECK with important-looking custom
formatting strings are still in place -- from what I understand ASSERT_*
doesn't allow to specify such format.
The third small patch fixes what looks like a copy-paste error in the condition
checking.
====================
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'kernel/bpf/syscall.c')
| -rw-r--r-- | kernel/bpf/syscall.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index e0aead17dff4..50164d324eaf 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -4680,6 +4680,25 @@ struct bpf_link *bpf_link_by_id(u32 id) return link; } +struct bpf_link *bpf_link_get_curr_or_next(u32 *id) +{ + struct bpf_link *link; + + spin_lock_bh(&link_idr_lock); +again: + link = idr_get_next(&link_idr, id); + if (link) { + link = bpf_link_inc_not_zero(link); + if (IS_ERR(link)) { + (*id)++; + goto again; + } + } + spin_unlock_bh(&link_idr_lock); + + return link; +} + #define BPF_LINK_GET_FD_BY_ID_LAST_FIELD link_id static int bpf_link_get_fd_by_id(const union bpf_attr *attr) |
