[Devel] [PATCH rh7 2/4] net: Skip allocation of conntrack if there are no rules

Kirill Tkhai ktkhai at virtuozzo.com
Thu Sep 8 01:52:22 PDT 2016


On 08.09.2016 08:31, Andrei Vagin wrote:
> On Tue, Sep 06, 2016 at 09:31:33AM +0300, Kirill Tkhai wrote:
>> HW node may have many CTs, which are not having conntrack
>> users. Do not allocate them to save resources and decrease
>> performance penalty.
>>
>> Next two patches will actually mark conntrack users.
>>
>> https://jira.sw.ru/browse/PSBM-51050
>>
>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>> ---
>>  net/netfilter/nf_conntrack_core.c    |    7 ++++++-
>>  net/netfilter/nf_conntrack_netlink.c |    2 ++
>>  net/netfilter/nf_synproxy_core.c     |    2 ++
>>  3 files changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
>> index b5de5aa..c46bede 100644
>> --- a/net/netfilter/nf_conntrack_core.c
>> +++ b/net/netfilter/nf_conntrack_core.c
>> @@ -841,6 +841,11 @@ __nf_conntrack_alloc(struct net *net, u16 zone,
>>  	unsigned int ct_max = net->ct.max ? net->ct.max : init_net.ct.max;
>>  	struct nf_conn *ct;
>>  
>> +	if (!atomic_read(&net->ct.users)) {
>> +		/* No rules loaded */
>> +		return NULL;
>> +	}
>> +
>>  	if (unlikely(!nf_conntrack_hash_rnd)) {
>>  		init_nf_conntrack_hash_rnd();
>>  		/* recompute the hash as nf_conntrack_hash_rnd is initialized */
>> @@ -963,7 +968,7 @@ init_conntrack(struct net *net, struct nf_conn *tmpl,
>>  
>>  	ct = __nf_conntrack_alloc(net, zone, tuple, &repl_tuple, GFP_ATOMIC,
>>  				  hash);
>> -	if (IS_ERR(ct))
>> +	if (IS_ERR_OR_NULL(ct))
>>  		return (struct nf_conntrack_tuple_hash *)ct;
>>  
>>  	if (tmpl && nfct_synproxy(tmpl)) {
>> diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
>> index d6b6465..87f5091 100644
>> --- a/net/netfilter/nf_conntrack_netlink.c
>> +++ b/net/netfilter/nf_conntrack_netlink.c
>> @@ -1617,7 +1617,9 @@ ctnetlink_create_conntrack(struct net *net, u16 zone,
>>  	struct nf_conntrack_helper *helper;
>>  	struct nf_conn_tstamp *tstamp;
>>  
>> +	inc_conntrack_users(net);
>>  	ct = nf_conntrack_alloc(net, zone, otuple, rtuple, GFP_ATOMIC);
>> +	dec_conntrack_users(net);
> 
> When I look at this, I'm starting thinking that we have to start
> tracking connections when someone tries to use them, but we should not
> stop tracking connections.

I didn't completely understand you point. Is it related to the hunk above?
If so, we don't stop tracking the conntracks there.
 
> We should not forget about the fact that conntrack can be used from
> user-space http://conntrack-tools.netfilter.org/manual.html

The above hunk is about this, isn't it?
 
>>  	if (IS_ERR(ct))
>>  		return ERR_PTR(-ENOMEM);
>>  
>> diff --git a/net/netfilter/nf_synproxy_core.c b/net/netfilter/nf_synproxy_core.c
>> index 52e20c9..7bef49e 100644
>> --- a/net/netfilter/nf_synproxy_core.c
>> +++ b/net/netfilter/nf_synproxy_core.c
>> @@ -353,7 +353,9 @@ static int __net_init synproxy_net_init(struct net *net)
>>  	int err = -ENOMEM;
>>  
>>  	memset(&t, 0, sizeof(t));
>> +	inc_conntrack_users(net);
>>  	ct = nf_conntrack_alloc(net, 0, &t, &t, GFP_KERNEL);
>> +	dec_conntrack_users(net);
>>  	if (IS_ERR(ct)) {
>>  		err = PTR_ERR(ct);
>>  		goto err1;
>>


More information about the Devel mailing list