This patch adds a few helper funcs to enable map-in-map support (i.e. outer_map->inner_map). The first outer_map type BPF_MAP_TYPE_ARRAY_OF_MAPS is also added in this patch. The next patch will introduce a hash of maps type. Any bpf map type can be acted as an inner_map. The exception is BPF_MAP_TYPE_PROG_ARRAY because the extra level of indirection makes it harder to verify the owner_prog_type and owner_jited. Multi-level map-in-map is not supported (i.e. map->map is ok but not map->map->map). When adding an inner_map to an outer_map, it currently checks the map_type, key_size, value_size, map_flags, max_entries and ops. The verifier also uses those map's properties to do static analysis. map_flags is needed because we need to ensure BPF_PROG_TYPE_PERF_EVENT is using a preallocated hashtab for the inner_hash also. ops and max_entries are needed to generate inlined map-lookup instructions. For simplicity reason, a simple '==' test is used for both map_flags and max_entries. The equality of ops is implied by the equality of map_type. During outer_map creation time, an inner_map_fd is needed to create an outer_map. However, the inner_map_fd's life time does not depend on the outer_map. The inner_map_fd is merely used to initialize the inner_map_meta of the outer_map. Also, for the outer_map: * It allows element update and delete from syscall * It allows element lookup from bpf_prog The above is similar to the current fd_array pattern.
Showing the changes to include/uapi/linux (1 of 8 files). Show all
Unified · Split
| @@ -96,6 +96,7 @@ enum bpf_map_type { · 95 unmodified lines | ||
| 96 | 96 | BPF_MAP_TYPE_LRU_HASH, |
| 97 | 97 | BPF_MAP_TYPE_LRU_PERCPU_HASH, |
| 98 | 98 | BPF_MAP_TYPE_LPM_TRIE, |
| 99 | + BPF_MAP_TYPE_ARRAY_OF_MAPS, | |
| 99 | 100 | }; |
| 100 | 101 | |
| 101 | 102 | enum bpf_prog_type { |
| @@ -152,6 +153,7 @@ union bpf_attr { · 50 unmodified lines | ||
| 152 | 153 | __u32 value_size; /* size of value in bytes */ |
| 153 | 154 | __u32 max_entries; /* max number of entries in a map */ |
| 154 | 155 | __u32 map_flags; /* prealloc or not */ |
| 156 | + __u32 inner_map_fd; /* fd pointing to the inner map */ | |
| 155 | 157 | }; |
| 156 | 158 | |
| 157 | 159 | struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ |