PERF_RECORD_KSYMBOL_TYPE_OOL marks an executable page. Create a map backed only by memory, which will be populated as necessary by text poke events. Committer notes: From the patch: OOL stands for "Out of line" code such as kprobe-replaced instructions or optimized kprobes or ftrace trampolines.
Unified · Split
| @@ -1049,6 +1049,11 @@ enum perf_event_type { · 1048 unmodified lines | ||
| 1049 | 1049 | enum perf_record_ksymbol_type { |
| 1050 | 1050 | PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, |
| 1051 | 1051 | PERF_RECORD_KSYMBOL_TYPE_BPF = 1, |
| 1052 | + /* | |
| 1053 | + * Out of line code such as kprobe-replaced instructions or optimized | |
| 1054 | + * kprobes or ftrace trampolines. | |
| 1055 | + */ | |
| 1056 | + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, | |
| 1052 | 1057 | PERF_RECORD_KSYMBOL_TYPE_MAX /* non-ABI */ |
| 1053 | 1058 | }; |
| 1054 | 1059 | |
| @@ -208,6 +208,7 @@ int dso__read_binary_type_filename(const struct dso *dso, · 207 unmodified lines | ||
| 208 | 208 | case DSO_BINARY_TYPE__JAVA_JIT: |
| 209 | 209 | case DSO_BINARY_TYPE__BPF_PROG_INFO: |
| 210 | 210 | case DSO_BINARY_TYPE__BPF_IMAGE: |
| 211 | + case DSO_BINARY_TYPE__OOL: | |
| 211 | 212 | case DSO_BINARY_TYPE__NOT_FOUND: |
| 212 | 213 | ret = -1; |
| 213 | 214 | break; |
| @@ -898,6 +899,8 @@ static struct dso_cache *dso_cache__populate(struct dso *dso, · 684 unmodified lines | ||
| 898 | 899 | |
| 899 | 900 | if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) |
| 900 | 901 | *ret = bpf_read(dso, cache_offset, cache->data); |
| 902 | + else if (dso->binary_type == DSO_BINARY_TYPE__OOL) | |
| 903 | + *ret = DSO__DATA_CACHE_SIZE; | |
| 901 | 904 | else |
| 902 | 905 | *ret = file_read(dso, machine, cache_offset, cache->data); |
| 903 | 906 | |
| @@ -42,6 +42,7 @@ enum dso_binary_type { · 41 unmodified lines | ||
| 42 | 42 | DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, |
| 43 | 43 | DSO_BINARY_TYPE__BPF_PROG_INFO, |
| 44 | 44 | DSO_BINARY_TYPE__BPF_IMAGE, |
| 45 | + DSO_BINARY_TYPE__OOL, | |
| 45 | 46 | DSO_BINARY_TYPE__NOT_FOUND, |
| 46 | 47 | }; |
| 47 | 48 | |
| @@ -762,6 +762,12 @@ static int machine__process_ksymbol_register(struct machine *machine, · 761 unmodified lines | ||
| 762 | 762 | return -ENOMEM; |
| 763 | 763 | } |
| 764 | 764 | |
| 765 | + if (event->ksymbol.ksym_type == PERF_RECORD_KSYMBOL_TYPE_OOL) { | |
| 766 | + map->dso->binary_type = DSO_BINARY_TYPE__OOL; | |
| 767 | + map->dso->data.file_size = event->ksymbol.len; | |
| 768 | + dso__set_loaded(map->dso); | |
| 769 | + } | |
| 770 | + | |
| 765 | 771 | map->start = event->ksymbol.addr; |
| 766 | 772 | map->end = map->start + event->ksymbol.len; |
| 767 | 773 | maps__insert(&machine->kmaps, map); |
| @@ -267,6 +267,11 @@ bool __map__is_bpf_prog(const struct map *map) · 266 unmodified lines | ||
| 267 | 267 | return name && (strstr(name, "bpf_prog_") == name); |
| 268 | 268 | } |
| 269 | 269 | |
| 270 | +bool __map__is_ool(const struct map *map) | |
| 271 | +{ | |
| 272 | + return map->dso && map->dso->binary_type == DSO_BINARY_TYPE__OOL; | |
| 273 | +} | |
| 274 | + | |
| 270 | 275 | bool map__has_symbols(const struct map *map) |
| 271 | 276 | { |
| 272 | 277 | return dso__has_symbols(map->dso); |
| @@ -147,11 +147,12 @@ int map__set_kallsyms_ref_reloc_sym(struct map *map, const char *symbol_name, · 146 unmodified lines | ||
| 147 | 147 | bool __map__is_kernel(const struct map *map); |
| 148 | 148 | bool __map__is_extra_kernel_map(const struct map *map); |
| 149 | 149 | bool __map__is_bpf_prog(const struct map *map); |
| 150 | +bool __map__is_ool(const struct map *map); | |
| 150 | 151 | |
| 151 | 152 | static inline bool __map__is_kmodule(const struct map *map) |
| 152 | 153 | { |
| 153 | 154 | return !__map__is_kernel(map) && !__map__is_extra_kernel_map(map) && |
| 154 | − !__map__is_bpf_prog(map); | |
| 155 | + !__map__is_bpf_prog(map) && !__map__is_ool(map); | |
| 155 | 156 | } |
| 156 | 157 | |
| 157 | 158 | bool map__has_symbols(const struct map *map); |
| @@ -1565,6 +1565,7 @@ static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod, · 1564 unmodified lines | ||
| 1565 | 1565 | |
| 1566 | 1566 | case DSO_BINARY_TYPE__BPF_PROG_INFO: |
| 1567 | 1567 | case DSO_BINARY_TYPE__BPF_IMAGE: |
| 1568 | + case DSO_BINARY_TYPE__OOL: | |
| 1568 | 1569 | case DSO_BINARY_TYPE__NOT_FOUND: |
| 1569 | 1570 | default: |
| 1570 | 1571 | return false; |