bpf: add bpf_map_lookup_percpu_elem for percpu map
[linux-2.6-microblaze.git] / kernel / bpf / arraymap.c
index 724613d..fe40d3b 100644 (file)
@@ -243,6 +243,20 @@ static void *percpu_array_map_lookup_elem(struct bpf_map *map, void *key)
        return this_cpu_ptr(array->pptrs[index & array->index_mask]);
 }
 
+static void *percpu_array_map_lookup_percpu_elem(struct bpf_map *map, void *key, u32 cpu)
+{
+       struct bpf_array *array = container_of(map, struct bpf_array, map);
+       u32 index = *(u32 *)key;
+
+       if (cpu >= nr_cpu_ids)
+               return NULL;
+
+       if (unlikely(index >= array->map.max_entries))
+               return NULL;
+
+       return per_cpu_ptr(array->pptrs[index & array->index_mask], cpu);
+}
+
 int bpf_percpu_array_copy(struct bpf_map *map, void *key, void *value)
 {
        struct bpf_array *array = container_of(map, struct bpf_array, map);
@@ -725,6 +739,7 @@ const struct bpf_map_ops percpu_array_map_ops = {
        .map_lookup_elem = percpu_array_map_lookup_elem,
        .map_update_elem = array_map_update_elem,
        .map_delete_elem = array_map_delete_elem,
+       .map_lookup_percpu_elem = percpu_array_map_lookup_percpu_elem,
        .map_seq_show_elem = percpu_array_map_seq_show_elem,
        .map_check_btf = array_map_check_btf,
        .map_lookup_batch = generic_map_lookup_batch,