mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 12:16:41 +00:00
xfrm: policy: remove remaining use of inexact list
No consumers anymore, remove it. After this, insertion of policies no longer require list walk of all inexact policies but only those that are reachable via the candidate sets. This gives almost linear insertion speeds provided the inserted policies are for non-overlapping networks. Before: Inserted 1000 policies in 70 ms Inserted 10000 policies in 1155 ms Inserted 100000 policies in 216848 ms After: Inserted 1000 policies in 56 ms Inserted 10000 policies in 478 ms Inserted 100000 policies in 4580 ms Insertion of 1m entries takes about ~40s after this change on my test vm. Cc: Noel Kuntze <noel@familie-kuntze.de> Cc: Tobias Brunner <tobias@strongswan.org> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
563d5ca93e
commit
a54ad727f7
@ -555,7 +555,6 @@ struct xfrm_policy {
|
||||
u16 family;
|
||||
struct xfrm_sec_ctx *security;
|
||||
struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH];
|
||||
struct hlist_node bydst_inexact_list;
|
||||
struct rcu_head rcu;
|
||||
|
||||
struct xfrm_dev_offload xdo;
|
||||
|
@ -196,8 +196,6 @@ xfrm_policy_inexact_lookup_rcu(struct net *net,
|
||||
static struct xfrm_policy *
|
||||
xfrm_policy_insert_list(struct hlist_head *chain, struct xfrm_policy *policy,
|
||||
bool excl);
|
||||
static void xfrm_policy_insert_inexact_list(struct hlist_head *chain,
|
||||
struct xfrm_policy *policy);
|
||||
|
||||
static bool
|
||||
xfrm_policy_find_inexact_candidates(struct xfrm_pol_inexact_candidates *cand,
|
||||
@ -410,7 +408,6 @@ struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp)
|
||||
if (policy) {
|
||||
write_pnet(&policy->xp_net, net);
|
||||
INIT_LIST_HEAD(&policy->walk.all);
|
||||
INIT_HLIST_NODE(&policy->bydst_inexact_list);
|
||||
INIT_HLIST_NODE(&policy->bydst);
|
||||
INIT_HLIST_NODE(&policy->byidx);
|
||||
rwlock_init(&policy->lock);
|
||||
@ -1228,9 +1225,6 @@ xfrm_policy_inexact_insert(struct xfrm_policy *policy, u8 dir, int excl)
|
||||
return ERR_PTR(-EEXIST);
|
||||
}
|
||||
|
||||
chain = &net->xfrm.policy_inexact[dir];
|
||||
xfrm_policy_insert_inexact_list(chain, policy);
|
||||
|
||||
if (delpol)
|
||||
__xfrm_policy_inexact_prune_bin(bin, false);
|
||||
|
||||
@ -1346,7 +1340,6 @@ static void xfrm_hash_rebuild(struct work_struct *work)
|
||||
}
|
||||
|
||||
hlist_del_rcu(&policy->bydst);
|
||||
hlist_del_init(&policy->bydst_inexact_list);
|
||||
|
||||
newpos = NULL;
|
||||
chain = policy_hash_bysel(net, &policy->selector,
|
||||
@ -1515,36 +1508,6 @@ static const struct rhashtable_params xfrm_pol_inexact_params = {
|
||||
.automatic_shrinking = true,
|
||||
};
|
||||
|
||||
static void xfrm_policy_insert_inexact_list(struct hlist_head *chain,
|
||||
struct xfrm_policy *policy)
|
||||
{
|
||||
struct xfrm_policy *pol, *delpol = NULL;
|
||||
struct hlist_node *newpos = NULL;
|
||||
|
||||
hlist_for_each_entry(pol, chain, bydst_inexact_list) {
|
||||
if (pol->type == policy->type &&
|
||||
pol->if_id == policy->if_id &&
|
||||
!selector_cmp(&pol->selector, &policy->selector) &&
|
||||
xfrm_policy_mark_match(&policy->mark, pol) &&
|
||||
xfrm_sec_ctx_match(pol->security, policy->security) &&
|
||||
!WARN_ON(delpol)) {
|
||||
delpol = pol;
|
||||
if (policy->priority > pol->priority)
|
||||
continue;
|
||||
} else if (policy->priority >= pol->priority) {
|
||||
newpos = &pol->bydst_inexact_list;
|
||||
continue;
|
||||
}
|
||||
if (delpol)
|
||||
break;
|
||||
}
|
||||
|
||||
if (newpos && policy->xdo.type != XFRM_DEV_OFFLOAD_PACKET)
|
||||
hlist_add_behind_rcu(&policy->bydst_inexact_list, newpos);
|
||||
else
|
||||
hlist_add_head_rcu(&policy->bydst_inexact_list, chain);
|
||||
}
|
||||
|
||||
static struct xfrm_policy *xfrm_policy_insert_list(struct hlist_head *chain,
|
||||
struct xfrm_policy *policy,
|
||||
bool excl)
|
||||
@ -2346,7 +2309,6 @@ static struct xfrm_policy *__xfrm_policy_unlink(struct xfrm_policy *pol,
|
||||
/* Socket policies are not hashed. */
|
||||
if (!hlist_unhashed(&pol->bydst)) {
|
||||
hlist_del_rcu(&pol->bydst);
|
||||
hlist_del_init(&pol->bydst_inexact_list);
|
||||
hlist_del(&pol->byidx);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user