Skip to content

Commit

Permalink
netfilter: nf_conncount: Add list lock and gc worker, and RCU for ini…
Browse files Browse the repository at this point in the history
…t tree search

This patch is originally from Florian Westphal.

This patch does the following 3 main tasks.

1) Add list lock to 'struct nf_conncount_list' so that we can
alter the lists containing the individual connections without holding the
main tree lock.  It would be useful when we only need to add/remove to/from
a list without allocate/remove a node in the tree.  With this change, we
update nft_connlimit accordingly since we longer need to maintain
a list lock in nft_connlimit now.

2) Use RCU for the initial tree search to improve tree look up performance.

3) Add a garbage collection worker. This worker is schedule when there
are excessive tree node that needed to be recycled.

Moreover,the rbnode reclaim logic is moved from search tree to insert tree
to avoid race condition.

Signed-off-by: Yi-Hung Wei <yihung.wei@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
YiHungWei authored and ummakynes committed Jul 18, 2018
1 parent 34848d5 commit 5c789e1
Show file tree
Hide file tree
Showing 3 changed files with 196 additions and 91 deletions.
17 changes: 13 additions & 4 deletions include/net/netfilter/nf_conntrack_count.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,17 @@

struct nf_conncount_data;

enum nf_conncount_list_add {
NF_CONNCOUNT_ADDED, /* list add was ok */
NF_CONNCOUNT_ERR, /* -ENOMEM, must drop skb */
NF_CONNCOUNT_SKIP, /* list is already reclaimed by gc */
};

struct nf_conncount_list {
spinlock_t list_lock;
struct list_head head; /* connections with the same filtering key */
unsigned int count; /* length of list */
bool dead;
};

struct nf_conncount_data *nf_conncount_init(struct net *net, unsigned int family,
Expand All @@ -28,11 +36,12 @@ void nf_conncount_lookup(struct net *net, struct nf_conncount_list *list,

void nf_conncount_list_init(struct nf_conncount_list *list);

bool nf_conncount_add(struct nf_conncount_list *list,
const struct nf_conntrack_tuple *tuple,
const struct nf_conntrack_zone *zone);
enum nf_conncount_list_add
nf_conncount_add(struct nf_conncount_list *list,
const struct nf_conntrack_tuple *tuple,
const struct nf_conntrack_zone *zone);

void nf_conncount_gc_list(struct net *net,
bool nf_conncount_gc_list(struct net *net,
struct nf_conncount_list *list);

void nf_conncount_cache_free(struct nf_conncount_list *list);
Expand Down
Loading

0 comments on commit 5c789e1

Please sign in to comment.