WARN_ON(atomic_inc_not_zero(&dst->__refcnt) == 0);
 }
 
-static inline void dst_use(struct dst_entry *dst, unsigned long time)
+static inline void dst_use_noref(struct dst_entry *dst, unsigned long time)
 {
-       dst_hold(dst);
-       dst->__use++;
-       dst->lastuse = time;
+       if (time != dst->lastuse) {
+               dst->__use++;
+               dst->lastuse = time;
+       }
 }
 
-static inline void dst_use_noref(struct dst_entry *dst, unsigned long time)
+static inline void dst_hold_and_use(struct dst_entry *dst, unsigned long time)
 {
-       dst->__use++;
-       dst->lastuse = time;
+       dst_hold(dst);
+       dst_use_noref(dst, time);
 }
 
 static inline struct dst_entry *dst_clone(struct dst_entry *dst)
 
                                           dn_rt_hash_table[hash].chain);
                        rcu_assign_pointer(dn_rt_hash_table[hash].chain, rth);
 
-                       dst_use(&rth->dst, now);
+                       dst_hold_and_use(&rth->dst, now);
                        spin_unlock_bh(&dn_rt_hash_table[hash].lock);
 
                        dst_release_immediate(&rt->dst);
        rcu_assign_pointer(rt->dst.dn_next, dn_rt_hash_table[hash].chain);
        rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt);
 
-       dst_use(&rt->dst, now);
+       dst_hold_and_use(&rt->dst, now);
        spin_unlock_bh(&dn_rt_hash_table[hash].lock);
        *rp = rt;
        return 0;
                            (flp->flowidn_mark == rt->fld.flowidn_mark) &&
                            dn_is_output_route(rt) &&
                            (rt->fld.flowidn_oif == flp->flowidn_oif)) {
-                               dst_use(&rt->dst, jiffies);
+                               dst_hold_and_use(&rt->dst, jiffies);
                                rcu_read_unlock_bh();
                                *pprt = &rt->dst;
                                return 0;
                    (rt->fld.flowidn_oif == 0) &&
                    (rt->fld.flowidn_mark == skb->mark) &&
                    (rt->fld.flowidn_iif == cb->iif)) {
-                       dst_use(&rt->dst, jiffies);
+                       dst_hold_and_use(&rt->dst, jiffies);
                        rcu_read_unlock();
                        skb_dst_set(skb, (struct dst_entry *)rt);
                        return 0;