linux/tools/perf/util/target.h
<<
>>
Prefs
   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
   8struct target {
   9        const char   *pid;
  10        const char   *tid;
  11        const char   *cpu_list;
  12        const char   *uid_str;
  13        uid_t        uid;
  14        bool         system_wide;
  15        bool         uses_mmap;
  16        bool         default_per_cpu;
  17        bool         per_thread;
  18};
  19
  20enum target_errno {
  21        TARGET_ERRNO__SUCCESS           = 0,
  22
  23        /*
  24         * Choose an arbitrary negative big number not to clash with standard
  25         * errno since SUS requires the errno has distinct positive values.
  26         * See 'Issue 6' in the link below.
  27         *
  28         * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
  29         */
  30        __TARGET_ERRNO__START           = -10000,
  31
  32        /* for target__validate() */
  33        TARGET_ERRNO__PID_OVERRIDE_CPU  = __TARGET_ERRNO__START,
  34        TARGET_ERRNO__PID_OVERRIDE_UID,
  35        TARGET_ERRNO__UID_OVERRIDE_CPU,
  36        TARGET_ERRNO__PID_OVERRIDE_SYSTEM,
  37        TARGET_ERRNO__UID_OVERRIDE_SYSTEM,
  38        TARGET_ERRNO__SYSTEM_OVERRIDE_THREAD,
  39
  40        /* for target__parse_uid() */
  41        TARGET_ERRNO__INVALID_UID,
  42        TARGET_ERRNO__USER_NOT_FOUND,
  43
  44        __TARGET_ERRNO__END,
  45};
  46
  47enum target_errno target__validate(struct target *target);
  48enum target_errno target__parse_uid(struct target *target);
  49
  50int target__strerror(struct target *target, int errnum, char *buf, size_t buflen);
  51
  52static inline bool target__has_task(struct target *target)
  53{
  54        return target->tid || target->pid || target->uid_str;
  55}
  56
  57static inline bool target__has_cpu(struct target *target)
  58{
  59        return target->system_wide || target->cpu_list;
  60}
  61
  62static inline bool target__none(struct target *target)
  63{
  64        return !target__has_task(target) && !target__has_cpu(target);
  65}
  66
  67static inline bool target__has_per_thread(struct target *target)
  68{
  69        return target->system_wide && target->per_thread;
  70}
  71
  72static inline bool target__uses_dummy_map(struct target *target)
  73{
  74        bool use_dummy = false;
  75
  76        if (target->default_per_cpu)
  77                use_dummy = target->per_thread ? true : false;
  78        else if (target__has_task(target) ||
  79                 (!target__has_cpu(target) && !target->uses_mmap))
  80                use_dummy = true;
  81        else if (target__has_per_thread(target))
  82                use_dummy = true;
  83
  84        return use_dummy;
  85}
  86
  87#endif /* _PERF_TARGET_H */
  88