Re: [PATCH ovpn net v6 5/6] ovpn: run deferred work on a module-owned workqueue
Antonio Quartulli <[email protected]>
| Newsgroups | gmane.network.openvpn.devel |
|---|---|
| Message-ID | <[email protected]> |
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?
Regards,
--
Antonio Quartulli