bpf: prepare for more bpf syscall to be used from kernel and user space.
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Wed, 24 Aug 2022 13:40:36 +0000 (15:40 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 26 Aug 2022 01:52:05 +0000 (18:52 -0700)
Add BPF_MAP_GET_FD_BY_ID and BPF_MAP_DELETE_PROG.

Only BPF_MAP_GET_FD_BY_ID needs to be amended to be able
to access the bpf pointer either from the userspace or the kernel.

Acked-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Link: https://lore.kernel.org/r/20220824134055.1328882-7-benjamin.tissoires@redhat.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/syscall.c

index a4d40d98428a3ba220cce2c4c4f313eed66b73b7..4e9d4622aef7b08e99510c41cfcb6991e6c72fe4 100644 (file)
@@ -1437,9 +1437,9 @@ err_put:
 
 #define BPF_MAP_DELETE_ELEM_LAST_FIELD key
 
-static int map_delete_elem(union bpf_attr *attr)
+static int map_delete_elem(union bpf_attr *attr, bpfptr_t uattr)
 {
-       void __user *ukey = u64_to_user_ptr(attr->key);
+       bpfptr_t ukey = make_bpfptr(attr->key, uattr.is_kernel);
        int ufd = attr->map_fd;
        struct bpf_map *map;
        struct fd f;
@@ -1459,7 +1459,7 @@ static int map_delete_elem(union bpf_attr *attr)
                goto err_put;
        }
 
-       key = __bpf_copy_key(ukey, map->key_size);
+       key = ___bpf_copy_key(ukey, map->key_size);
        if (IS_ERR(key)) {
                err = PTR_ERR(key);
                goto err_put;
@@ -4941,7 +4941,7 @@ static int __sys_bpf(int cmd, bpfptr_t uattr, unsigned int size)
                err = map_update_elem(&attr, uattr);
                break;
        case BPF_MAP_DELETE_ELEM:
-               err = map_delete_elem(&attr);
+               err = map_delete_elem(&attr, uattr);
                break;
        case BPF_MAP_GET_NEXT_KEY:
                err = map_get_next_key(&attr);
@@ -5073,8 +5073,10 @@ BPF_CALL_3(bpf_sys_bpf, int, cmd, union bpf_attr *, attr, u32, attr_size)
 {
        switch (cmd) {
        case BPF_MAP_CREATE:
+       case BPF_MAP_DELETE_ELEM:
        case BPF_MAP_UPDATE_ELEM:
        case BPF_MAP_FREEZE:
+       case BPF_MAP_GET_FD_BY_ID:
        case BPF_PROG_LOAD:
        case BPF_BTF_LOAD:
        case BPF_LINK_CREATE: