Re: [RFC PATCH] bpf: Remove in_atomic() from bpf_link_put().

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, May 9, 2023 at 6:24 AM Sebastian Andrzej Siewior
<bigeasy@xxxxxxxxxxxxx> wrote:
>
> bpf_free_inode() is invoked as a RCU callback. Usually RCU callbacks are
> invoked within softirq context. By setting rcutree.use_softirq=0 boot
> option the RCU callbacks will be invoked in a per-CPU kthread with
> bottom halves disabled which implies a RCU read section.
>
> On PREEMPT_RT the context remains fully preemptible. The RCU read
> section however does not allow schedule() invocation. The latter happens
> in mutex_lock() performed by bpf_trampoline_unlink_prog() originated
> from bpf_link_put().
>
> Remove the context checks and use the workqueue unconditionally.
>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
> ---

Please see [0] and corresponding revert commit. We do want
bpf_link_free() to happen synchronously if it's caused by close()
syscall.

f00f2f7fe860 ("Revert "bpf: Fix potential call bpf_link_free() in
atomic context"")

  [0] https://lore.kernel.org/bpf/CAEf4BzZ9zwA=SrLTx9JT50OeM6fVPg0Py0Gx+K9ah2we8YtCRA@xxxxxxxxxxxxxx/

> The warning can be observed as:
> | BUG: sleeping function called from invalid context at kernel/locking/rtmutex_api.c:510
> | in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 47, name: rcuc/3
> | preempt_count: 0, expected: 0
> | RCU nest depth: 2, expected: 0
> | CPU: 3 PID: 47 Comm: rcuc/3 Tainted: G            E      v6.3-rt12 #1
> | Hardware name: Supermicro X9SCL/X9SCM/X9SCL/X9SCM, BIOS 2.3a 01/06/2021
> | Call Trace:
> |  <TASK>
> |  dump_stack_lvl+0x43/0x60
> |  __might_resched+0x137/0x190
> |  mutex_lock+0x1a/0x50
> |  bpf_trampoline_unlink_prog+0x1b/0x100
> |  bpf_tracing_link_release+0x12/0x40
> |  bpf_link_free+0x70/0x90
> |  bpf_free_inode+0x3e/0x80
> |  rcu_core+0x4ff/0x7c0
> |  rcu_cpu_kthread+0xa9/0x2f0
> |  smpboot_thread_fn+0x141/0x2c0
> |  kthread+0x110/0x130
> |  ret_from_fork+0x2c/0x50
> |  </TASK>
>
>  kernel/bpf/syscall.c | 8 ++------
>  1 file changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> index 14f39c1e573ee..0adaa1bfbb0d2 100644
> --- a/kernel/bpf/syscall.c
> +++ b/kernel/bpf/syscall.c
> @@ -2785,12 +2785,8 @@ void bpf_link_put(struct bpf_link *link)
>         if (!atomic64_dec_and_test(&link->refcnt))
>                 return;
>
> -       if (in_atomic()) {
> -               INIT_WORK(&link->work, bpf_link_put_deferred);
> -               schedule_work(&link->work);
> -       } else {
> -               bpf_link_free(link);
> -       }
> +       INIT_WORK(&link->work, bpf_link_put_deferred);
> +       schedule_work(&link->work);
>  }
>  EXPORT_SYMBOL(bpf_link_put);
>
> --
> 2.40.1
>
>





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux