tags 345537 + patch
stop

On Sun, Jan 01, 2006 at 05:07:26PM +0100, Mattia Dongili wrote:
> Package: xserver-xorg
> Version: 6.9.0.dfsg.1-1
> Severity: normal
> 
> Hello,
> 
> I just noticed that Xorg uses ACPI's /proc/acpi/event. Now, when acpid
> is running Xorg is smart enough to read from its socket instead, and
> when you, brave user, stop acpid: kaboom!
> Xorg uses all my CPU leaving no option than restarting it.
> 
> Disabling PM management (Option "NoPM") obviously helps and also fixes
> xorg stealing /proc/acpi/event.

bug also found in xorg's bugzilla:
https://bugs.freedesktop.org/show_bug.cgi?id=5140

I've rolled a patch that works here (also submitted in the bugreport
above), it disables reading from acpid socket on any error (tested, works).

A different approach could implement (re)opening /proc/acpi/event on EOF as
that can only happen when using acpid socket because if ACPI is enabled
the /proc/acpi/event is always compiled in.
I'm also going to try this one.

-- 
mattia
:wq!
Index: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_acpi.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_acpi.c,v
retrieving revision 1.2
diff -u -r1.2 lnx_acpi.c
--- xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_acpi.c  31 Oct 2005 
05:45:40 -0000      1.2
+++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_acpi.c  2 Jan 2006 
11:57:36 -0000
@@ -45,6 +45,13 @@
     memset(ev, 0, LINE_LENGTH);
 
     n = read( fd, ev, LINE_LENGTH );
+    if (n <= 0) {
+       xf86MsgVerb(X_WARNING,3,"Error reading the ACPI Event handler, 
disabling.\n");
+       if (n < 0)
+               xf86MsgVerb(X_WARNING,3,"%s\n", strerror(errno));
+       lnxCloseACPI();
+       return 0;
+    }
 
     /* Check that we have a video event */
     if (strstr(ev, "video") == ev) {
@@ -160,6 +167,9 @@
 #ifdef DEBUG
    ErrorF("ACPI: Closing device\n");
 #endif
+    xf86PMGetEventFromOs = NULL;
+    xf86PMConfirmEventToOs = NULL;
+
     if (ACPIihPtr) {
        fd = xf86RemoveInputHandler(ACPIihPtr);
        shutdown(fd, 2);

Reply via email to