2019-09-12 08:20:19

by Nikolaus Voss

[permalink] [raw]
Subject: [PATCH] ACPICA: make acpi_load_table() return table index

For unloading an ACPI table, it is necessary to provide the
index of the table. The method intended for dynamically
loading or hotplug addition of tables, acpi_load_table(),
should provide this information via an optional pointer
to the loaded table index.

This patch fixes the table unload function of acpi_configfs.

Reported-by: Andy Shevchenko <[email protected]>
Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table loads")
Signed-off-by: Nikolaus Voss <[email protected]>
---
drivers/acpi/acpi_configfs.c | 2 +-
drivers/acpi/acpica/dbfileio.c | 2 +-
drivers/acpi/acpica/tbxfload.c | 8 ++++++--
drivers/firmware/efi/efi.c | 2 +-
include/acpi/acpixf.h | 3 ++-
5 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c
index 57d9d574d4dde..77f81242a28e6 100644
--- a/drivers/acpi/acpi_configfs.c
+++ b/drivers/acpi/acpi_configfs.c
@@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg,
if (!table->header)
return -ENOMEM;

- ret = acpi_load_table(table->header);
+ ret = acpi_load_table(table->header, &table->index);
if (ret) {
kfree(table->header);
table->header = NULL;
diff --git a/drivers/acpi/acpica/dbfileio.c b/drivers/acpi/acpica/dbfileio.c
index c6e25734dc5cd..e1b6e54a96ac1 100644
--- a/drivers/acpi/acpica/dbfileio.c
+++ b/drivers/acpi/acpica/dbfileio.c
@@ -93,7 +93,7 @@ acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head)
while (table_list_head) {
table = table_list_head->table;

- status = acpi_load_table(table);
+ status = acpi_load_table(table, NULL);
if (ACPI_FAILURE(status)) {
if (status == AE_ALREADY_EXISTS) {
acpi_os_printf
diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c
index 86f1693f6d29a..d08cd8ffcbdb6 100644
--- a/drivers/acpi/acpica/tbxfload.c
+++ b/drivers/acpi/acpica/tbxfload.c
@@ -268,7 +268,8 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
*
* PARAMETERS: table - Pointer to a buffer containing the ACPI
* table to be loaded.
- *
+ * table_idx - Pointer to a u32 for storing the table
+ * index, might be NULL
* RETURN: Status
*
* DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must
@@ -278,7 +279,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
* to ensure that the table is not deleted or unmapped.
*
******************************************************************************/
-acpi_status acpi_load_table(struct acpi_table_header *table)
+acpi_status acpi_load_table(struct acpi_table_header *table, u32 *table_idx)
{
acpi_status status;
u32 table_index;
@@ -297,6 +298,9 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
FALSE, &table_index);
+ if (table_idx)
+ *table_idx = table_index;
+
if (ACPI_SUCCESS(status)) {

/* Complete the initialization/resolution of new objects */
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index ad3b1f4866b35..9773e4212baef 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -308,7 +308,7 @@ static __init int efivar_ssdt_load(void)
goto free_data;
}

- ret = acpi_load_table(data);
+ ret = acpi_load_table(data, NULL);
if (ret) {
pr_err("failed to load table: %d\n", ret);
goto free_data;
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
index 3845c8fcc94e5..c90bbdc4146a6 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
u8 physical))

ACPI_EXTERNAL_RETURN_STATUS(acpi_status
- acpi_load_table(struct acpi_table_header *table))
+ acpi_load_table(struct acpi_table_header *table,
+ u32 *table_idx))

ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_unload_parent_table(acpi_handle object))
--
2.17.1


2019-09-12 14:22:58

by Moore, Robert

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

Nikolaus,
The ability to unload an ACPI table (especially AML tables such as SSDTs) is in the process of being deprecated in ACPICA -- since it is also deprecated in the current ACPI specification. This is being done because of the difficulty of deleting the namespace entries for the table. FYI, Windows does not properly support this function either.

Bob


-----Original Message-----
From: Nikolaus Voss [mailto:[email protected]]
Sent: Thursday, September 12, 2019 1:08 AM
To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Moore, Robert <[email protected]>
Cc: Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; Nikolaus Voss <[email protected]>
Subject: [PATCH] ACPICA: make acpi_load_table() return table index

For unloading an ACPI table, it is necessary to provide the index of the table. The method intended for dynamically loading or hotplug addition of tables, acpi_load_table(), should provide this information via an optional pointer to the loaded table index.

This patch fixes the table unload function of acpi_configfs.

Reported-by: Andy Shevchenko <[email protected]>
Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table loads")
Signed-off-by: Nikolaus Voss <[email protected]>
---
drivers/acpi/acpi_configfs.c | 2 +-
drivers/acpi/acpica/dbfileio.c | 2 +-
drivers/acpi/acpica/tbxfload.c | 8 ++++++--
drivers/firmware/efi/efi.c | 2 +-
include/acpi/acpixf.h | 3 ++-
5 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c index 57d9d574d4dde..77f81242a28e6 100644
--- a/drivers/acpi/acpi_configfs.c
+++ b/drivers/acpi/acpi_configfs.c
@@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg,
if (!table->header)
return -ENOMEM;

- ret = acpi_load_table(table->header);
+ ret = acpi_load_table(table->header, &table->index);
if (ret) {
kfree(table->header);
table->header = NULL;
diff --git a/drivers/acpi/acpica/dbfileio.c b/drivers/acpi/acpica/dbfileio.c index c6e25734dc5cd..e1b6e54a96ac1 100644
--- a/drivers/acpi/acpica/dbfileio.c
+++ b/drivers/acpi/acpica/dbfileio.c
@@ -93,7 +93,7 @@ acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head)
while (table_list_head) {
table = table_list_head->table;

- status = acpi_load_table(table);
+ status = acpi_load_table(table, NULL);
if (ACPI_FAILURE(status)) {
if (status == AE_ALREADY_EXISTS) {
acpi_os_printf
diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c index 86f1693f6d29a..d08cd8ffcbdb6 100644
--- a/drivers/acpi/acpica/tbxfload.c
+++ b/drivers/acpi/acpica/tbxfload.c
@@ -268,7 +268,8 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
*
* PARAMETERS: table - Pointer to a buffer containing the ACPI
* table to be loaded.
- *
+ * table_idx - Pointer to a u32 for storing the table
+ * index, might be NULL
* RETURN: Status
*
* DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must @@ -278,7 +279,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
* to ensure that the table is not deleted or unmapped.
*
******************************************************************************/
-acpi_status acpi_load_table(struct acpi_table_header *table)
+acpi_status acpi_load_table(struct acpi_table_header *table, u32
+*table_idx)
{
acpi_status status;
u32 table_index;
@@ -297,6 +298,9 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
FALSE, &table_index);
+ if (table_idx)
+ *table_idx = table_index;
+
if (ACPI_SUCCESS(status)) {

/* Complete the initialization/resolution of new objects */ diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index ad3b1f4866b35..9773e4212baef 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -308,7 +308,7 @@ static __init int efivar_ssdt_load(void)
goto free_data;
}

- ret = acpi_load_table(data);
+ ret = acpi_load_table(data, NULL);
if (ret) {
pr_err("failed to load table: %d\n", ret);
goto free_data;
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 3845c8fcc94e5..c90bbdc4146a6 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
u8 physical))

ACPI_EXTERNAL_RETURN_STATUS(acpi_status
- acpi_load_table(struct acpi_table_header *table))
+ acpi_load_table(struct acpi_table_header *table,
+ u32 *table_idx))

ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_unload_parent_table(acpi_handle object))
--
2.17.1

2019-09-12 20:10:42

by Ferry Toth

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

Op 12-09-19 om 16:19 schreef Moore, Robert:
> Nikolaus,
> The ability to unload an ACPI table (especially AML tables such as SSDTs) is in the process of being deprecated in ACPICA -- since it is also deprecated in the current ACPI specification. This is being done because of the difficulty of deleting the namespace entries for the table. FYI, Windows does not properly support this function either.

I really hope this is not the case. On x86 loading/unloading SSDTs has
proven to be a powerful way to handle reconfigurable hardware without
rebooting and without requiring dedicated platform drivers. Same for
user plugable hardware on i2c/spi busses.

This has worked before and will violate the "don't break user space" rule.

I don't see why Windows is an example to follow. On Windows platform
drivers don't get compiled into the kernel and don't need to be upstreamed.

> Bob
>
>
> -----Original Message-----
> From: Nikolaus Voss [mailto:[email protected]]
> Sent: Thursday, September 12, 2019 1:08 AM
> To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Moore, Robert <[email protected]>
> Cc: Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; Nikolaus Voss <[email protected]>
> Subject: [PATCH] ACPICA: make acpi_load_table() return table index
>
> For unloading an ACPI table, it is necessary to provide the index of the table. The method intended for dynamically loading or hotplug addition of tables, acpi_load_table(), should provide this information via an optional pointer to the loaded table index.
>
> This patch fixes the table unload function of acpi_configfs.
>
> Reported-by: Andy Shevchenko <[email protected]>
> Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table loads")
> Signed-off-by: Nikolaus Voss <[email protected]>
> ---
> drivers/acpi/acpi_configfs.c | 2 +-
> drivers/acpi/acpica/dbfileio.c | 2 +-
> drivers/acpi/acpica/tbxfload.c | 8 ++++++--
> drivers/firmware/efi/efi.c | 2 +-
> include/acpi/acpixf.h | 3 ++-
> 5 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c index 57d9d574d4dde..77f81242a28e6 100644
> --- a/drivers/acpi/acpi_configfs.c
> +++ b/drivers/acpi/acpi_configfs.c
> @@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg,
> if (!table->header)
> return -ENOMEM;
>
> - ret = acpi_load_table(table->header);
> + ret = acpi_load_table(table->header, &table->index);
> if (ret) {
> kfree(table->header);
> table->header = NULL;
> diff --git a/drivers/acpi/acpica/dbfileio.c b/drivers/acpi/acpica/dbfileio.c index c6e25734dc5cd..e1b6e54a96ac1 100644
> --- a/drivers/acpi/acpica/dbfileio.c
> +++ b/drivers/acpi/acpica/dbfileio.c
> @@ -93,7 +93,7 @@ acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head)
> while (table_list_head) {
> table = table_list_head->table;
>
> - status = acpi_load_table(table);
> + status = acpi_load_table(table, NULL);
> if (ACPI_FAILURE(status)) {
> if (status == AE_ALREADY_EXISTS) {
> acpi_os_printf
> diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c index 86f1693f6d29a..d08cd8ffcbdb6 100644
> --- a/drivers/acpi/acpica/tbxfload.c
> +++ b/drivers/acpi/acpica/tbxfload.c
> @@ -268,7 +268,8 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
> *
> * PARAMETERS: table - Pointer to a buffer containing the ACPI
> * table to be loaded.
> - *
> + * table_idx - Pointer to a u32 for storing the table
> + * index, might be NULL
> * RETURN: Status
> *
> * DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must @@ -278,7 +279,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
> * to ensure that the table is not deleted or unmapped.
> *
> ******************************************************************************/
> -acpi_status acpi_load_table(struct acpi_table_header *table)
> +acpi_status acpi_load_table(struct acpi_table_header *table, u32
> +*table_idx)
> {
> acpi_status status;
> u32 table_index;
> @@ -297,6 +298,9 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
> status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
> ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
> FALSE, &table_index);
> + if (table_idx)
> + *table_idx = table_index;
> +
> if (ACPI_SUCCESS(status)) {
>
> /* Complete the initialization/resolution of new objects */ diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index ad3b1f4866b35..9773e4212baef 100644
> --- a/drivers/firmware/efi/efi.c
> +++ b/drivers/firmware/efi/efi.c
> @@ -308,7 +308,7 @@ static __init int efivar_ssdt_load(void)
> goto free_data;
> }
>
> - ret = acpi_load_table(data);
> + ret = acpi_load_table(data, NULL);
> if (ret) {
> pr_err("failed to load table: %d\n", ret);
> goto free_data;
> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 3845c8fcc94e5..c90bbdc4146a6 100644
> --- a/include/acpi/acpixf.h
> +++ b/include/acpi/acpixf.h
> @@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
> u8 physical))
>
> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> - acpi_load_table(struct acpi_table_header *table))
> + acpi_load_table(struct acpi_table_header *table,
> + u32 *table_idx))
>
> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> acpi_unload_parent_table(acpi_handle object))
> --
> 2.17.1
>
>

2019-09-13 07:50:07

by Nikolaus Voss

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

Bob,

On Thu, 12 Sep 2019, Moore, Robert wrote:
> The ability to unload an ACPI table (especially AML tables such as
> SSDTs) is in the process of being deprecated in ACPICA -- since it is
> also deprecated in the current ACPI specification. This is being done
> because of the difficulty of deleting the namespace entries for the
> table. FYI, Windows does not properly support this function either.

ok, I see it can be a problem to unload an AML table with all it's
consequences e.g. with respect to driver unregistering in setups with
complex dependencies. It will only work properly under certain conditions
- nevertheless acpi_tb_unload_table() is still exported in ACPICA and we
should get this working as it worked before.

The API change I request is not directly related to table unloading, it's
just that the index of the loaded table is returned for future reference:

[...]

>> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 3845c8fcc94e5..c90bbdc4146a6 100644
>> --- a/include/acpi/acpixf.h
>> +++ b/include/acpi/acpixf.h
>> @@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
>> u8 physical))
>>
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> - acpi_load_table(struct acpi_table_header *table))
>> + acpi_load_table(struct acpi_table_header *table,
>> + u32 *table_idx))
>>
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> acpi_unload_parent_table(acpi_handle object))
>> --
>> 2.17.1
>>

This allows for a simple fix of the regression and doesn't imply future
support for table unloading. Would this be acceptable?

Niko

2019-09-13 15:33:24

by Moore, Robert

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index



-----Original Message-----
From: Nikolaus Voss [mailto:[email protected]]
Sent: Friday, September 13, 2019 12:44 AM
To: Moore, Robert <[email protected]>
Cc: Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Ferry Toth <[email protected]>; [email protected]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

Bob,

On Thu, 12 Sep 2019, Moore, Robert wrote:
> The ability to unload an ACPI table (especially AML tables such as
> SSDTs) is in the process of being deprecated in ACPICA -- since it is
> also deprecated in the current ACPI specification. This is being done
> because of the difficulty of deleting the namespace entries for the
> table. FYI, Windows does not properly support this function either.

ok, I see it can be a problem to unload an AML table with all it's consequences e.g. with respect to driver unregistering in setups with complex dependencies. It will only work properly under certain conditions
- nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.

AcpiTbUnloadTable is not exported, it is an internal interface only -- as recognized by the "AcpiTb". I'm not sure that I want to change the interface to AcpiLoadTable just for something that is being deprecated. Already, we throw an ACPI_EXCEPTION if the Unload operator is encountered in the AML byte stream. The same thing with AcpiUnloadParentTable - it is being deprecated.


ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
"AML Unload operator is not supported"));


The API change I request is not directly related to table unloading, it's just that the index of the loaded table is returned for future reference:

[...]

>> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index
>> 3845c8fcc94e5..c90bbdc4146a6 100644
>> --- a/include/acpi/acpixf.h
>> +++ b/include/acpi/acpixf.h
>> @@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
>> u8 physical))
>>
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> - acpi_load_table(struct acpi_table_header *table))
>> + acpi_load_table(struct acpi_table_header *table,
>> + u32 *table_idx))
>>
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> acpi_unload_parent_table(acpi_handle object))
>> --
>> 2.17.1
>>

This allows for a simple fix of the regression and doesn't imply future support for table unloading. Would this be acceptable?

Niko

2019-09-13 16:37:48

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
> -----Original Message-----
> From: Nikolaus Voss [mailto:[email protected]]
> Sent: Friday, September 13, 2019 12:44 AM
> To: Moore, Robert <[email protected]>
> Cc: Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Ferry Toth <[email protected]>; [email protected]
> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>
> Bob,
>
> On Thu, 12 Sep 2019, Moore, Robert wrote:
> > The ability to unload an ACPI table (especially AML tables such as
> > SSDTs) is in the process of being deprecated in ACPICA -- since it is
> > also deprecated in the current ACPI specification. This is being done
> > because of the difficulty of deleting the namespace entries for the
> > table. FYI, Windows does not properly support this function either.
>
> ok, I see it can be a problem to unload an AML table with all it's consequences e.g. with respect to driver unregistering in setups with complex dependencies. It will only work properly under certain conditions
> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>
> AcpiTbUnloadTable is not exported, it is an internal interface only -- as
> recognized by the "AcpiTb".

In Linux it became a part of ABI when the

commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
Author: Jan Kiszka <[email protected]>
Date: Fri Jun 9 20:36:31 2017 +0200

ACPI: configfs: Unload SSDT on configfs entry removal

appeared in the kernel.

> I'm not sure that I want to change the interface
> to AcpiLoadTable just for something that is being deprecated. Already, we
> throw an ACPI_EXCEPTION if the Unload operator is encountered in the AML byte
> stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>
> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
> "AML Unload operator is not supported"));

--
With Best Regards,
Andy Shevchenko


2019-09-13 17:13:24

by Ferry Toth

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

Hello all,

Sorry to have sent our message with cancelled e-mail address. I have
correct this now.

Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>> -----Original Message-----
>> From: Nikolaus Voss [mailto:[email protected]]
>> Sent: Friday, September 13, 2019 12:44 AM
>> To: Moore, Robert <[email protected]>
>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Ferry Toth <[email protected]>; [email protected]
>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>>
>> Bob,
>>
>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>> The ability to unload an ACPI table (especially AML tables such as
>>> SSDTs) is in the process of being deprecated in ACPICA -- since it is
>>> also deprecated in the current ACPI specification. This is being done
>>> because of the difficulty of deleting the namespace entries for the
>>> table. FYI, Windows does not properly support this function either.
>>
>> ok, I see it can be a problem to unload an AML table with all it's consequences e.g. with respect to driver unregistering in setups with complex dependencies. It will only work properly under certain conditions
>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>
>> AcpiTbUnloadTable is not exported, it is an internal interface only -- as
>> recognized by the "AcpiTb".
>
> In Linux it became a part of ABI when the
>
> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
> Author: Jan Kiszka <[email protected]>
> Date: Fri Jun 9 20:36:31 2017 +0200
>
> ACPI: configfs: Unload SSDT on configfs entry removal
>
> appeared in the kernel.

And the commit message explains quite well why it is an important feature:

"This allows to change SSDTs without rebooting the system.
It also allows to destroy devices again that a dynamically loaded SSDT
created.

This is widely similar to the DT overlay behavior."

>> I'm not sure that I want to change the interface
>> to AcpiLoadTable just for something that is being deprecated. Already, we
>> throw an ACPI_EXCEPTION if the Unload operator is encountered in the AML byte
>> stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>
>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>> "AML Unload operator is not supported"));
>


2019-09-13 19:22:42

by Moore, Robert

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index



-----Original Message-----
From: Ferry Toth [mailto:[email protected]]
Sent: Friday, September 13, 2019 9:48 AM
To: Shevchenko, Andriy <[email protected]>; Moore, Robert <[email protected]>
Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

Hello all,

Sorry to have sent our message with cancelled e-mail address. I have correct this now.

Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>> -----Original Message-----
>> From: Nikolaus Voss [mailto:[email protected]]
>> Sent: Friday, September 13, 2019 12:44 AM
>> To: Moore, Robert <[email protected]>
>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>> Brown <[email protected]>; Jacek Anaszewski
>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>> <[email protected]>; [email protected]; [email protected];
>> [email protected]; Ferry Toth <[email protected]>;
>> [email protected]
>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>> index
>>
>> Bob,
>>
>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>> The ability to unload an ACPI table (especially AML tables such as
>>> SSDTs) is in the process of being deprecated in ACPICA -- since it
>>> is also deprecated in the current ACPI specification. This is being
>>> done because of the difficulty of deleting the namespace entries for
>>> the table. FYI, Windows does not properly support this function either.
>>
>> ok, I see it can be a problem to unload an AML table with all it's
>> consequences e.g. with respect to driver unregistering in setups with
>> complex dependencies. It will only work properly under certain
>> conditions
>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>
>> AcpiTbUnloadTable is not exported, it is an internal interface only
>> -- as recognized by the "AcpiTb".
>
> In Linux it became a part of ABI when the
>
> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
> Author: Jan Kiszka <[email protected]>
> Date: Fri Jun 9 20:36:31 2017 +0200
>
> ACPI: configfs: Unload SSDT on configfs entry removal
>
> appeared in the kernel.

And the commit message explains quite well why it is an important feature:

"This allows to change SSDTs without rebooting the system.
It also allows to destroy devices again that a dynamically loaded SSDT created.

The biggest problem AFAIK is that under linux, many drivers cannot be unloaded. Also, there are many race conditions as the namespace entries "owned" by an SSDT being unloaded are deleted (out from underneath a driver).

This is widely similar to the DT overlay behavior."

>> I'm not sure that I want to change the interface to AcpiLoadTable
>> just for something that is being deprecated. Already, we throw an
>> ACPI_EXCEPTION if the Unload operator is encountered in the AML byte
>> stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>
>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>> "AML Unload operator is not supported"));
>

2019-09-14 08:26:58

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Fri, Sep 13, 2019 at 7:41 PM Moore, Robert <[email protected]> wrote:
>
>
>
> -----Original Message-----
> From: Ferry Toth [mailto:[email protected]]
> Sent: Friday, September 13, 2019 9:48 AM
> To: Shevchenko, Andriy <[email protected]>; Moore, Robert <[email protected]>
> Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
>
> Hello all,
>
> Sorry to have sent our message with cancelled e-mail address. I have correct this now.
>
> Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
> > On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
> >> -----Original Message-----
> >> From: Nikolaus Voss [mailto:[email protected]]
> >> Sent: Friday, September 13, 2019 12:44 AM
> >> To: Moore, Robert <[email protected]>
> >> Cc: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
> >> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
> >> Brown <[email protected]>; Jacek Anaszewski
> >> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> >> <[email protected]>; [email protected]; [email protected];
> >> [email protected]; Ferry Toth <[email protected]>;
> >> [email protected]
> >> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
> >> index
> >>
> >> Bob,
> >>
> >> On Thu, 12 Sep 2019, Moore, Robert wrote:
> >>> The ability to unload an ACPI table (especially AML tables such as
> >>> SSDTs) is in the process of being deprecated in ACPICA -- since it
> >>> is also deprecated in the current ACPI specification. This is being
> >>> done because of the difficulty of deleting the namespace entries for
> >>> the table. FYI, Windows does not properly support this function either.
> >>
> >> ok, I see it can be a problem to unload an AML table with all it's
> >> consequences e.g. with respect to driver unregistering in setups with
> >> complex dependencies. It will only work properly under certain
> >> conditions
> >> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
> >>
> >> AcpiTbUnloadTable is not exported, it is an internal interface only
> >> -- as recognized by the "AcpiTb".
> >
> > In Linux it became a part of ABI when the
> >
> > commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
> > Author: Jan Kiszka <[email protected]>
> > Date: Fri Jun 9 20:36:31 2017 +0200
> >
> > ACPI: configfs: Unload SSDT on configfs entry removal
> >
> > appeared in the kernel.
>
> And the commit message explains quite well why it is an important feature:
>
> "This allows to change SSDTs without rebooting the system.
> It also allows to destroy devices again that a dynamically loaded SSDT created.
>
> The biggest problem AFAIK is that under linux, many drivers cannot be unloaded.
> Also, there are many race conditions as the namespace entries "owned" by an SSDT
> being unloaded are deleted (out from underneath a driver).

While that is true in general, there are cases in which unloading does
work and they
still need to be supported.

You may argue that adding support for unloading SSDTs loaded via
configfs was a mistake,
but that was done and it cannot be undone.

We cannot break existing setups in which it is in use and works.

> This is widely similar to the DT overlay behavior."
>
> >> I'm not sure that I want to change the interface to AcpiLoadTable
> >> just for something that is being deprecated. Already, we throw an
> >> ACPI_EXCEPTION if the Unload operator is encountered in the AML byte
> >> stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
> >>
> >> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
> >> "AML Unload operator is not supported"));
> >
>

2019-09-16 16:57:20

by Nikolaus Voss

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

On Fri, 13 Sep 2019, Moore, Robert wrote:
>
>
> -----Original Message-----
> From: Ferry Toth [mailto:[email protected]]
> Sent: Friday, September 13, 2019 9:48 AM
> To: Shevchenko, Andriy <[email protected]>; Moore, Robert <[email protected]>
> Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
>
> Hello all,
>
> Sorry to have sent our message with cancelled e-mail address. I have correct this now.
>
> Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
>> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>>> -----Original Message-----
>>> From: Nikolaus Voss [mailto:[email protected]]
>>> Sent: Friday, September 13, 2019 12:44 AM
>>> To: Moore, Robert <[email protected]>
>>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
>>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>>> Brown <[email protected]>; Jacek Anaszewski
>>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>>> <[email protected]>; [email protected]; [email protected];
>>> [email protected]; Ferry Toth <[email protected]>;
>>> [email protected]
>>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>>> index
>>>
>>> Bob,
>>>
>>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>>> The ability to unload an ACPI table (especially AML tables such as
>>>> SSDTs) is in the process of being deprecated in ACPICA -- since it
>>>> is also deprecated in the current ACPI specification. This is being
>>>> done because of the difficulty of deleting the namespace entries for
>>>> the table. FYI, Windows does not properly support this function either.
>>>
>>> ok, I see it can be a problem to unload an AML table with all it's
>>> consequences e.g. with respect to driver unregistering in setups with
>>> complex dependencies. It will only work properly under certain
>>> conditions
>>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>>
>>> AcpiTbUnloadTable is not exported, it is an internal interface only
>>> -- as recognized by the "AcpiTb".
>>
>> In Linux it became a part of ABI when the
>>
>> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
>> Author: Jan Kiszka <[email protected]>
>> Date: Fri Jun 9 20:36:31 2017 +0200
>>
>> ACPI: configfs: Unload SSDT on configfs entry removal
>>
>> appeared in the kernel.
>
> And the commit message explains quite well why it is an important feature:
>
> "This allows to change SSDTs without rebooting the system.
> It also allows to destroy devices again that a dynamically loaded SSDT created.
>
> The biggest problem AFAIK is that under linux, many drivers cannot be unloaded. Also, there are many race conditions as the namespace entries "owned" by an SSDT being unloaded are deleted (out from underneath a driver).
>
> This is widely similar to the DT overlay behavior."
>
>>> I'm not sure that I want to change the interface to AcpiLoadTable
>>> just for something that is being deprecated. Already, we throw an
>>> ACPI_EXCEPTION if the Unload operator is encountered in the AML byte
>>> stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>>
>>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>>> "AML Unload operator is not supported"));

Bob, what is your suggestion to fix the regression then?

We could revert acpi_configfs.c to use acpi_tb_install_and_load_table()
instead of acpi_load_table(), leaving loaded APCI objects uninitalized,
but at least, unloading will work again.

Do we have any other options?

Niko

2019-09-18 14:16:45

by Moore, Robert

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index



-----Original Message-----
From: Nikolaus Voss [mailto:[email protected]]
Sent: Monday, September 16, 2019 2:47 AM
To: Moore, Robert <[email protected]>
Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

On Fri, 13 Sep 2019, Moore, Robert wrote:
>
>
> -----Original Message-----
> From: Ferry Toth [mailto:[email protected]]
> Sent: Friday, September 13, 2019 9:48 AM
> To: Shevchenko, Andriy <[email protected]>; Moore, Robert
> <[email protected]>
> Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik
> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
> Brown <[email protected]>; Jacek Anaszewski
> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> <[email protected]>; [email protected]; [email protected];
> [email protected]; [email protected]; Jan
> Kiszka <[email protected]>
> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
>
> Hello all,
>
> Sorry to have sent our message with cancelled e-mail address. I have correct this now.
>
> Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
>> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>>> -----Original Message-----
>>> From: Nikolaus Voss [mailto:[email protected]]
>>> Sent: Friday, September 13, 2019 12:44 AM
>>> To: Moore, Robert <[email protected]>
>>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
>>> <[email protected]>; Rafael J. Wysocki <[email protected]>;
>>> Len Brown <[email protected]>; Jacek Anaszewski
>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>> Murphy <[email protected]>; [email protected];
>>> [email protected]; [email protected]; Ferry Toth
>>> <[email protected]>; [email protected]
>>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>>> index
>>>
>>> Bob,
>>>
>>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>>> The ability to unload an ACPI table (especially AML tables such as
>>>> SSDTs) is in the process of being deprecated in ACPICA -- since it
>>>> is also deprecated in the current ACPI specification. This is being
>>>> done because of the difficulty of deleting the namespace entries
>>>> for the table. FYI, Windows does not properly support this function either.
>>>
>>> ok, I see it can be a problem to unload an AML table with all it's
>>> consequences e.g. with respect to driver unregistering in setups
>>> with complex dependencies. It will only work properly under certain
>>> conditions
>>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>>
>>> AcpiTbUnloadTable is not exported, it is an internal interface only
>>> -- as recognized by the "AcpiTb".
>>
>> In Linux it became a part of ABI when the
>>
>> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
>> Author: Jan Kiszka <[email protected]>
>> Date: Fri Jun 9 20:36:31 2017 +0200
>>
>> ACPI: configfs: Unload SSDT on configfs entry removal
>>
>> appeared in the kernel.
>
> And the commit message explains quite well why it is an important feature:
>
> "This allows to change SSDTs without rebooting the system.
> It also allows to destroy devices again that a dynamically loaded SSDT created.
>
> The biggest problem AFAIK is that under linux, many drivers cannot be unloaded. Also, there are many race conditions as the namespace entries "owned" by an SSDT being unloaded are deleted (out from underneath a driver).
>
> This is widely similar to the DT overlay behavior."
>
>>> I'm not sure that I want to change the interface to AcpiLoadTable
>>> just for something that is being deprecated. Already, we throw an
>>> ACPI_EXCEPTION if the Unload operator is encountered in the AML byte
>>> stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>>
>>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>>> "AML Unload operator is not supported"));

Bob, what is your suggestion to fix the regression then?

We could revert acpi_configfs.c to use acpi_tb_install_and_load_table() instead of acpi_load_table(), leaving loaded APCI objects uninitalized, but at least, unloading will work again.

I guess my next question is: why do you want to unload a table in the first place?


Do we have any other options?

Niko

2019-09-18 14:36:42

by Nikolaus Voss

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

On Wed, 18 Sep 2019, Moore, Robert wrote:
>
>
> -----Original Message-----
> From: Nikolaus Voss [mailto:[email protected]]
> Sent: Monday, September 16, 2019 2:47 AM
> To: Moore, Robert <[email protected]>
> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>
> On Fri, 13 Sep 2019, Moore, Robert wrote:
>>
>>
>> -----Original Message-----
>> From: Ferry Toth [mailto:[email protected]]
>> Sent: Friday, September 13, 2019 9:48 AM
>> To: Shevchenko, Andriy <[email protected]>; Moore, Robert
>> <[email protected]>
>> Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik
>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>> Brown <[email protected]>; Jacek Anaszewski
>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>> <[email protected]>; [email protected]; [email protected];
>> [email protected]; [email protected]; Jan
>> Kiszka <[email protected]>
>> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
>>
>> Hello all,
>>
>> Sorry to have sent our message with cancelled e-mail address. I have correct this now.
>>
>> Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
>>> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>>>> -----Original Message-----
>>>> From: Nikolaus Voss [mailto:[email protected]]
>>>> Sent: Friday, September 13, 2019 12:44 AM
>>>> To: Moore, Robert <[email protected]>
>>>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
>>>> <[email protected]>; Rafael J. Wysocki <[email protected]>;
>>>> Len Brown <[email protected]>; Jacek Anaszewski
>>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>>> Murphy <[email protected]>; [email protected];
>>>> [email protected]; [email protected]; Ferry Toth
>>>> <[email protected]>; [email protected]
>>>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>>>> index
>>>>
>>>> Bob,
>>>>
>>>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>>>> The ability to unload an ACPI table (especially AML tables such as
>>>>> SSDTs) is in the process of being deprecated in ACPICA -- since it
>>>>> is also deprecated in the current ACPI specification. This is being
>>>>> done because of the difficulty of deleting the namespace entries
>>>>> for the table. FYI, Windows does not properly support this function either.
>>>>
>>>> ok, I see it can be a problem to unload an AML table with all it's
>>>> consequences e.g. with respect to driver unregistering in setups
>>>> with complex dependencies. It will only work properly under certain
>>>> conditions
>>>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>>>
>>>> AcpiTbUnloadTable is not exported, it is an internal interface only
>>>> -- as recognized by the "AcpiTb".
>>>
>>> In Linux it became a part of ABI when the
>>>
>>> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
>>> Author: Jan Kiszka <[email protected]>
>>> Date: Fri Jun 9 20:36:31 2017 +0200
>>>
>>> ACPI: configfs: Unload SSDT on configfs entry removal
>>>
>>> appeared in the kernel.
>>
>> And the commit message explains quite well why it is an important feature:
>>
>> "This allows to change SSDTs without rebooting the system.
>> It also allows to destroy devices again that a dynamically loaded SSDT created.
>>
>> The biggest problem AFAIK is that under linux, many drivers cannot be unloaded. Also, there are many race conditions as the namespace entries "owned" by an SSDT being unloaded are deleted (out from underneath a driver).
>>
>> This is widely similar to the DT overlay behavior."
>>
>>>> I'm not sure that I want to change the interface to AcpiLoadTable
>>>> just for something that is being deprecated. Already, we throw an
>>>> ACPI_EXCEPTION if the Unload operator is encountered in the AML byte
>>>> stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>>>
>>>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>>>> "AML Unload operator is not supported"));
>
> Bob, what is your suggestion to fix the regression then?
>
> We could revert acpi_configfs.c to use acpi_tb_install_and_load_table()
> instead of acpi_load_table(), leaving loaded APCI objects uninitalized,
> but at least, unloading will work again.
>
> I guess my next question is: why do you want to unload a table in the
> first place?

Because it worked before and there are people who rely on it. If it's
deprecated there should be a user notification and a reasonable
end-of-life timeline to give these users a chance to develop an
alternative solution.

Niko

>
>
> Do we have any other options?
>
> Niko
>

2019-09-19 08:17:13

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Thursday, September 12, 2019 10:07:42 AM CEST Nikolaus Voss wrote:
> For unloading an ACPI table, it is necessary to provide the
> index of the table. The method intended for dynamically
> loading or hotplug addition of tables, acpi_load_table(),
> should provide this information via an optional pointer
> to the loaded table index.
>
> This patch fixes the table unload function of acpi_configfs.
>
> Reported-by: Andy Shevchenko <[email protected]>
> Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table loads")
> Signed-off-by: Nikolaus Voss <[email protected]>

Overall, I think that something similar to this patch will be needed, but
please don't change the acpi_load_table() signature. Instead, define it as
a wrapper around a new function called, say, acpi_load_table_with_index()
that will take two arguments, like acpi_load_table() in your patch.

Then, you'd only need to call acpi_load_table_with_index() directly from
acpi_table_aml_write().

In that case, IMO, it will be easier to handle the divergence between the
upstream ACPICA and the kernel in the future in case the upstream doesn't
decide to incorporate your change.

> ---
> drivers/acpi/acpi_configfs.c | 2 +-
> drivers/acpi/acpica/dbfileio.c | 2 +-
> drivers/acpi/acpica/tbxfload.c | 8 ++++++--
> drivers/firmware/efi/efi.c | 2 +-
> include/acpi/acpixf.h | 3 ++-
> 5 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c
> index 57d9d574d4dde..77f81242a28e6 100644
> --- a/drivers/acpi/acpi_configfs.c
> +++ b/drivers/acpi/acpi_configfs.c
> @@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg,
> if (!table->header)
> return -ENOMEM;
>
> - ret = acpi_load_table(table->header);
> + ret = acpi_load_table(table->header, &table->index);
> if (ret) {
> kfree(table->header);
> table->header = NULL;
> diff --git a/drivers/acpi/acpica/dbfileio.c b/drivers/acpi/acpica/dbfileio.c
> index c6e25734dc5cd..e1b6e54a96ac1 100644
> --- a/drivers/acpi/acpica/dbfileio.c
> +++ b/drivers/acpi/acpica/dbfileio.c
> @@ -93,7 +93,7 @@ acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head)
> while (table_list_head) {
> table = table_list_head->table;
>
> - status = acpi_load_table(table);
> + status = acpi_load_table(table, NULL);
> if (ACPI_FAILURE(status)) {
> if (status == AE_ALREADY_EXISTS) {
> acpi_os_printf
> diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c
> index 86f1693f6d29a..d08cd8ffcbdb6 100644
> --- a/drivers/acpi/acpica/tbxfload.c
> +++ b/drivers/acpi/acpica/tbxfload.c
> @@ -268,7 +268,8 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
> *
> * PARAMETERS: table - Pointer to a buffer containing the ACPI
> * table to be loaded.
> - *
> + * table_idx - Pointer to a u32 for storing the table
> + * index, might be NULL
> * RETURN: Status
> *
> * DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must
> @@ -278,7 +279,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
> * to ensure that the table is not deleted or unmapped.
> *
> ******************************************************************************/
> -acpi_status acpi_load_table(struct acpi_table_header *table)
> +acpi_status acpi_load_table(struct acpi_table_header *table, u32 *table_idx)
> {
> acpi_status status;
> u32 table_index;
> @@ -297,6 +298,9 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
> status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
> ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
> FALSE, &table_index);
> + if (table_idx)
> + *table_idx = table_index;
> +
> if (ACPI_SUCCESS(status)) {
>
> /* Complete the initialization/resolution of new objects */
> diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
> index ad3b1f4866b35..9773e4212baef 100644
> --- a/drivers/firmware/efi/efi.c
> +++ b/drivers/firmware/efi/efi.c
> @@ -308,7 +308,7 @@ static __init int efivar_ssdt_load(void)
> goto free_data;
> }
>
> - ret = acpi_load_table(data);
> + ret = acpi_load_table(data, NULL);
> if (ret) {
> pr_err("failed to load table: %d\n", ret);
> goto free_data;
> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
> index 3845c8fcc94e5..c90bbdc4146a6 100644
> --- a/include/acpi/acpixf.h
> +++ b/include/acpi/acpixf.h
> @@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
> u8 physical))
>
> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> - acpi_load_table(struct acpi_table_header *table))
> + acpi_load_table(struct acpi_table_header *table,
> + u32 *table_idx))
>
> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> acpi_unload_parent_table(acpi_handle object))
>




2019-09-20 01:26:37

by Moore, Robert

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index



-----Original Message-----
From: Nikolaus Voss [mailto:[email protected]]
Sent: Wednesday, September 18, 2019 7:32 AM
To: Moore, Robert <[email protected]>
Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

On Wed, 18 Sep 2019, Moore, Robert wrote:
>
>
> -----Original Message-----
> From: Nikolaus Voss [mailto:[email protected]]
> Sent: Monday, September 16, 2019 2:47 AM
> To: Moore, Robert <[email protected]>
> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy
> <[email protected]>; Schmauss, Erik
> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
> Brown <[email protected]>; Jacek Anaszewski
> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> <[email protected]>; [email protected]; [email protected];
> [email protected]; Jan Kiszka <[email protected]>
> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>
> On Fri, 13 Sep 2019, Moore, Robert wrote:
>>
>>
>> -----Original Message-----
>> From: Ferry Toth [mailto:[email protected]]
>> Sent: Friday, September 13, 2019 9:48 AM
>> To: Shevchenko, Andriy <[email protected]>; Moore, Robert
>> <[email protected]>
>> Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik
>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>> Brown <[email protected]>; Jacek Anaszewski
>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>> <[email protected]>; [email protected]; [email protected];
>> [email protected]; [email protected];
>> Jan Kiszka <[email protected]>
>> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table
>> index
>>
>> Hello all,
>>
>> Sorry to have sent our message with cancelled e-mail address. I have correct this now.
>>
>> Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
>>> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>>>> -----Original Message-----
>>>> From: Nikolaus Voss [mailto:[email protected]]
>>>> Sent: Friday, September 13, 2019 12:44 AM
>>>> To: Moore, Robert <[email protected]>
>>>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss,
>>>> Erik <[email protected]>; Rafael J. Wysocki
>>>> <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski
>>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>>> Murphy <[email protected]>; [email protected];
>>>> [email protected]; [email protected]; Ferry Toth
>>>> <[email protected]>; [email protected]
>>>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>>>> index
>>>>
>>>> Bob,
>>>>
>>>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>>>> The ability to unload an ACPI table (especially AML tables such as
>>>>> SSDTs) is in the process of being deprecated in ACPICA -- since it
>>>>> is also deprecated in the current ACPI specification. This is
>>>>> being done because of the difficulty of deleting the namespace
>>>>> entries for the table. FYI, Windows does not properly support this function either.
>>>>
>>>> ok, I see it can be a problem to unload an AML table with all it's
>>>> consequences e.g. with respect to driver unregistering in setups
>>>> with complex dependencies. It will only work properly under certain
>>>> conditions
>>>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>>>
>>>> AcpiTbUnloadTable is not exported, it is an internal interface only
>>>> -- as recognized by the "AcpiTb".
>>>
>>> In Linux it became a part of ABI when the
>>>
>>> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
>>> Author: Jan Kiszka <[email protected]>
>>> Date: Fri Jun 9 20:36:31 2017 +0200
>>>
>>> ACPI: configfs: Unload SSDT on configfs entry removal
>>>
>>> appeared in the kernel.
>>
>> And the commit message explains quite well why it is an important feature:
>>
>> "This allows to change SSDTs without rebooting the system.
>> It also allows to destroy devices again that a dynamically loaded SSDT created.
>>
>> The biggest problem AFAIK is that under linux, many drivers cannot be unloaded. Also, there are many race conditions as the namespace entries "owned" by an SSDT being unloaded are deleted (out from underneath a driver).
>>
>> This is widely similar to the DT overlay behavior."
>>
>>>> I'm not sure that I want to change the interface to AcpiLoadTable
>>>> just for something that is being deprecated. Already, we throw an
>>>> ACPI_EXCEPTION if the Unload operator is encountered in the AML
>>>> byte stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>>>
>>>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>>>> "AML Unload operator is not supported"));
>
> Bob, what is your suggestion to fix the regression then?
>
> We could revert acpi_configfs.c to use
> acpi_tb_install_and_load_table() instead of acpi_load_table(), leaving
> loaded APCI objects uninitalized, but at least, unloading will work again.
>
> I guess my next question is: why do you want to unload a table in the
> first place?

Because it worked before and there are people who rely on it. If it's deprecated there should be a user notification and a reasonable end-of-life timeline to give these users a chance to develop an alternative solution.

So, I still don't understand why this no longer works. We did not make any purposeful changes in this area - AFAIK.
Bob

Niko

>
>
> Do we have any other options?
>
> Niko
>

2019-09-24 16:56:46

by Nikolaus Voss

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

On Thu, 19 Sep 2019, Moore, Robert wrote:
>
>
> -----Original Message-----
> From: Nikolaus Voss [mailto:[email protected]]
> Sent: Wednesday, September 18, 2019 7:32 AM
> To: Moore, Robert <[email protected]>
> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>
> On Wed, 18 Sep 2019, Moore, Robert wrote:
>>
>>
>> -----Original Message-----
>> From: Nikolaus Voss [mailto:[email protected]]
>> Sent: Monday, September 16, 2019 2:47 AM
>> To: Moore, Robert <[email protected]>
>> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy
>> <[email protected]>; Schmauss, Erik
>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>> Brown <[email protected]>; Jacek Anaszewski
>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>> <[email protected]>; [email protected]; [email protected];
>> [email protected]; Jan Kiszka <[email protected]>
>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>>
>> On Fri, 13 Sep 2019, Moore, Robert wrote:
>>>
>>>
>>> -----Original Message-----
>>> From: Ferry Toth [mailto:[email protected]]
>>> Sent: Friday, September 13, 2019 9:48 AM
>>> To: Shevchenko, Andriy <[email protected]>; Moore, Robert
>>> <[email protected]>
>>> Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik
>>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>>> Brown <[email protected]>; Jacek Anaszewski
>>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>>> <[email protected]>; [email protected]; [email protected];
>>> [email protected]; [email protected];
>>> Jan Kiszka <[email protected]>
>>> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table
>>> index
>>>
>>> Hello all,
>>>
>>> Sorry to have sent our message with cancelled e-mail address. I have correct this now.
>>>
>>> Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
>>>> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>>>>> -----Original Message-----
>>>>> From: Nikolaus Voss [mailto:[email protected]]
>>>>> Sent: Friday, September 13, 2019 12:44 AM
>>>>> To: Moore, Robert <[email protected]>
>>>>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss,
>>>>> Erik <[email protected]>; Rafael J. Wysocki
>>>>> <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski
>>>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>>>> Murphy <[email protected]>; [email protected];
>>>>> [email protected]; [email protected]; Ferry Toth
>>>>> <[email protected]>; [email protected]
>>>>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>>>>> index
>>>>>
>>>>> Bob,
>>>>>
>>>>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>>>>> The ability to unload an ACPI table (especially AML tables such as
>>>>>> SSDTs) is in the process of being deprecated in ACPICA -- since it
>>>>>> is also deprecated in the current ACPI specification. This is
>>>>>> being done because of the difficulty of deleting the namespace
>>>>>> entries for the table. FYI, Windows does not properly support this function either.
>>>>>
>>>>> ok, I see it can be a problem to unload an AML table with all it's
>>>>> consequences e.g. with respect to driver unregistering in setups
>>>>> with complex dependencies. It will only work properly under certain
>>>>> conditions
>>>>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>>>>
>>>>> AcpiTbUnloadTable is not exported, it is an internal interface only
>>>>> -- as recognized by the "AcpiTb".
>>>>
>>>> In Linux it became a part of ABI when the
>>>>
>>>> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
>>>> Author: Jan Kiszka <[email protected]>
>>>> Date: Fri Jun 9 20:36:31 2017 +0200
>>>>
>>>> ACPI: configfs: Unload SSDT on configfs entry removal
>>>>
>>>> appeared in the kernel.
>>>
>>> And the commit message explains quite well why it is an important feature:
>>>
>>> "This allows to change SSDTs without rebooting the system.
>>> It also allows to destroy devices again that a dynamically loaded SSDT created.
>>>
>>> The biggest problem AFAIK is that under linux, many drivers cannot be unloaded. Also, there are many race conditions as the namespace entries "owned" by an SSDT being unloaded are deleted (out from underneath a driver).
>>>
>>> This is widely similar to the DT overlay behavior."
>>>
>>>>> I'm not sure that I want to change the interface to AcpiLoadTable
>>>>> just for something that is being deprecated. Already, we throw an
>>>>> ACPI_EXCEPTION if the Unload operator is encountered in the AML
>>>>> byte stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>>>>
>>>>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>>>>> "AML Unload operator is not supported"));
>>
>> Bob, what is your suggestion to fix the regression then?
>>
>> We could revert acpi_configfs.c to use
>> acpi_tb_install_and_load_table() instead of acpi_load_table(), leaving
>> loaded APCI objects uninitalized, but at least, unloading will work again.
>>
>> I guess my next question is: why do you want to unload a table in the
>> first place?
>
> Because it worked before and there are people who rely on it. If it's
> deprecated there should be a user notification and a reasonable
> end-of-life timeline to give these users a chance to develop an
> alternative solution.
>
> So, I still don't understand why this no longer works. We did not make
> any purposeful changes in this area - AFAIK. Bob

It's because the acpi_configfs driver formerly used
acpi_tb_install_and_load_table() which returns the table index, but
doesn't resolve the references. It now uses acpi_load_table() which
resolves the references, but doesn't return the table index, so unloading
doesn't work any more.

>
> Niko
>
>>
>>
>> Do we have any other options?
>>
>> Niko
>>
>

2019-09-24 16:59:11

by Nikolaus Voss

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Thu, 19 Sep 2019, Rafael J. Wysocki wrote:
> On Thursday, September 12, 2019 10:07:42 AM CEST Nikolaus Voss wrote:
>> For unloading an ACPI table, it is necessary to provide the
>> index of the table. The method intended for dynamically
>> loading or hotplug addition of tables, acpi_load_table(),
>> should provide this information via an optional pointer
>> to the loaded table index.
>>
>> This patch fixes the table unload function of acpi_configfs.
>>
>> Reported-by: Andy Shevchenko <[email protected]>
>> Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table loads")
>> Signed-off-by: Nikolaus Voss <[email protected]>
>
> Overall, I think that something similar to this patch will be needed, but
> please don't change the acpi_load_table() signature. Instead, define it as
> a wrapper around a new function called, say, acpi_load_table_with_index()
> that will take two arguments, like acpi_load_table() in your patch.
>
> Then, you'd only need to call acpi_load_table_with_index() directly from
> acpi_table_aml_write().
>
> In that case, IMO, it will be easier to handle the divergence between the
> upstream ACPICA and the kernel in the future in case the upstream doesn't
> decide to incorporate your change.

Ok, I'll prepare a patch.

>
>> ---
>> drivers/acpi/acpi_configfs.c | 2 +-
>> drivers/acpi/acpica/dbfileio.c | 2 +-
>> drivers/acpi/acpica/tbxfload.c | 8 ++++++--
>> drivers/firmware/efi/efi.c | 2 +-
>> include/acpi/acpixf.h | 3 ++-
>> 5 files changed, 11 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c
>> index 57d9d574d4dde..77f81242a28e6 100644
>> --- a/drivers/acpi/acpi_configfs.c
>> +++ b/drivers/acpi/acpi_configfs.c
>> @@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg,
>> if (!table->header)
>> return -ENOMEM;
>>
>> - ret = acpi_load_table(table->header);
>> + ret = acpi_load_table(table->header, &table->index);
>> if (ret) {
>> kfree(table->header);
>> table->header = NULL;
>> diff --git a/drivers/acpi/acpica/dbfileio.c b/drivers/acpi/acpica/dbfileio.c
>> index c6e25734dc5cd..e1b6e54a96ac1 100644
>> --- a/drivers/acpi/acpica/dbfileio.c
>> +++ b/drivers/acpi/acpica/dbfileio.c
>> @@ -93,7 +93,7 @@ acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head)
>> while (table_list_head) {
>> table = table_list_head->table;
>>
>> - status = acpi_load_table(table);
>> + status = acpi_load_table(table, NULL);
>> if (ACPI_FAILURE(status)) {
>> if (status == AE_ALREADY_EXISTS) {
>> acpi_os_printf
>> diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c
>> index 86f1693f6d29a..d08cd8ffcbdb6 100644
>> --- a/drivers/acpi/acpica/tbxfload.c
>> +++ b/drivers/acpi/acpica/tbxfload.c
>> @@ -268,7 +268,8 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
>> *
>> * PARAMETERS: table - Pointer to a buffer containing the ACPI
>> * table to be loaded.
>> - *
>> + * table_idx - Pointer to a u32 for storing the table
>> + * index, might be NULL
>> * RETURN: Status
>> *
>> * DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must
>> @@ -278,7 +279,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
>> * to ensure that the table is not deleted or unmapped.
>> *
>> ******************************************************************************/
>> -acpi_status acpi_load_table(struct acpi_table_header *table)
>> +acpi_status acpi_load_table(struct acpi_table_header *table, u32 *table_idx)
>> {
>> acpi_status status;
>> u32 table_index;
>> @@ -297,6 +298,9 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
>> status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
>> ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
>> FALSE, &table_index);
>> + if (table_idx)
>> + *table_idx = table_index;
>> +
>> if (ACPI_SUCCESS(status)) {
>>
>> /* Complete the initialization/resolution of new objects */
>> diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
>> index ad3b1f4866b35..9773e4212baef 100644
>> --- a/drivers/firmware/efi/efi.c
>> +++ b/drivers/firmware/efi/efi.c
>> @@ -308,7 +308,7 @@ static __init int efivar_ssdt_load(void)
>> goto free_data;
>> }
>>
>> - ret = acpi_load_table(data);
>> + ret = acpi_load_table(data, NULL);
>> if (ret) {
>> pr_err("failed to load table: %d\n", ret);
>> goto free_data;
>> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
>> index 3845c8fcc94e5..c90bbdc4146a6 100644
>> --- a/include/acpi/acpixf.h
>> +++ b/include/acpi/acpixf.h
>> @@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
>> u8 physical))
>>
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> - acpi_load_table(struct acpi_table_header *table))
>> + acpi_load_table(struct acpi_table_header *table,
>> + u32 *table_idx))
>>
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> acpi_unload_parent_table(acpi_handle object))
>>
>
>
>
>

2019-09-25 10:04:44

by Nikolaus Voss

[permalink] [raw]
Subject: [PATCH] ACPICA: Introduce acpi_load_table_with_index()

For unloading an ACPI table, it is necessary to provide the
index of the table. The method intended for dynamically
loading or hotplug addition of tables, acpi_load_table(),
does not provide this information, so a new function
acpi_load_table_with_index() with the same functionality,
but an optional pointer to the loaded table index is introduced.

The new function is used in the acpi_configfs driver to save the
index of the newly loaded table in order to unload it later.

Reported-by: Andy Shevchenko <[email protected]>
Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table loads")
Signed-off-by: Nikolaus Voss <[email protected]>
---
drivers/acpi/acpi_configfs.c | 2 +-
drivers/acpi/acpica/tbxfload.c | 43 ++++++++++++++++++++++++++++++++++
include/acpi/acpixf.h | 6 +++++
3 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c
index 57d9d574d4dd..9e77d5a266c0 100644
--- a/drivers/acpi/acpi_configfs.c
+++ b/drivers/acpi/acpi_configfs.c
@@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg,
if (!table->header)
return -ENOMEM;

- ret = acpi_load_table(table->header);
+ ret = acpi_load_table_with_index(table->header, &table->index);
if (ret) {
kfree(table->header);
table->header = NULL;
diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c
index 86f1693f6d29..7ea4fc879cb6 100644
--- a/drivers/acpi/acpica/tbxfload.c
+++ b/drivers/acpi/acpica/tbxfload.c
@@ -309,6 +309,49 @@ acpi_status acpi_load_table(struct acpi_table_header *table)

ACPI_EXPORT_SYMBOL(acpi_load_table)

+/*******************************************************************************
+ *
+ * FUNCTION: acpi_load_table_with_index
+ *
+ * PARAMETERS: table - Pointer to a buffer containing the ACPI
+ * table to be loaded.
+ * table_idx - Pointer to a u32 for storing the table
+ * index, might be NULL
+ * RETURN: Status
+ *
+ * DESCRIPTION: see acpi_load_table() above. Additionally returns the index
+ * of the newly created table in table_idx.
+ *
+ ******************************************************************************/
+acpi_status acpi_load_table_with_index(struct acpi_table_header *table,
+ u32 *table_idx)
+{
+ acpi_status status;
+ u32 table_index;
+
+ ACPI_FUNCTION_TRACE(acpi_load_table_with_index);
+
+ /* Parameter validation */
+ if (!table)
+ return_ACPI_STATUS(AE_BAD_PARAMETER);
+
+ /* Install the table and load it into the namespace */
+ ACPI_INFO(("Host-directed Dynamic ACPI Table Load:"));
+ status = acpi_tb_install_and_load_table(
+ ACPI_PTR_TO_PHYSADDR(table), ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
+ FALSE, &table_index);
+ if (table_idx)
+ *table_idx = table_index;
+
+ if (ACPI_SUCCESS(status)) {
+ /* Complete the initialization/resolution of new objects */
+ acpi_ns_initialize_objects();
+ }
+
+ return_ACPI_STATUS(status);
+}
+ACPI_EXPORT_SYMBOL(acpi_load_table_with_index)
+
/*******************************************************************************
*
* FUNCTION: acpi_unload_parent_table
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
index e5e041413581..af375ab318de 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -460,6 +460,12 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_load_table(struct acpi_table_header *table))

+
+ACPI_EXTERNAL_RETURN_STATUS(acpi_status
+ acpi_load_table_with_index(
+ struct acpi_table_header *table,
+ u32 *table_idx))
+
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_unload_parent_table(acpi_handle object))

--
2.17.1

2019-09-26 07:59:56

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: Introduce acpi_load_table_with_index()

On Mon, Sep 23, 2019 at 11:47:01AM +0200, Nikolaus Voss wrote:
> For unloading an ACPI table, it is necessary to provide the
> index of the table. The method intended for dynamically
> loading or hotplug addition of tables, acpi_load_table(),
> does not provide this information, so a new function
> acpi_load_table_with_index() with the same functionality,
> but an optional pointer to the loaded table index is introduced.
>
> The new function is used in the acpi_configfs driver to save the
> index of the newly loaded table in order to unload it later.

I'll test it later, though couple of remarks:
- would it make sense to provide a counter part helper for unloading? Now it
looks a bit inconsistent in configfs when we use acpi_load_*() vs.
acpi_tb_*() in remove.
- please, include Ferry into Cc (as done in this mail)

--
With Best Regards,
Andy Shevchenko


2019-09-26 08:00:09

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: Introduce acpi_load_table_with_index()

On Tue, Sep 24, 2019 at 03:07:34PM +0300, Shevchenko, Andriy wrote:
> On Mon, Sep 23, 2019 at 11:47:01AM +0200, Nikolaus Voss wrote:
> > For unloading an ACPI table, it is necessary to provide the
> > index of the table. The method intended for dynamically
> > loading or hotplug addition of tables, acpi_load_table(),
> > does not provide this information, so a new function
> > acpi_load_table_with_index() with the same functionality,
> > but an optional pointer to the loaded table index is introduced.
> >
> > The new function is used in the acpi_configfs driver to save the
> > index of the newly loaded table in order to unload it later.
>
> I'll test it later, though couple of remarks:
> - would it make sense to provide a counter part helper for unloading? Now it
> looks a bit inconsistent in configfs when we use acpi_load_*() vs.
> acpi_tb_*() in remove.

...and I think we may unexport acpi_tb_* in this case as Bob suggested for it
to be internal API.

> - please, include Ferry into Cc (as done in this mail)


--
With Best Regards,
Andy Shevchenko


2019-09-26 08:16:59

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: Introduce acpi_load_table_with_index()

On Mon, Sep 23, 2019 at 11:47:01AM +0200, Nikolaus Voss wrote:
> For unloading an ACPI table, it is necessary to provide the
> index of the table. The method intended for dynamically
> loading or hotplug addition of tables, acpi_load_table(),
> does not provide this information, so a new function
> acpi_load_table_with_index() with the same functionality,
> but an optional pointer to the loaded table index is introduced.
>
> The new function is used in the acpi_configfs driver to save the
> index of the newly loaded table in order to unload it later.
>

Tested-by: Andy Shevchenko <[email protected]>

But consider addressing my comments in one of previous mails.

> Reported-by: Andy Shevchenko <[email protected]>
> Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table loads")
> Signed-off-by: Nikolaus Voss <[email protected]>
> ---
> drivers/acpi/acpi_configfs.c | 2 +-
> drivers/acpi/acpica/tbxfload.c | 43 ++++++++++++++++++++++++++++++++++
> include/acpi/acpixf.h | 6 +++++
> 3 files changed, 50 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c
> index 57d9d574d4dd..9e77d5a266c0 100644
> --- a/drivers/acpi/acpi_configfs.c
> +++ b/drivers/acpi/acpi_configfs.c
> @@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg,
> if (!table->header)
> return -ENOMEM;
>
> - ret = acpi_load_table(table->header);
> + ret = acpi_load_table_with_index(table->header, &table->index);
> if (ret) {
> kfree(table->header);
> table->header = NULL;
> diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c
> index 86f1693f6d29..7ea4fc879cb6 100644
> --- a/drivers/acpi/acpica/tbxfload.c
> +++ b/drivers/acpi/acpica/tbxfload.c
> @@ -309,6 +309,49 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
>
> ACPI_EXPORT_SYMBOL(acpi_load_table)
>
> +/*******************************************************************************
> + *
> + * FUNCTION: acpi_load_table_with_index
> + *
> + * PARAMETERS: table - Pointer to a buffer containing the ACPI
> + * table to be loaded.
> + * table_idx - Pointer to a u32 for storing the table
> + * index, might be NULL
> + * RETURN: Status
> + *
> + * DESCRIPTION: see acpi_load_table() above. Additionally returns the index
> + * of the newly created table in table_idx.
> + *
> + ******************************************************************************/
> +acpi_status acpi_load_table_with_index(struct acpi_table_header *table,
> + u32 *table_idx)
> +{
> + acpi_status status;
> + u32 table_index;
> +
> + ACPI_FUNCTION_TRACE(acpi_load_table_with_index);
> +
> + /* Parameter validation */
> + if (!table)
> + return_ACPI_STATUS(AE_BAD_PARAMETER);
> +
> + /* Install the table and load it into the namespace */
> + ACPI_INFO(("Host-directed Dynamic ACPI Table Load:"));
> + status = acpi_tb_install_and_load_table(
> + ACPI_PTR_TO_PHYSADDR(table), ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
> + FALSE, &table_index);
> + if (table_idx)
> + *table_idx = table_index;
> +
> + if (ACPI_SUCCESS(status)) {
> + /* Complete the initialization/resolution of new objects */
> + acpi_ns_initialize_objects();
> + }
> +
> + return_ACPI_STATUS(status);
> +}
> +ACPI_EXPORT_SYMBOL(acpi_load_table_with_index)
> +
> /*******************************************************************************
> *
> * FUNCTION: acpi_unload_parent_table
> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
> index e5e041413581..af375ab318de 100644
> --- a/include/acpi/acpixf.h
> +++ b/include/acpi/acpixf.h
> @@ -460,6 +460,12 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> acpi_load_table(struct acpi_table_header *table))
>
> +
> +ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> + acpi_load_table_with_index(
> + struct acpi_table_header *table,
> + u32 *table_idx))
> +
> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> acpi_unload_parent_table(acpi_handle object))
>
> --
> 2.17.1
>

--
With Best Regards,
Andy Shevchenko


2019-09-26 08:43:57

by Moore, Robert

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

How about this:
Go back to using acpi_tb_install_and_load_table(), but then call acpi_ns_initialize_objects afterwards This is what acpi_load_table does.


ACPI_INFO (("Host-directed Dynamic ACPI Table Load:"));
Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table),
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex);
if (ACPI_SUCCESS (Status))
{
/* Complete the initialization/resolution of new objects */

AcpiNsInitializeObjects ();
}


-----Original Message-----
From: Nikolaus Voss <[email protected]>
Sent: Monday, September 23, 2019 2:05 AM
To: Moore, Robert <[email protected]>
Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

On Thu, 19 Sep 2019, Moore, Robert wrote:
>
>
> -----Original Message-----
> From: Nikolaus Voss [mailto:[email protected]]
> Sent: Wednesday, September 18, 2019 7:32 AM
> To: Moore, Robert <[email protected]>
> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy
> <[email protected]>; Schmauss, Erik
> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
> Brown <[email protected]>; Jacek Anaszewski
> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> <[email protected]>; [email protected]; [email protected];
> [email protected]; Jan Kiszka <[email protected]>
> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>
> On Wed, 18 Sep 2019, Moore, Robert wrote:
>>
>>
>> -----Original Message-----
>> From: Nikolaus Voss [mailto:[email protected]]
>> Sent: Monday, September 16, 2019 2:47 AM
>> To: Moore, Robert <[email protected]>
>> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy
>> <[email protected]>; Schmauss, Erik
>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>> Brown <[email protected]>; Jacek Anaszewski
>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>> <[email protected]>; [email protected]; [email protected];
>> [email protected]; Jan Kiszka <[email protected]>
>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>> index
>>
>> On Fri, 13 Sep 2019, Moore, Robert wrote:
>>>
>>>
>>> -----Original Message-----
>>> From: Ferry Toth [mailto:[email protected]]
>>> Sent: Friday, September 13, 2019 9:48 AM
>>> To: Shevchenko, Andriy <[email protected]>; Moore, Robert
>>> <[email protected]>
>>> Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik
>>> <[email protected]>; Rafael J. Wysocki <[email protected]>;
>>> Len Brown <[email protected]>; Jacek Anaszewski
>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>> Murphy <[email protected]>; [email protected];
>>> [email protected]; [email protected];
>>> [email protected];
>>> Jan Kiszka <[email protected]>
>>> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table
>>> index
>>>
>>> Hello all,
>>>
>>> Sorry to have sent our message with cancelled e-mail address. I have correct this now.
>>>
>>> Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
>>>> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>>>>> -----Original Message-----
>>>>> From: Nikolaus Voss [mailto:[email protected]]
>>>>> Sent: Friday, September 13, 2019 12:44 AM
>>>>> To: Moore, Robert <[email protected]>
>>>>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss,
>>>>> Erik <[email protected]>; Rafael J. Wysocki
>>>>> <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski
>>>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>>>> Murphy <[email protected]>; [email protected];
>>>>> [email protected]; [email protected]; Ferry Toth
>>>>> <[email protected]>; [email protected]
>>>>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>>>>> index
>>>>>
>>>>> Bob,
>>>>>
>>>>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>>>>> The ability to unload an ACPI table (especially AML tables such
>>>>>> as
>>>>>> SSDTs) is in the process of being deprecated in ACPICA -- since
>>>>>> it is also deprecated in the current ACPI specification. This is
>>>>>> being done because of the difficulty of deleting the namespace
>>>>>> entries for the table. FYI, Windows does not properly support this function either.
>>>>>
>>>>> ok, I see it can be a problem to unload an AML table with all it's
>>>>> consequences e.g. with respect to driver unregistering in setups
>>>>> with complex dependencies. It will only work properly under
>>>>> certain conditions
>>>>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>>>>
>>>>> AcpiTbUnloadTable is not exported, it is an internal interface
>>>>> only
>>>>> -- as recognized by the "AcpiTb".
>>>>
>>>> In Linux it became a part of ABI when the
>>>>
>>>> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
>>>> Author: Jan Kiszka <[email protected]>
>>>> Date: Fri Jun 9 20:36:31 2017 +0200
>>>>
>>>> ACPI: configfs: Unload SSDT on configfs entry removal
>>>>
>>>> appeared in the kernel.
>>>
>>> And the commit message explains quite well why it is an important feature:
>>>
>>> "This allows to change SSDTs without rebooting the system.
>>> It also allows to destroy devices again that a dynamically loaded SSDT created.
>>>
>>> The biggest problem AFAIK is that under linux, many drivers cannot be unloaded. Also, there are many race conditions as the namespace entries "owned" by an SSDT being unloaded are deleted (out from underneath a driver).
>>>
>>> This is widely similar to the DT overlay behavior."
>>>
>>>>> I'm not sure that I want to change the interface to AcpiLoadTable
>>>>> just for something that is being deprecated. Already, we throw an
>>>>> ACPI_EXCEPTION if the Unload operator is encountered in the AML
>>>>> byte stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>>>>
>>>>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>>>>> "AML Unload operator is not supported"));
>>
>> Bob, what is your suggestion to fix the regression then?
>>
>> We could revert acpi_configfs.c to use
>> acpi_tb_install_and_load_table() instead of acpi_load_table(),
>> leaving loaded APCI objects uninitalized, but at least, unloading will work again.
>>
>> I guess my next question is: why do you want to unload a table in the
>> first place?
>
> Because it worked before and there are people who rely on it. If it's
> deprecated there should be a user notification and a reasonable
> end-of-life timeline to give these users a chance to develop an
> alternative solution.
>
> So, I still don't understand why this no longer works. We did not make
> any purposeful changes in this area - AFAIK. Bob

It's because the acpi_configfs driver formerly used
acpi_tb_install_and_load_table() which returns the table index, but doesn't resolve the references. It now uses acpi_load_table() which resolves the references, but doesn't return the table index, so unloading doesn't work any more.

>
> Niko
>
>>
>>
>> Do we have any other options?
>>
>> Niko
>>
>

2019-09-26 09:27:16

by Nikolaus Voss

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: Introduce acpi_load_table_with_index()

On Tue, 24 Sep 2019, Andy Shevchenko wrote:
> On Mon, Sep 23, 2019 at 11:47:01AM +0200, Nikolaus Voss wrote:
>> For unloading an ACPI table, it is necessary to provide the
>> index of the table. The method intended for dynamically
>> loading or hotplug addition of tables, acpi_load_table(),
>> does not provide this information, so a new function
>> acpi_load_table_with_index() with the same functionality,
>> but an optional pointer to the loaded table index is introduced.
>>
>> The new function is used in the acpi_configfs driver to save the
>> index of the newly loaded table in order to unload it later.
>>
>
> Tested-by: Andy Shevchenko <[email protected]>

Thanks!

>
> But consider addressing my comments in one of previous mails.
>
>> Reported-by: Andy Shevchenko <[email protected]>
>> Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table loads")
>> Signed-off-by: Nikolaus Voss <[email protected]>
>> ---
>> drivers/acpi/acpi_configfs.c | 2 +-
>> drivers/acpi/acpica/tbxfload.c | 43 ++++++++++++++++++++++++++++++++++
>> include/acpi/acpixf.h | 6 +++++
>> 3 files changed, 50 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c
>> index 57d9d574d4dd..9e77d5a266c0 100644
>> --- a/drivers/acpi/acpi_configfs.c
>> +++ b/drivers/acpi/acpi_configfs.c
>> @@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item *cfg,
>> if (!table->header)
>> return -ENOMEM;
>>
>> - ret = acpi_load_table(table->header);
>> + ret = acpi_load_table_with_index(table->header, &table->index);
>> if (ret) {
>> kfree(table->header);
>> table->header = NULL;
>> diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c
>> index 86f1693f6d29..7ea4fc879cb6 100644
>> --- a/drivers/acpi/acpica/tbxfload.c
>> +++ b/drivers/acpi/acpica/tbxfload.c
>> @@ -309,6 +309,49 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
>>
>> ACPI_EXPORT_SYMBOL(acpi_load_table)
>>
>> +/*******************************************************************************
>> + *
>> + * FUNCTION: acpi_load_table_with_index
>> + *
>> + * PARAMETERS: table - Pointer to a buffer containing the ACPI
>> + * table to be loaded.
>> + * table_idx - Pointer to a u32 for storing the table
>> + * index, might be NULL
>> + * RETURN: Status
>> + *
>> + * DESCRIPTION: see acpi_load_table() above. Additionally returns the index
>> + * of the newly created table in table_idx.
>> + *
>> + ******************************************************************************/
>> +acpi_status acpi_load_table_with_index(struct acpi_table_header *table,
>> + u32 *table_idx)
>> +{
>> + acpi_status status;
>> + u32 table_index;
>> +
>> + ACPI_FUNCTION_TRACE(acpi_load_table_with_index);
>> +
>> + /* Parameter validation */
>> + if (!table)
>> + return_ACPI_STATUS(AE_BAD_PARAMETER);
>> +
>> + /* Install the table and load it into the namespace */
>> + ACPI_INFO(("Host-directed Dynamic ACPI Table Load:"));
>> + status = acpi_tb_install_and_load_table(
>> + ACPI_PTR_TO_PHYSADDR(table), ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
>> + FALSE, &table_index);
>> + if (table_idx)
>> + *table_idx = table_index;
>> +
>> + if (ACPI_SUCCESS(status)) {
>> + /* Complete the initialization/resolution of new objects */
>> + acpi_ns_initialize_objects();
>> + }
>> +
>> + return_ACPI_STATUS(status);
>> +}
>> +ACPI_EXPORT_SYMBOL(acpi_load_table_with_index)
>> +
>> /*******************************************************************************
>> *
>> * FUNCTION: acpi_unload_parent_table
>> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
>> index e5e041413581..af375ab318de 100644
>> --- a/include/acpi/acpixf.h
>> +++ b/include/acpi/acpixf.h
>> @@ -460,6 +460,12 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status ACPI_INIT_FUNCTION
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> acpi_load_table(struct acpi_table_header *table))
>>
>> +
>> +ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> + acpi_load_table_with_index(
>> + struct acpi_table_header *table,
>> + u32 *table_idx))
>> +
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> acpi_unload_parent_table(acpi_handle object))
>>
>> --
>> 2.17.1
>>
>

2019-09-26 09:29:08

by Nikolaus Voss

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

On Tue, 24 Sep 2019, Moore, Robert wrote:
> How about this:
> Go back to using acpi_tb_install_and_load_table(), but then call acpi_ns_initialize_objects afterwards This is what acpi_load_table does.
>
>
> ACPI_INFO (("Host-directed Dynamic ACPI Table Load:"));
> Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table),
> ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex);
> if (ACPI_SUCCESS (Status))
> {
> /* Complete the initialization/resolution of new objects */
>
> AcpiNsInitializeObjects ();
> }

The idea was to have all drivers use the same interface for dynamically
loading ACPI tables, i.e. efivar_ssdt_load() (which already used
acpi_load_table()) and the acpi_configfs driver. The efivar driver doesn't
provide a possibility to unload the table, so acpi_load_table() is okay
for this purpose. According to Bob, acpi_tb_install_and_load_table() is
not part of the external ACPICA API declared under include/acpi (though it
is exported).

The counterpart of acpi_load_table() - inline comment "Note1: Mainly
intended to support hotplug addition of SSDTs" - seems to be
acpi_unload_parent_table() - inline comment "Note: Mainly intended to
support hotplug removal of SSDTs" - but it doesn't expect a table index
but an acpi_handle as argument, and it is only used within ACPICA, so IMO
the API can't be properly used in our case and should be improved even
though unloading tables is deprecated.

If changing the API is not an option, we can choose between Rafael's way
(extending the API instead of changing it) or Bob's proposal (doing the
same thing - hotplug-loading a SSDT - in different ways, in case of
acpi_configfs using ACPICA internal API). I don't have a clear favorite,
but I'm tending to Rafael's solution my favorite being the API change.

Niko

>
>
> -----Original Message-----
> From: Nikolaus Voss <[email protected]>
> Sent: Monday, September 23, 2019 2:05 AM
> To: Moore, Robert <[email protected]>
> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy <[email protected]>; Schmauss, Erik <[email protected]>; Rafael J. Wysocki <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy <[email protected]>; [email protected]; [email protected]; [email protected]; Jan Kiszka <[email protected]>
> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>
> On Thu, 19 Sep 2019, Moore, Robert wrote:
>>
>>
>> -----Original Message-----
>> From: Nikolaus Voss [mailto:[email protected]]
>> Sent: Wednesday, September 18, 2019 7:32 AM
>> To: Moore, Robert <[email protected]>
>> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy
>> <[email protected]>; Schmauss, Erik
>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>> Brown <[email protected]>; Jacek Anaszewski
>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>> <[email protected]>; [email protected]; [email protected];
>> [email protected]; Jan Kiszka <[email protected]>
>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index
>>
>> On Wed, 18 Sep 2019, Moore, Robert wrote:
>>>
>>>
>>> -----Original Message-----
>>> From: Nikolaus Voss [mailto:[email protected]]
>>> Sent: Monday, September 16, 2019 2:47 AM
>>> To: Moore, Robert <[email protected]>
>>> Cc: Ferry Toth <[email protected]>; Shevchenko, Andriy
>>> <[email protected]>; Schmauss, Erik
>>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Len
>>> Brown <[email protected]>; Jacek Anaszewski
>>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>>> <[email protected]>; [email protected]; [email protected];
>>> [email protected]; Jan Kiszka <[email protected]>
>>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>>> index
>>>
>>> On Fri, 13 Sep 2019, Moore, Robert wrote:
>>>>
>>>>
>>>> -----Original Message-----
>>>> From: Ferry Toth [mailto:[email protected]]
>>>> Sent: Friday, September 13, 2019 9:48 AM
>>>> To: Shevchenko, Andriy <[email protected]>; Moore, Robert
>>>> <[email protected]>
>>>> Cc: Nikolaus Voss <[email protected]>; Schmauss, Erik
>>>> <[email protected]>; Rafael J. Wysocki <[email protected]>;
>>>> Len Brown <[email protected]>; Jacek Anaszewski
>>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>>> Murphy <[email protected]>; [email protected];
>>>> [email protected]; [email protected];
>>>> [email protected];
>>>> Jan Kiszka <[email protected]>
>>>> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table
>>>> index
>>>>
>>>> Hello all,
>>>>
>>>> Sorry to have sent our message with cancelled e-mail address. I have correct this now.
>>>>
>>>> Op 13-09-19 om 17:12 schreef Shevchenko, Andriy:
>>>>> On Fri, Sep 13, 2019 at 05:20:21PM +0300, Moore, Robert wrote:
>>>>>> -----Original Message-----
>>>>>> From: Nikolaus Voss [mailto:[email protected]]
>>>>>> Sent: Friday, September 13, 2019 12:44 AM
>>>>>> To: Moore, Robert <[email protected]>
>>>>>> Cc: Shevchenko, Andriy <[email protected]>; Schmauss,
>>>>>> Erik <[email protected]>; Rafael J. Wysocki
>>>>>> <[email protected]>; Len Brown <[email protected]>; Jacek Anaszewski
>>>>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>>>>> Murphy <[email protected]>; [email protected];
>>>>>> [email protected]; [email protected]; Ferry Toth
>>>>>> <[email protected]>; [email protected]
>>>>>> Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table
>>>>>> index
>>>>>>
>>>>>> Bob,
>>>>>>
>>>>>> On Thu, 12 Sep 2019, Moore, Robert wrote:
>>>>>>> The ability to unload an ACPI table (especially AML tables such
>>>>>>> as
>>>>>>> SSDTs) is in the process of being deprecated in ACPICA -- since
>>>>>>> it is also deprecated in the current ACPI specification. This is
>>>>>>> being done because of the difficulty of deleting the namespace
>>>>>>> entries for the table. FYI, Windows does not properly support this function either.
>>>>>>
>>>>>> ok, I see it can be a problem to unload an AML table with all it's
>>>>>> consequences e.g. with respect to driver unregistering in setups
>>>>>> with complex dependencies. It will only work properly under
>>>>>> certain conditions
>>>>>> - nevertheless acpi_tb_unload_table() is still exported in ACPICA and we should get this working as it worked before.
>>>>>>
>>>>>> AcpiTbUnloadTable is not exported, it is an internal interface
>>>>>> only
>>>>>> -- as recognized by the "AcpiTb".
>>>>>
>>>>> In Linux it became a part of ABI when the
>>>>>
>>>>> commit 772bf1e2878ecfca0d1f332071c83e021dd9cf01
>>>>> Author: Jan Kiszka <[email protected]>
>>>>> Date: Fri Jun 9 20:36:31 2017 +0200
>>>>>
>>>>> ACPI: configfs: Unload SSDT on configfs entry removal
>>>>>
>>>>> appeared in the kernel.
>>>>
>>>> And the commit message explains quite well why it is an important feature:
>>>>
>>>> "This allows to change SSDTs without rebooting the system.
>>>> It also allows to destroy devices again that a dynamically loaded SSDT created.
>>>>
>>>> The biggest problem AFAIK is that under linux, many drivers cannot be unloaded. Also, there are many race conditions as the namespace entries "owned" by an SSDT being unloaded are deleted (out from underneath a driver).
>>>>
>>>> This is widely similar to the DT overlay behavior."
>>>>
>>>>>> I'm not sure that I want to change the interface to AcpiLoadTable
>>>>>> just for something that is being deprecated. Already, we throw an
>>>>>> ACPI_EXCEPTION if the Unload operator is encountered in the AML
>>>>>> byte stream. The same thing with AcpiUnloadParentTable - it is being deprecated.
>>>>>>
>>>>>> ACPI_EXCEPTION ((AE_INFO, AE_NOT_IMPLEMENTED,
>>>>>> "AML Unload operator is not supported"));
>>>
>>> Bob, what is your suggestion to fix the regression then?
>>>
>>> We could revert acpi_configfs.c to use
>>> acpi_tb_install_and_load_table() instead of acpi_load_table(),
>>> leaving loaded APCI objects uninitalized, but at least, unloading will work again.
>>>
>>> I guess my next question is: why do you want to unload a table in the
>>> first place?
>>
>> Because it worked before and there are people who rely on it. If it's
>> deprecated there should be a user notification and a reasonable
>> end-of-life timeline to give these users a chance to develop an
>> alternative solution.
>>
>> So, I still don't understand why this no longer works. We did not make
>> any purposeful changes in this area - AFAIK. Bob
>
> It's because the acpi_configfs driver formerly used
> acpi_tb_install_and_load_table() which returns the table index, but doesn't resolve the references. It now uses acpi_load_table() which resolves the references, but doesn't return the table index, so unloading doesn't work any more.
>
>>
>> Niko
>>
>>>
>>>
>>> Do we have any other options?
>>>
>>> Niko
>>>
>>

2019-09-26 09:29:13

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Wed, Sep 25, 2019 at 12:18:11PM +0200, Nikolaus Voss wrote:
> On Tue, 24 Sep 2019, Moore, Robert wrote:
> > How about this:
> > Go back to using acpi_tb_install_and_load_table(), but then call acpi_ns_initialize_objects afterwards This is what acpi_load_table does.
> >
> >
> > ACPI_INFO (("Host-directed Dynamic ACPI Table Load:"));
> > Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table),
> > ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex);
> > if (ACPI_SUCCESS (Status))
> > {
> > /* Complete the initialization/resolution of new objects */
> >
> > AcpiNsInitializeObjects ();
> > }
>
> The idea was to have all drivers use the same interface for dynamically
> loading ACPI tables, i.e. efivar_ssdt_load() (which already used
> acpi_load_table()) and the acpi_configfs driver. The efivar driver doesn't
> provide a possibility to unload the table, so acpi_load_table() is okay for
> this purpose.

> According to Bob, acpi_tb_install_and_load_table() is not part
> of the external ACPICA API declared under include/acpi (though it is
> exported).

You are answering to Bob himself :-)

So, above is another proposal and we can create a common symmetric APIs in ACPI
glue layer for all users even if some of them don't care about unloading.

> The counterpart of acpi_load_table() - inline comment "Note1: Mainly
> intended to support hotplug addition of SSDTs" - seems to be
> acpi_unload_parent_table() - inline comment "Note: Mainly intended to
> support hotplug removal of SSDTs" - but it doesn't expect a table index but
> an acpi_handle as argument, and it is only used within ACPICA, so IMO the
> API can't be properly used in our case and should be improved even though
> unloading tables is deprecated.
>
> If changing the API is not an option, we can choose between Rafael's way
> (extending the API instead of changing it) or Bob's proposal (doing the same
> thing - hotplug-loading a SSDT - in different ways, in case of acpi_configfs
> using ACPICA internal API). I don't have a clear favorite, but I'm tending
> to Rafael's solution my favorite being the API change.

--
With Best Regards,
Andy Shevchenko


2019-09-26 09:51:58

by Schmauss, Erik

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index



> -----Original Message-----
> From: Ferry Toth <[email protected]>
> Sent: Thursday, September 12, 2019 12:37 PM
> To: Moore, Robert <[email protected]>; Nikolaus Voss
> <[email protected]>; Shevchenko, Andriy
> <[email protected]>; Schmauss, Erik <[email protected]>;
> Rafael J. Wysocki <[email protected]>
> Cc: Len Brown <[email protected]>; Jacek Anaszewski
> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> <[email protected]>; [email protected]; [email protected]; linux-
> [email protected]; [email protected]
> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
>
> Op 12-09-19 om 16:19 schreef Moore, Robert:
> > Nikolaus,
> > The ability to unload an ACPI table (especially AML tables such as SSDTs) is in
> the process of being deprecated in ACPICA -- since it is also deprecated in the
> current ACPI specification. This is being done because of the difficulty of
> deleting the namespace entries for the table. FYI, Windows does not properly
> support this function either.
>
> I really hope this is not the case. On x86 loading/unloading SSDTs has proven to
> be a powerful way to handle reconfigurable hardware without rebooting and
> without requiring dedicated platform drivers. Same for user plugable hardware
> on i2c/spi busses.
>
> This has worked before and will violate the "don't break user space" rule.

If the table index wasn't being used, how did this work before?
Which commit broke this?

Bob and I are trying to understand if this is a regression or a new feature request...

Thanks,
Erik
>
> I don't see why Windows is an example to follow. On Windows platform drivers
> don't get compiled into the kernel and don't need to be upstreamed.
>
> > Bob
> >
> >
> > -----Original Message-----
> > From: Nikolaus Voss [mailto:[email protected]]
> > Sent: Thursday, September 12, 2019 1:08 AM
> > To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
> > <[email protected]>; Rafael J. Wysocki <[email protected]>;
> > Moore, Robert <[email protected]>
> > Cc: Len Brown <[email protected]>; Jacek Anaszewski
> > <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> > <[email protected]>; [email protected]; [email protected];
> > [email protected]; [email protected]; Nikolaus Voss
> > <[email protected]>
> > Subject: [PATCH] ACPICA: make acpi_load_table() return table index
> >
> > For unloading an ACPI table, it is necessary to provide the index of the table.
> The method intended for dynamically loading or hotplug addition of tables,
> acpi_load_table(), should provide this information via an optional pointer to
> the loaded table index.
> >
> > This patch fixes the table unload function of acpi_configfs.
> >
> > Reported-by: Andy Shevchenko <[email protected]>
> > Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on
> > host-directed table loads")
> > Signed-off-by: Nikolaus Voss <[email protected]>
> > ---
> > drivers/acpi/acpi_configfs.c | 2 +-
> > drivers/acpi/acpica/dbfileio.c | 2 +-
> > drivers/acpi/acpica/tbxfload.c | 8 ++++++--
> > drivers/firmware/efi/efi.c | 2 +-
> > include/acpi/acpixf.h | 3 ++-
> > 5 files changed, 11 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/acpi/acpi_configfs.c
> > b/drivers/acpi/acpi_configfs.c index 57d9d574d4dde..77f81242a28e6
> > 100644
> > --- a/drivers/acpi/acpi_configfs.c
> > +++ b/drivers/acpi/acpi_configfs.c
> > @@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item
> *cfg,
> > if (!table->header)
> > return -ENOMEM;
> >
> > - ret = acpi_load_table(table->header);
> > + ret = acpi_load_table(table->header, &table->index);
> > if (ret) {
> > kfree(table->header);
> > table->header = NULL;
> > diff --git a/drivers/acpi/acpica/dbfileio.c
> > b/drivers/acpi/acpica/dbfileio.c index c6e25734dc5cd..e1b6e54a96ac1
> > 100644
> > --- a/drivers/acpi/acpica/dbfileio.c
> > +++ b/drivers/acpi/acpica/dbfileio.c
> > @@ -93,7 +93,7 @@ acpi_status acpi_db_load_tables(struct
> acpi_new_table_desc *list_head)
> > while (table_list_head) {
> > table = table_list_head->table;
> >
> > - status = acpi_load_table(table);
> > + status = acpi_load_table(table, NULL);
> > if (ACPI_FAILURE(status)) {
> > if (status == AE_ALREADY_EXISTS) {
> > acpi_os_printf
> > diff --git a/drivers/acpi/acpica/tbxfload.c
> > b/drivers/acpi/acpica/tbxfload.c index 86f1693f6d29a..d08cd8ffcbdb6
> > 100644
> > --- a/drivers/acpi/acpica/tbxfload.c
> > +++ b/drivers/acpi/acpica/tbxfload.c
> > @@ -268,7 +268,8 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
> > *
> > * PARAMETERS: table - Pointer to a buffer containing the ACPI
> > * table to be loaded.
> > - *
> > + * table_idx - Pointer to a u32 for storing the table
> > + * index, might be NULL
> > * RETURN: Status
> > *
> > * DESCRIPTION: Dynamically load an ACPI table from the caller's buffer.
> Must @@ -278,7 +279,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
> > * to ensure that the table is not deleted or unmapped.
> > *
> >
> >
> *******************************************************************
> ***
> > ********/ -acpi_status acpi_load_table(struct acpi_table_header
> > *table)
> > +acpi_status acpi_load_table(struct acpi_table_header *table, u32
> > +*table_idx)
> > {
> > acpi_status status;
> > u32 table_index;
> > @@ -297,6 +298,9 @@ acpi_status acpi_load_table(struct acpi_table_header
> *table)
> > status =
> acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
> >
> ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
> > FALSE, &table_index);
> > + if (table_idx)
> > + *table_idx = table_index;
> > +
> > if (ACPI_SUCCESS(status)) {
> >
> > /* Complete the initialization/resolution of new objects */ diff
> > --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index
> > ad3b1f4866b35..9773e4212baef 100644
> > --- a/drivers/firmware/efi/efi.c
> > +++ b/drivers/firmware/efi/efi.c
> > @@ -308,7 +308,7 @@ static __init int efivar_ssdt_load(void)
> > goto free_data;
> > }
> >
> > - ret = acpi_load_table(data);
> > + ret = acpi_load_table(data, NULL);
> > if (ret) {
> > pr_err("failed to load table: %d\n", ret);
> > goto free_data;
> > diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index
> > 3845c8fcc94e5..c90bbdc4146a6 100644
> > --- a/include/acpi/acpixf.h
> > +++ b/include/acpi/acpixf.h
> > @@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> ACPI_INIT_FUNCTION
> > u8 physical))
> >
> > ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> > - acpi_load_table(struct acpi_table_header *table))
> > + acpi_load_table(struct acpi_table_header *table,
> > + u32 *table_idx))
> >
> > ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> > acpi_unload_parent_table(acpi_handle object))
> > --
> > 2.17.1
> >
> >

2019-09-26 10:55:24

by Nikolaus Voss

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: Introduce acpi_load_table_with_index()

On Tue, 24 Sep 2019, Shevchenko, Andriy wrote:
> On Tue, Sep 24, 2019 at 03:07:34PM +0300, Shevchenko, Andriy wrote:
>> On Mon, Sep 23, 2019 at 11:47:01AM +0200, Nikolaus Voss wrote:
>>> For unloading an ACPI table, it is necessary to provide the
>>> index of the table. The method intended for dynamically
>>> loading or hotplug addition of tables, acpi_load_table(),
>>> does not provide this information, so a new function
>>> acpi_load_table_with_index() with the same functionality,
>>> but an optional pointer to the loaded table index is introduced.
>>>
>>> The new function is used in the acpi_configfs driver to save the
>>> index of the newly loaded table in order to unload it later.
>>
>> I'll test it later, though couple of remarks:
>> - would it make sense to provide a counter part helper for unloading? Now it
>> looks a bit inconsistent in configfs when we use acpi_load_*() vs.
>> acpi_tb_*() in remove.

Yes, IMO it would make sense, but it is an ACPICA API change. Bob, what's
your opinion?

>
> ...and I think we may unexport acpi_tb_* in this case as Bob suggested for it
> to be internal API.

see above.

>
>> - please, include Ferry into Cc (as done in this mail)
>

2019-09-26 10:59:08

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Wed, Sep 25, 2019 at 09:13:34PM +0300, Schmauss, Erik wrote:
> > -----Original Message-----
> > From: Ferry Toth <[email protected]>
> > Sent: Thursday, September 12, 2019 12:37 PM
> > To: Moore, Robert <[email protected]>; Nikolaus Voss
> > <[email protected]>; Shevchenko, Andriy
> > <[email protected]>; Schmauss, Erik <[email protected]>;
> > Rafael J. Wysocki <[email protected]>
> > Cc: Len Brown <[email protected]>; Jacek Anaszewski
> > <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> > <[email protected]>; [email protected]; [email protected]; linux-
> > [email protected]; [email protected]
> > Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
> >
> > Op 12-09-19 om 16:19 schreef Moore, Robert:
> > > Nikolaus,
> > > The ability to unload an ACPI table (especially AML tables such as SSDTs) is in
> > the process of being deprecated in ACPICA -- since it is also deprecated in the
> > current ACPI specification. This is being done because of the difficulty of
> > deleting the namespace entries for the table. FYI, Windows does not properly
> > support this function either.
> >
> > I really hope this is not the case. On x86 loading/unloading SSDTs has proven to
> > be a powerful way to handle reconfigurable hardware without rebooting and
> > without requiring dedicated platform drivers. Same for user plugable hardware
> > on i2c/spi busses.
> >
> > This has worked before and will violate the "don't break user space" rule.
>
> If the table index wasn't being used, how did this work before?
> Which commit broke this?
>
> Bob and I are trying to understand if this is a regression or a new feature request...

It is a regression as I explained in my bisecting message.

Before it uses acpi_tb_* API directly.
I thought Bob already got the idea.

--
With Best Regards,
Andy Shevchenko


2019-09-26 16:12:12

by Schmauss, Erik

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index



> -----Original Message-----
> From: Nikolaus Voss <[email protected]>
> Sent: Thursday, September 12, 2019 1:08 AM
> To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
> <[email protected]>; Rafael J. Wysocki <[email protected]>; Moore,
> Robert <[email protected]>
> Cc: Len Brown <[email protected]>; Jacek Anaszewski
> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> <[email protected]>; [email protected]; [email protected]; linux-
> [email protected]; [email protected]; Nikolaus Voss
> <[email protected]>
> Subject: [PATCH] ACPICA: make acpi_load_table() return table index
>
Hi Nikolaus,

> For unloading an ACPI table, it is necessary to provide the index of the table.
> The method intended for dynamically loading or hotplug addition of tables,
> acpi_load_table(), should provide this information via an optional pointer to
> the loaded table index.

We'll take this patch for ACPICA upstream

Thanks,
Erik
>
> This patch fixes the table unload function of acpi_configfs.
>
> Reported-by: Andy Shevchenko <[email protected]>
> Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table
> loads")
> Signed-off-by: Nikolaus Voss <[email protected]>
> ---
> drivers/acpi/acpi_configfs.c | 2 +-
> drivers/acpi/acpica/dbfileio.c | 2 +-
> drivers/acpi/acpica/tbxfload.c | 8 ++++++--
> drivers/firmware/efi/efi.c | 2 +-
> include/acpi/acpixf.h | 3 ++-
> 5 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c index
> 57d9d574d4dde..77f81242a28e6 100644
> --- a/drivers/acpi/acpi_configfs.c
> +++ b/drivers/acpi/acpi_configfs.c
> @@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item
> *cfg,
> if (!table->header)
> return -ENOMEM;
>
> - ret = acpi_load_table(table->header);
> + ret = acpi_load_table(table->header, &table->index);
> if (ret) {
> kfree(table->header);
> table->header = NULL;
> diff --git a/drivers/acpi/acpica/dbfileio.c b/drivers/acpi/acpica/dbfileio.c index
> c6e25734dc5cd..e1b6e54a96ac1 100644
> --- a/drivers/acpi/acpica/dbfileio.c
> +++ b/drivers/acpi/acpica/dbfileio.c
> @@ -93,7 +93,7 @@ acpi_status acpi_db_load_tables(struct
> acpi_new_table_desc *list_head)
> while (table_list_head) {
> table = table_list_head->table;
>
> - status = acpi_load_table(table);
> + status = acpi_load_table(table, NULL);
> if (ACPI_FAILURE(status)) {
> if (status == AE_ALREADY_EXISTS) {
> acpi_os_printf
> diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c index
> 86f1693f6d29a..d08cd8ffcbdb6 100644
> --- a/drivers/acpi/acpica/tbxfload.c
> +++ b/drivers/acpi/acpica/tbxfload.c
> @@ -268,7 +268,8 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
> *
> * PARAMETERS: table - Pointer to a buffer containing the ACPI
> * table to be loaded.
> - *
> + * table_idx - Pointer to a u32 for storing the table
> + * index, might be NULL
> * RETURN: Status
> *
> * DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must
> @@ -278,7 +279,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
> * to ensure that the table is not deleted or unmapped.
> *
>
> *******************************************************************
> ***********/
> -acpi_status acpi_load_table(struct acpi_table_header *table)
> +acpi_status acpi_load_table(struct acpi_table_header *table, u32
> +*table_idx)
> {
> acpi_status status;
> u32 table_index;
> @@ -297,6 +298,9 @@ acpi_status acpi_load_table(struct acpi_table_header
> *table)
> status =
> acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
>
> ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
> FALSE, &table_index);
> + if (table_idx)
> + *table_idx = table_index;
> +
> if (ACPI_SUCCESS(status)) {
>
> /* Complete the initialization/resolution of new objects */ diff
> --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index
> ad3b1f4866b35..9773e4212baef 100644
> --- a/drivers/firmware/efi/efi.c
> +++ b/drivers/firmware/efi/efi.c
> @@ -308,7 +308,7 @@ static __init int efivar_ssdt_load(void)
> goto free_data;
> }
>
> - ret = acpi_load_table(data);
> + ret = acpi_load_table(data, NULL);
> if (ret) {
> pr_err("failed to load table: %d\n", ret);
> goto free_data;
> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index
> 3845c8fcc94e5..c90bbdc4146a6 100644
> --- a/include/acpi/acpixf.h
> +++ b/include/acpi/acpixf.h
> @@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> ACPI_INIT_FUNCTION
> u8 physical))
>
> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> - acpi_load_table(struct acpi_table_header *table))
> + acpi_load_table(struct acpi_table_header *table,
> + u32 *table_idx))
>
> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
> acpi_unload_parent_table(acpi_handle object))
> --
> 2.17.1

2019-09-26 16:37:58

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Thu, Sep 26, 2019 at 07:09:05PM +0300, Schmauss, Erik wrote:
> > -----Original Message-----
> > From: Nikolaus Voss <[email protected]>
> > Sent: Thursday, September 12, 2019 1:08 AM
> > To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
> > <[email protected]>; Rafael J. Wysocki <[email protected]>; Moore,
> > Robert <[email protected]>
> > Cc: Len Brown <[email protected]>; Jacek Anaszewski
> > <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
> > <[email protected]>; [email protected]; [email protected]; linux-
> > [email protected]; [email protected]; Nikolaus Voss
> > <[email protected]>
> > Subject: [PATCH] ACPICA: make acpi_load_table() return table index
> >
> Hi Nikolaus,
>
> > For unloading an ACPI table, it is necessary to provide the index of the table.
> > The method intended for dynamically loading or hotplug addition of tables,
> > acpi_load_table(), should provide this information via an optional pointer to
> > the loaded table index.
>
> We'll take this patch for ACPICA upstream

Erik,

how about to have also counterpart to acpi_load_table() which will do
what it's done now in acpi_configfs.c via acpi_tb_*() API?

Because it's kinda strange to call acpi_load_table*() and acpi_tb_*()
in the same module.

--
With Best Regards,
Andy Shevchenko


2019-09-26 16:54:12

by Schmauss, Erik

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index



> -----Original Message-----
> From: [email protected] <[email protected]>
> On Behalf Of Shevchenko, Andriy
> Sent: Thursday, September 26, 2019 9:35 AM
> To: Schmauss, Erik <[email protected]>
> Cc: Nikolaus Voss <[email protected]>; Rafael J. Wysocki
> <[email protected]>; Moore, Robert <[email protected]>; Len Brown
> <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel
> Machek <[email protected]>; Dan Murphy <[email protected]>; linux-
> [email protected]; [email protected]; [email protected];
> [email protected]
> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
>
> On Thu, Sep 26, 2019 at 07:09:05PM +0300, Schmauss, Erik wrote:
> > > -----Original Message-----
> > > From: Nikolaus Voss <[email protected]>
> > > Sent: Thursday, September 12, 2019 1:08 AM
> > > To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
> > > <[email protected]>; Rafael J. Wysocki <[email protected]>;
> > > Moore, Robert <[email protected]>
> > > Cc: Len Brown <[email protected]>; Jacek Anaszewski
> > > <[email protected]>; Pavel Machek <[email protected]>; Dan
> > > Murphy <[email protected]>; [email protected];
> > > [email protected]; linux- [email protected]; [email protected];
> > > Nikolaus Voss <[email protected]>
> > > Subject: [PATCH] ACPICA: make acpi_load_table() return table index
> > >
> > Hi Nikolaus,
> >
> > > For unloading an ACPI table, it is necessary to provide the index of the table.
> > > The method intended for dynamically loading or hotplug addition of
> > > tables, acpi_load_table(), should provide this information via an
> > > optional pointer to the loaded table index.
> >
> > We'll take this patch for ACPICA upstream
>
> Erik,
>
Hi Andy,

> how about to have also counterpart to acpi_load_table() which will do what it's
> done now in acpi_configfs.c via acpi_tb_*() API?

I should have given more details. We decided to add this extra parameter in AcpiLoadTable and
we're going to create an AcpiUnloadTable function that will take table index to unload the table (basically the acpi_tb_unload..).
Once we do this, you can use table indices with AcpiUnloadTable and AcpiLoadTable.

Erik
>
> Because it's kinda strange to call acpi_load_table*() and acpi_tb_*() in the
> same module.
>
> --
> With Best Regards,
> Andy Shevchenko
>

2019-09-26 17:51:17

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Thu, Sep 26, 2019 at 07:51:00PM +0300, Schmauss, Erik wrote:
> > -----Original Message-----
> > From: [email protected] <[email protected]>
> > On Behalf Of Shevchenko, Andriy
> > Sent: Thursday, September 26, 2019 9:35 AM
> > To: Schmauss, Erik <[email protected]>
> > Cc: Nikolaus Voss <[email protected]>; Rafael J. Wysocki
> > <[email protected]>; Moore, Robert <[email protected]>; Len Brown
> > <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel
> > Machek <[email protected]>; Dan Murphy <[email protected]>; linux-
> > [email protected]; [email protected]; [email protected];
> > [email protected]
> > Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
> >
> > On Thu, Sep 26, 2019 at 07:09:05PM +0300, Schmauss, Erik wrote:
> > > > -----Original Message-----
> > > > From: Nikolaus Voss <[email protected]>
> > > > Sent: Thursday, September 12, 2019 1:08 AM
> > > > To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
> > > > <[email protected]>; Rafael J. Wysocki <[email protected]>;
> > > > Moore, Robert <[email protected]>
> > > > Cc: Len Brown <[email protected]>; Jacek Anaszewski
> > > > <[email protected]>; Pavel Machek <[email protected]>; Dan
> > > > Murphy <[email protected]>; [email protected];
> > > > [email protected]; linux- [email protected]; [email protected];
> > > > Nikolaus Voss <[email protected]>
> > > > Subject: [PATCH] ACPICA: make acpi_load_table() return table index
> > > >
> > > Hi Nikolaus,
> > >
> > > > For unloading an ACPI table, it is necessary to provide the index of the table.
> > > > The method intended for dynamically loading or hotplug addition of
> > > > tables, acpi_load_table(), should provide this information via an
> > > > optional pointer to the loaded table index.
> > >
> > > We'll take this patch for ACPICA upstream
> >
> > Erik,
> >
> Hi Andy,
>
> > how about to have also counterpart to acpi_load_table() which will do what it's
> > done now in acpi_configfs.c via acpi_tb_*() API?
>
> I should have given more details. We decided to add this extra parameter in AcpiLoadTable and
> we're going to create an AcpiUnloadTable function that will take table index to unload the table (basically the acpi_tb_unload..).
> Once we do this, you can use table indices with AcpiUnloadTable and AcpiLoadTable.

Sounds like what we discussed with Nikolaus earlier [1].
Thanks!

[1]: https://lore.kernel.org/linux-acpi/[email protected]/

--
With Best Regards,
Andy Shevchenko


2019-09-26 18:47:02

by Nikolaus Voss

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

Hi Erik,

