diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index b1079b8f98aa..6641c4543d18 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -81,7 +81,6 @@ struct net { * or to unregister pernet ops * (pernet_ops_rwsem write locked). */ - struct llist_node defer_free_list; struct llist_node cleanup_list; /* namespaces on death row */ #ifdef CONFIG_KEYS diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 3ae29a6daac0..29deff082da1 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -435,28 +435,11 @@ out_free: goto out; } -static LLIST_HEAD(defer_free_list); - -static void net_complete_free(void) -{ - struct llist_node *kill_list; - struct net *net, *next; - - /* Get the list of namespaces to free from last round. */ - kill_list = llist_del_all(&defer_free_list); - - llist_for_each_entry_safe(net, next, kill_list, defer_free_list) - kmem_cache_free(net_cachep, net); - -} - static void net_free(struct net *net) { if (refcount_dec_and_test(&net->passive)) { kfree(rcu_access_pointer(net->gen)); - - /* Wait for an extra rcu_barrier() before final free. */ - llist_add(&net->defer_free_list, &defer_free_list); + kmem_cache_free(net_cachep, net); } } @@ -631,8 +614,6 @@ static void cleanup_net(struct work_struct *work) */ rcu_barrier(); - net_complete_free(); - /* Finally it is safe to free my network namespace structure */ list_for_each_entry_safe(net, tmp, &net_exit_list, exit_list) { list_del_init(&net->exit_list);