On 4/9/18 3:01 AM, Daniel Borkmann wrote:
On 04/09/2018 07:02 AM, Alexei Starovoitov wrote:
On 4/8/18 9:53 PM, Yonghong Song wrote:
@@ -1004,7 +1007,8 @@ static void __bpf_prog_put(struct bpf_prog
*prog, bool do_idr_lock)
              bpf_prog_kallsyms_del(prog->aux->func[i]);
          bpf_prog_kallsyms_del(prog);

-        call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu);
+        synchronize_rcu();
+        __bpf_prog_put_rcu(&prog->aux->rcu);

there should have been lockdep splat.
We cannot call synchronize_rcu here, since we cannot sleep
in some cases.

Let me double check this. The following is the reason
why I am using synchronize_rcu().

With call_rcu(&prog->aux->rcu, __bpf_prog_put_rcu) and
_bpf_prog_put_rcu calls put_callchain_buffers() which
calls mutex_lock(), the runtime with CONFIG_DEBUG_ATOMIC_SLEEP=y
will complains since potential sleep inside the call_rcu is not
allowed.

I see. Indeed. We cannot call put_callchain_buffers() from rcu callback,
but doing synchronize_rcu() here is also not possible.
How about moving put_callchain into bpf_prog_free_deferred() ?

+1, the assumption is that you can call bpf_prog_put() and also the
bpf_map_put() from any context. Sleeping here for a long time might
subtly break things badly.

Thanks for the suggestion! This should work.

Reply via email to