]> git.baikalelectronics.ru Git - kernel.git/commit
bpf: one perf event close won't free bpf program attached by another perf event
authorYonghong Song <yhs@fb.com>
Mon, 18 Sep 2017 23:38:36 +0000 (16:38 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 20 Sep 2017 21:10:29 +0000 (14:10 -0700)
commit34d784b6c2639cff19f60618daf88c25a21887e9
tree6c44d1a7f5fd0fa102dac35a26586a7c4b22c8dd
parentd278d744fa260b2dd1109f6f18b0fb875e00a5f3
bpf: one perf event close won't free bpf program attached by another perf event

This patch fixes a bug exhibited by the following scenario:
  1. fd1 = perf_event_open with attr.config = ID1
  2. attach bpf program prog1 to fd1
  3. fd2 = perf_event_open with attr.config = ID1
     <this will be successful>
  4. user program closes fd2 and prog1 is detached from the tracepoint.
  5. user program with fd1 does not work properly as tracepoint
     no output any more.

The issue happens at step 4. Multiple perf_event_open can be called
successfully, but only one bpf prog pointer in the tp_event. In the
current logic, any fd release for the same tp_event will free
the tp_event->prog.

The fix is to free tp_event->prog only when the closing fd
corresponds to the one which registered the program.

Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/trace_events.h
kernel/events/core.c