static DEFINE_PER_CPU(struct sock *, __icmp_sk) = NULL;
 #define icmp_sk                __get_cpu_var(__icmp_sk)
 
-static inline int icmp_xmit_lock(void)
+static inline int icmp_xmit_lock(struct sock *sk)
 {
        local_bh_disable();
 
-       if (unlikely(!spin_trylock(&icmp_sk->sk_lock.slock))) {
+       if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
                /* This can happen if the output path signals a
                 * dst_link_failure() for an outgoing ICMP packet.
                 */
        return 0;
 }
 
-static inline void icmp_xmit_unlock(void)
+static inline void icmp_xmit_unlock(struct sock *sk)
 {
-       spin_unlock_bh(&icmp_sk->sk_lock.slock);
+       spin_unlock_bh(&sk->sk_lock.slock);
 }
 
 /*
        if (ip_options_echo(&icmp_param->replyopts, skb))
                return;
 
-       if (icmp_xmit_lock())
+       if (icmp_xmit_lock(sk))
                return;
 
        icmp_param->data.icmph.checksum = 0;
                icmp_push_reply(icmp_param, &ipc, rt);
        ip_rt_put(rt);
 out_unlock:
-       icmp_xmit_unlock();
+       icmp_xmit_unlock(sk);
 }
 
 
        __be32 saddr;
        u8  tos;
        struct net *net;
+       struct sock *sk = icmp_sk;
 
        if (!rt)
                goto out;
                }
        }
 
-       if (icmp_xmit_lock())
+       if (icmp_xmit_lock(sk))
                return;
 
        /*
        icmp_param.data.icmph.checksum   = 0;
        icmp_param.skb    = skb_in;
        icmp_param.offset = skb_network_offset(skb_in);
-       inet_sk(icmp_sk)->tos = tos;
+       inet_sk(sk)->tos = tos;
        ipc.addr = iph->saddr;
        ipc.opt = &icmp_param.replyopts;
 
 ende:
        ip_rt_put(rt);
 out_unlock:
-       icmp_xmit_unlock();
+       icmp_xmit_unlock(sk);
 out:;
 }
 
 
        .flags          =       INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
 };
 
-static __inline__ int icmpv6_xmit_lock(void)
+static __inline__ int icmpv6_xmit_lock(struct sock *sk)
 {
        local_bh_disable();
 
-       if (unlikely(!spin_trylock(&icmpv6_sk->sk_lock.slock))) {
+       if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
                /* This can happen if the output path (f.e. SIT or
                 * ip6ip6 tunnel) signals dst_link_failure() for an
                 * outgoing ICMP6 packet.
        return 0;
 }
 
-static __inline__ void icmpv6_xmit_unlock(void)
+static __inline__ void icmpv6_xmit_unlock(struct sock *sk)
 {
-       spin_unlock_bh(&icmpv6_sk->sk_lock.slock);
+       spin_unlock_bh(&sk->sk_lock.slock);
 }
 
 /*
        fl.fl_icmp_code = code;
        security_skb_classify_flow(skb, &fl);
 
-       if (icmpv6_xmit_lock())
-               return;
-
        sk = icmpv6_sk;
        np = inet6_sk(sk);
 
+       if (icmpv6_xmit_lock(sk))
+               return;
+
        if (!icmpv6_xrlim_allow(sk, type, &fl))
                goto out;
 
 out_dst_release:
        dst_release(dst);
 out:
-       icmpv6_xmit_unlock();
+       icmpv6_xmit_unlock(sk);
 }
 
 EXPORT_SYMBOL(icmpv6_send);
        fl.fl_icmp_type = ICMPV6_ECHO_REPLY;
        security_skb_classify_flow(skb, &fl);
 
-       if (icmpv6_xmit_lock())
-               return;
-
        sk = icmpv6_sk;
        np = inet6_sk(sk);
 
+       if (icmpv6_xmit_lock(sk))
+               return;
+
        if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst))
                fl.oif = np->mcast_oif;
 
                in6_dev_put(idev);
        dst_release(dst);
 out:
-       icmpv6_xmit_unlock();
+       icmpv6_xmit_unlock(sk);
 }
 
 static void icmpv6_notify(struct sk_buff *skb, int type, int code, __be32 info)