On Tuesday, May 09, 2017 01:57:41 PM Lv Zheng wrote: > For all frequent late stage acpi_get_table() clone invocations, we should > only change them altogether, otherwise, excessive acpi_put_table() could > unexpectedly unmap the table used by the other users. Thus the current plan > is to change all acpi_get_table() clones together or to change none of > them. However in practical, this is not convenient as this can prevent > kernel developers' efforts of improving the late stage code quality before > waiting for the ACPICA upstream to improve first. > > This patch adds a validation count threashold, when it is reached, the > validation count can no longer be incremented/decremented to invalidate the > table descriptor (means preventing table unmappings) so that acpi_put_table() > balance changes can be done independently to each others. Lv Zheng. > > Cc: Dan Williams <dan.j.williams@xxxxxxxxx> > Signed-off-by: Lv Zheng <lv.zheng@xxxxxxxxx> > --- > drivers/acpi/acpica/tbutils.c | 24 +++++++++++++++--------- > include/acpi/actbl.h | 9 +++++++++ > 2 files changed, 24 insertions(+), 9 deletions(-) > > diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c > index 7abe665..04beafc 100644 > --- a/drivers/acpi/acpica/tbutils.c > +++ b/drivers/acpi/acpica/tbutils.c > @@ -416,9 +416,13 @@ acpi_tb_get_table(struct acpi_table_desc *table_desc, > } > } > > - table_desc->validation_count++; > - if (table_desc->validation_count == 0) { > - table_desc->validation_count--; > + if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) { > + table_desc->validation_count++; > + if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) { > + ACPI_WARNING((AE_INFO, > + "Table %p, Validation count overflows\n", > + table_desc)); > + } > } > > *out_table = table_desc->pointer; > @@ -445,13 +449,15 @@ void acpi_tb_put_table(struct acpi_table_desc *table_desc) > > ACPI_FUNCTION_TRACE(acpi_tb_put_table); > > - if (table_desc->validation_count == 0) { > - ACPI_WARNING((AE_INFO, > - "Table %p, Validation count is zero before decrement\n", > - table_desc)); > - return_VOID; > + if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) { > + table_desc->validation_count--; > + if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) { Is this going to ever trigger? We've already verified that validation_count is not 0 and that it is less than ACPI_MAX_TABLE_VALIDATIONS and we have decremented it, so how can it be greater than or equal to ACPI_MAX_TABLE_VALIDATIONS here? > + ACPI_WARNING((AE_INFO, > + "Table %p, Validation count underflows\n", > + table_desc)); > + return_VOID; > + } > } > - table_desc->validation_count--; > > if (table_desc->validation_count == 0) { > Thanks, Rafael -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html