Skip to content

Commit

Permalink
bpf: Move out synchronize_rcu_tasks_trace from mutex CS
Browse files Browse the repository at this point in the history
Commit ef1b808 ("bpf: Fix UAF via mismatching bpf_prog/attachment
RCU flavors") resolved a possible UAF issue in uprobes that attach
non-sleepable bpf prog by explicitly waiting for a tasks-trace-RCU grace
period. But, in the current implementation, synchronize_rcu_tasks_trace
is included within the mutex critical section, which increases the
length of the critical section and may affect performance. So let's move
out synchronize_rcu_tasks_trace from mutex CS.

Signed-off-by: Pu Lehui <[email protected]>
Reviewed-by: Jiri Olsa <[email protected]>
  • Loading branch information
Pu Lehui authored and Kernel Patches Daemon committed Jan 8, 2025
1 parent 28f14d5 commit c49b839
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions kernel/trace/bpf_trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -2245,6 +2245,7 @@ void perf_event_detach_bpf_prog(struct perf_event *event)
{
struct bpf_prog_array *old_array;
struct bpf_prog_array *new_array;
struct bpf_prog *prog = NULL;
int ret;

mutex_lock(&bpf_event_mutex);
Expand All @@ -2265,18 +2266,22 @@ void perf_event_detach_bpf_prog(struct perf_event *event)
}

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);
prog = event->prog;
event->prog = NULL;

unlock:
mutex_unlock(&bpf_event_mutex);

if (prog) {
/*
* 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(prog);
}
}

int perf_event_query_prog_array(struct perf_event *event, void __user *info)
Expand Down

0 comments on commit c49b839

Please sign in to comment.