Merge tag 'hsi-for-4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-hsi
[linux-2.6-block.git] / include / net / dst.h
index 694c2e6ae618df5347e8e54d8741e9985925236d..b091fd536098918e425394c55c46aae33e923239 100644 (file)
@@ -102,7 +102,7 @@ struct dst_entry {
        union {
                struct dst_entry        *next;
                struct rtable __rcu     *rt_next;
-               struct rt6_info         *rt6_next;
+               struct rt6_info __rcu   *rt6_next;
                struct dn_route __rcu   *dn_next;
        };
 };
@@ -256,17 +256,18 @@ static inline void dst_hold(struct dst_entry *dst)
        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 (unlikely(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)