multiple concurrent tracepoint
- 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.