From patchwork Fri Apr 27 18:28:53 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Poirier X-Patchwork-Id: 155571 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 4CAD4B6FD7 for ; Sat, 28 Apr 2012 04:30:32 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761175Ab2D0SaF (ORCPT ); Fri, 27 Apr 2012 14:30:05 -0400 Received: from mail-gy0-f174.google.com ([209.85.160.174]:53226 "EHLO mail-gy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1761122Ab2D0SaC (ORCPT ); Fri, 27 Apr 2012 14:30:02 -0400 Received: by ghrr11 with SMTP id r11so616740ghr.19 for ; Fri, 27 Apr 2012 11:30:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=uZegOUDizkBLzpCwbEGmK95BZRp+FZ1PAloTAaR90Yo=; b=FoQmnPogzDUtHdk4yfUGKX0KIVohUa/5afYcyMmY/+zhL6X29C/Sss34hQ6ThreNqU 0V+do3LUv7e1hxEX7s1yaNBtPizbDhyFEiVxN5GW0xnFm5/3kwHkteyAP0d3CIuFqxRV 7dOc75gdfXeGoQK5oRdZx3aiZOrO3cI9n8fynXBedbOB3suq8RHIcrQig/oLMFK/sKYV mkK520hOVlZuXD3mbBhc86xCbCD95xwtnzD5MrGTG8smK3iIom/wjOcnPkUZTSRGAT0e N43VEY6FBNzX8aHMfEGk07XuFxspo7tA2d4w0B6asZ1XofEZhnlBamnteDFw9MBptHcm HEiw== Received: by 10.50.216.136 with SMTP id oq8mr3774861igc.63.1335551400946; Fri, 27 Apr 2012 11:30:00 -0700 (PDT) Received: from localhost.localdomain (modemcable118.38-22-96.mc.videotron.ca. [96.22.38.118]) by mx.google.com with ESMTPS id vp3sm6255247igb.3.2012.04.27.11.29.58 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 27 Apr 2012 11:30:00 -0700 (PDT) From: Benjamin Poirier To: netdev@vger.kernel.org Cc: Pablo Neira Ayuso , Patrick McHardy , "David S. Miller" , Andrew Morton , Eric Dumazet , Mike Frysinger , Arun Sharma , netfilter-devel@vger.kernel.org, netfilter@vger.kernel.org, coreteam@netfilter.org, linux-kernel@vger.kernel.org, "Paul E. McKenney" Subject: [PATCH RFC 2/2] netfilter: conntrack: replace mutex with cmpxchg Date: Fri, 27 Apr 2012 14:28:53 -0400 Message-Id: <1335551333-6103-2-git-send-email-bpoirier@suse.de> X-Mailer: git-send-email 1.7.7 In-Reply-To: <1335551333-6103-1-git-send-email-bpoirier@suse.de> References: <1335551333-6103-1-git-send-email-bpoirier@suse.de> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This mutex protects a single pointer. --- net/netfilter/nf_conntrack_ecache.c | 38 +++++++++------------------------- 1 files changed, 10 insertions(+), 28 deletions(-) diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c index 0134009..603eb69 100644 --- a/net/netfilter/nf_conntrack_ecache.c +++ b/net/netfilter/nf_conntrack_ecache.c @@ -25,8 +25,6 @@ #include #include -static DEFINE_MUTEX(nf_ct_ecache_mutex); - /* deliver cached events and clear cache entry - must be called with locally * disabled softirqs */ void nf_ct_deliver_cached_events(struct nf_conn *ct) @@ -80,52 +78,36 @@ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events); int nf_conntrack_register_notifier(struct net *net, struct nf_ct_event_notifier *new) { - int ret = 0; - - mutex_lock(&nf_ct_ecache_mutex); - if (net->ct.nf_conntrack_event_cb != NULL) - ret = -EBUSY; + if (cmpxchg(&net->ct.nf_conntrack_event_cb, NULL, new) != NULL) + return -EBUSY; else - net->ct.nf_conntrack_event_cb = new; - mutex_unlock(&nf_ct_ecache_mutex); - - return ret; + return 0; } EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier); void nf_conntrack_unregister_notifier(struct net *net, struct nf_ct_event_notifier *new) { - mutex_lock(&nf_ct_ecache_mutex); - BUG_ON(net->ct.nf_conntrack_event_cb != new); - net->ct.nf_conntrack_event_cb = NULL; - mutex_unlock(&nf_ct_ecache_mutex); + if (xchg(&net->ct.nf_conntrack_event_cb, NULL) != new) + BUG(); } EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier); int nf_ct_expect_register_notifier(struct net *net, struct nf_exp_event_notifier *new) { - int ret = 0; - - mutex_lock(&nf_ct_ecache_mutex); - if (net->ct.nf_expect_event_cb != NULL) - ret = -EBUSY; + if (cmpxchg(&net->ct.nf_expect_event_cb, NULL, new) != NULL) + return -EBUSY; else - net->ct.nf_expect_event_cb = new; - mutex_unlock(&nf_ct_ecache_mutex); - - return ret; + return 0; } EXPORT_SYMBOL_GPL(nf_ct_expect_register_notifier); void nf_ct_expect_unregister_notifier(struct net *net, struct nf_exp_event_notifier *new) { - mutex_lock(&nf_ct_ecache_mutex); - BUG_ON(net->ct.nf_expect_event_cb != new); - net->ct.nf_expect_event_cb = NULL; - mutex_unlock(&nf_ct_ecache_mutex); + if (xchg(&net->ct.nf_expect_event_cb, NULL) != new) + BUG(); } EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier);