From 65b2a02a9b576d824f47de43024659623baab6a3 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Thu, 19 Aug 2010 06:10:45 +0000 Subject: [PATCH] --- yaml --- r: 213893 b: refs/heads/master c: 49e8ab03ebcacd8e37660ffec20c0c46721a2800 h: refs/heads/master i: 213891: e376a22069ac2f90a800505e8acc8d187c40f974 v: v3 --- [refs] | 2 +- trunk/net/ipv4/af_inet.c | 8 +++----- trunk/net/ipv4/route.c | 9 +-------- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/[refs] b/[refs] index a2c3a504c3ce..6fc4aa002cb9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4da79504b2b41410dd56e9268c9ad403aa65e89c +refs/heads/master: 49e8ab03ebcacd8e37660ffec20c0c46721a2800 diff --git a/trunk/net/ipv4/af_inet.c b/trunk/net/ipv4/af_inet.c index 6a1100c25a9f..f581f77d1097 100644 --- a/trunk/net/ipv4/af_inet.c +++ b/trunk/net/ipv4/af_inet.c @@ -227,18 +227,16 @@ EXPORT_SYMBOL(inet_ehash_secret); /* * inet_ehash_secret must be set exactly once - * Instead of using a dedicated spinlock, we (ab)use inetsw_lock */ void build_ehash_secret(void) { u32 rnd; + do { get_random_bytes(&rnd, sizeof(rnd)); } while (rnd == 0); - spin_lock_bh(&inetsw_lock); - if (!inet_ehash_secret) - inet_ehash_secret = rnd; - spin_unlock_bh(&inetsw_lock); + + cmpxchg(&inet_ehash_secret, 0, rnd); } EXPORT_SYMBOL(build_ehash_secret); diff --git a/trunk/net/ipv4/route.c b/trunk/net/ipv4/route.c index 3f56b6e6c6aa..85a67c9d5982 100644 --- a/trunk/net/ipv4/route.c +++ b/trunk/net/ipv4/route.c @@ -1268,18 +1268,11 @@ static int rt_intern_hash(unsigned hash, struct rtable *rt, void rt_bind_peer(struct rtable *rt, int create) { - static DEFINE_SPINLOCK(rt_peer_lock); struct inet_peer *peer; peer = inet_getpeer(rt->rt_dst, create); - spin_lock_bh(&rt_peer_lock); - if (rt->peer == NULL) { - rt->peer = peer; - peer = NULL; - } - spin_unlock_bh(&rt_peer_lock); - if (peer) + if (peer && cmpxchg(&rt->peer, NULL, peer) != NULL) inet_putpeer(peer); }