diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
| -rw-r--r-- | kernel/bpf/syscall.c | 21 | 
1 files changed, 18 insertions, 3 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 272071e9112f..82eabd4e38ad 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -683,8 +683,8 @@ struct bpf_map *bpf_map_get_with_uref(u32 ufd)  }  /* map_idr_lock should have been held */ -static struct bpf_map *bpf_map_inc_not_zero(struct bpf_map *map, -					    bool uref) +static struct bpf_map *__bpf_map_inc_not_zero(struct bpf_map *map, +					      bool uref)  {  	int refold; @@ -704,6 +704,16 @@ static struct bpf_map *bpf_map_inc_not_zero(struct bpf_map *map,  	return map;  } +struct bpf_map *bpf_map_inc_not_zero(struct bpf_map *map, bool uref) +{ +	spin_lock_bh(&map_idr_lock); +	map = __bpf_map_inc_not_zero(map, uref); +	spin_unlock_bh(&map_idr_lock); + +	return map; +} +EXPORT_SYMBOL_GPL(bpf_map_inc_not_zero); +  int __weak bpf_stackmap_copy(struct bpf_map *map, void *key, void *value)  {  	return -ENOTSUPP; @@ -1619,6 +1629,7 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)  	if (attr->prog_flags & ~(BPF_F_STRICT_ALIGNMENT |  				 BPF_F_ANY_ALIGNMENT | +				 BPF_F_TEST_STATE_FREQ |  				 BPF_F_TEST_RND_HI32))  		return -EINVAL; @@ -2183,7 +2194,7 @@ static int bpf_map_get_fd_by_id(const union bpf_attr *attr)  	spin_lock_bh(&map_idr_lock);  	map = idr_find(&map_idr, id);  	if (map) -		map = bpf_map_inc_not_zero(map, true); +		map = __bpf_map_inc_not_zero(map, true);  	else  		map = ERR_PTR(-ENOENT);  	spin_unlock_bh(&map_idr_lock); @@ -2880,6 +2891,10 @@ SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, siz  		err = bpf_obj_get_next_id(&attr, uattr,  					  &map_idr, &map_idr_lock);  		break; +	case BPF_BTF_GET_NEXT_ID: +		err = bpf_obj_get_next_id(&attr, uattr, +					  &btf_idr, &btf_idr_lock); +		break;  	case BPF_PROG_GET_FD_BY_ID:  		err = bpf_prog_get_fd_by_id(&attr);  		break;  |