From 747746a3c9f99d96ef1d712701cb9957d2ac9105 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 4 Jan 2025 10:37:23 +0000 Subject: [PATCH] Revert "net: defer final 'struct net' free in netns dismantle" This reverts commit 3267b254dc0a04dfa362a2be24573cfa6d2d78f5 which is commit 0f6ede9fbc747e2553612271bce108f7517e7a45 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I4811e911553091a47d11e0b4ece358363809166c Signed-off-by: Greg Kroah-Hartman --- include/net/net_namespace.h | 1 - net/core/net_namespace.c | 21 +-------------------- 2 files changed, 1 insertion(+), 21 deletions(-) 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);