summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2008-11-05 11:51:06 -0500
committerAdam Jackson <ajax@redhat.com>2008-11-05 13:37:36 -0500
commit377712dbfce73348ad7f2610df51a1a805536392 (patch)
tree1399f6a9fe12cb9ac7f57ea248c914cc40911b77
parent3245bf113619500b7b6cae3a3f31ddd2984cbc05 (diff)
linux: Drain the console fd of data when using evdev for keyboards
Works around a silly bug in the kernel that causes wakeup storms after too many keypresses. Should fix the kernel bug too, but this at least keeps the idle wakeup count below 1000/sec. (cherry picked from commit 446d9443cea31e493d05c939d0128a8116788468)
-rw-r--r--hw/xfree86/os-support/linux/lnx_init.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
index 6f68ba57c..da5ca57cc 100644
--- a/hw/xfree86/os-support/linux/lnx_init.c
+++ b/hw/xfree86/os-support/linux/lnx_init.c
@@ -85,6 +85,14 @@ restoreVtPerms(void)
chown(vtname, vtPermSave[2], vtPermSave[3]);
}
+static void *console_handler;
+
+static void
+drain_console(int fd, void *closure)
+{
+ tcflush(fd, TCIOFLUSH);
+}
+
void
xf86OpenConsole(void)
{
@@ -300,6 +308,10 @@ xf86OpenConsole(void)
cfsetispeed(&nTty, 9600);
cfsetospeed(&nTty, 9600);
tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
+
+ /* need to keep the buffer clean, else the kernel gets angry */
+ console_handler = xf86AddGeneralHandler(xf86Info.consoleFd,
+ drain_console, NULL);
}
/* we really should have a InitOSInputDevices() function instead
@@ -346,6 +358,11 @@ xf86CloseConsole()
if (ShareVTs) return;
+ if (console_handler) {
+ xf86RemoveGeneralHandler(console_handler);
+ console_handler = NULL;
+ };
+
#if defined(DO_OS_FONTRESTORE)
if (ioctl(xf86Info.consoleFd, VT_GETSTATE, &vts) < 0)
xf86Msg(X_WARNING, "xf86CloseConsole: VT_GETSTATE failed: %s\n",