diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r-- | kernel/bpf/syscall.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 3fff82ca68fa..d7783cb04d86 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
@@ -513,7 +513,7 @@ static void bpf_prog_uncharge_memlock(struct bpf_prog *prog) | |||
513 | free_uid(user); | 513 | free_uid(user); |
514 | } | 514 | } |
515 | 515 | ||
516 | static void __prog_put_rcu(struct rcu_head *rcu) | 516 | static void __prog_put_common(struct rcu_head *rcu) |
517 | { | 517 | { |
518 | struct bpf_prog_aux *aux = container_of(rcu, struct bpf_prog_aux, rcu); | 518 | struct bpf_prog_aux *aux = container_of(rcu, struct bpf_prog_aux, rcu); |
519 | 519 | ||
@@ -525,19 +525,14 @@ static void __prog_put_rcu(struct rcu_head *rcu) | |||
525 | /* version of bpf_prog_put() that is called after a grace period */ | 525 | /* version of bpf_prog_put() that is called after a grace period */ |
526 | void bpf_prog_put_rcu(struct bpf_prog *prog) | 526 | void bpf_prog_put_rcu(struct bpf_prog *prog) |
527 | { | 527 | { |
528 | if (atomic_dec_and_test(&prog->aux->refcnt)) { | 528 | if (atomic_dec_and_test(&prog->aux->refcnt)) |
529 | prog->aux->prog = prog; | 529 | call_rcu(&prog->aux->rcu, __prog_put_common); |
530 | call_rcu(&prog->aux->rcu, __prog_put_rcu); | ||
531 | } | ||
532 | } | 530 | } |
533 | 531 | ||
534 | void bpf_prog_put(struct bpf_prog *prog) | 532 | void bpf_prog_put(struct bpf_prog *prog) |
535 | { | 533 | { |
536 | if (atomic_dec_and_test(&prog->aux->refcnt)) { | 534 | if (atomic_dec_and_test(&prog->aux->refcnt)) |
537 | free_used_maps(prog->aux); | 535 | __prog_put_common(&prog->aux->rcu); |
538 | bpf_prog_uncharge_memlock(prog); | ||
539 | bpf_prog_free(prog); | ||
540 | } | ||
541 | } | 536 | } |
542 | EXPORT_SYMBOL_GPL(bpf_prog_put); | 537 | EXPORT_SYMBOL_GPL(bpf_prog_put); |
543 | 538 | ||