From: Kuniyuki Iwashima <kuniyu@google.com>
To: Andrew Lunn <andrew+netdev@lunn.ch>,
"David S . Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>
Cc: Simon Horman <horms@kernel.org>,
Kuniyuki Iwashima <kuniyu@google.com>,
Kuniyuki Iwashima <kuni1840@gmail.com>,
netdev@vger.kernel.org
Subject: [PATCH v1 net-next 1/2] pfcp: Protect pfcp_net.pfcp_dev_list with mutex.
Date: Fri, 31 Jul 2026 22:43:40 +0000 [thread overview]
Message-ID: <20260731224406.2444121-2-kuniyu@google.com> (raw)
In-Reply-To: <20260731224406.2444121-1-kuniyu@google.com>
struct pfcp_dev.net is the netns where the backend pfcp socket
resides.
struct pfcp_dev is linked to the pfcp_net.pfcp_dev_list of
the socket's netns.
During netns dismantle or module unload, pfcp_net_exit_rtnl()
iterates the list and queues devices for destruction regardless
of the devices' netns.
Thus, once RTNL is removed, the list can be modified concurrently
from different netns due to device removal.
Let's protect it with per-netns mutex.
Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
---
drivers/net/pfcp.c | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/drivers/net/pfcp.c b/drivers/net/pfcp.c
index d8e4d60f5834..45f9c5d3cb20 100644
--- a/drivers/net/pfcp.c
+++ b/drivers/net/pfcp.c
@@ -29,6 +29,7 @@ static unsigned int pfcp_net_id __read_mostly;
struct pfcp_net {
struct list_head pfcp_dev_list;
+ struct mutex lock;
};
static void
@@ -209,7 +210,10 @@ static int pfcp_newlink(struct net_device *dev,
}
pn = net_generic(link_net, pfcp_net_id);
+
+ mutex_lock(&pn->lock);
list_add(&pfcp->list, &pn->pfcp_dev_list);
+ mutex_unlock(&pn->lock);
netdev_dbg(dev, "registered new PFCP interface\n");
@@ -223,7 +227,7 @@ static int pfcp_newlink(struct net_device *dev,
return err;
}
-static void pfcp_dellink(struct net_device *dev, struct list_head *head)
+static void __pfcp_dellink(struct net_device *dev, struct list_head *head)
{
struct pfcp_dev *pfcp = netdev_priv(dev);
@@ -231,6 +235,18 @@ static void pfcp_dellink(struct net_device *dev, struct list_head *head)
unregister_netdevice_queue(dev, head);
}
+static void pfcp_dellink(struct net_device *dev, struct list_head *head)
+{
+ struct pfcp_dev *pfcp = netdev_priv(dev);
+ struct pfcp_net *pn;
+
+ pn = net_generic(pfcp->net, pfcp_net_id);
+
+ mutex_lock(&pn->lock);
+ __pfcp_dellink(dev, head);
+ mutex_unlock(&pn->lock);
+}
+
static struct rtnl_link_ops pfcp_link_ops __read_mostly = {
.kind = "pfcp",
.priv_size = sizeof(struct pfcp_dev),
@@ -244,6 +260,8 @@ static int __net_init pfcp_net_init(struct net *net)
struct pfcp_net *pn = net_generic(net, pfcp_net_id);
INIT_LIST_HEAD(&pn->pfcp_dev_list);
+ mutex_init(&pn->lock);
+
return 0;
}
@@ -253,8 +271,12 @@ static void __net_exit pfcp_net_exit_rtnl(struct net *net,
struct pfcp_net *pn = net_generic(net, pfcp_net_id);
struct pfcp_dev *pfcp, *pfcp_next;
+ mutex_lock(&pn->lock);
+
list_for_each_entry_safe(pfcp, pfcp_next, &pn->pfcp_dev_list, list)
- pfcp_dellink(pfcp->dev, dev_to_kill);
+ __pfcp_dellink(pfcp->dev, dev_to_kill);
+
+ mutex_unlock(&pn->lock);
}
static struct pernet_operations pfcp_net_ops = {
--
2.55.0.571.g244d577d93-goog
next prev parent reply other threads:[~2026-07-31 22:44 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-31 22:43 [PATCH v1 net-next 0/2] pfcp: Support per-netns device unregistration Kuniyuki Iwashima
2026-07-31 22:43 ` Kuniyuki Iwashima [this message]
2026-07-31 22:43 ` [PATCH v1 net-next 2/2] pfcp: Support per-netns netdev unregistration Kuniyuki Iwashima
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=20260731224406.2444121-2-kuniyu@google.com \
--to=kuniyu@google.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=kuni1840@gmail.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox