diff options
Diffstat (limited to 'kernel/bpf/trampoline.c')
| -rw-r--r-- | kernel/bpf/trampoline.c | 20 | 
1 files changed, 8 insertions, 12 deletions
diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c index db7599c59c78..f8302a5ca400 100644 --- a/kernel/bpf/trampoline.c +++ b/kernel/bpf/trampoline.c @@ -333,7 +333,7 @@ static void bpf_tramp_image_put(struct bpf_tramp_image *im)  		int err = bpf_arch_text_poke(im->ip_after_call, BPF_MOD_JUMP,  					     NULL, im->ip_epilogue);  		WARN_ON(err); -		if (IS_ENABLED(CONFIG_PREEMPTION)) +		if (IS_ENABLED(CONFIG_TASKS_RCU))  			call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu_tasks);  		else  			percpu_ref_kill(&im->pcref); @@ -456,7 +456,9 @@ again:  	if (err < 0)  		goto out_free; -	arch_protect_bpf_trampoline(im->image, im->size); +	err = arch_protect_bpf_trampoline(im->image, im->size); +	if (err) +		goto out_free;  	WARN_ON(tr->cur_image && total == 0);  	if (tr->cur_image) @@ -883,12 +885,13 @@ static void notrace update_prog_stats(struct bpf_prog *prog,  	     * Hence check that 'start' is valid.  	     */  	    start > NO_START_TIME) { +		u64 duration = sched_clock() - start;  		unsigned long flags;  		stats = this_cpu_ptr(prog->stats);  		flags = u64_stats_update_begin_irqsave(&stats->syncp);  		u64_stats_inc(&stats->cnt); -		u64_stats_add(&stats->nsecs, sched_clock() - start); +		u64_stats_add(&stats->nsecs, duration);  		u64_stats_update_end_irqrestore(&stats->syncp, flags);  	}  } @@ -1072,17 +1075,10 @@ void __weak arch_free_bpf_trampoline(void *image, unsigned int size)  	bpf_jit_free_exec(image);  } -void __weak arch_protect_bpf_trampoline(void *image, unsigned int size) -{ -	WARN_ON_ONCE(size > PAGE_SIZE); -	set_memory_rox((long)image, 1); -} - -void __weak arch_unprotect_bpf_trampoline(void *image, unsigned int size) +int __weak arch_protect_bpf_trampoline(void *image, unsigned int size)  {  	WARN_ON_ONCE(size > PAGE_SIZE); -	set_memory_nx((long)image, 1); -	set_memory_rw((long)image, 1); +	return set_memory_rox((long)image, 1);  }  int __weak arch_bpf_trampoline_size(const struct btf_func_model *m, u32 flags,  |