neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->dst.dev);
        if (!neigh || !(neigh->nud_state & NUD_VALID)) {
                rcu_read_lock();
-               neigh_event_send(dst_get_neighbour(&rt->dst), NULL);
+               neigh_event_send(dst_get_neighbour_noref(&rt->dst), NULL);
                rcu_read_unlock();
                ret = -ENODATA;
                if (neigh)
        }
 
        rcu_read_lock();
-       neigh = dst_get_neighbour(dst);
+       neigh = dst_get_neighbour_noref(dst);
        if (!neigh || !(neigh->nud_state & NUD_VALID)) {
                if (neigh)
                        neigh_event_send(neigh, NULL);
 
        }
        dst = &rt->dst;
        rcu_read_lock();
-       neigh = dst_get_neighbour(dst);
+       neigh = dst_get_neighbour_noref(dst);
        l2t = t3_l2t_get(tdev, neigh, neigh->dev);
        rcu_read_unlock();
        if (!l2t) {
        ep->dst = &rt->dst;
 
        rcu_read_lock();
-       neigh = dst_get_neighbour(ep->dst);
+       neigh = dst_get_neighbour_noref(ep->dst);
 
        /* get a l2t entry */
        ep->l2t = t3_l2t_get(ep->com.tdev, neigh, neigh->dev);
 
        }
        dst = &rt->dst;
        rcu_read_lock();
-       neigh = dst_get_neighbour(dst);
+       neigh = dst_get_neighbour_noref(dst);
        if (neigh->dev->flags & IFF_LOOPBACK) {
                pdev = ip_dev_find(&init_net, peer_ip);
                BUG_ON(!pdev);
        ep->dst = &rt->dst;
 
        rcu_read_lock();
-       neigh = dst_get_neighbour(ep->dst);
+       neigh = dst_get_neighbour_noref(ep->dst);
 
        /* get a l2t entry */
        if (neigh->dev->flags & IFF_LOOPBACK) {
        ep->dst = &rt->dst;
 
        rcu_read_lock();
-       neigh = dst_get_neighbour(ep->dst);
+       neigh = dst_get_neighbour_noref(ep->dst);
 
        /* get a l2t entry */
        if (neigh->dev->flags & IFF_LOOPBACK) {
 
 
        if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID))) {
                rcu_read_lock();
-               neigh_event_send(dst_get_neighbour(&rt->dst), NULL);
+               neigh_event_send(dst_get_neighbour_noref(&rt->dst), NULL);
                rcu_read_unlock();
        }
        ip_rt_put(rt);
 
        struct neighbour *n;
        unsigned long flags;
 
