Re: [PATCH ovpn net v6 5/6] ovpn: run deferred work on a module-owned workqueue
Ralf Lici <[email protected]>
| Newsgroups | gmane.network.openvpn.devel |
|---|---|
| Message-ID | <[email protected]> |
From: [email protected] On Fri, 07 Aug 2026 08:36:20 +0200, Antonio Quartulli <[email protected]> wrote: > Hi Ralf, > > On 29/07/2026 12:21, Ralf Lici wrote: > > ovpn queues several work items whose callbacks execute module text. > > These works currently run on the global system workqueues, so module > > exit has no driver-owned drain point that guarantees the callbacks have > > fully returned before the module text can be freed. > > > > Object references protect the objects used by the callbacks, but they do > > not prove that a workqueue function has returned. In particular, a > > worker can drop the final reference that unblocks device teardown while > > it is still executing ovpn code. > > > > Add a module-owned workqueue and queue all ovpn work items on it. During > > module exit, unregister rtnl and netlink first, flush the workqueue so > > ordinary ovpn workers finish, run the final RCU barrier, and destroy the > > workqueue last. This keeps the workqueue available for cleanup work > > queued from RCU callbacks, while ensuring no ovpn work item can outlive > > the module text. > > > > The per-device delayed keepalive work remains explicitly disabled during > > netdev teardown (disable_delayed_work_sync in ndo_uninit), since > > flush_workqueue does not flush delayed work that is still only pending > > on its timer. > > > > Fixes: 3ecfd9349f40 ("ovpn: implement keepalive mechanism") > > Fixes: 11851cbd60ea ("ovpn: implement TCP transport") > > Signed-off-by: Ralf Lici <[email protected]> > > --- > > Changes since v5 https://lore.kernel.org/openvpn-devel/d530ecfc3719845075fbddd0cd7c34752bc2ce16.1783336121.git.ralf@mandelbit.com/ > > - Update the module-exit ordering for the queue_rcu_work-based key-slot > > release: flush ordinary ovpn work before rcu_barrier, then destroy the > > workqueue after RCU callbacks have queued their cleanup work. > > > > Changes since v4 https://lore.kernel.org/openvpn-devel/6edfcc51e0855bfd34286b86d4e7f26bb3bcd3f7.1783099626.git.ralf@mandelbit.com/ > > - Rebase on the pending keepalive and TCP deferred-work refcount fixes, > > preserving their hold-before-queue and queue-failure put handling when > > converting schedule_work to queue_work. > > > > Changes since v3 https://lore.kernel.org/openvpn-devel/49f38f89340e18ed30543d3990a7a7e20595b6af.1783080055.git.ralf@mandelbit.com/ > > - Replace the RCU-deferred peer netdev reference release with a > > module-owned workqueue that drains all ovpn work callbacks before > > module text can be freed. > > > > drivers/net/ovpn/main.c | 19 ++++++++++++++++++- > > drivers/net/ovpn/ovpnpriv.h | 4 ++++ > > drivers/net/ovpn/peer.c | 8 ++++---- > > drivers/net/ovpn/tcp.c | 9 ++++----- > > 4 files changed, 30 insertions(+), 10 deletions(-) > > > > diff --git a/drivers/net/ovpn/main.c b/drivers/net/ovpn/main.c > > index 5093a3b5aba6..80d10f9ef7d8 100644 > > --- a/drivers/net/ovpn/main.c > > +++ b/drivers/net/ovpn/main.c > > @@ -12,6 +12,7 @@ > > #include <linux/module.h> > > #include <linux/netdevice.h> > > #include <linux/inetdevice.h> > > +#include <linux/workqueue.h> > > #include <net/gro_cells.h> > > #include <net/ip.h> > > #include <net/rtnetlink.h> > > @@ -26,6 +27,9 @@ > > #include "tcp.h" > > #include "udp.h" > > > > +/* module-owned workqueue on which all ovpn-specific work is queued */ > > +struct workqueue_struct *ovpn_wq; > > + > > static void ovpn_priv_free(struct net_device *net) > > { > > struct ovpn_priv *ovpn = netdev_priv(net); > > @@ -237,10 +241,16 @@ static int __init ovpn_init(void) > > > > ovpn_tcp_init(); > > > > + ovpn_wq = alloc_workqueue("ovpn", 0, 0); > > This is triggering: > > > workqueue: ovpn is using neither WQ_PERCPU or WQ_UNBOUND. Setting WQ_PERCPU. > WARNING: kernel/workqueue.c:5852 at __alloc_workqueue+0x1cf5/0x2060, > CPU#0: swapper/0/1 > > > Can you fix it and resend this patch only please? > Sure. Apparently the development tree used for this series predated commit 21c05ca88a54 ("workqueue: Add warnings and ensure one among WQ_PERCPU or WQ_UNBOUND is present"), which now warns when the selection is implicit. I'll resend this patch, explicitly selecting WQ_PERCPU to preserve the existing workqueue behavior. > > Regards, > Regards, -- Ralf Lici Mandelbit Srl