History

bpf: Add array of maps support

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.

Martin KaFai Lau committed 9 years ago

Commit 56f668d1 parent fad73a18 files · +225 −12Browse files

Showing the changes to include/uapi/linux (1 of 8 files). Show all

Unified · Split

include/uapi/linux/bpf.h+2−0
@@ -96,6 +96,7 @@ enum bpf_map_type { · 95 unmodified lines
96 BPF_MAP_TYPE_LRU_HASH,96 BPF_MAP_TYPE_LRU_HASH,
97 BPF_MAP_TYPE_LRU_PERCPU_HASH,97 BPF_MAP_TYPE_LRU_PERCPU_HASH,
98 BPF_MAP_TYPE_LPM_TRIE,98 BPF_MAP_TYPE_LPM_TRIE,
99 BPF_MAP_TYPE_ARRAY_OF_MAPS,
99};100};
100 101
101enum bpf_prog_type {102enum bpf_prog_type {
@@ -152,6 +153,7 @@ union bpf_attr { · 50 unmodified lines
152 __u32 value_size; /* size of value in bytes */153 __u32 value_size; /* size of value in bytes */
153 __u32 max_entries; /* max number of entries in a map */154 __u32 max_entries; /* max number of entries in a map */
154 __u32 map_flags; /* prealloc or not */155 __u32 map_flags; /* prealloc or not */
156 __u32 inner_map_fd; /* fd pointing to the inner map */
155 };157 };
156 158
157 struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */159 struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */