From: Ingo Molnar Split off __icmpv6_socket's sk->sk_dst_lock class, because it gets used from softirqs, which is safe for __icmpv6_sockets (because they never get directly used via userspace syscalls), but unsafe for normal sockets. Has no effect on non-lockdep kernels. Signed-off-by: Ingo Molnar Cc: "David S. Miller" Cc: Jeff Garzik Cc: Arjan van de Ven Acked-by: Herbert Xu Signed-off-by: Andrew Morton --- net/ipv6/icmp.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff -puN net/ipv6/icmp.c~lockdep-fix-sk_dst_check-deadlock net/ipv6/icmp.c --- a/net/ipv6/icmp.c~lockdep-fix-sk_dst_check-deadlock +++ a/net/ipv6/icmp.c @@ -714,6 +714,11 @@ discard_it: return 0; } +/* + * Special lock-class for __icmpv6_socket: + */ +static struct lock_class_key icmpv6_socket_sk_dst_lock_key; + int __init icmpv6_init(struct net_proto_family *ops) { struct sock *sk; @@ -732,6 +737,14 @@ int __init icmpv6_init(struct net_proto_ sk = per_cpu(__icmpv6_socket, i)->sk; sk->sk_allocation = GFP_ATOMIC; + /* + * Split off their lock-class, because sk->sk_dst_lock + * gets used from softirqs, which is safe for + * __icmpv6_socket (because those never get directly used + * via userspace syscalls), but unsafe for normal sockets. + */ + lockdep_set_class(&sk->sk_dst_lock, + &icmpv6_socket_sk_dst_lock_key); /* Enough space for 2 64K ICMP packets, including * sk_buff struct overhead. _