@@ -714,11 +714,13 @@ static void check_lifetime(struct work_struct *work)
714714 rcu_read_lock ();
715715 hlist_for_each_entry_rcu (ifa , & inet_addr_lst [i ], hash ) {
716716 unsigned long age , tstamp ;
717+ u32 preferred_lft ;
717718 u32 valid_lft ;
718719
719720 if (ifa -> ifa_flags & IFA_F_PERMANENT )
720721 continue ;
721722
723+ preferred_lft = READ_ONCE (ifa -> ifa_preferred_lft );
722724 valid_lft = READ_ONCE (ifa -> ifa_valid_lft );
723725 tstamp = READ_ONCE (ifa -> ifa_tstamp );
724726 /* We try to batch several events at once. */
@@ -728,20 +730,18 @@ static void check_lifetime(struct work_struct *work)
728730 if (valid_lft != INFINITY_LIFE_TIME &&
729731 age >= valid_lft ) {
730732 change_needed = true;
731- } else if (ifa -> ifa_preferred_lft ==
733+ } else if (preferred_lft ==
732734 INFINITY_LIFE_TIME ) {
733735 continue ;
734- } else if (age >= ifa -> ifa_preferred_lft ) {
736+ } else if (age >= preferred_lft ) {
735737 if (time_before (tstamp + valid_lft * HZ , next ))
736738 next = tstamp + valid_lft * HZ ;
737739
738740 if (!(ifa -> ifa_flags & IFA_F_DEPRECATED ))
739741 change_needed = true;
740- } else if (time_before (tstamp +
741- ifa -> ifa_preferred_lft * HZ ,
742+ } else if (time_before (tstamp + preferred_lft * HZ ,
742743 next )) {
743- next = tstamp +
744- ifa -> ifa_preferred_lft * HZ ;
744+ next = tstamp + preferred_lft * HZ ;
745745 }
746746 }
747747 rcu_read_unlock ();
@@ -818,7 +818,7 @@ static void set_ifa_lifetime(struct in_ifaddr *ifa, __u32 valid_lft,
818818 if (addrconf_finite_timeout (timeout )) {
819819 if (timeout == 0 )
820820 ifa -> ifa_flags |= IFA_F_DEPRECATED ;
821- ifa -> ifa_preferred_lft = timeout ;
821+ WRITE_ONCE ( ifa -> ifa_preferred_lft , timeout ) ;
822822 }
823823 WRITE_ONCE (ifa -> ifa_tstamp , jiffies );
824824 if (!ifa -> ifa_cstamp )
@@ -1698,7 +1698,7 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
16981698
16991699 tstamp = READ_ONCE (ifa -> ifa_tstamp );
17001700 if (!(ifm -> ifa_flags & IFA_F_PERMANENT )) {
1701- preferred = ifa -> ifa_preferred_lft ;
1701+ preferred = READ_ONCE ( ifa -> ifa_preferred_lft ) ;
17021702 valid = READ_ONCE (ifa -> ifa_valid_lft );
17031703 if (preferred != INFINITY_LIFE_TIME ) {
17041704 long tval = (jiffies - tstamp ) / HZ ;
0 commit comments