ipv6: fix a lockdep splat
Silence lockdep false positive about rcu_dereference() being
used in the wrong context.
First one should use rcu_dereference_protected() as we own the spinlock.
Second one should be a normal assignation, as no barrier is needed.
Fixes: 18367681a1
("ipv6 flowlabel: Convert np->ipv6_fl_list to RCU.")
Reported-by: Dave Jones <davej@codemonkey.org.uk>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
415e3d3e90
commit
44c3d0c1c0
|
@ -540,12 +540,13 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen)
|
||||||
}
|
}
|
||||||
spin_lock_bh(&ip6_sk_fl_lock);
|
spin_lock_bh(&ip6_sk_fl_lock);
|
||||||
for (sflp = &np->ipv6_fl_list;
|
for (sflp = &np->ipv6_fl_list;
|
||||||
(sfl = rcu_dereference(*sflp)) != NULL;
|
(sfl = rcu_dereference_protected(*sflp,
|
||||||
|
lockdep_is_held(&ip6_sk_fl_lock))) != NULL;
|
||||||
sflp = &sfl->next) {
|
sflp = &sfl->next) {
|
||||||
if (sfl->fl->label == freq.flr_label) {
|
if (sfl->fl->label == freq.flr_label) {
|
||||||
if (freq.flr_label == (np->flow_label&IPV6_FLOWLABEL_MASK))
|
if (freq.flr_label == (np->flow_label&IPV6_FLOWLABEL_MASK))
|
||||||
np->flow_label &= ~IPV6_FLOWLABEL_MASK;
|
np->flow_label &= ~IPV6_FLOWLABEL_MASK;
|
||||||
*sflp = rcu_dereference(sfl->next);
|
*sflp = sfl->next;
|
||||||
spin_unlock_bh(&ip6_sk_fl_lock);
|
spin_unlock_bh(&ip6_sk_fl_lock);
|
||||||
fl_release(sfl->fl);
|
fl_release(sfl->fl);
|
||||||
kfree_rcu(sfl, rcu);
|
kfree_rcu(sfl, rcu);
|
||||||
|
|
Loading…
Reference in New Issue