History

ipv4: Fix data-races around sysctl_fib_multipath_hash_fields.

While reading sysctl_fib_multipath_hash_fields, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.

Kuniyuki Iwashima committed 4 years ago

Commit 8895a9c1 parent 7998c122 files · +4 −4Browse files

Unified · Split

2 files
  1. drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +1 −1
  2. net/ipv4/route.c +3 −3
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c+1−1
@@ -10342,7 +10342,7 @@ static void mlxsw_sp_mp4_hash_init(struct mlxsw_sp *mlxsw_sp, · 10341 unmodified lines
1034210342 mlxsw_sp_mp_hash_inner_l3(config);
1034310343 break;
1034410344 case 3:
10345− hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields;
10345+ hash_fields = READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_fields);
1034610346 /* Outer */
1034710347 MLXSW_SP_MP_HASH_HEADER_SET(headers, IPV4_EN_NOT_TCP_NOT_UDP);
1034810348 MLXSW_SP_MP_HASH_HEADER_SET(headers, IPV4_EN_TCP_UDP);
net/ipv4/route.c+3−3
@@ -1929,7 +1929,7 @@ static u32 fib_multipath_custom_hash_outer(const struct net *net, · 1928 unmodified lines
19291929 const struct sk_buff *skb,
19301930 bool *p_has_inner)
19311931 {
1932− u32 hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields;
1932+ u32 hash_fields = READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_fields);
19331933 struct flow_keys keys, hash_keys;
19341934
19351935 if (!(hash_fields & FIB_MULTIPATH_HASH_FIELD_OUTER_MASK))
@@ -1958,7 +1958,7 @@ static u32 fib_multipath_custom_hash_inner(const struct net *net, · 22 unmodified lines
19581958 const struct sk_buff *skb,
19591959 bool has_inner)
19601960 {
1961− u32 hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields;
1961+ u32 hash_fields = READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_fields);
19621962 struct flow_keys keys, hash_keys;
19631963
19641964 /* We assume the packet carries an encapsulation, but if none was
@@ -2018,7 +2018,7 @@ static u32 fib_multipath_custom_hash_skb(const struct net *net, · 53 unmodified lines
20182018 static u32 fib_multipath_custom_hash_fl4(const struct net *net,
20192019 const struct flowi4 *fl4)
20202020 {
2021− u32 hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields;
2021+ u32 hash_fields = READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_fields);
20222022 struct flow_keys hash_keys;
20232023
20242024 if (!(hash_fields & FIB_MULTIPATH_HASH_FIELD_OUTER_MASK))