Commit eaf22826 authored by Steffen Klassert's avatar Steffen Klassert
Browse files

Revert "xfrm: policy: Read seqcount outside of rcu-read side in xfrm_policy_lookup_bytype"



This reverts commit d7b04089.

This commit tried to fix a locking bug introduced by commit 77cc278f
("xfrm: policy: Use sequence counters with associated lock"). As it
turned out, this patch did not really fix the bug. A proper fix
for this bug is applied on top of this revert.

Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent 7c1a80e8
Loading
Loading
Loading
Loading
+7 −14
Original line number Diff line number Diff line
@@ -2092,15 +2092,12 @@ static struct xfrm_policy *xfrm_policy_lookup_bytype(struct net *net, u8 type,
	if (unlikely(!daddr || !saddr))
		return NULL;

	rcu_read_lock();
 retry:
	do {
		sequence = read_seqcount_begin(&xfrm_policy_hash_generation);
	rcu_read_lock();

		chain = policy_hash_direct(net, daddr, saddr, family, dir);
	if (read_seqcount_retry(&xfrm_policy_hash_generation, sequence)) {
		rcu_read_unlock();
		goto retry;
	}
	} while (read_seqcount_retry(&xfrm_policy_hash_generation, sequence));

	ret = NULL;
	hlist_for_each_entry_rcu(pol, chain, bydst) {
@@ -2131,15 +2128,11 @@ static struct xfrm_policy *xfrm_policy_lookup_bytype(struct net *net, u8 type,
	}

skip_inexact:
	if (read_seqcount_retry(&xfrm_policy_hash_generation, sequence)) {
		rcu_read_unlock();
	if (read_seqcount_retry(&xfrm_policy_hash_generation, sequence))
		goto retry;
	}

	if (ret && !xfrm_pol_hold_rcu(ret)) {
		rcu_read_unlock();
	if (ret && !xfrm_pol_hold_rcu(ret))
		goto retry;
	}
fail:
	rcu_read_unlock();