[Devel] [PATCH rh7] ve/kobj: Send events per VE instead of all net-namespaces broadcasting

Cyrill Gorcunov gorcunov at virtuozzo.com
Wed Jun 3 05:55:44 PDT 2015


Currently uevents are sending broadcastly to all net-namespaces present
in the system which is leading to problem of C/R'ing systemd based
containers (netlink socket sees data from the node and we can't dump
until the data is read). So lets send events broadcastly not per
net-namespace but per-VE. For this sake add @_uevent_sock_list
list into VE instance and gather uevents sockets there.

n.b.: In pcs6 we already have virtualized uevents so no problem there.

Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
CC: Andrey Vagin <avagin at virtuozzo.com>
CC: Vladimir Davydov <vdavydov at virtuozzo.com>
CC: Konstantin Khorenko <khorenko at virtuozzo.com>
CC: Pavel Emelyanov <xemul at virtuozzo.com>
---
 include/linux/ve.h       |    1 +
 kernel/ve/ve.c           |    2 ++
 lib/kobject_uevent.c     |   16 +++++++++++++++-
 net/core/net_namespace.c |    3 +++
 4 files changed, 21 insertions(+), 1 deletion(-)

Index: linux-pcs7.git/include/linux/ve.h
===================================================================
--- linux-pcs7.git.orig/include/linux/ve.h
+++ linux-pcs7.git/include/linux/ve.h
@@ -121,6 +121,7 @@ struct ve_struct {
 	int			fsync_enable;
 
 	u64			_uevent_seqnum;
+	struct list_head	_uevent_sock_list;
 	struct nsproxy __rcu	*ve_ns;
 	struct cred		*init_cred;
 	struct net		*ve_netns;
Index: linux-pcs7.git/kernel/ve/ve.c
===================================================================
--- linux-pcs7.git.orig/kernel/ve/ve.c
+++ linux-pcs7.git/kernel/ve/ve.c
@@ -66,6 +66,7 @@ static DEFINE_PER_CPU(struct kstat_lat_p
 struct ve_struct ve0 = {
 	.ve_name		= "0",
 	.start_jiffies		= INITIAL_JIFFIES,
+	._uevent_sock_list	= { &ve0._uevent_sock_list, &ve0._uevent_sock_list },
 	RCU_POINTER_INITIALIZER(ve_ns, &init_nsproxy),
 	.ve_netns		= &init_net,
 	.is_running		= 1,
@@ -713,6 +714,7 @@ do_init:
 	INIT_LIST_HEAD(&ve->devices);
 	INIT_LIST_HEAD(&ve->ve_list);
 	INIT_LIST_HEAD(&ve->devmnt_list);
+	INIT_LIST_HEAD(&ve->_uevent_sock_list);
 	mutex_init(&ve->devmnt_mutex);
 	kmapset_init_key(&ve->ve_sysfs_perms);
 
Index: linux-pcs7.git/lib/kobject_uevent.c
===================================================================
--- linux-pcs7.git.orig/lib/kobject_uevent.c
+++ linux-pcs7.git/lib/kobject_uevent.c
@@ -26,7 +26,7 @@
 #include <linux/netlink.h>
 #include <net/sock.h>
 #include <net/net_namespace.h>
-
+#include <linux/ve.h>
 
 u64 uevent_seqnum;
 char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
@@ -35,8 +35,10 @@ struct uevent_sock {
 	struct list_head list;
 	struct sock *sk;
 };
+#ifndef CONFIG_VE
 static LIST_HEAD(uevent_sock_list);
 #endif
+#endif
 
 /* This lock protects uevent_seqnum and uevent_sock_list */
 static DEFINE_MUTEX(uevent_sock_mutex);
@@ -254,7 +256,11 @@ int kobject_uevent_env_one(struct kobjec
 
 #if defined(CONFIG_NET)
 	/* send netlink message */
+#ifdef CONFIG_VE
+	list_for_each_entry(ue_sk, &get_exec_env()->_uevent_sock_list, list) {
+#else
 	list_for_each_entry(ue_sk, &uevent_sock_list, list) {
+#endif
 		struct sock *uevent_sock = ue_sk->sk;
 		struct sk_buff *skb;
 		size_t len;
@@ -396,7 +402,11 @@ static int uevent_net_init(struct net *n
 		return -ENODEV;
 	}
 	mutex_lock(&uevent_sock_mutex);
+#ifdef CONFIG_VE
+	list_add_tail(&ue_sk->list, &net->owner_ve->_uevent_sock_list);
+#else
 	list_add_tail(&ue_sk->list, &uevent_sock_list);
+#endif
 	mutex_unlock(&uevent_sock_mutex);
 	return 0;
 }
@@ -406,7 +416,11 @@ static void uevent_net_exit(struct net *
 	struct uevent_sock *ue_sk;
 
 	mutex_lock(&uevent_sock_mutex);
+#ifdef CONFIG_VE
+	list_for_each_entry(ue_sk, &net->owner_ve->_uevent_sock_list, list) {
+#else
 	list_for_each_entry(ue_sk, &uevent_sock_list, list) {
+#endif
 		if (sock_net(ue_sk->sk) == net)
 			goto found;
 	}
Index: linux-pcs7.git/net/core/net_namespace.c
===================================================================
--- linux-pcs7.git.orig/net/core/net_namespace.c
+++ linux-pcs7.git/net/core/net_namespace.c
@@ -33,6 +33,9 @@ EXPORT_SYMBOL_GPL(net_namespace_list);
 
 struct net init_net = {
 	.dev_base_head = LIST_HEAD_INIT(init_net.dev_base_head),
+#ifdef CONFIG_VE
+	.owner_ve = &ve0,
+#endif
 };
 EXPORT_SYMBOL(init_net);
 



More information about the Devel mailing list