Dana.Myers wrote:
> Let's take a step back here and think about what we really
> want to happen.
>
> Cx is controlled using P_BLK registers, which are a per-CPU
> hardware resource; is it correct to assume that manipulation of
> a P_BLK is always done on the corresponding CPU? Another way of
> stating this - is it correct to assume that a P_BLK is never
> manipulated by another CPU?
No, we are not talking about P_BLK, we are talking about BM_STS in PM1
Status Registers, which is not a per-CPU hardware resource, and BM_RLD
as well.
Thanks,
-Aubrey
>
>
>
> Li, Aubrey wrote:
>> Dana.Myers wrote:
>>
>>> Li, Aubrey wrote:
>>>> I would suggest this following patch for this issue:
>>>> =====================================
>>>> diff -r cb29bc2e1e6e usr/src/uts/intel/io/acpica/osl.c
>>>> --- a/usr/src/uts/intel/io/acpica/osl.c Sun Jul 13 14:36:23 2008
>>>> -0700 +++ b/usr/src/uts/intel/io/acpica/osl.c Mon Jul 14
10:44:33
>>>> 2008 +0800 @@ -439,7 +439,7 @@ return
(AE_BAD_PARAMETER);
>>>> mp = (kmutex_t *)kmem_alloc(sizeof (kmutex_t), KM_SLEEP);
>>>> - mutex_init(mp, NULL, MUTEX_DRIVER, NULL);
>>>> + mutex_init(mp, NULL, MUTEX_SPIN, (void *)PIL_MAX);
>>>> *OutHandle = (ACPI_HANDLE)mp;
>>>> return (AE_OK);
>>>> =====================================
>>>>
>>>> Any thoughts?
>>>>
>>> Absolutely. I'm not yet certain what the semantics of a Linux
>>> spinlock are and whether the semantics of a Solaris mutex(...
>>> MUTEX_SPIN ...) truly match it.
>>>
>>> What are the semantics of a Linux spinlock? I'll take a look at
>>> this in the morning.
>>
>> If I understand correctly, spinlock is a very simple single-holder
>> lock, designed for multiprocessor and useless in UP environment. If
>> a process attempts to acquire a spinlock and it's unavailable, the
>> process will keep trying(spinning) until it can acquire the lock.
>>
>> Thanks,
>> -Aubrey
>>
>>> Cheers,
>>> Dana
>>>> Thanks,
>>>> -Aubrey
>>>>
>>>> Li, Aubrey wrote:
>>>>
>>>>
>>>>> Liu, Jiang wrote:
>>>>>
>>>>>
>>>>>> Hi Aubrey,
>>>>>> Currently solaris ACPICA OSL layer uses adaptive mutex to
>>>>>> implement ACPI Lock which seems not confirm to ACPICA programmer
>>>>>> manual. Please refer to Section 7.4.5 of "ACPI Component
>>>>>> Architecture Programmer Reference" as below:
>>>>>>
>>>>>> 7.4.5 AcpiOsCreateLock
>>>>>> Functional Description:
>>>>>> Create a spin lock. Spin locks are used in the ACPI CA subsystem
>>>>>> only when there is requirement for mutual exclusion on data
>>>>>> structures that are accessed by both interrupt handlers and
>>>>>> normal code.
>>>>>>
>>>>> Yeah, from ACPICA manual, hardware lock must a spin lock.
>>>>> Solaris OSL initialize it as MUTEX_DRIVER, which could be either
>>>>> MUTEX_ADAPTIVE or MUTEX_SPIN depending on the iblock cookie.
>>>>> Since iblock cookie is NULL for AcpiGbl_HardwareLock, so it's
>>>>> adaptive. I think it should be initialized as MUTEX_SPIN.
>>>>>
>>>>> Thanks,
>>>>> -Aubrey
>>>>>
>>>>>
>>>>>> Aubrey Li <> wrote:
>>>>>>
>>>>>>> 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
>>>>>>> _______________________________________________
>>>>>>> tesla-dev mailing list
>>>>>>> tesla-dev at opensolaris.org
>>>>>>> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>>>>>>>
>>>>>> _______________________________________________
>>>>>> tesla-dev mailing list
>>>>>> tesla-dev at opensolaris.org
>>>>>> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>>>>>>
>>>>> _______________________________________________
>>>>> tesla-dev mailing list
>>>>> tesla-dev at opensolaris.org
>>>>> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>>
>> _______________________________________________
>> tesla-dev mailing list
>> tesla-dev at opensolaris.org
>> http://mail.opensolaris.org/mailman/listinfo/tesla-dev