drivers: atm: nicstar: Use the correct function to free some resources
[cascardo/linux.git] / kernel / bpf / arraymap.c
index 5af3073..633a650 100644 (file)
@@ -390,9 +390,7 @@ static void *prog_fd_array_get_ptr(struct bpf_map *map,
 
 static void prog_fd_array_put_ptr(void *ptr)
 {
-       struct bpf_prog *prog = ptr;
-
-       bpf_prog_put_rcu(prog);
+       bpf_prog_put(ptr);
 }
 
 /* decrement refcnt of all bpf_progs that are stored in this map */
@@ -432,7 +430,7 @@ static struct bpf_event_entry *bpf_event_entry_gen(struct file *perf_file,
 {
        struct bpf_event_entry *ee;
 
-       ee = kzalloc(sizeof(*ee), GFP_KERNEL);
+       ee = kzalloc(sizeof(*ee), GFP_ATOMIC);
        if (ee) {
                ee->event = perf_file->private_data;
                ee->perf_file = perf_file;
@@ -539,3 +537,46 @@ static int __init register_perf_event_array_map(void)
        return 0;
 }
 late_initcall(register_perf_event_array_map);
+
+#ifdef CONFIG_SOCK_CGROUP_DATA
+static void *cgroup_fd_array_get_ptr(struct bpf_map *map,
+                                    struct file *map_file /* not used */,
+                                    int fd)
+{
+       return cgroup_get_from_fd(fd);
+}
+
+static void cgroup_fd_array_put_ptr(void *ptr)
+{
+       /* cgroup_put free cgrp after a rcu grace period */
+       cgroup_put(ptr);
+}
+
+static void cgroup_fd_array_free(struct bpf_map *map)
+{
+       bpf_fd_array_map_clear(map);
+       fd_array_map_free(map);
+}
+
+static const struct bpf_map_ops cgroup_array_ops = {
+       .map_alloc = fd_array_map_alloc,
+       .map_free = cgroup_fd_array_free,
+       .map_get_next_key = array_map_get_next_key,
+       .map_lookup_elem = fd_array_map_lookup_elem,
+       .map_delete_elem = fd_array_map_delete_elem,
+       .map_fd_get_ptr = cgroup_fd_array_get_ptr,
+       .map_fd_put_ptr = cgroup_fd_array_put_ptr,
+};
+
+static struct bpf_map_type_list cgroup_array_type __read_mostly = {
+       .ops = &cgroup_array_ops,
+       .type = BPF_MAP_TYPE_CGROUP_ARRAY,
+};
+
+static int __init register_cgroup_array_map(void)
+{
+       bpf_register_map_type(&cgroup_array_type);
+       return 0;
+}
+late_initcall(register_cgroup_array_map);
+#endif