From patchwork Mon Nov 15 04:48:55 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Changli Gao X-Patchwork-Id: 71176 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 30F0BB7114 for ; Mon, 15 Nov 2010 15:49:29 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932676Ab0KOEtT (ORCPT ); Sun, 14 Nov 2010 23:49:19 -0500 Received: from mail-yx0-f174.google.com ([209.85.213.174]:62463 "EHLO mail-yx0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932585Ab0KOEtS (ORCPT ); Sun, 14 Nov 2010 23:49:18 -0500 Received: by yxn35 with SMTP id 35so927323yxn.19 for ; Sun, 14 Nov 2010 20:49:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=86sLAxq4+6AknfH4NZ5tbROYNwohlvAZVSKyf8qVKG0=; b=ANr585DBjiQJmRSMWA2os/12QnKu0SexjnNBmzlTJMLSWHW+DvaTzoKqddBNQkqIYY HpkCp40qtzeaf0+wnJ+xYDfn7hUk2/bQv4HlxwExRtc+rLgtmrS/9Vu+pdUCO2szZkZm HmnvzZ2jQ5vaHMGC5E2PXGvmAiuKpacZm6Wj0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=UOj0Mswtj48z+4LntWkddKIyvpiqUM+Tzojxcn+8+P6oDSN5OO4v4h6vXXWb8OGEr8 La4zSKU3msUYKjwJx/F9N3MfPCOmeKZqfRmWJJH0hQuA4q/+q1TDM//K2lIMjPRaaGgp bqiBg0jqyFPVbxZPDbUC8HKBILLY8+HlLykZE= Received: by 10.151.154.3 with SMTP id g3mr898959ybo.293.1289796557900; Sun, 14 Nov 2010 20:49:17 -0800 (PST) Received: from localhost.localdomain ([221.239.34.230]) by mx.google.com with ESMTPS id m45sm4335316yha.11.2010.11.14.20.49.11 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sun, 14 Nov 2010 20:49:17 -0800 (PST) From: Changli Gao To: Patrick McHardy Cc: "David S. Miller" , netfilter-devel@vger.kernel.org, netdev@vger.kernel.org, Changli Gao Subject: [PATCH] netfilter: make rcu read section smaller Date: Mon, 15 Nov 2010 12:48:55 +0800 Message-Id: <1289796535-3009-1-git-send-email-xiaosuo@gmail.com> X-Mailer: git-send-email 1.7.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Signed-off-by: Changli Gao --- net/ipv4/netfilter/nf_nat_core.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) -- 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/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c index c04787c..7300611 100644 --- a/net/ipv4/netfilter/nf_nat_core.c +++ b/net/ipv4/netfilter/nf_nat_core.c @@ -85,7 +85,7 @@ in_range(const struct nf_conntrack_tuple *tuple, const struct nf_nat_range *range) { const struct nf_nat_protocol *proto; - int ret = 0; + int ret = 1; /* If we are supposed to map IPs, then we must be in the range specified, otherwise let this drag us onto a new src IP. */ @@ -95,13 +95,14 @@ in_range(const struct nf_conntrack_tuple *tuple, return 0; } - rcu_read_lock(); - proto = __nf_nat_proto_find(tuple->dst.protonum); - if (!(range->flags & IP_NAT_RANGE_PROTO_SPECIFIED) || - proto->in_range(tuple, IP_NAT_MANIP_SRC, - &range->min, &range->max)) - ret = 1; - rcu_read_unlock(); + if (range->flags & IP_NAT_RANGE_PROTO_SPECIFIED) { + rcu_read_lock(); + proto = __nf_nat_proto_find(tuple->dst.protonum); + if (!proto->in_range(tuple, IP_NAT_MANIP_SRC, &range->min, + &range->max)) + ret = 0; + rcu_read_unlock(); + } return ret; } @@ -235,22 +236,21 @@ get_unique_tuple(struct nf_conntrack_tuple *tuple, /* 3) The per-protocol part of the manip is made to map into the range to make a unique tuple. */ + if (!(range->flags & (IP_NAT_RANGE_PROTO_RANDOM | + IP_NAT_RANGE_PROTO_SPECIFIED)) && + !nf_nat_used_tuple(tuple, ct)) + return; rcu_read_lock(); proto = __nf_nat_proto_find(orig_tuple->dst.protonum); /* Only bother mapping if it's not already in range and unique */ - if (!(range->flags & IP_NAT_RANGE_PROTO_RANDOM)) { - if (range->flags & IP_NAT_RANGE_PROTO_SPECIFIED) { - if (proto->in_range(tuple, maniptype, &range->min, - &range->max) && - (range->min.all == range->max.all || - !nf_nat_used_tuple(tuple, ct))) - goto out; - } else if (!nf_nat_used_tuple(tuple, ct)) { - goto out; - } - } + if ((range->flags & (IP_NAT_RANGE_PROTO_RANDOM | + IP_NAT_RANGE_PROTO_SPECIFIED)) == + IP_NAT_RANGE_PROTO_SPECIFIED && + proto->in_range(tuple, maniptype, &range->min, &range->max) && + (range->min.all == range->max.all || !nf_nat_used_tuple(tuple, ct))) + goto out; /* Last change: get protocol to try to obtain unique tuple. */ proto->unique_tuple(tuple, range, maniptype, ct);