rcu_read_lock_bh();
        nexthop = rt6_nexthop((struct rt6_info *)dst, daddr);
        neigh = __ipv6_neigh_lookup_noref(dev, nexthop);
-       if (unlikely(!neigh))
-               neigh = __neigh_create(&nd_tbl, nexthop, dev, false);
-       if (!IS_ERR(neigh)) {
-               sock_confirm_neigh(skb, neigh);
-               ret = neigh_output(neigh, skb, false);
-               rcu_read_unlock_bh();
-               return ret;
+
+       if (unlikely(IS_ERR_OR_NULL(neigh))) {
+               if (unlikely(!neigh))
+                       neigh = __neigh_create(&nd_tbl, nexthop, dev, false);
+               if (IS_ERR(neigh)) {
+                       rcu_read_unlock_bh();
+                       IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTNOROUTES);
+                       kfree_skb_reason(skb, SKB_DROP_REASON_NEIGH_CREATEFAIL);
+                       return -EINVAL;
+               }
        }
+       sock_confirm_neigh(skb, neigh);
+       ret = neigh_output(neigh, skb, false);
        rcu_read_unlock_bh();
-
-       IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTNOROUTES);
-       kfree_skb_reason(skb, SKB_DROP_REASON_NEIGH_CREATEFAIL);
-       return -EINVAL;
+       return ret;
 }
 
 static int