Skip to content

Commit 59d3656

Browse files
Brenden Blancodavem330
authored andcommitted
bpf: add bpf_prog_add api for bulk prog refcnt
A subsystem may need to store many copies of a bpf program, each deserving its own reference. Rather than requiring the caller to loop one by one (with possible mid-loop failure), add a bulk bpf_prog_add api. Signed-off-by: Brenden Blanco <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ddbcb79 commit 59d3656

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

include/linux/bpf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ void bpf_register_map_type(struct bpf_map_type_list *tl);
224224

225225
struct bpf_prog *bpf_prog_get(u32 ufd);
226226
struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type);
227+
struct bpf_prog *bpf_prog_add(struct bpf_prog *prog, int i);
227228
struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog);
228229
void bpf_prog_put(struct bpf_prog *prog);
229230

kernel/bpf/syscall.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -670,14 +670,20 @@ static struct bpf_prog *____bpf_prog_get(struct fd f)
670670
return f.file->private_data;
671671
}
672672

673-
struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog)
673+
struct bpf_prog *bpf_prog_add(struct bpf_prog *prog, int i)
674674
{
675-
if (atomic_inc_return(&prog->aux->refcnt) > BPF_MAX_REFCNT) {
676-
atomic_dec(&prog->aux->refcnt);
675+
if (atomic_add_return(i, &prog->aux->refcnt) > BPF_MAX_REFCNT) {
676+
atomic_sub(i, &prog->aux->refcnt);
677677
return ERR_PTR(-EBUSY);
678678
}
679679
return prog;
680680
}
681+
EXPORT_SYMBOL_GPL(bpf_prog_add);
682+
683+
struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog)
684+
{
685+
return bpf_prog_add(prog, 1);
686+
}
681687

682688
static struct bpf_prog *__bpf_prog_get(u32 ufd, enum bpf_prog_type *type)
683689
{

0 commit comments

Comments
 (0)