Skip to content

Commit a5fcf74

Browse files
edumazetdavem330
authored andcommitted
inet: annotate data-races around ifa->ifa_valid_lft
ifa->ifa_valid_lft can be read locklessly. Add appropriate READ_ONCE()/WRITE_ONCE() annotations. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 3cd3e72 commit a5fcf74

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

net/ipv4/devinet.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -714,26 +714,26 @@ 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 valid_lft;
717718

718719
if (ifa->ifa_flags & IFA_F_PERMANENT)
719720
continue;
720721

722+
valid_lft = READ_ONCE(ifa->ifa_valid_lft);
721723
tstamp = READ_ONCE(ifa->ifa_tstamp);
722724
/* We try to batch several events at once. */
723725
age = (now - tstamp +
724726
ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
725727

726-
if (ifa->ifa_valid_lft != INFINITY_LIFE_TIME &&
727-
age >= ifa->ifa_valid_lft) {
728+
if (valid_lft != INFINITY_LIFE_TIME &&
729+
age >= valid_lft) {
728730
change_needed = true;
729731
} else if (ifa->ifa_preferred_lft ==
730732
INFINITY_LIFE_TIME) {
731733
continue;
732734
} else if (age >= ifa->ifa_preferred_lft) {
733-
if (time_before(tstamp +
734-
ifa->ifa_valid_lft * HZ, next))
735-
next = tstamp +
736-
ifa->ifa_valid_lft * HZ;
735+
if (time_before(tstamp + valid_lft * HZ, next))
736+
next = tstamp + valid_lft * HZ;
737737

738738
if (!(ifa->ifa_flags & IFA_F_DEPRECATED))
739739
change_needed = true;
@@ -810,7 +810,7 @@ static void set_ifa_lifetime(struct in_ifaddr *ifa, __u32 valid_lft,
810810

811811
timeout = addrconf_timeout_fixup(valid_lft, HZ);
812812
if (addrconf_finite_timeout(timeout))
813-
ifa->ifa_valid_lft = timeout;
813+
WRITE_ONCE(ifa->ifa_valid_lft, timeout);
814814
else
815815
ifa->ifa_flags |= IFA_F_PERMANENT;
816816

@@ -1699,7 +1699,7 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
16991699
tstamp = READ_ONCE(ifa->ifa_tstamp);
17001700
if (!(ifm->ifa_flags & IFA_F_PERMANENT)) {
17011701
preferred = ifa->ifa_preferred_lft;
1702-
valid = ifa->ifa_valid_lft;
1702+
valid = READ_ONCE(ifa->ifa_valid_lft);
17031703
if (preferred != INFINITY_LIFE_TIME) {
17041704
long tval = (jiffies - tstamp) / HZ;
17051705

0 commit comments

Comments
 (0)