inetpeer: Fix data-races around sysctl.
While reading inetpeer sysctl variables, they can be changed
concurrently. So, we need to add READ_ONCE() to avoid data-races.
Fixes: 1da177e4c3
("Linux-2.6.12-rc2")
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
47e6ab24e8
commit
3d32edf1f3
@ -141,16 +141,20 @@ static void inet_peer_gc(struct inet_peer_base *base,
|
|||||||
struct inet_peer *gc_stack[],
|
struct inet_peer *gc_stack[],
|
||||||
unsigned int gc_cnt)
|
unsigned int gc_cnt)
|
||||||
{
|
{
|
||||||
|
int peer_threshold, peer_maxttl, peer_minttl;
|
||||||
struct inet_peer *p;
|
struct inet_peer *p;
|
||||||
__u32 delta, ttl;
|
__u32 delta, ttl;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (base->total >= inet_peer_threshold)
|
peer_threshold = READ_ONCE(inet_peer_threshold);
|
||||||
|
peer_maxttl = READ_ONCE(inet_peer_maxttl);
|
||||||
|
peer_minttl = READ_ONCE(inet_peer_minttl);
|
||||||
|
|
||||||
|
if (base->total >= peer_threshold)
|
||||||
ttl = 0; /* be aggressive */
|
ttl = 0; /* be aggressive */
|
||||||
else
|
else
|
||||||
ttl = inet_peer_maxttl
|
ttl = peer_maxttl - (peer_maxttl - peer_minttl) / HZ *
|
||||||
- (inet_peer_maxttl - inet_peer_minttl) / HZ *
|
base->total / peer_threshold * HZ;
|
||||||
base->total / inet_peer_threshold * HZ;
|
|
||||||
for (i = 0; i < gc_cnt; i++) {
|
for (i = 0; i < gc_cnt; i++) {
|
||||||
p = gc_stack[i];
|
p = gc_stack[i];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user