On Thu, 26 Sep 2019, Schmauss, Erik wrote:
>> -----Original Message-----
>> From: Nikolaus Voss <[email protected]>
>> Sent: Thursday, September 12, 2019 1:08 AM
>> To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
>> <[email protected]>; Rafael J. Wysocki <[email protected]>; Moore,
>> Robert <[email protected]>
>> Cc: Len Brown <[email protected]>; Jacek Anaszewski
>> <[email protected]>; Pavel Machek <[email protected]>; Dan Murphy
>> <[email protected]>; [email protected]; [email protected]; linux-
>> [email protected]; [email protected]; Nikolaus Voss
>> <[email protected]>
>> Subject: [PATCH] ACPICA: make acpi_load_table() return table index
>>
> Hi Nikolaus,
>
>> For unloading an ACPI table, it is necessary to provide the index of the table.
>> The method intended for dynamically loading or hotplug addition of tables,
>> acpi_load_table(), should provide this information via an optional pointer to
>> the loaded table index.
>
> We'll take this patch for ACPICA upstream

that's good news, thanks!
Niko

>
> Thanks,
> Erik
>>
>> This patch fixes the table unload function of acpi_configfs.
>>
>> Reported-by: Andy Shevchenko <[email protected]>
>> Fixes: d06c47e3dd07f ("ACPI: configfs: Resolve objects on host-directed table
>> loads")
>> Signed-off-by: Nikolaus Voss <[email protected]>
>> ---
>> drivers/acpi/acpi_configfs.c | 2 +-
>> drivers/acpi/acpica/dbfileio.c | 2 +-
>> drivers/acpi/acpica/tbxfload.c | 8 ++++++--
>> drivers/firmware/efi/efi.c | 2 +-
>> include/acpi/acpixf.h | 3 ++-
>> 5 files changed, 11 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c index
>> 57d9d574d4dde..77f81242a28e6 100644
>> --- a/drivers/acpi/acpi_configfs.c
>> +++ b/drivers/acpi/acpi_configfs.c
>> @@ -53,7 +53,7 @@ static ssize_t acpi_table_aml_write(struct config_item
>> *cfg,
>> if (!table->header)
>> return -ENOMEM;
>>
>> - ret = acpi_load_table(table->header);
>> + ret = acpi_load_table(table->header, &table->index);
>> if (ret) {
>> kfree(table->header);
>> table->header = NULL;
>> diff --git a/drivers/acpi/acpica/dbfileio.c b/drivers/acpi/acpica/dbfileio.c index
>> c6e25734dc5cd..e1b6e54a96ac1 100644
>> --- a/drivers/acpi/acpica/dbfileio.c
>> +++ b/drivers/acpi/acpica/dbfileio.c
>> @@ -93,7 +93,7 @@ acpi_status acpi_db_load_tables(struct
>> acpi_new_table_desc *list_head)
>> while (table_list_head) {
>> table = table_list_head->table;
>>
>> - status = acpi_load_table(table);
>> + status = acpi_load_table(table, NULL);
>> if (ACPI_FAILURE(status)) {
>> if (status == AE_ALREADY_EXISTS) {
>> acpi_os_printf
>> diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c index
>> 86f1693f6d29a..d08cd8ffcbdb6 100644
>> --- a/drivers/acpi/acpica/tbxfload.c
>> +++ b/drivers/acpi/acpica/tbxfload.c
>> @@ -268,7 +268,8 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
>> *
>> * PARAMETERS: table - Pointer to a buffer containing the ACPI
>> * table to be loaded.
>> - *
>> + * table_idx - Pointer to a u32 for storing the table
>> + * index, might be NULL
>> * RETURN: Status
>> *
>> * DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must
>> @@ -278,7 +279,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_install_table)
>> * to ensure that the table is not deleted or unmapped.
>> *
>>
>> *******************************************************************
>> ***********/
>> -acpi_status acpi_load_table(struct acpi_table_header *table)
>> +acpi_status acpi_load_table(struct acpi_table_header *table, u32
>> +*table_idx)
>> {
>> acpi_status status;
>> u32 table_index;
>> @@ -297,6 +298,9 @@ acpi_status acpi_load_table(struct acpi_table_header
>> *table)
>> status =
>> acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
>>
>> ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
>> FALSE, &table_index);
>> + if (table_idx)
>> + *table_idx = table_index;
>> +
>> if (ACPI_SUCCESS(status)) {
>>
>> /* Complete the initialization/resolution of new objects */ diff
>> --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index
>> ad3b1f4866b35..9773e4212baef 100644
>> --- a/drivers/firmware/efi/efi.c
>> +++ b/drivers/firmware/efi/efi.c
>> @@ -308,7 +308,7 @@ static __init int efivar_ssdt_load(void)
>> goto free_data;
>> }
>>
>> - ret = acpi_load_table(data);
>> + ret = acpi_load_table(data, NULL);
>> if (ret) {
>> pr_err("failed to load table: %d\n", ret);
>> goto free_data;
>> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index
>> 3845c8fcc94e5..c90bbdc4146a6 100644
>> --- a/include/acpi/acpixf.h
>> +++ b/include/acpi/acpixf.h
>> @@ -452,7 +452,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> ACPI_INIT_FUNCTION
>> u8 physical))
>>
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> - acpi_load_table(struct acpi_table_header *table))
>> + acpi_load_table(struct acpi_table_header *table,
>> + u32 *table_idx))
>>
>> ACPI_EXTERNAL_RETURN_STATUS(acpi_status
>> acpi_unload_parent_table(acpi_handle object))
>> --
>> 2.17.1
>

2019-09-26 18:49:11

by Nikolaus Voss

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index

On Thu, 26 Sep 2019, Schmauss, Erik wrote:
>> -----Original Message-----
>> From: [email protected] <[email protected]>
>> On Behalf Of Shevchenko, Andriy
>> Sent: Thursday, September 26, 2019 9:35 AM
>> To: Schmauss, Erik <[email protected]>
>> Cc: Nikolaus Voss <[email protected]>; Rafael J. Wysocki
>> <[email protected]>; Moore, Robert <[email protected]>; Len Brown
>> <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel
>> Machek <[email protected]>; Dan Murphy <[email protected]>; linux-
>> [email protected]; [email protected]; [email protected];
>> [email protected]
>> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
>>
>> On Thu, Sep 26, 2019 at 07:09:05PM +0300, Schmauss, Erik wrote:
>>>> -----Original Message-----
>>>> From: Nikolaus Voss <[email protected]>
>>>> Sent: Thursday, September 12, 2019 1:08 AM
>>>> To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
>>>> <[email protected]>; Rafael J. Wysocki <[email protected]>;
>>>> Moore, Robert <[email protected]>
>>>> Cc: Len Brown <[email protected]>; Jacek Anaszewski
>>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
>>>> Murphy <[email protected]>; [email protected];
>>>> [email protected]; linux- [email protected]; [email protected];
>>>> Nikolaus Voss <[email protected]>
>>>> Subject: [PATCH] ACPICA: make acpi_load_table() return table index
>>>>
>>> Hi Nikolaus,
>>>
>>>> For unloading an ACPI table, it is necessary to provide the index of the table.
>>>> The method intended for dynamically loading or hotplug addition of
>>>> tables, acpi_load_table(), should provide this information via an
>>>> optional pointer to the loaded table index.
>>>
>>> We'll take this patch for ACPICA upstream
>>
>> Erik,
>>
> Hi Andy,
>
>> how about to have also counterpart to acpi_load_table() which will do what it's
>> done now in acpi_configfs.c via acpi_tb_*() API?
>
> I should have given more details. We decided to add this extra parameter
> in AcpiLoadTable and we're going to create an AcpiUnloadTable function
> that will take table index to unload the table (basically the
> acpi_tb_unload..). Once we do this, you can use table indices with
> AcpiUnloadTable and AcpiLoadTable.

that's even better news.

Rafael, shall I prepare anything?

Niko

>
> Erik
>>
>> Because it's kinda strange to call acpi_load_table*() and acpi_tb_*() in the
>> same module.
>>
>> --
>> With Best Regards,
>> Andy Shevchenko
>>
>

--
Nikolaus Voss - Aastwiete 4 - 22880 Wedel

2019-09-26 19:31:46

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index

On Thu, Sep 26, 2019 at 8:44 PM Nikolaus Voss <[email protected]> wrote:
>
> On Thu, 26 Sep 2019, Schmauss, Erik wrote:
> >> -----Original Message-----
> >> From: [email protected] <[email protected]>
> >> On Behalf Of Shevchenko, Andriy
> >> Sent: Thursday, September 26, 2019 9:35 AM
> >> To: Schmauss, Erik <[email protected]>
> >> Cc: Nikolaus Voss <[email protected]>; Rafael J. Wysocki
> >> <[email protected]>; Moore, Robert <[email protected]>; Len Brown
> >> <[email protected]>; Jacek Anaszewski <[email protected]>; Pavel
> >> Machek <[email protected]>; Dan Murphy <[email protected]>; linux-
> >> [email protected]; [email protected]; [email protected];
> >> [email protected]
> >> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
> >>
> >> On Thu, Sep 26, 2019 at 07:09:05PM +0300, Schmauss, Erik wrote:
> >>>> -----Original Message-----
> >>>> From: Nikolaus Voss <[email protected]>
> >>>> Sent: Thursday, September 12, 2019 1:08 AM
> >>>> To: Shevchenko, Andriy <[email protected]>; Schmauss, Erik
> >>>> <[email protected]>; Rafael J. Wysocki <[email protected]>;
> >>>> Moore, Robert <[email protected]>
> >>>> Cc: Len Brown <[email protected]>; Jacek Anaszewski
> >>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
> >>>> Murphy <[email protected]>; [email protected];
> >>>> [email protected]; linux- [email protected]; [email protected];
> >>>> Nikolaus Voss <[email protected]>
> >>>> Subject: [PATCH] ACPICA: make acpi_load_table() return table index
> >>>>
> >>> Hi Nikolaus,
> >>>
> >>>> For unloading an ACPI table, it is necessary to provide the index of the table.
> >>>> The method intended for dynamically loading or hotplug addition of
> >>>> tables, acpi_load_table(), should provide this information via an
> >>>> optional pointer to the loaded table index.
> >>>
> >>> We'll take this patch for ACPICA upstream
> >>
> >> Erik,
> >>
> > Hi Andy,
> >
> >> how about to have also counterpart to acpi_load_table() which will do what it's
> >> done now in acpi_configfs.c via acpi_tb_*() API?
> >
> > I should have given more details. We decided to add this extra parameter
> > in AcpiLoadTable and we're going to create an AcpiUnloadTable function
> > that will take table index to unload the table (basically the
> > acpi_tb_unload..). Once we do this, you can use table indices with
> > AcpiUnloadTable and AcpiLoadTable.
>
> that's even better news.
>
> Rafael, shall I prepare anything?

I don't think so. I'm expecting to get a proper fix from the upstream
through the normal process.

Thanks,
Rafael

2019-09-26 19:44:26

by Schmauss, Erik

[permalink] [raw]
Subject: RE: [PATCH] ACPICA: make acpi_load_table() return table index



> -----Original Message-----
> From: Rafael J. Wysocki <[email protected]>
> Sent: Thursday, September 26, 2019 12:26 PM
> To: Nikolaus Voss <[email protected]>
> Cc: Schmauss, Erik <[email protected]>; Shevchenko, Andriy
> <[email protected]>; Rafael J. Wysocki <[email protected]>;
> Moore, Robert <[email protected]>; Len Brown <[email protected]>;
> Jacek Anaszewski <[email protected]>; Pavel Machek
> <[email protected]>; Dan Murphy <[email protected]>; [email protected];
> [email protected]; [email protected]
> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table index
>
> On Thu, Sep 26, 2019 at 8:44 PM Nikolaus Voss <[email protected]> wrote:
> >
> > On Thu, 26 Sep 2019, Schmauss, Erik wrote:
> > >> -----Original Message-----
> > >> From: [email protected]
> > >> <[email protected]>
> > >> On Behalf Of Shevchenko, Andriy
> > >> Sent: Thursday, September 26, 2019 9:35 AM
> > >> To: Schmauss, Erik <[email protected]>
> > >> Cc: Nikolaus Voss <[email protected]>; Rafael J.
> > >> Wysocki <[email protected]>; Moore, Robert
> > >> <[email protected]>; Len Brown <[email protected]>; Jacek
> > >> Anaszewski <[email protected]>; Pavel Machek
> > >> <[email protected]>; Dan Murphy <[email protected]>; linux-
> > >> [email protected]; [email protected];
> > >> [email protected]; [email protected]
> > >> Subject: Re: [PATCH] ACPICA: make acpi_load_table() return table
> > >> index
> > >>
> > >> On Thu, Sep 26, 2019 at 07:09:05PM +0300, Schmauss, Erik wrote:
> > >>>> -----Original Message-----
> > >>>> From: Nikolaus Voss <[email protected]>
> > >>>> Sent: Thursday, September 12, 2019 1:08 AM
> > >>>> To: Shevchenko, Andriy <[email protected]>; Schmauss,
> > >>>> Erik <[email protected]>; Rafael J. Wysocki
> > >>>> <[email protected]>; Moore, Robert <[email protected]>
> > >>>> Cc: Len Brown <[email protected]>; Jacek Anaszewski
> > >>>> <[email protected]>; Pavel Machek <[email protected]>; Dan
> > >>>> Murphy <[email protected]>; [email protected];
> > >>>> [email protected]; linux- [email protected]; [email protected];
> > >>>> Nikolaus Voss <[email protected]>
> > >>>> Subject: [PATCH] ACPICA: make acpi_load_table() return table
> > >>>> index
> > >>>>
> > >>> Hi Nikolaus,
> > >>>
> > >>>> For unloading an ACPI table, it is necessary to provide the index of the
> table.
> > >>>> The method intended for dynamically loading or hotplug addition
> > >>>> of tables, acpi_load_table(), should provide this information via
> > >>>> an optional pointer to the loaded table index.
> > >>>
> > >>> We'll take this patch for ACPICA upstream
> > >>
> > >> Erik,
> > >>
> > > Hi Andy,
> > >
> > >> how about to have also counterpart to acpi_load_table() which will
> > >> do what it's done now in acpi_configfs.c via acpi_tb_*() API?
> > >
> > > I should have given more details. We decided to add this extra
> > > parameter in AcpiLoadTable and we're going to create an
> > > AcpiUnloadTable function that will take table index to unload the
> > > table (basically the acpi_tb_unload..). Once we do this, you can use
> > > table indices with AcpiUnloadTable and AcpiLoadTable.
> >
> > that's even better news.
> >
> > Rafael, shall I prepare anything?
Hi everyone,

> I don't think so. I'm expecting to get a proper fix from the upstream through
> the normal process.
Just so that we are on the same page:

I've backported Nikolaus's patch for upstream here https://github.com/acpica/acpica/pull/506
and Bob has implemented the new API here: https://github.com/acpica/acpica/commit/c69369cd9cf0134e1aac516e97d612947daa8dc2

Once we do a release, I will send Bob's change to the linux ACPI mailing list.
Feel free to use this new API where you see fit.

Thanks,
Erik

>
> Thanks,
> Rafael