ACPI-CA update patch for review

YONETANI Tomokazu qhwt+dfly at les.ath.cx
Thu Nov 30 07:39:56 PST 2006


On Thu, Nov 30, 2006 at 02:57:31PM +0100, Simon 'corecode' Schubert wrote:
> YONETANI Tomokazu wrote:
> >>:- hand-rolled locking code in AcpiOs{Acquire,Release}Lock() functions:
> >>:  ACPI-CA code has been rewritten in 20060623 to make these functions
                                          ^^^^^^^^
                                          actually this was 20060608

> >>:  to be used as spinlock functions, and called from many places where
> >>:  they weren't before.  Since our implementation of these locking 
> >>functions
> >>:  used lockmgr lock, which cannot be called from cpu_idle(), this led to
> >>:  a panic(mainly when my laptop wakes up from sleep state).  After 
> >>struggling
> >>:  with other locking primitives, I ended up with critical section and
> >>:  special-cased the idlethread.  I believed this shouldn't make the 
> >>situation
> >>:  worse, as ACPI functions called from cpu_idle_hook code in acpi_cpu did
> >>:  not using locking before.  But I'm open to a better implementation,
> >>:  especially how to deal with locking when called from idlethread.
> >>    You could probably use tokens here, but a critical section ought to
> >>    work as well since ACPI functions are only called from cpu #0.
> >Does that apply to ioctl or sysctl support code, too?  Can you shed
> >some light on me to find how it's guaranteed?
> 
> First, why don't you use spinlocks then (note: I didn't read the code)?

Because it led to a panic in lwkt_switch() when the laptop woke up
from sleep state:
  lwkt_switch: still holding 1 exclusive spinlocks

But that was months ago when I tried to replace lockmgr() calls
in AcpiOs{Acquire,Release}Lock() functions with spinlocks, so I need
to revisit that idea before drawing a conclusion.
 
> To just use a critical section, you'd have to migrate the calling thread to 
> cpu0, or have a acpi thread running on cpu0, and send a synchronous message 
> to this thread, processing your request.
> 
> How are the guarantees the ACPI code gives?  Will it ever call a blocking 
> function (kmalloc M_WAITOK, etc) while holding the lock?  Does it expect 
> the lock to persist?  If yes, that's ugly and you'd have to use lockmgr 
> locks and an own thread.

I couldn't find an explicit requirement for the locking functions
except for the description in changes.txt(look for "20060608:")
  http://developer.intel.com/technology/iapc/acpi/downloads/changes.txt
As far as I read the code, the locks won't persist in most places,
except for the line 1753 in acpi_SetSleepState() (in unpatched code).
 
> Why are the ACPI functions called from the idle thread, anyways?

acpi_cpu subsystem installs acpi_cpu_idle() as cpu_idle_hook() function.
acpi_cpu_idle() calls some of low-level ACPI functions named AcpiHw*().
These functions are needed to be called to transition to C2 or deeper state.
And either AcpiHwRegister{Read,Write}() or their caller calls
AcpiOsAcquireLock() to lock AcpiGbl_HardwareLock.  That was why lockmgr
lock can't be used any longer.  I'm not sure if acpi_cpu_idle() can be
moved to its own thread, but maybe worth a try, as it can solve these
nasty things.

Thanks for suggestions.





More information about the Submit mailing list