On Sat, Jul 12, 2008 at 5:49 AM, Bill Holler <Bill.Holler at sun.com> wrote:
> Dana H. Myers wrote:
>> Bill Holler wrote:
>>> Hi Aubrey,
>>>
>>> I suspect we should raise the interrupt priority level high enough
>>> for mutex_enter() to treat AcpiGbl_HardwareLock as a spin lock.
> I was thinking of something else.  Raising the spl will not help.
>
>
>>>
>>> AcpiGbl_HardwareLock is declared as an ACPI_SPINLOCK.
>>> AcpiOsCreateLock() initializes AcpiGbl_HardwareLock as a
>>> MUTEX_DRIVER.  The mutex must be an ADAPTIVE lock.
>>>
>>>
>>> What is the idle code doing with interrupts while it places the
>>> cpu into deeper c-states with the ACPI interface?
>>> I assume it will be like the current cpu_halt() function masks
>>> interrupts before halting the processor?
>>>
>> I'd like to understand better the exposure here.  It's true
>> that AcpiOsCreateLock() uses adaptive mutexes; this hasn't
>> appeared to present a problem in the past and I'd like
>> to understand the specific cases where a spin mutex
>> is truly required.  Perhaps the problem is better addressed
>> at a higher algorithmic level, for example.
>
> The ACPI interfaces need to be used to halt the processor into
> ACPI C2 and C3.  The idle thread cannot block on a mutex
> because the idle thread must always be dispatch-able.
> It would be much simpler if the idle thread can use the ACPI
> interface instead of alternatives such as creating a new block-able
> thread to do this.
>
> AcpiGbl_HardwareLock is defined as an ACPI_"SPIN"LOCK.  :-)
> On the other hand, changing AcpiGbl_HardwareLock does
> sound risky.
>
>
>>> We need interrupts to be masked when the processor wakes
>>> up, so we can fixup the local APIC state.
>> It sounds like there's a local CPU vs. other CPU issue
>> with respect to masking interrupts then?
>
> This is a related but different issue than the above idle thread
> blocking in the ACPI interfaces.
>
> The current idle loop services interrupts from the HALT state
> before continuing with the idle loop.  CPUs in deep C-state
> will have to execute some code to cleanup cpu state before
> servicing interrupts.
>
> One option is to have the hardware return control to the idle
> thread with interrupts masked.  Another option is to check
> for deep c-state cleanup in the interrupt path similar to
> tlb_service().
>

I think the issue might be different.
The following is what idle code doing.
cpu_acpi_idle()
{
        value  = AcpiGetRegister();  /* need a lock */
        using value to determine next idle type;
        cli();
        place the processor into Cx;
        sti();
}

The problem occurs in AcpiGetRegister(), it uses AcpiGbl_HardwareLock.
I suspect AcpiGbl_HardwareLock really works as a spin lock. Otherwise it
will not go into turnstiles block.

Thanks,
-Aubrey

Reply via email to