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:
Родитель
47e6ab24e8
Коммит
3d32edf1f3
|
@ -141,16 +141,20 @@ static void inet_peer_gc(struct inet_peer_base *base,
|
|||
struct inet_peer *gc_stack[],
|
||||
unsigned int gc_cnt)
|
||||
{
|
||||
int peer_threshold, peer_maxttl, peer_minttl;
|
||||
struct inet_peer *p;
|
||||
__u32 delta, ttl;
|
||||
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 */
|
||||
else
|
||||
ttl = inet_peer_maxttl
|
||||
- (inet_peer_maxttl - inet_peer_minttl) / HZ *
|
||||
base->total / inet_peer_threshold * HZ;
|
||||
ttl = peer_maxttl - (peer_maxttl - peer_minttl) / HZ *
|
||||
base->total / peer_threshold * HZ;
|
||||
for (i = 0; i < gc_cnt; i++) {
|
||||
p = gc_stack[i];
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче