Comment 68 for bug 441653

Ċ½ilvinas Valinskas (zval) wrote :

Same problem here:

[ 58.504] Fatal server error:
[ 58.504] xf86OpenConsole: VT_WAITACTIVE failed: Interrupted system call

hw/xfree86/os-support/linux/lnx_init.c:

 62 static void
 63 switch_to(int vt, const char *from)
 64 {
 65 if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, vt) < 0)
 66 FatalError("%s: VT_ACTIVATE failed: %s\n", from, strerror(errno));
 67
 68 if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, vt) < 0)
 69 FatalError("%s: VT_WAITACTIVE failed: %s\n", from, strerror(errno));
 70 }

lines 68 is interrupt by signal ... and ioctl(VT_WAITACTIVE) return -1, errno == EINTR.
Xserver must retry operation again! See kernel sources, VT_WAITACTIVE ioctl() handler
does wait interruptable() and can return EINTR.

Patch like this might help:

diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
index 9c71a42..d17e039 100644
--- a/hw/xfree86/os-support/linux/lnx_init.c
+++ b/hw/xfree86/os-support/linux/lnx_init.c
@@ -62,10 +62,13 @@ drain_console(int fd, void *closure)
 static void
 switch_to(int vt, const char *from)
 {
+ int result;
+
     if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, vt) < 0)
         FatalError("%s: VT_ACTIVATE failed: %s\n", from, strerror(errno));

- if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, vt) < 0)
+ SYSCALL(result = ioctl(xf86Info.consoleFd, VT_WAITACTIVE, vt));
+ if (result < 0)
         FatalError("%s: VT_WAITACTIVE failed: %s\n", from, strerror(errno));
 }