-       n = dst_get_neighbour(skb_dst(skb));
+       n = dst_get_neighbour_noref(skb_dst(skb));
        neigh = ipoib_neigh_alloc(n, skb->dev);
        if (!neigh) {
                ++dev->stats.tx_dropped;
        struct neighbour *n;
 
        /* Look up path record for unicasts */
-       n = dst_get_neighbour(dst);
+       n = dst_get_neighbour_noref(dst);
        if (n->ha[4] != 0xff) {
                neigh_add_path(skb, dev);
                return;
 
        rcu_read_lock();
        if (likely(skb_dst(skb)))
-               n = dst_get_neighbour(skb_dst(skb));
+               n = dst_get_neighbour_noref(skb_dst(skb));
 
        if (likely(n)) {
                if (unlikely(!*to_ipoib_neigh(n))) {
        dst = skb_dst(skb);
        n = NULL;
        if (dst)
-               n = dst_get_neighbour_raw(dst);
+               n = dst_get_neighbour_noref_raw(dst);
        if ((!dst || !n) && daddr) {
                struct ipoib_pseudoheader *phdr =
                        (struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr);
 
 
                skb->dev = dev;
                if (dst)
-                       n = dst_get_neighbour_raw(dst);
+                       n = dst_get_neighbour_noref_raw(dst);
                if (!dst || !n) {
                        /* put pseudoheader back on for next time */
                        skb_push(skb, sizeof (struct ipoib_pseudoheader));
 
                rcu_read_lock();
                if (dst)
-                       n = dst_get_neighbour(dst);
+                       n = dst_get_neighbour_noref(dst);
                if (n && !*to_ipoib_neigh(n)) {
                        struct ipoib_neigh *neigh = ipoib_neigh_alloc(n,
                                                                      skb->dev);
 
        case (NETEVENT_REDIRECT):{
                struct netevent_redirect *nr = ctx;
                cxgb_redirect(nr->old, nr->new);
-               cxgb_neigh_update(dst_get_neighbour(nr->new));
+               cxgb_neigh_update(dst_get_neighbour_noref(nr->new));
                break;
        }
        default:
        struct l2t_entry *e;
        struct t3c_tid_entry *te;
 
-       olddev = dst_get_neighbour(old)->dev;
-       newdev = dst_get_neighbour(new)->dev;
+       olddev = dst_get_neighbour_noref(old)->dev;
+       newdev = dst_get_neighbour_noref(new)->dev;
        if (!is_offloading(olddev))
                return;
        if (!is_offloading(newdev)) {
        }
 
        /* Add new L2T entry */
-       e = t3_l2t_get(tdev, dst_get_neighbour(new), newdev);
+       e = t3_l2t_get(tdev, dst_get_neighbour_noref(new), newdev);
        if (!e) {
                printk(KERN_ERR "%s: couldn't allocate new l2t entry!\n",
                       __func__);
 
        rcu_read_lock();
        dst = skb_dst(skb);
        if (dst)
-               n = dst_get_neighbour(dst);
+               n = dst_get_neighbour_noref(dst);
        if (n) {
                cast_type = n->type;
                rcu_read_unlock();
        rcu_read_lock();
        dst = skb_dst(skb);
        if (dst)
-               n = dst_get_neighbour(dst);
+               n = dst_get_neighbour_noref(dst);
        if (ipv == 4) {
                /* IPv4 */
                hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags4(cast_type);
 
                csk->saddr.sin_addr.s_addr = chba->ipv4addr;
 
        csk->rss_qid = 0;
-       csk->l2t = t3_l2t_get(t3dev, dst_get_neighbour(dst), ndev);
+       csk->l2t = t3_l2t_get(t3dev, dst_get_neighbour_noref(dst), ndev);
        if (!csk->l2t) {
                pr_err("NO l2t available.\n");
                return -EINVAL;
 
        cxgbi_sock_set_flag(csk, CTPF_HAS_ATID);
        cxgbi_sock_get(csk);
 
-       csk->l2t = cxgb4_l2t_get(lldi->l2t, dst_get_neighbour(csk->dst), ndev, 0);
+       csk->l2t = cxgb4_l2t_get(lldi->l2t, dst_get_neighbour_noref(csk->dst), ndev, 0);
        if (!csk->l2t) {
                pr_err("%s, cannot alloc l2t.\n", ndev->name);
                goto rel_resource;
 
                goto err_out;
        }
        dst = &rt->dst;
-       ndev = dst_get_neighbour(dst)->dev;
+       ndev = dst_get_neighbour_noref(dst)->dev;
 
        if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) {
                pr_info("multi-cast route %pI4, port %u, dev %s.\n",
                ndev = ip_dev_find(&init_net, daddr->sin_addr.s_addr);
                mtu = ndev->mtu;
                pr_info("rt dev %s, loopback -> %s, mtu %u.\n",
-                       dst_get_neighbour(dst)->dev->name, ndev->name, mtu);
+                       dst_get_neighbour_noref(dst)->dev->name, ndev->name, mtu);
        }
 
        cdev = cxgbi_device_find_by_netdev(ndev, &port);
 
        };
 };
 
-static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst)
+static inline struct neighbour *dst_get_neighbour_noref(struct dst_entry *dst)
 {
        return rcu_dereference(dst->_neighbour);
 }
 
-static inline struct neighbour *dst_get_neighbour_raw(struct dst_entry *dst)
+static inline struct neighbour *dst_get_neighbour_noref_raw(struct dst_entry *dst)
 {
        return rcu_dereference_raw(dst->_neighbour);
 }
                struct neighbour *n;
 
                rcu_read_lock();
-               n = dst_get_neighbour(dst);
+               n = dst_get_neighbour_noref(dst);
                neigh_confirm(n);
                rcu_read_unlock();
        }
 
                dev->stats.tx_dropped++;
                return NETDEV_TX_OK;
        }
-       n = dst_get_neighbour(dst);
+       n = dst_get_neighbour_noref(dst);
        if (!n) {
                pr_err("NO NEIGHBOUR !\n");
                dev_kfree_skb(skb);
 
        if (!skb->dev)
                goto free_skb;
        dst = skb_dst(skb);
-       neigh = dst_get_neighbour(dst);
+       neigh = dst_get_neighbour_noref(dst);
        if (neigh->hh.hh_len) {
                neigh_hh_bridge(&neigh->hh, skb);
                skb->dev = nf_bridge->physindev;
 
                dev_hold(dst->dev);
                dev_put(dev);
                rcu_read_lock();
-               neigh = dst_get_neighbour(dst);
+               neigh = dst_get_neighbour_noref(dst);
                if (neigh && neigh->dev == dev) {
                        neigh->dev = dst->dev;
                        dev_hold(dst->dev);
 
 
                        rcu_read_lock();
                        /* On shaper/eql skb->dst->neighbour != neigh :( */
-                       if (dst && (n2 = dst_get_neighbour(dst)) != NULL)
+                       if (dst && (n2 = dst_get_neighbour_noref(dst)) != NULL)
                                n1 = n2;
                        n1->output(n1, skb);
                        rcu_read_unlock();
 
 {
        struct dst_entry *dst = skb_dst(skb);
        struct dn_route *rt = (struct dn_route *)dst;
-       struct neighbour *neigh = dst_get_neighbour(dst);
+       struct neighbour *neigh = dst_get_neighbour_noref(dst);
        struct net_device *dev = neigh->dev;
        char mac_addr[ETH_ALEN];
 
 
  */
 static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu)
 {
-       struct neighbour *n = dst_get_neighbour(dst);
+       struct neighbour *n = dst_get_neighbour_noref(dst);
        u32 min_mtu = 230;
        struct dn_dev *dn;
 
 static int dn_to_neigh_output(struct sk_buff *skb)
 {
        struct dst_entry *dst = skb_dst(skb);
-       struct neighbour *n = dst_get_neighbour(dst);
+       struct neighbour *n = dst_get_neighbour_noref(dst);
 
        return n->output(n, skb);
 }
 
        int err = -EINVAL;
 
-       if ((neigh = dst_get_neighbour(dst)) == NULL)
+       if ((neigh = dst_get_neighbour_noref(dst)) == NULL)
                goto error;
 
        skb->dev = dev;
        }
        rt->rt_type = res->type;
 
-       if (dev != NULL && dst_get_neighbour(&rt->dst) == NULL) {
+       if (dev != NULL && dst_get_neighbour_noref(&rt->dst) == NULL) {
                n = __neigh_lookup_errno(&dn_neigh_table, &rt->rt_gateway, dev);
                if (IS_ERR(n))
                        return PTR_ERR(n);
 
                }
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
                else if (skb->protocol == htons(ETH_P_IPV6)) {
-                       struct neighbour *neigh = dst_get_neighbour(skb_dst(skb));
+                       struct neighbour *neigh = dst_get_neighbour_noref(skb_dst(skb));
                        const struct in6_addr *addr6;
                        int addr_type;
 
 
        }
 
        rcu_read_lock();
-       neigh = dst_get_neighbour(dst);
+       neigh = dst_get_neighbour_noref(dst);
        if (neigh) {
                int res = neigh_output(neigh, skb);
 
 
                int len, HHUptod;
 
                rcu_read_lock();
-               n = dst_get_neighbour(&r->dst);
+               n = dst_get_neighbour_noref(&r->dst);
                HHUptod = (n && (n->nud_state & NUD_CONNECTED)) ? 1 : 0;
                rcu_read_unlock();
 
 
         * layer address of our nexhop router
         */
 
-       if (dst_get_neighbour_raw(&rt->dst) == NULL)
+       if (dst_get_neighbour_noref_raw(&rt->dst) == NULL)
                ifa->flags &= ~IFA_F_OPTIMISTIC;
 
        ifa->idev = idev;
 
                        RT6_TRACE("aging clone %p\n", rt);
                        return -1;
                } else if ((rt->rt6i_flags & RTF_GATEWAY) &&
-                          (!(dst_get_neighbour_raw(&rt->dst)->flags & NTF_ROUTER))) {
+                          (!(dst_get_neighbour_noref_raw(&rt->dst)->flags & NTF_ROUTER))) {
                        RT6_TRACE("purging route %p via non-router but gateway\n",
                                  rt);
                        return -1;
 
        }
 
        rcu_read_lock();
-       neigh = dst_get_neighbour(dst);
+       neigh = dst_get_neighbour_noref(dst);
        if (neigh) {
                int res = neigh_output(neigh, skb);
 
           send redirects to source routed frames.
           We don't send redirects to frames decapsulated from IPsec.
         */
-       n = dst_get_neighbour(dst);
+       n = dst_get_neighbour_noref(dst);
        if (skb->dev == dst->dev && n && opt->srcrt == 0 && !skb_sec_path(skb)) {
                struct in6_addr *target = NULL;
                struct rt6_info *rt;
         * dst entry of the nexthop router
         */
        rcu_read_lock();
-       n = dst_get_neighbour(*dst);
+       n = dst_get_neighbour_noref(*dst);
        if (n && !(n->nud_state & NUD_VALID)) {
                struct inet6_ifaddr *ifp;
                struct flowi6 fl_gw6;
 
        rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
 
        if (rt)
-               neigh = dst_get_neighbour(&rt->dst);
+               neigh = dst_get_neighbour_noref(&rt->dst);
 
        if (rt && lifetime == 0) {
                neigh_clone(neigh);
                        return;
                }
 
-               neigh = dst_get_neighbour(&rt->dst);
+               neigh = dst_get_neighbour_noref(&rt->dst);
                if (neigh == NULL) {
                        ND_PRINTK0(KERN_ERR
                                   "ICMPv6 RA: %s() got default router without neighbour.\n",
 
         * to no more than one per minute.
         */
        rcu_read_lock();
-       neigh = rt ? dst_get_neighbour(&rt->dst) : NULL;
+       neigh = rt ? dst_get_neighbour_noref(&rt->dst) : NULL;
        if (!neigh || (neigh->nud_state & NUD_VALID))
                goto out;
        read_lock_bh(&neigh->lock);
        int m;
 
        rcu_read_lock();
-       neigh = dst_get_neighbour(&rt->dst);
+       neigh = dst_get_neighbour_noref(&rt->dst);
        if (rt->rt6i_flags & RTF_NONEXTHOP ||
            !(rt->rt6i_flags & RTF_GATEWAY))
                m = 1;
 
        if (rt) {
                rt->rt6i_flags |= RTF_CACHE;
-               dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_raw(&ort->dst)));
+               dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_noref_raw(&ort->dst)));
        }
        return rt;
 }
        dst_hold(&rt->dst);
        read_unlock_bh(&table->tb6_lock);
 
-       if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
+       if (!dst_get_neighbour_noref_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
                nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr);
        else if (!(rt->dst.flags & DST_HOST))
                nrt = rt6_alloc_clone(rt, &fl6->daddr);
        dst_confirm(&rt->dst);
 
        /* Duplicate redirect: silently ignore. */
-       if (neigh == dst_get_neighbour_raw(&rt->dst))
+       if (neigh == dst_get_neighbour_noref_raw(&rt->dst))
                goto out;
 
        nrt = ip6_rt_copy(rt, dest);
           1. It is connected route. Action: COW
           2. It is gatewayed route or NONEXTHOP route. Action: clone it.
         */
-       if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
+       if (!dst_get_neighbour_noref_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
                nrt = rt6_alloc_cow(rt, daddr, saddr);
        else
                nrt = rt6_alloc_clone(rt, daddr);
                goto nla_put_failure;
 
        rcu_read_lock();
-       n = dst_get_neighbour(&rt->dst);
+       n = dst_get_neighbour_noref(&rt->dst);
        if (n)
                NLA_PUT(skb, RTA_GATEWAY, 16, &n->primary_key);
        rcu_read_unlock();
        seq_puts(m, "00000000000000000000000000000000 00 ");
 #endif
        rcu_read_lock();
-       n = dst_get_neighbour(&rt->dst);
+       n = dst_get_neighbour_noref(&rt->dst);
        if (n) {
                seq_printf(m, "%pi6", n->primary_key);
        } else {
 
                struct neighbour *neigh = NULL;
 
                if (skb_dst(skb))
-                       neigh = dst_get_neighbour(skb_dst(skb));
+                       neigh = dst_get_neighbour_noref(skb_dst(skb));
 
                if (neigh == NULL) {
                        if (net_ratelimit())
                struct neighbour *neigh = NULL;
 
                if (skb_dst(skb))
-                       neigh = dst_get_neighbour(skb_dst(skb));
+                       neigh = dst_get_neighbour_noref(skb_dst(skb));
 
                if (neigh == NULL) {
                        if (net_ratelimit())
 
                return 0;
 
        rcu_read_lock();
-       mn = dst_get_neighbour(dst);
+       mn = dst_get_neighbour_noref(dst);
        res = mn ? __teql_resolve(skb, skb_res, dev, txq, mn) : 0;
        rcu_read_unlock();
 
 
                goto free_dst;
 
        /* Copy neighbour for reachability confirmation */
-       dst_set_neighbour(dst0, neigh_clone(dst_get_neighbour(dst)));
+       dst_set_neighbour(dst0, neigh_clone(dst_get_neighbour_noref(dst)));
 
        xfrm_init_path((struct xfrm_dst *)dst0, dst, nfheader_len);
        xfrm_init_pmtu(dst_prev);