diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
-rw-r--r-- | kernel/bpf/syscall.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 0834958f1dc4..ec7c552af76b 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
@@ -740,8 +740,13 @@ static int map_lookup_elem(union bpf_attr *attr) | |||
740 | 740 | ||
741 | if (bpf_map_is_dev_bound(map)) { | 741 | if (bpf_map_is_dev_bound(map)) { |
742 | err = bpf_map_offload_lookup_elem(map, key, value); | 742 | err = bpf_map_offload_lookup_elem(map, key, value); |
743 | } else if (map->map_type == BPF_MAP_TYPE_PERCPU_HASH || | 743 | goto done; |
744 | map->map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH) { | 744 | } |
745 | |||
746 | preempt_disable(); | ||
747 | this_cpu_inc(bpf_prog_active); | ||
748 | if (map->map_type == BPF_MAP_TYPE_PERCPU_HASH || | ||
749 | map->map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH) { | ||
745 | err = bpf_percpu_hash_copy(map, key, value); | 750 | err = bpf_percpu_hash_copy(map, key, value); |
746 | } else if (map->map_type == BPF_MAP_TYPE_PERCPU_ARRAY) { | 751 | } else if (map->map_type == BPF_MAP_TYPE_PERCPU_ARRAY) { |
747 | err = bpf_percpu_array_copy(map, key, value); | 752 | err = bpf_percpu_array_copy(map, key, value); |
@@ -777,7 +782,10 @@ static int map_lookup_elem(union bpf_attr *attr) | |||
777 | } | 782 | } |
778 | rcu_read_unlock(); | 783 | rcu_read_unlock(); |
779 | } | 784 | } |
785 | this_cpu_dec(bpf_prog_active); | ||
786 | preempt_enable(); | ||
780 | 787 | ||
788 | done: | ||
781 | if (err) | 789 | if (err) |
782 | goto free_value; | 790 | goto free_value; |
783 | 791 | ||