net: Convert atomic_t net::count to refcount_t
Since net could be obtained from RCU lists, and there is a race with net destruction, the patch converts net::count to refcount_t. This provides sanity checks for the cases of incrementing counter of already dead net, when maybe_get_net() has to used instead of get_net(). Drivers: allyesconfig and allmodconfig are OK. Suggested-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
594831a8ab
commit
273c28bc57
@@ -51,7 +51,7 @@ struct net {
|
||||
refcount_t passive; /* To decided when the network
|
||||
* namespace should be freed.
|
||||
*/
|
||||
atomic_t count; /* To decided when the network
|
||||
refcount_t count; /* To decided when the network
|
||||
* namespace should be shut down.
|
||||
*/
|
||||
spinlock_t rules_mod_lock;
|
||||
@@ -195,7 +195,7 @@ void __put_net(struct net *net);
|
||||
|
||||
static inline struct net *get_net(struct net *net)
|
||||
{
|
||||
atomic_inc(&net->count);
|
||||
refcount_inc(&net->count);
|
||||
return net;
|
||||
}
|
||||
|
||||
@@ -206,14 +206,14 @@ static inline struct net *maybe_get_net(struct net *net)
|
||||
* exists. If the reference count is zero this
|
||||
* function fails and returns NULL.
|
||||
*/
|
||||
if (!atomic_inc_not_zero(&net->count))
|
||||
if (!refcount_inc_not_zero(&net->count))
|
||||
net = NULL;
|
||||
return net;
|
||||
}
|
||||
|
||||
static inline void put_net(struct net *net)
|
||||
{
|
||||
if (atomic_dec_and_test(&net->count))
|
||||
if (refcount_dec_and_test(&net->count))
|
||||
__put_net(net);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user