From patchwork Mon Feb 25 11:16:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li RongQing X-Patchwork-Id: 1047681 X-Patchwork-Delegate: pablo@netfilter.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netfilter-devel-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=baidu.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 447KLG4CZdz9s6w for ; Mon, 25 Feb 2019 22:22:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726725AbfBYLWp (ORCPT ); Mon, 25 Feb 2019 06:22:45 -0500 Received: from mx58.baidu.com ([61.135.168.58]:50803 "EHLO tc-sys-mailedm04.tc.baidu.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726574AbfBYLWp (ORCPT ); Mon, 25 Feb 2019 06:22:45 -0500 Received: from localhost (cp01-cos-dev01.cp01.baidu.com [10.92.119.46]) by tc-sys-mailedm04.tc.baidu.com (Postfix) with ESMTP id 6EBFD236C005 for ; Mon, 25 Feb 2019 19:16:01 +0800 (CST) From: Li RongQing To: netfilter-devel@vger.kernel.org Subject: [PATCH][nf-next] netfilter: replace modulo operation with bitwise AND Date: Mon, 25 Feb 2019 19:16:01 +0800 Message-Id: <1551093361-2150-1-git-send-email-lirongqing@baidu.com> X-Mailer: git-send-email 1.7.1 Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org CONNTRACK_LOCKS is 1024 and power of 2, so modulo operations can be replaced with AND (CONNTRACK_LOCKS - 1) and bitwise AND operation is quicker than module operation Signed-off-by: Zhang Yu Signed-off-by: Li RongQing --- include/net/netfilter/nf_conntrack_core.h | 4 +++- net/netfilter/nf_conntrack_core.c | 10 +++++----- net/netfilter/nf_conntrack_netlink.c | 2 +- net/netfilter/nf_nat_core.c | 6 +++--- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/include/net/netfilter/nf_conntrack_core.h b/include/net/netfilter/nf_conntrack_core.h index ae41e92251dd..1b75a141c63d 100644 --- a/include/net/netfilter/nf_conntrack_core.h +++ b/include/net/netfilter/nf_conntrack_core.h @@ -67,7 +67,9 @@ static inline int nf_conntrack_confirm(struct sk_buff *skb) void print_tuple(struct seq_file *s, const struct nf_conntrack_tuple *tuple, const struct nf_conntrack_l4proto *proto); -#define CONNTRACK_LOCKS 1024 +#define CONNTRACK_LOCKS_BIT 10 +#define CONNTRACK_LOCKS (1 << CONNTRACK_LOCKS_BIT) +#define CONNTRACK_LOCKS_MASK (CONNTRACK_LOCKS - 1) extern spinlock_t nf_conntrack_locks[CONNTRACK_LOCKS]; void nf_conntrack_lock(spinlock_t *lock); diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index e139c256e269..a0feb530ed00 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -116,8 +116,8 @@ EXPORT_SYMBOL_GPL(nf_conntrack_lock); static void nf_conntrack_double_unlock(unsigned int h1, unsigned int h2) { - h1 %= CONNTRACK_LOCKS; - h2 %= CONNTRACK_LOCKS; + h1 &= CONNTRACK_LOCKS_MASK; + h2 &= CONNTRACK_LOCKS_MASK; spin_unlock(&nf_conntrack_locks[h1]); if (h1 != h2) spin_unlock(&nf_conntrack_locks[h2]); @@ -127,8 +127,8 @@ static void nf_conntrack_double_unlock(unsigned int h1, unsigned int h2) static bool nf_conntrack_double_lock(struct net *net, unsigned int h1, unsigned int h2, unsigned int sequence) { - h1 %= CONNTRACK_LOCKS; - h2 %= CONNTRACK_LOCKS; + h1 &= CONNTRACK_LOCKS_MASK; + h2 &= CONNTRACK_LOCKS_MASK; if (h1 <= h2) { nf_conntrack_lock(&nf_conntrack_locks[h1]); if (h1 != h2) @@ -1971,7 +1971,7 @@ get_next_corpse(int (*iter)(struct nf_conn *i, void *data), spinlock_t *lockp; for (; *bucket < nf_conntrack_htable_size; (*bucket)++) { - lockp = &nf_conntrack_locks[*bucket % CONNTRACK_LOCKS]; + lockp = &nf_conntrack_locks[*bucket & CONNTRACK_LOCKS_MASK]; local_bh_disable(); nf_conntrack_lock(lockp); if (*bucket < nf_conntrack_htable_size) { diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 349b42a65c8a..8f22743c270f 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -918,7 +918,7 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) nf_ct_put(nf_ct_evict[i]); } - lockp = &nf_conntrack_locks[cb->args[0] % CONNTRACK_LOCKS]; + lockp = &nf_conntrack_locks[cb->args[0] & CONNTRACK_LOCKS_MASK]; nf_conntrack_lock(lockp); if (cb->args[0] >= nf_conntrack_htable_size) { spin_unlock(lockp); diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c index 35e61038ae96..2b1d377bf3ab 100644 --- a/net/netfilter/nf_nat_core.c +++ b/net/netfilter/nf_nat_core.c @@ -588,7 +588,7 @@ nf_nat_setup_info(struct nf_conn *ct, srchash = hash_by_src(net, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); - lock = &nf_nat_locks[srchash % CONNTRACK_LOCKS]; + lock = &nf_nat_locks[srchash & CONNTRACK_LOCKS_MASK]; spin_lock_bh(lock); hlist_add_head_rcu(&ct->nat_bysource, &nf_nat_bysource[srchash]); @@ -773,9 +773,9 @@ static void __nf_nat_cleanup_conntrack(struct nf_conn *ct) unsigned int h; h = hash_by_src(nf_ct_net(ct), &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); - spin_lock_bh(&nf_nat_locks[h % CONNTRACK_LOCKS]); + spin_lock_bh(&nf_nat_locks[h & CONNTRACK_LOCKS_MASK]); hlist_del_rcu(&ct->nat_bysource); - spin_unlock_bh(&nf_nat_locks[h % CONNTRACK_LOCKS]); + spin_unlock_bh(&nf_nat_locks[h & CONNTRACK_LOCKS_MASK]); } static int nf_nat_proto_clean(struct nf_conn *ct, void *data)