diff options
Diffstat (limited to 'kernel/bpf/dispatcher.c')
| -rw-r--r-- | kernel/bpf/dispatcher.c | 22 | 
1 files changed, 8 insertions, 14 deletions
diff --git a/kernel/bpf/dispatcher.c b/kernel/bpf/dispatcher.c index fa64b80b8bca..7dfb8d0d5202 100644 --- a/kernel/bpf/dispatcher.c +++ b/kernel/bpf/dispatcher.c @@ -4,6 +4,7 @@  #include <linux/hash.h>  #include <linux/bpf.h>  #include <linux/filter.h> +#include <linux/static_call.h>  /* The BPF dispatcher is a multiway branch code generator. The   * dispatcher is a mechanism to avoid the performance penalty of an @@ -104,17 +105,11 @@ static int bpf_dispatcher_prepare(struct bpf_dispatcher *d, void *image, void *b  static void bpf_dispatcher_update(struct bpf_dispatcher *d, int prev_num_progs)  { -	void *old, *new, *tmp; -	u32 noff; -	int err; - -	if (!prev_num_progs) { -		old = NULL; -		noff = 0; -	} else { -		old = d->image + d->image_off; +	void *new, *tmp; +	u32 noff = 0; + +	if (prev_num_progs)  		noff = d->image_off ^ (PAGE_SIZE / 2); -	}  	new = d->num_progs ? d->image + noff : NULL;  	tmp = d->num_progs ? d->rw_image + noff : NULL; @@ -128,11 +123,10 @@ static void bpf_dispatcher_update(struct bpf_dispatcher *d, int prev_num_progs)  			return;  	} -	err = bpf_arch_text_poke(d->func, BPF_MOD_JUMP, old, new); -	if (err || !new) -		return; +	__BPF_DISPATCHER_UPDATE(d, new ?: &bpf_dispatcher_nop_func); -	d->image_off = noff; +	if (new) +		d->image_off = noff;  }  void bpf_dispatcher_change_prog(struct bpf_dispatcher *d, struct bpf_prog *from,  | 
