List Info

Thread: Re: early_drop() imrovement (v4)




Re: early_drop() imrovement (v4)
country flaguser name
Germany
2007-06-27 08:18:07
Vasily Averin wrote:
> Patrick McHardy wrote:
> 
> it is incorrect again: when cnt=0 you should break both
cycles.

Indeed, thanks. Fixed now. Also changed it to leave the
loop
if we found an entry within a chain (we want the last one
of
the chain, so we still walk it entirely) and replaced

hash = (hash + 1) % nf_conntrack_htable_size

by

hash = (hash + 1) & (nf_conntrack_htable_size - 1)

since one of my queued patches makes sure that its always
a power of two.

  
Re: early_drop() imrovement (v4)
country flaguser name
Germany
2007-06-27 08:23:00
[Dropping a few CCs since I supect its beginning to be
annoying ]

Patrick McHardy wrote:
> Vasily Averin wrote:
> 
> Indeed, thanks. Fixed now. Also changed it to leave the
loop
> if we found an entry within a chain (we want the last
one of
> the chain, so we still walk it entirely) and replaced
> 
> hash = (hash + 1) % nf_conntrack_htable_size
> 
> by
> 
> hash = (hash + 1) & (nf_conntrack_htable_size - 1)
> 
> since one of my queued patches makes sure that its
always
> a power of two.


Damn it .. it doesn't, it just makes sure it always uses
pages
entirely. So I fixed that again.



Re: early_drop() imrovement (v4)
country flaguser name
Russian Federation
2007-06-27 08:25:58
Patrick McHardy wrote:
> Vasily Averin wrote:
>> Patrick McHardy wrote:
> -static int early_drop(struct hlist_head *chain)
> +static int early_drop(unsigned int hash)
>  {
>  	/* Use oldest entry, which is roughly LRU */
>  	struct nf_conntrack_tuple_hash *h;
>  	struct nf_conn *ct = NULL, *tmp;
>  	struct hlist_node *n;
> -	int dropped = 0;
> +	unsigned int i;
> +	int dropped = 0, cnt = NF_CT_EVICTION_RANGE;
>  
>  	read_lock_bh(&nf_conntrack_lock);
> -	hlist_for_each_entry(h, n, chain, hnode) {
> -		tmp = nf_ct_tuplehash_to_ctrack(h);
> -		if (!test_bit(IPS_ASSURED_BIT,
&tmp->status))
> -			ct = tmp;
> +	for (i = 0; i < nf_conntrack_htable_size; i++) {
> +		hlist_for_each_entry(h, n,
&nf_conntrack_hash[hash], hnode) {
> +			tmp = nf_ct_tuplehash_to_ctrack(h);
> +			if (!test_bit(IPS_ASSURED_BIT,
&tmp->status))
> +				ct = tmp;

It is incorrect: you should break nested loop here too.

> +			if (--cnt <= 0)
> +				goto stop;
> +		}
> +		if (ct)
> +			break;
> +		hash = (hash + 1) & (nf_conntrack_htable_size -
1);
>  	}
> +stop:
>  	if (ct)
>  		atomic_inc(&ct->ct_general.use);
>  	read_unlock_bh(&nf_conntrack_lock);



[1-3]

about | contact  Other archives ( Real Estate discussion Medical topics )