After the 'Fixes' commit, the storage is allocated dynamically. Include this when reporting the mem usage. Fixes: 8e5fd2a55e24 ("netfilter: ipset: rework cidr bookkeeping") Signed-off-by: Florian Westphal --- v3: no change. net/netfilter/ipset/ip_set_hash_gen.h | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h index e156ea725f3c..245a5dbd7d5b 100644 --- a/net/netfilter/ipset/ip_set_hash_gen.h +++ b/net/netfilter/ipset/ip_set_hash_gen.h @@ -668,6 +668,23 @@ mtype_rht_size(struct ip_set *set, u32 *elements, size_t *ext_size) *elements = ipset_hash_nelems(h); *ext_size = *elements * (offsetof(struct mtype_rht_elem, elem) + set->dsize); + +#ifdef IP_SET_HASH_WITH_NETS + { + const struct net_prefixes *nets; + int i; + + rcu_read_lock(); + + for (i = 0; i < IPSET_NET_COUNT; i++) { + nets = rcu_dereference(h->rnets[i]); + if (nets) + *ext_size += ksize(nets); + } + + rcu_read_unlock(); + } +#endif } static u32 mtype_remove_key(const void *data, u32 len, u32 seed) @@ -721,11 +738,8 @@ mtype_remove_random(struct ip_set *set, struct htype *h) if (e && !ipset_hash_remove(h, e)) removed = true; - if (removed) { - mtype_del_cidr_all(set, h, &e->elem); - ip_set_ext_destroy(set, &e->elem); - kfree_rcu(e, rcu); - } + if (removed) + ipset_hash_elem_destroy_free(set, h, e); return removed; } -- 2.54.0