Hi Pavel, Len, On Sun, 1 Apr 2007 15:39:52 +0000, Pavel Machek wrote:Meanwhile Alexey Starikovskiy pointed me to the acpi_ex_enter/exit_interpreter functions, which take an ACPI mutex (ACPI_MTX_INTERPRETER). As the mutex already exists, it sounds more efficient to just reuse it rather than introducing a new one. I made an experiment with the f71805f driver on a machine where ACPI is accessing the F71805F chip, and it appears to work fine; patch at the end of this post is someone wants to take a look and/or comment. Looking at the comment before acpi_ex_exit_interpreter raises two questions though: 1* This suggests that the mutex could be released by the AML interpreter in the middle of an SMBus transaction. If so, and if it happens in practice, this means that we unfortunately cannot use this mutex to reliably protect the SMBus drivers from concurrent accesses. This even suggests that it's simply not possible to have a mutex we take at the beginning when entering the AML interpreter and we release when leaving the AML interpreter, as it looks like ACPI itself allows interlaced execution of AML functions. Len, is this true? What is the purpose of the ACPI_MTX_INTERPRETER mutex in the first place, given that it seems it will be released on numerous occasions? Is it to prevent concurrent AML execution while still allowing interlaced execution? 2* What are "user-installed opregion handlers"? Are they something that could help solve the ACPI vs. other drivers problem? Thanks. --- drivers/acpi/utilities/utmutex.c | 2 ++ drivers/hwmon/f71805f.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) --- linux-2.6.21-rc5.orig/drivers/acpi/utilities/utmutex.c 2007-02-21 08:34:20.000000000 +0100 +++ linux-2.6.21-rc5/drivers/acpi/utilities/utmutex.c 2007-04-02 15:48:41.000000000 +0200 @@ -265,6 +265,7 @@ acpi_status acpi_ut_acquire_mutex(acpi_m return (status); } +EXPORT_SYMBOL_GPL(acpi_ut_acquire_mutex); /******************************************************************************* * @@ -339,3 +340,4 @@ acpi_status acpi_ut_release_mutex(acpi_m acpi_os_release_mutex(acpi_gbl_mutex_info[mutex_id].mutex); return (AE_OK); } +EXPORT_SYMBOL_GPL(acpi_ut_release_mutex); --- linux-2.6.21-rc5.orig/drivers/hwmon/f71805f.c 2007-04-02 15:20:46.000000000 +0200 +++ linux-2.6.21-rc5/drivers/hwmon/f71805f.c 2007-04-02 17:15:46.000000000 +0200 @@ -37,6 +37,10 @@ #include <linux/sysfs.h> #include <asm/io.h> +#ifdef CONFIG_ACPI +#include <acpi/acpi.h> +#endif + static struct platform_device *pdev; #define DRVNAME "f71805f" @@ -273,15 +277,29 @@ static inline u8 temp_to_reg(long val) /* Must be called with data->update_lock held, except during initialization */ static u8 f71805f_read8(struct f71805f_data *data, u8 reg) { + u8 val; +#ifdef CONFIG_ACPI + acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); +#endif outb(reg, data->addr + ADDR_REG_OFFSET); - return inb(data->addr + DATA_REG_OFFSET); + val = inb(data->addr + DATA_REG_OFFSET); +#ifdef CONFIG_ACPI + acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); +#endif + return val; } /* Must be called with data->update_lock held, except during initialization */ static void f71805f_write8(struct f71805f_data *data, u8 reg, u8 val) { +#ifdef CONFIG_ACPI + acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); +#endif outb(reg, data->addr + ADDR_REG_OFFSET); outb(val, data->addr + DATA_REG_OFFSET); +#ifdef CONFIG_ACPI + acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); +#endif } /* It is important to read the MSB first, because doing so latches the @@ -291,10 +309,16 @@ static u16 f71805f_read16(struct f71805f { u16 val; +#ifdef CONFIG_ACPI + acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); +#endif outb(reg, data->addr + ADDR_REG_OFFSET); val = inb(data->addr + DATA_REG_OFFSET) << 8; outb(++reg, data->addr + ADDR_REG_OFFSET); val |= inb(data->addr + DATA_REG_OFFSET); +#ifdef CONFIG_ACPI + acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); +#endif return val; } @@ -302,10 +326,16 @@ static u16 f71805f_read16(struct f71805f /* Must be called with data->update_lock held, except during initialization */ static void f71805f_write16(struct f71805f_data *data, u8 reg, u16 val) { +#ifdef CONFIG_ACPI + acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); +#endif outb(reg, data->addr + ADDR_REG_OFFSET); outb(val >> 8, data->addr + DATA_REG_OFFSET); outb(++reg, data->addr + ADDR_REG_OFFSET); outb(val & 0xff, data->addr + DATA_REG_OFFSET); +#ifdef CONFIG_ACPI + acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); +#endif } static struct f71805f_data *f71805f_update_device(struct device *dev) -- Jean Delvare -
| Greg Kroah-Hartman | [PATCH 006/196] Chinese: add translation of oops-tracing.txt |
| Linus Torvalds | Linux 2.6.21-rc1 |
| david | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| Vladislav Bolkhovitin | Re: Integration of SCST in the mainstream Linux kernel |
| Alexey Dobriyan | Re: [GIT]: Networking |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Evgeniy Polyakov | Re: [BUG] New Kernel Bugs |
git: | |
