diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
| -rw-r--r-- | kernel/bpf/syscall.c | 24 | 
1 files changed, 7 insertions, 17 deletions
| diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 64131f88c553..ecca9366c7a6 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -1972,7 +1972,7 @@ static void bpf_audit_prog(const struct bpf_prog *prog, unsigned int op)  		return;  	if (audit_enabled == AUDIT_OFF)  		return; -	if (op == BPF_AUDIT_LOAD) +	if (!in_irq() && !irqs_disabled())  		ctx = audit_context();  	ab = audit_log_start(ctx, GFP_ATOMIC, AUDIT_BPF);  	if (unlikely(!ab)) @@ -2001,7 +2001,7 @@ static int bpf_prog_alloc_id(struct bpf_prog *prog)  	return id > 0 ? 0 : id;  } -void bpf_prog_free_id(struct bpf_prog *prog, bool do_idr_lock) +void bpf_prog_free_id(struct bpf_prog *prog)  {  	unsigned long flags; @@ -2013,18 +2013,10 @@ void bpf_prog_free_id(struct bpf_prog *prog, bool do_idr_lock)  	if (!prog->aux->id)  		return; -	if (do_idr_lock) -		spin_lock_irqsave(&prog_idr_lock, flags); -	else -		__acquire(&prog_idr_lock); - +	spin_lock_irqsave(&prog_idr_lock, flags);  	idr_remove(&prog_idr, prog->aux->id);  	prog->aux->id = 0; - -	if (do_idr_lock) -		spin_unlock_irqrestore(&prog_idr_lock, flags); -	else -		__release(&prog_idr_lock); +	spin_unlock_irqrestore(&prog_idr_lock, flags);  }  static void __bpf_prog_put_rcu(struct rcu_head *rcu) @@ -2067,17 +2059,15 @@ static void bpf_prog_put_deferred(struct work_struct *work)  	prog = aux->prog;  	perf_event_bpf_event(prog, PERF_BPF_EVENT_PROG_UNLOAD, 0);  	bpf_audit_prog(prog, BPF_AUDIT_UNLOAD); +	bpf_prog_free_id(prog);  	__bpf_prog_put_noref(prog, true);  } -static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock) +static void __bpf_prog_put(struct bpf_prog *prog)  {  	struct bpf_prog_aux *aux = prog->aux;  	if (atomic64_dec_and_test(&aux->refcnt)) { -		/* bpf_prog_free_id() must be called first */ -		bpf_prog_free_id(prog, do_idr_lock); -  		if (in_irq() || irqs_disabled()) {  			INIT_WORK(&aux->work, bpf_prog_put_deferred);  			schedule_work(&aux->work); @@ -2089,7 +2079,7 @@ static void __bpf_prog_put(struct bpf_prog *prog, bool do_idr_lock)  void bpf_prog_put(struct bpf_prog *prog)  { -	__bpf_prog_put(prog, true); +	__bpf_prog_put(prog);  }  EXPORT_SYMBOL_GPL(bpf_prog_put); |