Commit b8fccc5f authored by yonghong-song's avatar yonghong-song Committed by GitHub

Merge pull request #1765 from palmtenor/extraflag

Add extra_flag option to bpf_attach_perf_event_raw
parents 683c19a8 bf2513df
...@@ -324,7 +324,8 @@ StatusTuple BPF::attach_perf_event(uint32_t ev_type, uint32_t ev_config, ...@@ -324,7 +324,8 @@ StatusTuple BPF::attach_perf_event(uint32_t ev_type, uint32_t ev_config,
StatusTuple BPF::attach_perf_event_raw(void* perf_event_attr, StatusTuple BPF::attach_perf_event_raw(void* perf_event_attr,
const std::string& probe_func, pid_t pid, const std::string& probe_func, pid_t pid,
int cpu, int group_fd) { int cpu, int group_fd,
unsigned long extra_flags) {
auto attr = static_cast<struct perf_event_attr*>(perf_event_attr); auto attr = static_cast<struct perf_event_attr*>(perf_event_attr);
auto ev_pair = std::make_pair(attr->type, attr->config); auto ev_pair = std::make_pair(attr->type, attr->config);
if (perf_events_.find(ev_pair) != perf_events_.end()) if (perf_events_.find(ev_pair) != perf_events_.end())
...@@ -342,7 +343,8 @@ StatusTuple BPF::attach_perf_event_raw(void* perf_event_attr, ...@@ -342,7 +343,8 @@ StatusTuple BPF::attach_perf_event_raw(void* perf_event_attr,
auto fds = new std::vector<std::pair<int, int>>(); auto fds = new std::vector<std::pair<int, int>>();
fds->reserve(cpus.size()); fds->reserve(cpus.size());
for (int i : cpus) { for (int i : cpus) {
int fd = bpf_attach_perf_event_raw(probe_fd, attr, pid, i, group_fd); int fd = bpf_attach_perf_event_raw(probe_fd, attr, pid, i, group_fd,
extra_flags);
if (fd < 0) { if (fd < 0) {
for (const auto& it : *fds) for (const auto& it : *fds)
close(it.second); close(it.second);
......
...@@ -88,7 +88,8 @@ class BPF { ...@@ -88,7 +88,8 @@ class BPF {
StatusTuple attach_perf_event_raw(void* perf_event_attr, StatusTuple attach_perf_event_raw(void* perf_event_attr,
const std::string& probe_func, const std::string& probe_func,
pid_t pid = -1, int cpu = -1, pid_t pid = -1, int cpu = -1,
int group_fd = -1); int group_fd = -1,
unsigned long extra_flags = 0);
StatusTuple detach_perf_event(uint32_t ev_type, uint32_t ev_config); StatusTuple detach_perf_event(uint32_t ev_type, uint32_t ev_config);
StatusTuple detach_perf_event_raw(void* perf_event_attr); StatusTuple detach_perf_event_raw(void* perf_event_attr);
std::string get_syscall_fnname(const std::string& name); std::string get_syscall_fnname(const std::string& name);
......
...@@ -1305,9 +1305,9 @@ cleanup: ...@@ -1305,9 +1305,9 @@ cleanup:
} }
int bpf_attach_perf_event_raw(int progfd, void *perf_event_attr, pid_t pid, int bpf_attach_perf_event_raw(int progfd, void *perf_event_attr, pid_t pid,
int cpu, int group_fd) { int cpu, int group_fd, unsigned long extra_flags) {
int fd = syscall(__NR_perf_event_open, perf_event_attr, pid, cpu, group_fd, int fd = syscall(__NR_perf_event_open, perf_event_attr, pid, cpu, group_fd,
PERF_FLAG_FD_CLOEXEC); PERF_FLAG_FD_CLOEXEC | extra_flags);
if (fd < 0) { if (fd < 0) {
perror("perf_event_open failed"); perror("perf_event_open failed");
return -1; return -1;
...@@ -1351,7 +1351,7 @@ int bpf_attach_perf_event(int progfd, uint32_t ev_type, uint32_t ev_config, ...@@ -1351,7 +1351,7 @@ int bpf_attach_perf_event(int progfd, uint32_t ev_type, uint32_t ev_config,
attr.sample_period = sample_period; attr.sample_period = sample_period;
} }
return bpf_attach_perf_event_raw(progfd, &attr, pid, cpu, group_fd); return bpf_attach_perf_event_raw(progfd, &attr, pid, cpu, group_fd, 0);
} }
int bpf_close_perf_event_fd(int fd) { int bpf_close_perf_event_fd(int fd) {
......
...@@ -93,7 +93,7 @@ int bpf_attach_xdp(const char *dev_name, int progfd, uint32_t flags); ...@@ -93,7 +93,7 @@ int bpf_attach_xdp(const char *dev_name, int progfd, uint32_t flags);
// attach a prog expressed by progfd to run on a specific perf event. The perf // attach a prog expressed by progfd to run on a specific perf event. The perf
// event will be created using the perf_event_attr pointer provided. // event will be created using the perf_event_attr pointer provided.
int bpf_attach_perf_event_raw(int progfd, void *perf_event_attr, pid_t pid, int bpf_attach_perf_event_raw(int progfd, void *perf_event_attr, pid_t pid,
int cpu, int group_fd); int cpu, int group_fd, unsigned long extra_flags);
// attach a prog expressed by progfd to run on a specific perf event, with // attach a prog expressed by progfd to run on a specific perf event, with
// certain sample period or sample frequency // certain sample period or sample frequency
int bpf_attach_perf_event(int progfd, uint32_t ev_type, uint32_t ev_config, int bpf_attach_perf_event(int progfd, uint32_t ev_type, uint32_t ev_config,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment