From patchwork Wed Dec 5 19:18:10 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 203926 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 0244C2C00B4 for ; Thu, 6 Dec 2012 06:18:35 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753611Ab2LETSQ (ORCPT ); Wed, 5 Dec 2012 14:18:16 -0500 Received: from mail-pa0-f46.google.com ([209.85.220.46]:55454 "EHLO mail-pa0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752496Ab2LETSP (ORCPT ); Wed, 5 Dec 2012 14:18:15 -0500 Received: by mail-pa0-f46.google.com with SMTP id bh2so3816615pad.19 for ; Wed, 05 Dec 2012 11:18:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:from:to:cc:content-type:date:message-id:mime-version :x-mailer:content-transfer-encoding; bh=QvvxuIP547hLYvSJz70x+pSCo1MQBouZNKLolbCrlYE=; b=ehbNNHH2ruk8o2BTQkm2Cekl2hME25oNUvO8g2VbUYSxJjP7jclw7LJfk7y1No3oP1 YP0rI+lNWl0ML1i+gYt0O6YuKw68IlSBF4MqsFzLS+Wi4pen7odkJk2wndGF/ogb6C1h 73ivVRnos7uceUQLslGPxSBsEVrzqCrrdmfo499+Heb+DIueUeYT9Qoze6uzxxIhxHY6 lVCI/VtcdQ9yzySce71x7thdhSBTelG0cSXGeZWBcyOyF3CA7qwCjsceFtXgRINEt1jy mZBYksOvKdS7XXO2AYln6W5bYGDTpmeI6tqeq7dAJUBoTJc7pA0JG3I3a5rTm/5n0v01 5ncA== Received: by 10.68.189.8 with SMTP id ge8mr52763434pbc.24.1354735092703; Wed, 05 Dec 2012 11:18:12 -0800 (PST) Received: from [172.17.34.105] ([172.17.34.105]) by mx.google.com with ESMTPS id z10sm3154939pax.38.2012.12.05.11.18.10 (version=SSLv3 cipher=OTHER); Wed, 05 Dec 2012 11:18:11 -0800 (PST) Subject: [PATCH net-next] ipv6: avoid taking locks at socket dismantle From: Eric Dumazet To: David Miller Cc: netdev Date: Wed, 05 Dec 2012 11:18:10 -0800 Message-ID: <1354735090.31222.21.camel@edumazet-glaptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Eric Dumazet ipv6_sock_mc_close() is called for ipv6 sockets at close time, and most of them don't use multicast. Add a test to avoid contention on a shared spinlock. Same heuristic applies for ipv6_sock_ac_close(), to avoid contention on a shared rwlock. Signed-off-by: Eric Dumazet --- net/ipv6/anycast.c | 3 +++ net/ipv6/mcast.c | 3 +++ 2 files changed, 6 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c index 2f4f584..757a810 100644 --- a/net/ipv6/anycast.c +++ b/net/ipv6/anycast.c @@ -189,6 +189,9 @@ void ipv6_sock_ac_close(struct sock *sk) struct net *net = sock_net(sk); int prev_index; + if (!np->ipv6_ac_list) + return; + write_lock_bh(&ipv6_sk_ac_lock); pac = np->ipv6_ac_list; np->ipv6_ac_list = NULL; diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index b19ed51..28dfa5f 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c @@ -284,6 +284,9 @@ void ipv6_sock_mc_close(struct sock *sk) struct ipv6_mc_socklist *mc_lst; struct net *net = sock_net(sk); + if (!rcu_access_pointer(np->ipv6_mc_list)) + return; + spin_lock(&ipv6_sk_mc_lock); while ((mc_lst = rcu_dereference_protected(np->ipv6_mc_list, lockdep_is_held(&ipv6_sk_mc_lock))) != NULL) {