diff options
author | Patrick McHardy | 2008-01-31 13:38:19 +0100 |
---|---|---|
committer | David S. Miller | 2008-02-01 04:27:53 +0100 |
commit | 7d0742da1c8f5df3a34030f0170b30d1a052be80 (patch) | |
tree | f5717a37a9b4fe27abfa7886996d7051c57b91b9 /net/netfilter/nf_conntrack_netlink.c | |
parent | [NETFILTER]: nf_conntrack_core: avoid taking nf_conntrack_lock in nf_conntrac... (diff) | |
download | kernel-qcow2-linux-7d0742da1c8f5df3a34030f0170b30d1a052be80.tar.gz kernel-qcow2-linux-7d0742da1c8f5df3a34030f0170b30d1a052be80.tar.xz kernel-qcow2-linux-7d0742da1c8f5df3a34030f0170b30d1a052be80.zip |
[NETFILTER]: nf_conntrack_expect: use RCU for expectation hash
Use RCU for expectation hash. This doesn't buy much for conntrack
runtime performance, but allows to reduce the use of nf_conntrack_lock
for /proc and nf_netlink_conntrack.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/netfilter/nf_conntrack_netlink.c')
-rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index b6c0935e09df..557f47137da0 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -1471,7 +1471,7 @@ ctnetlink_exp_dump_table(struct sk_buff *skb, struct netlink_callback *cb) struct hlist_node *n; u_int8_t l3proto = nfmsg->nfgen_family; - read_lock_bh(&nf_conntrack_lock); + rcu_read_lock(); last = (struct nf_conntrack_expect *)cb->args[1]; for (; cb->args[0] < nf_ct_expect_hsize; cb->args[0]++) { restart: @@ -1488,7 +1488,8 @@ restart: cb->nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, 1, exp) < 0) { - atomic_inc(&exp->use); + if (!atomic_inc_not_zero(&exp->use)) + continue; cb->args[1] = (unsigned long)exp; goto out; } @@ -1499,7 +1500,7 @@ restart: } } out: - read_unlock_bh(&nf_conntrack_lock); + rcu_read_unlock(); if (last) nf_ct_expect_put(last); |