Commit 3e0d5149 authored by Changli Gao's avatar Changli Gao Committed by Patrick McHardy

netfilter: xt_connlimit: use hlist instead

The header of hlist is smaller than list.
Signed-off-by: default avatarChangli Gao <xiaosuo@gmail.com>
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
parent 0e23ca14
...@@ -33,14 +33,14 @@ ...@@ -33,14 +33,14 @@
/* we will save the tuples of all connections we care about */ /* we will save the tuples of all connections we care about */
struct xt_connlimit_conn { struct xt_connlimit_conn {
struct list_head list; struct hlist_node node;
struct nf_conntrack_tuple tuple; struct nf_conntrack_tuple tuple;
union nf_inet_addr addr; union nf_inet_addr addr;
}; };
struct xt_connlimit_data { struct xt_connlimit_data {
struct list_head iphash[256]; struct hlist_head iphash[256];
spinlock_t lock; spinlock_t lock;
}; };
static u_int32_t connlimit_rnd __read_mostly; static u_int32_t connlimit_rnd __read_mostly;
...@@ -102,9 +102,9 @@ static int count_them(struct net *net, ...@@ -102,9 +102,9 @@ static int count_them(struct net *net,
{ {
const struct nf_conntrack_tuple_hash *found; const struct nf_conntrack_tuple_hash *found;
struct xt_connlimit_conn *conn; struct xt_connlimit_conn *conn;
struct xt_connlimit_conn *tmp; struct hlist_node *pos, *n;
struct nf_conn *found_ct; struct nf_conn *found_ct;
struct list_head *hash; struct hlist_head *hash;
bool addit = true; bool addit = true;
int matches = 0; int matches = 0;
...@@ -116,7 +116,7 @@ static int count_them(struct net *net, ...@@ -116,7 +116,7 @@ static int count_them(struct net *net,
rcu_read_lock(); rcu_read_lock();
/* check the saved connections */ /* check the saved connections */
list_for_each_entry_safe(conn, tmp, hash, list) { hlist_for_each_entry_safe(conn, pos, n, hash, node) {
found = nf_conntrack_find_get(net, NF_CT_DEFAULT_ZONE, found = nf_conntrack_find_get(net, NF_CT_DEFAULT_ZONE,
&conn->tuple); &conn->tuple);
found_ct = NULL; found_ct = NULL;
...@@ -136,7 +136,7 @@ static int count_them(struct net *net, ...@@ -136,7 +136,7 @@ static int count_them(struct net *net,
if (found == NULL) { if (found == NULL) {
/* this one is gone */ /* this one is gone */
list_del(&conn->list); hlist_del(&conn->node);
kfree(conn); kfree(conn);
continue; continue;
} }
...@@ -147,7 +147,7 @@ static int count_them(struct net *net, ...@@ -147,7 +147,7 @@ static int count_them(struct net *net,
* closed already -> ditch it * closed already -> ditch it
*/ */
nf_ct_put(found_ct); nf_ct_put(found_ct);
list_del(&conn->list); hlist_del(&conn->node);
kfree(conn); kfree(conn);
continue; continue;
} }
...@@ -167,7 +167,7 @@ static int count_them(struct net *net, ...@@ -167,7 +167,7 @@ static int count_them(struct net *net,
return -ENOMEM; return -ENOMEM;
conn->tuple = *tuple; conn->tuple = *tuple;
conn->addr = *addr; conn->addr = *addr;
list_add(&conn->list, hash); hlist_add_head(&conn->node, hash);
++matches; ++matches;
} }
...@@ -246,7 +246,7 @@ static int connlimit_mt_check(const struct xt_mtchk_param *par) ...@@ -246,7 +246,7 @@ static int connlimit_mt_check(const struct xt_mtchk_param *par)
spin_lock_init(&info->data->lock); spin_lock_init(&info->data->lock);
for (i = 0; i < ARRAY_SIZE(info->data->iphash); ++i) for (i = 0; i < ARRAY_SIZE(info->data->iphash); ++i)
INIT_LIST_HEAD(&info->data->iphash[i]); INIT_HLIST_HEAD(&info->data->iphash[i]);
return 0; return 0;
} }
...@@ -255,15 +255,15 @@ static void connlimit_mt_destroy(const struct xt_mtdtor_param *par) ...@@ -255,15 +255,15 @@ static void connlimit_mt_destroy(const struct xt_mtdtor_param *par)
{ {
const struct xt_connlimit_info *info = par->matchinfo; const struct xt_connlimit_info *info = par->matchinfo;
struct xt_connlimit_conn *conn; struct xt_connlimit_conn *conn;
struct xt_connlimit_conn *tmp; struct hlist_node *pos, *n;
struct list_head *hash = info->data->iphash; struct hlist_head *hash = info->data->iphash;
unsigned int i; unsigned int i;
nf_ct_l3proto_module_put(par->family); nf_ct_l3proto_module_put(par->family);
for (i = 0; i < ARRAY_SIZE(info->data->iphash); ++i) { for (i = 0; i < ARRAY_SIZE(info->data->iphash); ++i) {
list_for_each_entry_safe(conn, tmp, &hash[i], list) { hlist_for_each_entry_safe(conn, pos, n, &hash[i], node) {
list_del(&conn->list); hlist_del(&conn->node);
kfree(conn); kfree(conn);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment