Andrew Patterson wrote: > On Sat, 2008-11-01 at 15:55 +0900, Taku Izumi wrote: >> Revert adf411b819adc9fa96e9b3e638c7480d5e71d270. >> >> The commit adf411b819adc9fa96e9b3e638c7480d5e71d270 was based on the >> improper assumption that queried result was not updated when _OSC >> support field was changed. But, in fact, queried result is updated >> whenever _OSC support field was changed through __acpi_query_osc(). >> As a result, the commit adf411b819adc9fa96e9b3e638c7480d5e71d270 only >> introduced unnecessary additional _OSC evaluation... >> >> Signed-off-by: Kenji Kaneshige <kaneshige.kenji@xxxxxxxxxxxxxx> >> Signed-off-by: Taku Izumi <izumi.taku@xxxxxxxxxxxxxx> >> >> --- >> drivers/pci/pci-acpi.c | 31 ++++++++++++++++++------------- >> 1 file changed, 18 insertions(+), 13 deletions(-) >> >> Index: 20081031/drivers/pci/pci-acpi.c >> =================================================================== >> --- 20081031.orig/drivers/pci/pci-acpi.c >> +++ 20081031/drivers/pci/pci-acpi.c >> @@ -24,13 +24,15 @@ struct acpi_osc_data { >> acpi_handle handle; >> u32 support_set; >> u32 control_set; >> + int is_queried; >> + u32 query_result; >> struct list_head sibiling; >> }; >> static LIST_HEAD(acpi_osc_data_list); >> >> struct acpi_osc_args { >> u32 capbuf[3]; >> - u32 ctrl_result; >> + u32 query_result; >> }; >> >> static DEFINE_MUTEX(pci_acpi_lock); >> @@ -108,8 +110,9 @@ static acpi_status acpi_run_osc(acpi_han >> goto out_kfree; >> } >> out_success: >> - osc_args->ctrl_result = >> - *((u32 *)(out_obj->buffer.pointer + 8)); >> + if (flags & OSC_QUERY_ENABLE) >> + osc_args->query_result = >> + *((u32 *)(out_obj->buffer.pointer + 8)); >> status = AE_OK; >> >> out_kfree: >> @@ -117,8 +120,7 @@ out_kfree: >> return status; >> } >> >> -static acpi_status __acpi_query_osc(u32 flags, struct acpi_osc_data *osc_data, >> - u32 *result) >> +static acpi_status __acpi_query_osc(u32 flags, struct acpi_osc_data *osc_data) >> { >> acpi_status status; >> u32 support_set; >> @@ -133,7 +135,8 @@ static acpi_status __acpi_query_osc(u32 >> status = acpi_run_osc(osc_data->handle, &osc_args); >> if (ACPI_SUCCESS(status)) { >> osc_data->support_set = support_set; >> - *result = osc_args.ctrl_result; >> + osc_data->query_result = osc_args.query_result; >> + osc_data->is_queried = 1; >> } >> >> return status; >> @@ -144,7 +147,7 @@ static acpi_status acpi_query_osc(acpi_h >> { >> acpi_status status; >> struct acpi_osc_data *osc_data; >> - u32 flags = (unsigned long)context, dummy; >> + u32 flags = (unsigned long)context; >> acpi_handle tmp; >> >> status = acpi_get_handle(handle, "_OSC", &tmp); >> @@ -158,7 +161,7 @@ static acpi_status acpi_query_osc(acpi_h >> goto out; >> } >> >> - __acpi_query_osc(flags, osc_data, &dummy); >> + __acpi_query_osc(flags, osc_data); >> out: >> mutex_unlock(&pci_acpi_lock); >> return AE_OK; >> @@ -192,7 +195,7 @@ acpi_status __pci_osc_support_set(u32 fl >> acpi_status pci_osc_control_set(acpi_handle handle, u32 flags) >> { >> acpi_status status; >> - u32 ctrlset, control_set, result; >> + u32 ctrlset, control_set; >> acpi_handle tmp; >> struct acpi_osc_data *osc_data; >> struct acpi_osc_args osc_args; >> @@ -215,11 +218,13 @@ acpi_status pci_osc_control_set(acpi_han >> goto out; >> } >> >> - status = __acpi_query_osc(osc_data->support_set, osc_data, &result); >> - if (ACPI_FAILURE(status)) >> - goto out; >> + if (!osc_data->is_queried) { >> + status = __acpi_query_osc(osc_data->support_set, osc_data); >> + if (ACPI_FAILURE(status)) >> + goto out; >> + } >> >> - if ((result & ctrlset) != ctrlset) { >> + if ((osc_data->query_result & ctrlset) != ctrlset) { >> status = AE_SUPPORT; >> goto out; >> } >> > > The latest code in the pci-2.6/linux-next branch runs __acpi_query_osc() > in acpi_pci_root_add(). This happens before any calls to > pci_osc_control_set(), so this patch/revert should no longer be > necessary. > Though I might be misunderstanding, I think you mean that we should modify pci_osc_control_set() not to call __acpi_query_osc() in any case rather than applying this patch (reverting the commit adf411b819adc9fa96e9b3e638c7480d5e71d270). Correct? I think we should apply this patch first, and then making another patch to modify pci_osc_control_set() not to call __acpi_query_osc() because current pci_acpi_osc_support() can fail with -ENOMEM. In this case, pci_osc_control_set() must query control. Maybe we need to modify some data structures (acpi_osc_data, acpi_pci_root, etc.) to prevent -ENOMEM when we modify pci_osc_control_set() not to call __acpi_query_osc(). Thanks, Kenji Kaneshige -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html