[Devel] [PATCH RHEL7 COMMIT] ve/vtty: Don't free console mapping until no clients left

Konstantin Khorenko khorenko at virtuozzo.com
Wed Jun 15 02:32:23 PDT 2016


The commit is pushed to "branch-rh7-3.10.0-327.18.2.vz7.14.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.18.2.vz7.14.14
------>
commit a9532c96e6a0c64fbb4a128ba6ca99b9081e85cc
Author: Cyrill Gorcunov <gorcunov at virtuozzo.com>
Date:   Wed Jun 15 13:32:23 2016 +0400

    ve/vtty: Don't free console mapping until no clients left
    
    Currently on container's stop we free vtty mapping in a force way
    so that if there is active console hooked from the node it become
    unusable since then. It was easier to work with when we've been
    reworking virtual console code.
    
    Now lets make console fully functional as it was in pcs6:
    when opened it must survive container start/stop cycle
    and checkpoint/restore as well.
    
    For this sake we:
    
     - drop ve_hook code, it no longer needed
     - free console @map on final close of the last tty opened
    
    https://jira.sw.ru/browse/PSBM-39463
    
    Signed-off-by: Cyrill Gorcunov <gorcunov at virtuozzo.com>
    Reviewed-by: Vladimir Davydov <vdavydov at virtuozzo.com>
    
    CC: Konstantin Khorenko <khorenko at virtuozzo.com>
    CC: Igor Sukhih <igor at virtuozzo.com>
    CC: Pavel Emelyanov <xemul at virtuozzo.com>
---
 drivers/tty/pty.c   | 48 ++++++++++++++----------------------------------
 kernel/ve/vecalls.c |  6 +++---
 2 files changed, 17 insertions(+), 37 deletions(-)

diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c
index a68102b..1644fdf 100644
--- a/drivers/tty/pty.c
+++ b/drivers/tty/pty.c
@@ -901,6 +901,13 @@ static void vtty_map_set(vtty_map_t *map, struct tty_struct *tty)
 	map->vttys[tty->index] = tty;
 }
 
+static void vtty_map_free(vtty_map_t *map)
+{
+	lockdep_assert_held(&tty_mutex);
+	idr_remove(&vtty_idr, map->veid);
+	kfree(map);
+}
+
 static void vtty_map_clear(struct tty_struct *tty)
 {
 	vtty_map_t *map = tty->driver_data;
@@ -908,28 +915,20 @@ static void vtty_map_clear(struct tty_struct *tty)
 	lockdep_assert_held(&tty_mutex);
 	if (map) {
 		struct tty_struct *p = map->vttys[tty->index];
+		int i;
 
 		WARN_ON(p != (tty->driver == vttys_driver ? tty : tty->link));
 		map->vttys[tty->index] = NULL;
 		tty->driver_data = tty->link->driver_data = NULL;
-	}
-}
 
-static void vtty_map_free(vtty_map_t *map)
-{
-	int i;
-
-	lockdep_assert_held(&tty_mutex);
+		for (i = 0; i < MAX_NR_VTTY_CONSOLES; i++) {
+			if (map->vttys[i])
+				break;
+		}
 
-	for (i = 0; i < MAX_NR_VTTY_CONSOLES; i++) {
-		struct tty_struct *tty = map->vttys[i];
-		if (!tty)
-			continue;
-		tty->driver_data = tty->link->driver_data = NULL;
+		if (i >= MAX_NR_VTTY_CONSOLES)
+			vtty_map_free(map);
 	}
-
-	idr_remove(&vtty_idr, map->veid);
-	kfree(map);
 }
 
 static vtty_map_t *vtty_map_alloc(envid_t veid)
@@ -1209,24 +1208,6 @@ void vtty_release(struct tty_struct *tty, struct tty_struct *o_tty,
 		*o_tty_closing = 0;
 }
 
-static void ve_vtty_fini(void *data)
-{
-	struct ve_struct *ve = data;
-	vtty_map_t *map;
-
-	mutex_lock(&tty_mutex);
-	map = vtty_map_lookup(ve->veid);
-	if (map)
-		vtty_map_free(map);
-	mutex_unlock(&tty_mutex);
-}
-
-static struct ve_hook vtty_hook = {
-	.fini           = ve_vtty_fini,
-	.priority       = HOOK_PRIO_DEFAULT,
-	.owner          = THIS_MODULE,
-};
-
 static int __init vtty_init(void)
 {
 #define VTTY_DRIVER_ALLOC_FLAGS			\
@@ -1279,7 +1260,6 @@ static int __init vtty_init(void)
 	if (tty_register_driver(vttys_driver))
 		panic(pr_fmt("Can't register slave vtty driver\n"));
 
-	ve_hook_register(VE_SS_CHAIN, &vtty_hook);
 	tty_default_fops(&vtty_fops);
 	return 0;
 }
diff --git a/kernel/ve/vecalls.c b/kernel/ve/vecalls.c
index 457d690..5aa9722 100644
--- a/kernel/ve/vecalls.c
+++ b/kernel/ve/vecalls.c
@@ -990,6 +990,9 @@ static int ve_configure(envid_t veid, unsigned int key,
 	struct ve_struct *ve;
 	int err = -ENOKEY;
 
+	if (key == VE_CONFIGURE_OPEN_TTY)
+		return vtty_open_master(veid, val);
+
 	ve = get_ve_by_id(veid);
 	if (!ve)
 		return -EINVAL;
@@ -998,9 +1001,6 @@ static int ve_configure(envid_t veid, unsigned int key,
 	case VE_CONFIGURE_OS_RELEASE:
 		err = init_ve_osrelease(ve, data);
 		break;
-	case VE_CONFIGURE_OPEN_TTY:
-		err = vtty_open_master(ve->veid, val);
-		break;
 	}
 
 	put_ve(ve);


More information about the Devel mailing list