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:
Родитель
415e3d3e90
Коммит
44c3d0c1c0
|
@ -540,12 +540,13 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen)
|
|||
}
|
||||
spin_lock_bh(&ip6_sk_fl_lock);
|
||||
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) {
|
||||
if (sfl->fl->label == freq.flr_label) {
|
||||
if (freq.flr_label == (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);
|
||||
fl_release(sfl->fl);
|
||||
kfree_rcu(sfl, rcu);
|
||||
|
|
Загрузка…
Ссылка в новой задаче