diff options
Diffstat (limited to 'net/core/net_namespace.c')
| -rw-r--r-- | net/core/net_namespace.c | 7 | 
1 files changed, 6 insertions, 1 deletions
| diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 202fa5eacd0f..a5b5bb99c644 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -164,8 +164,10 @@ static void ops_exit_list(const struct pernet_operations *ops,  {  	struct net *net;  	if (ops->exit) { -		list_for_each_entry(net, net_exit_list, exit_list) +		list_for_each_entry(net, net_exit_list, exit_list) {  			ops->exit(net); +			cond_resched(); +		}  	}  	if (ops->exit_batch)  		ops->exit_batch(net_exit_list); @@ -311,6 +313,8 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)  	LIST_HEAD(net_exit_list);  	refcount_set(&net->ns.count, 1); +	ref_tracker_dir_init(&net->refcnt_tracker, 128); +  	refcount_set(&net->passive, 1);  	get_random_bytes(&net->hash_mix, sizeof(u32));  	preempt_disable(); @@ -635,6 +639,7 @@ static DECLARE_WORK(net_cleanup_work, cleanup_net);  void __put_net(struct net *net)  { +	ref_tracker_dir_exit(&net->refcnt_tracker);  	/* Cleanup the network namespace in process context */  	if (llist_add(&net->cleanup_list, &cleanup_list))  		queue_work(netns_wq, &net_cleanup_work); |