cvs commit: src/sys/dev/syscons/apm apm_saver.c
src/sys/i386/bios apm.c apm.h
John Baldwin
jhb at freebsd.org
Wed May 31 08:51:25 PDT 2006
On Wednesday 31 May 2006 10:58, Scott Long wrote:
> John Baldwin wrote:
> > On Thursday 25 May 2006 23:01, Scott Long wrote:
> >
> >>Warner Losh wrote:
> >>
> >>
> >>>imp 2006-05-25 23:06:38 UTC
> >>>
> >>> FreeBSD src repository
> >>>
> >>> Modified files:
> >>> sys/dev/syscons/apm apm_saver.c
> >>> sys/i386/bios apm.c apm.h
> >>> Log:
> >>> APM was calling the suspend process from a timeout. This meant that
> >>> other timeouts could not happen while suspending, including timeouts
> >>> for things like msleep. This caused the system to hang on suspend
> >>> when the cbb was enabled, since its suspend path powered down the
> >>> socket which used a timeout to wait for it to be done.
> >>>
> >>> APM now creates a thread when it is enabled, and deletes the thread
> >>> when it is disabled. This thread takes the place of the timeout by
> >>> doing its polling every ~.9s. When the thread is disabled, it will
> >>> wakeup early, otherwise it times out and polls the varius things the
> >>> old timeout polled (APM events, suspend delays, etc).
> >>>
> >>> This makes my Sony VAIO 505TS suspend/resume correctly when APM is
> >>> enabled (ACPI is black listed on my 505TS).
> >>>
> >>> This will likely fix other problems with the suspend path where
> >>> drivers would sleep with msleep and/or do other timeouts. Maybe
> >>> there's some special case code that would use DELAY while suspending
> >>> and msleep otherwise that can be revisited and removed.
> >>>
> >>> This was also tested by glebius@, who pointed out that in the patch I
> >>> sent him, I'd forgotten apm_saver.c
> >>>
> >>> MFC After: 3 weeks
> >>
> >>In the past, I've been against mandating that callouts/timeouts/generic
> >>taskqueues should not be allowed to sleep. However, after looking over
> >>the history of this problem as well as others, it seems that it's just
> >>too easy for driver authors to make bad assumptions and wind up with a
> >>priority inversion/deadlock like this. It would be relatively trivial
> >>to mark these contexts as being non-sleepable and have the msleep code
> >>enforce it, like is done with ithreads. What do you think? Anyways,
> >>thanks for looking at this and fixing it.
> >
> >
> > We already do for timeouts if INVARIANTS is on:
> >
> > softclock()
> > {
> > ...
> > THREAD_NO_SLEEPING();
> > c_func(c_arg);
> > THREAD_SLEEPING_OK();
> > ...
> > }
> >
> > That has been in place since 6.0 IIRC.
> >
>
> I thought that it was only enabled for DIAGNOSTIC.
>
> Scott
Nah, that was phk's other timekeeping code to see which timeouts take a long
time to execute. The THREAD_NO_SLEEPING() stuff was added just before 6.0
was released and replaced a couple of "special" mutexes that were held just
to provoke WITNESS warnings.
--
John Baldwin
More information about the cvs-src
mailing list