On 9/29/20 11:56 PM, Song Liu wrote:
[...]
+static void bpf_fd_array_map_clear(struct bpf_map *map);
+
+static void perf_event_fd_array_map_free(struct bpf_map *map)
+{
+       if (map->map_flags & BPF_F_PRESERVE_ELEMS)
+               bpf_fd_array_map_clear(map);
+       fd_array_map_free(map);
+}

Not quite sure why you place that here and added the fwd declaration? If you
place perf_event_fd_array_map_free() near perf_event_array_map_ops, then you
also don't need the additional bpf_fd_array_map_clear declaration.

  static void *prog_fd_array_get_ptr(struct bpf_map *map,
                                   struct file *map_file, int fd)
  {
@@ -1134,6 +1148,9 @@ static void perf_event_fd_array_release(struct bpf_map 
*map,
        struct bpf_event_entry *ee;
        int i;
+ if (map->map_flags & BPF_F_PRESERVE_ELEMS)
+               return;
+
        rcu_read_lock();
        for (i = 0; i < array->map.max_entries; i++) {
                ee = READ_ONCE(array->ptrs[i]);
@@ -1148,7 +1165,7 @@ const struct bpf_map_ops perf_event_array_map_ops = {
        .map_meta_equal = bpf_map_meta_equal,
        .map_alloc_check = fd_array_map_alloc_check,
        .map_alloc = array_map_alloc,
-       .map_free = fd_array_map_free,
+       .map_free = perf_event_fd_array_map_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,
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 82522f05c0213..ea78eb89f8d67 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -414,6 +414,9 @@ enum {
/* Enable memory-mapping BPF map */
        BPF_F_MMAPABLE          = (1U << 10),
+
+/* Share perf_event among processes */
+       BPF_F_PRESERVE_ELEMS    = (1U << 11),
  };
/* Flags for BPF_PROG_QUERY. */


Reply via email to