> Not necessarily, could be a tsleep in a DVACT_WAKEUP handler of an
> other driver that makes us do the context switch.  The cold = 2 diff
> didn't reveal any tsleeps in inteldrm on my x220.  But then I never
> had any issues here either.  Perhaps somebody who can reproduce the
> problem should run the cold = 2 diff.

Here is that "testing diff" that a few of us have looked at before,
trying to find suspend/resume paths which sleep.  It is a pretty
wimpy method.  If we hear that it finds some real bugs, then I can
improve it (of course, we will fix the real bugs it finds seperately)

Any feedback?

Index: kern/kern_synch.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_synch.c,v
retrieving revision 1.112
diff -u -r1.112 kern_synch.c
--- kern/kern_synch.c   24 Dec 2013 01:11:04 -0000      1.112
+++ kern/kern_synch.c   21 Jan 2014 22:27:53 -0000
@@ -109,6 +109,8 @@
 
        KASSERT((priority & ~(PRIMASK | PCATCH)) == 0);
 
+       if (cold == 2)
+               printf("TSLEEP");
        if (cold || panicstr) {
                int s;
                /*
Index: arch/i386/i386/apm.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/i386/apm.c,v
retrieving revision 1.102
diff -u -r1.102 apm.c
--- arch/i386/i386/apm.c        6 Dec 2013 21:03:05 -0000       1.102
+++ arch/i386/i386/apm.c        21 Jan 2014 22:35:45 -0000
@@ -253,6 +253,7 @@
 
        s = splhigh();
        disable_intr();
+       cold = 2;
        config_suspend(TAILQ_FIRST(&alldevs), DVACT_SUSPEND);
 
        /* XXX
@@ -274,6 +275,7 @@
        inittodr(time_second);
 
        config_suspend(TAILQ_FIRST(&alldevs), DVACT_RESUME);
+       cold = 0;
        enable_intr();
        splx(s);
 
Index: arch/loongson/dev/apm.c
===================================================================
RCS file: /cvs/src/sys/arch/loongson/dev/apm.c,v
retrieving revision 1.17
diff -u -r1.17 apm.c
--- arch/loongson/dev/apm.c     6 Dec 2013 21:03:05 -0000       1.17
+++ arch/loongson/dev/apm.c     21 Jan 2014 22:34:53 -0000
@@ -374,7 +374,7 @@
 
        s = splhigh();
        (void)disableintr();
-       cold = 1;
+       cold = 2;
 
        rv = config_suspend(TAILQ_FIRST(&alldevs), DVACT_SUSPEND);
 
Index: arch/zaurus/dev/zaurus_apm.c
===================================================================
RCS file: /cvs/src/sys/arch/zaurus/dev/zaurus_apm.c,v
retrieving revision 1.24
diff -u -r1.24 zaurus_apm.c
--- arch/zaurus/dev/zaurus_apm.c        6 Dec 2013 21:03:05 -0000       1.24
+++ arch/zaurus/dev/zaurus_apm.c        21 Jan 2014 22:40:12 -0000
@@ -653,6 +653,7 @@
 #endif /* NWSDISPLAY > 0 */
 
        s = splhigh();
+       cold = 2;
        config_suspend(TAILQ_FIRST(&alldevs), DVACT_SUSPEND);
 
        /* XXX
@@ -683,6 +684,7 @@
 
        /* NOTREACHED */
        config_suspend(TAILQ_FIRST(&alldevs), DVACT_RESUME);
+       cold = 0;
        splx(s);
 
        bufq_restart();
Index: dev/acpi/acpi.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpi.c,v
retrieving revision 1.252
diff -u -r1.252 acpi.c
--- dev/acpi/acpi.c     20 Jan 2014 00:47:21 -0000      1.252
+++ dev/acpi/acpi.c     21 Jan 2014 22:09:38 -0000
@@ -2138,7 +2138,7 @@
 
        s = splhigh();
        disable_intr(); /* PSL_I for resume; PIC/APIC broken until repair */
-       cold = 1;       /* Force other code to delay() instead of tsleep() */
+       cold = 2;       /* Force other code to delay() instead of tsleep() */
 
        if (config_suspend(TAILQ_FIRST(&alldevs), DVACT_SUSPEND) != 0)
                goto fail_suspend;

Reply via email to