| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef _PERF_TARGET_H | |
| #define _PERF_TARGET_H | |
| #include <stdbool.h> | |
| #include <sys/types.h> | |
| struct target { | |
| const char *pid; | |
| const char *tid; | |
| const char *cpu_list; | |
| const char *bpf_str; | |
| bool system_wide; | |
| bool uses_mmap; | |
| bool default_per_cpu; | |
| bool per_thread; | |
| bool use_bpf; | |
| bool inherit; | |
| int initial_delay; | |
| const char *attr_map; | |
| }; | |
| enum target_errno { | |
| TARGET_ERRNO__SUCCESS = 0, | |
| /* | |
| * Choose an arbitrary negative big number not to clash with standard | |
| * errno since SUS requires the errno has distinct positive values. | |
| * See 'Issue 6' in the link below. | |
| * | |
| * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html | |
| */ | |
| __TARGET_ERRNO__START = -10000, | |
| /* for target__validate() */ | |
| TARGET_ERRNO__PID_OVERRIDE_CPU = __TARGET_ERRNO__START, | |
| TARGET_ERRNO__PID_OVERRIDE_SYSTEM, | |
| TARGET_ERRNO__SYSTEM_OVERRIDE_THREAD, | |
| TARGET_ERRNO__BPF_OVERRIDE_CPU, | |
| TARGET_ERRNO__BPF_OVERRIDE_PID, | |
| TARGET_ERRNO__BPF_OVERRIDE_THREAD, | |
| __TARGET_ERRNO__END, | |
| }; | |
| enum target_errno target__validate(struct target *target); | |
| uid_t parse_uid(const char *str); | |
| int target__strerror(struct target *target, int errnum, char *buf, size_t buflen); | |
| static inline bool target__has_task(const struct target *target) | |
| { | |
| return target->tid || target->pid; | |
| } | |
| static inline bool target__has_cpu(const struct target *target) | |
| { | |
| return target->system_wide || target->cpu_list; | |
| } | |
| static inline bool target__none(const struct target *target) | |
| { | |
| return !target__has_task(target) && !target__has_cpu(target); | |
| } | |
| static inline bool target__enable_on_exec(const struct target *target) | |
| { | |
| /* | |
| * Normally enable_on_exec should be set if: | |
| * 1) The tracee process is forked (not attaching to existed task or cpu). | |
| * 2) And initial_delay is not configured. | |
| * Otherwise, we enable tracee events manually. | |
| */ | |
| return target__none(target) && !target->initial_delay; | |
| } | |
| static inline bool target__has_per_thread(const struct target *target) | |
| { | |
| return target->system_wide && target->per_thread; | |
| } | |
| static inline bool target__uses_dummy_map(const struct target *target) | |
| { | |
| bool use_dummy = false; | |
| if (target->default_per_cpu) | |
| use_dummy = target->per_thread ? true : false; | |
| else if (target__has_task(target) || | |
| (!target__has_cpu(target) && !target->uses_mmap)) | |
| use_dummy = true; | |
| else if (target__has_per_thread(target)) | |
| use_dummy = true; | |
| return use_dummy; | |
| } | |
| #endif /* _PERF_TARGET_H */ |