Commit 080ed636 authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso

netfilter: nf_tables: no size estimation if number of set elements is unknown

This size estimation is ignored by the existing set backend selection
logic, since this estimation structure is stack allocated, set this to
~0 to make it easier to catch bugs in future changes.
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 187388bc
...@@ -365,22 +365,13 @@ static void nft_hash_destroy(const struct nft_set *set) ...@@ -365,22 +365,13 @@ static void nft_hash_destroy(const struct nft_set *set)
static bool nft_hash_estimate(const struct nft_set_desc *desc, u32 features, static bool nft_hash_estimate(const struct nft_set_desc *desc, u32 features,
struct nft_set_estimate *est) struct nft_set_estimate *est)
{ {
unsigned int esize; if (desc->size)
esize = sizeof(struct nft_hash_elem);
if (desc->size) {
est->size = sizeof(struct nft_hash) + est->size = sizeof(struct nft_hash) +
roundup_pow_of_two(desc->size * 4 / 3) * roundup_pow_of_two(desc->size * 4 / 3) *
sizeof(struct nft_hash_elem *) + sizeof(struct nft_hash_elem *) +
desc->size * esize; desc->size * sizeof(struct nft_hash_elem);
} else { else
/* Resizing happens when the load drops below 30% or goes est->size = ~0;
* above 75%. The average of 52.5% load (approximated by 50%)
* is used for the size estimation of the hash buckets,
* meaning we calculate two buckets per element.
*/
est->size = esize + 2 * sizeof(struct nft_hash_elem *);
}
est->lookup = NFT_SET_CLASS_O_1; est->lookup = NFT_SET_CLASS_O_1;
est->space = NFT_SET_CLASS_O_N; est->space = NFT_SET_CLASS_O_N;
......
...@@ -283,13 +283,11 @@ static void nft_rbtree_destroy(const struct nft_set *set) ...@@ -283,13 +283,11 @@ static void nft_rbtree_destroy(const struct nft_set *set)
static bool nft_rbtree_estimate(const struct nft_set_desc *desc, u32 features, static bool nft_rbtree_estimate(const struct nft_set_desc *desc, u32 features,
struct nft_set_estimate *est) struct nft_set_estimate *est)
{ {
unsigned int nsize;
nsize = sizeof(struct nft_rbtree_elem);
if (desc->size) if (desc->size)
est->size = sizeof(struct nft_rbtree) + desc->size * nsize; est->size = sizeof(struct nft_rbtree) +
desc->size * sizeof(struct nft_rbtree_elem);
else else
est->size = nsize; est->size = ~0;
est->lookup = NFT_SET_CLASS_O_LOG_N; est->lookup = NFT_SET_CLASS_O_LOG_N;
est->space = NFT_SET_CLASS_O_N; est->space = NFT_SET_CLASS_O_N;
......
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