diff options
author | Kirill Tkhai <ktkhai@virtuozzo.com> | 2018-02-13 12:26:33 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-02-13 10:36:05 -0500 |
commit | bcab1ddd9b2b105390712a9c1605bdb20a7f9a03 (patch) | |
tree | c50571b51e23a882af827651bb43dd10b8006f0f /net/core/net_namespace.c | |
parent | 1a57feb847c56d6193f67d0e892c24e71f9e3ab1 (diff) | |
download | linux-bcab1ddd9b2b105390712a9c1605bdb20a7f9a03.tar.bz2 |
net: Move mutex_unlock() in cleanup_net() up
net_sem protects from pernet_list changing, while
ops_free_list() makes simple kfree(), and it can't
race with other pernet_operations callbacks.
So we may release net_mutex earlier then it was.
Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
Acked-by: Andrei Vagin <avagin@virtuozzo.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/net_namespace.c')
-rw-r--r-- | net/core/net_namespace.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index e89b2b7abd36..f8453c438798 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -522,11 +522,12 @@ static void cleanup_net(struct work_struct *work) list_for_each_entry_reverse(ops, &pernet_list, list) ops_exit_list(ops, &net_exit_list); + mutex_unlock(&net_mutex); + /* Free the net generic variables */ list_for_each_entry_reverse(ops, &pernet_list, list) ops_free_list(ops, &net_exit_list); - mutex_unlock(&net_mutex); up_read(&net_sem); /* Ensure there are no outstanding rcu callbacks using this |