Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a87b7dc9 authored by David Ahern's avatar David Ahern Committed by David S. Miller
Browse files

net/ipv6: Move rcu locking to callers of fib6_get_cookie_safe



A later patch protects 'from' in rt6_info and this simplifies the
locking needed by it.

Signed-off-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4d85cd0c
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -234,7 +234,6 @@ static inline bool fib6_get_cookie_safe(const struct fib6_info *f6i,
	struct fib6_node *fn;
	bool status = false;

	rcu_read_lock();
	fn = rcu_dereference(f6i->fib6_node);

	if (fn) {
@@ -244,7 +243,6 @@ static inline bool fib6_get_cookie_safe(const struct fib6_info *f6i,
		status = true;
	}

	rcu_read_unlock();
	return status;
}

@@ -252,10 +250,14 @@ static inline u32 rt6_get_cookie(const struct rt6_info *rt)
{
	u32 cookie = 0;

	rcu_read_lock();

	if (rt->rt6i_flags & RTF_PCPU ||
	    (unlikely(!list_empty(&rt->rt6i_uncached)) && rt->from))
		fib6_get_cookie_safe(rt->from, &cookie);

	rcu_read_unlock();

	return cookie;
}

+10 −3
Original line number Diff line number Diff line
@@ -2159,9 +2159,12 @@ static struct dst_entry *rt6_dst_from_check(struct rt6_info *rt, u32 cookie)

static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
{
	struct dst_entry *dst_ret;
	struct rt6_info *rt;

	rt = (struct rt6_info *) dst;
	rt = container_of(dst, struct rt6_info, dst);

	rcu_read_lock();

	/* All IPV6 dsts are created with ->obsolete set to the value
	 * DST_OBSOLETE_FORCE_CHK which forces validation calls down
@@ -2170,9 +2173,13 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)

	if (rt->rt6i_flags & RTF_PCPU ||
	    (unlikely(!list_empty(&rt->rt6i_uncached)) && rt->from))
		return rt6_dst_from_check(rt, cookie);
		dst_ret = rt6_dst_from_check(rt, cookie);
	else
		return rt6_check(rt, cookie);
		dst_ret = rt6_check(rt, cookie);

	rcu_read_unlock();

	return dst_ret;
}

static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)