Re: [PATCH tip] perf/events/core: fix race in bpf program unregister

2015-05-20 Thread Peter Zijlstra
On Tue, May 19, 2015 at 10:27:05PM -0700, Alexei Starovoitov wrote:
> On 5/15/15 12:15 PM, Alexei Starovoitov wrote:
> >there is a race between perf_event_free_bpf_prog() and free_trace_kprobe():
> >
> >__free_event()
> >   event->destroy(event)
> > tp_perf_event_destroy()
> >   perf_trace_destroy()
> > perf_trace_event_unreg()
> >
> >which is dropping event->tp_event->perf_refcount and allows to proceed in:
> >
> >unregister_trace_kprobe()
> >   unregister_kprobe_event()
> >   trace_remove_event_call()
> > probe_remove_event_call()
> >free_trace_kprobe()
> >
> >while __free_event does:
> >call_rcu(>rcu_head, free_event_rcu);
> >   free_event_rcu()
> > perf_event_free_bpf_prog()
> >
> >To fix the race simply move perf_event_free_bpf_prog() before
> >event->destroy(), since event->tp_event is still valid at that point.
> >
> >Note, perf_trace_destroy() is not racing with trace_remove_event_call()
> >since they both grab event_mutex.
> >
> >Fixes: 2541517c32be ("tracing, perf: Implement BPF programs attached to 
> >kprobes")
> >Reported-by: Wang Nan 
> >Signed-off-by: Alexei Starovoitov 
> 
> ping.
> This is needed in 4.1.

Thanks, queued for perf/urgent.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH tip] perf/events/core: fix race in bpf program unregister

2015-05-20 Thread Peter Zijlstra
On Tue, May 19, 2015 at 10:27:05PM -0700, Alexei Starovoitov wrote:
 On 5/15/15 12:15 PM, Alexei Starovoitov wrote:
 there is a race between perf_event_free_bpf_prog() and free_trace_kprobe():
 
 __free_event()
event-destroy(event)
  tp_perf_event_destroy()
perf_trace_destroy()
  perf_trace_event_unreg()
 
 which is dropping event-tp_event-perf_refcount and allows to proceed in:
 
 unregister_trace_kprobe()
unregister_kprobe_event()
trace_remove_event_call()
  probe_remove_event_call()
 free_trace_kprobe()
 
 while __free_event does:
 call_rcu(event-rcu_head, free_event_rcu);
free_event_rcu()
  perf_event_free_bpf_prog()
 
 To fix the race simply move perf_event_free_bpf_prog() before
 event-destroy(), since event-tp_event is still valid at that point.
 
 Note, perf_trace_destroy() is not racing with trace_remove_event_call()
 since they both grab event_mutex.
 
 Fixes: 2541517c32be (tracing, perf: Implement BPF programs attached to 
 kprobes)
 Reported-by: Wang Nan wangn...@huawei.com
 Signed-off-by: Alexei Starovoitov a...@plumgrid.com
 
 ping.
 This is needed in 4.1.

Thanks, queued for perf/urgent.
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH tip] perf/events/core: fix race in bpf program unregister

2015-05-19 Thread Alexei Starovoitov

On 5/15/15 12:15 PM, Alexei Starovoitov wrote:

there is a race between perf_event_free_bpf_prog() and free_trace_kprobe():

__free_event()
   event->destroy(event)
 tp_perf_event_destroy()
   perf_trace_destroy()
 perf_trace_event_unreg()

which is dropping event->tp_event->perf_refcount and allows to proceed in:

unregister_trace_kprobe()
   unregister_kprobe_event()
   trace_remove_event_call()
 probe_remove_event_call()
free_trace_kprobe()

while __free_event does:
call_rcu(>rcu_head, free_event_rcu);
   free_event_rcu()
 perf_event_free_bpf_prog()

To fix the race simply move perf_event_free_bpf_prog() before
event->destroy(), since event->tp_event is still valid at that point.

Note, perf_trace_destroy() is not racing with trace_remove_event_call()
since they both grab event_mutex.

Fixes: 2541517c32be ("tracing, perf: Implement BPF programs attached to 
kprobes")
Reported-by: Wang Nan 
Signed-off-by: Alexei Starovoitov 


ping.
This is needed in 4.1.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH tip] perf/events/core: fix race in bpf program unregister

2015-05-19 Thread Alexei Starovoitov

On 5/15/15 12:15 PM, Alexei Starovoitov wrote:

