diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
| -rw-r--r-- | kernel/bpf/syscall.c | 32 | 
1 files changed, 25 insertions, 7 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 2a2efe1bc76c..46ecce4b79ed 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -137,11 +137,13 @@ static void bpf_map_show_fdinfo(struct seq_file *m, struct file *filp)  		   "map_type:\t%u\n"  		   "key_size:\t%u\n"  		   "value_size:\t%u\n" -		   "max_entries:\t%u\n", +		   "max_entries:\t%u\n" +		   "map_flags:\t%#x\n",  		   map->map_type,  		   map->key_size,  		   map->value_size, -		   map->max_entries); +		   map->max_entries, +		   map->map_flags);  }  #endif @@ -216,11 +218,18 @@ struct bpf_map *__bpf_map_get(struct fd f)  	return f.file->private_data;  } -void bpf_map_inc(struct bpf_map *map, bool uref) +/* prog's and map's refcnt limit */ +#define BPF_MAX_REFCNT 32768 + +struct bpf_map *bpf_map_inc(struct bpf_map *map, bool uref)  { -	atomic_inc(&map->refcnt); +	if (atomic_inc_return(&map->refcnt) > BPF_MAX_REFCNT) { +		atomic_dec(&map->refcnt); +		return ERR_PTR(-EBUSY); +	}  	if (uref)  		atomic_inc(&map->usercnt); +	return map;  }  struct bpf_map *bpf_map_get_with_uref(u32 ufd) @@ -232,7 +241,7 @@ struct bpf_map *bpf_map_get_with_uref(u32 ufd)  	if (IS_ERR(map))  		return map; -	bpf_map_inc(map, true); +	map = bpf_map_inc(map, true);  	fdput(f);  	return map; @@ -656,6 +665,15 @@ static struct bpf_prog *__bpf_prog_get(struct fd f)  	return f.file->private_data;  } +struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog) +{ +	if (atomic_inc_return(&prog->aux->refcnt) > BPF_MAX_REFCNT) { +		atomic_dec(&prog->aux->refcnt); +		return ERR_PTR(-EBUSY); +	} +	return prog; +} +  /* called by sockets/tracing/seccomp before attaching program to an event   * pairs with bpf_prog_put()   */ @@ -668,7 +686,7 @@ struct bpf_prog *bpf_prog_get(u32 ufd)  	if (IS_ERR(prog))  		return prog; -	atomic_inc(&prog->aux->refcnt); +	prog = bpf_prog_inc(prog);  	fdput(f);  	return prog; @@ -744,7 +762,7 @@ static int bpf_prog_load(union bpf_attr *attr)  	fixup_bpf_calls(prog);  	/* eBPF program is ready to be JITed */ -	err = bpf_prog_select_runtime(prog); +	prog = bpf_prog_select_runtime(prog, &err);  	if (err < 0)  		goto free_used_maps;  |