[RHEL7,COMMIT] ve: Synchronize vznetstat pernet_operations

Submitted by Konstantin Khorenko on May 27, 2020, 6:35 p.m.

Details

Message ID 202005271835.04RIZ1NG015241@finist-ce7.sw.ru
State New
Series "Parallel per-net init/exit"
Headers show

Commit Message

Konstantin Khorenko May 27, 2020, 6:35 p.m.
The commit is pushed to "branch-rh7-3.10.0-1127.8.2.vz7.161.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1127.8.2.vz7.161.3
------>
commit dc1b4d39ca367654791635b0c685818c2105dedc
Author: Kirill Tkhai <ktkhai@virtuozzo.com>
Date:   Wed May 27 21:35:01 2020 +0300

    ve: Synchronize vznetstat pernet_operations
    
    Make impossible parallel init/exit
    
    Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
    
    =====================
    Patchset description:
    
    Parallel per-net init/exit
    
    https://jira.sw.ru/browse/PSBM-104158
---
 kernel/ve/vznetstat/vznetstat.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/kernel/ve/vznetstat/vznetstat.c b/kernel/ve/vznetstat/vznetstat.c
index e0ca8d2fb027c..f37c137fbc15b 100644
--- a/kernel/ve/vznetstat/vznetstat.c
+++ b/kernel/ve/vznetstat/vznetstat.c
@@ -1083,29 +1083,39 @@  static struct file_operations proc_venetstat_v6_operations = {
         .release	= seq_release,
 };
 
+/* TODO: Use tc_lock? */
+static DEFINE_MUTEX(ve_stat_mutex);
+
 static int __net_init net_init_acct(struct net *net)
 {
 	struct ve_struct *ve = net->owner_ve;
+	int ret = 0;
 
+	mutex_lock(&ve_stat_mutex);
 	if (!ve->stat) {
 		ve->stat = venet_acct_find_create_stat(ve->veid);
-		if (!ve->stat)
-			return -ENOMEM;
+		if (!ve->stat) {
+			ret = -ENOMEM;
+			goto out;
+		}
 	} else
 		venet_acct_get_stat(ve->stat);
-
-	return 0;
+	mutex_unlock(&ve_stat_mutex);
+out:
+	return ret;
 }
 
 static void __net_exit net_exit_acct(struct net *net)
 {
 	struct ve_struct *ve = net->owner_ve;
 
+	mutex_lock(&ve_stat_mutex);
 	if (ve->stat) {
 		venet_acct_put_stat(ve->stat);
 		if (ve->ve_netns == net)
 			ve->stat = NULL;
 	}
+	mutex_unlock(&ve_stat_mutex);
 }
 
 static struct pernet_operations __net_initdata net_acct_ops = {