2025-01-22, 00:26:50 +0100, Antonio Quartulli wrote: > On 20/01/2025 15:52, Antonio Quartulli wrote: > > On 17/01/2025 12:48, Sabrina Dubroca wrote: > > [...] > > > -------- 8< -------- > > > > > > diff --git a/drivers/net/ovpn/netlink.c b/drivers/net/ovpn/netlink.c > > > index 72357bb5f30b..19aa4ee6d468 100644 > > > --- a/drivers/net/ovpn/netlink.c > > > +++ b/drivers/net/ovpn/netlink.c > > > @@ -733,6 +733,9 @@ int ovpn_nl_peer_del_doit(struct sk_buff *skb, > > > struct genl_info *info) > > > netdev_dbg(ovpn->dev, "del peer %u\n", peer->id); > > > ret = ovpn_peer_del(peer, OVPN_DEL_PEER_REASON_USERSPACE); > > > + if (ret >= 0 && peer->sock) > > > + wait_for_completion(&peer->sock_detach); > > > + > > > ovpn_peer_put(peer); > > > return ret; > > > diff --git a/drivers/net/ovpn/peer.c b/drivers/net/ovpn/peer.c > > > index b032390047fe..6120521d0c32 100644 > > > --- a/drivers/net/ovpn/peer.c > > > +++ b/drivers/net/ovpn/peer.c > > > @@ -92,6 +92,7 @@ struct ovpn_peer *ovpn_peer_new(struct ovpn_priv > > > *ovpn, u32 id) > > > ovpn_peer_stats_init(&peer->vpn_stats); > > > ovpn_peer_stats_init(&peer->link_stats); > > > INIT_WORK(&peer->keepalive_work, ovpn_peer_keepalive_send); > > > + init_completion(&peer->sock_detach); > > > ret = dst_cache_init(&peer->dst_cache, GFP_KERNEL); > > > if (ret < 0) { > > > diff --git a/drivers/net/ovpn/peer.h b/drivers/net/ovpn/peer.h > > > index 7a062cc5a5a4..8c54bf5709ef 100644 > > > --- a/drivers/net/ovpn/peer.h > > > +++ b/drivers/net/ovpn/peer.h > > > @@ -112,6 +112,7 @@ struct ovpn_peer { > > > struct rcu_head rcu; > > > struct work_struct remove_work; > > > struct work_struct keepalive_work; > > > + struct completion sock_detach; > > > }; > > > /** > > > diff --git a/drivers/net/ovpn/socket.c b/drivers/net/ovpn/socket.c > > > index a5c3bc834a35..7cefac42c3be 100644 > > > --- a/drivers/net/ovpn/socket.c > > > +++ b/drivers/net/ovpn/socket.c > > > @@ -31,6 +31,8 @@ static void ovpn_socket_release_kref(struct kref *kref) > > > sockfd_put(sock->sock); > > > kfree_rcu(sock, rcu); > > > + > > > + complete(&sock->peer->sock_detach); > > I am moving this line to ovpn_socket_put(), right after kref_put() so that > every peer going through the socket release will get their complete() > invoked. > > If the peer happens to be the last one owning the socket, kref_put() will > first do the detach and only then complete() gets called. > > This requires ovpn_socket_release/put() to take the peer as argument, but > that's ok. > > This way we should achieve what we needed. This seems like it would, thanks. -- Sabrina