From: Hangbin Liu <liuhangbin@gmail.com>
To: Jakub Sitnicki <jakub@cloudflare.com>
Cc: netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Tom Parkin <tparkin@katalix.com>,
Haowei Yan <g1042620637@gmail.com>,
Roopa Prabhu <roopa@nvidia.com>,
Nikolay Aleksandrov <nikolay@nvidia.com>
Subject: Re: [PATCH net v4] l2tp: Serialize access to sk_user_data with sk_callback_lock
Date: Mon, 5 Dec 2022 20:37:57 +0800 [thread overview]
Message-ID: <Y43mJUHWE5+9t2Ak@Laptop-X1> (raw)
In-Reply-To: <87y1rmhyc2.fsf@cloudflare.com>
On Mon, Dec 05, 2022 at 11:24:39AM +0100, Jakub Sitnicki wrote:
> > Hi Jakub,
> >
> > I have a similar issue with vxlan driver. Similar with commit
> > ad6c9986bcb6 ("vxlan: Fix GRO cells race condition between receive and link
> > delete"). There is still a race condition on vxlan that when receive a packet
> > while deleting a VXLAN device. In vxlan_ecn_decapsulate(), the
> > vxlan_get_sk_family() call panic as sk is NULL.
> >
> > So I'm wondering if we should also have locks in udp_tunnel_sock_release().
> > Or should we add a checking in sk state before calling vxlan_get_sk_family()?
>
> This is how like to think about it:
>
> To know when it is safe to load vs->sock->sk->sk_family, we have to ask:
>
> 1. What ensures that the objects remain alive/valid in our scope?
> 2. What protects the objects from being mutated?
>
> In case of vxlan_sock object in the context of vxlan_ecn_decapsulate():
>
> 1. We are in an RCU read side section (ip_local_deliver_finish).
> 2. RCU-protected objects are not to be mutated while readers exist.
>
> The classic "What is RCU, Fundamentally?" article explains it much
> better than I ever could:
>
> https://lwn.net/Articles/262464/
>
> As to where the problem lies. I belive udp_tunnel_sock_release() is not
> keeping the (2) promise.
>
> After unpublishing the sk_user_data, we should wait for any existing
> readers accessing the vxlan_sock to finish with synchronize_rcu(),
> before releaseing the socket.
>
> That is:
>
> --- a/net/ipv4/udp_tunnel_core.c
> +++ b/net/ipv4/udp_tunnel_core.c
> @@ -176,6 +176,7 @@ EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb);
> void udp_tunnel_sock_release(struct socket *sock)
> {
> rcu_assign_sk_user_data(sock->sk, NULL);
> + synchronize_rcu();
> kernel_sock_shutdown(sock, SHUT_RDWR);
> sock_release(sock);
> }
>
>
> Otherwise accessing vxlan_sock state doesn't look safe to me.
Hi Jakub,
Thanks for your explain. As it's a little on my side, I will read your
comments and try your suggestion tomorrow. Currently, I use the following
draft patch to fix the vxlan issue.
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 2122747a0224..53259b0b07f3 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -4234,6 +4234,7 @@ static void vxlan_dellink(struct net_device *dev, struct list_head *head)
struct vxlan_dev *vxlan = netdev_priv(dev);
vxlan_flush(vxlan, true);
+ vxlan_sock_release(vxlan);
list_del(&vxlan->next);
unregister_netdevice_queue(dev, head);
Cheers
Hangbin
prev parent reply other threads:[~2022-12-05 12:38 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-14 19:16 [PATCH net v4] l2tp: Serialize access to sk_user_data with sk_callback_lock Jakub Sitnicki
2022-11-15 11:12 ` Tom Parkin
2022-11-16 13:30 ` patchwork-bot+netdevbpf
2022-11-17 9:07 ` Eric Dumazet
2022-11-17 9:35 ` Jakub Sitnicki
2022-11-17 9:54 ` Eric Dumazet
2022-11-17 9:40 ` Eric Dumazet
2022-11-17 9:55 ` Jakub Sitnicki
2022-11-18 10:28 ` Eric Dumazet
2022-11-18 10:57 ` Jakub Sitnicki
2022-11-18 11:09 ` Eric Dumazet
2022-11-19 13:04 ` Jakub Sitnicki
2022-12-02 9:50 ` Hangbin Liu
2022-12-05 10:24 ` Jakub Sitnicki
2022-12-05 12:37 ` Hangbin Liu [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=Y43mJUHWE5+9t2Ak@Laptop-X1 \
--to=liuhangbin@gmail.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=g1042620637@gmail.com \
--cc=jakub@cloudflare.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nikolay@nvidia.com \
--cc=pabeni@redhat.com \
--cc=roopa@nvidia.com \
--cc=tparkin@katalix.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.