aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r--kernel/bpf/syscall.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 8942c820d620..4409ccca8831 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -24,6 +24,13 @@
24#include <linux/kernel.h> 24#include <linux/kernel.h>
25#include <linux/idr.h> 25#include <linux/idr.h>
26 26
27#define IS_FD_ARRAY(map) ((map)->map_type == BPF_MAP_TYPE_PROG_ARRAY || \
28 (map)->map_type == BPF_MAP_TYPE_PERF_EVENT_ARRAY || \
29 (map)->map_type == BPF_MAP_TYPE_CGROUP_ARRAY || \
30 (map)->map_type == BPF_MAP_TYPE_ARRAY_OF_MAPS)
31#define IS_FD_HASH(map) ((map)->map_type == BPF_MAP_TYPE_HASH_OF_MAPS)
32#define IS_FD_MAP(map) (IS_FD_ARRAY(map) || IS_FD_HASH(map))
33
27DEFINE_PER_CPU(int, bpf_prog_active); 34DEFINE_PER_CPU(int, bpf_prog_active);
28static DEFINE_IDR(prog_idr); 35static DEFINE_IDR(prog_idr);
29static DEFINE_SPINLOCK(prog_idr_lock); 36static DEFINE_SPINLOCK(prog_idr_lock);
@@ -411,6 +418,8 @@ static int map_lookup_elem(union bpf_attr *attr)
411 map->map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH || 418 map->map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH ||
412 map->map_type == BPF_MAP_TYPE_PERCPU_ARRAY) 419 map->map_type == BPF_MAP_TYPE_PERCPU_ARRAY)
413 value_size = round_up(map->value_size, 8) * num_possible_cpus(); 420 value_size = round_up(map->value_size, 8) * num_possible_cpus();
421 else if (IS_FD_MAP(map))
422 value_size = sizeof(u32);
414 else 423 else
415 value_size = map->value_size; 424 value_size = map->value_size;
416 425
@@ -426,9 +435,10 @@ static int map_lookup_elem(union bpf_attr *attr)
426 err = bpf_percpu_array_copy(map, key, value); 435 err = bpf_percpu_array_copy(map, key, value);
427 } else if (map->map_type == BPF_MAP_TYPE_STACK_TRACE) { 436 } else if (map->map_type == BPF_MAP_TYPE_STACK_TRACE) {
428 err = bpf_stackmap_copy(map, key, value); 437 err = bpf_stackmap_copy(map, key, value);
429 } else if (map->map_type == BPF_MAP_TYPE_ARRAY_OF_MAPS || 438 } else if (IS_FD_ARRAY(map)) {
430 map->map_type == BPF_MAP_TYPE_HASH_OF_MAPS) { 439 err = bpf_fd_array_map_lookup_elem(map, key, value);
431 err = -ENOTSUPP; 440 } else if (IS_FD_HASH(map)) {
441 err = bpf_fd_htab_map_lookup_elem(map, key, value);
432 } else { 442 } else {
433 rcu_read_lock(); 443 rcu_read_lock();
434 ptr = map->ops->map_lookup_elem(map, key); 444 ptr = map->ops->map_lookup_elem(map, key);