static inline void dst_set_expires(struct dst_entry *dst, int timeout)
 {
-       unsigned long expires = jiffies + timeout;
+       unsigned long old, expires = jiffies + timeout;
 
        if (expires == 0)
                expires = 1;
 
-       if (dst->expires == 0 || time_before(expires, dst->expires))
-               dst->expires = expires;
+       old = READ_ONCE(dst->expires);
+
+       if (!old || time_before(expires, old))
+               WRITE_ONCE(dst->expires, expires);
 }
 
 static inline unsigned int dst_dev_overhead(struct dst_entry *dst,
 
            ip_mtu_locked(dst) ||
            !forwarding) {
                mtu = rt->rt_pmtu;
-               if (mtu && time_before(jiffies, rt->dst.expires))
+               if (mtu && time_before(jiffies, READ_ONCE(rt->dst.expires)))
                        goto out;
        }
 
 
 
        if ((READ_ONCE(dst->obsolete) > 0) ||
            (rt->rt_flags & RTCF_REDIRECTED) ||
-           rt->dst.expires)
+           READ_ONCE(rt->dst.expires))
                sk_dst_reset(sk);
 }
 
        }
 
        if (rt->rt_pmtu == mtu && !lock &&
-           time_before(jiffies, dst->expires - net->ipv4.ip_rt_mtu_expires / 2))
+           time_before(jiffies, READ_ONCE(dst->expires) -
+                                net->ipv4.ip_rt_mtu_expires / 2))
                goto out;
 
        if (fib_lookup(net, fl4, &res, 0) == 0) {
                }
        }
 
-       expires = rt->dst.expires;
+       expires = READ_ONCE(rt->dst.expires);
        if (expires) {
                unsigned long now = jiffies;
 
 
 static bool __rt6_check_expired(const struct rt6_info *rt)
 {
        if (rt->rt6i_flags & RTF_EXPIRES)
-               return time_after(jiffies, rt->dst.expires);
-       else
-               return false;
+               return time_after(jiffies, READ_ONCE(rt->dst.expires));
+       return false;
 }
 
 static bool rt6_check_expired(const struct rt6_info *rt)
        from = rcu_dereference(rt->from);
 
        if (rt->rt6i_flags & RTF_EXPIRES) {
-               if (time_after(jiffies, rt->dst.expires))
+               if (time_after(jiffies, READ_ONCE(rt->dst.expires)))
                        return true;
        } else if (from) {
                return READ_ONCE(rt->dst.obsolete) != DST_OBSOLETE_FORCE_CHK ||
                        rt6_remove_exception(bucket, rt6_ex);
                        return;
                }
-       } else if (time_after(jiffies, rt->dst.expires)) {
+       } else if (time_after(jiffies, READ_ONCE(rt->dst.expires))) {
                pr_debug("purging expired route %p\n", rt);
                rt6_remove_exception(bucket, rt6_ex);
                return;
                rcu_read_lock();
                from = rcu_dereference(rt0->from);
                if (from)
-                       rt0->dst.expires = from->expires;
+                       WRITE_ONCE(rt0->dst.expires, from->expires);
                rcu_read_unlock();
        }
 
        }
 
        if (rt6_flags & RTF_EXPIRES) {
-               expires = dst ? dst->expires : rt->expires;
+               expires = dst ? READ_ONCE(dst->expires) : rt->expires;
                expires -= jiffies;
        }