there is a race between perf_event_free_bpf_prog() and free_trace_kprobe():

__free_event()
   event-destroy(event)
 tp_perf_event_destroy()
   perf_trace_destroy()
 perf_trace_event_unreg()

which is dropping event-tp_event-perf_refcount and allows to proceed in:

unregister_trace_kprobe()
   unregister_kprobe_event()
   trace_remove_event_call()
 probe_remove_event_call()
free_trace_kprobe()

while __free_event does:
call_rcu(event-rcu_head, free_event_rcu);
   free_event_rcu()
 perf_event_free_bpf_prog()

To fix the race simply move perf_event_free_bpf_prog() before
event-destroy(), since event-tp_event is still valid at that point.

Note, perf_trace_destroy() is not racing with trace_remove_event_call()
since they both grab event_mutex.

Fixes: 2541517c32be (tracing, perf: Implement BPF programs attached to 
kprobes)
Reported-by: Wang Nan wangn...@huawei.com
Signed-off-by: Alexei Starovoitov a...@plumgrid.com


ping.
This is needed in 4.1.

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH tip] perf/events/core: fix race in bpf program unregister

2015-05-15 Thread Alexei Starovoitov
there is a race between perf_event_free_bpf_prog() and free_trace_kprobe():

__free_event()
  event->destroy(event)
tp_perf_event_destroy()
  perf_trace_destroy()
perf_trace_event_unreg()

which is dropping event->tp_event->perf_refcount and allows to proceed in:

unregister_trace_kprobe()
  unregister_kprobe_event()
  trace_remove_event_call()
probe_remove_event_call()
free_trace_kprobe()

while __free_event does:
call_rcu(>rcu_head, free_event_rcu);
  free_event_rcu()
perf_event_free_bpf_prog()

To fix the race simply move perf_event_free_bpf_prog() before
event->destroy(), since event->tp_event is still valid at that point.

Note, perf_trace_destroy() is not racing with trace_remove_event_call()
since they both grab event_mutex.

Fixes: 2541517c32be ("tracing, perf: Implement BPF programs attached to 
kprobes")
Reported-by: Wang Nan 
Signed-off-by: Alexei Starovoitov 
---
Wang, please test the fix to double check.

 kernel/events/core.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 84231a146dd5..b27bdc8b3558 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3415,7 +3415,6 @@ static void free_event_rcu(struct rcu_head *head)
if (event->ns)
put_pid_ns(event->ns);
perf_event_free_filter(event);
-   perf_event_free_bpf_prog(event);
kfree(event);
 }
 
@@ -3546,6 +3545,8 @@ static void __free_event(struct perf_event *event)
put_callchain_buffers();
}
 
+   perf_event_free_bpf_prog(event);
+
if (event->destroy)
event->destroy(event);
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH tip] perf/events/core: fix race in bpf program unregister

2015-05-15 Thread Alexei Starovoitov
there is a race between perf_event_free_bpf_prog() and free_trace_kprobe():

__free_event()
  event-destroy(event)
tp_perf_event_destroy()
  perf_trace_destroy()
perf_trace_event_unreg()

which is dropping event-tp_event-perf_refcount and allows to proceed in:

unregister_trace_kprobe()
  unregister_kprobe_event()
  trace_remove_event_call()
probe_remove_event_call()
free_trace_kprobe()

while __free_event does:
call_rcu(event-rcu_head, free_event_rcu);
  free_event_rcu()
perf_event_free_bpf_prog()

To fix the race simply move perf_event_free_bpf_prog() before
event-destroy(), since event-tp_event is still valid at that point.

Note, perf_trace_destroy() is not racing with trace_remove_event_call()
since they both grab event_mutex.

Fixes: 2541517c32be (tracing, perf: Implement BPF programs attached to 
kprobes)
Reported-by: Wang Nan wangn...@huawei.com
Signed-off-by: Alexei Starovoitov a...@plumgrid.com
---
Wang, please test the fix to double check.

 kernel/events/core.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 84231a146dd5..b27bdc8b3558 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3415,7 +3415,6 @@ static void free_event_rcu(struct rcu_head *head)
if (event-ns)
put_pid_ns(event-ns);
perf_event_free_filter(event);
-   perf_event_free_bpf_prog(event);
kfree(event);
 }
 
@@ -3546,6 +3545,8 @@ static void __free_event(struct perf_event *event)
put_callchain_buffers();
}
 
+   perf_event_free_bpf_prog(event);
+
if (event-destroy)
event-destroy(event);
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/