xref: /linux/tools/perf/util/dso.c (revision 3d689ed6099a1a11c38bb78aff7498e78e287e0b)
1 #include <asm/bug.h>
2 #include <linux/kernel.h>
3 #include <sys/time.h>
4 #include <sys/resource.h>
5 #include "symbol.h"
6 #include "dso.h"
7 #include "machine.h"
8 #include "auxtrace.h"
9 #include "util.h"
10 #include "debug.h"
11 #include "vdso.h"
12 
13 static const char * const debuglink_paths[] = {
14 	"%.0s%s",
15 	"%s/%s",
16 	"%s/.debug/%s",
17 	"/usr/lib/debug%s/%s"
18 };
19 
20 char dso__symtab_origin(const struct dso *dso)
21 {
22 	static const char origin[] = {
23 		[DSO_BINARY_TYPE__KALLSYMS]			= 'k',
24 		[DSO_BINARY_TYPE__VMLINUX]			= 'v',
25 		[DSO_BINARY_TYPE__JAVA_JIT]			= 'j',
26 		[DSO_BINARY_TYPE__DEBUGLINK]			= 'l',
27 		[DSO_BINARY_TYPE__BUILD_ID_CACHE]		= 'B',
28 		[DSO_BINARY_TYPE__FEDORA_DEBUGINFO]		= 'f',
29 		[DSO_BINARY_TYPE__UBUNTU_DEBUGINFO]		= 'u',
30 		[DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO]	= 'o',
31 		[DSO_BINARY_TYPE__BUILDID_DEBUGINFO]		= 'b',
32 		[DSO_BINARY_TYPE__SYSTEM_PATH_DSO]		= 'd',
33 		[DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE]		= 'K',
34 		[DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP]	= 'm',
35 		[DSO_BINARY_TYPE__GUEST_KALLSYMS]		= 'g',
36 		[DSO_BINARY_TYPE__GUEST_KMODULE]		= 'G',
37 		[DSO_BINARY_TYPE__GUEST_KMODULE_COMP]		= 'M',
38 		[DSO_BINARY_TYPE__GUEST_VMLINUX]		= 'V',
39 	};
40 
41 	if (dso == NULL || dso->symtab_type == DSO_BINARY_TYPE__NOT_FOUND)
42 		return '!';
43 	return origin[dso->symtab_type];
44 }
45 
46 int dso__read_binary_type_filename(const struct dso *dso,
47 				   enum dso_binary_type type,
48 				   char *root_dir, char *filename, size_t size)
49 {
50 	char build_id_hex[SBUILD_ID_SIZE];
51 	int ret = 0;
52 	size_t len;
53 
54 	switch (type) {
55 	case DSO_BINARY_TYPE__DEBUGLINK:
56 	{
57 		const char *last_slash;
58 		char dso_dir[PATH_MAX];
59 		char symfile[PATH_MAX];
60 		unsigned int i;
61 
62 		len = __symbol__join_symfs(filename, size, dso->long_name);
63 		last_slash = filename + len;
64 		while (last_slash != filename && *last_slash != '/')
65 			last_slash--;
66 
67 		strncpy(dso_dir, filename, last_slash - filename);
68 		dso_dir[last_slash-filename] = '\0';
69 
70 		if (!is_regular_file(filename)) {
71 			ret = -1;
72 			break;
73 		}
74 
75 		ret = filename__read_debuglink(filename, symfile, PATH_MAX);
76 		if (ret)
77 			break;
78 
79 		/* Check predefined locations where debug file might reside */
80 		ret = -1;
81 		for (i = 0; i < ARRAY_SIZE(debuglink_paths); i++) {
82 			snprintf(filename, size,
83 					debuglink_paths[i], dso_dir, symfile);
84 			if (is_regular_file(filename)) {
85 				ret = 0;
86 				break;
87 			}
88 		}
89 
90 		break;
91 	}
92 	case DSO_BINARY_TYPE__BUILD_ID_CACHE:
93 		if (dso__build_id_filename(dso, filename, size) == NULL)
94 			ret = -1;
95 		break;
96 
97 	case DSO_BINARY_TYPE__FEDORA_DEBUGINFO:
98 		len = __symbol__join_symfs(filename, size, "/usr/lib/debug");
99 		snprintf(filename + len, size - len, "%s.debug", dso->long_name);
100 		break;
101 
102 	case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO:
103 		len = __symbol__join_symfs(filename, size, "/usr/lib/debug");
104 		snprintf(filename + len, size - len, "%s", dso->long_name);
105 		break;
106 
107 	case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO:
108 	{
109 		const char *last_slash;
110 		size_t dir_size;
111 
112 		last_slash = dso->long_name + dso->long_name_len;
113 		while (last_slash != dso->long_name && *last_slash != '/')
114 			last_slash--;
115 
116 		len = __symbol__join_symfs(filename, size, "");
117 		dir_size = last_slash - dso->long_name + 2;
118 		if (dir_size > (size - len)) {
119 			ret = -1;
120 			break;
121 		}
122 		len += scnprintf(filename + len, dir_size, "%s",  dso->long_name);
123 		len += scnprintf(filename + len , size - len, ".debug%s",
124 								last_slash);
125 		break;
126 	}
127 
128 	case DSO_BINARY_TYPE__BUILDID_DEBUGINFO:
129 		if (!dso->has_build_id) {
130 			ret = -1;
131 			break;
132 		}
133 
134 		build_id__sprintf(dso->build_id,
135 				  sizeof(dso->build_id),
136 				  build_id_hex);
137 		len = __symbol__join_symfs(filename, size, "/usr/lib/debug/.build-id/");
138 		snprintf(filename + len, size - len, "%.2s/%s.debug",
139 			 build_id_hex, build_id_hex + 2);
140 		break;
141 
142 	case DSO_BINARY_TYPE__VMLINUX:
143 	case DSO_BINARY_TYPE__GUEST_VMLINUX:
144 	case DSO_BINARY_TYPE__SYSTEM_PATH_DSO:
145 		__symbol__join_symfs(filename, size, dso->long_name);
146 		break;
147 
148 	case DSO_BINARY_TYPE__GUEST_KMODULE:
149 	case DSO_BINARY_TYPE__GUEST_KMODULE_COMP:
150 		path__join3(filename, size, symbol_conf.symfs,
151 			    root_dir, dso->long_name);
152 		break;
153 
154 	case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE:
155 	case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP:
156 		__symbol__join_symfs(filename, size, dso->long_name);
157 		break;
158 
159 	case DSO_BINARY_TYPE__KCORE:
160 	case DSO_BINARY_TYPE__GUEST_KCORE:
161 		snprintf(filename, size, "%s", dso->long_name);
162 		break;
163 
164 	default:
165 	case DSO_BINARY_TYPE__KALLSYMS:
166 	case DSO_BINARY_TYPE__GUEST_KALLSYMS:
167 	case DSO_BINARY_TYPE__JAVA_JIT:
168 	case DSO_BINARY_TYPE__NOT_FOUND:
169 		ret = -1;
170 		break;
171 	}
172 
173 	return ret;
174 }
175 
176 static const struct {
177 	const char *fmt;
178 	int (*decompress)(const char *input, int output);
179 } compressions[] = {
180 #ifdef HAVE_ZLIB_SUPPORT
181 	{ "gz", gzip_decompress_to_file },
182 #endif
183 #ifdef HAVE_LZMA_SUPPORT
184 	{ "xz", lzma_decompress_to_file },
185 #endif
186 	{ NULL, NULL },
187 };
188 
189 bool is_supported_compression(const char *ext)
190 {
191 	unsigned i;
192 
193 	for (i = 0; compressions[i].fmt; i++) {
194 		if (!strcmp(ext, compressions[i].fmt))
195 			return true;
196 	}
197 	return false;
198 }
199 
200 bool is_kernel_module(const char *pathname, int cpumode)
201 {
202 	struct kmod_path m;
203 	int mode = cpumode & PERF_RECORD_MISC_CPUMODE_MASK;
204 
205 	WARN_ONCE(mode != cpumode,
206 		  "Internal error: passing unmasked cpumode (%x) to is_kernel_module",
207 		  cpumode);
208 
209 	switch (mode) {
210 	case PERF_RECORD_MISC_USER:
211 	case PERF_RECORD_MISC_HYPERVISOR:
212 	case PERF_RECORD_MISC_GUEST_USER:
213 		return false;
214 	/* Treat PERF_RECORD_MISC_CPUMODE_UNKNOWN as kernel */
215 	default:
216 		if (kmod_path__parse(&m, pathname)) {
217 			pr_err("Failed to check whether %s is a kernel module or not. Assume it is.",
218 					pathname);
219 			return true;
220 		}
221 	}
222 
223 	return m.kmod;
224 }
225 
226 bool decompress_to_file(const char *ext, const char *filename, int output_fd)
227 {
228 	unsigned i;
229 
230 	for (i = 0; compressions[i].fmt; i++) {
231 		if (!strcmp(ext, compressions[i].fmt))
232 			return !compressions[i].decompress(filename,
233 							   output_fd);
234 	}
235 	return false;
236 }
237 
238 bool dso__needs_decompress(struct dso *dso)
239 {
240 	return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
241 		dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
242 }
243 
244 /*
245  * Parses kernel module specified in @path and updates
246  * @m argument like:
247  *
248  *    @comp - true if @path contains supported compression suffix,
249  *            false otherwise
250  *    @kmod - true if @path contains '.ko' suffix in right position,
251  *            false otherwise
252  *    @name - if (@alloc_name && @kmod) is true, it contains strdup-ed base name
253  *            of the kernel module without suffixes, otherwise strudup-ed
254  *            base name of @path
255  *    @ext  - if (@alloc_ext && @comp) is true, it contains strdup-ed string
256  *            the compression suffix
257  *
258  * Returns 0 if there's no strdup error, -ENOMEM otherwise.
259  */
260 int __kmod_path__parse(struct kmod_path *m, const char *path,
261 		       bool alloc_name, bool alloc_ext)
262 {
263 	const char *name = strrchr(path, '/');
264 	const char *ext  = strrchr(path, '.');
265 	bool is_simple_name = false;
266 
267 	memset(m, 0x0, sizeof(*m));
268 	name = name ? name + 1 : path;
269 
270 	/*
271 	 * '.' is also a valid character for module name. For example:
272 	 * [aaa.bbb] is a valid module name. '[' should have higher
273 	 * priority than '.ko' suffix.
274 	 *
275 	 * The kernel names are from machine__mmap_name. Such
276 	 * name should belong to kernel itself, not kernel module.
277 	 */
278 	if (name[0] == '[') {
279 		is_simple_name = true;
280 		if ((strncmp(name, "[kernel.kallsyms]", 17) == 0) ||
281 		    (strncmp(name, "[guest.kernel.kallsyms", 22) == 0) ||
282 		    (strncmp(name, "[vdso]", 6) == 0) ||
283 		    (strncmp(name, "[vsyscall]", 10) == 0)) {
284 			m->kmod = false;
285 
286 		} else
287 			m->kmod = true;
288 	}
289 
290 	/* No extension, just return name. */
291 	if ((ext == NULL) || is_simple_name) {
292 		if (alloc_name) {
293 			m->name = strdup(name);
294 			return m->name ? 0 : -ENOMEM;
295 		}
296 		return 0;
297 	}
298 
299 	if (is_supported_compression(ext + 1)) {
300 		m->comp = true;
301 		ext -= 3;
302 	}
303 
304 	/* Check .ko extension only if there's enough name left. */
305 	if (ext > name)
306 		m->kmod = !strncmp(ext, ".ko", 3);
307 
308 	if (alloc_name) {
309 		if (m->kmod) {
310 			if (asprintf(&m->name, "[%.*s]", (int) (ext - name), name) == -1)
311 				return -ENOMEM;
312 		} else {
313 			if (asprintf(&m->name, "%s", name) == -1)
314 				return -ENOMEM;
315 		}
316 
317 		strxfrchar(m->name, '-', '_');
318 	}
319 
320 	if (alloc_ext && m->comp) {
321 		m->ext = strdup(ext + 4);
322 		if (!m->ext) {
323 			free((void *) m->name);
324 			return -ENOMEM;
325 		}
326 	}
327 
328 	return 0;
329 }
330 
331 /*
332  * Global list of open DSOs and the counter.
333  */
334 static LIST_HEAD(dso__data_open);
335 static long dso__data_open_cnt;
336 static pthread_mutex_t dso__data_open_lock = PTHREAD_MUTEX_INITIALIZER;
337 
338 static void dso__list_add(struct dso *dso)
339 {
340 	list_add_tail(&dso->data.open_entry, &dso__data_open);
341 	dso__data_open_cnt++;
342 }
343 
344 static void dso__list_del(struct dso *dso)
345 {
346 	list_del(&dso->data.open_entry);
347 	WARN_ONCE(dso__data_open_cnt <= 0,
348 		  "DSO data fd counter out of bounds.");
349 	dso__data_open_cnt--;
350 }
351 
352 static void close_first_dso(void);
353 
354 static int do_open(char *name)
355 {
356 	int fd;
357 	char sbuf[STRERR_BUFSIZE];
358 
359 	do {
360 		fd = open(name, O_RDONLY);
361 		if (fd >= 0)
362 			return fd;
363 
364 		pr_debug("dso open failed: %s\n",
365 			 str_error_r(errno, sbuf, sizeof(sbuf)));
366 		if (!dso__data_open_cnt || errno != EMFILE)
367 			break;
368 
369 		close_first_dso();
370 	} while (1);
371 
372 	return -1;
373 }
374 
375 static int __open_dso(struct dso *dso, struct machine *machine)
376 {
377 	int fd;
378 	char *root_dir = (char *)"";
379 	char *name = malloc(PATH_MAX);
380 
381 	if (!name)
382 		return -ENOMEM;
383 
384 	if (machine)
385 		root_dir = machine->root_dir;
386 
387 	if (dso__read_binary_type_filename(dso, dso->binary_type,
388 					    root_dir, name, PATH_MAX)) {
389 		free(name);
390 		return -EINVAL;
391 	}
392 
393 	if (!is_regular_file(name))
394 		return -EINVAL;
395 
396 	fd = do_open(name);
397 	free(name);
398 	return fd;
399 }
400 
401 static void check_data_close(void);
402 
403 /**
404  * dso_close - Open DSO data file
405  * @dso: dso object
406  *
407  * Open @dso's data file descriptor and updates
408  * list/count of open DSO objects.
409  */
410 static int open_dso(struct dso *dso, struct machine *machine)
411 {
412 	int fd = __open_dso(dso, machine);
413 
414 	if (fd >= 0) {
415 		dso__list_add(dso);
416 		/*
417 		 * Check if we crossed the allowed number
418 		 * of opened DSOs and close one if needed.
419 		 */
420 		check_data_close();
421 	}
422 
423 	return fd;
424 }
425 
426 static void close_data_fd(struct dso *dso)
427 {
428 	if (dso->data.fd >= 0) {
429 		close(dso->data.fd);
430 		dso->data.fd = -1;
431 		dso->data.file_size = 0;
432 		dso__list_del(dso);
433 	}
434 }
435 
436 /**
437  * dso_close - Close DSO data file
438  * @dso: dso object
439  *
440  * Close @dso's data file descriptor and updates
441  * list/count of open DSO objects.
442  */
443 static void close_dso(struct dso *dso)
444 {
445 	close_data_fd(dso);
446 }
447 
448 static void close_first_dso(void)
449 {
450 	struct dso *dso;
451 
452 	dso = list_first_entry(&dso__data_open, struct dso, data.open_entry);
453 	close_dso(dso);
454 }
455 
456 static rlim_t get_fd_limit(void)
457 {
458 	struct rlimit l;
459 	rlim_t limit = 0;
460 
461 	/* Allow half of the current open fd limit. */
462 	if (getrlimit(RLIMIT_NOFILE, &l) == 0) {
463 		if (l.rlim_cur == RLIM_INFINITY)
464 			limit = l.rlim_cur;
465 		else
466 			limit = l.rlim_cur / 2;
467 	} else {
468 		pr_err("failed to get fd limit\n");
469 		limit = 1;
470 	}
471 
472 	return limit;
473 }
474 
475 static rlim_t fd_limit;
476 
477 /*
478  * Used only by tests/dso-data.c to reset the environment
479  * for tests. I dont expect we should change this during
480  * standard runtime.
481  */
482 void reset_fd_limit(void)
483 {
484 	fd_limit = 0;
485 }
486 
487 static bool may_cache_fd(void)
488 {
489 	if (!fd_limit)
490 		fd_limit = get_fd_limit();
491 
492 	if (fd_limit == RLIM_INFINITY)
493 		return true;
494 
495 	return fd_limit > (rlim_t) dso__data_open_cnt;
496 }
497 
498 /*
499  * Check and close LRU dso if we crossed allowed limit
500  * for opened dso file descriptors. The limit is half
501  * of the RLIMIT_NOFILE files opened.
502 */
503 static void check_data_close(void)
504 {
505 	bool cache_fd = may_cache_fd();
506 
507 	if (!cache_fd)
508 		close_first_dso();
509 }
510 
511 /**
512  * dso__data_close - Close DSO data file
513  * @dso: dso object
514  *
515  * External interface to close @dso's data file descriptor.
516  */
517 void dso__data_close(struct dso *dso)
518 {
519 	pthread_mutex_lock(&dso__data_open_lock);
520 	close_dso(dso);
521 	pthread_mutex_unlock(&dso__data_open_lock);
522 }
523 
524 static void try_to_open_dso(struct dso *dso, struct machine *machine)
525 {
526 	enum dso_binary_type binary_type_data[] = {
527 		DSO_BINARY_TYPE__BUILD_ID_CACHE,
528 		DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
529 		DSO_BINARY_TYPE__NOT_FOUND,
530 	};
531 	int i = 0;
532 
533 	if (dso->data.fd >= 0)
534 		return;
535 
536 	if (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND) {
537 		dso->data.fd = open_dso(dso, machine);
538 		goto out;
539 	}
540 
541 	do {
542 		dso->binary_type = binary_type_data[i++];
543 
544 		dso->data.fd = open_dso(dso, machine);
545 		if (dso->data.fd >= 0)
546 			goto out;
547 
548 	} while (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND);
549 out:
550 	if (dso->data.fd >= 0)
551 		dso->data.status = DSO_DATA_STATUS_OK;
552 	else
553 		dso->data.status = DSO_DATA_STATUS_ERROR;
554 }
555 
556 /**
557  * dso__data_get_fd - Get dso's data file descriptor
558  * @dso: dso object
559  * @machine: machine object
560  *
561  * External interface to find dso's file, open it and
562  * returns file descriptor.  It should be paired with
563  * dso__data_put_fd() if it returns non-negative value.
564  */
565 int dso__data_get_fd(struct dso *dso, struct machine *machine)
566 {
567 	if (dso->data.status == DSO_DATA_STATUS_ERROR)
568 		return -1;
569 
570 	if (pthread_mutex_lock(&dso__data_open_lock) < 0)
571 		return -1;
572 
573 	try_to_open_dso(dso, machine);
574 
575 	if (dso->data.fd < 0)
576 		pthread_mutex_unlock(&dso__data_open_lock);
577 
578 	return dso->data.fd;
579 }
580 
581 void dso__data_put_fd(struct dso *dso __maybe_unused)
582 {
583 	pthread_mutex_unlock(&dso__data_open_lock);
584 }
585 
586 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by)
587 {
588 	u32 flag = 1 << by;
589 
590 	if (dso->data.status_seen & flag)
591 		return true;
592 
593 	dso->data.status_seen |= flag;
594 
595 	return false;
596 }
597 
598 static void
599 dso_cache__free(struct dso *dso)
600 {
601 	struct rb_root *root = &dso->data.cache;
602 	struct rb_node *next = rb_first(root);
603 
604 	pthread_mutex_lock(&dso->lock);
605 	while (next) {
606 		struct dso_cache *cache;
607 
608 		cache = rb_entry(next, struct dso_cache, rb_node);
609 		next = rb_next(&cache->rb_node);
610 		rb_erase(&cache->rb_node, root);
611 		free(cache);
612 	}
613 	pthread_mutex_unlock(&dso->lock);
614 }
615 
616 static struct dso_cache *dso_cache__find(struct dso *dso, u64 offset)
617 {
618 	const struct rb_root *root = &dso->data.cache;
619 	struct rb_node * const *p = &root->rb_node;
620 	const struct rb_node *parent = NULL;
621 	struct dso_cache *cache;
622 
623 	while (*p != NULL) {
624 		u64 end;
625 
626 		parent = *p;
627 		cache = rb_entry(parent, struct dso_cache, rb_node);
628 		end = cache->offset + DSO__DATA_CACHE_SIZE;
629 
630 		if (offset < cache->offset)
631 			p = &(*p)->rb_left;
632 		else if (offset >= end)
633 			p = &(*p)->rb_right;
634 		else
635 			return cache;
636 	}
637 
638 	return NULL;
639 }
640 
641 static struct dso_cache *
642 dso_cache__insert(struct dso *dso, struct dso_cache *new)
643 {
644 	struct rb_root *root = &dso->data.cache;
645 	struct rb_node **p = &root->rb_node;
646 	struct rb_node *parent = NULL;
647 	struct dso_cache *cache;
648 	u64 offset = new->offset;
649 
650 	pthread_mutex_lock(&dso->lock);
651 	while (*p != NULL) {
652 		u64 end;
653 
654 		parent = *p;
655 		cache = rb_entry(parent, struct dso_cache, rb_node);
656 		end = cache->offset + DSO__DATA_CACHE_SIZE;
657 
658 		if (offset < cache->offset)
659 			p = &(*p)->rb_left;
660 		else if (offset >= end)
661 			p = &(*p)->rb_right;
662 		else
663 			goto out;
664 	}
665 
666 	rb_link_node(&new->rb_node, parent, p);
667 	rb_insert_color(&new->rb_node, root);
668 
669 	cache = NULL;
670 out:
671 	pthread_mutex_unlock(&dso->lock);
672 	return cache;
673 }
674 
675 static ssize_t
676 dso_cache__memcpy(struct dso_cache *cache, u64 offset,
677 		  u8 *data, u64 size)
678 {
679 	u64 cache_offset = offset - cache->offset;
680 	u64 cache_size   = min(cache->size - cache_offset, size);
681 
682 	memcpy(data, cache->data + cache_offset, cache_size);
683 	return cache_size;
684 }
685 
686 static ssize_t
687 dso_cache__read(struct dso *dso, struct machine *machine,
688 		u64 offset, u8 *data, ssize_t size)
689 {
690 	struct dso_cache *cache;
691 	struct dso_cache *old;
692 	ssize_t ret;
693 
694 	do {
695 		u64 cache_offset;
696 
697 		cache = zalloc(sizeof(*cache) + DSO__DATA_CACHE_SIZE);
698 		if (!cache)
699 			return -ENOMEM;
700 
701 		pthread_mutex_lock(&dso__data_open_lock);
702 
703 		/*
704 		 * dso->data.fd might be closed if other thread opened another
705 		 * file (dso) due to open file limit (RLIMIT_NOFILE).
706 		 */
707 		try_to_open_dso(dso, machine);
708 
709 		if (dso->data.fd < 0) {
710 			ret = -errno;
711 			dso->data.status = DSO_DATA_STATUS_ERROR;
712 			break;
713 		}
714 
715 		cache_offset = offset & DSO__DATA_CACHE_MASK;
716 
717 		ret = pread(dso->data.fd, cache->data, DSO__DATA_CACHE_SIZE, cache_offset);
718 		if (ret <= 0)
719 			break;
720 
721 		cache->offset = cache_offset;
722 		cache->size   = ret;
723 	} while (0);
724 
725 	pthread_mutex_unlock(&dso__data_open_lock);
726 
727 	if (ret > 0) {
728 		old = dso_cache__insert(dso, cache);
729 		if (old) {
730 			/* we lose the race */
731 			free(cache);
732 			cache = old;
733 		}
734 
735 		ret = dso_cache__memcpy(cache, offset, data, size);
736 	}
737 
738 	if (ret <= 0)
739 		free(cache);
740 
741 	return ret;
742 }
743 
744 static ssize_t dso_cache_read(struct dso *dso, struct machine *machine,
745 			      u64 offset, u8 *data, ssize_t size)
746 {
747 	struct dso_cache *cache;
748 
749 	cache = dso_cache__find(dso, offset);
750 	if (cache)
751 		return dso_cache__memcpy(cache, offset, data, size);
752 	else
753 		return dso_cache__read(dso, machine, offset, data, size);
754 }
755 
756 /*
757  * Reads and caches dso data DSO__DATA_CACHE_SIZE size chunks
758  * in the rb_tree. Any read to already cached data is served
759  * by cached data.
760  */
761 static ssize_t cached_read(struct dso *dso, struct machine *machine,
762 			   u64 offset, u8 *data, ssize_t size)
763 {
764 	ssize_t r = 0;
765 	u8 *p = data;
766 
767 	do {
768 		ssize_t ret;
769 
770 		ret = dso_cache_read(dso, machine, offset, p, size);
771 		if (ret < 0)
772 			return ret;
773 
774 		/* Reached EOF, return what we have. */
775 		if (!ret)
776 			break;
777 
778 		BUG_ON(ret > size);
779 
780 		r      += ret;
781 		p      += ret;
782 		offset += ret;
783 		size   -= ret;
784 
785 	} while (size);
786 
787 	return r;
788 }
789 
790 static int data_file_size(struct dso *dso, struct machine *machine)
791 {
792 	int ret = 0;
793 	struct stat st;
794 	char sbuf[STRERR_BUFSIZE];
795 
796 	if (dso->data.file_size)
797 		return 0;
798 
799 	if (dso->data.status == DSO_DATA_STATUS_ERROR)
800 		return -1;
801 
802 	pthread_mutex_lock(&dso__data_open_lock);
803 
804 	/*
805 	 * dso->data.fd might be closed if other thread opened another
806 	 * file (dso) due to open file limit (RLIMIT_NOFILE).
807 	 */
808 	try_to_open_dso(dso, machine);
809 
810 	if (dso->data.fd < 0) {
811 		ret = -errno;
812 		dso->data.status = DSO_DATA_STATUS_ERROR;
813 		goto out;
814 	}
815 
816 	if (fstat(dso->data.fd, &st) < 0) {
817 		ret = -errno;
818 		pr_err("dso cache fstat failed: %s\n",
819 		       str_error_r(errno, sbuf, sizeof(sbuf)));
820 		dso->data.status = DSO_DATA_STATUS_ERROR;
821 		goto out;
822 	}
823 	dso->data.file_size = st.st_size;
824 
825 out:
826 	pthread_mutex_unlock(&dso__data_open_lock);
827 	return ret;
828 }
829 
830 /**
831  * dso__data_size - Return dso data size
832  * @dso: dso object
833  * @machine: machine object
834  *
835  * Return: dso data size
836  */
837 off_t dso__data_size(struct dso *dso, struct machine *machine)
838 {
839 	if (data_file_size(dso, machine))
840 		return -1;
841 
842 	/* For now just estimate dso data size is close to file size */
843 	return dso->data.file_size;
844 }
845 
846 static ssize_t data_read_offset(struct dso *dso, struct machine *machine,
847 				u64 offset, u8 *data, ssize_t size)
848 {
849 	if (data_file_size(dso, machine))
850 		return -1;
851 
852 	/* Check the offset sanity. */
853 	if (offset > dso->data.file_size)
854 		return -1;
855 
856 	if (offset + size < offset)
857 		return -1;
858 
859 	return cached_read(dso, machine, offset, data, size);
860 }
861 
862 /**
863  * dso__data_read_offset - Read data from dso file offset
864  * @dso: dso object
865  * @machine: machine object
866  * @offset: file offset
867  * @data: buffer to store data
868  * @size: size of the @data buffer
869  *
870  * External interface to read data from dso file offset. Open
871  * dso data file and use cached_read to get the data.
872  */
873 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
874 			      u64 offset, u8 *data, ssize_t size)
875 {
876 	if (dso->data.status == DSO_DATA_STATUS_ERROR)
877 		return -1;
878 
879 	return data_read_offset(dso, machine, offset, data, size);
880 }
881 
882 /**
883  * dso__data_read_addr - Read data from dso address
884  * @dso: dso object
885  * @machine: machine object
886  * @add: virtual memory address
887  * @data: buffer to store data
888  * @size: size of the @data buffer
889  *
890  * External interface to read data from dso address.
891  */
892 ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
893 			    struct machine *machine, u64 addr,
894 			    u8 *data, ssize_t size)
895 {
896 	u64 offset = map->map_ip(map, addr);
897 	return dso__data_read_offset(dso, machine, offset, data, size);
898 }
899 
900 struct map *dso__new_map(const char *name)
901 {
902 	struct map *map = NULL;
903 	struct dso *dso = dso__new(name);
904 
905 	if (dso)
906 		map = map__new2(0, dso, MAP__FUNCTION);
907 
908 	return map;
909 }
910 
911 struct dso *machine__findnew_kernel(struct machine *machine, const char *name,
912 				    const char *short_name, int dso_type)
913 {
914 	/*
915 	 * The kernel dso could be created by build_id processing.
916 	 */
917 	struct dso *dso = machine__findnew_dso(machine, name);
918 
919 	/*
920 	 * We need to run this in all cases, since during the build_id
921 	 * processing we had no idea this was the kernel dso.
922 	 */
923 	if (dso != NULL) {
924 		dso__set_short_name(dso, short_name, false);
925 		dso->kernel = dso_type;
926 	}
927 
928 	return dso;
929 }
930 
931 /*
932  * Find a matching entry and/or link current entry to RB tree.
933  * Either one of the dso or name parameter must be non-NULL or the
934  * function will not work.
935  */
936 static struct dso *__dso__findlink_by_longname(struct rb_root *root,
937 					       struct dso *dso, const char *name)
938 {
939 	struct rb_node **p = &root->rb_node;
940 	struct rb_node  *parent = NULL;
941 
942 	if (!name)
943 		name = dso->long_name;
944 	/*
945 	 * Find node with the matching name
946 	 */
947 	while (*p) {
948 		struct dso *this = rb_entry(*p, struct dso, rb_node);
949 		int rc = strcmp(name, this->long_name);
950 
951 		parent = *p;
952 		if (rc == 0) {
953 			/*
954 			 * In case the new DSO is a duplicate of an existing
955 			 * one, print a one-time warning & put the new entry
956 			 * at the end of the list of duplicates.
957 			 */
958 			if (!dso || (dso == this))
959 				return this;	/* Find matching dso */
960 			/*
961 			 * The core kernel DSOs may have duplicated long name.
962 			 * In this case, the short name should be different.
963 			 * Comparing the short names to differentiate the DSOs.
964 			 */
965 			rc = strcmp(dso->short_name, this->short_name);
966 			if (rc == 0) {
967 				pr_err("Duplicated dso name: %s\n", name);
968 				return NULL;
969 			}
970 		}
971 		if (rc < 0)
972 			p = &parent->rb_left;
973 		else
974 			p = &parent->rb_right;
975 	}
976 	if (dso) {
977 		/* Add new node and rebalance tree */
978 		rb_link_node(&dso->rb_node, parent, p);
979 		rb_insert_color(&dso->rb_node, root);
980 		dso->root = root;
981 	}
982 	return NULL;
983 }
984 
985 static inline struct dso *__dso__find_by_longname(struct rb_root *root,
986 						  const char *name)
987 {
988 	return __dso__findlink_by_longname(root, NULL, name);
989 }
990 
991 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated)
992 {
993 	struct rb_root *root = dso->root;
994 
995 	if (name == NULL)
996 		return;
997 
998 	if (dso->long_name_allocated)
999 		free((char *)dso->long_name);
1000 
1001 	if (root) {
1002 		rb_erase(&dso->rb_node, root);
1003 		/*
1004 		 * __dso__findlink_by_longname() isn't guaranteed to add it
1005 		 * back, so a clean removal is required here.
1006 		 */
1007 		RB_CLEAR_NODE(&dso->rb_node);
1008 		dso->root = NULL;
1009 	}
1010 
1011 	dso->long_name		 = name;
1012 	dso->long_name_len	 = strlen(name);
1013 	dso->long_name_allocated = name_allocated;
1014 
1015 	if (root)
1016 		__dso__findlink_by_longname(root, dso, NULL);
1017 }
1018 
1019 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated)
1020 {
1021 	if (name == NULL)
1022 		return;
1023 
1024 	if (dso->short_name_allocated)
1025 		free((char *)dso->short_name);
1026 
1027 	dso->short_name		  = name;
1028 	dso->short_name_len	  = strlen(name);
1029 	dso->short_name_allocated = name_allocated;
1030 }
1031 
1032 static void dso__set_basename(struct dso *dso)
1033 {
1034        /*
1035         * basename() may modify path buffer, so we must pass
1036         * a copy.
1037         */
1038        char *base, *lname = strdup(dso->long_name);
1039 
1040        if (!lname)
1041                return;
1042 
1043        /*
1044         * basename() may return a pointer to internal
1045         * storage which is reused in subsequent calls
1046         * so copy the result.
1047         */
1048        base = strdup(basename(lname));
1049 
1050        free(lname);
1051 
1052        if (!base)
1053                return;
1054 
1055        dso__set_short_name(dso, base, true);
1056 }
1057 
1058 int dso__name_len(const struct dso *dso)
1059 {
1060 	if (!dso)
1061 		return strlen("[unknown]");
1062 	if (verbose > 0)
1063 		return dso->long_name_len;
1064 
1065 	return dso->short_name_len;
1066 }
1067 
1068 bool dso__loaded(const struct dso *dso, enum map_type type)
1069 {
1070 	return dso->loaded & (1 << type);
1071 }
1072 
1073 bool dso__sorted_by_name(const struct dso *dso, enum map_type type)
1074 {
1075 	return dso->sorted_by_name & (1 << type);
1076 }
1077 
1078 void dso__set_sorted_by_name(struct dso *dso, enum map_type type)
1079 {
1080 	dso->sorted_by_name |= (1 << type);
1081 }
1082 
1083 struct dso *dso__new(const char *name)
1084 {
1085 	struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1);
1086 
1087 	if (dso != NULL) {
1088 		int i;
1089 		strcpy(dso->name, name);
1090 		dso__set_long_name(dso, dso->name, false);
1091 		dso__set_short_name(dso, dso->name, false);
1092 		for (i = 0; i < MAP__NR_TYPES; ++i)
1093 			dso->symbols[i] = dso->symbol_names[i] = RB_ROOT;
1094 		dso->data.cache = RB_ROOT;
1095 		dso->data.fd = -1;
1096 		dso->data.status = DSO_DATA_STATUS_UNKNOWN;
1097 		dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND;
1098 		dso->binary_type = DSO_BINARY_TYPE__NOT_FOUND;
1099 		dso->is_64_bit = (sizeof(void *) == 8);
1100 		dso->loaded = 0;
1101 		dso->rel = 0;
1102 		dso->sorted_by_name = 0;
1103 		dso->has_build_id = 0;
1104 		dso->has_srcline = 1;
1105 		dso->a2l_fails = 1;
1106 		dso->kernel = DSO_TYPE_USER;
1107 		dso->needs_swap = DSO_SWAP__UNSET;
1108 		RB_CLEAR_NODE(&dso->rb_node);
1109 		dso->root = NULL;
1110 		INIT_LIST_HEAD(&dso->node);
1111 		INIT_LIST_HEAD(&dso->data.open_entry);
1112 		pthread_mutex_init(&dso->lock, NULL);
1113 		refcount_set(&dso->refcnt, 1);
1114 	}
1115 
1116 	return dso;
1117 }
1118 
1119 void dso__delete(struct dso *dso)
1120 {
1121 	int i;
1122 
1123 	if (!RB_EMPTY_NODE(&dso->rb_node))
1124 		pr_err("DSO %s is still in rbtree when being deleted!\n",
1125 		       dso->long_name);
1126 	for (i = 0; i < MAP__NR_TYPES; ++i)
1127 		symbols__delete(&dso->symbols[i]);
1128 
1129 	if (dso->short_name_allocated) {
1130 		zfree((char **)&dso->short_name);
1131 		dso->short_name_allocated = false;
1132 	}
1133 
1134 	if (dso->long_name_allocated) {
1135 		zfree((char **)&dso->long_name);
1136 		dso->long_name_allocated = false;
1137 	}
1138 
1139 	dso__data_close(dso);
1140 	auxtrace_cache__free(dso->auxtrace_cache);
1141 	dso_cache__free(dso);
1142 	dso__free_a2l(dso);
1143 	zfree(&dso->symsrc_filename);
1144 	pthread_mutex_destroy(&dso->lock);
1145 	free(dso);
1146 }
1147 
1148 struct dso *dso__get(struct dso *dso)
1149 {
1150 	if (dso)
1151 		refcount_inc(&dso->refcnt);
1152 	return dso;
1153 }
1154 
1155 void dso__put(struct dso *dso)
1156 {
1157 	if (dso && refcount_dec_and_test(&dso->refcnt))
1158 		dso__delete(dso);
1159 }
1160 
1161 void dso__set_build_id(struct dso *dso, void *build_id)
1162 {
1163 	memcpy(dso->build_id, build_id, sizeof(dso->build_id));
1164 	dso->has_build_id = 1;
1165 }
1166 
1167 bool dso__build_id_equal(const struct dso *dso, u8 *build_id)
1168 {
1169 	return memcmp(dso->build_id, build_id, sizeof(dso->build_id)) == 0;
1170 }
1171 
1172 void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine)
1173 {
1174 	char path[PATH_MAX];
1175 
1176 	if (machine__is_default_guest(machine))
1177 		return;
1178 	sprintf(path, "%s/sys/kernel/notes", machine->root_dir);
1179 	if (sysfs__read_build_id(path, dso->build_id,
1180 				 sizeof(dso->build_id)) == 0)
1181 		dso->has_build_id = true;
1182 }
1183 
1184 int dso__kernel_module_get_build_id(struct dso *dso,
1185 				    const char *root_dir)
1186 {
1187 	char filename[PATH_MAX];
1188 	/*
1189 	 * kernel module short names are of the form "[module]" and
1190 	 * we need just "module" here.
1191 	 */
1192 	const char *name = dso->short_name + 1;
1193 
1194 	snprintf(filename, sizeof(filename),
1195 		 "%s/sys/module/%.*s/notes/.note.gnu.build-id",
1196 		 root_dir, (int)strlen(name) - 1, name);
1197 
1198 	if (sysfs__read_build_id(filename, dso->build_id,
1199 				 sizeof(dso->build_id)) == 0)
1200 		dso->has_build_id = true;
1201 
1202 	return 0;
1203 }
1204 
1205 bool __dsos__read_build_ids(struct list_head *head, bool with_hits)
1206 {
1207 	bool have_build_id = false;
1208 	struct dso *pos;
1209 
1210 	list_for_each_entry(pos, head, node) {
1211 		if (with_hits && !pos->hit && !dso__is_vdso(pos))
1212 			continue;
1213 		if (pos->has_build_id) {
1214 			have_build_id = true;
1215 			continue;
1216 		}
1217 		if (filename__read_build_id(pos->long_name, pos->build_id,
1218 					    sizeof(pos->build_id)) > 0) {
1219 			have_build_id	  = true;
1220 			pos->has_build_id = true;
1221 		}
1222 	}
1223 
1224 	return have_build_id;
1225 }
1226 
1227 void __dsos__add(struct dsos *dsos, struct dso *dso)
1228 {
1229 	list_add_tail(&dso->node, &dsos->head);
1230 	__dso__findlink_by_longname(&dsos->root, dso, NULL);
1231 	/*
1232 	 * It is now in the linked list, grab a reference, then garbage collect
1233 	 * this when needing memory, by looking at LRU dso instances in the
1234 	 * list with atomic_read(&dso->refcnt) == 1, i.e. no references
1235 	 * anywhere besides the one for the list, do, under a lock for the
1236 	 * list: remove it from the list, then a dso__put(), that probably will
1237 	 * be the last and will then call dso__delete(), end of life.
1238 	 *
1239 	 * That, or at the end of the 'struct machine' lifetime, when all
1240 	 * 'struct dso' instances will be removed from the list, in
1241 	 * dsos__exit(), if they have no other reference from some other data
1242 	 * structure.
1243 	 *
1244 	 * E.g.: after processing a 'perf.data' file and storing references
1245 	 * to objects instantiated while processing events, we will have
1246 	 * references to the 'thread', 'map', 'dso' structs all from 'struct
1247 	 * hist_entry' instances, but we may not need anything not referenced,
1248 	 * so we might as well call machines__exit()/machines__delete() and
1249 	 * garbage collect it.
1250 	 */
1251 	dso__get(dso);
1252 }
1253 
1254 void dsos__add(struct dsos *dsos, struct dso *dso)
1255 {
1256 	pthread_rwlock_wrlock(&dsos->lock);
1257 	__dsos__add(dsos, dso);
1258 	pthread_rwlock_unlock(&dsos->lock);
1259 }
1260 
1261 struct dso *__dsos__find(struct dsos *dsos, const char *name, bool cmp_short)
1262 {
1263 	struct dso *pos;
1264 
1265 	if (cmp_short) {
1266 		list_for_each_entry(pos, &dsos->head, node)
1267 			if (strcmp(pos->short_name, name) == 0)
1268 				return pos;
1269 		return NULL;
1270 	}
1271 	return __dso__find_by_longname(&dsos->root, name);
1272 }
1273 
1274 struct dso *dsos__find(struct dsos *dsos, const char *name, bool cmp_short)
1275 {
1276 	struct dso *dso;
1277 	pthread_rwlock_rdlock(&dsos->lock);
1278 	dso = __dsos__find(dsos, name, cmp_short);
1279 	pthread_rwlock_unlock(&dsos->lock);
1280 	return dso;
1281 }
1282 
1283 struct dso *__dsos__addnew(struct dsos *dsos, const char *name)
1284 {
1285 	struct dso *dso = dso__new(name);
1286 
1287 	if (dso != NULL) {
1288 		__dsos__add(dsos, dso);
1289 		dso__set_basename(dso);
1290 		/* Put dso here because __dsos_add already got it */
1291 		dso__put(dso);
1292 	}
1293 	return dso;
1294 }
1295 
1296 struct dso *__dsos__findnew(struct dsos *dsos, const char *name)
1297 {
1298 	struct dso *dso = __dsos__find(dsos, name, false);
1299 
1300 	return dso ? dso : __dsos__addnew(dsos, name);
1301 }
1302 
1303 struct dso *dsos__findnew(struct dsos *dsos, const char *name)
1304 {
1305 	struct dso *dso;
1306 	pthread_rwlock_wrlock(&dsos->lock);
1307 	dso = dso__get(__dsos__findnew(dsos, name));
1308 	pthread_rwlock_unlock(&dsos->lock);
1309 	return dso;
1310 }
1311 
1312 size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
1313 			       bool (skip)(struct dso *dso, int parm), int parm)
1314 {
1315 	struct dso *pos;
1316 	size_t ret = 0;
1317 
1318 	list_for_each_entry(pos, head, node) {
1319 		if (skip && skip(pos, parm))
1320 			continue;
1321 		ret += dso__fprintf_buildid(pos, fp);
1322 		ret += fprintf(fp, " %s\n", pos->long_name);
1323 	}
1324 	return ret;
1325 }
1326 
1327 size_t __dsos__fprintf(struct list_head *head, FILE *fp)
1328 {
1329 	struct dso *pos;
1330 	size_t ret = 0;
1331 
1332 	list_for_each_entry(pos, head, node) {
1333 		int i;
1334 		for (i = 0; i < MAP__NR_TYPES; ++i)
1335 			ret += dso__fprintf(pos, i, fp);
1336 	}
1337 
1338 	return ret;
1339 }
1340 
1341 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp)
1342 {
1343 	char sbuild_id[SBUILD_ID_SIZE];
1344 
1345 	build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
1346 	return fprintf(fp, "%s", sbuild_id);
1347 }
1348 
1349 size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp)
1350 {
1351 	struct rb_node *nd;
1352 	size_t ret = fprintf(fp, "dso: %s (", dso->short_name);
1353 
1354 	if (dso->short_name != dso->long_name)
1355 		ret += fprintf(fp, "%s, ", dso->long_name);
1356 	ret += fprintf(fp, "%s, %sloaded, ", map_type__name[type],
1357 		       dso__loaded(dso, type) ? "" : "NOT ");
1358 	ret += dso__fprintf_buildid(dso, fp);
1359 	ret += fprintf(fp, ")\n");
1360 	for (nd = rb_first(&dso->symbols[type]); nd; nd = rb_next(nd)) {
1361 		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
1362 		ret += symbol__fprintf(pos, fp);
1363 	}
1364 
1365 	return ret;
1366 }
1367 
1368 enum dso_type dso__type(struct dso *dso, struct machine *machine)
1369 {
1370 	int fd;
1371 	enum dso_type type = DSO__TYPE_UNKNOWN;
1372 
1373 	fd = dso__data_get_fd(dso, machine);
1374 	if (fd >= 0) {
1375 		type = dso__type_fd(fd);
1376 		dso__data_put_fd(dso);
1377 	}
1378 
1379 	return type;
1380 }
1381 
1382 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen)
1383 {
1384 	int idx, errnum = dso->load_errno;
1385 	/*
1386 	 * This must have a same ordering as the enum dso_load_errno.
1387 	 */
1388 	static const char *dso_load__error_str[] = {
1389 	"Internal tools/perf/ library error",
1390 	"Invalid ELF file",
1391 	"Can not read build id",
1392 	"Mismatching build id",
1393 	"Decompression failure",
1394 	};
1395 
1396 	BUG_ON(buflen == 0);
1397 
1398 	if (errnum >= 0) {
1399 		const char *err = str_error_r(errnum, buf, buflen);
1400 
1401 		if (err != buf)
1402 			scnprintf(buf, buflen, "%s", err);
1403 
1404 		return 0;
1405 	}
1406 
1407 	if (errnum <  __DSO_LOAD_ERRNO__START || errnum >= __DSO_LOAD_ERRNO__END)
1408 		return -1;
1409 
1410 	idx = errnum - __DSO_LOAD_ERRNO__START;
1411 	scnprintf(buf, buflen, "%s", dso_load__error_str[idx]);
1412 	return 0;
1413 }
1414