mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-04-08 12:02:33 +02:00
`perf sched stats record` captures two sets of samples. For workload profile, first set right before workload starts and second set after workload finishes. For the systemwide profile, first set at the beginning of profile and second set on receiving SIGINT signal. Add `perf sched stats report` subcommand that will read both the set of samples, get the diff and render a final report. Final report prints scheduler stat at cpu granularity as well as sched domain granularity. Example usage: # ./perf sched stats record -- true [ perf sched stats: Wrote samples to perf.data ] # perf sched stats report Description ---------------------------------------------------------------------------------------------------- DESC -> Description of the field COUNT -> Value of the field PCT_CHANGE -> Percent change with corresponding base value AVG_JIFFIES -> Avg time in jiffies between two consecutive occurrence of event ---------------------------------------------------------------------------------------------------- Time elapsed (in jiffies) : 1 ---------------------------------------------------------------------------------------------------- CPU: <ALL CPUS SUMMARY> ---------------------------------------------------------------------------------------------------- DESC COUNT PCT_CHANGE ---------------------------------------------------------------------------------------------------- yld_count : 0 array_exp : 0 sched_count : 0 sched_goidle : 0 ( 0.00% ) ttwu_count : 0 ttwu_local : 0 ( 0.00% ) rq_cpu_time : 33525 run_delay : 436 ( 1.30% ) pcount : 0 ---------------------------------------------------------------------------------------------------- CPU: <ALL CPUS SUMMARY> | DOMAIN: SMT ---------------------------------------------------------------------------------------------------- DESC COUNT AVG_JIFFIES ----------------------------------------- <Category busy> ------------------------------------------ busy_lb_count : 0 $ 0.00 $ busy_lb_balanced : 0 $ 0.00 $ busy_lb_failed : 0 $ 0.00 $ busy_lb_imbalance_load : 0 busy_lb_imbalance_util : 0 busy_lb_imbalance_task : 0 busy_lb_imbalance_misfit : 0 busy_lb_gained : 0 busy_lb_hot_gained : 0 busy_lb_nobusyq : 0 $ 0.00 $ busy_lb_nobusyg : 0 $ 0.00 $ *busy_lb_success_count : 0 *busy_lb_avg_pulled : 0.00 ... and so on. Output shows similar data for all the cpus in the system. Co-developed-by: Ravi Bangoria <ravi.bangoria@amd.com> Signed-off-by: Ravi Bangoria <ravi.bangoria@amd.com> Signed-off-by: Swapnil Sapkal <swapnil.sapkal@amd.com> Tested-by: Chen Yu <yu.c.chen@intel.com> Tested-by: James Clark <james.clark@linaro.org> Acked-by: Ian Rogers <irogers@google.com> Acked-by: Peter Zijlstra <peterz@infradead.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Anubhav Shelat <ashelat@redhat.com> Cc: Ben Gainey <ben.gainey@arm.com> Cc: Blake Jones <blakejones@google.com> Cc: Chun-Tse Shao <ctshao@google.com> Cc: David Vernet <void@manifault.com> Cc: Dmitriy Vyukov <dvyukov@google.com> Cc: Dr. David Alan Gilbert <linux@treblig.org> Cc: Gautham Shenoy <gautham.shenoy@amd.com> Cc: Graham Woodward <graham.woodward@arm.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Juri Lelli <juri.lelli@redhat.com> Cc: K Prateek Nayak <kprateek.nayak@amd.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Leo Yan <leo.yan@arm.com> Cc: Madadi Vineeth Reddy <vineethr@linux.ibm.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Sandipan Das <sandipan.das@amd.com> Cc: Santosh Shukla <santosh.shukla@amd.com> Cc: Shrikanth Hegde <sshegde@linux.ibm.com> Cc: Steven Rostedt (VMware) <rostedt@goodmis.org> Cc: Tejun Heo <tj@kernel.org> Cc: Thomas Falcon <thomas.falcon@intel.com> Cc: Tim Chen <tim.c.chen@linux.intel.com> Cc: Vincent Guittot <vincent.guittot@linaro.org> Cc: Yang Jihong <yangjihong@bytedance.com> Cc: Yujie Liu <yujie.liu@intel.com> Cc: Zhongqiu Han <quic_zhonhan@quicinc.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
126 lines
3.0 KiB
C
126 lines
3.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __PERF_UTIL_H
|
|
#define __PERF_UTIL_H
|
|
|
|
#define _BSD_SOURCE 1
|
|
/* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */
|
|
#define _DEFAULT_SOURCE 1
|
|
|
|
#include <dirent.h>
|
|
#include <fcntl.h>
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/bitmap.h>
|
|
#include <sys/types.h>
|
|
#ifndef __cplusplus
|
|
#include <internal/cpumap.h>
|
|
#endif
|
|
|
|
extern const char perf_usage_string[];
|
|
extern const char perf_more_info_string[];
|
|
|
|
extern const char *input_name;
|
|
|
|
/* This will control if perf_{host,guest} will set attr.exclude_{host,guest}. */
|
|
extern bool exclude_GH_default;
|
|
|
|
extern bool perf_host;
|
|
extern bool perf_guest;
|
|
|
|
/* General helper functions */
|
|
void usage(const char *err) __noreturn;
|
|
void die(const char *err, ...) __noreturn __printf(1, 2);
|
|
|
|
struct dirent;
|
|
struct strlist;
|
|
|
|
int mkdir_p(char *path, mode_t mode);
|
|
int rm_rf(const char *path);
|
|
int rm_rf_perf_data(const char *path);
|
|
struct strlist *lsdir(const char *name, bool (*filter)(const char *, struct dirent *));
|
|
bool lsdir_no_dot_filter(const char *name, struct dirent *d);
|
|
|
|
size_t hex_width(u64 v);
|
|
|
|
int sysctl__max_stack(void);
|
|
|
|
bool sysctl__nmi_watchdog_enabled(void);
|
|
|
|
int perf_tip(char **strp, const char *dirpath);
|
|
|
|
void cpumask_to_cpulist(char *cpumask, char *cpulist);
|
|
|
|
void print_separator2(int pre_dash_cnt, const char *s, int post_dash_cnt);
|
|
|
|
#ifndef HAVE_SCHED_GETCPU_SUPPORT
|
|
int sched_getcpu(void);
|
|
#endif
|
|
|
|
#ifndef HAVE_SCANDIRAT_SUPPORT
|
|
int scandirat(int dirfd, const char *dirp,
|
|
struct dirent ***namelist,
|
|
int (*filter)(const struct dirent *),
|
|
int (*compar)(const struct dirent **, const struct dirent **));
|
|
#endif
|
|
|
|
extern bool perf_singlethreaded;
|
|
|
|
void perf_set_singlethreaded(void);
|
|
void perf_set_multithreaded(void);
|
|
|
|
char *perf_exe(char *buf, int len);
|
|
|
|
#ifndef O_CLOEXEC
|
|
#ifdef __sparc__
|
|
#define O_CLOEXEC 0x400000
|
|
#elif defined(__alpha__) || defined(__hppa__)
|
|
#define O_CLOEXEC 010000000
|
|
#else
|
|
#define O_CLOEXEC 02000000
|
|
#endif
|
|
#endif
|
|
|
|
struct perf_debuginfod {
|
|
const char *urls;
|
|
bool set;
|
|
};
|
|
void perf_debuginfod_setup(struct perf_debuginfod *di);
|
|
|
|
char *filename_with_chroot(int pid, const char *filename);
|
|
|
|
int do_realloc_array_as_needed(void **arr, size_t *arr_sz, size_t x,
|
|
size_t msz, const void *init_val);
|
|
|
|
#define realloc_array_as_needed(a, n, x, v) ({ \
|
|
typeof(x) __x = (x); \
|
|
__x >= (n) ? \
|
|
do_realloc_array_as_needed((void **)&(a), \
|
|
&(n), \
|
|
__x, \
|
|
sizeof(*(a)), \
|
|
(const void *)(v)) : \
|
|
0; \
|
|
})
|
|
|
|
static inline bool host_is_bigendian(void)
|
|
{
|
|
#ifdef __BYTE_ORDER__
|
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
return false;
|
|
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
return true;
|
|
#else
|
|
#error "Unrecognized __BYTE_ORDER__"
|
|
#endif
|
|
#else /* !__BYTE_ORDER__ */
|
|
unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};
|
|
unsigned int *ptr;
|
|
|
|
ptr = (unsigned int *)(void *)str;
|
|
return *ptr == 0x01020304;
|
|
#endif
|
|
}
|
|
|
|
#endif /* __PERF_UTIL_H */
|