Re: [Openvpn-devel] [PATCH ovpn net v5 6/6] ovpn: defer key slot crypto freeing to workqueue

Ralf Lici <[email protected]> Tue, 28 Jul 2026 18:21:04 +0200
Newsgroups net.sourceforge.lists.openvpn-devel
Message-ID <[email protected]>
On Tue, 28 Jul 2026 12:44:40 +0200, Sabrina Dubroca <[email protected]> wrote:
> 2026-07-08, 17:30:49 +0200, Ralf Lici wrote:
> > On Wed, 08 Jul 2026 12:14:08 +0200, Sabrina Dubroca <[email protected]> wrote:
> > > Am I making any sense? (it's quite possible I need another 3 cups of
> > > coffee for this type of reasoning :))
> > >
> > 
> > Yes, definitely it makes sense.
> > 
> > I went through the ovpn_wq producers:
> > - ovpn->keepalive_work: disabled from ovpn_net_uninit before peers are
> >   freed;
> > - peer->keepalive_work: queued by the scanner, it holds a peer reference
> >   and can indirectly hit the TCP deferred-delete path through TX
> >   failure;
> > - peer->tcp.defer_del_work: queued from TCP RX/TX error paths, each
> >   successfully queued instance owns a peer reference and peer release
> >   drops crypto state before dropping the netdev reference;
> > - sock->tcp_tx_work: queued from TCP write_space, socket teardown
> >   cancels it;
> > - key-slot free work/rcu_work: queued from final key-slot put.
> > 
> > So after rtnl_link_unregister has returned, I don't see a peer-owned
> > producer that can create new key-slot rcu_work without first holding a
> > peer reference that would have kept unregister_netdevice waiting. Then
>
> All those objects referencing each other make it really hard to reason
> about correctness :/
>

Yeah, same. I wasn't expecting it to be such a maze either at first.

> > flush_workqueue waits for the remaining worker tails that may still be
> > executing module text. After that, rcu_barrier forces pending rcu_work
> > callbacks to queue their actual work, and destroy_workqueue drains that
> > cleanup work before module text goes away.
> > 
> > So the ordering I'd use with queue_rcu_work is:
> > 
> >     ovpn_nl_unregister();
> >     rtnl_link_unregister(&ovpn_link_ops);
> >     flush_workqueue(ovpn_wq);
> >     rcu_barrier();
> >     destroy_workqueue(ovpn_wq);
> > 
> > Makes sense?
> > 
> > Avoiding work on deleted peers is nice cleanup, but I don't think the
> > unload safety depends on it because the stronger invariant is that any
> > peer-owned work that can queue more work either already owns a peer ref
> > or takes one before queueing.
> > 
> > WDYT?
>
> All this looks correct. Thanks.
>

Perfect, then I'll respin the series with the fixes we agreed on.

Thanks!

-- 
Ralf Lici
Mandelbit Srl


_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel