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 | enum perf_record_ksymbol_type { | 1049 | enum perf_record_ksymbol_type { |
| 1050 | PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, | 1050 | PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, |
| 1051 | PERF_RECORD_KSYMBOL_TYPE_BPF = 1, | 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 | PERF_RECORD_KSYMBOL_TYPE_MAX /* non-ABI */ | 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 | case DSO_BINARY_TYPE__JAVA_JIT: | 208 | case DSO_BINARY_TYPE__JAVA_JIT: |
| 209 | case DSO_BINARY_TYPE__BPF_PROG_INFO: | 209 | case DSO_BINARY_TYPE__BPF_PROG_INFO: |
| 210 | case DSO_BINARY_TYPE__BPF_IMAGE: | 210 | case DSO_BINARY_TYPE__BPF_IMAGE: |
| 211 | case DSO_BINARY_TYPE__OOL: | ||
| 211 | case DSO_BINARY_TYPE__NOT_FOUND: | 212 | case DSO_BINARY_TYPE__NOT_FOUND: |
| 212 | ret = -1; | 213 | ret = -1; |
| 213 | break; | 214 | break; |
| @@ -898,6 +899,8 @@ static struct dso_cache *dso_cache__populate(struct dso *dso, · 684 unmodified lines | |||
| 898 | 899 | ||
| 899 | if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) | 900 | if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) |
| 900 | *ret = bpf_read(dso, cache_offset, cache->data); | 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 | else | 904 | else |
| 902 | *ret = file_read(dso, machine, cache_offset, cache->data); | 905 | *ret = file_read(dso, machine, cache_offset, cache->data); |
| 903 | 906 | ||
| @@ -42,6 +42,7 @@ enum dso_binary_type { · 41 unmodified lines | |||
| 42 | DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, | 42 | DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, |
| 43 | DSO_BINARY_TYPE__BPF_PROG_INFO, | 43 | DSO_BINARY_TYPE__BPF_PROG_INFO, |
| 44 | DSO_BINARY_TYPE__BPF_IMAGE, | 44 | DSO_BINARY_TYPE__BPF_IMAGE, |
| 45 | DSO_BINARY_TYPE__OOL, | ||
| 45 | DSO_BINARY_TYPE__NOT_FOUND, | 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 | return -ENOMEM; | 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 | map->start = event->ksymbol.addr; | 771 | map->start = event->ksymbol.addr; |
| 766 | map->end = map->start + event->ksymbol.len; | 772 | map->end = map->start + event->ksymbol.len; |
| 767 | maps__insert(&machine->kmaps, map); | 773 | maps__insert(&machine->kmaps, map); |
| @@ -267,6 +267,11 @@ bool __map__is_bpf_prog(const struct map *map) · 266 unmodified lines | |||
| 267 | return name && (strstr(name, "bpf_prog_") == name); | 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 | bool map__has_symbols(const struct map *map) | 275 | bool map__has_symbols(const struct map *map) |
| 271 | { | 276 | { |
| 272 | return dso__has_symbols(map->dso); | 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 | bool __map__is_kernel(const struct map *map); | 147 | bool __map__is_kernel(const struct map *map); |
| 148 | bool __map__is_extra_kernel_map(const struct map *map); | 148 | bool __map__is_extra_kernel_map(const struct map *map); |
| 149 | bool __map__is_bpf_prog(const struct map *map); | 149 | bool __map__is_bpf_prog(const struct map *map); |
| 150 | bool __map__is_ool(const struct map *map); | ||
| 150 | 151 | ||
| 151 | static inline bool __map__is_kmodule(const struct map *map) | 152 | static inline bool __map__is_kmodule(const struct map *map) |
| 152 | { | 153 | { |
| 153 | return !__map__is_kernel(map) && !__map__is_extra_kernel_map(map) && | 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 | bool map__has_symbols(const struct map *map); | 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 | case DSO_BINARY_TYPE__BPF_PROG_INFO: | 1566 | case DSO_BINARY_TYPE__BPF_PROG_INFO: |
| 1567 | case DSO_BINARY_TYPE__BPF_IMAGE: | 1567 | case DSO_BINARY_TYPE__BPF_IMAGE: |
| 1568 | case DSO_BINARY_TYPE__OOL: | ||
| 1568 | case DSO_BINARY_TYPE__NOT_FOUND: | 1569 | case DSO_BINARY_TYPE__NOT_FOUND: |
| 1569 | default: | 1570 | default: |
| 1570 | return false; | 1571 | return false; |