BPF List
 help / color / mirror / Atom feed
  • * [PATCH 6.8.y 1/2] bpf: put uprobe link's path and task in release callback
           [not found] <2024040527-propeller-immovably-a6d8@gregkh>
           [not found] ` <CAEf4BzaNmxj2nLyxiugcmC1v1Cs7HEX2Z0-3a=P323-TxHHTXQ@mail.gmail.com>
    @ 2024-04-05 16:29 ` Andrii Nakryiko
      2024-04-05 16:29   ` [PATCH 6.8.y 2/2] bpf: support deferring bpf_link dealloc to after RCU grace period Andrii Nakryiko
      1 sibling, 1 reply; 4+ messages in thread
    From: Andrii Nakryiko @ 2024-04-05 16:29 UTC (permalink / raw)
      To: stable; +Cc: bpf, Andrii Nakryiko, Alexei Starovoitov
    
    There is no need to delay putting either path or task to deallocation
    step. It can be done right after bpf_uprobe_unregister. Between release
    and dealloc, there could be still some running BPF programs, but they
    don't access either task or path, only data in link->uprobes, so it is
    safe to do.
    
    On the other hand, doing path_put() in dealloc callback makes this
    dealloc sleepable because path_put() itself might sleep. Which is
    problematic due to the need to call uprobe's dealloc through call_rcu(),
    which is what is done in the next bug fix patch. So solve the problem by
    releasing these resources early.
    
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/r/20240328052426.3042617-1-andrii@kernel.org
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    (cherry picked from commit e9c856cabefb71d47b2eeb197f72c9c88e9b45b0)
    ---
     kernel/trace/bpf_trace.c | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
    index 7ac6c52b25eb..45de8a4923e2 100644
    --- a/kernel/trace/bpf_trace.c
    +++ b/kernel/trace/bpf_trace.c
    @@ -3142,6 +3142,9 @@ static void bpf_uprobe_multi_link_release(struct bpf_link *link)
     
     	umulti_link = container_of(link, struct bpf_uprobe_multi_link, link);
     	bpf_uprobe_unregister(&umulti_link->path, umulti_link->uprobes, umulti_link->cnt);
    +	if (umulti_link->task)
    +		put_task_struct(umulti_link->task);
    +	path_put(&umulti_link->path);
     }
     
     static void bpf_uprobe_multi_link_dealloc(struct bpf_link *link)
    @@ -3149,9 +3152,6 @@ static void bpf_uprobe_multi_link_dealloc(struct bpf_link *link)
     	struct bpf_uprobe_multi_link *umulti_link;
     
     	umulti_link = container_of(link, struct bpf_uprobe_multi_link, link);
    -	if (umulti_link->task)
    -		put_task_struct(umulti_link->task);
    -	path_put(&umulti_link->path);
     	kvfree(umulti_link->uprobes);
     	kfree(umulti_link);
     }
    -- 
    2.43.0
    
    
    ^ permalink raw reply related	[flat|nested] 4+ messages in thread

  • end of thread, other threads:[~2024-04-05 16:31 UTC | newest]
    
    Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [not found] <2024040527-propeller-immovably-a6d8@gregkh>
         [not found] ` <CAEf4BzaNmxj2nLyxiugcmC1v1Cs7HEX2Z0-3a=P323-TxHHTXQ@mail.gmail.com>
    2024-04-05 16:21   ` FAILED: patch "[PATCH] bpf: support deferring bpf_link dealloc to after RCU grace" failed to apply to 6.8-stable tree Andrii Nakryiko
    2024-04-05 16:31     ` Greg KH
    2024-04-05 16:29 ` [PATCH 6.8.y 1/2] bpf: put uprobe link's path and task in release callback Andrii Nakryiko
    2024-04-05 16:29   ` [PATCH 6.8.y 2/2] bpf: support deferring bpf_link dealloc to after RCU grace period Andrii Nakryiko
    

    This is a public inbox, see mirroring instructions
    for how to clone and mirror all data and code used for this inbox