Lines Matching full:maps

8 #include "maps.h"
21 * where another thread could insert and break the sorting of the maps. In
22 * practice inserting maps should be rare meaning that the race shouldn't lead
23 * to live lock. Removal of maps doesn't break being sorted.
26 DECLARE_RC_STRUCT(maps) { in DECLARE_RC_STRUCT() argument
29 * @maps_by_address: array of maps sorted by their starting address if in DECLARE_RC_STRUCT()
34 * @maps_by_name: optional array of maps sorted by their dso name if in DECLARE_RC_STRUCT()
46 * entries that contain maps. in DECLARE_RC_STRUCT()
67 static void check_invariants(const struct maps *maps __maybe_unused) in check_invariants()
70 assert(RC_CHK_ACCESS(maps)->nr_maps <= RC_CHK_ACCESS(maps)->nr_maps_allocated); in check_invariants()
71 for (unsigned int i = 0; i < RC_CHK_ACCESS(maps)->nr_maps; i++) { in check_invariants()
72 struct map *map = RC_CHK_ACCESS(maps)->maps_by_address[i]; in check_invariants()
80 assert(RC_CHK_EQUAL(map__kmap(map)->kmaps, maps)); in check_invariants()
83 struct map *prev = RC_CHK_ACCESS(maps)->maps_by_address[i - 1]; in check_invariants()
86 if (RC_CHK_ACCESS(maps)->maps_by_address_sorted) { in check_invariants()
87 /* Maps should be in start address order. */ in check_invariants()
90 * If the ends of maps aren't broken (during in check_invariants()
94 if (!RC_CHK_ACCESS(maps)->ends_broken) { in check_invariants()
102 if (RC_CHK_ACCESS(maps)->maps_by_name) { in check_invariants()
103 for (unsigned int i = 0; i < RC_CHK_ACCESS(maps)->nr_maps; i++) { in check_invariants()
104 struct map *map = RC_CHK_ACCESS(maps)->maps_by_name[i]; in check_invariants()
107 * Maps by name maps should be in maps_by_address, so in check_invariants()
116 static struct map **maps__maps_by_address(const struct maps *maps) in maps__maps_by_address() argument
118 return RC_CHK_ACCESS(maps)->maps_by_address; in maps__maps_by_address()
121 static void maps__set_maps_by_address(struct maps *maps, struct map **new) in maps__set_maps_by_address() argument
123 RC_CHK_ACCESS(maps)->maps_by_address = new; in maps__set_maps_by_address()
127 static void maps__set_nr_maps_allocated(struct maps *maps, unsigned int nr_maps_allocated) in maps__set_nr_maps_allocated() argument
129 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_maps_allocated; in maps__set_nr_maps_allocated()
132 static void maps__set_nr_maps(struct maps *maps, unsigned int nr_maps) in maps__set_nr_maps() argument
134 RC_CHK_ACCESS(maps)->nr_maps = nr_maps; in maps__set_nr_maps()
138 static struct map **maps__maps_by_name(const struct maps *maps) in maps__maps_by_name() argument
140 return RC_CHK_ACCESS(maps)->maps_by_name; in maps__maps_by_name()
144 static void maps__set_maps_by_name(struct maps *maps, struct map **new) in maps__set_maps_by_name() argument
146 RC_CHK_ACCESS(maps)->maps_by_name = new; in maps__set_maps_by_name()
150 static bool maps__maps_by_address_sorted(const struct maps *maps) in maps__maps_by_address_sorted() argument
152 return RC_CHK_ACCESS(maps)->maps_by_address_sorted; in maps__maps_by_address_sorted()
155 static void maps__set_maps_by_address_sorted(struct maps *maps, bool value) in maps__set_maps_by_address_sorted() argument
157 RC_CHK_ACCESS(maps)->maps_by_address_sorted = value; in maps__set_maps_by_address_sorted()
160 static bool maps__maps_by_name_sorted(const struct maps *maps) in maps__maps_by_name_sorted() argument
162 return RC_CHK_ACCESS(maps)->maps_by_name_sorted; in maps__maps_by_name_sorted()
165 static void maps__set_maps_by_name_sorted(struct maps *maps, bool value) in maps__set_maps_by_name_sorted() argument
167 RC_CHK_ACCESS(maps)->maps_by_name_sorted = value; in maps__set_maps_by_name_sorted()
170 struct machine *maps__machine(const struct maps *maps) in maps__machine() argument
172 return RC_CHK_ACCESS(maps)->machine; in maps__machine()
175 unsigned int maps__nr_maps(const struct maps *maps) in maps__nr_maps() argument
177 return RC_CHK_ACCESS(maps)->nr_maps; in maps__nr_maps()
180 refcount_t *maps__refcnt(struct maps *maps) in maps__refcnt() argument
182 return &RC_CHK_ACCESS(maps)->refcnt; in maps__refcnt()
186 void *maps__addr_space(const struct maps *maps) in maps__addr_space() argument
188 return RC_CHK_ACCESS(maps)->addr_space; in maps__addr_space()
191 void maps__set_addr_space(struct maps *maps, void *addr_space) in maps__set_addr_space() argument
193 RC_CHK_ACCESS(maps)->addr_space = addr_space; in maps__set_addr_space()
196 const struct unwind_libunwind_ops *maps__unwind_libunwind_ops(const struct maps *maps) in maps__unwind_libunwind_ops() argument
198 return RC_CHK_ACCESS(maps)->unwind_libunwind_ops; in maps__unwind_libunwind_ops()
201 void maps__set_unwind_libunwind_ops(struct maps *maps, const struct unwind_libunwind_ops *ops) in maps__set_unwind_libunwind_ops() argument
203 RC_CHK_ACCESS(maps)->unwind_libunwind_ops = ops; in maps__set_unwind_libunwind_ops()
207 static struct rw_semaphore *maps__lock(struct maps *maps) in maps__lock() argument
209 return &RC_CHK_ACCESS(maps)->lock; in maps__lock()
212 static void maps__init(struct maps *maps, struct machine *machine) in maps__init() argument
214 init_rwsem(maps__lock(maps)); in maps__init()
215 RC_CHK_ACCESS(maps)->maps_by_address = NULL; in maps__init()
216 RC_CHK_ACCESS(maps)->maps_by_name = NULL; in maps__init()
217 RC_CHK_ACCESS(maps)->machine = machine; in maps__init()
219 RC_CHK_ACCESS(maps)->addr_space = NULL; in maps__init()
220 RC_CHK_ACCESS(maps)->unwind_libunwind_ops = NULL; in maps__init()
222 refcount_set(maps__refcnt(maps), 1); in maps__init()
223 RC_CHK_ACCESS(maps)->nr_maps = 0; in maps__init()
224 RC_CHK_ACCESS(maps)->nr_maps_allocated = 0; in maps__init()
225 RC_CHK_ACCESS(maps)->last_search_by_name_idx = 0; in maps__init()
226 RC_CHK_ACCESS(maps)->maps_by_address_sorted = true; in maps__init()
227 RC_CHK_ACCESS(maps)->maps_by_name_sorted = false; in maps__init()
230 static void maps__exit(struct maps *maps) in maps__exit() argument
232 struct map **maps_by_address = maps__maps_by_address(maps); in maps__exit()
233 struct map **maps_by_name = maps__maps_by_name(maps); in maps__exit()
235 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__exit()
242 unwind__finish_access(maps); in maps__exit()
245 struct maps *maps__new(struct machine *machine) in maps__new()
247 struct maps *result; in maps__new()
248 RC_STRUCT(maps) *maps = zalloc(sizeof(*maps)); in maps__new()
250 if (ADD_RC_CHK(result, maps)) in maps__new()
256 static void maps__delete(struct maps *maps) in maps__delete() argument
258 maps__exit(maps); in maps__delete()
259 RC_CHK_FREE(maps); in maps__delete()
262 struct maps *maps__get(struct maps *maps) in maps__get() argument
264 struct maps *result; in maps__get()
266 if (RC_CHK_GET(result, maps)) in maps__get()
267 refcount_inc(maps__refcnt(maps)); in maps__get()
272 void maps__put(struct maps *maps) in maps__put() argument
274 if (maps && refcount_dec_and_test(maps__refcnt(maps))) in maps__put()
275 maps__delete(maps); in maps__put()
277 RC_CHK_PUT(maps); in maps__put()
280 static void __maps__free_maps_by_name(struct maps *maps) in __maps__free_maps_by_name() argument
282 if (!maps__maps_by_name(maps)) in __maps__free_maps_by_name()
288 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) in __maps__free_maps_by_name()
289 map__put(maps__maps_by_name(maps)[i]); in __maps__free_maps_by_name()
291 zfree(&RC_CHK_ACCESS(maps)->maps_by_name); in __maps__free_maps_by_name()
294 maps__set_maps_by_name_sorted(maps, false); in __maps__free_maps_by_name()
309 /* Ensure maps with the same addresses have a fixed order. */ in map__start_cmp()
320 static void __maps__sort_by_address(struct maps *maps) in __maps__sort_by_address() argument
322 if (maps__maps_by_address_sorted(maps)) in __maps__sort_by_address()
325 qsort(maps__maps_by_address(maps), in __maps__sort_by_address()
326 maps__nr_maps(maps), in __maps__sort_by_address()
329 maps__set_maps_by_address_sorted(maps, true); in __maps__sort_by_address()
332 static void maps__sort_by_address(struct maps *maps) in maps__sort_by_address() argument
334 down_write(maps__lock(maps)); in maps__sort_by_address()
335 __maps__sort_by_address(maps); in maps__sort_by_address()
336 up_write(maps__lock(maps)); in maps__sort_by_address()
348 /* Ensure distinct but name equal maps have an order. */ in map__strcmp()
354 static int maps__sort_by_name(struct maps *maps) in maps__sort_by_name() argument
358 down_write(maps__lock(maps)); in maps__sort_by_name()
359 if (!maps__maps_by_name_sorted(maps)) { in maps__sort_by_name()
360 struct map **maps_by_name = maps__maps_by_name(maps); in maps__sort_by_name()
363 maps_by_name = malloc(RC_CHK_ACCESS(maps)->nr_maps_allocated * in maps__sort_by_name()
368 struct map **maps_by_address = maps__maps_by_address(maps); in maps__sort_by_name()
369 unsigned int n = maps__nr_maps(maps); in maps__sort_by_name()
371 maps__set_maps_by_name(maps, maps_by_name); in maps__sort_by_name()
378 maps__nr_maps(maps), in maps__sort_by_name()
381 maps__set_maps_by_name_sorted(maps, true); in maps__sort_by_name()
384 check_invariants(maps); in maps__sort_by_name()
385 up_write(maps__lock(maps)); in maps__sort_by_name()
389 static unsigned int maps__by_address_index(const struct maps *maps, const struct map *map) in maps__by_address_index() argument
391 struct map **maps_by_address = maps__maps_by_address(maps); in maps__by_address_index()
393 if (maps__maps_by_address_sorted(maps)) { in maps__by_address_index()
395 bsearch(&map, maps__maps_by_address(maps), maps__nr_maps(maps), in maps__by_address_index()
401 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__by_address_index()
406 pr_err("Map missing from maps"); in maps__by_address_index()
410 static unsigned int maps__by_name_index(const struct maps *maps, const struct map *map) in maps__by_name_index() argument
412 struct map **maps_by_name = maps__maps_by_name(maps); in maps__by_name_index()
414 if (maps__maps_by_name_sorted(maps)) { in maps__by_name_index()
416 bsearch(&map, maps_by_name, maps__nr_maps(maps), in maps__by_name_index()
422 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__by_name_index()
427 pr_err("Map missing from maps"); in maps__by_name_index()
431 static void map__set_kmap_maps(struct map *map, struct maps *maps) in map__set_kmap_maps() argument
444 kmap->kmaps = maps; in map__set_kmap_maps()
450 static int __maps__insert(struct maps *maps, struct map *new) in __maps__insert() argument
452 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__insert()
453 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__insert()
454 unsigned int nr_maps = maps__nr_maps(maps); in __maps__insert()
455 unsigned int nr_allocate = RC_CHK_ACCESS(maps)->nr_maps_allocated; in __maps__insert()
464 maps__set_maps_by_address(maps, maps_by_address); in __maps__insert()
472 __maps__free_maps_by_name(maps); in __maps__insert()
474 maps__set_maps_by_name(maps, maps_by_name); in __maps__insert()
476 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_allocate; in __maps__insert()
484 RC_CHK_ACCESS(maps)->nr_maps = nr_maps; in __maps__insert()
488 * manner, for example by processing /proc/pid/maps, then no in __maps__insert()
492 /* If there's just 1 entry then maps are sorted. */ in __maps__insert()
493 maps__set_maps_by_address_sorted(maps, true); in __maps__insert()
494 maps__set_maps_by_name_sorted(maps, maps_by_name != NULL); in __maps__insert()
496 /* Sorted if maps were already sorted and this map starts after the last one. */ in __maps__insert()
497 maps__set_maps_by_address_sorted(maps, in __maps__insert()
498 maps__maps_by_address_sorted(maps) && in __maps__insert()
500 maps__set_maps_by_name_sorted(maps, false); in __maps__insert()
503 RC_CHK_ACCESS(maps)->ends_broken = true; in __maps__insert()
505 map__set_kmap_maps(new, maps); in __maps__insert()
510 int maps__insert(struct maps *maps, struct map *map) in maps__insert() argument
514 down_write(maps__lock(maps)); in maps__insert()
515 ret = __maps__insert(maps, map); in maps__insert()
516 check_invariants(maps); in maps__insert()
517 up_write(maps__lock(maps)); in maps__insert()
521 static void __maps__remove(struct maps *maps, struct map *map) in __maps__remove() argument
523 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__remove()
524 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__remove()
525 unsigned int nr_maps = maps__nr_maps(maps); in __maps__remove()
529 address_idx = maps__by_address_index(maps, map); in __maps__remove()
536 unsigned int name_idx = maps__by_name_index(maps, map); in __maps__remove()
544 --RC_CHK_ACCESS(maps)->nr_maps; in __maps__remove()
547 void maps__remove(struct maps *maps, struct map *map) in maps__remove() argument
549 down_write(maps__lock(maps)); in maps__remove()
550 __maps__remove(maps, map); in maps__remove()
551 check_invariants(maps); in maps__remove()
552 up_write(maps__lock(maps)); in maps__remove()
555 bool maps__empty(struct maps *maps) in maps__empty() argument
559 down_read(maps__lock(maps)); in maps__empty()
560 res = maps__nr_maps(maps) == 0; in maps__empty()
561 up_read(maps__lock(maps)); in maps__empty()
566 bool maps__equal(struct maps *a, struct maps *b) in maps__equal()
571 int maps__for_each_map(struct maps *maps, int (*cb)(struct map *map, void *data), void *data) in maps__for_each_map() argument
578 down_read(maps__lock(maps)); in maps__for_each_map()
579 if (maps__maps_by_address_sorted(maps)) { in maps__for_each_map()
585 * the array - this may cause maps to be skipped or in maps__for_each_map()
588 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__for_each_map()
589 struct map **maps_by_address = maps__maps_by_address(maps); in maps__for_each_map()
598 up_read(maps__lock(maps)); in maps__for_each_map()
600 maps__sort_by_address(maps); in maps__for_each_map()
605 void maps__remove_maps(struct maps *maps, bool (*cb)(struct map *map, void *data), void *data) in maps__remove_maps() argument
609 down_write(maps__lock(maps)); in maps__remove_maps()
611 maps_by_address = maps__maps_by_address(maps); in maps__remove_maps()
612 for (unsigned int i = 0; i < maps__nr_maps(maps);) { in maps__remove_maps()
614 __maps__remove(maps, maps_by_address[i]); in maps__remove_maps()
618 check_invariants(maps); in maps__remove_maps()
619 up_write(maps__lock(maps)); in maps__remove_maps()
622 struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp) in maps__find_symbol() argument
624 struct map *map = maps__find(maps, addr); in maps__find_symbol()
663 struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp) in maps__find_symbol_by_name() argument
671 maps__for_each_map(maps, maps__find_symbol_by_name_cb, &args); in maps__find_symbol_by_name()
675 int maps__find_ams(struct maps *maps, struct addr_map_symbol *ams) in maps__find_ams() argument
678 if (maps == NULL) in maps__find_ams()
680 ams->ms.map = maps__find(maps, ams->addr); in maps__find_ams()
709 size_t maps__fprintf(struct maps *maps, FILE *fp) in maps__fprintf() argument
716 maps__for_each_map(maps, maps__fprintf_cb, &args); in maps__fprintf()
725 static unsigned int first_ending_after(struct maps *maps, const struct map *map) in first_ending_after() argument
727 struct map **maps_by_address = maps__maps_by_address(maps); in first_ending_after()
728 int low = 0, high = (int)maps__nr_maps(maps) - 1, first = high + 1; in first_ending_after()
730 assert(maps__maps_by_address_sorted(maps)); in first_ending_after()
751 static int __maps__insert_sorted(struct maps *maps, unsigned int first_after_index, in __maps__insert_sorted() argument
754 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__insert_sorted()
755 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__insert_sorted()
756 unsigned int nr_maps = maps__nr_maps(maps); in __maps__insert_sorted()
757 unsigned int nr_allocate = RC_CHK_ACCESS(maps)->nr_maps_allocated; in __maps__insert_sorted()
760 assert(maps__maps_by_address_sorted(maps)); in __maps__insert_sorted()
774 maps__set_maps_by_address(maps, maps_by_address); in __maps__insert_sorted()
782 __maps__free_maps_by_name(maps); in __maps__insert_sorted()
784 maps__set_maps_by_name(maps, maps_by_name); in __maps__insert_sorted()
786 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_allocate; in __maps__insert_sorted()
799 RC_CHK_ACCESS(maps)->nr_maps = nr_maps + to_add; in __maps__insert_sorted()
800 maps__set_maps_by_name_sorted(maps, false); in __maps__insert_sorted()
801 map__set_kmap_maps(new1, maps); in __maps__insert_sorted()
802 map__set_kmap_maps(new2, maps); in __maps__insert_sorted()
804 check_invariants(maps); in __maps__insert_sorted()
809 * Adds new to maps, if new overlaps existing entries then the existing maps are
812 static int __maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in __maps__fixup_overlap_and_insert() argument
818 if (!maps__maps_by_address_sorted(maps)) in __maps__fixup_overlap_and_insert()
819 __maps__sort_by_address(maps); in __maps__fixup_overlap_and_insert()
825 for (i = first_ending_after(maps, new); i < maps__nr_maps(maps); ) { in __maps__fixup_overlap_and_insert()
826 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__fixup_overlap_and_insert()
827 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__fixup_overlap_and_insert()
833 * Maps are ordered by start: next will not overlap for sure. in __maps__fixup_overlap_and_insert()
839 pr_debug("overlapping maps in %s (disable tui for more info)\n", in __maps__fixup_overlap_and_insert()
842 pr_debug("overlapping maps:\n"); in __maps__fixup_overlap_and_insert()
848 ni = maps__by_name_index(maps, pos); in __maps__fixup_overlap_and_insert()
851 * Now check if we need to create new maps for areas not in __maps__fixup_overlap_and_insert()
900 /* Maps are still ordered, go to next one. */ in __maps__fixup_overlap_and_insert()
908 err = __maps__insert_sorted(maps, i, new, after); in __maps__fixup_overlap_and_insert()
910 check_invariants(maps); in __maps__fixup_overlap_and_insert()
913 check_invariants(maps); in __maps__fixup_overlap_and_insert()
927 err = __maps__insert_sorted(maps, i + 1, after, NULL); in __maps__fixup_overlap_and_insert()
929 check_invariants(maps); in __maps__fixup_overlap_and_insert()
934 if (i + 1 < maps__nr_maps(maps)) in __maps__fixup_overlap_and_insert()
951 map__set_kmap_maps(new, maps); in __maps__fixup_overlap_and_insert()
953 check_invariants(maps); in __maps__fixup_overlap_and_insert()
956 __maps__remove(maps, pos); in __maps__fixup_overlap_and_insert()
957 check_invariants(maps); in __maps__fixup_overlap_and_insert()
959 * Maps are ordered but no need to increase `i` as the in __maps__fixup_overlap_and_insert()
960 * later maps were moved down. in __maps__fixup_overlap_and_insert()
965 err = __maps__insert_sorted(maps, i, new, NULL); in __maps__fixup_overlap_and_insert()
970 int maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in maps__fixup_overlap_and_insert() argument
974 down_write(maps__lock(maps)); in maps__fixup_overlap_and_insert()
975 err = __maps__fixup_overlap_and_insert(maps, new); in maps__fixup_overlap_and_insert()
976 up_write(maps__lock(maps)); in maps__fixup_overlap_and_insert()
980 int maps__copy_from(struct maps *dest, struct maps *parent) in maps__copy_from()
1042 /* Unexpected copying to a maps containing entries. */ in maps__copy_from()
1076 struct map *maps__find(struct maps *maps, u64 ip) in maps__find() argument
1083 down_read(maps__lock(maps)); in maps__find()
1084 if (maps__maps_by_address_sorted(maps)) { in maps__find()
1086 bsearch(&ip, maps__maps_by_address(maps), maps__nr_maps(maps), in maps__find()
1093 up_read(maps__lock(maps)); in maps__find()
1095 maps__sort_by_address(maps); in maps__find()
1107 struct map *maps__find_by_name(struct maps *maps, const char *name) in maps__find_by_name() argument
1116 down_read(maps__lock(maps)); in maps__find_by_name()
1119 i = RC_CHK_ACCESS(maps)->last_search_by_name_idx; in maps__find_by_name()
1120 if (i < maps__nr_maps(maps) && maps__maps_by_name(maps)) { in maps__find_by_name()
1121 struct dso *dso = map__dso(maps__maps_by_name(maps)[i]); in maps__find_by_name()
1124 result = map__get(maps__maps_by_name(maps)[i]); in maps__find_by_name()
1130 if (!done && maps__maps_by_name_sorted(maps)) { in maps__find_by_name()
1132 bsearch(name, maps__maps_by_name(maps), maps__nr_maps(maps), in maps__find_by_name()
1137 i = mapp - maps__maps_by_name(maps); in maps__find_by_name()
1138 RC_CHK_ACCESS(maps)->last_search_by_name_idx = i; in maps__find_by_name()
1142 up_read(maps__lock(maps)); in maps__find_by_name()
1145 if (maps__sort_by_name(maps)) { in maps__find_by_name()
1148 * through address sorted maps. in maps__find_by_name()
1153 down_read(maps__lock(maps)); in maps__find_by_name()
1154 maps_by_address = maps__maps_by_address(maps); in maps__find_by_name()
1155 n = maps__nr_maps(maps); in maps__find_by_name()
1165 up_read(maps__lock(maps)); in maps__find_by_name()
1173 struct map *maps__find_next_entry(struct maps *maps, struct map *map) in maps__find_next_entry() argument
1178 down_read(maps__lock(maps)); in maps__find_next_entry()
1179 while (!maps__maps_by_address_sorted(maps)) { in maps__find_next_entry()
1180 up_read(maps__lock(maps)); in maps__find_next_entry()
1181 maps__sort_by_address(maps); in maps__find_next_entry()
1182 down_read(maps__lock(maps)); in maps__find_next_entry()
1184 i = maps__by_address_index(maps, map); in maps__find_next_entry()
1185 if (++i < maps__nr_maps(maps)) in maps__find_next_entry()
1186 result = map__get(maps__maps_by_address(maps)[i]); in maps__find_next_entry()
1188 up_read(maps__lock(maps)); in maps__find_next_entry()
1192 void maps__fixup_end(struct maps *maps) in maps__fixup_end() argument
1197 down_write(maps__lock(maps)); in maps__fixup_end()
1198 if (!maps__maps_by_address_sorted(maps)) in maps__fixup_end()
1199 __maps__sort_by_address(maps); in maps__fixup_end()
1201 maps_by_address = maps__maps_by_address(maps); in maps__fixup_end()
1202 n = maps__nr_maps(maps); in maps__fixup_end()
1218 RC_CHK_ACCESS(maps)->ends_broken = false; in maps__fixup_end()
1219 check_invariants(maps); in maps__fixup_end()
1221 up_write(maps__lock(maps)); in maps__fixup_end()
1225 * Merges map into maps by splitting the new map within the existing map
1228 int maps__merge_in(struct maps *kmaps, struct map *new_map) in maps__merge_in()
1243 /* First after binary search requires sorted maps. Sort and try again. */ in maps__merge_in()
1303 /* Copy the maps from merged into kmaps. */ in maps__merge_in()
1313 void maps__load_first(struct maps *maps) in maps__load_first() argument
1315 down_read(maps__lock(maps)); in maps__load_first()
1317 if (maps__nr_maps(maps) > 0) in maps__load_first()
1318 map__load(maps__maps_by_address(maps)[0]); in maps__load_first()
1320 up_read(maps__lock(maps)); in maps__load_first()