1 // SPDX-License-Identifier: GPL-2.0
7 #include <sys/utsname.h>
17 #include <linux/capability.h>
18 #include <linux/kernel.h>
19 #include <linux/log2.h>
20 #include <linux/time64.h>
21 #include <linux/overflow.h>
28 * XXX We need to find a better place for these things...
31 const char *input_name
;
33 bool perf_singlethreaded
= true;
35 void perf_set_singlethreaded(void)
37 perf_singlethreaded
= true;
40 void perf_set_multithreaded(void)
42 perf_singlethreaded
= false;
45 int sysctl_perf_event_max_stack
= PERF_MAX_STACK_DEPTH
;
46 int sysctl_perf_event_max_contexts_per_stack
= PERF_MAX_CONTEXTS_PER_STACK
;
48 int sysctl__max_stack(void)
52 if (sysctl__read_int("kernel/perf_event_max_stack", &value
) == 0)
53 sysctl_perf_event_max_stack
= value
;
55 if (sysctl__read_int("kernel/perf_event_max_contexts_per_stack", &value
) == 0)
56 sysctl_perf_event_max_contexts_per_stack
= value
;
58 return sysctl_perf_event_max_stack
;
61 bool sysctl__nmi_watchdog_enabled(void)
64 static bool nmi_watchdog
;
70 if (sysctl__read_int("kernel/nmi_watchdog", &value
) < 0)
73 nmi_watchdog
= (value
> 0) ? true : false;
79 bool test_attr__enabled
;
81 bool exclude_GH_default
;
83 bool perf_host
= true;
84 bool perf_guest
= false;
86 void event_attr_init(struct perf_event_attr
*attr
)
88 /* to capture ABI version */
89 attr
->size
= sizeof(*attr
);
91 if (!exclude_GH_default
)
95 attr
->exclude_host
= 1;
97 attr
->exclude_guest
= 1;
100 int mkdir_p(char *path
, mode_t mode
)
109 if (stat(path
, &st
) == 0)
114 while ((d
= strchr(d
, '/'))) {
116 err
= stat(path
, &st
) && mkdir(path
, mode
);
123 return (stat(path
, &st
) && mkdir(path
, mode
)) ? -1 : 0;
126 static bool match_pat(char *file
, const char **pat
)
134 if (strglobmatch(file
, pat
[i
]))
144 * The depth specify how deep the removal will go.
145 * 0 - will remove only files under the 'path' directory
146 * 1 .. x - will dive in x-level deep under the 'path' directory
148 * If specified the pat is array of string patterns ended with NULL,
149 * which are checked upon every file/directory found. Only matching
152 * The function returns:
154 * -1 on removal failure with errno set
155 * -2 on pattern failure
157 static int rm_rf_depth_pat(const char *path
, int depth
, const char **pat
)
162 char namebuf
[PATH_MAX
];
165 /* Do not fail if there's no file. */
166 ret
= lstat(path
, &statbuf
);
170 /* Try to remove any file we get. */
171 if (!(statbuf
.st_mode
& S_IFDIR
))
174 /* We have directory in path. */
179 while ((d
= readdir(dir
)) != NULL
&& !ret
) {
181 if (!strcmp(d
->d_name
, ".") || !strcmp(d
->d_name
, ".."))
184 if (!match_pat(d
->d_name
, pat
)) {
189 scnprintf(namebuf
, sizeof(namebuf
), "%s/%s",
192 /* We have to check symbolic link itself */
193 ret
= lstat(namebuf
, &statbuf
);
195 pr_debug("stat failed: %s\n", namebuf
);
199 if (S_ISDIR(statbuf
.st_mode
))
200 ret
= depth
? rm_rf_depth_pat(namebuf
, depth
- 1, pat
) : 0;
202 ret
= unlink(namebuf
);
212 static int rm_rf_a_kcore_dir(const char *path
, const char *name
)
214 char kcore_dir_path
[PATH_MAX
];
215 const char *pat
[] = {
222 snprintf(kcore_dir_path
, sizeof(kcore_dir_path
), "%s/%s", path
, name
);
224 return rm_rf_depth_pat(kcore_dir_path
, 0, pat
);
227 static bool kcore_dir_filter(const char *name __maybe_unused
, struct dirent
*d
)
229 const char *pat
[] = {
235 return match_pat(d
->d_name
, pat
);
238 static int rm_rf_kcore_dir(const char *path
)
240 struct strlist
*kcore_dirs
;
244 kcore_dirs
= lsdir(path
, kcore_dir_filter
);
249 strlist__for_each_entry(nd
, kcore_dirs
) {
250 ret
= rm_rf_a_kcore_dir(path
, nd
->s
);
255 strlist__delete(kcore_dirs
);
260 int rm_rf_perf_data(const char *path
)
262 const char *pat
[] = {
268 rm_rf_kcore_dir(path
);
270 return rm_rf_depth_pat(path
, 0, pat
);
273 int rm_rf(const char *path
)
275 return rm_rf_depth_pat(path
, INT_MAX
, NULL
);
278 /* A filter which removes dot files */
279 bool lsdir_no_dot_filter(const char *name __maybe_unused
, struct dirent
*d
)
281 return d
->d_name
[0] != '.';
284 /* lsdir reads a directory and store it in strlist */
285 struct strlist
*lsdir(const char *name
,
286 bool (*filter
)(const char *, struct dirent
*))
288 struct strlist
*list
= NULL
;
296 list
= strlist__new(NULL
, NULL
);
302 while ((d
= readdir(dir
)) != NULL
) {
303 if (!filter
|| filter(name
, d
))
304 strlist__add(list
, d
->d_name
);
312 size_t hex_width(u64 v
)
322 int perf_event_paranoid(void)
326 if (sysctl__read_int("kernel/perf_event_paranoid", &value
))
332 bool perf_event_paranoid_check(int max_level
)
336 if (perf_cap__capable(CAP_SYS_ADMIN
, &used_root
))
339 if (!used_root
&& perf_cap__capable(CAP_PERFMON
, &used_root
))
342 return perf_event_paranoid() <= max_level
;
345 int perf_tip(char **strp
, const char *dirpath
)
347 struct strlist
*tips
;
348 struct str_node
*node
;
349 struct strlist_config conf
= {
356 tips
= strlist__new("tips.txt", &conf
);
360 if (strlist__nr_entries(tips
) == 0)
363 node
= strlist__entry(tips
, random() % strlist__nr_entries(tips
));
364 if (asprintf(strp
, "Tip: %s", node
->s
) < 0)
368 strlist__delete(tips
);
373 char *perf_exe(char *buf
, int len
)
375 int n
= readlink("/proc/self/exe", buf
, len
);
380 return strcpy(buf
, "perf");
383 void perf_debuginfod_setup(struct perf_debuginfod
*di
)
386 * By default '!di->set' we clear DEBUGINFOD_URLS, so debuginfod
387 * processing is not triggered, otherwise we set it to 'di->urls'
388 * value. If 'di->urls' is "system" we keep DEBUGINFOD_URLS value.
391 setenv("DEBUGINFOD_URLS", "", 1);
392 else if (di
->urls
&& strcmp(di
->urls
, "system"))
393 setenv("DEBUGINFOD_URLS", di
->urls
, 1);
395 pr_debug("DEBUGINFOD_URLS=%s\n", getenv("DEBUGINFOD_URLS"));
397 #ifndef HAVE_DEBUGINFOD_SUPPORT
399 pr_warning("WARNING: debuginfod support requested, but perf is not built with it\n");
404 * Return a new filename prepended with task's root directory if it's in
405 * a chroot. Callers should free the returned string.
407 char *filename_with_chroot(int pid
, const char *filename
)
411 char *new_name
= NULL
;
414 scnprintf(proc_root
, sizeof(proc_root
), "/proc/%d/root", pid
);
415 ret
= readlink(proc_root
, buf
, sizeof(buf
) - 1);
419 /* readlink(2) does not append a null byte to buf */
422 if (!strcmp(buf
, "/"))
425 if (strstr(buf
, "(deleted)"))
428 if (asprintf(&new_name
, "%s/%s", buf
, filename
) < 0)
435 * Reallocate an array *arr of size *arr_sz so that it is big enough to contain
436 * x elements of size msz, initializing new entries to *init_val or zero if
439 int do_realloc_array_as_needed(void **arr
, size_t *arr_sz
, size_t x
, size_t msz
, const void *init_val
)
441 size_t new_sz
= *arr_sz
;
446 new_sz
= msz
>= 64 ? 1 : roundup(64, msz
); /* Start with at least 64 bytes */
447 while (x
>= new_sz
) {
448 if (check_mul_overflow(new_sz
, (size_t)2, &new_sz
))
451 if (new_sz
== *arr_sz
)
453 new_arr
= calloc(new_sz
, msz
);
457 memcpy(new_arr
, *arr
, *arr_sz
* msz
);
459 for (i
= *arr_sz
; i
< new_sz
; i
++)
460 memcpy(new_arr
+ (i
* msz
), init_val
, msz
);
467 #ifndef HAVE_SCHED_GETCPU_SUPPORT
468 int sched_getcpu(void)
472 int err
= syscall(__NR_getcpu
, &cpu
, NULL
, NULL
);
483 #ifndef HAVE_SCANDIRAT_SUPPORT
484 int scandirat(int dirfd
, const char *dirp
,
485 struct dirent
***namelist
,
486 int (*filter
)(const struct dirent
*),
487 int (*compar
)(const struct dirent
**, const struct dirent
**))
490 int err
, fd
= openat(dirfd
, dirp
, O_PATH
);
495 snprintf(path
, sizeof(path
), "/proc/%d/fd/%d", getpid(), fd
);
496 err
= scandir(path
, namelist
, filter
, compar
);