iovisor / iovisor/bcc

multiple concurrent tracepoint

Open
#932 0 comments 2 reactions 0 assignees View on GitHub
Dominant language
C
Stars
22.7k
Forks
4.1k
Avg merge
10d 4h
Merged PRs (30d)
3

Description

Hi all
Now for kprobe and uprobe, current bcc support multiple concurrent probe.
I just tried event probe, it still not support. e.g.
if you run
```bash
./examples/tracing/urandomread.py
```
It will failed when you start 2nd instance.
event I have made 2 instance under /sys/kernel/debug/instance directory.

For this issue, we need some kernel change.
ioctl(PERF_EVENT_IOC_SET_BPF) will failed for 2nd instance.

In kernel, will return failed here:
```
static int perf_event_set_bpf_prog(struct perf_event *event, u32 prog_fd)
{
if (event->tp_event->prog)
return -EEXIST;
}
```

Even we make 2 instance under instances directory. compare with kprobe,
There are little differece.
for kprobe/uprobe
create_trace_kprobe -> alloc_trace_kprobe -> register_kprobe_event
will create two tp_event for each instance.

but for trace_point, such as urandom, after created 2 instance, event(pointer) are different, but it point to same tp_event object, as tp_event->prog was set by previous instance. so 2nd will return failed.

2nd event register under instances directory. it will try to use same tp_event

```c
int perf_trace_init(struct perf_event *p_event)
{
struct trace_event_call *tp_event;
u64 event_id = p_event->attr.config;
int ret = -EINVAL;

mutex_lock(&event_mutex);
list_for_each_entry(tp_event, &ftrace_events, list) {
if (tp_event->event.type == event_id &&
tp_event->class && tp_event->class->reg &&
try_module_get(tp_event->mod)) {
ret = perf_trace_event_init(tp_event, p_event);
if (ret)
module_put(tp_event->mod);
break;
}
}
mutex_unlock(&event_mutex);

return ret;
}
```

you can do a quick verify this by:
```bash
/sys/kernel/debug/tracing# cd instances/
/sys/kernel/debug/tracing/instances# mkdir 1
/sys/kernel/debug/tracing/instances# mkdir 2
/sys/kernel/debug/tracing/instances# cat 1/events/r
random/ ras/ raw_syscalls/ rcu/ regmap/ regulator/ rpm/
/sys/kernel/debug/tracing/instances# cat 1/events/random/urandom_read/id
960
/sys/kernel/debug/tracing/instances# cat 2/events/random/urandom_read/id
960
```

The ID are same here.

How about change event->tp_event->prog to a link list, and in perf_trace_run_bpf_submit
loop through the list and call each BPF?

Or using different tp_event for each event instance, as same as kprobe/uprobe in kernel?

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.