net: Move mutex_unlock() in cleanup_net() up
authorKirill Tkhai <ktkhai@virtuozzo.com>
Tue, 13 Feb 2018 09:26:33 +0000 (12:26 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 13 Feb 2018 15:36:05 +0000 (10:36 -0500)
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>
net/core/net_namespace.c

index e89b2b7abd360bff4ef3a6a6a4c0e98f060edd8a..f8453c438798992dec134ea18be17f0b70a04674 100644 (file)
@@ -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