From: Sabrina Dubroca <sd@queasysnail.net>
To: Antonio Quartulli <antonio@openvpn.net>
Cc: Hyunwoo Kim <imv4bel@gmail.com>,
pabeni@redhat.com, netdev@vger.kernel.org, davem@davemloft.net,
andrew+netdev@lunn.ch, edumazet@google.com, kuba@kernel.org
Subject: Re: [PATCH net] ovpn: Fix race condition in ovpn_dellink()
Date: Fri, 6 Mar 2026 12:03:15 +0100 [thread overview]
Message-ID: <aaq0cxEEkPf7CDV4@krikkit> (raw)
In-Reply-To: <6aa197ce-9e72-473c-a8c9-d190d85fb625@openvpn.net>
Sorry Antonio, things are a bit busy over here, I'm finally getting to
this.
2026-03-03, 21:15:59 +0100, Antonio Quartulli wrote:
> Hi,
>
> On 02/03/2026 11:02, Hyunwoo Kim wrote:
> > When ovpn_dellink() is called, it invokes
> > cancel_delayed_work_sync() to stop keepalive_work before freeing
> > the device.
> > However, ovpn_nl_peer_new_doit() runs without any lock shared
> > with the RTNL path, so keepalive_work can be scheduled after
> > cancel_delayed_work_sync() returns.
> >
> > The following is a simple race scenario:
> >
> > cpu0 cpu1
> >
> > ovpn_dellink(dev)
> > cancel_delayed_work_sync(keepalive_work)
> > ovpn_nl_peer_new_doit()
> > ovpn_nl_peer_modify()
> > ovpn_peer_keepalive_set()
> > mod_delayed_work(keepalive_work)
> >
> > To prevent this race condition, cancel_delayed_work_sync() is
> > replaced with disable_delayed_work_sync().
>
> I was about to agree on your fix, however, it seems there is a larger issue
> here and this patch is just addressing one symptom.
>
> If you are truly able to execute the whole ovpn_nl_peer_new_doit() after
> cancel_delayed_work_sync() and before the netdev refcounter reaches 0, I
> think we may get stuck in the "wait for device to be freed..." loop.
>
> That's because the ovpn_peer_new() will acquire a reference to the netdev,
> preventing it to be fully released.
>
>
> Sabrina, do you have any thought on this?
> It seems as if there is no safe guard against adding peers while destroying
> the interface.
Feel free to add:
diff --git a/drivers/net/ovpn/main.c b/drivers/net/ovpn/main.c
index 2e0420febda0..3bf6ea5f7208 100644
--- a/drivers/net/ovpn/main.c
+++ b/drivers/net/ovpn/main.c
@@ -214,6 +214,10 @@ static void ovpn_dellink(struct net_device *dev, struct list_head *head)
cancel_delayed_work_sync(&ovpn->keepalive_work);
ovpn_peers_free(ovpn, NULL, OVPN_DEL_PEER_REASON_TEARDOWN);
+
+ pr_warn("sleeping\n");
+ msleep(10000);
+
unregister_netdevice_queue(dev, head);
}
to help reproduce the race, I usually do something like that if it's
possible to sleep in that context.
I think you're right, the newly-added peer will miss
ovpn_peers_free. Can we simply move cancel_delayed_work_sync +
ovpn_peers_free to ndo_uninit and not provide a dellink?
At ndo_uninit, the netdevice is no longer listed so PEER_NEW won't
find it, but delaying the release of the reference on the netdev via
peer cleanup should still be ok (unregister_netdevice_many_notify
calls unlist_netdevice and then ndo_uninit, then we add it to the
todo_list and netdev_run_todo processes that list and does
netdev_wait_allrefs_any).
--
Sabrina
prev parent reply other threads:[~2026-03-06 11:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-02 10:02 [PATCH net] ovpn: Fix race condition in ovpn_dellink() Hyunwoo Kim
2026-03-03 20:15 ` Antonio Quartulli
2026-03-06 11:03 ` Sabrina Dubroca [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aaq0cxEEkPf7CDV4@krikkit \
--to=sd@queasysnail.net \
--cc=andrew+netdev@lunn.ch \
--cc=antonio@openvpn.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=imv4bel@gmail.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.