perf trace: See if there is a map named "filtered_pids"
Lookup for the first map named "filtered_pids" and, if augmenting syscalls, i.e. if a BPF event is present and the "__augmented_syscalls__" is present, then fill in that map with the pids to filter, be it feedback loop ones (perf trace's pid, its father if it is "sshd", more auto-filtered in the future) or the ones explicitely stated in the tool command line via --filter-pids. The code to actually fill in the map comes next. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: https://lkml.kernel.org/n/tip-rhzytmw7qpe6lqyjxi1ded9t@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
6a0b3abad9
commit
744fafc787
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include <traceevent/event-parse.h>
|
#include <traceevent/event-parse.h>
|
||||||
#include <api/fs/tracing_path.h>
|
#include <api/fs/tracing_path.h>
|
||||||
|
#include <bpf/bpf.h>
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "util/cgroup.h"
|
#include "util/cgroup.h"
|
||||||
#include "util/color.h"
|
#include "util/color.h"
|
||||||
|
@ -99,6 +100,7 @@ struct trace {
|
||||||
struct {
|
struct {
|
||||||
size_t nr;
|
size_t nr;
|
||||||
pid_t *entries;
|
pid_t *entries;
|
||||||
|
struct bpf_map *map;
|
||||||
} filter_pids;
|
} filter_pids;
|
||||||
double duration_filter;
|
double duration_filter;
|
||||||
double runtime_ms;
|
double runtime_ms;
|
||||||
|
@ -3315,6 +3317,25 @@ static int trace__parse_cgroups(const struct option *opt, const char *str, int u
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct bpf_map *bpf__find_map_by_name(const char *name)
|
||||||
|
{
|
||||||
|
struct bpf_object *obj, *tmp;
|
||||||
|
|
||||||
|
bpf_object__for_each_safe(obj, tmp) {
|
||||||
|
struct bpf_map *map = bpf_object__find_map_by_name(obj, name);
|
||||||
|
if (map)
|
||||||
|
return map;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void trace__set_bpf_map_filtered_pids(struct trace *trace)
|
||||||
|
{
|
||||||
|
trace->filter_pids.map = bpf__find_map_by_name("pids_filtered");
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_trace(int argc, const char **argv)
|
int cmd_trace(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
const char *trace_usage[] = {
|
const char *trace_usage[] = {
|
||||||
|
@ -3451,8 +3472,10 @@ int cmd_trace(int argc, const char **argv)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (evsel)
|
if (evsel) {
|
||||||
trace.syscalls.events.augmented = evsel;
|
trace.syscalls.events.augmented = evsel;
|
||||||
|
trace__set_bpf_map_filtered_pids(&trace);
|
||||||
|
}
|
||||||
|
|
||||||
err = bpf__setup_stdout(trace.evlist);
|
err = bpf__setup_stdout(trace.evlist);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|
Loading…
Reference in New Issue