[lxc-devel] [PATCH] fix console deadlocks

Serge Hallyn serge.hallyn at ubuntu.com
Fri Sep 20 19:48:40 UTC 2013


These might be a bit controversial.  The process lock was held
for some long periods of time for tweaking consoles.   These
can deadlock with some of lock holds I introduced recently.  I
would argue that if two threads are fighting over the console,
you're gonna have trouble anyway, and the process locks here
weren't saving us from anything.  If we want to do a console
lock then we should probably introduce a new lock - maybe held
for the duration of a lxc-start with console or a lxc-console.
Actually that's probably a good idea...  But here I just drop
the locks which make lxc-start-ephemeral deadlock.

Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
 src/lxc/console.c | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/src/lxc/console.c b/src/lxc/console.c
index a32e9cf..78be403 100644
--- a/src/lxc/console.c
+++ b/src/lxc/console.c
@@ -103,13 +103,10 @@ void lxc_console_sigwinch(int sig)
 	struct lxc_list *it;
 	struct lxc_tty_state *ts;
 
-	process_lock();
-
 	lxc_list_for_each(it, &lxc_ttys) {
 		ts = it->elem;
 		lxc_console_winch(ts);
 	}
-	process_unlock();
 }
 
 static int lxc_console_cb_sigwinch_fd(int fd, void *cbdata,
@@ -423,7 +420,6 @@ int lxc_console_allocate(struct lxc_conf *conf, int sockfd, int *ttyreq)
 	struct lxc_tty_info *tty_info = &conf->tty_info;
 	struct lxc_console *console = &conf->console;
 
-	process_lock();
 	if (*ttyreq == 0) {
 		if (lxc_console_peer_proxy_alloc(console, sockfd) < 0)
 			goto out;
@@ -458,7 +454,6 @@ out_tty:
 	tty_info->pty_info[ttynum - 1].busy = sockfd;
 	masterfd = tty_info->pty_info[ttynum - 1].master;
 out:
-	process_unlock();
 	return masterfd;
 }
 
@@ -476,7 +471,6 @@ void lxc_console_free(struct lxc_conf *conf, int fd)
 	struct lxc_tty_info *tty_info = &conf->tty_info;
 	struct lxc_console *console = &conf->console;
 
-	process_lock();
 	for (i = 0; i < tty_info->nbtty; i++) {
 		if (tty_info->pty_info[i].busy == fd)
 			tty_info->pty_info[i].busy = 0;
@@ -486,7 +480,6 @@ void lxc_console_free(struct lxc_conf *conf, int fd)
 		lxc_mainloop_del_handler(console->descr, console->peerpty.slave);
 		lxc_console_peer_proxy_free(console);
 	}
-	process_unlock();
 }
 
 static void lxc_console_peer_default(struct lxc_console *console)
@@ -713,9 +706,7 @@ int lxc_console(struct lxc_container *c, int ttynum,
 		return -1;
 	}
 
-	process_lock();
 	ttyfd = lxc_cmd_console(c->name, &ttynum, &masterfd, c->config_path);
-	process_unlock();
 	if (ttyfd < 0) {
 		ret = ttyfd;
 		goto err1;
@@ -770,9 +761,7 @@ int lxc_console(struct lxc_container *c, int ttynum,
 		goto err4;
 	}
 
-	process_lock();
 	ret = lxc_mainloop(&descr, -1);
-	process_unlock();
 	if (ret) {
 		ERROR("mainloop returned an error");
 		goto err4;
-- 
1.8.3.2





More information about the lxc-devel mailing list