RE: [PATCH] ACPICA: Export mutex functions

Zheng, Lv
2017-04-18T07:14:36Z

Hi,

> From: Zheng, Lv
> Subject: RE: [PATCH] ACPICA: Export mutex functions
>
> Hi,
>
> > From: Guenter Roeck [mailto:linux@roeck-us.net]
> > Subject: Re: [PATCH] ACPICA: Export mutex functions
> >
> > On 04/17/2017 04:53 PM, Zheng, Lv wrote:
> > > Hi,
> > >
> > >> From: Guenter Roeck [mailto:linux@roeck-us.net]
> > >> Subject: Re: [PATCH] ACPICA: Export mutex functions
> > >>
> > >> On Mon, Apr 17, 2017 at 11:29:38PM +0200, Rafael J. Wysocki wrote:
> > >>> On Mon, Apr 17, 2017 at 11:03 PM, Guenter Roeck <linux@roeck-us.net> wrote:
> > >>>> On Mon, Apr 17, 2017 at 08:40:38PM +0000, Moore, Robert wrote:
> > >>>>>
> > >>>>>
> > >>>>>> From: Guenter Roeck [mailto:linux@roeck-us.net]
> > >>>>>> Subject: Re: [PATCH] ACPICA: Export mutex functions
> > >>>>>>
> > >>>>>> On Mon, Apr 17, 2017 at 07:27:37PM +0000, Moore, Robert wrote:
> > >>>>>>>
> > >>>>>>>> From: Moore, Robert
> > >>>>>>>> Subject: RE: [PATCH] ACPICA: Export mutex functions
> > >>>>>>>>
> > >>>>>>>> There is a model for the drivers to directly acquire an AML mutex
> > >>>>>>>> object. That is why the acquire/release public interfaces were added
> > >>>>>>>> to ACPICA.
> > >>>>>>>>
> > >>>>>>>> I forget all of the details, but the model was developed with MS and
> > >>>>>>>> others during the ACPI 6.0 timeframe.
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>> [Moore, Robert]
> > >>>>>>>
> > >>>>>>>
> > >>>>>>> Here is the case where the OS may need to directly acquire an AML
> > >>>>>> mutex:
> > >>>>>>>
> > >>>>>>> From the ACPI spec:
> > >>>>>>>
> > >>>>>>> 19.6.2 Acquire (Acquire a Mutex)
> > >>>>>>>
> > >>>>>>> Note: For Mutex objects referenced by a _DLM object, the host OS may
> > >>>>>> also contend for ownership.
> > >>>>>>>
> > >>>>>> From the context in the dsdt, and from description of expected use cases
> > >>>>>> for _DLM objects I can find, this is what the mutex is used for (to
> > >>>>>> serialize access to a resource on a low pin count serial interconnect,
> > >>>>>> aka LPC).
> > >>>>>>
> > >>>>>> What does that mean in practice ? That I am not supposed to use it
> > >>>>>> because it doesn't follow standard ACPI mutex declaration rules ?
> > >>>>>>
> > >>>>>> Thanks,
> > >>>>>> Guenter
> > >>>>>>
> > >>>>>>>
> > >>>>> [Moore, Robert]
> > >>>>>
> > >>>>> I'm not an expert on the _DLM method, but I would point you to the description section in the
> > >> ACPI spec, 5.7.5 _DLM (DeviceLock Mutex).
> > >>>>>
> > >>>>
> > >>>> I did. However, not being an ACPI expert, that doesn't tell me anything.
> > >>>
> > >>> Basically, if the kernel and AML need to access a device concurrently,
> > >>> there should be a _DLM object under that device in the ACPI tables.
> > >>> In that case it is expected to return a list of (AML) mutexes that can
> > >>> be acquired by the kernel in order to synchronize device access with
> > >>> respect to AML (and for each mutex it may also return a description of
> > >>> the specific resources to be protected by it).
> > >>>
> > >>> Bottom line: without _DLM, the kernel cannot synchronize things with
> > >>> respect to AML properly, because it has no information how to do that
> > >>> then.
> > >>
> > >> That is all quite interesting. I do see the mutex in question used on various
> > >> motherboards from various vendors (I checked boards from Gigabyte, MSI, and
> > >> Intel). Interestingly, the naming seems to be consistent - it is always named
> > >> "MUT0". For the most part, it seems to be available on more recent
> > >> motherboards; older motherboards tend to use the resource without locking.
> > >> However, I don't see any mention of "_DLM" in any of the DSDTs.
> > >>
> > >
> > > OK, then you might be having problems in your opregion driver.
> > >
> > >> At the same time, access to ports 0x2e/0x2f is widely used in the kernel.
> > >> As mentioned before, it is used in watchdog, hardware monitoring, and gpio
> > >> drivers, but also in parallel port and infrared driver code. Effectively
> > >> that means that all this code is inherently unsafe on systems with ACPI
> > >> support.
> > >>
> > >> I had thought about implementing a set of utility functions to make the kernel
> > >> code safer to use if the mutex is found to exist.
> > >
> > > As what you've mentioned, there are already lots of parallel accesses in kernel without enabling
> > ACPI.
> > > Are these accesses mutually exclusive (safe)?
> >
> > In-kernel, yes (using request_muxed_region). Against ACPI, no.
> >
> > > If so, why do you need to invent a new synchronization mechanism?
> > >
> >
> > Because I am seeing a problem with the current code (more specifically,
> > with the it87 hwmon driver) on new Gigabyte boards.
>
> I checked superio_enter()/superio_exit(), IMO, the mutual exclusion
> might be handled using 1 of the following 2 solutions:
>
> 1. _DLM, then you can find superio related mutex from _DLM and
> acquire/release it in superio_enter()/superio_exit().
> You really need a set of new APIs to acquire the _DLM related mutex.
> If you don't have _DLM in your DSDT, directly exporting ACPICA mutex
> functions seem to be a reasonable solution.
> 2. Normally, AML developer should abstract superio accesses into customized
> opregion, then you can prepare a superio opregion driver.
>
> >
> > >> Right now I wonder, though,
> > >> if such code would have a chance to be accepted. Any thoughts on that ?
> > >
> > > Is that possible to make it safe in the opregion driver?
> > >
> >
> > Sorry, I don't think I understand what you mean with "opregion driver".
> > Do you refer to the drivers accessing the memory region in question,
> > or in other words replicating the necessary code in every driver accessing
> > that region ? Sure, I can do that, if that is the preferred solution;
> > I have no problem with that. However, that would require exporting
> > the ACPI mutex functions. My understanding is that you are opposed to
> > exporting those, so I assume that is not what you refer to.
> > Can you clarify ?
>
> I mean solution 2.

Maybe I should provide more detailed examples for this solution.

For example:
OperationRegion (SIOT, SuperIOAddressSpace, Zero, 100)
Field (SIOT, ByteAcc, Lock, Preserve)
{
FNC1, 8,
FNC2, 8,
...
}

Acquire (MUX0)
Store (0, FNC1)
Release (MUX0)

Then you can call (let me use casual pseudo code)
acpi_install_operation_region(SuperIOAddressSpace, superio_opregion_handler) from OS side.
In its callback superio_opregion_handler(), you can:

superio_enter();
If (address == 0) {
/* mean FNC1 */
Perform the locked superior accesses
} else if (address == 1) {
/* mean FNC2 */
Perform the locked superior accesses
}
superio_exit();

Are there similar approach in your DSDT?

Thanks and best regards
Lv

> From it87_find() I really couldn't see a possibility to convert superio
> accesses into opregions. Could you paste some example superio access AML
> code from your DSDT here.
>
> Thanks and best regards
> Lv