[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220225103114.144239-3-nakamura.shun@fujitsu.com>
Date: Fri, 25 Feb 2022 19:31:09 +0900
From: Shunsuke <nakamura.shun@...itsu.com>
To: peterz@...radead.org, mingo@...hat.com, acme@...nel.org,
mark.rutland@....com, alexander.shishkin@...ux.intel.com,
jolsa@...hat.com, namhyung@...nel.org
Cc: linux-kernel@...r.kernel.org, linux-perf-users@...r.kernel.org,
Shunsuke Nakamura <nakamura.shun@...itsu.com>
Subject: [RFC PATCH 2/7] libperf: Add perf_evsel__set_close_on_exec() function
From: Shunsuke Nakamura <nakamura.shun@...itsu.com>
Move evsel::open_flags to perf_evsel::open_flags and add a function to
set PERF_FLAG_FD_CLOEXEC.
Signed-off-by: Shunsuke Nakamura <nakamura.shun@...itsu.com>
---
tools/lib/perf/Documentation/libperf.txt | 1 +
tools/lib/perf/evsel.c | 15 ++++++++++++++-
tools/lib/perf/include/internal/evsel.h | 2 ++
tools/lib/perf/include/perf/evsel.h | 1 +
tools/lib/perf/libperf.map | 1 +
tools/perf/util/evsel.c | 16 +++++++++-------
tools/perf/util/evsel.h | 1 -
7 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Documentation/libperf.txt
index 32c5051c24eb..96a451cd34eb 100644
--- a/tools/lib/perf/Documentation/libperf.txt
+++ b/tools/lib/perf/Documentation/libperf.txt
@@ -149,6 +149,7 @@ SYNOPSIS
struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel);
struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel);
struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel);
+ int perf_evsel__set_close_on_exec(struct perf_evsel *evsel);
--
*API to handle maps (perf ring buffers):*
diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c
index 210ea7c06ce8..d22b1468a1ad 100644
--- a/tools/lib/perf/evsel.c
+++ b/tools/lib/perf/evsel.c
@@ -26,6 +26,7 @@ void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr,
evsel->attr = *attr;
evsel->idx = idx;
evsel->leader = evsel;
+ evsel->open_flags = 0;
}
struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr)
@@ -158,7 +159,7 @@ int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,
fd = sys_perf_event_open(&evsel->attr,
threads->map[thread].pid,
- cpu, group_fd, 0);
+ cpu, group_fd, evsel->open_flags);
if (fd < 0)
return -errno;
@@ -454,3 +455,15 @@ void perf_counts_values__scale(struct perf_counts_values *count,
if (pscaled)
*pscaled = scaled;
}
+
+int perf_evsel__set_close_on_exec(struct perf_evsel *evsel)
+{
+ int err = 0;
+
+ if (evsel)
+ evsel->open_flags |= PERF_FLAG_FD_CLOEXEC;
+ else
+ err = -1;
+
+ return err;
+}
diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index cfc9ebd7968e..37a99cf261b3 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -51,6 +51,8 @@ struct perf_evsel {
int nr_members;
bool system_wide;
int idx;
+
+ unsigned long open_flags;
};
void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr,
diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h
index 2a9516b42d15..23b0334a4c57 100644
--- a/tools/lib/perf/include/perf/evsel.h
+++ b/tools/lib/perf/include/perf/evsel.h
@@ -43,5 +43,6 @@ LIBPERF_API struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel
LIBPERF_API struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel);
LIBPERF_API void perf_counts_values__scale(struct perf_counts_values *count,
bool scale, __s8 *pscaled);
+LIBPERF_API int perf_evsel__set_close_on_exec(struct perf_evsel *evsel);
#endif /* __LIBPERF_EVSEL_H */
diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map
index 93696affda2e..0f8d13f9009b 100644
--- a/tools/lib/perf/libperf.map
+++ b/tools/lib/perf/libperf.map
@@ -52,6 +52,7 @@ LIBPERF_0.0.1 {
perf_mmap__read_done;
perf_mmap__read_event;
perf_counts_values__scale;
+ perf_evsel__set_close_on_exec;
local:
*;
};
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 22d3267ce294..52c34552ee76 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -1794,9 +1794,9 @@ static int __evsel__prepare_open(struct evsel *evsel, struct perf_cpu_map *cpus,
perf_evsel__alloc_fd(&evsel->core, perf_cpu_map__nr(cpus), nthreads) < 0)
return -ENOMEM;
- evsel->open_flags = PERF_FLAG_FD_CLOEXEC;
+ evsel->core.open_flags = PERF_FLAG_FD_CLOEXEC;
if (evsel->cgrp)
- evsel->open_flags |= PERF_FLAG_PID_CGROUP;
+ evsel->core.open_flags |= PERF_FLAG_PID_CGROUP;
return 0;
}
@@ -1814,7 +1814,7 @@ static void evsel__disable_missing_features(struct evsel *evsel)
evsel->core.attr.clockid = 0;
}
if (perf_missing_features.cloexec)
- evsel->open_flags &= ~(unsigned long)PERF_FLAG_FD_CLOEXEC;
+ evsel->core.open_flags &= ~(unsigned long)PERF_FLAG_FD_CLOEXEC;
if (perf_missing_features.mmap2)
evsel->core.attr.mmap2 = 0;
if (evsel->pmu && evsel->pmu->missing_features.exclude_guest)
@@ -1902,7 +1902,8 @@ bool evsel__detect_missing_features(struct evsel *evsel)
perf_missing_features.clockid = true;
pr_debug2_peo("switching off use_clockid\n");
return true;
- } else if (!perf_missing_features.cloexec && (evsel->open_flags & PERF_FLAG_FD_CLOEXEC)) {
+ } else if (!perf_missing_features.cloexec &&
+ (evsel->core.open_flags & PERF_FLAG_FD_CLOEXEC)) {
perf_missing_features.cloexec = true;
pr_debug2_peo("switching off cloexec flag\n");
return true;
@@ -2029,11 +2030,12 @@ static int evsel__open_cpu(struct evsel *evsel, struct perf_cpu_map *cpus,
test_attr__ready();
pr_debug2_peo("sys_perf_event_open: pid %d cpu %d group_fd %d flags %#lx",
- pid, perf_cpu_map__cpu(cpus, idx).cpu, group_fd, evsel->open_flags);
+ pid, perf_cpu_map__cpu(cpus, idx).cpu, group_fd,
+ evsel->core.open_flags);
fd = sys_perf_event_open(&evsel->core.attr, pid,
perf_cpu_map__cpu(cpus, idx).cpu,
- group_fd, evsel->open_flags);
+ group_fd, evsel->core.open_flags);
FD(evsel, idx, thread) = fd;
@@ -2050,7 +2052,7 @@ static int evsel__open_cpu(struct evsel *evsel, struct perf_cpu_map *cpus,
if (unlikely(test_attr__enabled)) {
test_attr__open(&evsel->core.attr, pid,
perf_cpu_map__cpu(cpus, idx),
- fd, group_fd, evsel->open_flags);
+ fd, group_fd, evsel->core.open_flags);
}
pr_debug2_peo(" = %d\n", fd);
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 041b42d33bf5..8a545954eec7 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -152,7 +152,6 @@ struct evsel {
struct bperf_leader_bpf *leader_skel;
struct bperf_follower_bpf *follower_skel;
};
- unsigned long open_flags;
int precise_ip_original;
/* for missing_features */
--
2.31.1
Powered by blists - more mailing lists