From patchwork Sat Apr 9 10:46:23 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Frederic Sowa X-Patchwork-Id: 608359 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qhtLq6MFLz9t6s for ; Sat, 9 Apr 2016 20:47:15 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=stressinduktion.org header.i=@stressinduktion.org header.b=e9wjnR4L; dkim=pass (1024-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b=KtnaezBE; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751865AbcDIKqd (ORCPT ); Sat, 9 Apr 2016 06:46:33 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:53764 "EHLO out5-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751344AbcDIKqc (ORCPT ); Sat, 9 Apr 2016 06:46:32 -0400 Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id D6CA620A9A for ; Sat, 9 Apr 2016 06:46:30 -0400 (EDT) Received: from frontend1 ([10.202.2.160]) by compute1.internal (MEProxy); Sat, 09 Apr 2016 06:46:30 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= stressinduktion.org; h=date:from:message-id:subject:to :x-sasl-enc:x-sasl-enc; s=mesmtp; bh=B2b22+1tW4q/PehxkaY4PvyvOk8 =; b=e9wjnR4LLnu5UnSsHz3Q7HH3sDD820rp0kxZDbL524XqmOMTW22Kq8apUm7 4Ezfj9QEj8/fDGQ8/Bt3cCSKgzJUOif964BKCnPPV8cOSJtD6u/wLhOB2Mc3APcI mnPvaM1311dmLdXkyV0HEwVBrj2A38e8YWhGPZwae/NxSoGE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=date:from:message-id:subject:to :x-sasl-enc:x-sasl-enc; s=smtpout; bh=B2b22+1tW4q/PehxkaY4PvyvOk 8=; b=KtnaezBEB0DryjnLz/54dZ3hDPinEE/yU7Dgzuun5zd9W7uNFnNxwN9xE5 3ySnWzSewCXTyZLq91jhBhFSanaP+NTboez4FuGLsOqP7505Sbs6g6jmFJYrsEGu 3SbkwKvgr+77rBpm5iuXUQWUVYMi0sklzU9FYS4F/pOh97r9Q= X-Sasl-enc: 2UtqdIzYKSuU+oumak+tCJALp0nV2QkTC5vdqusce1EG 1460198790 Received: from z.localhost.localdomain (unknown [213.55.184.192]) by mail.messagingengine.com (Postfix) with ESMTPA id 13967C00012 for ; Sat, 9 Apr 2016 06:46:29 -0400 (EDT) From: Hannes Frederic Sowa To: netdev@vger.kernel.org Subject: [PATCH net-next] vxlan: reduce usage of synchronize_net in ndo_stop Date: Sat, 9 Apr 2016 12:46:23 +0200 Message-Id: <1460198783-10026-1-git-send-email-hannes@stressinduktion.org> X-Mailer: git-send-email 2.5.5 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org We only need to do the synchronize_net dance once for both, ipv4 and ipv6 sockets, thus removing one synchronize_net in case both sockets get dismantled. Signed-off-by: Hannes Frederic Sowa --- Based on patch: [net-next,v2] vxlan: synchronously and race-free destruction of vxlan sockets drivers/net/vxlan.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 77ba31a0e44f97..c417bbfa3ab49f 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -1037,14 +1037,14 @@ static bool vxlan_group_used(struct vxlan_net *vn, struct vxlan_dev *dev) return false; } -static void __vxlan_sock_release(struct vxlan_sock *vs) +static bool __vxlan_sock_release_prep(struct vxlan_sock *vs) { struct vxlan_net *vn; if (!vs) - return; + return false; if (!atomic_dec_and_test(&vs->refcnt)) - return; + return false; vn = net_generic(sock_net(vs->sock->sk), vxlan_net_id); spin_lock(&vn->sock_lock); @@ -1052,16 +1052,28 @@ static void __vxlan_sock_release(struct vxlan_sock *vs) vxlan_notify_del_rx_port(vs); spin_unlock(&vn->sock_lock); - synchronize_net(); - udp_tunnel_sock_release(vs->sock); - kfree(vs); + return true; } static void vxlan_sock_release(struct vxlan_dev *vxlan) { - __vxlan_sock_release(vxlan->vn4_sock); + bool ipv4 = __vxlan_sock_release_prep(vxlan->vn4_sock); #if IS_ENABLED(CONFIG_IPV6) - __vxlan_sock_release(vxlan->vn6_sock); + bool ipv6 = __vxlan_sock_release_prep(vxlan->vn6_sock); +#endif + + synchronize_net(); + + if (ipv4) { + udp_tunnel_sock_release(vxlan->vn4_sock->sock); + kfree(vxlan->vn4_sock); + } + +#if IS_ENABLED(CONFIG_IPV6) + if (ipv6) { + udp_tunnel_sock_release(vxlan->vn6_sock->sock); + kfree(vxlan->vn6_sock); + } #endif }