944138f048
Recently bperf was added to use BPF to count perf events for various purposes. This is an extension for the approach and targetting to cgroup usages. Unlike the other bperf, it doesn't share the events with other processes but it'd reduce unnecessary events (and the overhead of multiplexing) for each monitored cgroup within the perf session. When --for-each-cgroup is used with --bpf-counters, it will open cgroup-switches event per cpu internally and attach the new BPF program to read given perf_events and to aggregate the results for cgroups. It's only called when task is switched to a task in a different cgroup. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Song Liu <songliubraving@fb.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lore.kernel.org/lkml/20210701211227.1403788-1-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
55 lines
1.3 KiB
C
55 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __CGROUP_H__
|
|
#define __CGROUP_H__
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/refcount.h>
|
|
#include <linux/rbtree.h>
|
|
#include "util/env.h"
|
|
|
|
struct option;
|
|
|
|
struct cgroup {
|
|
struct rb_node node;
|
|
u64 id;
|
|
char *name;
|
|
int fd;
|
|
refcount_t refcnt;
|
|
};
|
|
|
|
extern int nr_cgroups; /* number of explicit cgroups defined */
|
|
extern bool cgrp_event_expanded;
|
|
|
|
struct cgroup *cgroup__get(struct cgroup *cgroup);
|
|
void cgroup__put(struct cgroup *cgroup);
|
|
|
|
struct evlist;
|
|
struct rblist;
|
|
|
|
struct cgroup *evlist__findnew_cgroup(struct evlist *evlist, const char *name);
|
|
int evlist__expand_cgroup(struct evlist *evlist, const char *cgroups,
|
|
struct rblist *metric_events, bool open_cgroup);
|
|
|
|
void evlist__set_default_cgroup(struct evlist *evlist, struct cgroup *cgroup);
|
|
|
|
int parse_cgroups(const struct option *opt, const char *str, int unset);
|
|
|
|
struct cgroup *cgroup__findnew(struct perf_env *env, uint64_t id,
|
|
const char *path);
|
|
struct cgroup *cgroup__find(struct perf_env *env, uint64_t id);
|
|
|
|
void perf_env__purge_cgroups(struct perf_env *env);
|
|
|
|
#ifdef HAVE_FILE_HANDLE
|
|
int read_cgroup_id(struct cgroup *cgrp);
|
|
#else
|
|
static inline int read_cgroup_id(struct cgroup *cgrp __maybe_unused)
|
|
{
|
|
return -1;
|
|
}
|
|
#endif /* HAVE_FILE_HANDLE */
|
|
|
|
int cgroup_is_v2(const char *subsys);
|
|
|
|
#endif /* __CGROUP_H__ */
|