diff options
| author | Dave Airlie <airlied@redhat.com> | 2024-12-19 11:59:43 +1000 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2024-12-19 12:00:02 +1000 |
| commit | 38e961097e04e7adfe1d3335e3371e97c1723064 (patch) | |
| tree | 40ffe2d6d45d668ed42fa28c270760f8967fcfba /kernel/trace/bpf_trace.c | |
| parent | 301e2772295e8de0cf8acdd9ddb1824b546375a5 (diff) | |
| parent | 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8 (diff) | |
Merge tag 'v6.13-rc3' into drm-next
Backmerge linux 6.13-rc3 as amd next has some dependencies on fixes in it.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'kernel/trace/bpf_trace.c')
| -rw-r--r-- | kernel/trace/bpf_trace.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 949a3870946c..1b8db5aee9d3 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -2250,6 +2250,9 @@ void perf_event_detach_bpf_prog(struct perf_event *event) goto unlock; old_array = bpf_event_rcu_dereference(event->tp_event->prog_array); + if (!old_array) + goto put; + ret = bpf_prog_array_copy(old_array, event->prog, NULL, 0, &new_array); if (ret < 0) { bpf_prog_array_delete_safe(old_array, event->prog); @@ -2258,6 +2261,14 @@ void perf_event_detach_bpf_prog(struct perf_event *event) bpf_prog_array_free_sleepable(old_array); } +put: + /* + * It could be that the bpf_prog is not sleepable (and will be freed + * via normal RCU), but is called from a point that supports sleepable + * programs and uses tasks-trace-RCU. + */ + synchronize_rcu_tasks_trace(); + bpf_prog_put(event->prog); event->prog = NULL; |
