1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _PERF_TARGET_H |
3 | #define _PERF_TARGET_H |
4 | |
5 | #include <stdbool.h> |
6 | #include <sys/types.h> |
7 | |
8 | struct target { |
9 | const char *pid; |
10 | const char *tid; |
11 | const char *cpu_list; |
12 | const char *uid_str; |
13 | const char *bpf_str; |
14 | uid_t uid; |
15 | bool system_wide; |
16 | bool uses_mmap; |
17 | bool default_per_cpu; |
18 | bool per_thread; |
19 | bool use_bpf; |
20 | int initial_delay; |
21 | const char *attr_map; |
22 | }; |
23 | |
24 | enum target_errno { |
25 | TARGET_ERRNO__SUCCESS = 0, |
26 | |
27 | /* |
28 | * Choose an arbitrary negative big number not to clash with standard |
29 | * errno since SUS requires the errno has distinct positive values. |
30 | * See 'Issue 6' in the link below. |
31 | * |
32 | * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html |
33 | */ |
34 | __TARGET_ERRNO__START = -10000, |
35 | |
36 | /* for target__validate() */ |
37 | TARGET_ERRNO__PID_OVERRIDE_CPU = __TARGET_ERRNO__START, |
38 | TARGET_ERRNO__PID_OVERRIDE_UID, |
39 | TARGET_ERRNO__UID_OVERRIDE_CPU, |
40 | TARGET_ERRNO__PID_OVERRIDE_SYSTEM, |
41 | TARGET_ERRNO__UID_OVERRIDE_SYSTEM, |
42 | TARGET_ERRNO__SYSTEM_OVERRIDE_THREAD, |
43 | TARGET_ERRNO__BPF_OVERRIDE_CPU, |
44 | TARGET_ERRNO__BPF_OVERRIDE_PID, |
45 | TARGET_ERRNO__BPF_OVERRIDE_UID, |
46 | TARGET_ERRNO__BPF_OVERRIDE_THREAD, |
47 | |
48 | /* for target__parse_uid() */ |
49 | TARGET_ERRNO__INVALID_UID, |
50 | TARGET_ERRNO__USER_NOT_FOUND, |
51 | |
52 | __TARGET_ERRNO__END, |
53 | }; |
54 | |
55 | enum target_errno target__validate(struct target *target); |
56 | enum target_errno target__parse_uid(struct target *target); |
57 | |
58 | int target__strerror(struct target *target, int errnum, char *buf, size_t buflen); |
59 | |
60 | static inline bool target__has_task(struct target *target) |
61 | { |
62 | return target->tid || target->pid || target->uid_str; |
63 | } |
64 | |
65 | static inline bool target__has_cpu(struct target *target) |
66 | { |
67 | return target->system_wide || target->cpu_list; |
68 | } |
69 | |
70 | static inline bool target__none(struct target *target) |
71 | { |
72 | return !target__has_task(target) && !target__has_cpu(target); |
73 | } |
74 | |
75 | static inline bool target__enable_on_exec(struct target *target) |
76 | { |
77 | /* |
78 | * Normally enable_on_exec should be set if: |
79 | * 1) The tracee process is forked (not attaching to existed task or cpu). |
80 | * 2) And initial_delay is not configured. |
81 | * Otherwise, we enable tracee events manually. |
82 | */ |
83 | return target__none(target) && !target->initial_delay; |
84 | } |
85 | |
86 | static inline bool target__has_per_thread(struct target *target) |
87 | { |
88 | return target->system_wide && target->per_thread; |
89 | } |
90 | |
91 | static inline bool target__uses_dummy_map(struct target *target) |
92 | { |
93 | bool use_dummy = false; |
94 | |
95 | if (target->default_per_cpu) |
96 | use_dummy = target->per_thread ? true : false; |
97 | else if (target__has_task(target) || |
98 | (!target__has_cpu(target) && !target->uses_mmap)) |
99 | use_dummy = true; |
100 | else if (target__has_per_thread(target)) |
101 | use_dummy = true; |
102 | |
103 | return use_dummy; |
104 | } |
105 | |
106 | #endif /* _PERF_TARGET_H */ |
107 | |